вторник, 8 мая 2012 г.

MQL4 (МОЛ4) - Программируем на языке для МТ4


Если Вы умеете программировать на C или C++, то Вы уже очень многое знаете про MQL4. Если Вы не изучали никакого языка программирования, то никаких проблем в этом нет — я попробую обучить Вас понимать концепцию программирования.

Итак, начнем с самого начала.

MQL4? Что, где и почему?

MQL4 обозначает MetaQuotes Language 4.
MetaQoutes — это компания, которая создала торгговую платформу MetaTrader.
Для того, чтобы сделать эту торговую платформу сильней платформ своих конкурентов, компания MetaQuotes снабдила её встроенным языком программирования, которые позволяют пользователю (Вам) реализовывать свои торговые стратегии.

Этот язык позволяет Вам создавать следующее:

1 - Советники
2 - Роботы и МТС
2 - Индикаторы
3 - Скрипты

Советник — это программа, которая может автоматизировать Ваши сделки. Например, она может автоматизировать открытие Ваших сделок, закрывать их, отменять/заменять сделки.
Роботы - это не программы волшебной генерации денег. В правильном понимании -  есть профессиональные трейдеры, которые разрабатывают торговые системы и по ним торгуют, если система прибыльная, то фактически програмисты переводят алгоритм действия трейдера на язык програмирования, в результате создаётся программа, которая будет торговать как профессиональный трейдер по заданному алгоритму.
Индикатор — это программа, которая позволяет Вам пользоваться функциями технических индикаторов, но не может автоматизировать Ваши сделки в части принятия торговых решений и таким образом плавно перекочевать в разряд советников.
Скрипт — Это программа, выполняющая одну функцию. В отличии от советников, скрипты исполняются однократно — при востребовании, а не на каждом тике. И, конечно же, скрипт не имеет доступа к техническим индикаторам.
Это были ответы на вопросы: «Что» такое MQL4? «Почему» надо использовать MQL4?

Теперь, «Где» писать MQL4?

Чтобы написать свой код на MQL4 (впрочем, как и на любом другом языке) можно пойти двумя путями — сложным или простым.

1-Сложный путь:

Сложный путь заключается в использовании Вашего любимого текстового редактора и команды prompt для компиляции.
Блокнот — неплохой выбор, но не забывайте две вещи:

1-сохранять файл, который Вы создали в обычном текстовом формате.
2-сохранять файл с расширением .mq4 (это чтобы потом было легче открыть его с помощью MetaEditor), хотя можете сохранять в любом формате.

После сохранения кода есть ещё один необходимый шаг прежде, чем Ваша программа выйдет в свет.
Это шаг компиляции.
Компиляция означает превращение понятного человеку кода, который Вы только что написали, в машинный язык, который понимает компьютер.

MetaTrader снабжён своим собственным компилятором (программа, которая превращает Ваш код в машинный язык), называемым MetaLang.exe.

MetaLang.exe — консольная программа, которая на входе берёт два параметра, а на выходе даёт файл формата .ex4 (такие файлы понимает метатрейдер).
Первый параметр — это опции, и единственная возможная опция — это -q (quit)
Второй параметр — полный путь к Вашему .mql файлу.

Синтаксис выглядет так:
metalang [options...] filename

Пример:

1- найдите путь к своему metalang.exe, он лежит там же, где и MetaTrader (например: D:Program FilesMetaTrader 4)

2- создайте batch-файл и назовите его compile.bat (или любым другим именем)

3- напишите следующие строки в bat-файл, а затем сохраните его:
cd D:Program FilesMetaTrader 4
metalang -q «D:ProgramFilesMetaTrader 4my_first_script.mq4″
(не забудьте подставить свой путь к MetaTrader)

4- Запустите batch-файл, и если Вам повезёт, то Вы увидите:
Рис. 1
Как видите, у Вас появился файл «my_first_mql4_script.ex4″

2-Простой путь

В MetaTrader есть хороший встроенный редактор, называемый MetaEditor, который имеет три особенности:

1- Он подчёркивает различные конструкци языка MQL4, пока вы читаете/набираете код.

2- Очень легко компилировать программы. Надо просто нажать F5, и MetaEditor сам сделает всю сложную работу и создаст файл .ex4.
К тому же, очень легко понять, что не так в Вашей программе, взглянув в инструментарий. (см. рис. 2)

3- Встроенный исчерпывающий словарь.
рис. 3

