Тимур Машнин

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


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

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

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

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

      )

      {

      ResetLastError ();

      if (CopyBuffer (ind_handle,0,0,amount, sar_buffer) <0)

      {

      return (false);

      }

      return (true);

      }

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

      bool FillArrayFromMABuffer (double &values [], // индикаторный буфер значений Moving Average

      int shift, // смещение

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

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

      )

      {

      ResetLastError ();

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

      {

      return (false);

      }

      return (true);

      }

      void OnDeinit (const int reason) {

      ObjectsDeleteAll (0, -1, -1);

      }

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

      Функция OnChartEvent

      Функция OnChartEvent является функцией обратного вызова, которая вызывается при взаимодействии пользователя с графиком символа и событиях, связанных с графическими объектами графика символа.

      void OnChartEvent (const int id, // идентификатор события

      const long& lparam, // параметр события типа long

      const double& dparam, // параметр события типа double

      const string& sparam // параметр события типа string

      );

      В качестве примера использования функции OnChartEvent рассмотрим наш индикатор Impulse keeper и добавим в него функциональность, позволяющую посмотреть значения используемых индикаторов при клике на сигнале покупки или продажи индикатора.

      Для этого добавим в код индикатора функцию OnChartEvent, обрабатывающую событие щелчка мыши на графическом объекте индикатора:

      #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;

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

      //| Custom indicator initialization function |

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

      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 (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);

      // – —

      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 [])

      {

      // – —

      int values_to_copy;

      int start;

      int calculated=BarsCalculated (EMA34HHandle);

      if (calculated <=0)

      {

      return (0);

      }

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

      {

      start=rates_total-1;

      if (calculated> rates_total) values_to_copy=rates_total;

      else values_to_copy=calculated;

      }

      else

      {

      start=1;

      values_to_copy=1;

      }

      if