MetaQuotes Language II
MetaQuotes Language II
Язык программирования MetaQuotes Language II используется при написании собственных программ – экспертов (expert advisors) для автоматизации контроля торговых процессов, а также для реализации собственных торговых стратегий. MetaQuotes Language II прост в изучении, использовании и отладке. В состав MQL II включено большое количество переменных, необходимых для контроля текущих и прошлых котировок, основные арифметические и логические операции, встроены основные индикаторы и команды по открытию позиций и контролю над ними. По синтаксису похож на язык программирования EasyLanguage от TradeStation Technologies, Inc., однако есть некоторые отличия. Для написания кода программы используется текстовый редактор экспертов MetaEditor, умеющий выделять цветом различные конструкции языка MQL II, позволяя пользователю легче ориентироваться в тексте экспертной системы. Комментарии начинаются с символов //(двойной слеш). Также комментарии можно выделять парой ‘слеш -звёздочка’ – ‘звёздочка -слеш’ (/*[comments]*/ как в языке программирования Си). Встроенный редактор выделяет комментарии серым цветом.
Для отладки и контроля работающей стратегии ведется лог – файл, где сохраняется информация о сгенерированных сигналах, вывод переменных и результаты проведения сделок. Логи работы экспертов находятся в файле /logs/YYYYMMDD.log в каталоге MetaTrader. Доступ к текущему логу возможен прямо из нижнего окна “Terminal” (вкладка Journal).
В качестве справочной системы по языку MQL II используется окно MetaQuotes Language Dictionary, вызываемое при нажатии на кнопку Dictionary либо из меню Tools. Краткий справочник содержит разбитые на категории функции, операции, зарезервированные слова etc и позволяет узнать описание каждого используемого элемента, входящего в язык.
1. Основные языковые конструкции
Как любой другой язык, MQL II имеет набор основания.
Основным объектом языка являются данные. Данные могут быть 3 типов: числовые, логические или строковые. Все числовые значения имеют формат double. Логические данные могут принимать значения True или False. Строка – это набор символов, выделенный апострофами. Строка символов может называться также текстовой строкой. Данные могут храниться в переменных соответствующих типов, либо могут быть непосредственно представлены в исходном тексте программы.
Предложение (MetaQuotes Language statement) представляет собой законченную инструкцию. Предложения могут содержать зарезервированные слова, операторы, данные, переменные, выражения, знаки пунктуации и всегда заканчиваются знаком ‘;’ (точка с запятой, semicolon). Зарезервированными словами будем называть предопределённые слова, имеющие специфическое значение или специальное назначение. Операторами называются символы, представляющие собой обозначение неких операций над данными, переменными и (или) выражениями. Переменные необходимы для хранения числовых, строковых или логических данных. Выражением будем называть комбинацию зарезервированных слов, переменных, данных, операторов, результатом которой является значение одного из 3 используемых в языке типов: числовое, логическое либо строка символов. Знаки пунктуации используются для представления выражений, определения параметров, разделения слов либо для переупорядочивания последовательности вычислений.
2. Знаки пунктуации
Знак |
Название |
Описание |
; | Semicolon | Завершает инструкцию MetaQuotes Language II |
( ) | Parentheses | Группирует значения в выражении для изменения порядка вычислений. Выделяют параметры в функциях и инициализируют выражения в описании переменных. Выделяют инициализирующие значения для переменных и массивов в секции описания переменных. |
, | Comma | Разделяют параметры при вызове функции. Разделяют переменные в секции описания переменных. Разделяют числа в описании размерности массивов. Разделяют индексы при доступе к элементам массива. |
: | Colon | Используется в секции описания переменных в качестве начала списка переменных |
” “ | Quotation marks | Выделяют текстовую строку (строку символов) |
[ ] | Square brackets | Выделяют числа при определении размерности массива. Выделяют числа(индексы) при доступе к какому-либо элементу массива. Выделяют номер периода при доступе к <историческим> данным |
{ } | Curty brackets | Операторные скобки. Могут использоваться вместо begin : end. Выделяют набор инструкций в блок |
/* */ | Comment brackets | Выделяют комментарий |
// | Double slash | Определяет начало однострочного комментария |
3. Операторы
Операторы делятся на 6 групп: оператор присваивания, строковый оператор, математические операторы, относительные операторы, логические операторы, операторы инкремента и декремента.
3.1. Оператор присваивания
Для назначения переменным какого – либо значения (числового, строкового или логического, в зависимости от типа переменной) используется оператор присваивания ‘=’ (знак равенства). Присваиваемое значение может быть результатом выражения. Пример:
Variable: Counter(0);
…
Counter = Counter + 1 ;
В результате переменной Counter будет присвоено значение 1. Присваивать значения можно также и элементам массива.
Примечание: знаком равенства обозначается также и оператор сравнения “равно”. В логических выражениях If-Then и While знак равенства воспринимается как оператор сравнения.
3.2. Строковый оператор
Для манипулирования текстовыми строками имеется всего один оператор ‘+’ (знак плюс ). Он обеспечивает объединение двух строк . Пример :
Variable: String(” “);
:
String = “some_” + “text”;
В результате переменная String будет содержать текстовую строку “some_text”. Допускается также объединение строк с числовыми и логическими значениями. В этом случае перед объединением числовые и (или) логические значения будут приведены к строковому типу. Пример:
String = “string” + 1 ;
В результате переменная String будет содержать текстовую строку “string 1”.
В качестве операндов могут выступать не только значения, но и переменные соответствующих типов, содержащие такие значения, а также выражения, результатом выполнения которых, будут такие значения.
3.3. Математические операторы
Четыре основных математических действия: сложение – ‘+’ (знак плюс); вычитание – ‘-‘ (знак минус); умножение – ‘*’ (звёздочка); деление – ‘/’ (слеш). Используются в математических выражениях для вычисления числовых значений.
Примеры математических выражений:
( Ask + Bid ) / 2 , High[1 ] + 20 * Point
3.4. Относительные операторы
Используются для сравнения двух значений одного и того же типа. Первое значение сравнивается со вторым, в результате чего формируется логическое значение True (истина) или False (ложь). Меньше – ‘<‘ (левая угловая скобка); больше – ‘>’ (правая угловая скобка); равно – ‘=’ (знак равенства); не равно – ‘<>’; меньше или равно – ‘<=’; больше или равно – ‘>=’; ‘crosses over’; ‘crosses under’. Логические значения, полученные в результате сравнительного выражения, используются в управляющих структурах MetaQuotes Language II. Пример:
If FreeMargin < 1 000 Then Exit;
Результат сравнительного выражения может быть присвоен логической переменной (переменная, которая может принимать значения True или False). Так как знак равенства обозначает одновременно и оператор присваивания, и относительный оператор “равно”, то в данном случае, для преодоления неоднозначности, в качестве относительного оператора “равно” необходимо использовать ‘==’ (два знака равенства подряд), как это принято в языке программирования Си. Пример:
ConditionValue = OrderValue(cnt,VAL_TYPE) ==
OP_SELL;
Текстовые строки сравниваются в лексикографическом порядке. То есть строка “aaa” меньше строки “zzz”. При сравнении логических значений следует иметь в виду, что числовым значением логического значения True является 1, а значением False – 0.
Для сравнения данных , хранящихся в массивах можно использовать операторы ‘crosses over’ (синоним ‘crosses above’) и ‘crosses under’ (синоним ‘crosses below’). Эти операторы используются для сравнения пары подряд идущих значений одного массива с парой значений другого массива.
‘crosses over’ – текущее значение больше и предыдущее значение меньше или равно;
‘crosses under’ – текущее значение меньше и предыдущее значение больше или равно.
Пример:
If Close[0] crosses over Open[0] Then Alert(“Close price
crosses over open price!”);
3.5. Логические операторы
Позволяют комбинировать логические значения. Логическое ИЛИ – ‘|’ (вертикальная черта , broken bar); логическое И – ‘&’ (амперсант); логическое НЕТ – ‘!’ (восклицательный знак). Логическим операторам соответствуют зарезервированные слова OR, AND, NOT. Пример:
If FreeMargin > 1 00 and FreeMargin < 1 000 then print(
“Free margin is “, FreeMargin );
Заметим, что операции OR и AND являются двухместными, то есть оперируют с двумя значениями. Операция же NOT является одноместной, то есть, применима только к одному значению. Пример:
Variable: Condition 1 ( True );
:
Condition 1 = FreeMargin >= 1 000;
If not Condition 1 then exit;
Также логическое НЕТ может быть применено к сравнительному оператору “равно”. Такая конструкция будет воспринята компилятором как оператор “не равно”.
Ниже приведём таблицы результатов логических операций.
Значение 1 |
Значение 2 |
Значение 1 OR Значение 2 |
True | True | True |
True | False | True |
False | True | True |
False | False | False |
Значение 1 |
Значение 2 |
Значение 1 AND Значение 2 |
True |
True |
True |
True | False | False |
False | True | False |
False | False | False |
Значение 1 |
Значение 2 |
NOT Значение 1 |
True |
|
False |
False |
|
True |
3.6. Операторы инкремента и декремента
Эти операторы изменяют значение числовой переменной. В этом смысле они аналогичны оператору присваивания. В сочетании с переменной такой оператор представляет собой законченное выражение, поэтому не может быть использован внутри другого выражения.
Инкремент единицы – “++”; декремент единицы – “–“; инкремент числового выражения – “+=”; декремент числового выражения – “-=”
Примеры:
Counter++; // same as Counter = Counter + 1 ;
Counter–; // same as Counter = Counter – 1 ;
Counter -= 1 0; // same as Counter = Counter – 1 0;
По аналогии с инкрементом и декрементом числового выражения можно использовать операторы “*=” и “/=”.
Примеры:
SomeNumber *= 7; // same as SomeNumber =
SomeNumber * 7;
SomeNumber /= 11 ; // same as SomeNumber =
SomeNumber / 11 ;
Справа от операторов “+=”, “-=”, “*=”, “/=” должно находиться любое числовое выражение.
Продолжение читайте в следующем номере.
По материалам компании
MetaQuotes Software Corp.
http://www.metaquotes.ru