Синтаксис языка MQL4
Теперь мы поговорим про синтаксис языка MQL4.И, как я уже говорил, если Вы программируете на C или C++, то Вы уже очень многое знаете про MQL4.Это потому, что синтаксис MQL4 очень похож на синтаксис C. Синтаксис — сторона языка программирования, которая описывает структуру программ как наборов символов (обычно говорят — безотносительно к содержанию). «Wikipedia»Т.е. когда мы изучаем синтаксис языка, мы изучаем его грамматику и правила написания, которые состоят из:

  • Форматирование
  • Комментарии
  • Идентификаторы
  • Зарезервированные слова
Разберёмся с каждым из этих пунктов отдельно.


1 — Форматирование текста в MQL4

Когда Вы пишите код, Вы можете свободно использовать любое количество пробельных символов: пробелов, табуляций, пустых строк — чтобы делать свой код читаемым и приятным для просмотра.

Например, следующие коды равнозначны в MQL4:

Код:
double MacdCurrent, MacdPrevious, SignalCurrent;
Код:
double

MacdCurrent,

MacdPrevious,

SignalCurrent;
Код:
double MacdCurrent, MacdPrevious, SignalCurrent;
Но, как Вы видите, первый вариант более читаем и проще воспринимается.

Однако, к любому правилу есть исключения:

1. Запрещено исрользовать символ переноса строки после знака решётки:

Например, следующая строка неверна:

Код:
#property

copyright "Copyright © 2004, MetaQuotes Software Corp."
А эта верна:

Код:
#property copyright "Copyright © 2004, MetaQuotes Software Corp."
2. Запрещено использовать пробельные символы внутри констант, идентификаторов и ключевых слов.

Например, следующая строка верна:

Код:
extern int MA_Period=13;
Здесь «extern» и «int» — ключевые слова, «MA_Period» — идентификатор, а «13″ — константа.
Но об этом подробнее в следующем уроке.

Следующие строки неверны:

Код:
extern int MA_Period=1

3;
Код:
extern int MA_Period=1 3;
Код:
ex

tern int MA_Period=13;

2 — Комментарии на языке MQL4

Чтобы упростить мир программирования (превратить его из невклидового четырёхмерного пространства в евклидово трёхмерное параметрическое), в каждом языке программирования есть свой стиль написания комментариев к коду.

Вы пишите комментарии, которые компилятор игнорирует. Зато код становится понятней.

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

MQL4 (как и C/C++) и спользует два типа комментариев:

Однострочные комментарии

Однострочный комментарий начинается с символов // и заканчивается переходом на новую строку.

Например:

Код:
//Это комментарий

extern int MA_Period=13;
Код:
extern int MA_Period=13; //Это ещё один комментарий
Многострочные комментарии

Многострочные комментарии начинаются символами /* и заканчиваются символами */

Например:

Код:
/*Это

многострочный

комментарий*/
Однострочные комментарии разрешается вкладывать внутрь многострочных:

Код:
/*Это

многострочный //А это ещё один комментарий

комментарий*/
Ещё пример:

Код:
extern int /*HELLO! I’m a comment*/ MA_Period=13;
А вот так нельзя:

Код:
extern int //test MA_Period=13;
Многострочные комментарии вкладывать друг в друга запрещается.

3. Идентификаторы

Идентификатор — это имя, которое Вы присвоили своей переменной, константе или функции.

Например:

Код:
extern int MA_Period=13;
Здесь MA_Period — идентификатор.

Есть несколько правил и ограничений в выборе идентификаторов:

Длина идентификатора не должнеа превышать 31 символа.
Идентификатор должен начинаться с буквы (большой или маленькой) или с символа _.
В качестве идентификаторов нельзя использовать зарезервированные слова, с которыми мы скоро познакомимся.
Идентификаторы чувствительны к регистру. Т.е. MA_Period и ma_Period — это разные идентификаторы.
Рассмотрим несколько примеров:

Код:
Name1 верно

_Name1 верно

1Name неверно

~Name1 неверно

N~ame1 неверно

i_love_my_country_and_my_country_loves_all_the_world

 неверно

Color верно

color неверно (зарезервированное слово)

4. Зарезервированные слова

Есть «слова», которые язык использует для определённых целей.
Их запрещается использовать в качестве идентификаторов или в любых других целях.
Список зарезервированных слов:

Например следующие строчки кода неверны:

