Ситуация простая - хочу купить/продать по рынку и прикрыть позицию стопом. Для примера использую акции сбера.
Вариант №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, хотя реальная цена колеблется в этом промежутке с сотыми долями. Это происходит и у меня, и в проекте-примере.
Возникает вопрос - кто как справляется с данной задачей в СмартКОМе?
Comentarios (19)
Iniciar sesión o Crear cuenta, Inicie sesión o regístrese para dejar un comentario
А в чем сложность?
Сбер? Нужно больше информации. С какими параметрами запускается котирование и какое именно.
Сложность в учете уже исполнившегося объема и переставлении стопов под новый объем. Чем больше действий - тем больше вероятность ошибки. Проще и надежней поставить один стоп на весь объем заявки сразу по ее исполнению.
Котирование - как в примере SampleSmartSMA
Это у нас такие идентификаторы в Смарте? Можно как-то лог привести работы котирования?
Ага. Конечно, если взять (lkoh.ExtensionInfo)).Items[0] можно получить нормальный идентификатор {[SecuritySmartId, SBER]}
Сразу после создания подписался на событие
Но после начала котирования логи по этому событию не пишутся. Если подскажете какой лог и как привести - сделаю.
Собственно стакан получается нормально, данные идут.
upd. Сейчас прикручу logManager, посмотрю, что в него идет...
Тот участок, который покажет, что не так с ценами. ГОСТ-а нет.😀
Прикрутил
сразу после создания объектов. Собствено файл с логом прикрепил к предыдущему своему сообщению. Увы, не вижу там строки о том, почему цена неверно рассчитывается. 😊
А чему равен Security.MinStepSize + Decimals? Особенно интересна ситуация с идентификаторами, которые у нас, кстати, правильные, тоесть SBER@EQBR. Думаю, все данные по инструментам поехали. Может у вас смарт ком старый?
Security.MinStepPrice = 1 Security.MinStepSize = 2 Security.Decimals = 0
SmartCOM последний, с их сайта, недавно обновился. На предпоследней версии та же самая фигня была.
а версия S#?
StockSharp 4.0.22
Михаил, может, есть возможность дать мне исходники всего проекта? Так бы я мог разбираться с проблемами, не обращаясь к Вам по пустякам. А то и я не могу понять в чем дело, и Вас напрягаю. Какая-то "угадайка" получается сильно растянутая по времени...
Работа напрямую со смартком - это SmartTrader.Wrapper. Только вам это не поможет. У вас какие-то данные "сдвинуты" (что было именем, стало кодом). Двое подтвердили уже по поводу сбера, что у них SBER@EQBR.
Начните с SampleSmart
Подключился в SampleSmart, со сбером аналогично (см. вложение).
Сейчас выяснил, я подключаюсь не напрямую к серверам АйТи Инвест, а через другой мидл-офис, по другому IP. С этим может быть связано?
Возможно. Чтобы удостовериться - попробуйте подключиться напрямую к айти. Хотя бы по тестовому доступу.
По тестовому доступу все то же самое. :( Завтра, конечно, попробую по нормальному логину напрямую к серверам АйТи Инвест подключиться, сейчас не хватает прав чтобы эту возможность настроить...
Но вообще у меня и раньше так же идентификаторы в Смарте выглядели, просто не знал, что это неправильно. И на прошлых версиях СмартКОМа, и на прошлых версиях S#.
Получил демо. Мой скрин в аттаче. Любопытно, что шаг цены до сих пор неправильно транслируется. Уже была такая тема http://stocksharp.com/posts/m/12516/ и на форуме айти http://www.itinvest.ru/forum/index.php?showtopic=63890&st=0&p=267901 У тех поддержки оказывается нет такого понятия как шаг цены😂 Секция ММВБ Смартком не поддерживается, имхо. Не знаю, имеет ли смысл дальше мучать это направление...
Я им, конечно же, написал. Но это вообще кретинизм полнейший! С КВИКом тоже проблемм хватает, но там хоть как-то работает. А со Смартом просто нет слов!
Согласен, дальше эту тему пинать не стоит. Сделают - хорошо. А пока придется руками выставлять. Увы, чувствую, еще намучаюсь со Смартом. 😏
Спасибо большое, что уделили столько времени моей проблеме!
Я своих первых ботов писал на смарткоме в 2009 году. С тех пор стараюсь от этого держаться подальше.
На квике кстати все боты которые были написаны в начале 2011 года (через S#) - работают стабильно до сих пор. Т.е. действительно проблем можно сказать нет.
Так для себя я тоже через КВИК подключаюсь. :)