[HandlerName("BBands")] [HandlerCategory("vvBands&Channels")] public class BBands : IDouble2DoubleHandler { [HandlerParameter(true, "20", Min = "0", Max = "50", Step = "1")] public int BandsPeriod { get; set; } [HandlerParameter(true, "2", Min = "0.5", Max = "3", Step = "0.5")] public double BandsDeviation { get; set; } [HandlerParameter(true, "0", Min = "0", Max = "2", Step = "1")] //[HandlerParameter(true, "0", NotOptimized = true)] public int BandMode { get; set; } // 0-main, 1-top band, 2-low band public static IList GenBBands(IList src, int _BandsPeriod, double _BandsDeviation, int _BandMode) { var bars = src.Count; // var Close = src; //---- buffers //var MovingBuffer = new double[bars]; var UpperBuffer = new double[bars]; var LowerBuffer = new double[bars]; // double deviation, sum, oldval, newres; // var MovingBuffer = SMA.GenSMA(src, _BandsPeriod); // for (int i = _BandsPeriod; i < bars; i++) { sum = 0.0; int k = i - _BandsPeriod + 1; oldval = MovingBuffer[i]; while (k <= i) { newres = Close[k] - oldval; sum += newres * newres; k++; } deviation = _BandsDeviation * Math.Sqrt(sum / _BandsPeriod); UpperBuffer[i] = oldval + deviation; LowerBuffer[i] = oldval - deviation; } // if (_BandMode == 1) return UpperBuffer; if (_BandMode == 2) return LowerBuffer; return MovingBuffer; } // то же, что и BBands, но с использованием iBBands public static IList GenBBands2(IList src, int _BandsPeriod, double _BandsDeviation, int _BandMode) { var BBBuffer = new double[src.Count]; // for (int i = 0; i < src.Count; i++) { double bb = iBBands(src, _BandsPeriod, _BandsDeviation, _BandMode, i); BBBuffer[i] = bb; } // return BBBuffer; } public static double iBBands(IList src, int BandsPeriod, double BandsDeviation, int _BandMode, int barNum) { if (barNum < BandsPeriod) BandsPeriod = barNum; // double deviation, sum, oldval, newres; // double ma = SMA.iSMA(src, BandsPeriod, barNum); // sum = 0.0; int k = barNum - BandsPeriod + 1; oldval = ma; while (k <= barNum) { newres = src[k] - oldval; sum += newres * newres; k++; } deviation = BandsDeviation * Math.Sqrt(sum / BandsPeriod); // if (_BandMode == 1) return oldval + deviation; if (_BandMode == 2) return oldval - deviation; return oldval; } public IList Execute(IList src) { return GenBBands(src, BandsPeriod, BandsDeviation, BandMode); } }