Код:
extern int datetime =13;

int extern =20;

double continue = 0;

Типы данных в MQL4

Что такое тип данных?

Любой язык программирования имеет свои названия для описания различных данных хранящихся в памяти.
Например, если в памяти хранится число от -2147483648 до 2147483647, в большинстве языков программирования оно будет называться «integer«.

Переменные?

Переменные — это всего лишь имена, которые привязаны к кускам памяти, где храняться соответствующие данные.
Чтобы было легче понимать, что происходит, представьте себе, что память — это набор коробок различных размеров. Размер коробки — это эквивалент количества бит, требуемого для хранения данного типа.
Чтобы использовать коробку для хранения данных, необходимо присвоить ей имя. Этот процесс называется объявлением.
В процессе объявления Вы используете слово, чтобы объяснить компьютеру какого размера коробка Вам нужна. Это слово называется ключевым.
Лучше дать имя коробке такое, чтобы потом было легко понять, что в ней лежит.
Данные кладутся в коробку путём присвоения данных коробке.
Если объявление и присвоение данных происходит в одной строчке, то такой процесс называется инициализацией.
Когда мы создаём переменную, мы говорим компьютеру, что мы хотим, чтобы он присвоил часть памяти определённого размера (в битах) нашей переменной. Поскольку хранение числа, буквы или большого числа занимает разный объём памяти, компьютер спросит, что Вы хотите хранить в этой памяти, и каков размер данных. Для этого и нужны типы данных.

Например, если мы дадим компьютеру следующую строчку кода:

Код:
int MyVaraible=0;
то мы говорим компьютеру, что хотим, чтобы он выделил блок памяти длиной 4 байта под нащу переменную «MyVariable».

В этом примере:

int — это ключевоу слово
int — тип данных integer
int — объявление

MyVariable — имя переменной

=0 — инициализация

О переменных мы узнаем больше далее.

В MQL4 присутствубт следующие типы данных:

  • Integer (int)
  • Boolean (bool)
  • Character (Char)
  • String (String)
  • Floating-point number (double)
  • Color (color)
  • Datetime (datetime)

1 — Integer

Integer — это число, которое может начинаться с + или — и состоит из цифр. Это число может лежать в пределах между -2147483648 и 2147483647.

MQL4 может представлять integer в десятичной или шестнадцатиричной системе.

Например, следующие числа — типа integer:

Код:
12, 3, 2134, 0, -230

0x0A, 0x12, 0X12, 0x2f, 0xA3, 0Xa3, 0X7C7
Ключевое слово int используется для создания переменной типа integet.

Например:

Код:
int intInteger = 0;

int intAnotherIntger = -100;

int intHexIntger=0x12;
2 — Boolean

Переменная типа Boolean может принимать лищь 2 значения: true или false (или их численные представления 1 и 0). И она занимает 1 бит (!) памяти.
В MQL4 true, TRUE, True равнозначны и false, FALSE, False — тоже.

Тип Boolean назван так в честь математика George Boole.
Ключевое слово bool используется для создания переменной типа Boolean.

Например:

Код:
bool I = true;

bool bFlag = 1;

bool bBool=FALSE;
3 — Character

Переменная типа Character — это один символ. Точнее,- это один из 256 алфавитных, циферных или специальных символов, заданных таблицой ASCII (American Standard Code for Information Interchange).
Символам присвоены числовые значения в соответствии с расположением в таблице.
Чтобы записать символ, нужно поместить его в одинарные кавычки:

Код:
'a' , '$' , 'Z'
Ключевое слово int используется для создания переменной типа Character.

Например:

Код:
int chrA = 'A';

int chrB = '$';
Некоторые символы, называемые Спец. Символами, не могут напрямую находиться внутри одинарных кавыч, потому что у них зарезервированные значения в языке MQL4.

В таких случаях мы используем escape-последовательности. Это означает, что мы ставим слэш-назад () перед символом.

Например:

Код:
int chrA = ''; //просто слэш

int chrB = 'n'; //символ новой строки
Список escape-последовательностей MQL4:

Код:
carriage return r

new line n

horizontal tab t

reverse slash

single quote '

double quote "

hexadecimal ASCII-code xhh
4 — String

