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

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

СКАЧАТЬ indicator_type1 DRAW_COLOR_ARROW

      #property indicator_color2 clrRed, clrBlack

      #property indicator_type2 DRAW_COLOR_ARROW

      Далее определим массивы буферов индикатора и хэндлы используемых индикаторов:

      double IKBuyBuffer [];

      double ColorIKBuyBuffer [];

      double IKSellBuffer [];

      double ColorIKSellBuffer [];

      double EMA34HBuffer [];

      double EMA34LBuffer [];

      double EMA125Buffer [];

      double PSARBuffer [];

      int EMA34HHandle;

      int EMA34LHandle;

      int EMA125Handle;

      int PSARHandle;

      В функции OnInit () для первого графического построения определим тип стрелки – стрелка вверх, пустое значение и сдвиг:

      int OnInit ()

      {

      PlotIndexSetInteger (0,PLOT_ARROW,233);

      PlotIndexSetDouble (0,PLOT_EMPTY_VALUE,0);

      PlotIndexSetInteger (0,PLOT_ARROW_SHIFT, -10);

      Для второго графического построения определим тип стрелки – стрелка вниз, пустое значение и сдвиг:

      PlotIndexSetInteger (1,PLOT_ARROW,234);

      PlotIndexSetDouble (1,PLOT_EMPTY_VALUE,0);

      PlotIndexSetInteger (1,PLOT_ARROW_SHIFT,10);

      Свяжем массивы с буферами индикатора:

      SetIndexBuffer (0,IKBuyBuffer, INDICATOR_DATA);

      SetIndexBuffer (1,ColorIKBuyBuffer, INDICATOR_COLOR_INDEX);

      SetIndexBuffer (2,IKSellBuffer, INDICATOR_DATA);

      SetIndexBuffer (3,ColorIKSellBuffer, INDICATOR_COLOR_INDEX);

      SetIndexBuffer (4,EMA34HBuffer, INDICATOR_CALCULATIONS);

      SetIndexBuffer (5,EMA34LBuffer, INDICATOR_CALCULATIONS);

      SetIndexBuffer (6,EMA125Buffer, INDICATOR_CALCULATIONS);

      SetIndexBuffer (7,PSARBuffer, INDICATOR_CALCULATIONS);

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

      EMA34HHandle=iMA (NULL,0,34,0,MODE_EMA, PRICE_HIGH);

      EMA34LHandle=iMA (NULL,0,34,0,MODE_EMA, PRICE_LOW);

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

      PSARHandle=iSAR (NULL,0,0.02, 0.2);

      В функции OnCalculate () произведем проверку размера доступной истории для расчета используемых индикаторов, определим количество копируемых значений используемых индикаторов и определим стартовую позицию расчета индикатора:

      int values_to_copy;

      int start;

      int calculated=BarsCalculated (EMA34HHandle);

      if (calculated <=0)

      {

      return (0);

      }

      if (prev_calculated==0 || calculated!=bars_calculated)

      {

      start=1;

      if (calculated> rates_total) values_to_copy=rates_total;

      else values_to_copy=calculated;

      }

      else

      {

      start=rates_total-1;

      values_to_copy=1;

      }

      Переменную bars_calculated определим как глобальную int bars_calculated=0; в свойствах индикатора.

      Далее произведем копирование из буферов используемых индикаторов в массивы буферов нашего индикатора:

      if (!FillArrayFromMABuffer (EMA34HBuffer,0,EMA34HHandle, values_to_copy)) return (0); if (!FillArrayFromMABuffer (EMA34LBuffer,0,EMA34LHandle, values_to_copy)) return (0); if (!FillArrayFromMABuffer (EMA125Buffer,0,EMA125Handle, values_to_copy)) return (0);

      if (!FillArrayFromPSARBuffer (PSARBuffer, PSARHandle, values_to_copy)) return (0);

      Здесь FillArrayFromMABuffer и FillArrayFromPSARBuffer – пользовательские функции, определенные вне функции OnCalculate ():

      //+ – — – — – — – — – — – — – — – — – — – — – — – — – — – — – — – — – +

      bool FillArrayFromPSARBuffer (

      double &sar_buffer [], // индикаторный буфер значений Parabolic SAR

      int ind_handle, // хэндл индикатора iSAR

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

      )

      {

      ResetLastError ();

СКАЧАТЬ