Переход на MQL5

Date February 2nd, 2010 Author Vitaly Agapov

MT5Повсеместный переход на платформу MetaTrader 5 пока что кажется делом отдалённым и необязательным, но мысли “а вдруг” и “что будет, если” в голове всё-таки роятся. И в первую очередь они касаются всех с таким трудом написанных, оттестированных и практически взлелеянных скриптов, индикаторов и советников на языке MQL4. В новом языке MQL5 хоть и обещается “максимальная совместимость” с предшественником, но она всё равно не полная, и придётся приложить некоторые усилия для перевода своих трудов на новые рельсы.
Рассмотрим-ка проблему поближе.

Итак, вот основные отличия между языками, которые нам сообщают в официальной документации:

  • Функции start(), init() и deinit() отсутствуют;
  • Количество индикаторных буферов не ограничено;
  • Загрузка dll происходит сразу после загрузки эксперта (или любой другой mql5-программы);
  • Укороченная проверка логических условий;
  • При выходе за пределы массива текущее выполнение прекращается (критически – с выводом ошибки);
  • Приоритет операций как в С++;
  • Работает неявное приведение типов (даже из строки в число);
  • Локальные переменные автоматически не инициализируются (кроме строк);
  • Обычные локальные массивы уничтожаются автоматически.

Функции start, init, deinit

Здесь всё просто. Фактически, нам придётся просто переименовать все предопределённые функции, потому что в MQL5 у них есть аналоги. Функция init превращается в OnInit, функция deinit – в OnDeinit, а с функцией start чуть сложнее: для скриптов – OnStart, для индикаторов – OnCalculate, для экспертов – OnTick. Причём использование функции OnTick для экспертов стало необязательным (как это было с функцией start в MQL4), потому что появилось несколько функций обработчиков для других событий кроме поступления нового тика: OnTimer, OnTrade, OnChartEvent, OnBookEvent. В общем, ООП в действии.

Пример:

void OnInit()
{
   //--- вызовем функцию при инициализации
   init();
}
void OnDeinit(const int reason)
{
   //--- вызовем функцию при деинициализации
   deinit();
}

Очень полезным нововведением является функция OnTimer, которой очень не хватало в MQL4. Она позволяет обрабатывать события по таймеру и никак не зависеть от прихода новых тиков. В MQL4 это можно было реализовать зацикливанием алгоритма. При этом функция start просто не завершала работу, и периодически проверяла изменение котировок.

Пример:

int OnInit()
{
   EventSetTimer(1); //--- каждую секунду обращаться к OnTimer()
}
void OnDeinit()
{
   EventKillTimer(); //--- отмена обращения к таймеру
}
void OnTimer()
{
   //--- Тело функции
}


Предопределённые переменные и таймсерии

В MQL5 убрали переменные Ask, Bid, Bars. Digits превратилась в _Digits, а Point – в _Point. С таймсериями всё ещё запущеннее. Больше нет предопределённых массивов таймсерий Open[], High[], Low[], Close[], Volume[] и Time[]. Доступ к таймсериям теперь производится с помощью целой кучи функций, что, вынужден признать, делает язык более гибким. К примеру, для получения значения Bid теперь придётся вызывать функцию:
SymbolInfoDouble(Symbol(),SYMBOL_BID);

Индикаторы

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

Автоматизированная конвертация

Перевод программ на MQL5 оказался достаточно трудоёмким процессом, не лишенным, однако, некоторых приятных бонусов вроде небольшого уменьшения объёма кода. Соблазн меж тем всё равно велик, так что я обратился в Гугл в поисках автоматических преобразователей.

http://www.metatraderglobal.com/406/rewrite-mql4-to-mql5-script/
Здесь можно скачать скрипт mq4to5rewrite_sample_v4_2.mq4 для MetaTrader 4. Если ему в /experts/files подсунуть свой индикатор для конвертации, то мы сможем получить работоспособный mq5-индикатор. Но это в теории. На практике же у меня ни индикатор, ни советник после такого издевательства с ходу не заработали. При попытке компиляции вылезюат ошибки, а время на их локализацию и устранение вероятно не окупятся.

Ссылки:

http://www.mql5.com/ru/docs/migration
http://www.metatraderglobal.com

Tags: ,
Category: Forex | No comments »

Comments

Leave a comment

 Comment Form