Статьи по MQL4
Чтение из файла

Чтение из файла


например, forex

Ограничивайте убытки и дайте прибыли расти


Почему мы сразу в нашем скрипте не создали файл сигналов (при его завершении в deinit())? На это есть две причины:
  1. наши сигналы обнаруживаются только по факту перемещения стрелки SmartArrow на графике, а так как сигналы могут быть достаточно редкие, то при прокрутке графика мы не всегда сможем «перепрыгнуть» с одного сигнала на другой. Поэтому нам приходится применять технику тройного прыжка в легкой атлетике – делать промежуточную остановку (установку лишнего сигнала). Если бы такая функция была бы встроена в терминал МТ4, то значки мы могли бы ставить одним кликом на графике.
  2. если сигналов для тестирования необходимо нанести слишком много, то, вероятно, будут паузы между сеансами работы со скриптом. Мы можем делать несколько файлов в формате *.csv и сшивать их с помощью Excel.


Создадим отдельный скрипт для записи сигналов в файл. Поправляем положение стрелок на графике, удаляем ненужные (вынужденные лишние сигналы) и запускаем скрипт ArrowsToFile.mq4. Для его написания я скопировал готовые куски кода из WriteFile.mq4 , изменил только немного init().

 
 


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

 
 


Для проверки скрипта добавим на график трендовую линию с именем SmartArrow555.

 
 


Запускаем скрипт на графике, мои 12 стрелок были обработаны.

 
 


Видим, что на графике оказалось три объекта, которые не являлись стрелками, также видим, что наши стрелки попали в обработку (отсортированы) не по времени, а по имени. В будущем нам может понадобиться операция сортировки. Открываем файл в Excel:

 
 


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

 
 


Сохраненный шаблон найдем в одной из папок МТ4:

 
 


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

Если есть операция записи в файл, то должна быть и обратная – чтение из файла. С массивами все понятно, мы можем всегда получить размер массива и организовать цикл for() для получения значений элементов массива по индексу элемента. Когда же мы открываем файл, мы обычно не знаем заранее сколько строк или значений в нем записано. Поэтому необходим какой-то стоп-сигнал, чтобы прервать цикл операций чтения из файла. Смотрим справочную систему и видим:

 
 


Функция FileIsEnding() является наиболее подходящей для завершения чтения из файла. Пишем простой скрипт для получения навыков, имя файла для чтения сигналов я заложил жестко.

 
 


Если бы это был индикатор или советник, то этот код привел бы к зависанию терминала! Важно: бесконечный цикл разрешается только в скриптах. Мы получили бесконечный цикл, так как не можем достигнуть конца файла. Необходима операция «прокрутки» файла, функция чтения из текстового файла FileReadString() как раз должна это обеспечить. Я не знал, как она работает, и решил проверить методом проб и ошибок.

 
 


Файл сигналов у нас маленький, поэтому через закладку «Эксперт» мы все должны увидеть. В Excel я насчитал 13 строк и 52 значения (13*4). Запускаю скрипт на любом графике и вижу лог:

 
 


Видим, что ожидаемые значения отличаются от напечатанных на единицу. Значит, скрипт делает один холостой ход, прежде чем определяет конец строки и конец файла. Это знание поможет нам для заполнения массива сигналов в советнике. Сохраним скрипт под именем ReadFile.mq4.

Советник для тестирования ручных сигналов мы писать не будем, возьмем RTS+TS3.mg4, назовем его CutTheLosses.mq4 и переопределим функцию init(). Функцию SignalExist() пока сделаем пустой.

 
 


Если мы знаем структуру текстового файла, то правильно прочитать его не сложно. Теперь мы имеем массив сигналов и можем приступить к тестированию советника. Для этого нам нужно научить функцию SignalExist() извлекать из Signals[] нужные сигналы. Используем простой алгоритм – в каждый момент времени пробегаем по всему массиву и сравниваем текущее время Time[0] со временем в Signals[i][0], если значения совпадают – проверяем тип сигнала и по нему выдаем ответ.

 
 


Функцию GetOrder() переделаем незначительно: удалим случайную составляющую, запись в комментарий ордера оставим прежней – вдруг пригодится в будущем.

 
 


Обратите внимание, в конструкцию else мы внесли дополнительную проверку на тип ордера. Если когда-нибудь мы передадим в эту функцию в качестве параметра OP_BUYLIMIT или OP_SELL_STOP, то это предотвратит нас в будущем от ошибочного открытия ордера в продажу (OP_SELL).

Советник готов, но если его запустить в тестере на EURUSD H1 (откуда мы брали сигналы), то ничего не выйдет. Смотрим закладку «Журнал» в тестере и видим:

 
 


Код ошибки (4103) подтверждает невозможность открытия файла. Дело в том, что все файловые операции в тестере производятся в своей собственной папке, поэтому скопируем наш файл в папку /tester/files .

 
 


Теперь тестирование советника по сигналам из файла проходит без ошибок. Более того, тестирование даже показывает прибыль! Оказывается, экзотический параболический трейлинг стоп имеет право на жизнь при определенных сигналах.

 
 


Теперь даже человек, который не написал и строчки кода (но прочитал данную статью), может создать свой файл сигналов, взять советник подобного класса, и, перебрав различные системы выхода (или трейлинга), проверить свою новую систему входов. А если система входов с трудом поддается формализации, то, наверно, это будет единственный путь (и на мой взгляд, не самый худший).
Все использованные файлы доступны здесь
Перейти к статье «Глобальные переменные».
 
+7 (495) 710-76-76
8 (800) 200-01-31
по России бесплатно

закрыть

Вход в личный кабинет

Для счета alpari.classic введите номер счета (буква и 4 цифры) и пароль в ЛК.

Для счетов alpari.micro и alpari.partner введите логин и пароль в МТ.

Зарегистрироваться!Забыли пароль?

 
Rambler's Top100