Первая программа

Попробуем добавить в скрипт что-нибудь простое, но вместе с тем наглядное для демонстрации его работы. Модифицированный скрипт сохраним под новым именем HelloChart.mq5.

Во многих учебниках по программированию начальный пример выводит сакраментальную фразу "Hello, world". На MQL5 похожее приветствие могло бы выглядеть так:

void OnStart()
{
  Print("Hello, world");
}

Но мы сделаем его слегка более информативным:

void OnStart()
{
  Print("Hello, "Symbol());
}

Итак, мы добавили всего одну строку с некоторыми конструкциями языка.

Здесь Print — имя встроенной в терминал функции, предназначенной для вывода сообщений в журнал Экспертов (вкладка Эксперты в окне Инструменты; несмотря на название Эксперты вкладка собирает сообщения от MQL-программ всех типов). В отличие от функции OnStart, которую мы определяем сами, функция Print определена для нас заранее и навсегда. Print — одна из множества встроенных функций, составляющих MQL5 API (программный интерфейс).

Новая строка в нашем коде обозначает инструкцию вызова функции Print с передачей ей списка аргументов (внутри круглых скобок), которые и будут выведены в журнал. Аргументы в списке разделяются запятыми. В данном случае аргументов два: строка "Hello, " и вызов еще одной встроенной функции — Symbol, которая возвращает название рабочего инструмента текущего графика (полученное из неё значение сразу попадет в список аргументов функции Print, на то место, откуда был произведен вызов функции Symbol).

Функция Symbol не имеет параметров и потому внутри круглых скобок в неё ничего не передается.

Например, если скрипт помещен на график "EURUSD", то вызов функции Symbol() вернет "EURUSD", и инструкция с обращением к функции Print приобретет с точки зрения выполняющейся программы обновленный вид: Print("Hello, ", "EURUSD"). Разумеется, с точки зрения пользователя все эти вызовы функций и динамическая подстановка промежуточных результатов происходят незаметно и моментально. Для программиста же важно представлять, как программа выполняется шаг за шагом, чтобы избежать логических ошибок и добиться работы в строгом соответствии с задуманным планом.

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

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

Важно отметить, что запятая внутри кавычек будет выведена в журнал как часть строки и специальным образом не обрабатывается. В отличие от этого, запятая, которая стоит после кавычек и перед вызовом Symbol(), является символом-разделителем в списке аргументов, то есть влияет на поведение программы. Если первую запятую пропустить, программа от этого не потеряет свою корректность, хотя и станет выводить слово "Hello" без запятой после него. Если же пропустить вторую запятую, программа перестанет компилироваться, поскольку синтаксис списка аргументов функции будет нарушен: все значения в нем (а у нас это — две строки) должны быть разделены запятыми.

Ошибка компилятора будет выглядеть следующим образом:

'Symbol' - some operator expected        HelloChart.mq5        16        19

Компилятор "жалуется", что перед упоминанием Symbol чего-то не хватает. Компиляция при этом обрывается и исполняемый файл программы не создается. Поэтому вернем запятую на место.

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

Чтобы убедиться в этом, попробуем удалить эту точку с запятой и откомпилировать скрипт снова. В результате получим новые ошибки с описанием сути и места проблемы в исходном коде.

Ошибки компиляции в журнале редактора MetaEditor

Ошибки компиляции в журнале редактора MetaEditor

 

'}' - semicolon expected        HelloChart.mq5        17        1
'}' - unexpected end of program        HelloChart.mq5        17        1

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

Откомпилируем и запустим исправленный скрипт. Хотя он выполняется очень быстро и почти моментально удаляется с графика, в журнале Экспертов теперь появляется запись, подтверждающая работу скрипта.

HelloChart (EURUSD,H1)        Hello, EURUSD