[HandlerName("Heiken Ashi smoothed")] [HandlerCategory("vvIndicators")] public class HeikenAshiSmoothed : IBar2BarHandler, IContextUses { // [HandlerParameter(true, "3", Min = "0", Max = "4", Step = "1")] public int MaMethod { get; set; } [HandlerParameter(true, "6", Min = "2", Max = "20", Step = "1")] public int MaPeriod { get; set; } [HandlerParameter(true, "2", Min = "2", Max = "20", Step = "1")] public int MaPeriod2 { get; set; } public ISecurity Execute(ISecurity src) { var bars = src.Bars.Count; // var C = src.ClosePrices; var H = src.HighPrices; var L = src.LowPrices; var O = src.OpenPrices; // var maO = new double[bars]; var maC = new double[bars]; var maH = new double[bars]; var maL = new double[bars]; // IList HA = new List(bars); var haCn = new double[bars]; var haHn = new double[bars]; var haLn = new double[bars]; var haOn = new double[bars]; // сглаживаю OHLC источника //var maO = Context.GetData("maO", new[] { "maO" + MaPeriod.ToString() }, () => LWMA.GenWMA(O, MaPeriod)); //maC = Context.GetData("maC", new[] { "maC" + MaPeriod.ToString() }, () => LWMA.GenWMA(C, MaPeriod)); //maH = Context.GetData("maH", new[] { "maH" + MaPeriod.ToString() }, () => LWMA.GenWMA(H, MaPeriod)); //maL = Context.GetData("maL", new[] { "maL" + MaPeriod.ToString() }, () => LWMA.GenWMA(L, MaPeriod)); for (int i = 2; i < bars; i++) { maO[i] = vvSeries.iMA(O, maO, MaMethod, MaPeriod, i, 0, 0); maC[i] = vvSeries.iMA(C, maC, MaMethod, MaPeriod, i, 0, 0); maL[i] = vvSeries.iMA(L, maL, MaMethod, MaPeriod, i, 0, 0); maH[i] = vvSeries.iMA(H, maH, MaMethod, MaPeriod, i, 0, 0); } // for (int i = 0; i < bars; i++) { if (i < 2) { haOn[i] = O[i]; haCn[i] = C[i]; haLn[i] = L[i]; haHn[i] = H[i]; } else { haCn[i] = (maC[i] + maO[i] + maL[i] + maH[i]) / 4; haOn[i] = (haOn[i - 1] + haCn[i - 1]) / 2; haLn[i] = Math.Min(maL[i], Math.Min(haOn[i], haCn[i])); haHn[i] = Math.Max(maH[i], Math.Max(haOn[i], haCn[i])); } } // вторичное сглаживание уже HA var haO = new double[bars]; var haC = new double[bars]; var haH = new double[bars]; var haL = new double[bars]; for (int i = 1; i < bars; i++) { haO[i] = vvSeries.iMA(haOn, haO, MaMethod, MaPeriod2, i, 0, 0); haC[i] = vvSeries.iMA(haCn, haC, MaMethod, MaPeriod2, i, 0, 0); haL[i] = vvSeries.iMA(haLn, haL, MaMethod, MaPeriod2, i, 0, 0); haH[i] = vvSeries.iMA(haHn, haH, MaMethod, MaPeriod2, i, 0, 0); } // формируем бары HA for (int i = 0; i < bars; i++) { var hav = new Bar(src.Bars[i].Color, src.Bars[i].Date, haO[i], haH[i], haL[i], haC[i], src.Bars[i].Volume); HA.Add(hav); } // return src.CloneAndReplaceBars(HA); } public IContext Context { get; set; } }