|
|
|
|
|
|
|
|
|
Мы уже имеем необходимый минимум знаний, чтобы написать простейшую программу на MQL-4. Для этого я выбрал скрипт, а не индикатор или советник, так как в них было бы слишком много новой информации. Сделаем скрипт, который выполняет ту же функцию, что и строка меню терминала «Файл»-«Сохранить как» (Ctrl+S). Для этого начинаем в MetaEditor стандартную процедуру — меню «Файл» — «Создать» (Ctrl+N), появляется диалоговое окно, ставим галочку напротив поля «Пользовательский скрипт»:
|
|
|
|
|
Идем «Далее», открывается новое диалоговое окно. Заполняем поля «Имя», «Автор» и «Ссылка». Поля «Автор» и «Ссылка» MetaEditor в дальнейшем запомнит и будет подставлять их значения при создании каждого нового исполняемого файла. Жмем кнопку «Готово» и скрипт создан.
|
|
|
|
|
Получили простейший код, сгенерированный «Мастером создания советника».
|
|
|
|
|
Код состоит из трех частей:
1. Шапка
2. Директивы компилятору
3. Функция start().
Шапка
|
|
|
|
|
кодом не является, так как представляет 5 строк комментариев. Комментарий — любая строка, которая начинается с двойной косой черты, компилятор игнорирует комментарии, ему нет дела до того, есть ли там ошибки или нет. Но комментарии упрощают понимание программ, в них можно делать пояснения о назначении тех или иных функций или переменных. Экономить на них нецелесообразно, так как спустя какое-то время вы и сами не всегда сможете вспомнить все нюансы, заложенные в программе. Мы видим, что автоматом были вставлены как комментарии значения полей «Имя», «Автор» и «Ссылка». При опубликовании кода это будет удобно видеть.
Директивы компилятору
|
|
|
|
|
фактически тоже не влияют на работу нашего скрипта, но только эти, есть другие директивы, которые могут изменить алгоритм кода очень сильно. Справка по «Управлению компиляцией» приводит «Список предопределенных идентификаторов».
|
|
|
|
|
Функция start()
|
|
|
|
|
Самая важная часть, именно здесь мы задаем тот алгоритм, который и должен выполняться. Любая программа на MQL-4 должна иметь как минимум одну функцию, по умолчанию эта функция называется start(). Первые три строчки — это опять таки комментарии, для любой функции необходимо писать минимальный комментарий, объясняющий назначение функции, лучше сразу себя приучить к этому. Времени для написания требует пару минут, а в последствии может сэкономить часы, и не только для вас, но и для тех, с кем вы поделитесь кодом. Не зря говорят, что иногда проще написать самому, чем разбираться в чужом коде. Мы видим, что функция выделена визуально как блок, что позволяет легко видеть, где заканчивается одна и начинается другая функция. Сама функция может быть разделена на две части:
|
|
|
|
|
содержит имя функции и тип возвращаемого значения данной функцией, а
|
|
|
|
|
само тело функции.
Тело функции всегда заключено в фигурные скобки, и в конце функции (перед закрывающей фигурной скобкой) практически всегда стоит оператор возврата. Справка по оператору:
|
|
|
|
|
В данном случае мы видим, что функция start() возвращает значение 0 (ноль). Это значение мы использовать в данном случае не будем, поэтому можем спокойно закомментировать эту строчку. Наша задача: вывести значения Open, Close, Low, High, Time и Volume для каждого бара(свечи) на графике. Доступ к каждому бару мы можем получить по индексу, таким образом нам необходимо сделать пробег по барам от самого последнего бара до нулевого. Для этого существует оператор цикла for(). Из справки:
|
|
|
|
|
На открытом графике обычно присутствует не более Bars баров. Нам необходимо опросить их все, начиная с самого первого по истории, имеющего индекс Bars-1, и заканчивая последним, имеющим нулевой индекс. Объявим переменную целого типа, назовем ее index и напишем оператор цикла:
for (int index=Bars-1; index>=0; index-) { // Выведем High, Low, Open, Close для бара с индексом index }
Разберем цикл:
int index=Bars-1 объявили переменную index и задали для нее начальное значение Bars-1, то есть мы пойдем от самого первого бара на графике
index>=0 задали условие, при котором тело цикла выполняется. Таким образом, пока индекс больше или равно нулю, тело цикла выполняется
index- равносильно записи index= index-1 . Уменьшение значения на 1 называют декрементом, а увеличение инкрементом. Если индекс больше или равен нулю, выполняется тело цикла, после чего индекс уменьшается на единицу. Таким образом, когда-нибудь наступит момент, при котором index будет меньше нуля, в этот момент цикл и прервется.
{ // Выведем High, Low, Open, Close для бара с индексом index } Тело оператора цикла, вместо комментария нам необходимо вставить настоящие операторы вывода значений. Для этого существует оператор Print()
|
|
|
|
|
Добавим в тело цикла оператор Print(High[index],««,Low[index],» «,Open[index],» «,Close[index],» бар=»,index); Он выводит в Журнал советников и индикаторов значения High, Low и так далее. Скрипт готов, жмем F5 (Компилировать) — если ошибок нет, то скрипт готов к использованию.
|
|
|
|
|
Возвращаемся в терминал, открываем папку «Скрипты» и набрасываем наш скрипт на график EURUSD D1. Открываем окно «Терминал» (Ctrl+T), переходим на закладку «Эксперты» и видим результат работы скрипта. После завершения работы скрипт удаляется с графика : 2006.01.07 23:35:31 OutPrint EURUSD,Daily: removed В журнал экспертов можно выводить любую информацию с помощью оператора Print, при это выводится информация в два столбца. Первый столбец содержит дату и время вывода, а второй столбец содержит название скрипта, название инструмента, тайм-фрейм и двоеточие, после которого выводится результат работы скрипта. В этом простейшем скрипте мы использовали две, пожалуй самые нужные, функции в языке MQL-4, for() и Print(). Если for() используется для выполнения однообразных операций (работа в цикле), то Print() самая удобная функция для протоколирования работы советников и индикаторов, а также для отладки кода. Если код программы не работает, или работает не так, как ожидалось, то самое простое — это использовать вывод в лог переменных программы для анализа ее работы. Обычно этого достаточно для нахождения ошибки в своем коде.
|
|
|
|
|
И напоследок, лог журнала закладки «Эксперты» содержат результат работы нашего скрипта и любого другого советника или индикатора. Если нажмем на любой строке правую кнопку мышки, то появится контекстное меню.
Выберем пункт «Открыть», появится диалоговое окно выбора :
|
|
|
|
|
Логи экспертов (и индикаторов) хранятся в папке Program FilesMetaTrader 4expertslogs, каждый день создается новый файл. Наш лог (в котором находятся результаты работы скрипта) самый последний по времени и дате. Откроем его:
|
|
|
|
|
Таким образом, мы зафиксировали работу нашего скрипта, поэтому Print() очень удобно использовать для отладки кода в онлайне. Сам скрипт можно взять здесь
Перейти к статье «Скрипт – мостик в Microsoft Excel».
|
|
|
|
|
|