SlippageManager
Atom Reply
2/28/2011


Доброго времени суток!
Помогите, пожалуйста, разобраться с механизмом 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 для базовой стратегии без котирования, все равно проскальзывание не считается. Непонятно как для фьючерсов раработает механизм

Tags:


Thanks:




16 Answers
Mikhail Sukhov

Avatar
Date: 2/28/2011
Reply


Явно регистрировать заявку в SlippageManager не нужно - это делает сама Strategy в методе Strategy.RegisterOrder и Strategy.ReRegisterOrder.
Thanks:

Артем

Avatar
Date: 3/1/2011
Reply


Да, я сначала делал без strategy.SlippageManager.RegisterSlippage, эта строка добавилась в ходе экспериментов... Михаил, видимо, когда я задавал вопрос, сам не до конца понял, что хотел выяснить... Мне необходимо зафиксировать проскальзывание для фьючерсов при эмуляции продажи по рынку, для этого пытаюсь понять доступные механизмы.

Например, текущая цена для фьючерса 180 200, я хочу продать <по рынку>, для этого выставляю Order на продажу по цене на 200 дешевле т.е. 180 000. Как зафиксировать проскальзывание для Order относительно текущей цены 180 200 или какой-то, которую я сам хочу использовать в качестве начальной(например, цена открытия текущей свечи)?


Topic starter
Thanks:

Артем

Avatar
Date: 3/1/2011
Reply


Попробовал создавать лимитированную стоп-заявку, но все равно проскальзывание 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()
{
Type = Ecng.Trading.Quik.QuikStopConditionTypes.StopLimit,
StopPrice = order.Price,
ExpiryDate = DateTime.MaxValue
};

RegisterOrder(_merketOrder);
Topic starter
Thanks:

Mikhail Sukhov

Avatar
Date: 3/1/2011
Reply


Артем Go to
Попробовал создавать лимитированную стоп-заявку, но все равно проскальзывание 0 все время


Проскальзывание рассчитывается относительно сделок. А по стоп заявке сделок быть не может.
Thanks:

Артем

Avatar
Date: 3/1/2011
Reply


Да, но по стоп-заявке создается заявка, по заявке происходит сделка, эти сущности связаны через идентификатор между собой. Как все же считается проскальзывание?
Вот пример:
Ecng.Trading.BusinessEntities.Order _merketOrder = new Ecng.Trading.BusinessEntities.Order();

double _marketPrice = (order.Direction == Ecng.Trading.BusinessEntities.OrderDirections.Buy) ? Math.Min(this.Security.MaxPrice, (CurrentPrice + 1000)) : Math.Max(this.Security.MinPrice, CurrentPrice - 1000);

_merketOrder.Price = _marketPrice;

this.RegisterOrder(_merketOrder);

this.SlippageManager.RegisterSlippage(_merketOrder, CurrentPrice);

Почему проскальзывание для стратегии this всегда 0?
*CurrentPrice - текущая цена фьючерса
Topic starter
Thanks:

Mikhail Sukhov

Avatar
Date: 3/1/2011
Reply


merketOrder - это лимитная или стоп заявка?
Thanks:

Артем

Avatar
Date: 3/2/2011
Reply


Это лимитная. Все ее определение в этом кусочке кода...
Topic starter
Thanks:

Mikhail Sukhov

Avatar
Date: 3/2/2011
Reply


Артем Go to
Это лимитная. Все ее определение в этом кусочке кода...


Это стоп заявка, судя по коду... Я не совсем понимаю, как это рассчитать проскальзывание по стопу. Стоп лишь выставляет реальную заявку, которая уже может проскальзить из-за рынка, и которую нужно переставлять чтобы его догнать.

upd: посмотрел не туда. Да, это лимитная заявка... Давайте начнем с основ. Как рассчитывается проскальзывание. Мы выставили лимитник. По нему какой бы ни был рынок проскальзывание будет ноль. Потому что лимитник всегда исполняется не хуже. Но, если вы начинаете свою заявку двигать по стакану, вот тогда уже по ней можно определить проскальзывание.
Thanks:

Артем

Avatar
Date: 3/2/2011
Reply


Да, я согласен... Но моя задача зафиксировать проскальзывание относительно текущей цены, поэтому я попробовал задействовать второй параметр в RegisterSlippage:
this.SlippageManager.RegisterSlippage(_merketOrder, CurrentPrice);

