//+---------------------------------------------------------------------+ //| DigVariation.mq5 | //| Copyright © 2010, LeMan. | //| b-market@mail.ru | //+---------------------------------------------------------------------+ //| Для работы индикатора следует положить файл SmoothAlgorithms.mqh | //| в папку (директорию): каталог_данных_терминала\\MQL5\Include | //+---------------------------------------------------------------------+ #property copyright "Copyright © 2010, LeMan." #property link "b-market@mail.ru" //---- номер версии индикатора #property version "1.00" //---- отрисовка индикатора в отдельном окне #property indicator_separate_window //---- количество индикаторных буферов 2 #property indicator_buffers 2 //---- использовано всего одно графическое построение #property indicator_plots 1 //+-----------------------------------+ //| Параметры отрисовки индикатора | //+-----------------------------------+ //---- отрисовка индикатора в виде линии #property indicator_type1 DRAW_LINE //---- в качестве цвета линии индикатора использован HotPink цвет #property indicator_color1 clrHotPink //---- линия индикатора - непрерывная кривая #property indicator_style1 STYLE_SOLID //---- толщина линии индикатора равна 2 #property indicator_width1 2 //---- отображение метки индикатора #property indicator_label1 "Variation" //+----------------------------------------------+ //| Параметры отображения горизонтальных уровней | //+----------------------------------------------+ #property indicator_level1 0.0 #property indicator_levelcolor clrGreen #property indicator_levelstyle STYLE_SOLID //+----------------------------------------------+ //| Объявление перечислений | //+----------------------------------------------+ enum Smooth //тип константы { dig_0=0,//0 dig_1, //1 dig_2, //2 dig_3, //3 dig_4, //4 dig_5, //5 dig_6, //6 dig_7, //7 dig_8, //8 dig_9, //9 dig_10 //10 }; //+----------------------------------------------+ //| Входные параметры индикатора | //+----------------------------------------------+ input int Period_=12; // Период усреднения input ENUM_MA_METHOD MA_Method_=MODE_SMA; // Метод усреднения input Smooth SmoothPower=dig_1; // Степень сглаживания сигнала input int Shift=0; // Сдвиг индикатора по горизонтали в барах //+-----------------------------------+ //---- индикаторные буферы double ExtMapBuffer[]; double ExtCalcBuffer[]; //---- int min_rates_total=0; //+------------------------------------------------------------------+ //| Описание класса Moving_Average | //+------------------------------------------------------------------+ #include //+------------------------------------------------------------------+ //| Variation indicator initialization function | //+------------------------------------------------------------------+ void OnInit() { //---- инициализация переменных начала отсчета данных min_rates_total=GetStartBars(Smooth_Method(MA_Method_),Period_,0)*2+52; //---- превращение динамического массива в индикаторный буфер SetIndexBuffer(0,ExtMapBuffer,INDICATOR_DATA); //---- осуществление сдвига индикатора 1 по горизонтали PlotIndexSetInteger(0,PLOT_SHIFT,Shift); //---- осуществление сдвига начала отсчета отрисовки индикатора PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,min_rates_total); //---- установка значений индикатора, которые не будут видимы на графике PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE); //--- создание метки для отображения в DataWindow PlotIndexSetString(0,PLOT_LABEL,"Variation"); //---- превращение динамического массива ExtCalcBuffer[] в индикаторный буфер SetIndexBuffer(1,ExtCalcBuffer,INDICATOR_CALCULATIONS); //---- инициализация переменной для короткого имени индикатора string shortname; StringConcatenate(shortname,"Variation( Period_ = ",Period_,", MA_Method_ = ",MA_Method_,")"); //--- создание имени для отображения в отдельном подокне и во всплывающей подсказке IndicatorSetString(INDICATOR_SHORTNAME,shortname); //--- определение точности отображения значений индикатора IndicatorSetInteger(INDICATOR_DIGITS,_Digits+1); //---- завершение инициализации } //+------------------------------------------------------------------+ //| Variation iteration function | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, // количество истории в барах на текущем тике const int prev_calculated,// количество истории в барах на предыдущем тике const int begin, // номер начала достоверного отсчета баров const double &price[]) // ценовой массив для расчета индикатора { //---- min_rates_total+=begin; //---- проверка количества баров на достаточность для расчета if(rates_totalrates_total || prev_calculated<=0)// проверка на первый старт расчета индикатора { first=begin; // стартовый номер для расчета всех баров //---- инициализация переменных начала отсчета данных start1=begin; if(MA_Method_!=MODE_EMA) start2=Period_+begin; else start2=begin; //--- увеличим позицию начала данных на begin баров, //--- вследствие расчетов на данных другого индикатора if(begin>0) PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,min_rates_total); } else first=prev_calculated-1; // стартовый номер для расчета новых баров //---- объявление переменных класса Moving_Average из файла SmoothAlgorithms.mqh static CMoving_Average MA,VR; //---- основной цикл расчета индикатора for(bar=first; bar=first) ExtCalcBuffer[bar]=1000*(price[bar]-(ma+vr)); else ExtCalcBuffer[bar]=EMPTY_VALUE; } if(prev_calculated>rates_total || prev_calculated<=0) first=min_rates_total; //---- основной цикл сглаживания индикатора for(bar=first; bar