|
|
|
|
|
|
|
|
|
Готовая МТС, в виде программы на MQL-4 - это результат кропотливой работы. Сначала из наблюдений появляется некая идея, затем эта идея проверяется с помощью ручного тестирования на истории. Записываются дата и цена входа, причина выхода, подсчитываются прибыли и убытки. Если ручное тестирование подтвердило потенциальную прибыльность торгового подхода, наступает момент формализации алгоритма торговой системы.
Но не всегда получается формализовать сигналы входа, часто это очень сложная задача. Человек визуально может оценить текущую ситуацию в комплексе, а вот переложить правила на язык алгоритма затрудняется. Получается, что МТ4 тут бессилен? Частичный выход из этой ситуации есть. Если бы могли вручную подготовить сигналы для советника (вход по рынку, выставление отложенных ордеров и т.п.) , а с помощью тестера нашли бы оптимальные значения для защитного стопа, уровня Take Profit, перебрали разные варианты трейлинга…
Это неплохой вариант, но перспектива ручного набивания в файл даты, типа и направления сигнала может напрочь отбить охоту. Мы попробуем решить первую часть задачи (создание файла сигналов) с помощью нанесения на график стрелок разного вида и цвета. Потом все эти стрелки мы обработаем и запишем в файл их координаты. Открываем график, выбираем тип стрелки.
|
|
|
|
Наносим стрелку в нужное место и задаем ее цвет и записываем описание сигнала (sell limit).
|
|
|
|
Следующая стрелка должна иметь сигнал «buy limit» и быть синего цвета. А всего таких стрелок должно быть как минимум 50-60… Оптимизм немного угас. На каждую стрелку требуется 8-10 кликов мышки (посчитайте сами). Но у нас есть способ немного облегчить этот процесс, для этого мы используем скрипт с бесконечным циклом. Назовем его SmartArrow.mq4 (идея MetaQuotes). Создаем с помощью мастера:
|
|
|
|
Пока мы не дадим приказ о завершении работы скрипта, он так и будет в бесконечном цикле что-то делать (смотрите справку по IsStopped()). Этот скрипт ни на долю секунды не оставляет процессор в покое. Поэтому первым делом вставим в цикл функцию Sleep(1000), которая освобождает процессор хотя бы на 1 секунду.
|
|
|
|
Следующий наш шаг – научиться обрабатывать какое-то событие. Мы не можем скриптом выбрать в меню тип стрелки и «прилепить» ее к курсору, но мы можем отслеживать перемещение графических объектов на графике. Вставляем функцию ArrowPosChanged().
|
|
|
|
Проверить изменение положения любого графического объекта можно с помощью функции ObjectGet(ИмяОбъекта, ТипСвойства). Объект стрелка имеет только две координаты – первые координаты времени и цены. Кроме этого мы будем менять цвет и тип стрелки.
|
|
|
|
Факт изменения координаты можно выяснить сравнением значения координаты в текущий момент времени и в какой-то предыдущий. Поэтому введем глобальные переменные curPrice, prevPrice, сurrTime и prevTime. Получился такой код:
|
|
|
|
Мы добавили проверку, если стрелки с именем «SmartArrow» нет на графике – то скрипт завершает свою работу. Проверка первого вызова функции не влияет на работу скрипта, делает алгоритм более правильным – нет ложного возврата значения true при первом вызове функции ArrowPosChanged(). Запускаем для проверки скрипт:
|
|
|
|
Теперь дадим скрипту для работы стрелку с именем «SmartArrow», для этого просто переименуем любую стрелку на графике.
|
|
|
|
Запускаем скрипт и получаем сообщение (я добавил вывод Comment()).
|
|
|
|
Сохраняем это вариант скрипта и продолжаем дорабатывать. Первым делом при запуске скрипта создадим нашу стрелку «SmartArrow» автоматически и зададим для нее все атрибуты. Для этого добавим функцию init().
|
|
|
|
Мы пишем сигналы для советника, тестирование советника начинается не ранее сотового бара с конца, поэтому мы и создали нашу стрелку почти в самом конце графика. Удаляем наш скрипт (вы не забыли, он все еще крутится на графике?), компилируем SmartArrow2.mq4 и запускаем на графике
|
|
|
|
Запуск проходит удачно, закладка «Эксперты» подтверждает, срабатывает блок проверки первого вызова функции.
|
|
|
|
Проматываем график в самый конец , ищем зеленый кружок и не находим… Что не так, почему не работает? С помощью горячих клавиш Ctrl+B просматриваем список объектов, находим нашу стрелку – она там же, где и была!
|
|
|
|
Тут мы вспоминаем, что почти любая функция в МТ4 возвращает код ошибки, если мы добавим обработку этой ошибки, то возможно, поймем в чем дело.
|
|
|
|
Компилируем, запускаем и смотрим закладку «Эксперты»: ошибки нет. Ошибка в нашем алгоритме, ситуацию, когда стрелки нет на графике при запуске скрипта мы обрабатываем, а наличие этой стрелки дает сбой. Изменим еще раз код init():
|
|
|
|
Теперь код работает и мы находим зеленую стрелку там, где ей и положено быть. Осталось только написать обработку события «Перемещение стрелки». Условимся так: если стрелка оказывается ниже Low бара , то превращаем ее в стрелку «Вверх»(код 241) синего цвета, если выше High бара, то будет стрелка «Вниз» (код 242) красного цвета (мы отмечаем поступление сигналов limit). Вы можете выбрать любые другие коды для стрелок, в справке МЕ они показаны:
|
|
|
|
Если стрелка находится между High и Low – просто ругаемся на неумелое манипулирование стрелкой. При этом не забываем выводить в комментарии координаты стрелки в терминах время/цена.
|
|
|
|
Скрипт работает, только иногда не успевает изменить свойства перемещенной стрелки. Это происходит в том случае, если стрелку в момент изменения свойств держит пользователь. Добавим обработку этой ошибки (то есть ситуации, когда должно происходить изменение свойств графического объекта, но этого не происходит). Код обработки ошибки можно посмотреть в SmartArrow2.mq4. Компилируем и запускаем скрипт, перемещаем но не отпускаем стрелку и наблюдаем вывод в закладку «Эксперты».
|
|
|
|
Смотрим в справке «Коды ошибок» и узнаем, что «Объект не существует». То есть, для программы объект недоступен, так как он занят пользователем, и поэтому возвращается такая ошибка. Причина понятна, теперь нужно придумать как разрешить такую исключительную ситуацию. Можно было бы в случае возврата ошибки 4202 запускать цикл (бесконечный или с конечным числом попыток) установки нужного свойства, но всегда можно найти более простое решение. Посмотреть его можно в SmartArrow3.mq4.
Наконец мы победили визуальные ошибки, теперь нам получить файл сигналов. Наиболее напрашивающимся решением будет использование массивов. Каждый раз, когда определяется изменение координат стрелки, меняются свойства стрелки. В этот момент мы могли бы записывать в массив эти характеристики: время, цена и тип/код стрелки (вверх вниз). Объявим массив Arrows[1000][3]. Тысячи стрелок нам должно хватить.
Какого типа должен быть массив? Время и код стрелки имеют тип int, а цена имеет тип double. Рассмотрим оба варианта.
|
|
|
|
Вариант с типом double прост:
|
|
|
|
Вариант с целочисленным массивом лишь немного сложнее. Нам нужно цену с Digits знаками после запятой привести к целому числу. Тут возможны два варианта:
|
|
|
|
Наконец, мы прошли по всем точкам/сигналам. Теперь нам нужно закончить работу скрипта и расставить все запомненные стрелки. Это наиболее удобно сделать в deinit().
|
|
|
|
После удаления скрипта на графике будут расставлены все наши стрелки. Первую часть – расстановка стрелок на графике – мы выполнили. Окончательный вариант сохранен как SmartArrow5.mq4. Все варианты скриптов находятся здесь
Перейти к статье «Чтение из файла».
|
|