Переменная типа String — это набор символов, заключённых в двойные кавычки.
В памяти эти символы храняться в мыссиве — один за другим, в конце стоит терминирующий нуль NULL. Как и в любом массиве, нумерация начинается с нуля.
Символ NULL — это спец. символ (в таблице ASCII ему соответсвует число 0), используемый для обозначения конца строки.
На рис. 1 схематически изображено, как хранится в памяти строка «hello».
рис. 1 — Символы в массиве
MQL4 ограничивает размер строки 255 символами.
В строке можно использовать любые спец. символы, если перед ними Вы поставите .

Ключевое слово string используется для созания переменных типа String.

Например:

Код:
string str1 = "Hello world1, with you coders guru”;

string str2 = "Copyright © 2005, "Forex-tsd forum"."; //Notice the use of (") character.

string str3 = "1234567890";
5 — Floating-point number

Floating-point number — число с плавающей запятой — это действительное число.
Например: 3.0, -115.5, 15 и 0.0001.

Число такого типа может принимать значения от 2.2e-308 до 1.8e308.

Ключевое слово double используется для создания переменных типа Floating-point number.

Например:

Код:
double dblNumber1 = 1000000000000000;
double dblNumber3 = 1/4;
double dblNumber3 = 5.75;
6 — Color

Тип данных Color — это специальный тип данных MQL4, которым задаются цвета различных объектов на Вашем графике в терминале MetaTrader.

Переменную типа Color можно задать тремя способами:

1 — Используя название цвета: Для часто используемых цветов (из набора Web-цветов) можно прямо присваивать переменной имя требуемого цвета.

2 — Используя символьное соответствие: Надо написать ключевой символ ( C ), и после него заключённые в одинарные кавычки (‘) должны идти координаты требуемого цвета в трёхмерном пространстве RGB (красный, зелёный, синий). Эти координаты должны быть в пределах от 0 до 255. Их можно задавать в десятичной или шестнадцатиричной системе.

3 — Используя числовое значение: Каждому цвету из набоора Web-цветов поставлен в соответствии свой код, который можно записывать как десятичной, так и в шестнадцатиричной системе. В шестнадцатиричной системе код записывается проще всего: 0xBBGGRR (BB — синий, GG — зелёный, RR — красный).

Например:

Код:
// символьное соответствие

C'128,128,128' // gray

C'0x00,0x00,0xFF' // blue

// название

Red

Yellow

Black

// числовое значение

0xFFFFFF // white

16777215 // white

0x008000 // green

32768 // green
Ключевое слово color используется для создания переменной типа Color.

Например:

Код:
color clr1= Red;
color clr1= C'128,128,128';
color clr1=32768;

7 — Datetime

Тип данных Datetime — это специальный тип данных MQL4, который используется для хранения даты и времени. Чтобы задать значение переменной типа Datetime, надо написать ключевой символ (D), и после него заключённые в одинарные кавычки (‘) должна идти требуемая дата в формате год, месяц, день, час, минута, секунда. Переменные этого типа данных могут располагаться внутри временного диапазона от Jan 1, 1970 по Dec 31, 2037.

Например:

Код:
D'2008.01.01 00:00' // Новый год

D'1980.07.19 12:30:27'

D'19.07.1980 12:30:27'

D'19.07.1980 12' //равносильно: D'1980.07.19 12:00:00'

D'01.01.2004' //равносильно: D'01.01.2004 00:00:00'
Ключевое слово datetime используется для создания переменной типа Datetime.

Например:

Код:
datetime dtMyBirthDay= D'1972.10.19 12:00:00';
datetime dt1= D'2005.10.22 04:30:00';

Операции и выражения в MQL4

Что такое операции и выражения?

На самом деле Вы прекрасно знаете, что такое операции. Если я Вам скажу, что +,-,*,/ — элементарные арифметические операции, Вы очень быстро вспомните, что означает слово «операция».

Я уже слышу, как Вы говорите: «О! Так я же знаю, что такое операции, расскажи, что же такое тогда выражения?»

Идентификаторы (Вы их ещё помните? Если нет, то гляньте выше, где говорили о СИНТАКСИСе) совместно с Операциями образуют Выражения.

Запутались? Рассмотрим это на примере:

Код:
x = (y*z)/w
Здесь:

x,y,z и w - идентификаторы.
=,* и / — операции.
А вся строчка — это выражение.

Если в конце выражения поставить символ «;«, то оно превращается в оператор:

Код:
x = (y*z)/w;
Комбинации выражений формируют оператор.

Комбинации операторов формируют функцию.

Комбнации функций формируют программу.

