//+------------------------------------------------------------------+ //| RVIWithFlat.mq5 | //| Copyright © 2014, Powered byStep | //| | //+------------------------------------------------------------------+ #property description "Relative Vigor Index With Flat" //---- авторство индикатора #property copyright "Copyright © 2014, Powered byStep" //---- авторство индикатора #property link "" //---- номер версии индикатора #property version "1.00" //---- отрисовка индикатора в отдельном окне #property indicator_separate_window //---- для расчёта и отрисовки индикатора использовано три буфера #property indicator_buffers 3 //---- использовано два графических построения #property indicator_plots 2 //+----------------------------------------------+ //| Параметры отрисовки индикатора 1 | //+----------------------------------------------+ //--- отрисовка индикатора в виде цветного облака #property indicator_type1 DRAW_FILLING //--- в качестве цветов индикатора использованы #property indicator_color1 clrTeal,clrMagenta //---- отображение бычей метки индикатора #property indicator_label1 "RVI Oscillator" //+----------------------------------------------+ //| Параметры отрисовки индикатора 2 | //+----------------------------------------------+ //---- отрисовка индикатора 2 в виде линии #property indicator_type2 DRAW_LINE //---- в качестве цвета медвежьей линии индикатора использован синий цвет #property indicator_color2 clrBlue //---- линия индикатора 2 - непрерывная кривая #property indicator_style2 STYLE_SOLID //---- толщина линии индикатора 2 равна 5 #property indicator_width2 5 //---- отображение медвежьей метки индикатора #property indicator_label2 "Flat" //+----------------------------------------------+ //| Параметры отображения горизонтальных уровней | //+----------------------------------------------+ #property indicator_level1 0.0 #property indicator_levelcolor clrGray #property indicator_levelstyle STYLE_DASHDOTDOT //+----------------------------------------------+ //| объявление констант | //+----------------------------------------------+ #define RESET 0 // константа для возврата терминалу команды на пересчёт индикатора //+----------------------------------------------+ //| Входные параметры индикатора | //+----------------------------------------------+ input uint BBPeriod=20; // Период для расчета Боллинджера input double StdDeviation=2.0; // Девиация Боллинджера input ENUM_APPLIED_PRICE applied_price=PRICE_CLOSE; // Тип цены Боллинджера input uint RVIPeriod=14; // Период RVI input uint flat=100; // величина флэта в пунктах input int Shift=0; // сдвиг индикатора по горизонтали в барах //+----------------------------------------------+ //---- объявление динамических массивов, которые будут в // дальнейшем использованы в качестве индикаторных буферов double IndBuffer[]; double SignalBuffer[]; double IndBuffer1[]; //---- Объявление целых переменных для хендлов индикаторов int BB_Handle,RVI_Handle; //---- Объявление целых переменных начала отсчёта данных int min_rates_total; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //---- Инициализация переменных начала отсчёта данных min_rates_total=int(MathMax(BBPeriod,RVIPeriod)); //---- получение хендла индикатора iBands BB_Handle=iBands(Symbol(),PERIOD_CURRENT,BBPeriod,0,StdDeviation,applied_price); if(BB_Handle==INVALID_HANDLE) { Print(" Не удалось получить хендл индикатора iBands"); return(INIT_FAILED); } //---- получение хендла индикатора iRVI RVI_Handle=iRVI(Symbol(),PERIOD_CURRENT,RVIPeriod); if(RVI_Handle==INVALID_HANDLE) { Print(" Не удалось получить хендл индикатора iRVI"); return(INIT_FAILED); } //---- превращение динамического массива в индикаторный буфер SetIndexBuffer(0,IndBuffer,INDICATOR_DATA); //---- индексация элементов в буфере как в таймсерии ArraySetAsSeries(IndBuffer,true); //---- осуществление сдвига индикатора 1 по горизонтали на Shift PlotIndexSetInteger(0,PLOT_SHIFT,Shift); //---- осуществление сдвига начала отсчёта отрисовки индикатора PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,min_rates_total); //---- установка значений индикатора, которые не будут видимы на графике PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE); //---- превращение динамического массива в индикаторный буфер SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA); //---- индексация элементов в буфере как в таймсерии ArraySetAsSeries(SignalBuffer,true); //---- превращение динамического массива в индикаторный буфер SetIndexBuffer(2,IndBuffer1,INDICATOR_DATA); //---- индексация элементов в буфере как в таймсерии ArraySetAsSeries(IndBuffer1,true); //---- осуществление сдвига индикатора 1 по горизонтали на Shift PlotIndexSetInteger(1,PLOT_SHIFT,Shift); //---- осуществление сдвига начала отсчёта отрисовки индикатора PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,min_rates_total); //---- установка значений индикатора, которые не будут видимы на графике PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,EMPTY_VALUE); IndicatorSetString(INDICATOR_SHORTNAME,"RVIWithFlat"); //--- определение точности отображения значений индикатора IndicatorSetInteger(INDICATOR_DIGITS,4); //---- завершение инициализации return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int OnCalculate( const int rates_total, // количество истории в барах на текущем тике const int prev_calculated,// количество истории в барах на предыдущем тике const datetime &time[], const double &open[], const double& high[], // ценовой массив максимумов цены для расчёта индикатора const double& low[], // ценовой массив минимумов цены для расчёта индикатора const double &close[], const long &tick_volume[], const long &volume[], const int &spread[] ) { //---- проверка количества баров на достаточность для расчёта if(BarsCalculated(BB_Handle)rates_total || prev_calculated<=0)// проверка на первый старт расчёта индикатора { limit=rates_total-min_rates_total-1; // стартовый номер для расчёта всех баров } else limit=rates_total-prev_calculated; // стартовый номер для расчёта новых баров to_copy=limit+1; //---- копируем вновь появившиеся данные в массивы if(CopyBuffer(BB_Handle,UPPER_BAND,0,to_copy,UpBB)<=0) return(RESET); if(CopyBuffer(BB_Handle,BASE_LINE,0,to_copy,MainBB)<=0) return(RESET); if(CopyBuffer(RVI_Handle,MAIN_LINE,0,to_copy,MainRVI)<=0) return(RESET); if(CopyBuffer(RVI_Handle,SIGNAL_LINE,0,to_copy,SignRVI)<=0) return(RESET); //---- индексация элементов в массивах как в таймсериях ArraySetAsSeries(UpBB,true); ArraySetAsSeries(MainBB,true); ArraySetAsSeries(MainRVI,true); ArraySetAsSeries(SignRVI,true); //---- основной цикл расчёта индикатора for(bar=limit; bar>=0 && !IsStopped(); bar--) { double res=(UpBB[bar]-MainBB[bar])/_Point; if(resSignRVI[bar]) { IndBuffer[bar]=0.000000001; SignalBuffer[bar]=0.000000001; IndBuffer1[bar]=0; } if(MainRVI[bar]