Язык MetaQuotes Language (MQL) является объектно-ориентированным языком программирования высокого уровня и предназначен для написания автоматических торговых стратегий, пользовательских технических индикаторов для анализа разнообразных финансовых рынков. Он позволяет не только писать разнообразные экспертные системы, предназначенные для работы в режиме реального времени, но и создавать собственные графические инструменты, помогающие принимать торговые решения.
MQL основан на концепции широко распространенного языка программирования С++, в нем присутствуют перечисления, структуры, классы и обработка событий. Благодаря расширению числа встроенных основных типов, взаимодействие исполняемых программ на MQL с другими приложениями посредством dll максимально облегчено. Синтаксис языка MQL подобен синтаксису С++, и это позволяет легко переносить на него программы из современных языков программирования.
Для того, чтобы начать разрабатывать собственные программы, нам необходимо познакомиться с синтаксисом языка программирования.
Типы данных
Любая программа, написанная на любом языке программирования, должна уметь оперировать с данными, т. к. обработка данных является собственно целью создания любого программного продукта.
Данные могут быть различных типов в зависимости от назначения. Например, для доступа к элементам массива используются данные целочисленного типа. Ценовые данные имеют тип двойной точности с плавающей точкой. Это связано с тем, что в языке MQL не предусмотрено специального типа для ценовых данных.
Данные разного типа обрабатываются с разной скоростью. Целочисленные данные обрабатываются быстрее всего. Для обработки данных двойной точности используется специальный сопроцессор. Однако из-за сложности внутреннего представления данных с плавающей точкой, они обрабатывается дольше, чем целочисленные. Дольше всего обрабатываются строковые данные. Это связано с динамическим распределением-перераспределением оперативной памяти компьютера.
Основные типы данных:
- целые (char, short, int, long, uchar, ushort, uint, ulong);
- логические (bool);
- литералы (ushort);
- строки (string);
- с плавающей точкой (double, float);
- цвет (color);
- дата и время (datetime);
- перечисления (enum)
Сложные типы данных:
- структуры;
- классы.
В терминах OOП сложные типы данных называются абстрактными типами данных.
Типы color и datetime имеют смысл только для удобства представления и ввода параметров, задаваемых извне - из таблицы свойств советника или пользовательского индикатора (вкладка "Inputs"). Данные типов color и datetime представляются в виде целых чисел. Целые типы вместе с типами с плавающей точкой называются арифметическими (числовыми) типами.
В выражениях используется неявное приведение типов, если не указано явное приведение.
Давайте разберем подробнее каждый тип данных, используемый при написании программ на языке MQL.
Целые типы данных
char. Целый тип char занимает в памяти 1 байт (8 бит) и позволяет выразить в двоичной системе счисления 2^8 значений=256. Тип char может содержать как положительные, так и отрицательные значения. Диапазон изменения значений составляет от -128 до 127.
uchar. Целый тип uchar также занимает в памяти 1 байт, как и тип char, но в отличие от него, uchar предназначен только для положительных значений. Минимальное значение равно нулю, максимальное значение равно 255. Первая буква u в названии типа uchar является сокращением слова unsigned (беззнаковый).
short. Целый тип short имеет размер 2 байта(16 бит) и, соответственно, позволяет выразить множество значений равное 2 в степени 16: 2^16=65 536. Так как тип short является знаковым и содержит как положительные, так и отрицательные значения, то диапазон значений находится между -32 768 и 32 767.
ushort. Беззнаковым типом short является тип ushort, который также имеет размер 2 байта. Минимальное значение равно 0, максимальное значение 65 535.
int. Целый тип int имеет размер 4 байта (32 бита). Минимальное значение -2 147 483 648, максимальное значение 2 147 483 647.
uint. Беззнаковый целый тип uint занимает в памяти 4 байта и позволяет выражать целочисленные значения от 0 до 4 294 967 295.
long. Целый тип long имеет размер 8 байт (64 бита). Минимальное значение -9 223 372 036 854 775 808, максимальное значение 9 223 372 036 854 775 807.
ulong. Целый тип ulong также занимает 8 байт и позволяет хранить значения от 0 до 18 446 744 073 709 551 615.
Логический тип данных
Тип bool. Тип bool предназначен для хранения логических значений true (истина) или false (ложь), числовое представление которых 1 или 0 соответственно.
Внутреннее представление – целое число размером 1 байт. Необходимо отметить, что в логических выражениях допустимо использовать вместо типа bool другие целые или вещественные типы или выражения этих типов, компилятор не выдаст ошибки. В таком случае значение ноль будет интерпретировано как false, а все остальные значения как true.
Литералы (ushort) - символьные константы
Символы, как элемент строки, в MQL - это индексы в наборе символов Unicode. Они являются 16-разрядными значениями, которые можно преобразовывать в целые числа и с которыми можно манипулировать целочисленными операциями, такими как сложение и вычитание.
Любой одиночный символ, заключенный в одинарные кавычки, или шестнадцатеричный ASCII-код символа в виде '\x10' является символьной константой и имеет тип ushort. Например, запись вида '0' представляет из себя числовое значение 30, соответствующее индексу, по которому в таблице символов располагается символ ноль.
Обратная косая черта является управляющим символом для компилятора при разборе константных строк и символьных констант в исходном тексте программы. Некоторые символы, например, одинарные кавычки ('), двойные кавычки ("), обратная косая черта (\) и управляющие символы можно представлять комбинацией символов, начинающейся с обратной косой черты(\), в соответствии с приводимой ниже таблицей:
Если за обратной косой чертой следует символ, отличный от перечисленных, результат не определен. Внутреннее представление символьного литерала - тип ushort. Символьные константы могут принимать значения от 0 до 65535.
Строки (string)
Тип string предназначен для хранения текстовых строк. Текстовая строка представляет собой последовательность символов в формате Unicode с завершающим нулем на конце. string-переменной может быть назначена строковая константа. Строковая константа представляет собой последовательность символов Unicode, заключенную в двойные кавычки: "Это строковая константа".
Если необходимо ввести в строку двойную кавычку ("), то перед ней надо поставить символ обратной косой черты (\). В строку могут быть введены любые специальные символьные константы, перед которыми стоит символ обратной косой черты (\).
Длинные константные строки для удобства чтения исходного кода можно разбивать на части без операции сложения. Эти части при компиляции автоматически соберутся в одну длинную строку.
Числа с плавающей точкой (double, float)
Вещественные типы (или типы с плавающей точкой) представляют значения, имеющие дробную часть. В языке MQL есть два типа для чисел с плавающей точкой. Способ представления вещественных чисел в машинной памяти определен стандартом IEEE 754 и не зависит от платформ, операционных систем и языков программирования.
Имя double означает, что точность этих чисел вдвое превышает точность чисел типа float. В большинстве случаев тип double является наиболее удобным. Ограниченной точности чисел float во многих случаях попросту недостаточно. Причина, по которой тип float все еще используется, - экономия памяти при хранении (это важно для больших массивов вещественных чисел).
Константы с плавающей точкой состоят из целой части, точки (.) и дробной части. Целая и дробная части представляют собой последовательности десятичных цифр.
Необходимо помнить, что вещественные числа хранятся в памяти компьютера с некоторой ограниченной точностью в двоичной системе счисления, в то время как общепринятой в использовании является десятичная система счисления. Поэтому многие числа, которые точно записываются в десятичной системе, в двоичной системе можно записать только в виде бесконечной дроби. Например, числа 0.3 и 0.7 представлены в компьютере бесконечными дробями, в то время как число 0.25 хранится точно, так как представляет из себя степень двойки.
В связи с этим, категорически не рекомендуется сравнивать между собой два вещественных числа на равенство, так как такое сравнение не является корректным.
Если все же необходимо сравнить на равенство два вещественных числа, то можно сделать это двумя разными способами. Первый способ заключается в сравнении разницы между двумя числами с какой-то малой величиной, задающей точность сравнения.
Второй способ предполагает сравнивать нормализованную разность двух вещественных чисел с нулевым значением. Сравнивать разность нормализованных чисел с нулём бесполезно, так как в результате любой математической операции с нормализованными числами результат получается ненормализованным.
Цвет (color)
Тип color предназначен для хранения информации о цвете и занимает в памяти 4 байта. Первый байт не учитывается, остальные 3 байта содержат RGB-составляющие.
Цветовые константы могут быть представлены тремя различными способами: литерально, целочисленно или при помощи имени (только для именованных Web-цветов).
Литеральное представление состоит из трех частей, представляющих числовые значения интенсивности трех основных компонент цвета: красной (red), зеленой (green), синей (blue). Константа начинается с символа C и обрамляется одинарными кавычками. Числовые значения интенсивности компоненты цвета лежат в диапазоне от 0 до 255.
Целочисленное представление записывается в виде шестнадцатеричного или десятичного числа. Шестнадцатеричное число имеет вид 0x00BBGGRR, где RR - значение интенсивности красной компоненты цвета, GG - зеленной, а BB - синей.
Десятичные константы не имеют прямого отражения в RGB. Они представляют собой десятичное значение шестнадцатеричного целочисленного представления.
Именованные цвета отражают так называемый набор Web-цветов.
Дата и время (datetime)
Тип datetime предназначен для хранения даты и времени в виде количества секунд, прошедших с 01 января 1970 года. Занимает в памяти 8 байт.
Константы даты и времени могут быть представлены в виде литеральной строки, которая состоит из 6 частей, представляющих числовое значение года, месяца, числа (либо числа, месяца, года), часа, минуты и секунды. Константа обрамляется одинарными кавычками и начинается с символа D.
Диапазон значений от 1 января 1970 года до 31 декабря 3000 года. Может опускаться либо дата (год, месяц, число), либо время (часы, минуты, секунды), либо все вместе.
При литеральном задании даты желательно указывать год, месяц и день, иначе компилятор выдаст предупреждения о неполной литеральной записи.
Перечисления (enum)
Данные перечислимого типа enum относятся к некоторому ограниченному множеству данных. Определение перечислимого типа:
enum имя_перечислимого_типа
{
список_значений
};
Список значений представляет из себя список идентификаторов именованных констант, разделенных запятыми. Пример:
enum months // перечисление именованных констант
{
January,
February,
March,
April,
May,
June,
July,
August,
September,
October,
November,
December
};
После объявления перечисления появляется новый целочисленный 4-байтовый тип данных. Объявление нового типа данных позволяет компилятору строго контролировать типы передаваемых параметров, так как перечисление вводит новые именованные константы. В приведенном примере именованная константа January имеет значение 0, February имеет значение 1, December имеет значение 11.
Правило: если именованной константе - члену перечисления явно не присвоено конкретное значение, то ее значение будет сформировано автоматически. Если это первый член перечисления, то будет присвоено значение 0. Для всех последующих членов значения будет вычисляться на основе значения предыдущего члена путем прибавления единицы.
Пример:
enum intervals // перечисление именованных констант
{
month=1, // интервал в один месяц
two_months, // два месяца
quarter, // три месяца - квартал
halfyear=6, // полугодие
year=12, // год - 12 месяцев
};
Примечания:
- В отличие от C++, размер внутреннего представления перечислимого типа в MQL всегда составляет 4 байта. То есть, sizeof(months) вернет значение 4.
- В отличие от C++, в MQL нельзя объявить анонимное перечисление. То есть, после ключевого слова enum всегда должно быть указано уникальное имя.
Заключение.
В этой статье мы рассмотрели простые типы данных, которые используются практически в каждой программе, в не зависимости от того, на каком языке программирования написана программа. Также приведены некоторые типы данных, свойственных только для языка программирования MQL.