Найти в Дзене
Трейдинг и Роботы

#14 Эмма: Как выглядит разработка робота изнутри

Оглавление

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

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

Почему обычно процесс разработки (в этом блоге) остается за кадром

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

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

Для разработки лучше подходит формат видео. Например, для Эммы я делал видео, в котором торговую идею превратил в робота. Но для доработки, обычно, приходится копаться в коде — это будет скучное и очень долгое видео :)

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

Эмма 5: Реализация исправления

Напоминаю (себе) решение, которое надо реализовать, на конкретном примере:

скрин с проблемной ситуацией
скрин с проблемной ситуацией

Решение: Когда открывается вторая однонаправленная позиция подряд нужно избавиться от флет-хеджа, закрыв обратную позицию (которая ждала безубытка).

Что происходит в голове разработчика

Нужно отследить момент открытия второй однонаправленной позиции:

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

В визуальном представлении алгоритма это выглядит так:

визуализация архитектуры куска робота, где обрабатываются позиции
визуализация архитектуры куска робота, где обрабатываются позиции

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

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

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

  • если покупка — произошло закрытие продажи;
  • если продажа — последней позицией была покупка;

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

Примечание: или придется вызывать эту процедуру, когда поступает сигнал на открытие очередной позиции

или можно привязать все к функции TradeEvent, тогда будет достаточно отследить событие публикации нового ордера — этот вариант проще.

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

проблема
проблема

Видимо возникает какой-то конфликт процедур, надо искать...

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

делаешь функцию проверки, но она настолько сложная, что делаешь еще одну функцию для проверки проверки
делаешь функцию проверки, но она настолько сложная, что делаешь еще одну функцию для проверки проверки

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

визуализация нового вызова
визуализация нового вызова

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

Добавлю пересчет открытых позиций в свою новую функцию:

так выглядит планируемо «небольшая функция»
так выглядит планируемо «небольшая функция»

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

То есть, пока она никак не отличается от воторой, по мнению робота. Обойтись условием, «если есть противоположная у которой тейк = открытию» не достаточно.

Придется все-таки считывать закрытые позиции и вернуться к изначальной схеме:

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

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

обработка события растет
обработка события растет

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

Почитал документацию, поспрашивал в гугле, но решение найти не удалось.

Итоги

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

визуализация архитектуры Эммы 5
визуализация архитектуры Эммы 5

По сути, это была уже третья вариация алгоритма робота (версия 2 в 3, версия 2 в 4, и теперь версия 2 в 5), но ни одна из них не привела к удовлетворительному результату.

Исходный код:

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

1039 строк кода только в 5 версии
1039 строк кода только в 5 версии

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

Кстати, Марк на реальном счете уже больше недели приносит прибыль.

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