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 |