Как построить советник, работающий автоматически (Часть 01): Концепции и структуры

Daniel Jose | 25 января, 2023

Введение

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

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

В связи с этим у меня появилась идея объяснить эти моменты, чтобы каждый мог их понять и даже поспорить на эту тему. Шаг за шагом я буду показывать вам, как вы, любитель или даже новичок в данной теме, можете запрограммировать советника для автоматической торговли с нуля простым, но безопасным способом, в основном используя только и исключительно нативный MQL5, никаких чудо-решений или чего-то подобного.

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

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


Как подразделяется автоматический советник? Как он работает на самом деле?

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

Перед тем, как начать объяснение, необходимо понять изображенное на рисунке 01, который представлен ниже:

Рисунок 1

Рисунок 01 - Схематическая диаграмма функционирования автоматического советника.


Данное изображение показывает в очень простой и обобщенной форме, как на самом деле работает автоматический советник. Обратите внимание, что в советнике у нас есть 2 внутренние структуры: система ордеров, которая всегда будет идентичной для каждого советника, и вторая структура, триггерная система, которая отвечает за то, чтобы советник действительно работал автоматически.

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

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


Как создавать систему ордеров?

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

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

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

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

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

Данные проверки должны проводиться в течение длительного периода времени на демо-счете, где нет риска потерь или прибыли, зато жизненно важно, чтобы эти тесты проводились как можно интенсивнее.

Пробуйте ВСЁ и абсолютно ВСЁ, пока система ордеров не окажется такой, какой вы её себе представляете - надежной, удобной и простой в использовании, не только для советника, но и для ВАС. Не переходите на следующую ступень, останьтесь пока на этом этапе, чтобы скорректировать и протестировать систему ордеров. И опять же, если вы не знаете как создавать хотя бы элементарную систему ордеров, прочитайте серию статей, которую я вам показал в начале этой темы: изучайте приведенные там коды, разбирайтесь в том, как работает каждый из этих пунктов, и поймите, что нужно изменить или настроить, чтобы вам было удобно сделать систему автоматизированной.

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

Теперь, когда у вас есть настроенная и работающая система ордеров, которая функционирует в соответствии с вашими желаниями и ожиданиями, мы можем перейти к следующему шагу. Он довольно прост, но при работе над ним следует все-таки быть осторожным. Я имею в виду триггерную систему.


Разберем, что такое триггерная система

Триггерная система — это та часть, которую многим людям, не имеющим никаких знаний в области программирования или математики, предлагается изучить и следовать, чтобы попытаться заработать деньги. Она работает при подключении к системе ордеров и создает "магию" человекоподобного советника, который может работать без остановки, 24 часа в сутки, 7 дней в неделю, 52 недели в году без усталости и стресса, без страха войти или выйти из операции.

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

К сожалению, сегодня на рынке существует много разновидностей алгоритмов, которые более эффективны, чем тот, который Ларри Уильямс использовал для зарабатывания денег и признания. Но это не означает, что триггерная система которую он использовал, утратила свою жизнеспособность. Напротив, она по-прежнему очень прибыльна, и при соответствующем контроле за рисками, можно получить значительную прибыль с помощью этого же алгоритма. Помните, что триггерная система должна быть простой, чтобы советник мог ею пользоваться и чтобы вы могли правильно её протестировать.

Нет смысла создавать триггерную систему или конфигурацию со сложными правилами и причудливым анализом, если вы не можете перевести это в простую, программируемую математическую формулу. Поэтому забудьте о таких идеях, как изучение индикатора Z относительно актива X для торговли активом Y в момент времени K, отслеживание уровня агрессии P, анализ стакана цен и поиск проявления намерения W для принятия решения о покупке или продаже. Забудьте об этом. Это не сработает, или, по крайней мере, сделает алгоритм настолько сложным, что вы не сможете эффективно проводить его тестирование.

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

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

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

Еще одна важная вещь относительно триггерной системы, которую стоит упомянуть - это важность обучения. Вы скорее всего слышали о крахе 1987 года, также известном как "черный понедельник"?

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

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

Хорошо, теперь, когда я рассказал вам о возможных рисках и показал, как и что нужно делать для создания автоматического советника, давайте перейдем к самому интересному: КОД.


Начальное планирование

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

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

Для программирования, особенно на таком языке, как MQL5 (который очень похож на C и C++), вам не нужно много знаний. По сути, вам нужно знать только 4 основные вещи и обладать 2 основными качествами. Вот 4 вещи, которые вы должны знать:

  • Нет такой программы, которую нельзя было бы выполнить с помощью простых команд, поэтому вы должны изучать и осваивать простые команды, прежде чем использовать более сложные.
  • Учитесь правильно использовать следующие команды: IF, FOR и основные операторы: равенство (=), сложение (+), вычитание (-), деление (/), умножение (*) и модуль (%).
  • Понять разницу между работой с битами и байтами, а также то, что делают булевы операторы, такие как Not (!), Or (|), And (&) и Xor (^).
  • Понять разницу между функцией и процедурой, глобальной и локальной переменной, обработкой событий и процедурным вызовом.

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

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

Исходя из этого, вы, конечно, со временем станете отличным программистом, но этому нужно посвятить себя и необходимо учиться. Не ждите, пока кто-то просто скажет вам, как что-то сделать, всегда стремитесь к самообучению, потому что со временем всё станет для вас более понятным. И главное:

