Строковый тип

Строковый тип предназначен для хранения текстовой информации и обозначается ключевым словом string. Строка представляет собой последовательность символов типа ushort и поддерживает весь спектр Unicode (включая множество национальных алфавитов). В частности, названия финансовых инструментов и комментарии в торговых приказах — это строки.

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

В MQL5 нельзя получить адрес строки или любой другой переменной, в отличие от C++. Прямой доступ к памяти в MQL5 запрещен.

Строковый литерал записывается в исходном коде как последовательность символов, заключенная в двойные кавычки. Например, "EURUSD" или "$". Следует различать строки из одного символа (как "$") и те же самые одиночные символы ('$') — это разные типы данных.

Пустая строка выглядит так — "". С учетом неявного завершающего нуля на неё тратится 2 байта (не считая служебной информации).

Если необходимо внутри строки использовать символ двойной кавычки, он предваряется символом обратной косой черты, превращаясь в управляющую последовательность — "Нажмите кнопку \"OK\"".

Примеры инициализации строк приведены в скрипте MQL5/Scripts/MQL5Book/p2/TypeString.mq5.

void OnStart()
{
   string h = "Hello";          // Hello
   string b = "Press \"OK\"";   // Press "OK"
   string z = "";               //
   string t = "New\nLine";      // New
                                // Line
   string n = "123";            // 123, text (not an integer value)
   string m = "very long message "
              "can be presented " 
              "by parts";
   // equivalent:
   // string m = "very long message can be presented by parts"; 
}

В переменную h помещается строка "Hello".

В переменную b записывается текст, содержащий двойные кавычки.

Переменная z инициализируется пустой строкой. Это, в принципе, эквивалентно описанию z без инициализации, но здесь существуют нюансы. Чуть позже в разделе про Инициализацию переменных мы узнаем, что строки без инициализации получают специальное значение NULL (в отличие от "", для которой, как было сказано выше, выделяется память под "терминальный ноль"). Такое различие сказывается при выполнении операции сравнения строк и некоторых других. Мы затронем все такие особенности по мере продвижения по материалу.

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

Строка "123", записанная в переменную n, не является числом, хоть и выглядит таковым. В MQL5 имеется несколько функций для преобразования текста в числа и обратно (см. раздел Преобразование данных). Кроме того, существует отдельный набор функций для работы со строками.

Длинные литералы могут быть записаны для удобства на нескольких строчках, как для переменной m. Общее правило такое: все литералы вплоть до точки с запятой, которая обозначает конец описания переменной, склеиваются компилятором. Самое главное при таком форматировании — не забыть добавить разделительный пробел внутри каждого фрагмента строки, если он нужен (в частности, для разделения слов сообщения, как в приведенном примере).

Для строк определена операция суммирования или конкатенации, обозначаемая символом '+', — мы поговорим об этом в главе про выражения (см. Арифметические операции).

Символы строки можно прочитать по отдельности, обращаясь к ним как к элементам массива (см. Использование массивов): если s — строка, то s[i] — код i-го символа в ней, типа ushort.