Как написать советник

Как написать советник

главные правила написания советников ну это не для ленивых людей так что нужно почитать и разобратся

Прототип торгового робота [ en ]

Введение

Жизненный цикл любой торговой системы сводится к закрытию и открытию позиции. Это ни у кого не вызывает споров. Но в то время, когда дело доходит до реализации метода, то тут, как говорится, сколько программистов, столько и точек зрения.

Любой сможет решить одну и ту же задачу своим собственным методом, но с однообразным окончательным результатом.

За годы практики программирования было перепробовано пара подходов к построению структуры и логики специалистов. Сейчас возможно утверждать, что создана четкая схема шаблона, что используется во всех кодах.

Данный подход не есть на 100% универсальным, но он может поменять ваш способ проектирования логики специалиста. И дело кроме того не в том, какие конкретно возможности работы с ордерами вы желаете применять в специалисте, вся сущность – в том принципе. что закладывается при построении торговой модели.

1. Правила проектирования торговых систем и виды источников событий

Главным подходом к проектированию метода, которым пользуются большая часть, есть отслеживание судьбы одной позиции от момента открытия и до закрытия. Это линейный подход. И в случае если требуется внести трансформации в код – это довольно часто ведет к громадным усложнениям, поскольку появляется код и большое число условий обрастает новыми ветками анализа.

Лучшим ответом для построения модели торгового робота есть «обслуживание состояний». А фундаментальный принцип – это анализ не того, как появилось данное состояние его позиций и эксперта и ордеров – а того, что с ними следует сделать на данный момент. Данный базисный принцип в корне меняет управление торговлей и упрощает разработку кода.

Разглядим его более детально.

1.1. Принцип «обслуживание состояний»

Как уже было сообщено, специалисту не требуется знать, как достигнуто текущее состояние. Он обязан знать, что с ним делать в текущий момент в соответствии с собственному окружению (значения параметров, запомненные характеристики ордеров и т.д.).

Данный принцип напрямую связан с тем, что специалист живет от цикла до цикла (в частном случае — от тика до тика), и его не должно тревожить, что происходило с ордерами на прошлом тике. Следовательно, нужно применять событийный подход управления ордерами. Другими словами, на текущем тике специалист сохраняет собственный состояние, которое есть исходной точкой для принятия ответа на следующем тике.

