При котировании заявок стоплосс (и/или) тэйкпрофит выполняются сразу две заявки

При котировании заявок стоплосс (и/или) тэйкпрофит выполняются сразу две заявки
Atom
11/19/2010
ustas


Приветствую уважаемых Михаила и коллег!

При котировании Тейкпрофит стратегии часто выполниляется две заявки. Т.е. выставление новой заявки не отменяет или не успевает отменить старую.
Вернее даже так : первая заявка исполнилась, но котирование выставляет вторую заявку (см. лог ниже выставилось две заявки 57878465 и 57878467 и в итоге обе исполнились)

Нельзя ли перерегистрировать заявку вместо удаления старой и создания новой? Хотя вообще непонятно зачем создалась вторая заявка если первая исполнилась? См. лог ниже.

Подскажите как тут лучше делать, пжл.

Спасибо и с уважением!

Вот код BS/SL/TP стратегии

Code
var takeStop = new BatchStrategy(BatchFinishModes.First) { IsParallel = true };
foreach (var mytrade in Program.trader.GetMyTrades(order))
{
var tp = new TakeProfitStrategy(mytrade, 6.Points(Security));// { IsMarket = true };
var sl = new StopLossStrategy(mytrade, 12.Points(Security)) { IsTrailing = true };
tp.UseMarketQuoting = true; tp.PriceExchange = 5.Points(Security); tp.PriceDelta = 10.Points(Security);
sl.UseMarketQuoting = true; sl.PriceExchange = 5.Points(Security); sl.PriceDelta = 10.Points(Security);
takeStop.ChildStrategies.Add(tp);
takeStop.ChildStrategies.Add(sl);

base.ChildStrategies.Add(takeStop);
}


Вот лог. Режим асинхронный если это важно. ( trader.IsAsyncMode = true;) Может в этом дело?

Quote:
SS 16:17:20.8835910 Условие активировано.
BS 16:17:20.8845911 Стратегия запущена.
TPS 16:17:20.8845911 Стратегия запущена.
SLS 16:17:20.8855912 Стратегия запущена.
SS 16:17:20.8865912 Условие удалено.
TPS 16:25:03.1210295 Регистрация защитной заявки с ценой 9821 и объемом 1.
MQS 16:25:03.1210295 Стратегия запущена.
TPS 16:25:03.1220296 Регистрация новой заявки на Buy с ценой 9821 и объемом 1.
TPS 16:25:03.1320301 Заявка 57878465 на Buy отправлена с ценой 9821 объемом 1.
MQS 16:25:04.1340875 Цена текущей 9821 и лучшей 9831.
MQS 16:25:04.1340875 Котирование заявки 57878465 на Buy с ценой 9821 объемом 1.
MQS 16:25:04.6341161 Котируемая заявка 57878465 исполнилась.
SS 16:25:04.6371162 Условие активировано.
SS 16:25:04.6381163 Условие удалено.
MQS 16:25:05.6441738 Регистрация новой заявки на Buy с ценой 9830 и объемом 1.
MQS 16:25:05.6501742 Заявка 57878467 на Buy отправлена с ценой 9830 объемом 1. ///--- Зачем? Первая заявка 57878465 уже исполнена?
MQS 16:25:06.6742327 Заканчиваем котирование с неисполненным объемом равный 0 контрактов.
MQS 16:25:06.6742327 Стратегия останавливается.
MQS 16:25:07.6812903 Котирование отменяет заявку 57878467.
MQS 16:25:07.6832905 Стратегия остановлена.
TPS 16:25:08.6843477 Котируемая заявка 57878465 исполнилась.
TPS 16:25:08.6853478 Стратегия останавливается.
TPS 16:25:09.7004058 Котирование отменяет заявку 57878465.
TPS 16:25:09.7004058 Стратегия остановлена.

Tags:


Thanks:


1 2  >
ustas

Avatar
Date: 11/19/2010
Reply


Я поставил

trader.IsAsyncMode = false;
но случай исполнения одновременно двух заявок повторяется

Вот пример лога котирования

Объём защищаемой заявки всегда = 1 контракт

