Тимур Машнин

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


Скачать книгу

Fast EMA period

      input int InpSlowEMA=26; // Slow EMA period

      input ENUM_APPLIED_PRICE InpAppliedPrice=PRICE_CLOSE; // Applied price

      Предположим, что мы хотим использовать не стандартный, а пользовательский индикатор.

      В папке Indicators/Examples редактора MQL5 есть нужный нам индикатор – это файл Custom Moving Average.mq5.

      Для вызова того индикатора воспользуемся функцией iCustom:

      int iCustom (

      string symbol, // имя символа

      ENUM_TIMEFRAMES period, // период

      string name // папка/имя_пользовательского индикатора

      …// список входных параметров индикатора

      );

      В функции OnInit () индикатора MACD изменим код:

      // ExtFastMaHandle=iMA (NULL,0,InpFastEMA,0,MODE_EMA, InpAppliedPrice);

      // ExtSlowMaHandle=iMA (NULL,0,InpSlowEMA,0,MODE_EMA, InpAppliedPrice);

      ExtFastMaHandle=iCustom (NULL,0,«Examples\\Custom Moving Average», InpFastEMA,0,MODE_EMA, InpAppliedPrice);

      ExtSlowMaHandle=iCustom (NULL,0,«Examples\\Custom Moving Average», InpSlowEMA,0,MODE_EMA, InpAppliedPrice);

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

      Еще один способ получить хэндл пользовательского индикатора, это использовать функцию IndicatorCreate:

      int IndicatorCreate (

      string symbol, // имя символа

      ENUM_TIMEFRAMES period, // период

      ENUM_INDICATOR indicator_type, // тип индикатора из перечисления ENUM_INDICATOR

      int parameters_cnt=0, // количество параметров

      const MqlParam& parameters_array [] =NULL, // массив параметров

      );

      В функции OnInit () индикатора MACD изменим код:

      MqlParam params [];

      ArrayResize (params,5);

      params [0].type =TYPE_STRING;

      params[0].string_value=«Examples\\Custom Moving Average»;

      // – - set ma_period

      params [1].type =TYPE_INT;

      params[1].integer_value=InpFastEMA;

      // – - set ma_shift

      params [2].type =TYPE_INT;

      params[2].integer_value=0;

      // – - set ma_method

      params [3].type =TYPE_INT;

      params[3].integer_value=MODE_EMA;

      // – - set applied_price

      params [4].type =TYPE_INT;

      params[4].integer_value=InpAppliedPrice;

      // – - initialization done

      ExtFastMaHandle=IndicatorCreate (NULL, NULL, IND_CUSTOM,4,params);

      params[1].integer_value=InpSlowEMA;

      ExtSlowMaHandle=IndicatorCreate (NULL, NULL, IND_CUSTOM,4,params);

      После компиляции индикатора мы опять увидим, что его отображение никак не изменилось.

      После получения хэндла индикатора, если он используется в коде один раз, для экономии памяти неплохо использовать функцию IndicatorRelease:

      bool IndicatorRelease (

      int indicator_handle // handle индикатора

      );

      которая удаляет хэндл индикатора и освобождает расчетную часть индикатора.

      Хорошо, хэндл индикатора мы получили. Как же теперь извлечь его данные?

      Делается это в функции OnCalculate с помощью функции CopyBuffer:

      int CopyBuffer (

      int indicator_handle, // handle индикатора

      int buffer_num, // номер буфера индикатора

      int start_pos, // откуда начнем

      int count, // сколько копируем

      double buffer [] // массив, куда будут скопированы данные

      );

      При этом функция CopyBuffer () распределяет размер принимающего массива под размер копируемых данных.

      Напомним, что это работает, если принимающий массив является просто динамическим массивом.

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

      В индикаторе MACD именно такая ситуация. Промежуточные массивы ExtFastMaBuffer [] и ExtSlowMaBuffer [] привязаны к буферам индикатора:

      SetIndexBuffer (2,ExtFastMaBuffer, INDICATOR_CALCULATIONS);

      SetIndexBuffer (3,ExtSlowMaBuffer, INDICATOR_CALCULATIONS);

      И в эти массивы производится копирование буфера индикатора Moving Average на основе его хэндлов:

      if