К примеру, вам нужно удалить все отложенные ордера специалиста и лишь затем продолжить выставление новых и анализ индикаторов ордеров. Большая часть примеров кода, каковые приходилось видеть, применяют зацикливание типа while (true) либо чуть помягче while (k

Данный метод линейный, он «вешает» специалист на неизвестное время.

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

В случае если случится торговая неточность, то специалист предстоящий анализ и работу до следующего цикла.

1.2. Второй фундаментальный принцип проектирования – это максимальное абстрагирование от разглядываемого направления позиции (приобретение/продажа), графика и валюты. Все функции специалиста должны реализовываться так, дабы явный анализ контролируемого направления либо знака осуществлялся в редких случаях, в то время, когда этого вправду избежать запрещено (к примеру, в то время, когда вы разглядываете благоприятное развитие цены для открытой позиции, не смотря на то, что и тут вероятны варианты ухода от конкретики).

Неизменно старайтесь избегать для того чтобы низкоуровневого проектирования. Это разрешит сократить сам процесс и код написания функций минимум вдвое. И сделает их «торгово-свободными».

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

1.3. Третий принцип – разделение метода на логически лексемы (свободные модули)

По практике можем заявить, что оптимальным подходом есть разделение операции специалиста на отдельные функции. Думаю, вы согласитесь с тем, что целый метод специалиста писать в одной функции сложно и затрудняет редактирование и последующий анализ. Тем более не следует этого делать в MQL5, в котором сейчас дается фактически полный контроль над текущим окружением.

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

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

Источниками событий для экспертной совокупности являются:

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

Реже для их корректировки (в большинстве случаев трейлинг Stop Loss либо отложенного ордера по индикатору).

К примеру, практической реализацией работы с индикаторами возможно назвать специалист, разбирающий пересечение стремительной и медленной МА с предстоящим открытием позиции в сторону пересечения.

2. Существующие ордера, позиции и их состояние. К примеру, текущий убыток либо размер профита, наличие/отсутствие позиций либо отложенных ордеров, профит закрывшейся позиции и т.д. Практическая реализация этих событий намного шире и разнообразнее, поскольку вариантов их связей намного больше, чем для индикаторных событий.

Несложным примером специалиста, основанного лишь на торговом событии, есть доливка для сглаживания имеющейся позиции и вывод её в требуемый профит. Другими словами, наличие убытка на имеющейся позиции будет являться событием для отправки нового усредняющего ордера.

Либо, к примеру, трейлинг Stop Loss. Для данной функции проверяется событие, в то время, когда цена отходит в профит на указанное число пунктов от прошлого положения Stop Loss. В следствии чего специалист подтягивает Stop Loss за ценой.

3. Внешние события. И не смотря на то, что в чисто экспертной совокупности это событие в большинстве случаев не имеет место, но в общем случае его стоит разглядывать для принятия ответа. Ко мне относится корректировка пользователем ордеров, позиций, обработка торговых неточностей, обработка событий с графика (перемещение/создание/удаление объектов, нажатие кнопок и т.д.).

В общем, это все события, каковые не поддаются проверке на истории и появляются лишь в ходе работы специалиста.

хорошим примером таких специалистов являются торгово-информационные совокупности с графическим управлением торговлей.

Все многообразие специалистов строится на комбинации этих трех источников событий

2. Базисный класс CExpertAdvisor – конструктор специалистов

Что же будет воображать собой работа торгового специалиста? Неспециализированная схема связей MQL-программы приведена на схеме ниже.

Рисунок 1. Неспециализированная схема связей элементов программы на MQL5

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

После этого исполнение программы переходит во второй блок — модули работы с позициями и ордерами, и лишь позже из модулей вызываются блоки обработки событий. Любой модуль может опрашивать лишь собственное интересуемое событие.

Эту последовательность возможно назвать схемой с прямой логикой, поскольку в ней сперва определяется «ЧТО» будет делать специалист (какие конкретно употребляются модули обработки событий) и лишь позже реализуется «КАК» и «Из-за чего» он будет это делать (получение сигналов событий).

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

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

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

Приведем пример обратной и прямой логики. Заберём открытие/закрытие по сигналу RSI .

  • В обратной логике специалист начинает собственную работу с получения значения индикатора, а после этого контролирует направление сигнала и что необходимо сделать с позицией: открыть приобретение и закрыть продажу, либо напротив — открыть продажу и закрыть приобретение. Другими словами, точкой входа помогает анализ и получение сигнала.
  • В прямой логике все происходит напротив. Специалист имеет два закрытия: позиции и модуля открытия и он просто проверяет условия для исполнения этих модулей. Другими словами, войдя в модуль открытия, специалист приобретает значение индикатора и контролирует, есть

    ли он знаком на открытие. Позже, войдя в модуль закрытия ордера, специалист контролирует, есть ли он знаком на закрытие позиции. Другими словами, точки входа как такой нет — имеется независимо трудящиеся модули анализа состояния совокупности (первый принцип проектирования).

Сейчас, если вы захотите усложнить специалист, то во втором варианте вам это будет сделать существенно проще, чем в первом. Достаточно будет создать новый модуль обработки событий.

А в первом варианте нужно будет пересматривать структуру обработки сигнала либо вставлять его отдельной функцией.

Совет: при описании торговой системы вы должны затевать не со слов 1. Приобретаем сигнал. открываем ордер, а сходу разбивать на разделы: а) Условие открытия ордеров, б) Условия сопровождения ордеров и т.д. и в каждом уже разбирать требуемые сигналы.

Для лучшего понимания этого подхода, приведем разные схемы работы в контекстах четырех разных специалистов.

Рисунок 2. Примеры реализации специалистов

а). Специалист, основанный лишь на сигналах какого-либо индикатора. Может открывать и закрывать позиции при смене сигнала. Пример — специалист по МА.

б). Специалист с графическим управлением торговли.

в). Специалист на базе индикаторов, но уже с добавлением трейлинга Stop Loss и временем работы. Пример — скальпинг на новостях с открытием позиции в сторону тренда по индикатору МА.

