Рассмотрим пример того, как выходить из позиции двумя (вообще можно больше, но в примере 2) лимитными ордерами одновременно.
Это стало возможно совсем недавно, т.к. камрады из сообщества очень просили. Метод, которым будем пользоваться для закрытия позиций, называется CloseAtLimitUnsafe. Отличие от CloseAtLimit такое:
- Старый CloseAtLimit, когда Вы его вызываете, отзывает все другие ордера на закрытие позиции.
- CloseAtLimitUnsafe никакие заявки не отзывает. Просто выставляет в рынок очередной ордер, не обращая внимания на предыдущие. Т.ч. надо быть аккуратными при его использовании.
Точка входа у робота контртредовая на канале Envelops.
Итоговая логика робота на графике выглядит так:
Шорт, прикрытый стоп ордером, и два лимитных ордера на бирже для закрытия в прибыль.
1. Открываем робот-пример. UnsafeLimitsClosingSample.
На ГитХаб в репозитории OsEngine это находится здесь:
https://github.com/AlexWan/OsEngine/blob/master/project/OsEngine/Robots/PositionsMicromanagement/UnsafeLimitsClosingSample.cs
Внутри проекта здесь:
2. Конструктор и сервисный код.
- Поле для хранения источника BotTabSimple. В это поле потом мы положим объект источника и сможем обращаться к нему из любой части робота. Так удобнее.
- Поле для хранения индикатора.
- Параметры. Чуть позже поговорим про каждый.
- Создание источника BotTabSimple.
- Создание параметров.
- Создание индикатора Envolops. Установка его длины и отклонения из параметров.
- Подписка на событие CandleFinishedEvent (завершение свечи). В обработчике этого события будет вся торговая логика.
- Подписка на событие изменение параметров. В этом обработчике мы будем устанавливать индикатору новое значение длины.
- Отключаем автоматическое сопровождение позиции.
Настройки такие:
За что отвечают параметры:
1. Regime – режим работы.- Off – Выключен.
- On – включено без ограничений.
- OnlyLong – открытие только длинных позиций.
- OnlyShort – открытие только коротких позиций.
- OnlyClosePosition – доступно только закрытие позиций.
2. Volume type – режим выбора объёма.- Contracts – кол-во контрактов инструмента.
- Contract currency – валюта контракта.
- Deposit percent – процент от депозита.
3. Volume – значение объёма. Что именно, зависит от предыдущего пункта. В случае Contracts тут указывается объём инструмента. В случае Contract currency здесь указывается кол-во рублей или долларов, которыми нужно войти. В случае с Deposit percent здесь указывается % от общего депозита, которым нужно войти в контракт.
4. Asset in portfolio – тут нужно указывать название валюты, которое будет использовано для расчёта объёма, если Вы выбрали тип объёма “Deposit percent”. В тестере оставляем «Prime». На крипте это обычно “USDT”.
5. Envelops length – длина индикатора Envelops.
6. Envelops deviation – отклонение индикатора Envelops.
7. Stop percent – движение от входа до выхода в % для установки стоп-приказа.
8. Profit limit one percent – расстояние, на котором будет выставлен первый лимитный ордер на закрытие позиции.
9. Profit limit two percent – расстояние, на котором будет выставлен второй лимитный ордер на закрытие позиции.
3. Вход в логику в событии завершения свечи.
- Если режим робота Off, выходим из метода.
- Если данных по индикатору нет, выходим из метода.
- Если данных в индикаторе меньше, чем его длина расчёта, выходим из метода.
- Берём все позиции у источника.
- Если позиций нет, но режим не позволяет открывать новые позиции, выходим из метода.
- Если позиций нет, и режим позволяет, идём в метод открытия позиции.
- Если позиции есть, идём в метод закрытия позиций.
4. Логика открытия позиций.
- Берём значения индикатора и последней цены по свечам.
- Если вдруг значения индикаторов почему-то равны нулю, выходим из логики.
- Если цена выше канала, продаём.
- Если цена ниже канала, покупаем.
5. Логика закрытия позиций.
- Если ранее был активирован стоп приказ, или позиция ещё открывается, выходим из метода.
- Если по позиции нет закрывающих ордеров, заходим в эту ветку кода.
- Рассчитываем цену для ордеров на закрытие.
- Считаем кол-во исполненных ордеров, чтобы не выставить лишнего. Это нужно, т.к. на Московской бирже ордер может быть отозван после клиринга, но при этом уже какие-то раньше ордера исполнялись, и остался один ордер на закрытие.
- Если ранее по позиции не было исполненных закрывающих ордеров, выставляем два ордера на закрытие.
- В случае, если по позиции уже был исполненный лимит ордер, выставляем один.
- В логику закрытия по стоп-приказу заходим один раз, просматривая для этого цену ордера.
- Считаем цену стоп-ордера отдельно для лонгов, отдельно для шортов.
- Выставляем стоп-ордер.
6. На выходе.
Робот, торгующий контртренд от канала Envelops, прикрытый стоп ордером. И два лимитных ордера на бирже для закрытия в прибыль.
Удачных алгоритмов!
Комментарии открыты для друзей!
OsEngine: https://github.com/AlexWan/OsEngine
Поддержка OsEngine: https://t.me/osengine_official_support
Регистрируйся в АЛОР и получай бонусы: https://www.alorbroker.ru/open
Сайт АЛОР БРОКЕР: https://www.alorbroker.ru
Раздел «Для клиентов»: https://www.alorbroker.ru/openinfo/for-clients
Программа лояльности от АЛОР БРОКЕР и OsEngine: https://smart-lab.ru/company/os_engine/blog/972745.php