Конвертация скриптов из MetaTrader 4 в NetTradeX Advisors

Введение

Для торговой платформы MetaTrader 4 на данный момент создано огромное число советников и скриптов. Трейдерам, желающим воспользоваться этими скриптами на платформе NetTradeX, раньше требовалось полностью перерабатывать исходный код, что отнимало много времени. Для облегчения этой работы была создана библиотека совместимости языков MQL4 и NTL+. Эта библиотека позволяет значительно упростить процесс конвертации скриптов на язык NTL+ для их последующего запуска в терминале NetTradeX Advisors. Из-за различия торговых платформ MetaTrader и NetTradex (и языков MQL4 и NTL+), Вам, как правило, необходимо сделать несколько небольших изменений в конвертируемых скриптах. Большую часть работы по такой адаптации берет на себя библиотека MQL4.ntl, входящая в поставку терминала NetTradeX Advisors, однако, программисту все равно может понадобиться модифицировать свой скрипт для запуска. В этой статье будет показано, как использовать функции из этой библиотеки и какие изменения понадобится сделать дополнительно.

Базовые принципы работы с библиотекой MQL4.ntl

Итак, прежде чем приступить к основной работе, у Вас должен быть полностью отлаженный скрипт на языке MQL4. Какие же шаги следует предпринять, чтобы превратить этот код в работающий NTL+ скрипт?

Первый шаг - сначала Вы должны создать новый файл скрипта в дереве Scripts окна Navigator терминала NetTradeX Advisors. Сам файл должен располагаться в папке Advisors или Utilities в зависимости от его предназначения. Затем в этот файл скопируем весь текст скрипта на языке MQL4.

Второй шаг - подключение библиотеки MQL4.ntl. Для этого добавьте в начало Вашего файла строку #include "Libraries\MQL4.ntl" . Сразу следует отметить, что компилировать саму библиотеку MQL4.ntl не нужно и для работы функций из библиотеки не требуется исполняемый файл. Эта библиотека не предназначена для самостоятельного запуска и выполняет вспомогательную задачу.

Третий шаг - попытка скомпилировать созданный скрипт. Для этого в редакторе кода кликните на кнопке Compile или нажмите клавишу F7. Скорее всего, компилятор выведет список ошибок и предупреждений, которые мы и будем устранять шаг за шагом. Сейчас же нас интересуют два ключевых момента: обнаружил ли компилятор библиотеку и все ли специальные функции есть в нашем скрипте.

Если компилятор не может обнаружить файл библиотеки, то выводится сообщение "Failed to open script file". В этом случае следует убедиться, что файл MQL4.ntl действительно лежит по пути, указанном в директиве #include , и его имя указанно верно.

Специальными функциями в языке MQL4 являются 3 функции с предопределенными именами init(), start(), deinit(). Для запуска в терминале NetTradeX Advisors все эти функции должны быть определены. Однако в некоторых скриптах могут отсутствовать одна или обе функции init() и deinit(). В такой ситуации компилятор сообщит Вам "No matching signatures to 'init()'" или "No matching signatures to 'deinit()'". В этом случае Вам следует добавить функции init() и deinit() с единственным оператором return 0;

int init()
{
	return 0;
}
int deinit()
{
	return 0;
}

Первый этап можно считать успешно завершенным, если у вас отсутствуют сообщения "Failed to open script file" и "No matching signatures to 'init()'" / "No matching signatures to 'deinit()'". Теперь можно переходить к устранению локальных проблем.

Наиболее часто встречающиеся сообщения компилятора, причины и способы их устранения

В этом разделе будет рассказано о наиболее часто встречающихся сообщениях компилятора, возникающих в процессе адаптации скриптов и будут даны практические решения по устранению несоответствий в коде.

No matching signatures to Print

Данный вид ошибки вызван тем, что в языке NTL+ не допускается использование функций с переменным числом параметров. В этом случае понадобится изменить функцию так, чтобы число параметров в вызове точно соответствовало количеству параметров в ее определении. Функция Print() должна иметь только один входной параметр. Таким образом, вместо Print(параметр1, параметр2, параметр3) следует произвести конкатенацию - Print(параметр1 + параметр2 + параметр3).

Unexpected token 'unrecognized token'

Одна из причин возникновения этого сообщения - попытка подключить через директиву #include файлы библиотек языка MQL4. Язык NTL+ не работает с такими библиотеками, поэтому использование таких файлов невозможно и эти строки нужно удалить из программы.

'True'/'False' is not declared

Имена логических переменных в языке NTL+ начинаются с маленькой буквы, поэтому просто замените True на true и False на false.

No conversion from '_bars&' to 'int' available

Переменная Bars в языке MQL4 предназначена для определения количества баров для текущего графика. В языке NTL+ существует одноименный объект Bars, поэтому в библиотеке MQL4.ntl добавлена переменная bars (c маленькой буквы b), возвращающая количество баров для текущего графика, именно её следует использовать в Вашем скрипте вместо Bars.

Must return a value

Данное сообщение выводится при вызове оператора «return» без возвращаемого значения. При этом функция, в которой используется этот оператор, объявлена с отличным от void возвращаемым значением. При наличии этого сообщения, понадобится либо откорректировать саму функцию или указать значение для return.

Использование магического числа (Magic number)

Использование магических чисел не поддерживается в текущей версии языке NTL+. Для всех открытых позиций возвращается нулевое значение магического числа. В скрипте на языке MQL4 рекомендуется обратить особое внимание на использование магических чисел в условных операторах. Часто достаточно просто удалить или закомментировать функцию OrderMagicNumber(), если Вам не требуется идентифицировать позиции, создаваемые этим советником.

