Язык программирования MQL5: Продвинутое использование торговой платформы MetaTrader 5. Тимур Машнин
Чтение книги онлайн.

Читать онлайн книгу Язык программирования MQL5: Продвинутое использование торговой платформы MetaTrader 5 - Тимур Машнин страница 17

СКАЧАТЬ // хэндл индикатора iMA

      int amount // количество копируемых значений

      )

      {

      ResetLastError ();

      if (CopyBuffer (ind_handle,0, -shift, amount, values) <0)

      {

      return (false);

      }

      return (true);

      }

      Далее в функции OnCalculate () заполним буфера индикатора данными и цветом:

      for (int i=start; i <rates_total &&!IsStopped ();i++)

      {

      IKBuyBuffer [i-1] =0;

      ColorIKBuyBuffer [i-1] =1;

      IKSellBuffer [i-1] =0;

      ColorIKSellBuffer [i-1] =1;

      if (close [i-1]> open [i-1] &&close [i-1]> EMA34HBuffer [i-1] &&close [i-1]> EMA34LBuffer [i-1] &&low [i-1]> EMA125Buffer [i-1] &&low [i-1]> PSARBuffer [i-1] &&EMA125Buffer [i-1] <EMA34LBuffer [i-1] &&EMA125Buffer [i-1] <EMA34HBuffer [i-1]) {

      IKBuyBuffer [i-1] =high [i-1];

      ColorIKBuyBuffer [i-1] =0;

      }

      if (close [i-1] <open [i-1] &&close [i-1] <EMA34HBuffer [i-1] &&close [i-1] <EMA34LBuffer [i-1] &&high [i-1] <EMA125Buffer [i-1] &&high [i-1] <PSARBuffer [i-1] &&EMA125Buffer [i-1]> EMA34LBuffer [i-1] &&EMA125Buffer [i-1]> EMA34HBuffer [i-1]) {

      IKSellBuffer [i-1] =low [i-1];

      ColorIKSellBuffer [i-1] =0;

      }

      }

      bars_calculated=calculated;

      // – - return value of prev_calculated for next call

      return (rates_total);

      }

      Здесь мы рассчитываем индикатор на предыдущем баре, так как на текущем баре цена close – это текущая цена тика.

      Откомпилируем код и присоединим индикатор к графику:

      Мы увидим, что, в общем и целом, индикатор дает верные сигналы на продажу и покупку, хотя в некоторых случаях он запаздывает и дает ложные сигналы:

      Как мы видим, происходит это из-за трендовой линии EMA125.

      Попробуем отвязать ее от текущего периода и попробуем определять тренд, скажем по дневному графику:

      EMA125Handle=iMA (NULL, PERIOD_D1,125,0,MODE_EMA, PRICE_CLOSE);

      При этом запаздывание, конечно, сократится, но количество ложных сигналов увеличится:

      Видимо для улучшения данной стратегии, нужно привлекать дополнительные индикаторы.

      Попробуем сделать этот же самый индикатор, но не с помощью графических построений, а помещая графические объекты на график символа.

      В свойствах индикатора теперь не нужно объявлять буфера данных и цвета индикатора и графические серии для них. Оставим только буфера индикатора для промежуточных расчетов и хэндлы используемых индикаторов:

      #property indicator_chart_window

      #property indicator_buffers 4

      double EMA34HBuffer [];

      double EMA34LBuffer [];

      double EMA125Buffer [];

      double PSARBuffer [];

      int EMA34HHandle;

      int EMA34LHandle;

      int EMA125Handle;

      int PSARHandle;

      int bars_calculated=0;

      В функции OnInit () соответственно оставим только привязку массивов к буферам промежуточных расчетов и получение хэндлов используемых индикаторов:

      int OnInit ()

      {

      // – - indicator buffers mapping

      SetIndexBuffer (0,EMA34HBuffer, INDICATOR_CALCULATIONS);

      SetIndexBuffer (1,EMA34LBuffer, INDICATOR_CALCULATIONS);

      SetIndexBuffer (2,EMA125Buffer, INDICATOR_CALCULATIONS);

      SetIndexBuffer (3,PSARBuffer, INDICATOR_CALCULATIONS);

      EMA34HHandle=iMA СКАЧАТЬ