В оставшейся части поста мы будем говорить про типы операций в MQL4.

Начнём с элементарных математических операций:

1 — Арифметические операции

В MQL4 существует 9 арифметических операций:
Замечание: Нельзя комбинировать операция инкремента и декремента с другими выражениями.

Например, следующая строчка некорректна:

Код:
A=(B++)*5;
Но можно так:

Код:
A++;

B=A*5;
2 — Операции присваивания

Смысл любого выражения в формировании результата, а затем присваивания этого результата левому операнду.

Например:

Код:
A = B * C;
Здесь мы умножаем B на C и присваиваем результат A.

В MQL4 существует 11 операций присваивания:

3 — Операции сравнения

Операции сравнения сравнивают два значения (два операнда) и возвращают либо True, либо False.
Это как ответить на вопрос «Вася выше Саши ? Да/Нет ?»

Например:

Код:
4 == 4; //true

4 < 4; //false

4 <= 4 //true;
В MQL4 существует 6 операций сравнения:

4 — Логические операции

Логические операторы заимствованы из Булевой алгебры, которая суть манипулирование верностью концептуальных абстрактных высказываний, не вдаваясь в истинный смысл концепций. Значние верности в Булевой алгебре может принимать лишь два значения: верно или неверно (true OR false).

В MQL4 логические операции также называются Булевыми операциями.
В MQL4 используются три основных логических операции:
Замечание: Логические операции выполняются слева направо. Поэтому, если в операторе A && B; левый операнд равен нулю, то правый операнд даже не рассматривается. Аналогично, если в операторе A || B; левый оператор не равен нулю, то правый операнд даже не рассматривается.

5 — Битовые операции

Битовые (или побитовые) операции очень похожи на логические операции, но они работают на более низком уровне — бинарном уровне представления данных.

В MQL4 доступны следующие битовые операции:
Замечание: Оба операнда, участвующих в побитовых операциях, должны быть типа int.

6 — Другие операции

Есть несколько операций в MQL4, которые не входят ни в одну из предыдущих категорий:


  • Операция индексирования массива []
  • Операция вызова функции ()
  • Операция разделения аргументов функций , (запятая)

Мы подробнее узнаем про массивы и функции балее. Так что просто запомните эти операции, как «Другие операции».

Приоритеты операций.
Моё любимое 
Если у Вас есть оператор, состоящий из нескольких выражений, и Вы явно не указываете, в каком порядке Вы хотите их выполнения, то порядок выполнения определяется исходя из приоритетов операций, входящих в оператор. Операции с более высоким приоритетом выполняются первыми. Например, все мы из школы знаем, что операция деления имеет более высокий приоритет, чем операция сложения. Поэтому, следующие два выражения эквивалентны:

Код:
x + y / 100
x + (y / 100) //недвусмысленно, рекомендую писать так
Используя составные операторы необходимо быть точным и указывать порядок выполнения операций явно с помощью скобок (). Такая практика сделает Ваш код более лёгким для прочтения и редактирования. *

Далее следует список операций. Чем выше операция в списке, тем выше её приоритет. Операции с более высоки приоритетом выполняются раньше операций с более низким приоритетом. Если выбор стоит между двумя одинаковыми операциями, то следует помнить, что все бинарные операции (те, в которых учавствуют два операнда) выполняются слева направо, а все операции присваивания — наоборот — справа налево.

Оставляю список на английском. Заодно будете знать, как называются операции на ‘родном’ языке

() Function call From left to right

[] Array element selection

! Negation From left to right

~ Bitwise negation

- Sign changing operation

* Multiplication From left to right

/ Division

% Module division

+ Addition From left to right

- Subtraction

<< Left shift From left to right

>> Right shift

< Less than From left to right

<= Less than or equals

> Greater than

>= Greater than or equals

== Equals From left to right

!= Not equal

& Bitwise AND operation From left to right

^ Bitwise exclusive OR From left to right

&& Logical AND From left to right

|| Logical OR From left to right

= Assignment From right to left

+= Assignment addition

-= Assignment subtraction

*= Assignment multiplication

/= Assignment division

%= Assignment module

>>= Assignment right shift

<<= Assignment left shift

&= Assignment bitwise AND

|= Assignment bitwise OR

^= Assignment exclusive OR

, Comma From left to right


0 Responses to “MQL4 (МОЛ4) - Программируем на языке для МТ4”

Отправить комментарий