Например, текущая цена 100 р, я выставляю лимитник по 1100 и хочу зафиксировать проскальзывание от 100(текущей цены).
Проскальзывание будет [цена сделки] - [текущая цена(100)]
Topic starter
Thanks:

Mikhail Sukhov

Avatar
Date: 3/2/2011
Reply


Артем Go to
Да, я согласен... Но моя задача зафиксировать проскальзывание относительно текущей цены, поэтому я попробовал задействовать второй параметр в RegisterSlippage:
this.SlippageManager.RegisterSlippage(_merketOrder, CurrentPrice);

Например, текущая цена 100 р, я выставляю лимитник по 1100 и хочу зафиксировать проскальзывание от 100(текущей цены).
Проскальзывание будет [цена сделки] - [текущая цена(100)]


Оно и будет работать так, как вы описали. Но только не для стоп заявки. Потому что по ней сделок не будет... А вообще, ладно, добавлю для стопа чтобы по Order.DeriveOrder вычислялось. Если по ней Order.DeriveOrder == null то будет рассчитываться как ноль.
Thanks:

Артем

Avatar
Date: 3/2/2011
Reply


Так ведь у меня в последнем примере НЕ стоп-заявка, обычная лимитированная... а все равно не работает Crying Crying Crying

Поскольку для фьючерсов заявки "по рынку" отменены, я хочу вычислять реальное проскальзывание между текущей ценой в момент выставления лимитной заявки и реальной ценой, по которой прошла сделка.

Например:
Тек. цена = 100
Я ставлю лимитную заявку на покупку по 1100.
Исполнилась заявка по 90

Как получить проскальзывание
Проскальзывание = 100-90
?

this.SlippageManager.RegisterSlippage(_merketOrder, CurrentPrice);
- не работает
Topic starter
Thanks:

Mikhail Sukhov

Avatar
Date: 3/2/2011
Reply


Артем Go to
Тек. цена = 100
Я ставлю лимитную заявку на покупку по 1100.
Исполнилась заявка по 90

Как получить проскальзывание
Проскальзывание = 100-90


Какая-то странная логика расчета. В этом случае проскальзывание никак не может быть положительным, так как сделка исполнилась по лучшей цене, чем декларировалось.
Thanks:

Артем

Avatar
Date: 3/3/2011
Reply


В разных источниках разное понимание этого термина... В данном случае цель - зафиксировать отклонение цен реальных сделок, от тех которые заложены алгоритмом. В алгоритме, который тестировался на истории все сделки проходят по текущим ценам, а в реальности волатильности рынка недостаточно, чтобы это условие сохранилось. Поэтому появлется необходимость зафиксировать эту разницу(Реальная цена - текущая цена в момент выставления заявки).
Можно ли это сделать через SlippageManager?
Если нет, доступны ли сейчас механизмы в S#, позволяющие это осуществить?
Topic starter
Thanks:

Mikhail Sukhov

Avatar
Date: 3/3/2011
Reply


Артем Go to
В разных источниках разное понимание этого термина... В данном случае цель - зафиксировать отклонение цен реальных сделок, от тех которые заложены алгоритмом. В алгоритме, который тестировался на истории все сделки проходят по текущим ценам, а в реальности волатильности рынка недостаточно, чтобы это условие сохранилось. Поэтому появлется необходимость зафиксировать эту разницу(Реальная цена - текущая цена в момент выставления заявки).
Можно ли это сделать через SlippageManager?
Если нет, доступны ли сейчас механизмы в S#, позволяющие это осуществить?


Конечно можно. Но проскальзывание рассчитывается только тогда, когда оно положительное (тоесть заявка исполнилась по цене хуже, чем реально декларировалось).
Thanks:

Артем

Avatar
Date: 3/3/2011
Reply


Хорошо, как зафиксировать хотя бы часть отклонений, когда "заявка исполнилась по цене хуже, чем реально декларировалось).", если в примере заявка исполнилась по 110, т.е.:

Тек. цена = 100
Я ставлю лимитную заявку на покупку по 1100.
Исполнилась заявка по 110

Как получить проскальзывание
Проскальзывание = 110-100?
Topic starter
Thanks:

Mikhail Sukhov

Avatar
Date: 3/3/2011
Reply


Артем Go to
Хорошо, как зафиксировать хотя бы часть отклонений, когда "заявка исполнилась по цене хуже, чем реально декларировалось).", если в примере заявка исполнилась по 110, т.е.:


TraderHelper.GetSlippage, Strategy.SlippageManager.
Thanks:


Attach files by dragging & dropping, , or pasting from the clipboard.

loading
clippy