|
|
|
|
|
|
|
|
Ограничивайте убытки и дайте прибыли расти
Почему мы сразу в нашем скрипте не создали файл сигналов (при его завершении в deinit())? На это есть две причины:
- наши сигналы обнаруживаются только по факту перемещения стрелки SmartArrow на графике, а так как сигналы могут быть достаточно редкие, то при прокрутке графика мы не всегда сможем «перепрыгнуть» с одного сигнала на другой. Поэтому нам приходится применять технику тройного прыжка в легкой атлетике – делать промежуточную остановку (установку лишнего сигнала). Если бы такая функция была бы встроена в терминал МТ4, то значки мы могли бы ставить одним кликом на графике.
- если сигналов для тестирования необходимо нанести слишком много, то, вероятно, будут паузы между сеансами работы со скриптом. Мы можем делать несколько файлов в формате *.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 .
|
|
|
|
Теперь тестирование советника по сигналам из файла проходит без ошибок. Более того, тестирование даже показывает прибыль! Оказывается, экзотический параболический трейлинг стоп имеет право на жизнь при определенных сигналах.
|
|
|
|
Теперь даже человек, который не написал и строчки кода (но прочитал данную статью), может создать свой файл сигналов, взять советник подобного класса, и, перебрав различные системы выхода (или трейлинга), проверить свою новую систему входов.
А если система входов с трудом поддается формализации, то, наверно, это будет единственный путь (и на мой взгляд, не самый худший).
Все использованные файлы доступны здесь
Перейти к статье «Глобальные переменные».
|
|