Хотя текстовый формат не располагает, сегодня я покажу как происходит разработка (некоторых частей) робота изнутри — буду описывать процесс, разбавляя м̶е̶м̶а̶м̶и̶, скриншотами и комментариями.
В прошлый раз я доработал торговый алгоритм Эммы 5 в теории — нашел способ устранения важной логической ошибки — но не приступил к практике, в этот раз продолжаю.
Почему обычно процесс разработки (в этом блоге) остается за кадром
Я часто просто опускаю технические нюансы разработки робота, все обсуждение в основном крутится на торговых идеях и алгоритмах, и на то есть 2 причины.
Первая заключается в том, что попросту неудобно показывать разработку, кому интересно будет смотреть на процесс формирования алгоритма или написания кода? Вторая — неудобство.
Для разработки лучше подходит формат видео. Например, для Эммы я делал видео, в котором торговую идею превратил в робота. Но для доработки, обычно, приходится копаться в коде — это будет скучное и очень долгое видео :)
Но в этот раз я попробую не только писать об алгоритме, но и описывать сам процесс разработки (в общих чертах, конечно).
Эмма 5: Реализация исправления
Напоминаю (себе) решение, которое надо реализовать, на конкретном примере:
Решение: Когда открывается вторая однонаправленная позиция подряд нужно избавиться от флет-хеджа, закрыв обратную позицию (которая ждала безубытка).
Что происходит в голове разработчика
Нужно отследить момент открытия второй однонаправленной позиции:
В основном алгоритме у меня есть петля для обработки обратной позиции при возникновении сигнала на продажу/покупку.
В визуальном представлении алгоритма это выглядит так:
То есть у меня уже есть выход для обработки события, когда возникает новая противонаправленная позиция, и у нее тейк = цене открытия.
Это, конечно, немного проще, но я подумаю над отдельной процедурой обработки, не хочу влезать в работающую и проверенную часть робота.
В отдельно процедуре можно прочитать все закрытые ордера, и запомнить, какой ордер был последним (ближе к текущей дате)
- если покупка — произошло закрытие продажи;
- если продажа — последней позицией была покупка;
если (сейчас получили сигнал на открытие позиции) и (последняя позиция была такая же по типу) и (есть открытая противоположная позиция), то закрыть противоположную позицию
Примечание: или придется вызывать эту процедуру, когда поступает сигнал на открытие очередной позиции
или можно привязать все к функции TradeEvent, тогда будет достаточно отследить событие публикации нового ордера — этот вариант проще.
Возникает ошибка. Вместо того, чтобы при возникновении первой обратной позиции выставился безубыток и создался флет-хедж, эта позиция просто застряла.
Видимо возникает какой-то конфликт процедур, надо искать...
Нет, это была ошибка в коде, при проверке открытия позиции вместо знака > в одном месте стояло <, получился круг в полчаса на исправление.
Эту проблему я исправил, и робот даже завел новый алгоритм закрытия хедж-позиции, но где-то я снова просчитался:
И так, у меня слишком рано закрывается хедж-флет — вместо того, чтобы хедж-позиция оставалась открытой до открытия второй противонаправленной подряд, она захлопывается с первой.
Добавлю пересчет открытых позиций в свою новую функцию:
Добавил, протестил, но это не решило проблему закрытия с первой позицией. Вместо этого, пока я добавлял пересчет открытых ордеров я перепроверил условия закрытия и понял, что условие выполняется и с первой позицией.
То есть, пока она никак не отличается от воторой, по мнению робота. Обойтись условием, «если есть противоположная у которой тейк = открытию» не достаточно.
Придется все-таки считывать закрытые позиции и вернуться к изначальной схеме:
В отдельно процедуре можно прочитать все закрытые ордера, и запомнить, какой ордер был последним (ближе к текущей дате)
если покупка — произошло закрытие продажи;
если продажа — последней позицией была покупка;
если (сейчас получили сигнал на открытие позиции) и (последняя позиция была такая же по типу) и (есть открытая противоположная позиция), то закрыть противоположную позицию.
С реализацией считывания отдельных ордеров возникли проблемы:
Несмотря на попытку считать исторические ордера разными способами, то ли из-за особенностей среды, то ли из-за запуска в тестере, не могу получить данные с предыдущего закрытого ордера.
Почитал документацию, поспрашивал в гугле, но решение найти не удалось.
Итоги
Когда обработка отдельного события стала равна по объему размеру самого робота я понял, что этот путь не верный.
По сути, это была уже третья вариация алгоритма робота (версия 2 в 3, версия 2 в 4, и теперь версия 2 в 5), но ни одна из них не привела к удовлетворительному результату.
Исходный код:
Есть, конечно, версии, которые трейдили в плюс, но в них имелись логические ошибки, некоторые версии зашли в технические тупики, но написание слишком затянулось, 2 недели (по несколько часов в день).
Создавая эту серию роботов я понял, что стоит подробно описывать торговую идею в начале, потом снимать видос, как я реализую базовую версию робота, доработку и оптимизацию вести отдельными статьями, а тестировать в режиме реального времени в закрытом режиме.
Кстати, Марк на реальном счете уже больше недели приносит прибыль.
В процессе у меня появилась пара новых торговых идей и это самое ценное, что получилось из реализации Эммы. Пора двигаться дальше.