MQL5 Урок 2 – Типы переменных

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


Предыдущие уроки


MQL5 для чайников - Урок 2: Типы переменных

Что такое переменные?

Если смотреть в разрезе практики, то переменная – это участок, или блок, или ячейка памяти, которой мы даем удобное для нас имя, помещаем туда какие-то данные, и используя имя переменной, которое мы ей дали, мы можем эти данные получать, изменять или куда-то передавать.

Теперь создадим переменную:

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

Уроки по MQL5 , ,