MetaQuotes Language II - учимся программировать. Урок №1
Дата: 3.3.07 | Раздел: MQL программирование
MetaQuotes Language II - учимся программировать. Урок №1MetaQuotes 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
Материал предоставлен : http://forextimes.ru/magazine
Cтатья опубликована на сайте "Форекс форум. Торговля на Forex. Cообщество трейдеров": http://youfx.ru
Адрес статьи: http://youfx.ru/modules/myarticles/article_storyid_1.html |