Использование статических переменных

В языке NTL+ не используется ключевое слово «static». При необходимости сохранять значения переменных между запусками функций, следует сделать такие переменные глобальными (без ключевого слово static), поместив их вне функций. При желании, можно добавить модификатор extern, если предполагается изменение этих параметров пользователем во время запуска или работы эксперта.

Определение объема лота

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

Различная работа с DLL файлами

Работа с DLL файлами в терминалах NetTradeX Advisors и MetaTrader4 происходит по-разному. В языке MQL4 необходимо полное описание функции из DLL модуля, в языке NTL+ такое описание не требуется. Вместо указания

#import "имя_файла_или_модуля"
    описание функции function1;
    описание функции function2;
    описание функции functionN;
#import

следует просто создать объект dll произвольный_идентификатор ("имя_файла_или_модуля"); и вызвать нужную Вам функцию через
идентификатор.Call ("имя_функции", параметры_функции_через_запятую);
или
идентификатор.CallProc ("имя_функции", параметры_функции_через_запятую );

Проверка зарезервированных слов языка

В языках MQL4 и NTL+ существуют различия в зарезервированных словах языка. Советники на языке MQL4 могут использовать имена переменных или функций, недопустимые в языке NTL+ , и наоборот. Компилятор может, например, вывести сообщение Expected '(' для строки в которой использование скобки не предлагается. Одна из возможных причин - совпадение имени переменной с одним из зарезервированных слов языка. При таком совпадении необходимо заменить имя переменной на другое во всех местах в коде программы. Для быстрого вызова окна Replace в редакторе служит комбинация клавиш Ctrl+H.

Float value truncated in implicit convertion to integer

Данное предупреждение возникает при попытке присвоить значение типа float или double переменной типа int. Исправление такого несоответствия не является обязательным для запуска скрипта, но его желательно сделать. Преобразование из double в int и из float в int необходимо выполнять явно. Например, для переменной d типа double оно будет иметь следующий вид int(d).

Отсутствие автоматического преобразования из bool в int и обратно

Автоматическое преобразование вида int i; bool b = true; i=b; невозможно в языке NTL+ . При этом выводится сообщение Can't implicitly convert from 'bool' to 'int'. Поэтому, когда вам понадобится такое преобразование, можно воспользоваться следующей конструкцией:

int Run()
{
	// convertion from bool to int;
	bool a=false;
	int b = a?1:0;
	
	// convertion from int to bool
	int c=1;
	bool d = c==0?false:true;
}
Can't implicitly convert from 'datetime' to 'int'

В языке NTL+ требуется явно производить преобразование типа для объектов datetime в переменную int. Это можно сделать следующим образом int i; datetime d; i=int(d);

Цветовые константы

В MQL4 могут использоваться многочисленные константы для работы с цветом объектов графических примитивов. Такие константы в коде можно просто заменить на любой из 16 базовых цветов, например, указав White или Black. Единственное исключение - использование цвета в графических индикаторах. Если используется цвет, который язык NTL+ не распознает, то требуется определить цвет через задание RGB компонент. Например, для цвета Tomato определение будет следующим: color Tomato = 0xFF6347

Работа с массивами данных

В языках MQL4 и NTL+ по-разному осуществляется работа с массивами данных. В NTL+ объявление в виде тип имя[] используется только для индикаторных массивов. Все массивы для хранения других данных объявляются в виде array "тип" имя; или array "тип" имя (размер) . Таким образом, вместо string symb[3] = {"EURUSD", "GBPUSD", "AUDCAD"}; нужно использовать array "string" symb= {"EURUSD", "GBPUSD", "AUDCAD"};

Неподдерживаемые функции

Некоторые функции не поддерживаются в языке NTL+. Эти функции необходимо удалить или изменить логику работы скрипта таким образом, чтобы использовались конструкции языка NTL+. При использовании таких функций в журнале будет выводиться сообщение 'The function is not supported' или 'No matching signatures to function_name'.

Список некоторых неподдерживаемых функций:

  • SendMail()
  • группа функций onArray
  • функции FileOpenHistory, FileIsLineEnding
  • группа функций objects и свойства объектов
  • для следующих режимов функция MarketInfo возвращает нулевые значения:
    • MODE_SWAPLONG
    • MODE_SWAPSHORT
    • MODE_STARTING
    • MODE_EXPIRATION
    • MODE_MINLOT
    • MODE_LOTSTEP
    • MODE_SWAPTYPE
    • MODE_PROFITCALCMODE
    • MODE_MARGINCALCMODE
    • MODE_MARGININIT
    • MODE_MARGINHEDGED
    • MODE_FREEZELEVEL
  • оператор goto
  • функция для расчета пользовательского индикатора iCustom
  • группа функций для работы с окнами (Window functions), MessageBox
  • TerminalCompany(), TerminalName(), TerminalPath()
  • Параметры #property

Резюме

В данной статье мы рассказали о типичных трудностях, возникающих при конвертации скриптов c платформы MetaTrader на NetTradeX. Этот процесс значительно упрощает библиотека MQL4.ntl, поставляемая совместно с терминалом. Преимущество данной библиотеки - полностью открытый код, который программист может изменить или дополнить по своему усмотрению. Мы, в свою очередь, также не останавливаемся на достигнутом и будем добавлять новые и корректировать существующие функции в библиотеке для облегчения процесса конвертации.

IFCMARKETS. CORP. не является компанией, регулиремой ЦБ РФ, и не предоставляет финансовые услуги на территории РФ. Переведенная страница не ориентирована для граждан РФ.