Встроенные типы данных

Тип данных — это фундаментальное понятие, которым мы органично пользуемся в быту, даже особо не задумываясь о его существовании. Он подразумевается, исходя из значения информации, которой мы обмениваемся, и допустимых для неё способов обработки. Например, контролируя домашний бюджет, мы складываем и вычитаем числа, представляющие собой наши доходы и траты. Здесь "число" является описателем типа, для которого мы хорошо представляем возможные значения и арифметические операции над ними. В контексте торговли в среде MetaTrader 5 имеется аналогичная величина — текущий баланс счета, и MQL5, разумеется, предоставляет некий механизм по созданию чисел и манипулированию ими.

В отличие от чисел, текстовая информация, такая как название торгового инструмента, подчиняется другим правилам. Здесь мы можем сложить слово из букв или предложение из слов, но подсчитать нарастающий итог или среднее от нескольких строк невозможно. Таким образом, "строка" относится к другому тип данных, нечисловому.

Кроме назначения и характерного набора операций, имеющих смысл для каждого типа, существует еще одна важная вещь, отличающая типы друг от друга — это их размер. Например, номер недели в году не может быть больше 52, а вот количество секунд, истекших с начала года, как правило, представляет собой астрономическую величину. Следовательно, для эффективного хранения и обработки столь разных значений в памяти компьютера можно выделять разные по размеру участки. Это приводит нас к пониманию того, что за обобщающим термином "число" могут, на самом деле, скрываться разные типы.

MQL5 позволяет использовать несколько числовых типов, различающихся не только размером ячеек памяти, выделяемых под них, но и дополнительными признаками. В частности, некоторые числа могут принимать отрицательные значения (например, плавающая прибыль в пунктах), а другие нет (номер счета). Кроме того, некоторые величины не способны иметь дробную часть и потому их экономичнее представлять более строгим типом "целых чисел", в противоположность типам произвольных "чисел с дробной частью". Например, баланс счета или цена торгового инструмента, в общем случае, имеют значения с дробной частью. А количество ордеров в истории или опять же номер счета — это всегда целые числа.

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

Для полноты картины заметим, что MQL5 позволяет расширять набор типов, объявляя в коде прикладные типы: структуры, классы и другие сущности, характерные для ООП, но мы рассмотрим их позднее.

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

Минимальной единицей измерения памяти в компьютерах считается байт. Иными словами, байт — это минимальный размер ячейки, которую программа способна выделить под отдельное значение. Внутри байт состоит из 8 более мелких "частиц" — битов, каждый из которых может быть в двух состояниях: включенном (1) или выключенном (0). Все современные компьютеры используют на нижнем уровне такие биты, потому что подобное двоичное (бинарное) представление информации удобно для воплощения в "железе" (в оперативной памяти, в процессорах, во время передачи по сетевым кабелям или WiFi).

Обработка значений разных типов обеспечивается за счет разной интерпретации состояний битов в ячейках памяти. Об этом заботится компилятор. Программист обычно не опускается до уровня битов, хотя в языке имеются средства для этого (см. Побитовые операции).

Для описания типов в MQL5 применяются специальные зарезервированные слова. С некоторыми из них (void, int, string) мы уже познакомились в первой части. Полный список типов приведен ниже, с кратким описанием и размером в байтах.

Их можно условно разделить по назначению на числовые и символьные (помечены в соответствующих колонках), а также остальные, специализированные — строчный, логический (булевый), дата/время и цвет. Особняком стоит тип void, обозначающий отсутствие какого-либо значения. Помимо скалярных типов в MQL5 встроено несколько объектных типов для работы с комплексными числами, матрицами и векторами — complex, vector и matrix. Эти типы используются при решении множества задач из линейной алгебры, математического моделирования, в машинном обучении и т.д. Мы изучим их отдельно в 4-ой Части книги.

Тип

Размер (байты)

Число

Символ

Примечание

char

1

+

+

Однобайтовый символ или целое число со знаком

uchar

1

+

+

Однобайтовый символ или целое число без знака

short

2

+

+

Двухбайтовый символ или целое число со знаком

ushort

2

+

+

Двухбайтовый символ или целое число без знака

int

4

+

 

Целое число со знаком

uint

4

+

 

Целое число без знака

long

8

+

 

Целое число со знаком

ulong

8

+

 

Целое число без знака

float

4

+

 

Вещественное число со знаком

double

8

+

 

Вещественное число со знаком

enum

4

(int)

 

Перечисление

datetime

8

(ulong)

 

Дата и время

color

4

(uint)

 

Цвет

bool

1

(uchar)

 

Логический

string

10+
переменный

 

 

Строка

void

0

 

 

Пустота

complex

16

+

 

Структура с двумя полями типа double

vector

длина вектора x размер типа

+

 

Одномерный массив вещественного или комплексного типа

matrix

строки х столбцы х размер типа

+

 

Двумерный массив вещественного или комплексного типа

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

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

Обратите внимание, что числовые и символьные типы частично пересекаются. Происходит это потому, что символ хранится в памяти как целое число — код в соответствующей таблице символов: ANSI для однобайтовых символов или Unicode для двухбайтовых символов. ANSI — это стандарт, который назван по имени института (American National Standards Institute), а Unicode, как нетрудно догадаться, означает Universal Code (Character Set). Символы Unicode применяются в MQL5 для составления строк (тип string). Однобайтовые символы требуются обычно при интеграции программ с внешними источниками данных, например, из Интернета.

Как мы упомянули выше, числовые типы, можно разделить на целочисленные и вещественные. Рассмотрим их более подробно.