Как построить советник, работающий автоматически (Часть 13): Автоматизация (V)

Daniel Jose | 25 мая, 2023

Введение

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

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

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

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

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

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

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

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


Планирование автоматизации

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

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

Исходя из этого, у нас есть уже первое требование для автоматизации: знание модели. Теперь надо четко определить правила проведения сделок. Нам нужно уметь делать это четко и объективно. Никаких "если это так, то другое может быть по-другому, а продаем мы столько-то, с надеждой, что это купят". Нет, всё совсем не так. Должно быть примерно так: "если происходит такое - продаю; если происходит второе - покупаю". Будьте объективны и точны, потому что мы будем учить калькулятор без эмоций и чувств. Он не чувствует ни страха, ни раскаяния, поэтому нам самим надо обязательно быть четкими и прямыми, т.е. объективными.

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

В качестве примера мы просмотрим создание правил с использованием модели Ларри Вильямса, известной как 9-периодная экспоненциальная скользящая средняя. Существует множество вариантов этой модели, но первоначальный вариант простой. Однако не рекомендую использовать эту модель, не зная ее досконально и не понимая, как она работает. Давайте посмотрим правила планирования этой модели.

Если бар закрывается выше 9-периодной экспоненциальной скользящей средней, мы должны ПОКУПАТЬ; если закрывается ниже, то должны ПРОДАВАТЬ.

Это основное правило для программирования модели: всё четко и объективно. Если мы хотим включить трейлинг-стоп, подход должен быть таким же простым, как в этом примере:

Остановка сделки всегда будет на один тик выше минимума закрытого бара для ПОКУПКИ и на один тик ниже максимума закрытого бара для ПРОДАЖИ.

Опять же, правила простые. Вы можете следовать этому образцу, чтобы создать свои правила. Чтобы проиллюстрировать это, давайте рассмотрим другой пример с использованием индикатора RSI (или IFR). Логика применима и к другим показателям, но цель здесь - продемонстрировать правильный подход:

Если индикатор находится выше 80, тогда ждите входа в ПРОДАЖУ; как только он опускается ниже 80, то ПРОДАВАЙТЕ. Если он ниже 20, войдите в ПОКУПКУ; как только он поднимается выше 20, ПОКУПАЙТЕ.

Это правило простое и эффективное, но остается определить STOP или возможность трейлинг-стопа. Мы можем установить правило для этого с помощью другого индикатора или самого индикатора входа, при условии, что правило будет четким. Давайте установим правило, основанное на 20-периодной арифметической скользящей средней:

Будь то длинная или короткая сделка, STOP сделки устанавливается на цене 20-периодной арифметической скользящей средней.

В качестве альтернативы можно установить правило следующим образом:

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

Теперь вы видите, в чем важность объективности? Здесь нет места двусмысленности; всё должно быть четко и ясно, без выдумок и предположений.

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

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

Чтобы понять, как сделать систему адаптивной, давайте воспользуемся примером 9-периодной экспоненциальной скользящей средней. Эту иллюстрацию можно применить к любой модели, добавив правила для ее приспособления. Правило покупки будет выглядеть следующим образом:

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

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

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

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

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

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

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


Превращаем идею в код

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

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

Чтобы проверить, насколько подходит описание, заполним приведенную ниже блок-схему:

Рисунок 01

Рисунок 01 - Блок-схема реализации

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

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

Но как это возможно? Как блок-схема может быть фракталом и представлять то, как я должен что-то программировать? 😵😱 Давайте разберемся, как Рисунок 01 становится фракталом, способным построить всё, что угодно, независимо от сложности. Если его можно представить в рамках этого рисунка, то его можно построить.

Каждый процесс начинается с P1. Далее, мы принимаем решение, что является пунктом P2. Каким бы ни было решение, мы всегда будем выбирать один из путей: тот, который ведет в пункт P3, или тот, который приводит к пункту P4. Именно пункт P2 определяет то, по какому пути нужно идти.

Оба пункта P3 и P4 могут представлять изображение, подобное изображенному на Рисунке 01, где процесс повторяется, пока наконец не закончится. Однако, чтобы упростить объяснение, давайте предположим, что P3 и P4 - это какие-то простые вычисления или вызовы, которые вернутся в ближайшее время. В конце концов, оба сходятся на P5.

