В статье рассматривается сопровождение открытых позиций отложенными приказами в OsEngine: выставление стопов и профитов через интерфейс, программный интерфейс для роботов, различия внутренних и серверных стоп-ордеров и особенности тестирования.
Для ограничения убытка при движении цены против позиции Long на неё выставляется стоп-ордер, закрывающий позицию при достижении заданного уровня.
Нажмите ПКМ на позицию и в контекстном меню выберите «Закрыть выбранную»:
Откроется окно закрытия позиции по стопу:
1) Цена активации стоп-ордера — уровень, при достижении которого позиция будет закрыта.
2) Цена ордера, который будет выставлен для закрытия позиции. Рекомендуется закладывать запас на проскальзывание, чтобы ордер гарантированно исполнился.
3) Объем позиции, который будет закрыт.
4) Чекбокс «Серверный стоп ордер» — если включен, стоп-ордер сразу уходит на биржу.
Уровень стопа отображается на графике и в таблице позиций:
При достижении ценой уровня активации на рынок отправляется ордер на продажу по указанной цене, и позиция закрывается.
Для фиксации прибыли на позицию Long выставляется профит-ордер, закрывающий позицию при достижении целевого уровня.
Нажмите ПКМ на позицию и в контекстном меню выберите «Закрыть выбранную»:
Откроется окно закрытия позиции по профиту:

1. Цена активации — целевой уровень фиксации прибыли.
2. Цена ордера, который будет выставлен после активации. Указывается чуть ниже цены активации, чтобы ордер гарантированно исполнился.
Уровень профита отображается на графике. При достижении ценой уровня активации на рынок отправляется ордер на продажу, и позиция закрывается:

Для позиции Short используется то же окно, цены выставляются зеркально:
• Стоп для позиции Short: цена активации выше рынка, ордер на покупку выставляется выше цены активации — чтобы гарантировать исполнение.
• Профит для позиции Short: цена активации ниже рынка, ордер на покупку выставляется чуть выше цены активации.
OsEngine поддерживает два вида стоп-приказов для открытых позиций — внутренние и серверные:
• Внутренний стоп-приказ хранится внутри OsEngine. Движок отслеживает цену последней сделки и отправляет ордер на рынок только после достижения цены активации. До этого момента на бирже ордера нет.
• Серверный стоп-приказ сразу уходит на биржу и хранится там. За ценой активации следит биржа и порождает заявку при касании уровня — в том числе когда OsEngine выключен.
Некоторые биржи поддерживают стоп-ордера. В окне закрытия позиции для них предназначен чекбокс «Серверный стоп ордер»:
Если подключённый сервер не поддерживает серверные стопы, чекбокс неактивен, а методы *OnServer в коде роботов автоматически откатываются на внутренние стопы.
Внутренние стопы и профиты выставляются методами CloseAtStop / CloseAtProfit / CloseAtTrailingStop. Пример — встроенный робот PriceChannelBreak: подписка на событие открытия позиции, раздельная логика для BUY и SELL, выставление заявок с проскальзыванием в шагах цены инструмента.
Серверные стопы для позиции выставляются методами:
• CloseAtStopOnServer(position, priceActivation, priceOrder) — серверный стоп-лимит на закрытие;
• CloseAtStopMarketOnServer(position, priceActivation) — серверный стоп-маркет на закрытие;
• CloseAtStopOnServerCancel(position) — отзыв серверных стопов позиции.
Пример вызова:
_tab.CloseAtStopOnServer(pos, priceActivation, priceOrder);
Готовый пример робота — 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