← Zurück

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

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

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

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

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

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

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

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;) Может в этом дело?

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. <mark>TPS 16:25:03.1320301 Заявка 57878465 на Buy отправлена с ценой 9821 объемом 1.</mark> MQS 16:25:04.1340875 Цена текущей 9821 и лучшей 9831. MQS 16:25:04.1340875 Котирование заявки 57878465 на Buy с ценой 9821 объемом 1. <mark>MQS 16:25:04.6341161 Котируемая заявка 57878465 исполнилась.</mark> SS 16:25:04.6371162 Условие активировано. SS 16:25:04.6381163 Условие удалено. MQS 16:25:05.6441738 Регистрация новой заявки на Buy с ценой 9830 и объемом 1. <mark>MQS 16:25:05.6501742 Заявка 57878467 на Buy отправлена с ценой 9830 объемом 1. ///--- Зачем? Первая заявка 57878465 уже исполнена? </mark> MQS 16:25:06.6742327 Заканчиваем котирование с неисполненным объемом равный 0 контрактов. MQS 16:25:06.6742327 Стратегия останавливается. MQS 16:25:07.6812903 Котирование отменяет заявку 57878467. MQS 16:25:07.6832905 Стратегия остановлена. <mark>TPS 16:25:08.6843477 Котируемая заявка 57878465 исполнилась.</mark> TPS 16:25:08.6853478 Стратегия останавливается. TPS 16:25:09.7004058 Котирование отменяет заявку 57878465. TPS 16:25:09.7004058 Стратегия остановлена.

War dieses Thema hilfreich?

Thema teilen

Kommentare (11)

Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen

ustas
ustas Autor

Я поставил

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

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

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

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 Стратегия останавливается. <mark>MQS 18:27:19.3056353 Котирование отменяет заявку 65443323. // заявка исполнилась!</mark> 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 Стратегия останавливается. <mark>MQS 18:28:31.1657454 Котирование отменяет заявку 65443326. // но заявка уже исполнилась!</mark> 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 исполнилось две заявки <mark>65443323 и 65443326</mark>

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

ustas
ustas Autor

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

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

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ёх минут

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

Mikhail Sukhov
Mikhail Sukhov

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

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

Mikhail Sukhov
Mikhail Sukhov

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

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

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

ustas
ustas Autor

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

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 по отдельности? не покажите примерчик переопределения  полностью?


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

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

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

ustas
ustas Autor

Mikhail Sukhov: Надо сначала переопределить ProtectiveStrategy.CreateQuoting и уже в нем возвращать своего наследника от MarketQuotingStrategy с переопределенным CanFinish. o_O Кажется понял, но ещё не осознал. Спасибо. Ухожу в погружение ...

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

ustas
ustas Autor

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

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

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

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

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

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

Mikhail Sukhov:

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

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

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

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

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


но не останавливается ... Спасибо и с уважением!

Mikhail Sukhov
Mikhail Sukhov

ustas:

  1. Хорошо, но почему тогда не останавливается

Посмотрел первоначальный код. Там ошибка. В пакетную стратегию можно добавлять лишь параллельные дочерние стратегии (в новой версии бросается исключение). Иначе BatchStrategy никогда не узнает об исполнении.