г). Безиндикаторный специалист, с сглаживанием позиции, контролирующий параметры позиции лишь один раз на открытии нового бара. Пример — усредняющий специалист.

Как видно из схем, каждая торговая система весьма прямой логикой

3. Реализация класса специалиста

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

Минимум функциональности, которая должна быть в классе CExpertAdvisor. выглядит следующим образом:

1. Инициализация :

  • Регистрация индикаторов;
  • Установка начальных значений параметров;
  • Настройка на требуемый знак и таймфрейм.

2. Функции получения сигналов

  • Разрешенное время работы (торгуемые промежутки);
  • Определение сигнала для открытия/закрытия позиций либо ордеров;
  • Определение фильтра (тренда, времени и т.д.).
  • Запуск, остановка таймера.

3. Сервисные функции

  • Вычисление цены открытия, уровни SL и TP, количество ордера;
  • Отправка торговых запросов (открытие, закрытие, модификация).

4. Торговые модули

  • Обработка сигналов, фильтров;
  • Контроль ордеров и позиций;
  • Работа в функциях специалиста: OnTrade(), OnTimer(), OnTester(), OnChartEvent().

5. Деинициализация

  • Вывод сообщений, отчетов;
  • Чистка графика, выгрузка индикаторов.

Все функции класса разбиваются на три группы. Неспециализированная их вложенности описание и схема функций представлены ниже.

Рисунок 3. Схема вложенности функций специалиста

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

Макросы конвертации типов трудятся с понятием направления рынка – приобретение либо продажа. Исходя из этого, дабы не вводить собственные константы, лучше применять имеющиеся – ORDER_TYPE_BUY и ORDER_TYPE_SELL. Ниже представлены пара примеров применения макросов и результаты их работы.

При разработке специалистов макросы разрешают не конкретизировать обрабатываемое направление и оказывают помощь создавать маленький код.

Эти функции предназначены для работы с позициями и ордерами. Они, как и функции-макросы, также являются низкоуровневыми. Условно их возможно поделить на две категории: функции и информационные функции-исполнители.

Все они делают лишь одно какое-то воздействие, не разбирая никаких событий. Они – исполнители распоряжений от старших обработчиков специалиста.

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

Примеры аккуратных функций: закрыть указанные ордера; поменять Stop Loss в указанной позиции и т.д.

3. Модули обработки событий

Несколько этих функций есть уже высокоуровневой надстройкой над первыми двумя группами. Как уже говорилось выше – это имеется те готовые блоки, из которых планирует ваш специалист. В неспециализированном-то, как раз они попадают в функции-обработчики событий MQL-программы OnStart(). OnTick(). OnTimer().

OnTrade(). OnChartEvent(). Эта несколько немногочисленна, и содержимое данных модулей может корректироваться от задачи к задаче.

Но принципиально ничего не изменяется.

В модулях все должно быть организовано абстрактно (делаем второй принцип проектирования) чтобы одинаковый модуль возможно было вызывать как для приобретений, так и для продаж. Это достигается, само собой разумеется, при помощи макросов.

Итак, приступим к реализации

1. Инициализация, деинициализация

Это минимальный требуемый комплект параметров для работы функций специалиста.

Два параметра m_smb и m_tf намерено вынесены в особенности специалиста чтобы без особенного труда показывать специалисту, на какой валюте и на каком периоде трудиться. К примеру, в случае если присвоить m_smb=USDJPY, то специалист будет трудиться на этом знаке, независимо от того, на каком он запущен. В случае если присвоить tf=PERIOD_H1, то все анализ и сигналы индикаторов будут происходить на часовом графике.

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

деструктор и Конструктор в базисном классе ничем не занимаются.

Способ Init() проводит начальную инициализацию параметров специалиста по знаку, таймфрейму и магику.

2. Функции получения сигналов

Эти функции занимаются анализом индикаторов и рынка.

Первые две функции имеют в полной мере конкретную реализацию и их возможно применять в предстоящих потомках данного класса.

Вторые две постоянно зависят от тех индикаторов, каковые вы используете. Задать эти функции на все случаи легко нереально.

Основное – необходимо понимать, что сигнальные функции CheckSignal() и CheckFilter() смогут разбирать любые их комбинации и индикаторы! Другими словами, торговые модули, в каковые потом попадут эти сигналы, являются свободными от самих источников.

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