Здесь мы принимаем новое решение на основе того, о чем нам сообщили P3 или P4. В зависимости от того, что решит P5, мы можем либо вернуться в пункт P2, либо перейти к пункту P6. Если мы вернемся к P2, процесс повторится, создавая систему обратной связи. Если мы перейдем к P6, процесс просто завершится.

Благодаря этой динамике, выходя из P1 и прибывая в P6, мы имеем поток сообщений или поток выполнения. Такой же поток может также возникнуть в P3 и P4. Если это произойдет, фрактал возникнет в P3 или P4, но не в другом месте блок-схемы.

Возвращаясь к программированию, в MQL5 пункты P2 и P5 можно заменить такими структурами, как IF ELSE или SWITCH CASE. Таким образом, можно создать что-нибудь без знаний программирования, если только вы сможете изложить свою идею в этой блок-схеме, объяснив и описав ее должным образом.

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

Пункт P6 может быть командой RETURN или чем-то другим, что обеспечит ответ на основе значений, введенных в P1.

Что касается P3 и P4, то, как упоминалось выше, они могут быть либо еще одной блок-схемой, показывающей, как надо всё решать, либо простой факторизацией, в которой обрабатываются значения P1. Наша цель состоит в том, чтобы описать систему на Рисунке 01 так, чтобы её можно было автоматизировать.

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

Пример 01 - Покупка или продажа с использованием 9-периодной экспоненциальной скользящей средней:

Пример 02 - Трейлинг-стоп и безубыток:

Пример 03 - Работа по RSI или IFR:

Блок-схема будет аналогична Примеру 01. Давайте рассмотрим:

Теперь понятно, как это работает 😁? Если вы сможете это сделать, то вы будете на пути к созданию автоматического советника.

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

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


Как понимать автоматизацию и ее внедрение

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

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

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

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

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

Давайте посмотрим структуру системы для ручного управления, представленную на рисунке 02.

Рисунок 02

Рисунок 02 - Ручной режим работы

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

Очень важно иметь это в виду, потому что многие люди считают, что когда они работают с советником, они взаимодействуют непосредственно с ним, тогда как на самом деле взаимодействие происходит с платформой, которая передает команды советнику. Мы уже обсуждали и объясняли это в предыдущих статьях данной серии. Прежде чем автоматизировать советника, необходимо понять Рисунок 02. Хотя внешний вид может отличаться в зависимости от программиста, принцип работы всегда одинаков: прямой контакт осуществляется с платформой, а не с советником.

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

Давайте теперь подумаем, как работает система: вы, как трейдер, сообщаете платформе MetaTrader 5 о своем намерении купить или продать по определенной цене, взаимодействуя с классом C_Mouse.

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

В зависимости от упомянутых параметров заявка может быть принята или отклонена. Если она принята, соответствующий ордер отправляется в класс C_Orders, который, в свою очередь, отсылает заявку на торговый сервер. Когда сервер отвечает на заявку, на платформе MetaTrader 5 запускается новое событие, сообщающее советнику о том, что произошло на сервере через событие OnTradeTransaction.

Советник анализирует эту информацию и, в зависимости от контекста, сообщает классам C_Manager и C_Orders результат заявки трейдера. Таким образом, позиция открывается, изменяется или закрывается с помощью взаимодействия с кодом, присутствующим в советнике. Однако трейдер может использовать панель инструментов, чтобы закрыть или изменить ордер или позицию, открытую советником на сервере. Если это произойдет, платформа MetaTrader 5 сгенерирует событие с помощью OnTradeTransaction, сообщая трейдеру об изменении. Затем советник должен передать информацию классу C_Manager, если это применимо.

Понимая, как это работает, можно представить, что система автоматизации должна заменить класс C_Mouse, который инициализирует всю систему триггера. Хотя класс C_Mouse будет удален при автоматизации системы, автоматизация не произойдет именно вместо этого, поскольку C_Mouse будет продолжать взаимодействовать с советником, который будет генерировать вызовы класса C_Manager.

Класс C_Mouse мог даже установить какую-то связь между советником и классом C_Manager, но поскольку было известно, что класс C_Mouse будет удален из системы, он был разработан так, чтобы его можно было просто удалить. Автоматизация происходит на этом этапе.

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


Заключение

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

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