В статье рассматривается механика открытия позиций отложенными стоп-приказами в OsEngine: работа через интерфейс, различия внутренних и серверных стоп-ордеров, программный интерфейс для роботов и особенности тестирования.
Отложенный стоп-ордер открывает позицию при достижении ценой заданного уровня. Типовой сценарий — вход в Long (Short) при пробое уровня сопротивления: позиция открывается автоматически, без присутствия у терминала.
Для выставления ордера откройте панель робота, перейдите во вкладку стакана и нажмите кнопку «Больше>>»:


Поля окна (нумерация соответствует скриншоту):
1) Цена активации стоп-ордера (в примере — 274,45).
2) Объём открываемой позиции.
3) Тип активации — HigherOrEqual (цена выше или равна уровню) или LowerOrEqual (цена ниже или равна уровню). Для входа в Long на пробое вверх выбираем HigherOrEqual.
4) Тип жизни заявки — CandlesCount (заявка живёт заданное число свечей) или NoLifeTime (заявка без ограничения по времени).
5) Время жизни заявки в свечах — заполняется при выбранном типе CandlesCount.
6) Чекбокс «Серверный стоп ордер» — если включен, стоп-ордер сразу уходит на биржу (подробности — в разделе 2). Также, при включенном чекбоксе недоступны поля «Тип активации», «Тип жизни заявки» и «Время жизни свечей».
Выставленный ордер отображается в таблице активных ордеров и на графике:

Для отмены ордера нажмите ПКМ на строке в таблице стоп-лимитов и выберите отмену:

OsEngine поддерживает два вида стоп-приказов — внутренние и серверные:
• Внутренний стоп-приказ хранится внутри OsEngine. Движок отслеживает цену последней сделки и отправляет ордер на рынок только после достижения цены активации. До этого момента на бирже ордера нет.
• Серверный стоп-приказ сразу уходит на биржу и хранится там. За ценой активации следит биржа и порождает заявку при касании уровня — в том числе когда OsEngine выключен.
Для серверных стопов в окнах открытия, закрытия и доливки позиции предназначен чекбокс «Серверный стоп ордер» (поле 6 на скриншоте из раздела 1):
Если подключённый сервер не поддерживает серверные стопы, чекбокс неактивен, а методы *OnServer в коде роботов автоматически откатываются на внутренние стопы. Это позволяет писать робота один раз — без ветвления под конкретный сервер.
При активации серверного стоп-ордера он получает статус Cancel, при этом с сервера приходит дочерняя заявка Limit или Market.
Внутренние стоп-приказы на открытие позиции выставляются методами BuyAtStop / SellAtStop. Пример использования — встроенный робот PriceChannelVolatility.cs.
Серверные стоп-приказы выставляются методами семейства *OnServer:
• BuyAtStopOnServer / SellAtStopOnServer — серверный стоп-лимит (stop-limit);
• BuyAtStopMarketOnServer / SellAtStopMarketOnServer — серверный стоп-маркет (stop-market);
• BuyAtStopOnServerToPosition / SellAtStopOnServerToPosition и их StopMarket-варианты — доливка к открытой позиции.
Пример вызова:
_tab.BuyAtStopOnServer(volume, priceLimit, priceActivation);
Готовый пример робота на серверных стопах — ServerStopOrdersSample (папка Robots/TechSamples). Робот выставляет серверный стоп-лимит на покупку выше лучшего аска, ожидает активации заданное количество свечей и перевыставляет ордер по актуальной цене, если активация не произошла. После активации стопа робот контролирует исполнение порождённой биржей лимитной заявки.
• Активированный биржей стоп-ордер получает статус Cancel — это штатное поведение: биржа завершает жизнь стопа, порождая дочернюю заявку. Исполнение приходит на дочернем ордере (Limit для stop-limit, Market для stop-market).
• Дочерняя заявка автоматически привязывается к позиции в журнале робота.
• После перезапуска или переподключения активные стоп-ордера автоматически запрашиваются с сервера и восстанавливаются в журнале.
• Цена выставленного серверного стопа не редактируется: для изменения уровня ордер снимается и выставляется заново. Трейлинг серверным стопом реализуется парой операций «отмена + новый ордер».
В тестере и оптимизаторе проскальзывание для стоп-приказов не учитывается: ордера исполняются строго по цене активации.
Исполнение по касанию с последующей активацией ордера по другой цене позволяло «рисовать» прибыль в тестере, поэтому такое поведение было исключено: при одинаковых значениях в графах «цена активации» и «цена ордера» — это штатная ситуация.
Методы *OnServer в тестере и оптимизаторе работают как внутренние стопы.
Удачных алгоритмов!
Комментарии открыты для друзей!
Скачать OsEngine: https://github.com/AlexWan/OsEngine
Официальная поддержка OsEngine в MAX:https://max
Канал Научный трейдинг в MAX:https://max.ru/
Поддержка OsEngine в Телеграм:https://t.me/osengine_official_support
Канал Научный трейдинг (Bad Quant) в Телеграм:https://t.me/bad_quant