Quote:

SS 18:26:53.7031709 Условие активировано.
SS 18:26:55.3152631 Условие активировано.
SS 18:26:55.5862786 Условие удалено.
SS 18:26:55.9923018 Условие активировано.
BS 18:26:55.9933019 Стратегия запущена.
TPS 18:26:55.9933019 Стратегия запущена.
SLS 18:26:55.9933019 Стратегия запущена.
SS 18:26:55.9943019 Условие удалено.
SLS 18:27:15.3704102 Регистрация защитной заявки с ценой 9835 и объемом 1.
MQS 18:27:15.3724103 Стратегия запущена.
SLS 18:27:15.3734104 Регистрация новой заявки на Buy с ценой 9835 и объемом 1.
SLS 18:27:15.5554208 Заявка 65443321 на Buy отправлена с ценой 9835 объемом 1.
MQS 18:27:16.5694788 Цена текущей 9835 и лучшей 9845.
MQS 18:27:16.5704788 Котирование заявки 65443321 на Buy с ценой 9835 объемом 1.
MQS 18:27:17.2505177 Перекотирование зарегистрировано для заявки 65443323 на Buy с ценой 9845 объемом 1.
SS 18:27:17.5585353 Условие активировано.
SS 18:27:17.5595354 Условие удалено.
MQS 18:27:18.2755764 Заканчиваем котирование с неисполненным объемом равный 0 контрактов.
MQS 18:27:18.2765764 Стратегия останавливается.
MQS 18:27:19.3056353 Котирование отменяет заявку 65443323. // заявка исполнилась!
MQS 18:27:19.3126357 Стратегия остановлена.
SLS 18:27:20.3156930 Заканчиваем котирование с неисполненным объемом равный 0 контрактов.
SLS 18:27:20.3156930 Стратегия останавливается.
SLS 18:27:21.3307511 Котирование отменяет заявку 65443321.
SLS 18:27:21.3317512 Стратегия остановлена.
TPS 18:28:27.2815233 Регистрация защитной заявки с ценой 9828 и объемом 1.
MQS 18:28:27.2815233 Стратегия запущена.
TPS 18:28:27.2835234 Регистрация новой заявки на Buy с ценой 9828 и объемом 1.
TPS 18:28:27.7445498 Заявка 65443324 на Buy отправлена с ценой 9828 объемом 1.
MQS 18:28:28.7506073 Цена текущей 9828 и лучшей 9838.
MQS 18:28:28.7516074 Котирование заявки 65443324 на Buy с ценой 9828 объемом 1.
MQS 18:28:29.1486301 Перекотирование зарегистрировано для заявки 65443326 на Buy с ценой 9838 объемом 1.
MQS 18:28:30.1626881 Заканчиваем котирование с неисполненным объемом равный 0 контрактов.
MQS 18:28:30.1626881 Стратегия останавливается.
MQS 18:28:31.1657454 Котирование отменяет заявку 65443326. // но заявка уже исполнилась!
MQS 18:28:31.1657454 Стратегия остановлена.
TPS 18:28:32.2008046 Заканчиваем котирование с неисполненным объемом равный 0 контрактов.
TPS 18:28:32.2018047 Стратегия останавливается.
TPS 18:28:33.2018619 Котирование отменяет заявку 65443324.
TPS 18:28:33.2018619 Стратегия остановлена.
BS 18:28:34.2039192 Стратегия останавливается.
BS 18:28:34.3219260 Стратегия остановлена.


В итоге
отменились заявки 65443321 и 65443324
исполнилось две заявки 65443323 и 65443326

Спасибо и с уважением!
Thanks:

ustas

Avatar
Date: 11/19/2010
Reply


Я понимаю что уже надоел, но я не только туповат но еще и упрямый.

Вот ещё лог где из батч стратегии исполнились обе и Стоп Лосс и Тейк профит
хотя BatchFinishModes.First + я в этот раз для разнообразия поставил IsParallel = false

