Продвинутое использование торговой платформы MetaTrader 5. Создание индикаторов и торговых роботов на MQL5 и Python. Издание 3-е, исправленное и дополненное. Тимур Машнин

Читать онлайн книгу.

Продвинутое использование торговой платформы MetaTrader 5. Создание индикаторов и торговых роботов на MQL5 и Python. Издание 3-е, исправленное и дополненное - Тимур Машнин


Скачать книгу
с графическим построением с помощью номера графического построения, следующего после indicator_type.

      Цвет каждого графического построения индикатора задается свойством indicator_colorN.

      Например, для индикатора ADX:

      #property indicator_color1 LightSeaGreen

      #property indicator_color2 YellowGreen

      #property indicator_color3 Wheat

      Цвет сопоставляется с графическим построением с помощью номера графического построения, следующего после indicator_color.

      В справочнике MQL5 есть таблица Web-цветов для определения цвета графического построения.

      Вернемся теперь к количеству буферов для расчета индикатора.

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

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

      Делается это в функции обратного вызова OnInit() с помощью вызова функции SetIndexBuffer.

      Например, для индикатора ADX:

      SetIndexBuffer(0,ExtADXBuffer);

      SetIndexBuffer(1,ExtPDIBuffer);

      SetIndexBuffer(2,ExtNDIBuffer);

      Где первый аргумент, это номер графического построения.

      Таким образом, массив связывается с диаграммой индикатора, а диаграмма связывается с ее формой и цветом.

      Однако с буферами индикатора все немного сложнее.

      Их количество может быть заявлено больше, чем количество графических построений индикатора.

      Что это означает?

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

      Например, для индикатора ADX:

      SetIndexBuffer(3,ExtPDBuffer,INDICATOR_CALCULATIONS);

      SetIndexBuffer(4,ExtNDBuffer,INDICATOR_CALCULATIONS);

      SetIndexBuffer(5,ExtTmpBuffer,INDICATOR_CALCULATIONS);

      Такой массив определяется с помощью третьего параметра INDICATOR_CALCULATIONS.

      Это дает следующее:

      Все дело в частичном заполнении массива.

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

      Рассмотрим это на примере индикатора ADX.

      В редакторе MQL5, в окне Navigator (Навигатор), в разделе Indicators->Examples выберем и откроем исходный код индикатора ADX.

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

      // SetIndexBuffer(5,ExtTmpBuffer,INDICATOR_CALCULATIONS);

      Теперь массив ExtTmpBuffer является просто динамическим массивом.

      Откомпилируем код индикатора и присоединим индикатор к графику в терминале MetaTrader 5.

      В результате Терминал выдаст ошибку.

      array out of range

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

      Так что его размер был равен нулю, когда мы попытались в него что-то записать.

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


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