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

Теги:


Спасибо:




16 Ответов
Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 28.02.2011
Ответить


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

Артем

Фотография
Дата: 01.03.2011
Ответить


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

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


Автор топика
Спасибо:

Артем

Фотография
Дата: 01.03.2011
Ответить


Попробовал создавать лимитированную стоп-заявку, но все равно проскальзывание 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);
Автор топика
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 01.03.2011
Ответить


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


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

Артем

Фотография
Дата: 01.03.2011
Ответить


Да, но по стоп-заявке создается заявка, по заявке происходит сделка, эти сущности связаны через идентификатор между собой. Как все же считается проскальзывание?
Вот пример:
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 - текущая цена фьючерса
Автор топика
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 01.03.2011
Ответить


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

Артем

Фотография
Дата: 02.03.2011
Ответить


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

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 02.03.2011
Ответить


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


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

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

Артем

Фотография
Дата: 02.03.2011
Ответить


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

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

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 02.03.2011
Ответить


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

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


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

Артем

Фотография
Дата: 02.03.2011
Ответить


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

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

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

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

this.SlippageManager.RegisterSlippage(_merketOrder, CurrentPrice);
- не работает
Автор топика
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 02.03.2011
Ответить


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

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


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

Артем

Фотография
Дата: 03.03.2011
Ответить


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

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 03.03.2011
Ответить


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


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

Артем

Фотография
Дата: 03.03.2011
Ответить


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

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

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

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 03.03.2011
Ответить


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


TraderHelper.GetSlippage, Strategy.SlippageManager.
Спасибо:


Добавить файлы через драг-н-дроп, , или вставить из буфера обмена.

loading
clippy