3. Сервисные функции

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

4. Торговые модули

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

Более конкретные реализации этих функций разглядим в примерах ниже.

Добавление новых функций не будет составлять особенного труда, за счет того, что изначально правильно выбран подход и составлена структура специалиста. Если вы станете пользоваться как раз таковой схемой, то ваши разработки будут сводиться к минимальным затратам сил и времени, код будет легко читаемым кроме того через год.

Конечно же, ваши специалисты не ограничиваются лишь ими. В классе CExpertAdvisor заявлены лишь самые нужные способы. Вы имеете возможность додавать новые обработчики в классах-потомках. поменять существующие, расширять собственные модули, создавая собственную единую библиотеку.

При наличии таковой библиотеки разработка специалиста «под ключ» занимает по времени от получаса до двух дней.

4. Примеры применения класса CExpertAdvisor

4.1. Пример работы на базе сигналов индикатора

В качестве первого примера начнем, пожалуй, с самой несложной задачи — разглядим советник MovingAverage (базисный пример из MetaTrader 5) с применением класса CExpertAdvisor, лишь мало усложним его по функциональности.

Метод:

а) Условие открытия позиции

  • В случае если цена пересекает МА снизу вверх, то открываем позицию на приобретение;
  • В случае если цена пересекает МА сверху вниз, то открываем позицию на продажу;
  • Устанавливаем Stop Loss SL, TakeProfit TP;
  • Лот позиции высчитывается по параметру Risk – какое количество утратим от депозита при срабатывании Stop Loss.

б) Условие закрытия позиции

  • В случае если цена пересекает МА снизу вверх, то закрываем позицию на продажу;
  • В случае если цена пересекает МА сверху вниз, то закрываем позицию на приобретение.

в) Ограничение работы

  • Ограничиваем работу специалиста по времени с HourStart до HourEnd каждый день;
  • Специалист проводит торговые операции лишь при появлении нового бара.

г) Сопровождение позиции

  • Используем несложной трейлинг-стоп на расстоянии TS.

Для работы специалиста пригодится семь функций из класса CExpertAdvisor:

  • Сигнальная функция CheckSignal();
  • Фильтр тиков CheckNewBar();
  • Фильтр времени CheckTime();
  • Сервисная функция открытия позиций DealOpen();
  • Три рабочих модуля OpenPosition(), ClosePosition(), TrailingPosition().

Функцию CheckSignal() и модули нужно выяснить в классе потомке для ответа конкретно его задачи. Кроме этого нужно добавить инициализацию индикатора.

//| Moving Averages.mq5 |

//| Copyright 2010, MetaQuotes Software Corp. |

//| http://www.mql5.com |

#property copyright Copyright 2010, MetaQuotes Software Corp.

#property link http://www.mql5.com

#property version 1.00

#include ExpertAdvisor.mqh

Источник: vova-forex.narod.ru

Создать советник форекс за 5 минут без знания программирования

Важное на сайте:

Самые интересные результаты статей, подобранные именно по Вашим интересам:

  • Кто нуждается в советнике

    Этот советник сооружает собственную работу на RSI + MA, специалист запланирован на маленькие time-frame’ы. Советник Форекс FreeMan был создан для m5,…

  • Установка и настройка советника

    Я покажу на примерах, как настроить советника и платформу для работы. Как пример я забрал терминал от дилингового центра Forex4you . Если Вы…

  • Заработок на форексе с помощью советника

    Всем привет. В этом посте я поведаю собственный опыт применения советника форекс для дохода . Покажу, что я делал, как настраивал и какие конкретно…

  • Советники форекс/forex

    Принцип работы советников форекс для терминала трейдера Metatrader 4. Создание советников. Советник ((Expert Advisor) — это запрограммированный на языке…

  • Как установить советник в метатрейдер 4

    Включить советники Эта опция разрешает дать или запретить применение всех советников. Если она отключена, с приходом нового тика для всех специалистов…

  • Как написать советник форекс — пошаговая инструкция

    Для тех кто в далеком прошлом желал написать советник форекс но не знал как это сделать. сейчас хороший сутки. Так как прочтя эту статью, Вы узна е т е…