using System; using System.Collections.Generic; using System.Linq; using System.Text; using TSLab.Script.Helpers; namespace TSLab.Script.Handlers { [HandlerName("+DI")] [HandlerCategory("Indicators")] public class DIP : BasePeriodIndicatorHandler, IBar2DoubleHandler, IContextUses { public IList Execute(ISecurity source) { return CalcDIP(source, Context, Period); } public static IList CalcDIP(ISecurity source, IContext context, int period) { int count = source.Bars.Count; IList diP = new double[count]; var high = source.HighPrices; var low = source.LowPrices; var atr = Series.EMA(Series.TrueRange(source.Bars), period); for (int i = 1; i < count; i++) { var dmP = high[i] - high[i - 1]; var dmM = low[i - 1] - low[i]; if ((dmP < 0 && dmM < 0) || dmP == dmM) { dmP = dmM = 0; } if (dmM > dmP) { dmP = 0; } diP[i] = dmP; } diP = Series.EMA(diP, period); for (int i = 1; i < count; i++) { diP[i] = atr[i] == 0 ? 0 : diP[i] / atr[i]; } return diP; } public IContext Context { get; set; } } [HandlerName("-DI")] [HandlerCategory("Indicators")] public class DIM : BasePeriodIndicatorHandler, IBar2DoubleHandler, IContextUses { public IList Execute(ISecurity source) { return CalcDIM(source, Context, Period); } public static IList CalcDIM(ISecurity source, IContext context, int period) { int count = source.Bars.Count; IList diM = new double[count]; var high = source.HighPrices; var low = source.LowPrices; var atr = Series.EMA(Series.TrueRange(source.Bars), period); for (int i = 1; i < count; i++) { var dmP = high[i] - high[i - 1]; var dmM = low[i - 1] - low[i]; if ((dmP < 0 && dmM < 0) || dmP == dmM) { dmP = dmM = 0; } if (dmP > dmM) { dmM = 0; } diM[i] = dmM; } diM = Series.EMA(diM, period); for (int i = 1; i < count; i++) { diM[i] = atr[i] == 0 ? 0 : diM[i] / atr[i]; } return diM; } public IContext Context { get; set; } } [HandlerCategory("Indicators")] public class ADX : BasePeriodIndicatorHandler, IDoubleAccumHandler { public IList Execute(IList source1, IList source2) { int count = source1.Count; IList dx = new double[count]; for (int i = 1; i < count; i++) { dx[i] = source1[i] == 0 && source2[i] == 0 ? 0 : Math.Abs(source1[i] - source2[i]) / (source1[i] + source2[i]) * 100; } dx = Series.EMA(dx, Period); return dx; } } }