Будьте скромны, вы не знаете всего и никогда не будете. Примите что всегда будет кто-то, кто знает больше вас.

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


Начало планирования

Теперь мы начнем программировать по-настоящему! Не так ли? Нет. Пока нет. Успокойтесь. Сначала откройте редактор кода (MetaEditor). Первое, что вам нужно сделать - это создать советника с нуля. Важно начинать с чистого кода, не копируя чужой код и не скачивая его из неизвестных источников, без понимания того, что это за коды. Давайте начнем с нуля и напишем оригинальный код.

Для тех, кто не знает, как это сделать: после открытия MetaEditor, в левом углу вы увидите окно под названием «браузер», там у вас будет структура каталогов и все они будут начинаться с MQL5. Надо понимать это окно как проводник файлов, так будет легче следовать объяснениям.

В этом же окне находится папка под названием Experts. Здесь мы будем размещать коды для каждого создаваемого нами советника. Есть и другие папки, каждая из которых имеет свое назначение, но пока мы сосредоточимся только на папке Experts. Кликнув на эту папку, мы откроем её и увидим присутствующие там коды. Скорее всего они организованы в соответствии с другими папками, каждая из которых представляет собой отдельного советника. Вам стоит привыкнуть к этой структуре - важно придерживаться определенной организации, иначе вы полностью заблудитесь среди всех присутствующих там файлов и не сможете найти свой, когда он вам понадобится.

Затем выполним первые шаги, они несложные, просто следуйте последовательности изображений, показанных ниже:

Рисунок 1

Рисунок 02 - Выбираем, что создавать

Рисунок 03

Рисунок 03 - Указываем каталог, в котором будет находиться наш код

Рисунок 04

Рисунок 04 - Даем имя нашему советнику (расширение указывать не обязательно).

Рисунок 05

Рисунок 05 - Нажимаем кнопку Далее

Рисунок 06

Рисунок 06 - Нажимаем Готово


Совершив эти шаги между рисунком 02 и рисунком 06, редактор MetaEditor создаст для нас абсолютно чистый и безопасный код. Вы должны увидеть что-то вроде того, что показано ниже:

#property copyright "Daniel Jose"
#property link      "https://www.mql5.com/pt/articles/11216"
#property version   "1.00"
//+------------------------------------------------------------------+
int OnInit()
{
        return INIT_SUCCEEDED;
}
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
//+------------------------------------------------------------------+
void OnTick()
{
}
//+------------------------------------------------------------------+

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

Как видите, MetaEditor создал 3 процедуры - это OnInit, OnDeInit и OnTick. Эти процедуры фактически являются функциями управления событиями. Да, верно, в MQL5 мы программируем не так, как в других языках. MQL5 - язык событийно-ориентированный в отличие от других языков, где мы работаем процедурно. Поначалу событийно-ориентированные языки могут казаться запутанными, но со временем вы поймете, как с ними работать.

В этом случае, не вдаваясь в излишние подробности, вы будете работать следующим образом: Платформа MetaTrader 5 генерирует событие, а вы реагируете на это событие, т.е. когда вы установили советника на график, MetaTrader 5 запускает событие Init, которое заставит платформу искать функцию OnInit в своем коде, чтобы советник (в данном случае) был загружен и запущен. Как только это будет сделано, данная функция больше не будет вызываться. Это в общих чертах, поскольку функция всё-таки будет вызываться каждый раз, когда платформа MetaTrader 5 будет ставить советника на график, запомните этот факт.

Здесь у нас также есть функция OnDeInit, она будет вызвана платформой MetaTrader 5, когда сгенерируется событие DeInit, которое указывает всем элементам (советникам или индикаторам), что произошло что-то и они будут удалены с графика, временно или навсегда. Для того, чтобы узнать причину удаления программы, нам нужно просто посмотреть на значение причины, которое сообщает платформа MetaTrader 5.

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

Функция OnTick очень важна для нашей системы, но она также может быть слабым местом многих советников. Это связано с тем, что многие программисты из-за отсутствия опыта или небрежности помещают весь код внутрь этой функции, что может перегрузить её и сделать советник менее стабильным и более склонным к сбоям и критическим ошибкам. Одной из наиболее трудно устранимых ошибок является ошибка по RUN TIME, которая может быть вызвана сложными и трудно воспроизводимыми взаимодействиями. Но об этом будет более подробно рассказано в одной из следующих статей.

Чтобы избежать этих проблем, платформа MetaTrader 5 и её язык программирования MQL5 предлагают другие способы работы с функциями, которые обеспечивают минимальный уровень безопасности и надежности. Кроме того, существуют и другие типы событий, которыми можно воспользоваться для повышения общей производительности системы. Мы это обсудим позже, поскольку я не хочу запутать тех, кто видит это впервые и не был в курсе, что в MQL5 мы работаем с событиями, запускаемыми платформой MetaTrader 5, вместо того, чтобы создавать процедурный код, где есть точка входа и точка выхода, и всё, что происходит между этими двумя точками, должно управляться и обрабатываться программой и программистом.

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

Чтобы научиться читать документацию и проявлять интерес к тому, что она объясняет, давайте посмотрим, что в ней говорится о событиях, которые могут быть сгенерированы, особенно о трех событиях, которые автоматически создаются редактором MetaEditor, когда мы начинаем строить советника: OnInit, OnDeInit и OnTick. Не забудьте также взглянуть на директиву компиляции property.

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

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