Time: 2017-07-16 | Download file:ZerolagStochs_.mq4
// Редактирование и исправления 22.09.2008 Николай Косицин //+X================================================================X+ //| ZerolagStochs_.mq4 | //| Copyright © 2004, MetaQuotes Software Corp. | //| http://www.metaquotes.net/ | //+X================================================================X+ #property copyright "Copyright © 2004, MetaQuotes Software Corp." #property link "perky_z@yahoo.com" //---- отрисовка индикатора в отдельом окне #property indicator_separate_window //---- количество индикаторных буферов #property indicator_buffers 2 //---- цвета индикатора #property indicator_color1 Blue #property indicator_color2 Red //----+ +----------------------------+ //---- ВХОДНЫЕ ПАРАМЕТРЫ ИНДИКАТОРА | //----+ +----------------------------+ extern int Slowing = 3; extern int MA_Method = MODE_SMA; extern int smoothing = 15; //---- extern double Factor1 = 0.05; extern int Kperiod1 = 8; extern int Dperiod1 = 3; //---- extern double Factor2 = 0.10; extern int Kperiod2 = 21; extern int Dperiod2 = 5; //---- extern double Factor3 = 0.16; extern int Kperiod3 = 34; extern int Dperiod3 = 8; //---- extern double Factor4 = 0.26; extern int Kperiod4 = 55; extern int Dperiod4 = 13; //---- extern double Factor5 = 0.43; extern int Kperiod5 = 89; extern int Dperiod5 = 21; //---- Объявление индикаторных буферов double FastTrendBuffer[]; double LowTrendBuffer[]; //---- Объявление целых констант int StartBar; //---- Объявление констант с плавающей точкой double smoothConst; //+X================================================================X+ //| ZerolagStochs() function | //+X================================================================X+ double ZerolagStochs(string symbol, int timeframe, int MA_MODE, int LINE_MODE, int SLOWING, int bar) { //----+ double Stoch1, Stoch2, Stoch3, Stoch4, Stoch5; //---- Stoch1 = Factor1 * iStochastic(symbol, timeframe, Kperiod1, Dperiod1, SLOWING, MA_MODE, NULL, LINE_MODE, bar); Stoch2 = Factor2 * iStochastic(symbol, timeframe, Kperiod2, Dperiod2, SLOWING, MA_MODE, NULL, LINE_MODE, bar); Stoch3 = Factor3 * iStochastic(symbol, timeframe, Kperiod3, Dperiod3, SLOWING, MA_MODE, NULL, LINE_MODE, bar); Stoch4 = Factor4 * iStochastic(symbol, timeframe, Kperiod4, Dperiod4, SLOWING, MA_MODE, NULL, LINE_MODE, bar); Stoch5 = Factor5 * iStochastic(symbol, timeframe, Kperiod5, Dperiod5, SLOWING, MA_MODE, NULL, LINE_MODE, bar); //---- return(Stoch1 + Stoch2 + Stoch3 + Stoch4 + Stoch5); //----+ } //+X================================================================X+ //| ZerolagStochs indicator initialization function | //+X================================================================X+ int init() { //---+ //---- 2 индикаторных буфера использованы для счёта SetIndexBuffer(0, FastTrendBuffer); SetIndexBuffer(1, LowTrendBuffer ); //---- определение стиля исполнения графика SetIndexStyle(0, DRAW_LINE); SetIndexStyle(1, DRAW_LINE); //---- Установка формата точности отображения индикатора IndicatorDigits(Digits); //---- Имя индикатора в субъокне IndicatorShortName("Zero Lag Stocs_"); //---- Лэйбы для индикаторных линий SetIndexLabel(0, "FastTrendLine"); SetIndexLabel(1, "LowTrendLine"); //---- Инициализация констант smoothConst = (smoothing - 1.0) / smoothing; //---- int PeriodBuffer[5]; //---- Расчёт стартового бара PeriodBuffer[0] = Kperiod1 + Dperiod1; PeriodBuffer[1] = Kperiod2 + Dperiod2; PeriodBuffer[2] = Kperiod3 + Dperiod3; PeriodBuffer[3] = Kperiod4 + Dperiod4; PeriodBuffer[4] = Kperiod5 + Dperiod5; //---- StartBar = ArrayMaximum(PeriodBuffer, WHOLE_ARRAY, 0) + 1; //---- установка номера бара, //начиная с которого будет отрисовываться индикатор SetIndexDrawBegin(0, StartBar - 1); SetIndexDrawBegin(1, StartBar); //---- Завершение инициализации return(0); //---+ } //+X================================================================X+ //| ZerolagStochs indicator start function | //+X================================================================X+ int start() { //---+ //---- проверка количества баров на достаточность для расчёта if (Bars < StartBar) return(0); //---- Объявление статических переменных static bool TrueStart; //---- Объявление переменных с плавающей точкой double FastTrend, LowTrend; double Stoch1, Stoch2, Stoch3, Stoch4, Stoch5; //----+ Объявление целых переменных и получение уже посчитанных баров int limit, MaxBar, bar, counted_bars = IndicatorCounted(); //---- проверка на возможные ошибки if (counted_bars < 0) return(-1); //---- последний посчитанный бар должен быть пересчитан if (counted_bars > 0) counted_bars--; //---- определение номера самого старого бара, //начиная с которого будет произедён пересчёт всех баров MaxBar = Bars - 1 - StartBar; //---- определение номера самого старого бара, //начиная с которого будет произедён пересчёт только новых баров limit = (Bars - 1 - counted_bars); //---- инициализация нуля if (limit >= MaxBar || !TrueStart) { limit = MaxBar; TrueStart = true; //---- for (bar = Bars - 1; bar > MaxBar; bar--) { FastTrendBuffer[bar] = 0.0; LowTrendBuffer [bar] = 0.0; } FastTrend = ZerolagStochs(Symbol(), 0, MA_Method, MODE_MAIN, Slowing, MaxBar + 1); LowTrendBuffer[MaxBar + 1] = FastTrend / smoothing; } //---+ ОСНОВНОЙ ЦИКЛ РАСЧЁТА ИНДИКАТОРА for (bar = limit; bar>= 0; bar--) { FastTrend = ZerolagStochs(Symbol(), 0, MA_Method, MODE_MAIN, Slowing, bar); //---- LowTrend = FastTrend / smoothing + LowTrendBuffer[bar + 1] * smoothConst; //---- FastTrendBuffer[bar] = FastTrend; LowTrendBuffer [bar] = LowTrend; } //---+ return(0); //---+ } //+X----------------------------------------------------------------X+