//+------------------------------------------------------------------+ //| geTrendOsc.mq5 | //| Copyright © 2007, Forte928 | //| | //+------------------------------------------------------------------+ //--- авторство индикатора #property copyright "Copyright © 2007, Forte928" //--- авторство индикатора #property link "" //--- номер версии индикатора #property version "1.10" //--- отрисовка индикатора в отдельном окне #property indicator_separate_window //--- для расчёта и отрисовки индикатора использовано два буфера #property indicator_buffers 2 //--- использовано два графических построения #property indicator_plots 2 //+----------------------------------------------+ //| Параметры отрисовки индикатора CG | //+----------------------------------------------+ //--- отрисовка индикатора 1 в виде линии #property indicator_type1 DRAW_LINE //--- в качестве цвета бычей линии индикатора использован YellowGreen цвет #property indicator_color1 clrYellowGreen //--- линия индикатора 1 - непрерывная кривая #property indicator_style1 STYLE_SOLID //--- толщина линии индикатора 1 равна 1 #property indicator_width1 1 //--- отображение бычей метки индикатора #property indicator_label1 "OscTrend" //+----------------------------------------------+ //| Параметры отрисовки индикатора Trigger | //+----------------------------------------------+ //--- отрисовка индикатора 2 в виде линии #property indicator_type2 DRAW_LINE //--- в качестве цвета медвежьей линии индикатора использован Tomato цвет #property indicator_color2 clrTomato //--- линия индикатора 2 - непрерывная кривая #property indicator_style2 STYLE_SOLID //--- толщина линии индикатора 2 равна 1 #property indicator_width2 1 //--- отображение медвежьей метки индикатора #property indicator_label2 "HPFilter" //+----------------------------------------------+ //| Параметры отображения горизонтальных уровней | //+----------------------------------------------+ #property indicator_level1 80 #property indicator_level2 60 #property indicator_level3 50 #property indicator_level4 40 #property indicator_level5 20 #property indicator_level6 0 #property indicator_levelcolor clrGray #property indicator_levelstyle STYLE_DASHDOTDOT //+-----------------------------------+ //| объявление констант | //+-----------------------------------+ #define RESET 0 // константа для возврата терминалу команды на пересчёт индикатора //+----------------------------------------------+ //| Входные параметры индикатора | //+----------------------------------------------+ input uint Window=1; input uint OscPeriod=14; input uint HPPeriod=100; input uint CBars=500; input uint Shift=0; // сдвиг индикатора по горизонтали в барах //+----------------------------------------------+ //--- объявление динамических массивов, которые в дальнейшем //--- будут использованы в качестве индикаторных буферов double IndBuffer[]; double TriggerBuffer[]; //--- Объявление целых переменных начала отсчёта данных int min_rates_total; //--- объявление глобальных переменных int Count[]; double Series[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ void OnInit() { //--- инициализация переменных начала отсчёта данных min_rates_total=int(Window+OscPeriod+HPPeriod); //--- распределение памяти под массивы переменных ArrayResize(Count,OscPeriod); ArrayResize(Series,OscPeriod); //--- инициализация памяти ArrayInitialize(Count,0); ArrayInitialize(Series,0.0); //--- превращение динамического массива в индикаторный буфер SetIndexBuffer(0,IndBuffer,INDICATOR_DATA); //--- осуществление сдвига индикатора 1 по горизонтали на Shift PlotIndexSetInteger(0,PLOT_SHIFT,Shift); //--- осуществление сдвига начала отсчёта отрисовки индикатора PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,min_rates_total); //--- установка значений индикатора, которые не будут видимы на графике PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE); //--- индексация элементов в буфере как в таймсерии ArraySetAsSeries(IndBuffer,true); //--- превращение динамического массива в индикаторный буфер SetIndexBuffer(1,TriggerBuffer,INDICATOR_DATA); //--- осуществление сдвига индикатора 2 по горизонтали на Shift PlotIndexSetInteger(1,PLOT_SHIFT,Shift); //--- осуществление сдвига начала отсчёта отрисовки индикатора PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,min_rates_total); //--- установка значений индикатора, которые не будут видимы на графике PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,EMPTY_VALUE); //--- индексация элементов в буфере как в таймсерии ArraySetAsSeries(TriggerBuffer,true); //--- инициализации переменной для короткого имени индикатора string shortname="geTrendOsc"; //--- создание имени для отображения в отдельном подокне и во всплывающей подсказке IndicatorSetString(INDICATOR_SHORTNAME,shortname); //--- определение точности отображения значений индикатора IndicatorSetInteger(INDICATOR_DIGITS,0); //--- } //+------------------------------------------------------------------+ //| 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(rates_total=0 && !IsStopped(); bar--) { double IxHigh,IxLow,IxOpen,IxClose; //--- IxHigh=High[ArrayMaximum(High,bar,Window)]; IxLow=Low[ArrayMinimum(Low,bar,Window)]; if(IxHigh-IxLow>0) { IxOpen=Open[bar+Window]; IxClose=Close[bar]; Series[Count[0]]=(IxClose-IxOpen)/(IxHigh-IxLow); } else Series[Count[0]]=0; //--- double Sumer=0; double AbsSumer=0; //--- for(int Px=int(OscPeriod-1); Px>=0; Px--) { Sumer+=Series[Px]; AbsSumer+=MathAbs(Series[Px]); } if(AbsSumer) IndBuffer[bar]=Sumer/AbsSumer*100/2+50; else IndBuffer[bar]=0.0; //--- HPFilter(IndBuffer,TriggerBuffer,HPPeriod,limit+1); //--- if(bar>0) Recount_ArrayZeroPos(Count,OscPeriod); } //--- return(rates_total); } //+------------------------------------------------------------------+ //| Пересчет позиции самого нового элемента в массиве | //+------------------------------------------------------------------+ void Recount_ArrayZeroPos(int &CoArr[],// Возврат по ссылке номера текущего значения ценового ряда int Size) { //--- int numb,Max1,Max2; static int count=1; //--- Max2=Size; Max1=Max2-1; //--- count--; if(count<0) count=Max1; //--- for(int iii=0; iiiMax1) numb-=Max2; CoArr[iii]=numb; } //--- } //+------------------------------------------------------------------+ //| HPFilter - Фильтр Ходрика-Прескотта | //+------------------------------------------------------------------+ void HPFilter(double &aySource[],double &ayResult[],int Lambda,int iCount) { //--- double Ak[],Bk[],Ck[],H1=0.0,H2=0.0,H3=0.0,H4=0.0,H5=0.0,HH1=0.0,HH2=0.0,HH3=0.0,HH5=0.0,HB,HC,Z; ArrayResize(Ak,iCount); ArrayResize(Bk,iCount); ArrayResize(Ck,iCount); //--- Ak[0]=1.0+Lambda; Bk[0]=-2.0*Lambda; Ck[0]=Lambda; //--- for(int Hx=1; Hx=0; Hx--) { ayResult[Hx]=Ak[Hx]-Bk[Hx]*H1-Ck[Hx]*H2; H2=H1; H1=ayResult[Hx]; } //--- } //+------------------------------------------------------------------+