Доброго времени суток! Помогите, пожалуйста, разобраться с механизмом SlippageManager... Сталкнулся со следующей проблемой: Имеются базовая и дочерня стратегии, в дочерней стратегии создается дочерняя стратегия котирования:
Ecng.Trading.Algo.Strategies.MarketQuotingStrategy strategy = new Ecng.Trading.Algo.Strategies.MarketQuotingStrategy( order, new Ecng.Trading.BusinessEntities.Unit(), new Ecng.Trading.BusinessEntities.Unit()); strategy.IsForts = true; strategy.Interval = TimeSpan.FromTicks(1); strategy.PriceType = Ecng.Trading.Algo.MarketPriceTypes.Following; strategy.PriceDelta = 0;
ChildStrategies.Add(strategy);
//регистрация проскальзывания
strategy.NewOrder += (new_order) =>
{
strategy.SlippageManager.RegisterSlippage(new_order);
};
strategy.Start();
Далее при опросе SlippageManager.Slippage для самой верхней базовой стратегии всегда возвращается 0, хотя заявки выполняются по ценам, отличным от заданных в order при создании стратегии квотирования. Вопрос в том, почему не считается проскальзывание?
Заранее спасибо!
P.S. Попробовал сразу регистрировать Order для базовой стратегии без котирования, все равно проскальзывание не считается. Непонятно как для фьючерсов раработает механизм
Kommentare (16)
Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen
Явно регистрировать заявку в SlippageManager не нужно - это делает сама Strategy в методе Strategy.RegisterOrder и Strategy.ReRegisterOrder.
Да, я сначала делал без strategy.SlippageManager.RegisterSlippage, эта строка добавилась в ходе экспериментов... Михаил, видимо, когда я задавал вопрос, сам не до конца понял, что хотел выяснить... Мне необходимо зафиксировать проскальзывание для фьючерсов при эмуляции продажи по рынку, для этого пытаюсь понять доступные механизмы.
Например, текущая цена для фьючерса 180 200, я хочу продать <по рынку>, для этого выставляю Order на продажу по цене на 200 дешевле т.е. 180 000. Как зафиксировать проскальзывание для Order относительно текущей цены 180 200 или какой-то, которую я сам хочу использовать в качестве начальной(например, цена открытия текущей свечи)?
Попробовал создавать лимитированную стоп-заявку, но все равно проскальзывание 0 все время
Ecng.Trading.BusinessEntities.Order _merketOrder = new Ecng.Trading.BusinessEntities.Order(); _merketOrder = order.Clone(); double _marketPrice = (order.Direction == Ecng.Trading.BusinessEntities.OrderDirections.Buy) ? (order.Price + 1000) : Math.Max(this.Security.MinPrice, order.Price - 1000); _merketOrder.Price = _marketPrice; _merketOrder.Type = Ecng.Trading.BusinessEntities.OrderTypes.Conditional; _merketOrder.StopCondition = new Ecng.Trading.Quik.QuikStopCondition() ;
Проскальзывание рассчитывается относительно сделок. А по стоп заявке сделок быть не может.
Да, но по стоп-заявке создается заявка, по заявке происходит сделка, эти сущности связаны через идентификатор между собой. Как все же считается проскальзывание? Вот пример: Ecng.Trading.BusinessEntities.Order _merketOrder = new Ecng.Trading.BusinessEntities.Order();
Почему проскальзывание для стратегии this всегда 0? *CurrentPrice - текущая цена фьючерса
merketOrder - это лимитная или стоп заявка?
Это лимитная. Все ее определение в этом кусочке кода...
Это стоп заявка, судя по коду... Я не совсем понимаю, как это рассчитать проскальзывание по стопу. Стоп лишь выставляет реальную заявку, которая уже может проскальзить из-за рынка, и которую нужно переставлять чтобы его догнать.
upd: посмотрел не туда. Да, это лимитная заявка... Давайте начнем с основ. Как рассчитывается проскальзывание. Мы выставили лимитник. По нему какой бы ни был рынок проскальзывание будет ноль. Потому что лимитник всегда исполняется не хуже. Но, если вы начинаете свою заявку двигать по стакану, вот тогда уже по ней можно определить проскальзывание.
Да, я согласен... Но моя задача зафиксировать проскальзывание относительно текущей цены, поэтому я попробовал задействовать второй параметр в RegisterSlippage: this.SlippageManager.RegisterSlippage(_merketOrder, CurrentPrice);
Например, текущая цена 100 р, я выставляю лимитник по 1100 и хочу зафиксировать проскальзывание от 100(текущей цены). Проскальзывание будет [цена сделки] - [текущая цена(100)]
Оно и будет работать так, как вы описали. Но только не для стоп заявки. Потому что по ней сделок не будет... А вообще, ладно, добавлю для стопа чтобы по Order.DeriveOrder вычислялось. Если по ней Order.DeriveOrder == null то будет рассчитываться как ноль.
Так ведь у меня в последнем примере НЕ стоп-заявка, обычная лимитированная... а все равно не работает 😭 😭 😭
Поскольку для фьючерсов заявки "по рынку" отменены, я хочу вычислять реальное проскальзывание между текущей ценой в момент выставления лимитной заявки и реальной ценой, по которой прошла сделка.
Например: Тек. цена = 100 Я ставлю лимитную заявку на покупку по 1100. Исполнилась заявка по 90
Как получить проскальзывание Проскальзывание = 100-90 ?
this.SlippageManager.RegisterSlippage(_merketOrder, CurrentPrice);
Какая-то странная логика расчета. В этом случае проскальзывание никак не может быть положительным, так как сделка исполнилась по лучшей цене, чем декларировалось.
В разных источниках разное понимание этого термина... В данном случае цель - зафиксировать отклонение цен реальных сделок, от тех которые заложены алгоритмом. В алгоритме, который тестировался на истории все сделки проходят по текущим ценам, а в реальности волатильности рынка недостаточно, чтобы это условие сохранилось. Поэтому появлется необходимость зафиксировать эту разницу(Реальная цена - текущая цена в момент выставления заявки).
Можно ли это сделать через SlippageManager? Если нет, доступны ли сейчас механизмы в S#, позволяющие это осуществить?
Конечно можно. Но проскальзывание рассчитывается только тогда, когда оно положительное (тоесть заявка исполнилась по цене хуже, чем реально декларировалось).
Хорошо, как зафиксировать хотя бы часть отклонений, когда "заявка исполнилась по цене хуже, чем реально декларировалось).", если в примере заявка исполнилась по 110, т.е.:
Тек. цена = 100 Я ставлю лимитную заявку на покупку по 1100. Исполнилась заявка по 110
Как получить проскальзывание Проскальзывание = 110-100?
TraderHelper.GetSlippage, Strategy.SlippageManager.