[HandlerName("Random Walk Index")] [HandlerCategory("vvIndicators")] public class RWI : IBar2DoubleHandler, IContextUses { //+------------------------------------------------------------------+ //| | //| Индекс Случайного Блуждания (Random Walk Index) | //| From MetaStock Indicator: Random Walk Index by E. Michael Poulos | //| Ramdass | //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ // (Random Walk Index) | // Индикатор случайной прогулки используется, чтобы | // определить, развивает ли рыночный инструмент тренд или | // совершает случайные движения в торговом диапазоне. | // Данный индикатор пытается сделать это, определяя сначала | // торговый диапазон рыночного инструмента. Следующий | // шаг состоит в вычислении серии индексов RWI для | // максимума рассматриваемого периода. Наибольшее движение | // индекса относительно Случайной прогулки используется | // в качестве текущего индекса. Рынок развивает восходящий | // тренд, если RWI максимумов больше 1, в то время | // как нисходящий тренд указывается, если RWI минимумов больше 1. | // | //+------------------------------------------------------------------+ // converted to TSLab by vito333, 2012 // [HandlerParameter(true, "10", Min = "3", Max = "40", Step = "1")] public int RWIperiod { get; set; } [HandlerParameter(true, "0", Min = "3", Max = "20", Step = "1")] public int postSmooth { get; set; } [HandlerParameter(false, "false", NotOptimized = true)] public bool Lows { get; set; } public static IList GenRWI(ISecurity src, int rwiperiod, int postsmooth, bool showlows) { var bars = src.Bars.Count; int maxperiod = rwiperiod; var High = src.HighPrices; var Low = src.LowPrices; var RWIhigh = new double[bars]; var RWIlow = new double[bars]; double max_1, max_2, max_High, max_Low, atr=0, sqrt; //---- основной цикл расчёта индикатора for (int i = maxperiod; i < bars; i++) { max_High = 0.0; max_Low = 0.0; //---- for (int j = 1; j <= rwiperiod; j++) { sqrt = Math.Sqrt(j + 1); //atr = iATR(NULL, 0, j + 1, i + 1); atr = ATR.iATR(src, j + 1, i - 1); if (atr != 0.0) { max_1 = (High[i] - Low[i - j]) / (atr * sqrt); // RWI_High Index max_2 = (High[i - j] - Low[i]) / (atr * sqrt); // RWI_Low Index if (max_1 > max_High) max_High = max_1; // Maximum_RWI_High Index if (max_2 > max_Low) max_Low = max_2; // Maximum_RWI_Low Index } } RWIhigh[i] = max_High; RWIlow[i] = max_Low; } // smooth IList SRWIh = RWIhigh; IList SRWIl = RWIlow; if (postsmooth > 0) { SRWIh = JMA.GenJMA(RWIhigh, postsmooth, 100); SRWIl = JMA.GenJMA(RWIlow, postsmooth, 100); } return showlows ? SRWIl : SRWIh; } public IList Execute(ISecurity src) { return GenRWI(src, RWIperiod, postSmooth, Lows); } public IContext Context { get; set; } }