using System; using System.Collections.Generic; using System.Linq; using System.Text; using StockSharp.Algo.Candles; namespace AlfaPartizan.Indicators { public class ADX { public decimal Length; private decimal dH; private decimal dL; private decimal DXp; private decimal DXm; private decimal TR; private decimal TRPpast; private decimal Dlp; private decimal Dlm; public decimal Dlpp; public decimal DLmm; private Candle _prevCandle; private List list = new List(); public void Process(Candle candle) { if(_prevCandle == null) { _prevCandle = candle; return; } dH = candle.HighPrice - _prevCandle.HighPrice; dL = _prevCandle.LowPrice - candle.LowPrice; DXp = dH > 0 ? dH : 0; DXm = dL > 0 ? dL : 0; if(DXp == DXm) { DXm = 0; DXp = 0; } else { if (DXp > DXm) DXm = 0; if (DXm > DXp) DXp = 0; } list.Add(Math.Abs(candle.HighPrice - candle.LowPrice)); list.Add(Math.Abs(candle.HighPrice - _prevCandle.ClosePrice)); list.Add(Math.Abs(candle.LowPrice - _prevCandle.ClosePrice)); _prevCandle = candle; TR = list.Max(); list.Clear(); TR = TRPpast - TRPpast/Length + TR/Length; TRPpast = TR; if(TR == 0) { DXp = 0; DXm = 0; Dlp = Dlp - Dlp/Length + DXp/Length; Dlm = Dlm - Dlm/Length + DXm/Length; } else { Dlp = Dlp - Dlp/Length + DXp/Length; Dlm = Dlm - Dlm/Length + DXm/Length; Dlpp = Dlp/TR*100; DLmm = Dlm/TR*100; } } public void UpDate(Candle candle) { dH = candle.HighPrice - _prevCandle.HighPrice; dL = _prevCandle.LowPrice - candle.LowPrice; DXp = dH > 0 ? dH : 0; DXm = dL > 0 ? dL : 0; if (DXp == DXm) { DXm = 0; DXp = 0; } else { if (DXp > DXm) DXm = 0; if (DXm > DXp) DXp = 0; } list.Add(Math.Abs(candle.HighPrice - candle.LowPrice)); list.Add(Math.Abs(candle.HighPrice - _prevCandle.ClosePrice)); list.Add(Math.Abs(candle.LowPrice - _prevCandle.ClosePrice)); TR = list.Max(); list.Clear(); TR = TRPpast - TRPpast / Length + TR / Length; if (TR == 0) { DXp = 0; DXm = 0; var dlp = Dlp - Dlp / Length + DXp / Length; var dlm = Dlm - Dlm / Length + DXm / Length; } else { var dlp = Dlp - Dlp / Length + DXp / Length; var dlm = Dlm - Dlm / Length + DXm / Length; Dlpp = dlp / TR * 100; DLmm = dlm / TR * 100; } } } }