Приветствую вас, друзья! Переменные – основа всех языков программирования, потому что неважно, какой алгоритм вы придумали, как вы его реализуете и на каком языке напишете, в итоге это все сведется к обработке переменных. В этом уроке мы разберемся с типами переменных в MQL5.
Предыдущие уроки
Что такое переменные?
Если смотреть в разрезе практики, то переменная – это участок, или блок, или ячейка памяти, которой мы даем удобное для нас имя, помещаем туда какие-то данные, и используя имя переменной, которое мы ей дали, мы можем эти данные получать, изменять или куда-то передавать.
Теперь создадим переменную:
char value_char;
Точка с запятой говорит нам об окончании оператора. Оператор может содержать в себе одну или несколько операций. В нашем случае это одна операция создания или, как принято говорить, объявления переменной типа char по имени value_char.
Имена переменных могут состоять из букв латинского алфавита, при этом заглавные и строчные буквы – разные символы, из цифр и знаков подчеркивания, не могут иметь служебных символов типа =, #, \ и так далее. Кроме того, имя переменной не может начинаться с цифры:
NAME1 namel Total_5 Paper
Mql5 унаследовал от C++ строгую типизацию переменных. Когда мы объявляем переменную, под нее сразу же выделяется некий объем памяти, зависящий от типа значения, которое будет в этой переменной храниться. И однажды задав тип переменной, в нее уже не запихнуть данные другого типа. Ну, то есть в принципе можно, но результат может быть непредсказуемым.
Теперь я расскажу, какие вообще есть типы переменных в mql5. Итак, есть числовые типы, их больше всего. Также есть строковые типы, они же символьные – просто текст. Есть специальные типы, созданные для каких-то нестандартных операций и не подходящие под описание предыдущих двух. Ну и, наконец, составные типы или пользовательские.
Числовые типы делятся на целочисленные и вещественные.
Целочисленные числовые типы
Целочисленных числовых 4 вида:
- char value_char; // 1б памяти, значения от -128 до 127, включая 0;
- short value_short; // 2б памяти, значения от -38886 до 38886, включая 0;
- int value_int; // 4б памяти;
- long value_long; // 8б памяти.
Зачем столько типов? Под каждый тип переменной выделяется разное количество памяти, и диапазон значений, хранимый в каждом типе переменной, будет различаться.
Также есть беззнаковые значения (литералы):
- uchar // 1б памяти, значения от 0 до 255;
- ushort;
- uint;
- ulong.
Памяти выделяется столько же, только значения строго положительные и 0. Английская u перед указанием типа означает unsigned, беззнаковый. Их удобно использовать для переменных, которые не могут быть отрицательными. Например, для подсчета количества ордеров и позиций на торговом счете. Если в переменную поместить значение, которое выходит за диапазон, то результат непредсказуем; точнее, он будет в пределах заданного диапазона, но при этом каким угодно.
Теоретически все это было сделано для экономии памяти. Память для переменных выделяется в оперативной памяти, которой обычно на современных компьютерах гигабайты. И разница – 2 или 4 байта – довольно сомнительная экономия. Тем не менее, в теории я могу представить себе ситуацию, когда такая бережливость может быть оправдана. Например, когда у нас очень много переменных, сложные математические расчеты, куча циклов и все это запускается на слабеньком VPS.
Но на самом деле все же большая часть типов переменных используется редко и в довольно специфических ситуациях. Чаще всего используются типы int, uint и ulong.
Тип bool
Следующий специальный тип – bool. Занимает в памяти 1 байт. Переменные типа bool еще называют логическими: они содержат в себе одно из двух значений – 1 или 0, true (правда) или же false (ложь).
bool value_ bool = true;
Создадим несколько переменных:
bool value_ bool_1 = true;
bool value_ bool_2 = false;
bool value_ bool_3 = 1;
bool value_ bool_4 = 0;
bool value_ bool_5 = -1;
bool value_ bool_6 = 777;
Первым двум переменным я присвоил значения при помощи ключевых слов true и false. Ключевые слова – это зарезервированные в языке программирования последовательности букв и цифр, которые можно использовать только по прямому назначению и никак иначе. В mql5 таких ключевых слов очень много, периодически они будут нам попадаться, и тогда я буду их пояснять.
В данном случае true – истина или 1, false – ложь или 0. А вот последние две переменные демонстрируют, что не так все просто и переменной типа bool могут быть присвоены не только 0 и 1. При этом ложью считается только 0, все остальное — это правда.
Зачем вообще нужен такой тип? Его часто используют как флаги и переключатели для работы с различными вариантами, ветвлением, а еще для проверки верности каких-либо действий или выражений.
Вещественные числовые типы
Вещественных числовых (числа с плавающей запятой или точкой) типов всего два — это float и double:
- float value_float; //4б
- double value_double; //8б
float используется довольно редко, в отличие от double. Этот тип применяется и для рыночных котировок, и для объемов сделок, и для значений прибыли и убытков и так далее.
Разница между double и float в точности после запятой. Для float максимальная точность – 24 знака после запятой, для double 53 знака.
Работа памяти компьютера больше подходит для хранения целых чисел. Дробные хранятся в памяти в виде степени целого числа. Например, 0,25 хранится как 2 во 2 степени, а вот 0,3 хранится уже не так хорошо, при изъятии его из памяти изначальное 0,3 превращается во что-то вроде 0,300000001.
Строковый тип string
Теперь рассмотрим строковые переменные типа string. В них содержатся строки текста. Это довольно сложный тип данных. Для работы со строками в mql5 существует больше десятка разных функций, с которыми мы познакомимся в других уроках.
string value_string = «йцукен»;
Я использовал операцию присвоения (=). Она говорит о том, что мы присваиваем переменной некое значение. Теперь при обращении к переменной value_string она будет возвращать нам значение «йцукен», пока мы это значение не перепишем.
Комментарии
В прошлом уроке вы уже видели комментарии. Сейчас хочу обратить внимание, что типа комментариев на самом деле два: строчный и блочный. Строчный – в виде двух идущих подряд слешей //.
Блочный комментарий выглядит по-другому. Он нужен для того, чтобы сразу комментировать целый блок кода. Ставим слеш и звездочку /*, а в конце */.
Тип enum
Специальный тип enum представляет из себя перечисление или именованное перечисление. Объявляется он немного сложнее, чем другие переменные.
Enum value_enum {num_1, num_2, num_3};
Эта запись говорит о том, что в перечислении value_enum содержатся 3 пронумерованных члена и к ним можно обращаться как по именам, так и по порядковым номерам. В mql5 целая куча предустановленных перечислений на все случаи жизни. Но этот тип мы будем разбирать в более поздних уроках.
Тип datetime
Следующий специальный тип – datetime:
datetime value_datetime;
Этот тип содержит в себе дату и время, которые хранятся в виде количества секунд, прошедших с 00:00 1 января 1970 года. Для работы с этим типом, как и с типом string, предусмотрено немало функций, и им также будет посвящен отдельный урок. При помощи переменной типа datetime можно, например, определять момент открытия нового бара или задать роботу время торговли или перерыва в торговле.
Тип color
Следующий специальный тип переменной – color:
color value_color;
Этот тип содержит в себе описание цвета. Присваивать ему значение можно тремя разными способами. Для именованных web цветов это можно сделать заданными ключевыми словами:
color value_color = clrBlue;
Сами web цвета можно посмотреть в документации mql5.
Также можно присвоить переменной значение в виде трех десятичных чисел или одним шестнадцатиричным числом. Но это не всегда удобно.
Типы color и datetime имеют смысл только для удобства представления и ввода параметров, задаваемых извне – из таблицы свойств советника или пользовательского индикатора (вкладка «Inputs»). Данные типов color и datetime представляются в виде целых чисел.
Пользовательские типы переменных
Это сложные типы данных, такие как классы и структуры. Называть их переменными или даже типами данных не совсем верно. Пользовательские типы данных тесно связаны с понятием ООП или объектно-ориентированное программирование, о котором у нас будет отдельный урок или даже несколько. Сейчас же смысла углубляться в это нет.
Объявление переменных
На этом по типам переменных у нас все. А мы перейдем к объявлению переменных. Мы уже объявляли много переменных, но дело в том, что переменные одного типа можно объявить так:
int a=3, b, c;
Print(«Переменная a=», a);
Print(«Переменная b=», b);
Print(«Переменная c=», c);
Результат: а=3, b=3, c=3.
int a, b=3, c;
Print(«Переменная a=», a);
Print(«Переменная b=», b);
Print(«Переменная c=», c);
Результат: а=1, b=3, c=3.
int a, b, c=3;
Print(«Переменная a=», a);
Print(«Переменная b=», b);
Print(«Переменная c=», c);
Результат: а=1, b=1, c=3.
При объявлении переменных в одну строку те, которые мы инициализировали явно, имеют присвоенные им значения. Те, которые не инициализировали, имеют предыдущее значение.
Код в программе выполняется слева направо. Новая строка как бы справа. В теории всю программу можно написать в одну строку.
Приведение типов
Преобразование одного типа данных в другой называется приведением типов. Оно производится неявным и явным способом. Присвоим переменной одного типа значение другого типа:
int a = с, b = 12, c=3;
char d = 120;
Print(«Переменная a=», a);
На примере Print у нас происходит неявное преобразование. Мы передаем int, компилятор уже сам преобразовывает ее в текст.
a = d;
Компилятор в данном случае не ругается. Диапазон значений a больше, чем у d.
Если d = a, мы получаем предупреждение, потому что диапазон у а больше.
Чтобы не было ошибки, можно явно преобразовать тип: d = (char)a; ошибка не исчезнет, но предупреждения не будет.
Область видимости переменной
Переменная, объявленная внутри какой-либо функции – локальная. Область видимости локальной переменной ограничена пределами функции, внутри которой она объявлена. Локальные переменные располагаются во временной области памяти соответствующей функции.
Глобальные переменные размещаются вне какой-либо функции. Глобальные переменные определяются на том же уровне, что и функции, они не локальны ни в каком блоке. Область видимости глобальных переменных – вся программа. Глобальные переменные доступны из всех функций, определенных в программе.
Модификатор input указывается перед типом данных. Изменять значение переменной с модификатором input внутри mql5-программы нельзя, такие переменные доступны только для чтения. Изменять их может только пользователь из окна свойств программы.
На этом все, всем пока!
С уважением, Дмитрий аkа Silentspec
Tlap.com