Quote:
SS 20:44:35.6897295 Условие активировано.
SS 20:45:12.1478148 Условие активировано.
SS 20:45:12.4638329 Условие удалено.
SS 20:45:13.0708676 Условие активировано.
BS 20:45:13.0938689 Стратегия запущена.
TPS 20:45:13.0968691 Стратегия запущена.
SLS 20:45:13.0978691 Стратегия запущена.
SS 20:45:13.1008693 Условие удалено.
TPS 20:47:19.9481245 Регистрация защитной заявки с ценой 9878 и объемом 1.
MQS 20:47:19.9551249 Стратегия запущена.
TPS 20:47:19.9561250 Регистрация новой заявки на Buy с ценой 9878 и объемом 1.
TPS 20:47:20.6441644 Заявка 74362950 на Buy отправлена с ценой 9878 объемом 1.
MQS 20:47:21.6702230 Цена текущей 9878 и лучшей 9888.
MQS 20:47:21.6722232 Котирование заявки 74362950 на Buy с ценой 9878 объемом 1.
MQS 20:47:22.4322666 Перекотирование зарегистрировано для заявки 74362952 на Buy с ценой 9888 объемом 1.
MQS 20:47:23.4343239 Заканчиваем котирование с неисполненным объемом равный 0 контрактов.
MQS 20:47:23.4353240 Стратегия останавливается.
MQS 20:47:24.4633828 Котирование отменяет заявку 74362952.
MQS 20:47:24.4643829 Стратегия остановлена.
TPS 20:47:25.4794409 Заканчиваем котирование с неисполненным объемом равный 0 контрактов.
TPS 20:47:25.4804410 Стратегия останавливается.
TPS 20:47:26.4824983 Котирование отменяет заявку 74362950.
TPS 20:47:26.4824983 Стратегия остановлена.
SLS 20:50:29.5169673 Регистрация защитной заявки с ценой 9885 и объемом 1.
MQS 20:50:29.5169673 Стратегия запущена.
SLS 20:50:29.5179673 Регистрация новой заявки на Buy с ценой 9885 и объемом 1.
SLS 20:50:29.7039780 Заявка 74362953 на Buy отправлена с ценой 9885 объемом 1.
MQS 20:50:30.7250364 Цена текущей 9885 и лучшей 9897.
MQS 20:50:30.7260364 Котирование заявки 74362953 на Buy с ценой 9885 объемом 1.
MQS 20:50:31.1180588 Перекотирование зарегистрировано для заявки 74362955 на Buy с ценой 9897 объемом 1.
MQS 20:50:32.1961205 Заканчиваем котирование с неисполненным объемом равный 0 контрактов.
MQS 20:50:32.1961205 Стратегия останавливается.
MQS 20:50:33.1971778 Котирование отменяет заявку 74362955.
MQS 20:50:33.1971778 Стратегия остановлена.
SLS 20:50:34.1982350 Заканчиваем котирование с неисполненным объемом равный 0 контрактов.
SLS 20:50:34.1992351 Стратегия останавливается.
SLS 20:50:35.2072927 Котирование отменяет заявку 74362953.
SLS 20:50:35.2072927 Стратегия остановлена.
BS 20:50:36.2093500 Стратегия останавливается.
BS 20:50:37.2134075 Стратегия остановлена.


Здесь исполнились заявки 74362952 и 74362955
причём с интрвалом больше 3ёх минут

Всё! Всем приятных выходных!
Спасибо и с уважением!
Thanks:

Mikhail Sukhov

Avatar
Date: 11/22/2010
Reply


ustas

Всё! Всем приятных выходных!
Спасибо и с уважением!


Инструмент Форцовый? Strategy.IsForst чему равен?
Thanks:

Mikhail Sukhov

Avatar
Date: 11/22/2010
Reply


Еще немного детализации. Такое может быть, если сделки придут позднее обновления состояния заявки. Котирование же в смотрит:

Code
protected virtual bool CanFinish()
{
    return (this.Order.State == OrderStates.Done || this.Order.State == OrderStates.Failed) && this.LeftPosition == 0;
}


Заявка по всей видимости перешла как раз в состояние неактивное. Но сделки не пришли. Попробуйте переопределить CanFinish.
Thanks:

ustas

Avatar
Date: 11/22/2010
Reply


Mikhail Sukhov
Еще немного детализации. Такое может быть, если сделки придут позднее обновления состояния заявки. Котирование же в смотрит:

Code
protected virtual bool CanFinish()
{
    return (this.Order.State == OrderStates.Done || this.Order.State == OrderStates.Failed) && this.LeftPosition == 0;
}


Заявка по всей видимости перешла как раз в состояние неактивное. Но сделки не пришли. Попробуйте переопределить CanFinish.


Спасибо.
IsForts поставлю в true. раньше было не установлено. О результатах сообщу.

А где переопределить CanFinish? В MarketQuotingStrategy? Но я же ёё не использую явно. Или переопределять надо в TakeProfitStrategy и в StopLossStrategy по отдельности? не покажите примерчик переопределения полностью?


Спасибо и с уважением!
Thanks:

Mikhail Sukhov

Avatar
Date: 11/22/2010
Reply


ustas

А где переопределить CanFinish? В MarketQuotingStrategy?


Надо сначала переопределить ProtectiveStrategy.CreateQuoting и уже в нем возвращать своего наследника от MarketQuotingStrategy с переопределенным CanFinish.
Thanks:

ustas

Avatar
Date: 11/22/2010
Reply


Mikhail Sukhov

Надо сначала переопределить ProtectiveStrategy.CreateQuoting и уже в нем возвращать своего наследника от MarketQuotingStrategy с переопределенным CanFinish.

o_O Кажется понял, но ещё не осознал. Спасибо. Ухожу в погружение ...

Спасибо и с уважением.
Thanks:

ustas

Avatar
Date: 11/23/2010
Reply


Mikhail Sukhov

Надо сначала переопределить ProtectiveStrategy.CreateQuoting и уже в нем возвращать своего наследника от MarketQuotingStrategy с переопределенным CanFinish.


1. Всё таки мне не понятно до конца.
Ведь в этом случае переопределения остановится стратегия либо стоп лосс либо тейк профит.
Но на BatchStrategy это не повлияет, как я понимаю. - Как в примере лога, который я прислал 19 ноября 2010 г. 21:14:59
Отработали обе стратегии котирования. И интервал между ними был 3 минуты. И заявки пришли 99.99%
И был LeftPosition==0.
У меня впечатление, возможно неверное, что в BatchStrategy не отрабатывает BatchFinishModes.First.

Поправте меня где я не прав, пжл.

2. Как можно самому остановить BatchStrategy? Это надо делать просто методом Stop? Надо ли ей делать ChildStrategies.Remove ?

Спасибо и с уважением!
Thanks:

Mikhail Sukhov

Avatar
Date: 11/23/2010
Reply


1. Это легко проверить. Создайте тестовые стратегии и посмотрите, останавливаются или нет.
2. Должно останавливаться.
Thanks:

ustas

Avatar
Date: 11/23/2010
Reply


Mikhail Sukhov
1. Это легко проверить. Создайте тестовые стратегии и посмотрите, останавливаются или нет.
2. Должно останавливаться.

1. Хорошо, но почему тогда не останавливается без переопределения текущая BatchStrategy с установленным BatchFinishModes.First? Логи я уже приводил...
И еще не ясно вот то что, -

Вы привели в пример:

Code
protected virtual bool CanFinish()
{
return (this.Order.State == OrderStates.Done || this.Order.State == OrderStates.Failed) && this.LeftPosition == 0;
}


это то что есть сейчас, как я понял. А на ЧТО именно всё таки надо переопределять я НЕ понял. :(

2. Я пытаюсь ...
делаю так
Code
When(() => takeStop != null && PositionManager.Position == 0 && (takeStop.ProcessState != StrategyProcessStates.Stopped || takeStop.ProcessState != StrategyProcessStates.Stopping)).Do(() =>
{
takeStop.Stop();
base.ChildStrategies.Remove(takeStop);
});


но не останавливается ...
Спасибо и с уважением!
Thanks:
1 2  >

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

loading
clippy