Ситуация простая - хочу купить/продать по рынку и прикрыть позицию стопом. Для примера использую акции сбера.
Вариант №1Покупаю по рынку обычным способом (с помощью маркет-заявки или лимитной заявки с большим отступом по цене), все ок. Тут же подписываюсь на событие исполнения заявки. Хочу получать событие один единственный раз, когда заявка исполнилась полностью.
Код
this.When(this.mainOrder.Matched().Do(OnMainOrderMatched).Once());
Все хорошо, заявка попала в систему, исполнилась, попадаем в OnMainOrderMatched. Здесь я хочу получить среднюю цену исполнения заявки, чтобы от этого уровня поставить стоп-лосс.
Код
decimal averagePrice = this.mainOrder.GetAveragePrice();
К сожалению, averagePrice остается всегда равной нулю. В КВИКе аналогичный подход дает правильный результат, averagePrice равен цене исполнения заявки.
Ок, раз так не получается, можно проверить, когда заявка исполнилась и все ее поля стали заполнены. Подписываюсь на правило, отслеживающее появление новых сделок по заявке
Код
this.When(mainOrder.NewTrades()).Do(OnNewOrderTrades).Once();
далее в OnNewOrderTrades
Код
if ((this.mainOrder != null) && (this.mainOrder.Id == myTrades.Last().Order.Id))
{
OnMainOrderMatched();
}
Тогда в OnMainOrderMatched уже имеем averagePrice соответствующую действительности.
Но данный подход меня смущает тем, что ловить событие Once не правильно, поскольку заявка может исполниться частями. А Periodical - тогда надо городить сложную логику для стопов с учетом исполнения заявки по частям.
Переходим к
Варианту №2Благодаря разработчикам S# существует более простой способ выставления заявок и прикрытия их стопами, через котирование и дочерние стратегии. Но сразу же наталкиваюсь на проблему с выставлением рыночной заявки через котирование - у заявки отбрасывается дробная часть и заявка появляется в системе по 101.00 или по 102.00, хотя реальная цена колеблется в этом промежутке с сотыми долями.
Это происходит и у меня, и в проекте-примере.
Возникает вопрос - кто как справляется с данной задачей в СмартКОМе?