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

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

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

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

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

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

    char value_char;

    Точка с запятой говорит нам об окончании оператора. Оператор может содержать в себе одну или несколько операций. В нашем случае это одна операция создания или, как принято говорить, объявления переменной типа char по имени value_char.

    Имена переменных могут состоять из букв латинского алфавита, при этом заглавные и строчные буквы – разные символы, из цифр и знаков подчеркивания, не могут иметь служебных символов типа =, #, \ и так далее. Кроме того, имя переменной не может начинаться с цифры:

    NAME1 namel Total_5 Paper

    Mql5 унаследовал от C++ строгую типизацию переменных. Когда мы объявляем переменную, под нее сразу же выделяется некий объем памяти, зависящий от типа значения, которое будет в этой переменной храниться. И однажды задав тип переменной, в нее уже не запихнуть данные другого типа. Ну, то есть в принципе можно, но результат может быть непредсказуемым.

    Теперь я расскажу, какие вообще есть типы переменных в mql5. Итак, есть числовые типы, их больше всего. Также есть строковые типы, они же символьные – просто текст. Есть специальные типы, созданные для каких-то нестандартных операций и не подходящие под описание предыдущих двух. Ну и, наконец, составные типы или пользовательские.

    Числовые типы делятся на целочисленные и вещественные.

    Целочисленные числовые типы

    Целочисленных числовых 4 вида:

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

      Также есть беззнаковые значения (литералы):

        Памяти выделяется столько же, только значения строго положительные и 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 используется довольно редко, в отличие от 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.io

          Без переменных не обходится ни один алгоритм. Сегодня мы поговорим о типах переменных mql5, особенностях каждого типа переменных, областях видимости переменных в языке mql5 и преобразовании одного типа в другой. Видео урок