Начинаю изучение MQL 5

В последнее время почти не уделял внимание форексу, советники потихоньку работают, к счастью, сливов не было. Но маятник увлечений опять качнулся к биржевой торговле. На форуме попалась тема про парную (хэджинговую) торговлю. Заинтересовался, ознакомился с темой, скачал несколько советников, даже вручную (на центовом счете) попробовал одну методику.

Но проблема в том, что тестер Metatrader 4 не поддерживает мультивалютную торговлю. А без этого торговать я не буду. Не сидеть же месяцами на демо счете чтобы протестировать «одну стратегию с одними настройками». Не для меня.

Выход вижу только в использовании Metatrader 5. Но его я еще не изучал. Похоже, время пришло. С самим языком вряд ли будут сложности, в моей копилке несколько языков программирования (к сожалению, С++, который лежит в основе MQL 5, не в их числе). А вот с принципами торговли сложности наверняка возникнут. Особенно это различие в представлении ордеров и трудности, на мой пока неискушенный взгляд, работы с ними. Это же надо, чтобы узнать цену закрытия ордера, нужно найти цены всех сделок, участвующих в этом действии (тут якобы реально выводим на биржу предложение, и оно может закрыться несколькими встречными), и усреднить. Хотя наверняка должны быть библиотеки, облегчающие этот процесс. Будем надеяться.

Так что процесс пошел… Сразу решил проверять у себя примеры из документации, так как научен опытом изучения MQL 4, когда в учебнике одно, а в терминале другое. Правда, учебник MQL 4 может отличаться от документации, которая обновляется чаще. Но похоже, и к документации нужно относиться со скепсисом, доверяй но проверяй.

Вот конкретный пример. В примерах документации о классах написано, что если не задан конструктор по умолчанию, но задан параметрический, то вызывать первый нельзя. Но чуть дальше по коду видно как инициализируется новый объект с конструктором по умолчанию (CFoo *pfoo6=new CFoo(); )

 

void OnStart()
  {
// CFoo foo; // такой вариант использовать нельзя - конструктор по умолчанию не задан
//--- допустимые варианты создания объекта CFoo
   CFoo foo1(TimeCurrent());     // явный вызов параметрического конструктора
   CFoo foo2();                  // явный вызов параметрического конструктора с параметром по умолчанию
   CFoo foo3=D'2009.09.09';      // неявный вызов параметрического конструктора
   CFoo foo40(foo1);             // явный вызов конструктора копирования
   CFoo foo41=foo1;              // неявный вызов конструктора копирования
   CFoo foo5;                    // явный вызов конструктора по умолчанию (если конструктор по умолчанию отсутствует,
                                 // то вызывается параметрический конструктор с параметром по умолчанию)
//--- допустимые варианты получения указателей CFoo
   CFoo *pfoo6=new CFoo();       // динамическое создание объекта и получение указателя на него
   CFoo *pfoo7=new CFoo(TimeCurrent());// ещё один вариант динамического создания объекта
   CFoo *pfoo8=GetPointer(foo1); // теперь pfoo8 указывает на объект foo1
   CFoo *pfoo9=pfoo7;            // pfoo9 и pfoo7 указывают на один и тот же объект
   // CFoo foo_array[3];         // такой вариант использовать нельзя - конструктор по умолчанию не задан
//--- выведем значения m_call_time
   Print("foo1.m_call_time=",foo1.ToString());
   Print("foo2.m_call_time=",foo2.ToString());
   Print("foo3.m_call_time=",foo3.ToString());
   Print("foo4.m_call_time=",foo4.ToString());
   Print("foo5.m_call_time=",foo5.ToString());
   Print("pfoo6.m_call_time=",pfoo6.ToString());
   Print("pfoo7.m_call_time=",pfoo7.ToString());
   Print("pfoo8.m_call_time=",pfoo8.ToString());
   Print("pfoo9.m_call_time=",pfoo9.ToString());
//--- удалим динамически созданные объекты
   delete pfoo6;
   delete pfoo7;
   //delete pfoo8;  // удалять pfoo8 явно не нужно, так как он указывает на автоматически созданный объект foo1
   //delete pfoo9;  // удалять pfoo9 явно не нужно, так как он указывает на тот же объект, что и pfoo7
  }

Сразу полез в Metaeditor и что же вижу? Оба заремированных выражения прекрасно компилируются и выполняются!

   CFoo foo; // такой вариант использовать нельзя - конструктор по умолчанию не задан - но работает!
   CFoo foo_array[3];         // такой вариант использовать нельзя - конструктор по умолчанию не задан - но работает!

Print("foo.m_call_time=",foo.ToString());
Print("foo_array[0].m_call_time=",foo_array[0].ToString());

Так что придется сидеть и проверять важные моменты в редакторе. Но это даже хорошо для практического освоения. Ну а чтобы это не было так скучно, можно параллельно переписывать простенькие советники с mql4 на mql5, например тот-же Илан (нашел правда я тройку иланов на mql5, но в тестере они только в минус торгуют, а такого быть не должно).

Вы можете пропустить чтение записи и оставить комментарий. Размещение ссылок запрещено.

Оставить комментарий

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