← Назад

Ошибка защитных стратегий - коллекция котировок пуста

Выводится в логи следующая ошибка (правильно я понял, что логируется только то, что описывается через AddLog()) :

IS_01:00:10 10:12:00.1564059 Стратегия запущена.
IS_01:00:10 16:00:01.3877441 Регистрация заявки - цена 193245, направление Buy, объем 5
IS_01:00:10 16:00:02.9208318 Прошла сделка по цене 192375, объём 5, направление Buy.
IS_01:00:10 16:00:02.9618341 Регистрация стоп-лосс по цене 190550
IS_01:00:10 16:00:02.9618341 Регистрация тейк-профит по цене 192640
BS 16:00:02.9628342 Стратегия запущена.
BS 16:00:02.9628342 Стратегия запущена.
TPS 16:00:02.9628342 Стратегия запущена.
SLS 16:00:02.9628342 Стратегия запущена.
TPS 18:45:25.8543911 [h]System.ArgumentException: Коллекция котировок пуста.
Имя параметра: quotes
   в Ecng.Trading.Algo.TraderHelper.GetFilteredQuotes(IEnumerable`1 quotes, Order currentOrder)
   в Ecng.Trading.Algo.TraderHelper.GetFilteredQuotes(MarketDepth depth, OrderDirections orderDirection, Order currentOrder)
   в Ecng.Trading.Algo.TraderHelper.GetFilteredQuotes(Security security, OrderDirections orderDirection, Order currentOrder)
   в Ecng.Trading.Algo.Strategies.ProtectiveStrategy.GetNewPrice()
   в Ecng.Trading.Algo.Strategies.TakeProfitStrategy.CanRegister()
   в Ecng.Trading.Algo.Strategies.QuotingStrategy.OnProcess()
   в Ecng.Trading.Algo.Strategies.Strategy.#=qnMN_PMdUfHysEK$_tfQ8grn_QTjzOIMGPiv$tYCH2Bw=.#=q3rD2zIrUx4ViUbhRH66B2w==()[/h]
TPS 18:45:25.8543911 Стратегия останавливается.
SLS 18:45:25.8543911 System.ArgumentException: Коллекция котировок пуста.
Имя параметра: quotes
   в Ecng.Trading.Algo.TraderHelper.GetFilteredQuotes(IEnumerable`1 quotes, Order currentOrder)
   в Ecng.Trading.Algo.TraderHelper.GetFilteredQuotes(MarketDepth depth, OrderDirections orderDirection, Order currentOrder)
   в Ecng.Trading.Algo.TraderHelper.GetFilteredQuotes(Security security, OrderDirections orderDirection, Order currentOrder)
   в Ecng.Trading.Algo.Strategies.ProtectiveStrategy.GetNewPrice()
   в Ecng.Trading.Algo.Strategies.StopLossStrategy.CanRegister()
   в Ecng.Trading.Algo.Strategies.QuotingStrategy.OnProcess()
   в Ecng.Trading.Algo.Strategies.Strategy.#=qnMN_PMdUfHysEK$_tfQ8grn_QTjzOIMGPiv$tYCH2Bw=.#=q3rD2zIrUx4ViUbhRH66B2w==()
SLS 18:45:25.8543911 Стратегия останавливается.
TPS 18:45:26.8554483 Котирование закончилось.
TPS 18:45:26.8564484 Стратегия остановлена.
SLS 18:45:26.8574485 Котирование закончилось.
SLS 18:45:26.8574485 Стратегия остановлена.
BS 18:45:26.8794497 Стратегия останавливается.
BS 18:45:27.8795069 Стратегия остановлена.
BS 18:45:27.8795069 Стратегия останавливается.
BS 18:45:28.8795641 Стратегия остановлена.

Стратегии регистрирую как в примере:

private void OnNewMyTrades(IEnumerable<MyTrade> trades)
        {
             foreach (var trade in trades)
            {
                AddLog(StrategyErrorStates.None, "Прошла сделка по цене {0}, объём {1}, направление {2}.",
                    trade.Trade.Price, trade.Trade.Volume, trade.Order.Direction);
            }
// фильтруем сделки, чтобы найти те, которые произошли для заявки TargetOrder// сделать проверку не на последнюю заявку а на все заявки которые
            trades = trades.Where(t => t.Order == TargetOrder);
           
            // если не найдена ни одна сделка для заявки TargetOrder
            if (trades.Count() == 0)
                return;

            // сама пакетная стратегия так же является параллельной, чтобы она не блокирована основной код робота
            var batch = new BatchStrategy(BatchFinishModes.All) { IsParallel = true };

            // для каждой сделки добавляем для защиты по пакетной стратегии
            batch.ChildStrategies.AddRange(trades.Select(t =>
            {

                var s = new BatchStrategy(BatchFinishModes.First) { IsParallel = true };

                // выставляет тейк-профит в N пунктов
                var takeProfit = new TakeProfitStrategy(t,new Unit((decimal)Fractal.Up) + _takeDelta.Pips(Security));
                
                // выставляет стоп-лосс в M пунктов
                var stopLoss = new StopLossStrategy(t, new Unit((decimal)Fractal.Down) - _stopDelta.Pips(Security));

                takeProfit.PriceDelta=stopLoss.PriceDelta = _priceDelta;
               
                // делаем стратегии параллельными, чтобы они не блокировали работу контролирующей BatchStrategy
                takeProfit.IsParallel = stopLoss.IsParallel = true;

                s.ChildStrategies.Add(takeProfit);
                s.ChildStrategies.Add(stopLoss);

                AddLog(StrategyErrorStates.None, "Регистрация стоп-лосс по цене {0}", stopLoss.ProtectiveDelta);
                AddLog(StrategyErrorStates.None, "Регистрация тейк-профит по цене {0}", takeProfit.ProtectiveDelta);

                return s;
            }).Cast<Strategy>());

            if (batch.ChildStrategies.Count > 0)
            {
                base.ChildStrategies.Add(batch);
            }
            TargetOrder = null;
}

Заявки выставляю лимитированные через base.RegisterOrder(order).Процесс получения стакана происходит - _trader.RegisterQuotes(_strategy.Security). Что я неправильно делаю? Спасибо

Комментарии (64)

Вход или Создать аккаунт, Войдите или зарегистрируйтесь, чтобы оставить комментарий

Mikhail Sukhov
Mikhail Sukhov

Перед запуском стратегии проверьте стакан.

Евгений
Евгений Автор

Mikhail Sukhov: Перед запуском стратегии проверьте стакан.

Да я проверил, экспорт происходит

  if (_strategy.ProcessState == StrategyProcessStates.Stopped)
            {
                // запускаем процесс получения стакана, необходимый для работы алгоритма котирования
                _trader.RegisterQuotes(_strategy.Security);
                _strategy.Start();
                this.Start.Content = "Стоп";
            }

Заявка зарегистрированная через котирование исполняется,

                var strategy = new MarketQuotingStrategy(order, new Unit(), new Unit());
                strategy.IsParallel = true;
                base.ChildStrategies.Add(strategy);

А добавление стратегии и регистрация заявки через базовый класс не влияет на получение информации со стакана?

base.RegisterOrder(order);
...
base.ChildStrategies.Add(batch);
Mikhail Sukhov
Mikhail Sukhov

Евгений:

Mikhail Sukhov: Перед запуском стратегии проверьте стакан.

Да я проверил, экспорт происходит

if (_strategy.ProcessState == StrategyProcessStates.Stopped) { // запускаем процесс получения стакана, необходимый для работы алгоритма котирования _trader.RegisterQuotes(_strategy.Security); _strategy.Start(); this.Start.Content = "Стоп"; }


Вы лишь проверили, что экспорт запускается. А идет или нет - не проверили. Сразу видна ошибка. Запустили стакан и тут же стратеги. Пришел стакан или нет вы не проверяете.
Евгений
Евгений Автор

Mikhail Sukhov:

Евгений:

Mikhail Sukhov: Перед запуском стратегии проверьте стакан.

Да я проверил, экспорт происходит

if (_strategy.ProcessState == StrategyProcessStates.Stopped) { // запускаем процесс получения стакана, необходимый для работы алгоритма котирования _trader.RegisterQuotes(_strategy.Security); _strategy.Start(); this.Start.Content = "Стоп"; }

> 
> Вы лишь проверили, что экспорт запускается. А идет или нет - не проверили. Сразу видна ошибка. Запустили стакан и тут же стратеги. Пришел стакан или нет вы не проверяете.

Так защитные стратегии выдают ошибку, потому что нет проверки на получение стакана? Да, программно я не сделал проверки, но регистрация через котирование работает и я решил, что следовательно стакан получается... Михаил, правильно я делаю проверку? 

           ```
     if (_strategy.ProcessState == StrategyProcessStates.Stopped)
                  {
                     _trader.RegisterQuotes(_strategy.Security);
              
                     MarketDepth md = _trader.GetMarketDepth(_strategy.Security);

                     if (md.Count!=0)
                      _strategy.Start();
                  }
Евгений
Евгений Автор

Помогите, пожалуйста, разобраться 🤔 Наверника ж кто-то сталкивался с такой же проблемой, код из примера...

Mikhail Sukhov
Mikhail Sukhov

Евгений: Помогите, пожалуйста, разобраться 🤔 Наверника ж кто-то сталкивался с такой же проблемой, код из примера...

А в чем проблема?

Евгений
Евгений Автор

Mikhail Sukhov:

Евгений: Помогите, пожалуйста, разобраться 🤔 Наверника ж кто-то сталкивался с такой же проблемой, код из примера...

А в чем проблема?

Как сделать, чтобы стакан заполнялся и защитные стратегии отрабатывали и не выдавали ошибку, которую я описал выше. Я сделал проверку при запуске экспорта стакана, но чего-то я не уверен, что правильно. Проверку нужно делать в событии QuotesChanged? И что нужно сделать, если не пришел стакан, чтобы выполнились защитные стратегии?😊

Mikhail Sukhov
Mikhail Sukhov

Евгений: Как сделать, чтобы стакан заполнялся и защитные стратегии отрабатывали и не выдавали ошибку, которую я описал выше. Я сделал проверку при запуске экспорта стакана, но чего-то я не уверен, что правильно.

Запустите и проверьте.

Евгений: Проверку нужно делать в событии QuotesChanged?

Это как?

Евгений: И что нужно сделать, если не пришел стакан, чтобы выполнились защитные стратегии?😊

Если нет стакана, то какой смысл защищать (нет ни продавцов, ни покупателей)? Вы на неликвиде работаете?

Евгений
Евгений Автор

Mikhail Sukhov:

Евгений: Как сделать, чтобы стакан заполнялся и защитные стратегии отрабатывали и не выдавали ошибку, которую я описал выше. Я сделал проверку при запуске экспорта стакана, но чего-то я не уверен, что правильно.

Запустите и проверьте.

Проверка проходит, а ситуацию, чтобы сработал стоп еще не отлавил.

Mikhail Sukhov: Это как?

Это мои предположения ничем не подкрепленные🙂

Mikhail Sukhov: Если нет стакана, то какой смысл защищать (нет ни продавцов, ни покупателей)? Вы на неликвиде работаете?

Я запускаю стратегию для Rim1. И еще повторюсь, что когда заявку выставляю через котирование, она исполняется, значит стакан грузится, как я понял. Но я выставляю лимитировано, заявка исполняется, а защитные стратегии выдают ошибку, что коллекция котировок пуста... Информация по стакану с одного места берется?

Mikhail Sukhov
Mikhail Sukhov

Евгений: Я запускаю стратегию для Rim1. И еще повторюсь, что когда заявку выставляю через котирование, она исполняется, значит стакан грузится, как я понял. Но я выставляю лимитировано, заявка исполняется, а защитные стратегии выдают ошибку, что коллекция котировок пуста... Информация по стакану с одного места берется?

Стакан не успевает прийти.

Евгений
Евгений Автор

Mikhail Sukhov:

Евгений: Я запускаю стратегию для Rim1. И еще повторюсь, что когда заявку выставляю через котирование, она исполняется, значит стакан грузится, как я понял. Но я выставляю лимитировано, заявка исполняется, а защитные стратегии выдают ошибку, что коллекция котировок пуста... Информация по стакану с одного места берется?

Стакан не успевает прийти.

А как сделать, чтобы успевал или хотя бы отрабатывали с задержкой защитные стратегии?

Mikhail Sukhov
Mikhail Sukhov

Евгений:

Mikhail Sukhov:

Евгений: Я запускаю стратегию для Rim1. И еще повторюсь, что когда заявку выставляю через котирование, она исполняется, значит стакан грузится, как я понял. Но я выставляю лимитировано, заявка исполняется, а защитные стратегии выдают ошибку, что коллекция котировок пуста... Информация по стакану с одного места берется?

Стакан не успевает прийти.

А как сделать, чтобы успевал или хотя бы отрабатывали с задержкой защитные стратегии?

Запускать стакан раньше стратегий.

Евгений
Евгений Автор

Mikhail Sukhov:

Евгений:

Mikhail Sukhov:

Евгений: Я запускаю стратегию для Rim1. И еще повторюсь, что когда заявку выставляю через котирование, она исполняется, значит стакан грузится, как я понял. Но я выставляю лимитировано, заявка исполняется, а защитные стратегии выдают ошибку, что коллекция котировок пуста... Информация по стакану с одного места берется?

Стакан не успевает прийти.

А как сделать, чтобы успевал или хотя бы отрабатывали с задержкой защитные стратегии?

Запускать стакан раньше стратегий.

Михаил, запускаю стакан сразу после того как экспорт дде закончен и определен инструмент

 var rim1 = securities.FirstOrDefault(s => s.Code == "RIM1");

                            if (rim1 != null)
                            {
                                _rim1 = rim1;
                               
                                this.GuiAsync(() =>
                                {
                                    this.Start.IsEnabled = true;

                                    _trader.RegisterQuotes(_rim1);

                                };)
                            }

А стратегию уже потом при нажатии на кнопку. Но все равно та же ошибка вознкикает :(

Пробовал также ставить задержку, но та же ошибка...

 if (_strategy.ProcessState == StrategyProcessStates.Stopped)
            {
               
                _trader.RegisterQuotes(_strategy.Security);

                Thread.Sleep(5000);

                _strategy.Start();
               
                this.Start.Content = "Стоп";
            }
            else
            {
                _trader.UnRegisterQuotes(_strategy.Security);
                _strategy.Stop();
                this.Start.Content = "Старт";
            }
Mikhail Sukhov
Mikhail Sukhov

Евгений: Михаил, запускаю стакан сразу после того как экспорт дде закончен и определен инструмент

А стратегию уже потом при нажатии на кнопку. Но все равно та же ошибка вознкикает :(

Проверьте, событие ITrader.QuotesChanged передается стакан для RIM1.

Евгений
Евгений Автор

Mikhail Sukhov:

Евгений: Михаил, запускаю стакан сразу после того как экспорт дде закончен и определен инструмент

А стратегию уже потом при нажатии на кнопку. Но все равно та же ошибка вознкикает :(

Проверьте, событие ITrader.QuotesChanged передается стакан для RIM1.

Да, в коллекции MarketDepth есть один стакан для инструмента RIM1.

А эти записи идентичны?

_trader.QuotesChanged += Trader_QuotesChanged;
_trader.Trader.QuotesChanged += Trader_QuotesChangedReal;

_trader - это RealTimeTestTrader.

Mikhail Sukhov
Mikhail Sukhov

Евгений:

Mikhail Sukhov:

Евгений: Михаил, запускаю стакан сразу после того как экспорт дде закончен и определен инструмент

А стратегию уже потом при нажатии на кнопку. Но все равно та же ошибка вознкикает :(

Проверьте, событие ITrader.QuotesChanged передается стакан для RIM1.

Да, в коллекции MarketDepth есть один стакан для инструмента RIM1.

А эти записи идентичны?

_trader.QuotesChanged += Trader_QuotesChanged; _trader.Trader.QuotesChanged += Trader_QuotesChangedReal;

> 
> _trader - это RealTimeTestTrader.

Да идентичны.

И что, после того, как пришли изменения по стакану (допустим вы вывели куда-то сообщение об этом) стратегия все равно пишет такое сообщение?
Евгений
Евгений Автор

Mikhail Sukhov:

Евгений:

Mikhail Sukhov:

Евгений: Михаил, запускаю стакан сразу после того как экспорт дде закончен и определен инструмент

А стратегию уже потом при нажатии на кнопку. Но все равно та же ошибка вознкикает :(

Проверьте, событие ITrader.QuotesChanged передается стакан для RIM1.

Да, в коллекции MarketDepth есть один стакан для инструмента RIM1.

А эти записи идентичны?

_trader.QuotesChanged += Trader_QuotesChanged; _trader.Trader.QuotesChanged += Trader_QuotesChangedReal;

> >
> > _trader - это RealTimeTestTrader.
> 
> Да идентичны.
> 
> И что, после того, как пришли изменения по стакану (допустим вы вывели куда-то сообщение об этом) стратегия все равно пишет такое сообщение?

Еще не отловил такой ситуации, чтобы отработали защитные стратегии - пробую. А  подписка на событие QuotesChanged может изменить ситуацию?
Mikhail Sukhov
Mikhail Sukhov

Евгений: Еще не отловил такой ситуации, чтобы отработали защитные стратегии - пробую. А подписка на событие QuotesChanged может изменить ситуацию?

Она не меняет ничего. Просто она мне покажет, что вы там такого понаписали и почему не работает.🙂

Евгений
Евгений Автор

Mikhail Sukhov:

Евгений: Еще не отловил такой ситуации, чтобы отработали защитные стратегии - пробую. А подписка на событие QuotesChanged может изменить ситуацию?

Она не меняет ничего. Просто она мне покажет, что вы там такого понаписали и почему не работает.🙂

И не говорите, написал теперь вот покоя людям не даю 🙂 Ну тогда получается, что ситуация останется той же... А сообщение я вывел так

      private void Trader_QuotesChanged(IEnumerable<MarketDepth> obj)
              {
               MessageBox.Show(obj.First().Security.Code);
              }

Так регистрацию стакана нужно делать до запуска стратегии, а насколько до по времени? И принципиально ли место регистрации стакана, если я зарегистрирую ее в Running? Я уже думаю может причина не в том что стакан не приходит, а в самих защитных стратегиях. Может ли повлиять то, что я не снимаю стратегию, после того как сделка совершится по сигналу?

Евгений
Евгений Автор

Михаил, я кажется понял, почему происходит эта ошибка:

TPS <mark>14:11:52</mark>.7958984 System.ArgumentException: Коллекция котировок пуста. Имя параметра: quotes....

TPS <mark>18:45:26</mark>.1187618 System.ArgumentException: Коллекция котировок пуста. Имя параметра: quotes...

Стратегии продолжают работать во время клиринга, собственно, когда стакан пуст. Но тогда вопрос, как сделать, чтобы защитные стратегии не работали в это время? Для базовой стратегии условие на время работы выставлено в OnProcess()

if (base.Security.Exchange.IsTradeTime(base.Trader.MarketTime) == false)
            return StrategyProcessResults.Continue;
            
Евгений
Евгений Автор

Хелп ми плиз

Mikhail Sukhov
Mikhail Sukhov

Евгений: Хелп ми плиз

Есть стратегия на S#, которая работает только при наличие стакана. Стакан отсутствует. Но торговать все равно хотите. Вывод, или вам нужна другая стратегия, или доводите до ума эта. OnProcess правильно переопределили. Видимо нужно что-то еще.

InsiderHSE
InsiderHSE

Евгений: Хелп ми плиз Думаю можно попробовать отнаследоваться от защитной стратегии и точно так же переопределить OnProcess

Евгений
Евгений Автор

InsiderHSE:

Евгений: Хелп ми плиз Думаю можно попробовать отнаследоваться от защитной стратегии и точно так же переопределить OnProcess

Спасибо, я так и сделал, тестирую

Евгений
Евгений Автор

А как задать время работы защитных стратегий в версии 3.2.5? До этого я переопределял OnProcess и там указывал.

Alexander
Alexander

Евгений: А как задать время работы защитных стратегий в версии 3.2.5? До этого я переопределял OnProcess и там указывал.

Через When \ Do в When - указывайте время когда не хотите чтобы ваша стратегия работала

  • у Trader есть событие MarketTimeChanged
Евгений
Евгений Автор

Alexander:

Евгений: А как задать время работы защитных стратегий в версии 3.2.5? До этого я переопределял OnProcess и там указывал.

Через When \ Do в When - указывайте время когда не хотите чтобы ваша стратегия работала

  • у Trader есть событие MarketTimeChanged

А как через MarketTimeChanged можно? Мой вариант не работает, потому что коллекция ChildStrategies изменяется во время проверки

 _trader.MarketTimeChanged += () => this.GuiAsync(() =>
                        {
                            if (_strategy != null)
                            {
                                if (_strategy.ChildStrategies.Count != 0)
                                    if (_security.Exchange.IsTradeTime(_trader.MarketTime) == false)
                                    {
                                        foreach (var s in this._strategy.ChildStrategies.Where(s => s.ProcessState == StrategyProcessStates.Runned))
                                            s.Stop();
                                    }
                                    else
                                        foreach (var s in this._strategy.ChildStrategies.Where(s => s.ProcessState == StrategyProcessStates.Stopped))
                                            s.Start();
                            }
                        });
Alexander
Alexander

Евгений:

Alexander:

Евгений: А как задать время работы защитных стратегий в версии 3.2.5? До этого я переопределял OnProcess и там указывал.

Через When \ Do в When - указывайте время когда не хотите чтобы ваша стратегия работала

  • у Trader есть событие MarketTimeChanged

А как через MarketTimeChanged можно? Мой вариант не работает, потому что коллекция ChildStrategies изменяется во время проверки

_trader.MarketTimeChanged += () => this.GuiAsync(() => { if (_strategy != null) { if (_strategy.ChildStrategies.Count != 0) if (_security.Exchange.IsTradeTime(_trader.MarketTime) == false) { foreach (var s in this._strategy.ChildStrategies.Where(s => s.ProcessState == StrategyProcessStates.Runned)) s.Stop(); } else foreach (var s in this._strategy.ChildStrategies.Where(s => s.ProcessState == StrategyProcessStates.Stopped)) s.Start(); } });



копируйте прежде чем использовать, либо сделайте лок
Евгений
Евгений Автор

Возникает ошибка при логировании

             ```csharp

for (int i = 0; i < base.ChildStrategies.Count; i++) { [h]AddLog(StrategyErrorStates.None, "Удаление стратегии {0}", base.ChildStrategies[i].Name);[/h] base.ChildStrategies.RemoveAt(i); }


> System.NotSupportedException не обработано пользовательским кодом
>   Message=Указанный метод не поддерживается.
>   Source=Ecng.Collections
>   StackTrace:
>        в Ecng.Collections.SynchronizedSet`1.System.Collections.Generic.IList<T>.get_Item(Int32 index)
>        в Ecng.Collections.BaseCollection`1.get_Item(Int32 index)
>        в SampleSma.SmaStrategy.OnNewMyTrades(IEnumerable`1 trades) в D:\StockSharp_3.2.7_Sources\SmaStrategy.cs:строка 217
>        в System.Action`1.Invoke(T obj)
>        в Ecng.Common.DelegateHelper.SafeInvoke(Action`1 handler, T arg)
>        в StockSharp.Algo.Strategies.Strategy.#=qXQcTzmM0UE1f5yIY2j5kaA==(IEnumerable`1 #=qM5HbaFnvCFi7rkUr5cbHdQ==)
>        в StockSharp.Algo.Strategies.Strategy.#=qM0$gqkXG3MPOkX0bnBfw2A==(IEnumerable`1 #=qL4wEoMHRTP$ON_GriBYYEA==)
>        в System.Action`1.Invoke(T obj)
>        в Ecng.Common.DelegateHelper.SafeInvoke(Action`1 handler, T arg)
>        в StockSharp.Algo.Testing.RealTimeEmulationTrader`1.#=qPIAOBkVt1MhD9DGmazWqFXVeVjc6WER7AoUQ0gK7Sec=(IEnumerable`1 #=qWC4Z1rz_RGQAUzeSh1Cphw==)
>        в Ecng.Common.DelegateHelper.SafeInvoke(Action`1 handler, T arg)
>        в StockSharp.Algo.Testing.MarketEmulator.RaiseNewMyTrades(IEnumerable`1 trades)
>        в StockSharp.Algo.Testing.MarketEmulator.#=q2J23UVF1zXonLRlbjK309w==(Order #=q0wnjY82As$lGM3$R70XXZA==, Int32 #=qri0DP6B4pNy7fx3oHmxVqA==, Decimal #=quoai2hjCHpHfZ1q8j3z$ew==)
>        в StockSharp.Algo.Testing.MarketEmulator.#=qE7E7qt9g1c47ZkBqOFQjyQFedGLvvuLEiZjEuWXdWe8=(MarketDepth #=qtMm0MpCgzrjyUmIY37DQGQ==, Order #=qN7KRs9k9LSYRBZ6MhxRoHA==, Quote #=qN7Znv2zz9zpDeRNGHg_Wow==, Boolean #=qreLQ9GB8WhUEds76X0M828yCTL2n9cda$8T1MfjlO18=)
>        в StockSharp.Algo.Testing.MarketEmulator.#=qUkyP0_M9OMEy$SkKYfYJOtahWlDktGcqM5WL10p_80s=(Order #=qghTCyYil3z9plTAIH0h7ZQ==, MarketDepth #=qLR63QCgY7j2YwdM8UiJ_RA==)
>        в StockSharp.Algo.Testing.MarketEmulator.#=qtVjIJmyUftYFmfFY5O4f0g==(SynchronizedDictionary`2 #=q9J8oLVIQhe2_0P3XQ18a7Q==)
>        в Ecng.Collections.CollectionHelper.SyncDo[TCollection](TCollection collection, Action`1 action)
>        в StockSharp.Algo.Testing.MarketEmulator.#=qcAGUpJziDHjwYUgUkdFL0g==()
>        в StockSharp.Algo.Testing.MarketEmulator.UpdateQuotes(IEnumerable`1 marketDepths)
>        в StockSharp.Algo.Testing.RealTimeEmulationTrader`1.#=q0xtw_MzKkmFKPWfyFMG2VeXM$PE6NDpWY9PTT7IQgHE=(IEnumerable`1 #=qa1P$uiol4QhZBoQzjZJhMw==)
>        в System.Action`1.Invoke(T obj)
>        в Ecng.Common.DelegateHelper.SafeInvoke(Action`1 handler, T arg)
>        в StockSharp.Algo.BaseTrader.#=qifrQr7se$_OPI_WBxefq0RZ$hXHpoMKbn3PHl9eAJYM=.#=qq46wFSKy$Z5naYx_yW1qIw==(IEnumerable`1 #=q_TiYF80HDzj2r9IIRRL14g==)
>   InnerException:
Alexander
Alexander

Возникает ошибка при логировании

             ```csharp

for (int i = 0; i < base.ChildStrategies.Count; i++) { [h]AddLog(StrategyErrorStates.None, "Удаление стратегии {0}", base.ChildStrategies[i].Name);[/h] base.ChildStrategies.RemoveAt(i); }


> System.NotSupportedException не обработано пользовательским кодом
>   Message=Указанный метод не поддерживается.
>   Source=Ecng.Collections
>   StackTrace:
>        в Ecng.Collections.SynchronizedSet`1.System.Collections.Generic.IList<T>.get_Item(Int32 index)
>        в Ecng.Collections.BaseCollection`1.get_Item(Int32 index)
>        в SampleSma.SmaStrategy.OnNewMyTrades(IEnumerable`1 trades) в D:\StockSharp_3.2.7_Sources\SmaStrategy.cs:строка 217
>        в System.Action`1.Invoke(T obj)
>        в Ecng.Common.DelegateHelper.SafeInvoke(Action`1 handler, T arg)
>        в StockSharp.Algo.Strategies.Strategy.#=qXQcTzmM0UE1f5yIY2j5kaA==(IEnumerable`1 #=qM5HbaFnvCFi7rkUr5cbHdQ==)
>        в StockSharp.Algo.Strategies.Strategy.#=qM0$gqkXG3MPOkX0bnBfw2A==(IEnumerable`1 #=qL4wEoMHRTP$ON_GriBYYEA==)
>        в System.Action`1.Invoke(T obj)
>        в Ecng.Common.DelegateHelper.SafeInvoke(Action`1 handler, T arg)
>        в StockSharp.Algo.Testing.RealTimeEmulationTrader`1.#=qPIAOBkVt1MhD9DGmazWqFXVeVjc6WER7AoUQ0gK7Sec=(IEnumerable`1 #=qWC4Z1rz_RGQAUzeSh1Cphw==)
>        в Ecng.Common.DelegateHelper.SafeInvoke(Action`1 handler, T arg)
>        в StockSharp.Algo.Testing.MarketEmulator.RaiseNewMyTrades(IEnumerable`1 trades)
>        в StockSharp.Algo.Testing.MarketEmulator.#=q2J23UVF1zXonLRlbjK309w==(Order #=q0wnjY82As$lGM3$R70XXZA==, Int32 #=qri0DP6B4pNy7fx3oHmxVqA==, Decimal #=quoai2hjCHpHfZ1q8j3z$ew==)
>        в StockSharp.Algo.Testing.MarketEmulator.#=qE7E7qt9g1c47ZkBqOFQjyQFedGLvvuLEiZjEuWXdWe8=(MarketDepth #=qtMm0MpCgzrjyUmIY37DQGQ==, Order #=qN7KRs9k9LSYRBZ6MhxRoHA==, Quote #=qN7Znv2zz9zpDeRNGHg_Wow==, Boolean #=qreLQ9GB8WhUEds76X0M828yCTL2n9cda$8T1MfjlO18=)
>        в StockSharp.Algo.Testing.MarketEmulator.#=qUkyP0_M9OMEy$SkKYfYJOtahWlDktGcqM5WL10p_80s=(Order #=qghTCyYil3z9plTAIH0h7ZQ==, MarketDepth #=qLR63QCgY7j2YwdM8UiJ_RA==)
>        в StockSharp.Algo.Testing.MarketEmulator.#=qtVjIJmyUftYFmfFY5O4f0g==(SynchronizedDictionary`2 #=q9J8oLVIQhe2_0P3XQ18a7Q==)
>        в Ecng.Collections.CollectionHelper.SyncDo[TCollection](TCollection collection, Action`1 action)
>        в StockSharp.Algo.Testing.MarketEmulator.#=qcAGUpJziDHjwYUgUkdFL0g==()
>        в StockSharp.Algo.Testing.MarketEmulator.UpdateQuotes(IEnumerable`1 marketDepths)
>        в StockSharp.Algo.Testing.RealTimeEmulationTrader`1.#=q0xtw_MzKkmFKPWfyFMG2VeXM$PE6NDpWY9PTT7IQgHE=(IEnumerable`1 #=qa1P$uiol4QhZBoQzjZJhMw==)
>        в System.Action`1.Invoke(T obj)
>        в Ecng.Common.DelegateHelper.SafeInvoke(Action`1 handler, T arg)
>        в StockSharp.Algo.BaseTrader.#=qifrQr7se$_OPI_WBxefq0RZ$hXHpoMKbn3PHl9eAJYM=.#=qq46wFSKy$Z5naYx_yW1qIw==(IEnumerable`1 #=q_TiYF80HDzj2r9IIRRL14g==)
>   InnerException:


А судя по стэктрэйсу - ошибка вовсе не при логировании:
> в Ecng.Collections.SynchronizedSet`1.System.Collections.Generic.IList<T>.get_Item(Int32 index)
> в Ecng.Collections.BaseCollection`1.get_Item(Int32 index)
> в <mark>SampleSma.SmaStrategy.OnNewMyTrades(IEnumerable`1 trades) в D:\StockSharp_3.2.7_Sources\SmaStrategy.cs:строка 217</mark>

судя по всему - это что-то ваше, внутреннее. в исходниках в SmaStrategy.cs заметно меньше строчек :)
Евгений
Евгений Автор

А судя по стэктрэйсу - ошибка вовсе не при логировании: Цитата: в Ecng.Collections.SynchronizedSet1.System.Collections.Generic.IList<T>.get_Item(Int32 index) в Ecng.Collections.BaseCollection1.get_Item(Int32 index) в SampleSma.SmaStrategy.OnNewMyTrades(IEnumerable`1 trades) в D:\StockSharp_3.2.7_Sources\SmaStrategy.cs:строка 217

судя по всему - это что-то ваше, внутреннее. в исходниках в SmaStrategy.cs заметно меньше строчек :)

Да, пример переделанный, Александр, вы прям Шерлок Хомс :) я добавил в OnNewMyTrades обработку защитных стратегий. Так, а в чем ошибка, я тогда не понимаю...

Как я выяснил сейчас, ошибка возникает и в строке ```csharp AddLog(StrategyErrorStates.None, "Удаление стратегии {0}", base.ChildStrategies[i].Name);


и в ```csharp
base.ChildStrategies.RemoveAt(i);

Метод есть, но он не поддерживается... При чем я помню, что в какой-то версии S# этот код работал...

Alexander
Alexander

что у вас на 217 строчке файла?

Евгений
Евгений Автор

Alexander: что у вас на 217 строчке файла?

AddLog(StrategyErrorStates.None, "Удаление стратегии {0}", base.ChildStrategies[i].Name);
Alexander
Alexander

В 3.2.9 ошибка осталась?

Евгений
Евгений Автор

Alexander: В 3.2.9 ошибка осталась?

А уже есть 3.2.9? На боксе и на кодплех не вижу...

Alexander
Alexander

Евгений:

Alexander: В 3.2.9 ошибка осталась?

А уже есть 3.2.9? На боксе и на кодплех не вижу...

Скоро будет 😎 Поспешил я.

Евгений
Евгений Автор

Alexander:

Евгений:

Alexander: В 3.2.9 ошибка осталась?

А уже есть 3.2.9? На боксе и на кодплех не вижу...

Скоро будет 😎 Поспешил я.

Ошибка осталась.

Alexander
Alexander

Да, нет доступа по [] и GetItem не поддерживается. А сильно надо?

Евгений
Евгений Автор

Alexander: Да, нет доступа по [] и GetItem не поддерживается. А сильно надо?

Собственно задача в том, чтобы защитные стратегии выставленные при покупке удалить после сделки продажи на основе сигнала. Может как-то это можно сделать по другому?

Alexander
Alexander

Евгений:

Alexander: Да, нет доступа по [] и GetItem не поддерживается. А сильно надо?

Собственно задача в том, чтобы защитные стратегии выставленные при покупке удалить после сделки продажи на основе сигнала. Может как-то это можно сделать по другому?

Так они автоматом удаляются :)

Евгений
Евгений Автор

Alexander:

Евгений:

Alexander: Да, нет доступа по [] и GetItem не поддерживается. А сильно надо?

Собственно задача в том, чтобы защитные стратегии выставленные при покупке удалить после сделки продажи на основе сигнала. Может как-то это можно сделать по другому?

Так они автоматом удаляются :)

Ситуация. Сигнал на покупку. Покупка. Создание защитной стратегии. Сигнал на продажу (защитная стратегия не начала свою работу). Продажа. В такой ситуации защитная стратегия автоматически удаляется?

А еще я получил такой лог, но может он уже не актуальный (в.3.2.7). Тут защитная стратегия продолжает свою работу несколько раз.

IS 16.08.2011 10:34:37.134 Стратегия запущена. IS 16.08.2011 17:30:01.313 Регистрация заявки - цена 162565, направление Buy, объем 3 IS 16.08.2011 17:30:02.234 Новая Limit заявка 38070639 на Buy с номером 1. IS 16.08.2011 17:30:02.468 Новая Buy сделка 1 на 3 заявки 38070639. IS 16.08.2011 17:30:02.903 Прошла сделка по цене 161715, объём 3, направление Buy. IS 16.08.2011 17:30:03.094 Регистрация стоп-лосс по цене 160277,87500 IS 16.08.2011 17:30:03.094 Регистрация тейк-профит по цене 163152,12500 IS 16.08.2011 17:30:03.122 [BS] Стратегия запущена. IS 16.08.2011 17:30:03.132 [BS] [BS] Стратегия запущена. IS 16.08.2011 17:30:03.132 [BS] [BS] [MTPS] Стратегия запущена. IS 16.08.2011 17:30:03.141 [BS] [BS] [MSLS] Стратегия запущена. IS 16.08.2011 17:36:01.087 [BS] [BS] [MTPS] Регистрация новой заявки на Sell с ценой 162215 и объемом 3. IS 16.08.2011 17:36:01.089 [BS] [BS] [MTPS] Заявка 38070640 на Sell отправлена с ценой 162215 объемом 3. IS 16.08.2011 17:36:02.097 [BS] [BS] [MTPS] Новая Limit заявка 38070640 на Sell с номером 2. IS 16.08.2011 17:36:02.097 [BS] [BS] Новая Limit заявка 38070640 на Sell с номером 2. IS 16.08.2011 17:36:02.097 [BS] Новая Limit заявка 38070640 на Sell с номером 2. IS 16.08.2011 17:36:02.098 Новая Limit заявка 38070640 на Sell с номером 2. IS 16.08.2011 17:36:02.098 Новая Sell сделка 2 на 3 заявки 38070640. IS 16.08.2011 17:36:02.099 Прошла сделка по цене 162270, объём 3, направление Sell. IS 16.08.2011 17:40:37.909 [BS] [BS] [MTPS] Котируемая заявка 38070640 исполнилась. IS 16.08.2011 17:40:37.910 [BS] [BS] [MTPS] Регистрация новой заявки на Sell с ценой 162215 и объемом 3. IS 16.08.2011 17:40:37.911 [BS] [BS] [MTPS] Заявка 38070641 на Sell отправлена с ценой 162215 объемом 3. IS 16.08.2011 17:40:38.924 [BS] [BS] [MTPS] Новая Limit заявка 38070641 на Sell с номером 3. IS 16.08.2011 17:40:38.924 [BS] [BS] Новая Limit заявка 38070641 на Sell с номером 3. IS 16.08.2011 17:40:38.924 [BS] Новая Limit заявка 38070641 на Sell с номером 3. IS 16.08.2011 17:40:38.924 Новая Limit заявка 38070641 на Sell с номером 3. IS 16.08.2011 17:49:33.358 [BS] [BS] [MSLS] Регистрация новой заявки на Sell с ценой 161215 и объемом 3. IS 16.08.2011 17:49:33.358 [BS] [BS] [MSLS] Заявка 38070642 на Sell отправлена с ценой 161215 объемом 3. IS 16.08.2011 17:49:34.370 [BS] [BS] [MSLS] Новая Limit заявка 38070642 на Sell с номером 4. IS 16.08.2011 17:49:34.370 [BS] [BS] Новая Limit заявка 38070642 на Sell с номером 4. IS 16.08.2011 17:49:34.370 [BS] Новая Limit заявка 38070642 на Sell с номером 4. IS 16.08.2011 17:49:34.370 Новая Limit заявка 38070642 на Sell с номером 4. IS 16.08.2011 17:49:43.497 Новая Sell сделка 3 на 3 заявки 38070642. IS 16.08.2011 17:49:43.500 Прошла сделка по цене 161215, объём 3, направление Sell. IS 16.08.2011 17:51:16.790 [BS] [BS] [MSLS] Котируемая заявка 38070642 исполнилась. IS 16.08.2011 17:51:16.790 [BS] [BS] [MSLS] Регистрация новой заявки на Sell с ценой 161215 и объемом 3. IS 16.08.2011 17:51:16.792 [BS] [BS] [MSLS] Заявка 38070643 на Sell отправлена с ценой 161215 объемом 3. IS 16.08.2011 17:51:17.802 [BS] [BS] [MSLS] Новая Limit заявка 38070643 на Sell с номером 5. IS 16.08.2011 17:51:17.802 [BS] [BS] Новая Limit заявка 38070643 на Sell с номером 5. IS 16.08.2011 17:51:17.802 [BS] Новая Limit заявка 38070643 на Sell с номером 5. IS 16.08.2011 17:51:17.802 Новая Limit заявка 38070643 на Sell с номером 5.

Евгений
Евгений Автор

Так защитная стратегия автоматически удаляется после сделки на продажу, даже если не сработала?

Mikhail Sukhov
Mikhail Sukhov

Евгений: Так защитная стратегия автоматически удаляется после сделки на продажу, даже если не сработала?

Защитная стратегия (пара СЛ + ТП) удаляется тогда, когда одна из них закончила свою работу (выставила заявку и по ней была совершена сделка).

Евгений
Евгений Автор

Mikhail Sukhov:

Евгений: Так защитная стратегия автоматически удаляется после сделки на продажу, даже если не сработала?

Защитная стратегия (пара СЛ + ТП) удаляется тогда, когда одна из них закончила свою работу (выставила заявку и по ней была совершена сделка).

Ну значит я все правильно понял. Так а ак тогда удалить стратегию если она не закончила свою работу?

Mikhail Sukhov
Mikhail Sukhov

Евгений: Ну значит я все правильно понял. Так а ак тогда удалить стратегию если она не закончила свою работу?

Остановить ее через метод Stop.

Евгений
Евгений Автор

Mikhail Sukhov:

Евгений: Ну значит я все правильно понял. Так а ак тогда удалить стратегию если она не закончила свою работу?

Остановить ее через метод Stop.

Ну она же в коллекции останется?

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

Alexander
Alexander

Евгений:

Mikhail Sukhov:

Евгений: Ну значит я все правильно понял. Так а ак тогда удалить стратегию если она не закончила свою работу?

Остановить ее через метод Stop.

Ну она же в коллекции останется?

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

Запомните какие стратегии надо включать, какие - нет. Зачем отключать стратегии в не торговое время?

Евгений
Евгений Автор

Alexander: Запомните какие стратегии надо включать, какие - нет. Зачем отключать стратегии в не торговое время?

Ну как я понял защитные стратегии продолжают работать во время клиринга, собственно, когда стакан пуст. И возникает ошибка, о чем я писал выше.

TPS 14:11:52.7958984 System.ArgumentException: Коллекция котировок пуста. Имя параметра: quotes.....

Защитные стратегии могут работать без использования стакана?

Alexander
Alexander

Исправил, такой ошибки больше не будет. Спасибо за фидбэк

Евгений
Евгений Автор

Alexander: Исправил, такой ошибки больше не будет. Спасибо за фидбэк

Пожалуйста 🙂 Так, а как мне быть с проверкой? Что конкретно вы исправили?

Alexander
Alexander

Евгений:

Alexander: Исправил, такой ошибки больше не будет. Спасибо за фидбэк

Пожалуйста 🙂 Так, а как мне быть с проверкой? Что конкретно вы исправили?

Не будет эксепшена во время клиринга на тему пустой коллекции. Вам же ничего не надо делать, никаких проверок.

Евгений
Евгений Автор

Получаю такой лог

IS 01.09.2011 10:43:20.104 Стратегия запущена. IS 01.09.2011 15:30:00.125 Регистрация заявки - цена 167580, направление Buy, объем 5 IS 01.09.2011 15:30:00.447 Новая Limit заявка 38614866 на Buy с номером 1. IS 01.09.2011 15:30:00.457 Новая Buy сделка 1 на 5 заявки 38614866. IS 01.09.2011 15:30:00.471 Прошла сделка по цене 166745, объём 5, направление Buy. IS 01.09.2011 15:30:00.525 Регистрация тейк-профит по цене 168194,99500 IS 01.09.2011 15:30:00.527 [BS] Стратегия запущена. IS 01.09.2011 15:30:00.528 [BS] [BS] Стратегия запущена. IS 01.09.2011 15:30:00.528 [BS] [BS] [TPS] Стратегия запущена. IS 01.09.2011 15:34:50.512 [BS] [BS] [TPS] Стакан пустой. IS 01.09.2011 16:11:56.261 [BS] [BS] [TPS] Регистрация новой заявки на Sell с ценой 167245 и объемом 5. IS 01.09.2011 16:11:56.262 [BS] [BS] [TPS] Заявка 38614867 на Sell отправлена с ценой 167245 объемом 5. IS 01.09.2011 16:11:57.264 [BS] [BS] [TPS] Новая Limit заявка 38614867 на Sell с номером 2. IS 01.09.2011 16:11:57.264 [BS] [BS] Новая Limit заявка 38614867 на Sell с номером 2. IS 01.09.2011 16:11:57.264 [BS] Новая Limit заявка 38614867 на Sell с номером 2. IS 01.09.2011 16:11:57.264 Новая Limit заявка 38614867 на Sell с номером 2. IS 01.09.2011 16:11:57.266 Новая Sell сделка 2 на 2 заявки 38614867. IS 01.09.2011 16:11:57.267 Прошла сделка по цене 167250, объём 2, направление Sell. IS 01.09.2011 16:11:57.267 [BS] Новая Sell сделка 2 на 2 заявки 38614867. IS 01.09.2011 16:11:57.267 [BS] [BS] Новая Sell сделка 2 на 2 заявки 38614867. IS 01.09.2011 16:11:57.267 [BS] [BS] [TPS] Новая Sell сделка 2 на 2 заявки 38614867. IS 01.09.2011 16:11:57.269 [BS] [BS] [TPS] Позиция изменилась на -2. IS 01.09.2011 16:11:58.264 Новая Sell сделка 3 на 1 заявки 38614867. IS 01.09.2011 16:11:58.264 Прошла сделка по цене 167250, объём 1, направление Sell. IS 01.09.2011 16:11:58.264 [BS] Новая Sell сделка 3 на 1 заявки 38614867. IS 01.09.2011 16:11:58.264 [BS] [BS] Новая Sell сделка 3 на 1 заявки 38614867. IS 01.09.2011 16:11:58.265 [BS] [BS] [TPS] Новая Sell сделка 3 на 1 заявки 38614867. IS 01.09.2011 16:11:58.265 [BS] [BS] [TPS] Позиция изменилась на -3. IS 01.09.2011 16:11:59.263 Новая Sell сделка 4 на 2 заявки 38614867. IS 01.09.2011 16:11:59.263 Прошла сделка по цене 167255, объём 2, направление Sell. <mark>IS 01.09.2011 16:11:59.263 Стратегия-1 остановлена </mark> IS 01.09.2011 16:12:01.261 [BS] [BS] [TPS] Котируемая заявка 38614867 исполнилась. IS 01.09.2011 16:12:01.262 [BS] [BS] [TPS] Регистрация новой заявки на Sell с ценой 167245 и объемом 5. IS 01.09.2011 16:12:01.264 [BS] [BS] [TPS] Заявка 38614868 на Sell отправлена с ценой 167245 объемом 5. IS 01.09.2011 16:12:02.264 [BS] [BS] [TPS] Новая Limit заявка 38614868 на Sell с номером 3. IS 01.09.2011 16:12:02.264 [BS] [BS] Новая Limit заявка 38614868 на Sell с номером 3. IS 01.09.2011 16:12:02.264 [BS] Новая Limit заявка 38614868 на Sell с номером 3. IS 01.09.2011 16:12:02.264 Новая Limit заявка 38614868 на Sell с номером 3.

Я останавливаю защитную стратегию через метод Stop(), а она все равно продолжает выставлять заявку... Почему?

Alexander
Alexander

Получаю такой лог

IS 01.09.2011 10:43:20.104 Стратегия запущена. IS 01.09.2011 15:30:00.125 Регистрация заявки - цена 167580, направление Buy, объем 5 IS 01.09.2011 15:30:00.447 Новая Limit заявка 38614866 на Buy с номером 1. IS 01.09.2011 15:30:00.457 Новая Buy сделка 1 на 5 заявки 38614866. IS 01.09.2011 15:30:00.471 Прошла сделка по цене 166745, объём 5, направление Buy. IS 01.09.2011 15:30:00.525 Регистрация тейк-профит по цене 168194,99500 IS 01.09.2011 15:30:00.527 [BS] Стратегия запущена. IS 01.09.2011 15:30:00.528 [BS] [BS] Стратегия запущена. IS 01.09.2011 15:30:00.528 [BS] [BS] [TPS] Стратегия запущена. IS 01.09.2011 15:34:50.512 [BS] [BS] [TPS] Стакан пустой. IS 01.09.2011 16:11:56.261 [BS] [BS] [TPS] Регистрация новой заявки на Sell с ценой 167245 и объемом 5. IS 01.09.2011 16:11:56.262 [BS] [BS] [TPS] Заявка 38614867 на Sell отправлена с ценой 167245 объемом 5. IS 01.09.2011 16:11:57.264 [BS] [BS] [TPS] Новая Limit заявка 38614867 на Sell с номером 2. IS 01.09.2011 16:11:57.264 [BS] [BS] Новая Limit заявка 38614867 на Sell с номером 2. IS 01.09.2011 16:11:57.264 [BS] Новая Limit заявка 38614867 на Sell с номером 2. IS 01.09.2011 16:11:57.264 Новая Limit заявка 38614867 на Sell с номером 2. IS 01.09.2011 16:11:57.266 Новая Sell сделка 2 на 2 заявки 38614867. IS 01.09.2011 16:11:57.267 Прошла сделка по цене 167250, объём 2, направление Sell. IS 01.09.2011 16:11:57.267 [BS] Новая Sell сделка 2 на 2 заявки 38614867. IS 01.09.2011 16:11:57.267 [BS] [BS] Новая Sell сделка 2 на 2 заявки 38614867. IS 01.09.2011 16:11:57.267 [BS] [BS] [TPS] Новая Sell сделка 2 на 2 заявки 38614867. IS 01.09.2011 16:11:57.269 [BS] [BS] [TPS] Позиция изменилась на -2. IS 01.09.2011 16:11:58.264 Новая Sell сделка 3 на 1 заявки 38614867. IS 01.09.2011 16:11:58.264 Прошла сделка по цене 167250, объём 1, направление Sell. IS 01.09.2011 16:11:58.264 [BS] Новая Sell сделка 3 на 1 заявки 38614867. IS 01.09.2011 16:11:58.264 [BS] [BS] Новая Sell сделка 3 на 1 заявки 38614867. IS 01.09.2011 16:11:58.265 [BS] [BS] [TPS] Новая Sell сделка 3 на 1 заявки 38614867. IS 01.09.2011 16:11:58.265 [BS] [BS] [TPS] Позиция изменилась на -3. IS 01.09.2011 16:11:59.263 Новая Sell сделка 4 на 2 заявки 38614867. IS 01.09.2011 16:11:59.263 Прошла сделка по цене 167255, объём 2, направление Sell. <mark>IS 01.09.2011 16:11:59.263 Стратегия-1 остановлена </mark> IS 01.09.2011 16:12:01.261 [BS] [BS] [TPS] Котируемая заявка 38614867 исполнилась. IS 01.09.2011 16:12:01.262 [BS] [BS] [TPS] Регистрация новой заявки на Sell с ценой 167245 и объемом 5. IS 01.09.2011 16:12:01.264 [BS] [BS] [TPS] Заявка 38614868 на Sell отправлена с ценой 167245 объемом 5. IS 01.09.2011 16:12:02.264 [BS] [BS] [TPS] Новая Limit заявка 38614868 на Sell с номером 3. IS 01.09.2011 16:12:02.264 [BS] [BS] Новая Limit заявка 38614868 на Sell с номером 3. IS 01.09.2011 16:12:02.264 [BS] Новая Limit заявка 38614868 на Sell с номером 3. IS 01.09.2011 16:12:02.264 Новая Limit заявка 38614868 на Sell с номером 3.

Я останавливаю защитную стратегию через метод Stop(), а она все равно продолжает выставлять заявку... Почему?

А что за Стратегия-1? Покажите где и как останавливаете. Какая версия S#?

Евгений
Евгений Автор

Версия 3.2.10

private void OnNewMyTrades(IEnumerable<MyTrade> trades)
        {

            foreach (var trade in trades)
            {
                AddLog(StrategyErrorStates.None, "Прошла сделка по цене {0}, объём {1}, направление {2}.",
                       trade.Trade.Price, trade.Trade.Volume, trade.Order.Direction);
            }

            // смотрим последнюю сделку, следующая должна быть противоположная
            if (trades.Last().Order.IsMatched() && trades.Last().Order.Direction == OrderDirections.Buy)
            {
                CurrentDirection = OrderDirections.Sell;

            }
            else if (trades.Last().Order.IsMatched() && trades.Last().Order.Direction == OrderDirections.Sell)
            {
                CurrentDirection = OrderDirections.Buy;

                for (int i = 0; i < base.ChildStrategies.Count; i++)
                {
                    AddLog(StrategyErrorStates.None, "Стратегия-{0} остановлена", i+1); 
                    base.ChildStrategies[i].Stop();
                }
                return;
            }
...

Евгений
Евгений Автор

Публиковал код и видимо случайно удалил собственно строчку - base.ChildStrategies.Stop();

Alexander
Alexander

Евгений: Публиковал код и видимо случайно удалил собственно строчку - base.ChildStrategies.Stop();

Распечатайте ProcessState до и после этой строчки.

Евгений
Евгений Автор

Alexander:

Евгений: Публиковал код и видимо случайно удалил собственно строчку - base.ChildStrategies.Stop();

Распечатайте ProcessState до и после этой строчки.

Чего то, так и не получилось отловить это место. Но вот при отработке тейк-профита один раз, он потом отрабатывает еще раз. Может я что-то не так делаю(

Вот лог:

IS 26.09.2011 09:36:16.750 Стратегия запущена. IS 26.09.2011 13:30:01.062 Регистрация заявки - цена 130140, направление Buy, объем 1 IS 26.09.2011 13:30:02.312 Новая Limit заявка 35415266 на Buy с номером 910341082. IS 26.09.2011 13:30:07.921 Новая Buy сделка 33476407 на 1 заявки 35415266. IS 26.09.2011 13:30:08.296 Прошла сделка по цене 128595, объём 1, направление Buy. IS 26.09.2011 13:30:08.296 Смена направления на Sell IS 26.09.2011 13:30:08.484 Регистрация тейк-профит по цене 133433,64000 IS 26.09.2011 13:30:08.500 [BS] Стратегия запущена. IS 26.09.2011 13:30:08.500 [BS] [BS] Стратегия запущена. IS 26.09.2011 13:30:08.500 [BS] [BS] [TPS] Стратегия запущена. IS 26.09.2011 13:32:19.218 [BS] [BS] [TPS] Регистрация новой заявки на Sell с ценой 130095 и объемом 1. IS 26.09.2011 13:32:19.828 [BS] [BS] [TPS] Заявка 35415267 на Sell отправлена с ценой 130095 объемом 1. IS 26.09.2011 13:32:19.828 [BS] [BS] [TPS] Новая Limit заявка 35415267 на Sell с номером 910360134. IS 26.09.2011 13:32:19.828 [BS] [BS] Новая Limit заявка 35415267 на Sell с номером 910360134. IS 26.09.2011 13:32:19.828 [BS] Новая Limit заявка 35415267 на Sell с номером 910360134. IS 26.09.2011 13:32:19.828 Новая Limit заявка 35415267 на Sell с номером 910360134. IS 26.09.2011 13:45:29.765 [BS] [BS] [TPS] Котируемая заявка 35415267 исполнилась. IS 26.09.2011 13:45:29.765 [BS] [BS] [TPS] Регистрация новой заявки на Sell с ценой 130095 и объемом 1. IS 26.09.2011 13:45:31.578 [BS] [BS] [TPS] Заявка 35415268 на Sell отправлена с ценой 130095 объемом 1. IS 26.09.2011 13:45:31.578 [BS] [BS] [TPS] Заканчиваем котирование с неисполненным объемом равный 0. IS 26.09.2011 13:45:31.578 [BS] Стратегия останавливается. IS 26.09.2011 13:45:31.593 [BS] [BS] Стратегия останавливается. IS 26.09.2011 13:45:31.593 [BS] [BS] [TPS] Позиция изменилась на -1. IS 26.09.2011 13:45:31.593 [BS] [BS] [TPS] Заканчиваем котирование с неисполненным объемом равный 0. IS 26.09.2011 13:45:31.593 [BS] [BS] [TPS] Заканчиваем котирование с неисполненным объемом равный 0. IS 26.09.2011 13:45:31.593 Новая Sell сделка 33484400 на 1 заявки 35415267. IS 26.09.2011 13:45:31.593 Прошла сделка по цене 130095, объём 1, направление Sell. IS 26.09.2011 13:45:31.593 Смена направления на Buy IS 26.09.2011 13:45:31.625 [BS] [BS] [TPS] Стратегия останавливается. IS 26.09.2011 13:45:31.625 [BS] [BS] [TPS] Заканчиваем котирование с неисполненным объемом равный 0. IS 26.09.2011 13:45:31.640 [BS] Стратегия остановлена.

А вот код:

 foreach (var trade in trades)
            {
                AddLog(StrategyErrorStates.None, "Прошла сделка по цене {0}, объём {1}, направление {2}.",
                       trade.Trade.Price, trade.Trade.Volume, trade.Order.Direction);
            }

            // смотрим последнюю сделку, следующая должна быть противоположная
            if (trades.Last().Order.IsMatched() && trades.Last().Order.Direction == OrderDirections.Buy)
            {
                CurrentDirection = OrderDirections.Sell;
                AddLog(StrategyErrorStates.None, "Смена направления на {0}",  OrderDirections.Sell);

            }
            else if (trades.Last().Order.IsMatched() && trades.Last().Order.Direction == OrderDirections.Sell)
            {
                CurrentDirection = OrderDirections.Buy;
                 AddLog(StrategyErrorStates.None, "Смена направления на {0}",  OrderDirections.Buy);

                for (int i = 0; i < base.ChildStrategies.Count; i++)
                {
                    AddLog(StrategyErrorStates.None, "Состояние алгоритма: {0}", ChildStrategies[i].ProcessState);
                    base.ChildStrategies[i].Stop();
                    AddLog(StrategyErrorStates.None, "Состояние алгоритма: {0}", ChildStrategies[i].ProcessState);
                    AddLog(StrategyErrorStates.None, "Стратегия - {0} остановлена", i);
                }
                return;
            }

            // фильтруем сделки, чтобы найти те, которые произошли для заявки TargetOrder// сделать проверку не на последнюю                    заявку а на все заявки которые
            trades = trades.Where(t => t.Order == _order);

            // если не найдена ни одна сделка для заявки TargetOrder
            if (trades.Count() == 0)
                return;

            // сама пакетная стратегия так же является параллельной, чтобы она не блокирована основной код робота
            var batch = new BatchStrategy(BatchFinishModes.All);

            // для каждой сделки добавляем для защиты по пакетной стратегии
            batch.ChildStrategies.AddRange(trades.Select(t =>
            {

                var s = new BatchStrategy(BatchFinishModes.First);

                // выставляет тейк-профит в N пунктов
                var takeProfit = new TakeProfitStrategy(t, _takeDelta);

                takeProfit.PriceOffset =  _priceDelta;

                s.ChildStrategies.Add(takeProfit);
               

               
AddLog(StrategyErrorStates.None, "Регистрация тейк-профит по цене {0}", t.Trade.Price + ((decimal)takeProfit.ProtectiveDelta).Points(Security));

                return s;

            }).Cast<Strategy>());



            if (batch.ChildStrategies.Count > 0)
            {
                base.ChildStrategies.Add(batch);
            }
Alexander
Alexander

Какая версия? Если не 4.0.0 - попробуйте её.

Евгений
Евгений Автор

Alexander: Какая версия? Если не 4.0.0 - попробуйте её.

Попробовал 4.0.0

Получил такой лог:

12:40:01.540 | | IS | Регистрация заявки - цена 137550, направление Buy, объем 1 12:40:02.118 | | QuikTrader | RegisterOrder: TransactionId=42266635, Id=0, Price=137550, Balance=1, Security=RIZ1@RTS, State=None <mark>12:40:09.947 | Error | IS | Заявка 42266635 не была принята по причине StockSharp.Quik.ApiException: Код ошибки Failed Сообщение Обработка кросс-заявок блокирована..</mark> 14:00:57.306 | Error | QuikTrader | StockSharp.Quik.ApiException: Код ошибки QuikDisconnected Сообщение Timeout has expired. Connection with server was lost.: Can't get data from net 14:30:00.556 | | IS | Регистрация заявки - цена 136405, направление Buy, объем 1 14:30:00.556 | | QuikTrader | RegisterOrder: TransactionId=42266636, Id=0, Price=136405, Balance=1, Security=RIZ1@RTS, State=None 14:30:02.447 | | QuikTrader | New order: TransactionId=42266636, Id=921107262, Price=136405, Balance=1, Security=RIZ1@RTS, State=Active 14:30:02.462 | | IS | Обработка Limit заявки 42266636 на Buy с номером 921107262. 14:30:05.150 | | IS | Новая Buy сделка 34183750 на 1 заявки 42266636. 14:30:06.322 | | IS | Прошла сделка по цене 134890, объём 1, направление Buy. 14:30:06.322 | | IS | Смена направления на Sell 14:30:06.853 | | IS | Регистрация тейк-профит по цене 139662,14500 14:30:06.884 | | BS | Стратегия запущена. 14:30:06.884 | | BS | Стратегия запущена. 14:30:06.900 | | TPS | Стратегия запущена. 14:39:15.962 | | TPS | Регистрация новой заявки на Sell с ценой 136390 и объемом 1. 14:39:15.962 | | QuikTrader | RegisterOrder: TransactionId=42266637, Id=0, Price=136390, Balance=1, Security=RIZ1@RTS, State=None 14:39:15.978 | | TPS | Заявка 42266637 на Sell отправлена с ценой 136390 объемом 1. 14:39:28.525 | | QuikTrader | New order: TransactionId=42266637, Id=921193929, Price=136390, Balance=1, Security=RIZ1@RTS, State=Active 14:39:28.525 | | IS | Обработка Limit заявки 42266637 на Sell с номером 921193929. 14:39:28.525 | | BS | Обработка Limit заявки 42266637 на Sell с номером 921193929. 14:39:28.525 | | BS | Обработка Limit заявки 42266637 на Sell с номером 921193929. 14:39:28.525 | | TPS | Обработка Limit заявки 42266637 на Sell с номером 921193929. 14:40:00.540 | | IS | Регистрация заявки - цена 134470, направление Sell, объем 1 14:40:00.540 | | QuikTrader | RegisterOrder: TransactionId=42266638, Id=0, Price=134470, Balance=1, Security=RIZ1@RTS, State=None 14:40:00.790 | | QuikTrader | New order: TransactionId=42266638, Id=921198299, Price=134470, Balance=1, Security=RIZ1@RTS, State=Active 14:40:00.790 | | IS | Обработка Limit заявки 42266638 на Sell с номером 921198299. 14:40:00.790 | | BS | Обработка Limit заявки 42266638 на Sell с номером 921198299. 14:40:00.790 | | BS | Обработка Limit заявки 42266638 на Sell с номером 921198299. 14:40:00.790 | | TPS | Обработка Limit заявки 42266638 на Sell с номером 921198299. 14:40:01.243 | | IS | Новая Sell сделка 34189748 на 1 заявки 42266638. 14:40:01.243 | | IS | Прошла сделка по цене 136025, объём 1, направление Sell. 14:40:01.243 | | IS | Смена направления на Buy <mark>14:40:02.134 | Error | QuikTrader | System.NotSupportedException: Указанный метод не поддерживается.</mark> в Ecng.Collections.SynchronizedSet1.System.Collections.Generic.IList<T>.get_Item(Int32 index) в Ecng.Collections.BaseCollection1.get_Item(Int32 index) в TradeRobot.IchimokuStrategy.OnNewMyTrades(IEnumerable1 trades) в H:\TradeRobotSolution 4.0\TradeRobot\MyStrategy.cs:строка 209 в System.Action1.Invoke(T obj) в Ecng.Common.DelegateHelper.SafeInvoke(Action1 handler, T arg) в StockSharp.Algo.Strategies.Strategy.#=q4aYKIR_shp5NHqgzui2yjSiMQj6OnWcsqXpCqw$0TSs=.#=qUN4dTy0D$yWzMqXMYOyIzOGb0NO2m0JoC0mxtYcsqq4=() в StockSharp.Algo.Strategies.Strategy.#=qMZYPf9u7uP2NRMimEzapIQsbp7gI6K74kRwappSKbFM=.#=qPOx$JNNJztWOnRSqeoIpvLLRyOiLkvdOqxlU5DAolyM=() в StockSharp.Algo.Strategies.Strategy.#=qzJ7m9KFjZ1WqVms6QEq6_6T$Gaq8aw80RBw_WGhTPEU=.#=q47bR6lcS4ei5X2OKex$vnQ==(Action #=qM3Fd0SMPkkLJWAsGEgeygw==) в StockSharp.Algo.Strategies.Strategy.#=qZfkIqus2dTp7a$POMInw9A==(Action #=qzUkVfdoXgIXxwFMdCxJ5sA==) в StockSharp.Algo.Strategies.Strategy.#=qkgZFPxGi$ECujYjIxJexEA==(IEnumerable1 #=qXiyWeOs_EO9eZL6ijCw2qA==) в StockSharp.Algo.Strategies.Strategy.#=qR49GOF64tx2pb9GEYZHDCg==(IEnumerable1 #=q$juWwa3sx8fN96bb69hLiA==) в System.Action1.Invoke(T obj) в Ecng.Common.DelegateHelper.SafeInvoke(Action1 handler, T arg) в StockSharp.Algo.BaseTrader.#=qdkcJ1z_5G_9v8kyPHSiXH2QUl6vo_RX4HfOmcsOgXGs=.#=qYoX9dfq6NfczbKi_skOY4w==(IEnumerable1 #=qLjzF$t5RARnMfwEZijwylw==) 14:54:08.009 | | IS | Новая Sell сделка 34196852 на 1 заявки 42266637. 14:54:08.009 | | IS | Прошла сделка по цене 136390, объём 1, направление Sell. 14:54:08.009 | | BS | Новая Sell сделка 34196852 на 1 заявки 42266637. 14:54:08.009 | | BS | Новая Sell сделка 34196852 на 1 заявки 42266637. 14:54:08.009 | | TPS | Новая Sell сделка 34196852 на 1 заявки 42266637. 14:54:08.087 | | TPS | Позиция изменилась на -1. 14:54:08.087 | | TPS | Заканчиваем котирование с неисполненным объемом равный 0. 14:54:08.118 | | BS | Стратегия останавливается. 14:54:08.134 | | BS | Стратегия останавливается. 14:54:08.134 | | TPS | Стратегия останавливается. 14:54:08.134 | | TPS | Заканчиваем котирование с неисполненным объемом равный 0. 14:54:08.150 | | TPS | Заканчиваем котирование с неисполненным объемом равный 0. 14:54:08.165 | | BS | Стратегия остановлена.

Не понятно происхождение ошибки связанной с кросс-заявкой, на момент выставления заявки 12:40:02.118 никаких других заявок не было в квике, почему так происходит?

Вторая ошибка возникла в этом участке кода:

 // смотрим последнюю сделку, следующая должна быть противоположная
            if (trades.Last().Order.IsMatched() && trades.Last().Order.Direction == OrderDirections.Buy)
            {
                CurrentDirection = OrderDirections.Sell;
                AddLog(new LogMessage(this, DateTime.Now, ErrorTypes.None,  "Смена направления на {0}",  OrderDirections.Sell));

            }
            else if (trades.Last().Order.IsMatched() && trades.Last().Order.Direction == OrderDirections.Sell)
            {
                CurrentDirection = OrderDirections.Buy;
                 AddLog(new LogMessage(this, DateTime.Now, ErrorTypes.None, "Смена направления на {0}",  OrderDirections.Buy));

                for (int i = 0; i < base.ChildStrategies.Count; i++)
                {
                    AddLog(new LogMessage(this, DateTime.Now, ErrorTypes.None,  "Состояние алгоритма: {0}", ChildStrategies[i].ProcessState));
                    base.ChildStrategies[i].Stop();
                    AddLog(new LogMessage(this, DateTime.Now, ErrorTypes.None,  "Состояние алгоритма: {0}", ChildStrategies[i].ProcessState));
                    AddLog(new LogMessage(this, DateTime.Now, ErrorTypes.None,  "Стратегия - {0} остановлена", i));
                }
                return;
            }

Получается ошибка возникла либо в ChildStrategies.ProcessState, либо base.ChildStrategies.Stop();

Собственно может из-за того, что вы писали "Да, нет доступа по [] и GetItem не поддерживается..."

Alexander
Alexander

Да, доступ по [] не поддерживается, уже обсуждалось.

По поводу кросс-заявок - поискал в гугле, наткнулся на наш же топик ну и как обычно на форуме квика. в общем проблема не со стороны S#.

Евгений
Евгений Автор

Alexander: Да, доступ по [] не поддерживается, уже обсуждалось.

По поводу кросс-заявок - поискал в гугле, наткнулся на наш же топик ну и как обычно на форуме квика. в общем проблема не со стороны S#.

Я читал на форуме, но там реально ставится вопрос, когда есть заявка и выставляется еще одна. А у меня не было никаких противоположных, вообще никаких не было. Ну раз разработчики говорят что проблема не со стороны S#, значит тому и быть 🙂

А вот про защитные стратегии запутался.

Мне нужно было их удалять или останавливать. Выяснилось, что удалить не получится, нужно использовать метод Stop(). Я его использовал, но защитная стратегии создавала две заявки на продажу. Вы посоветовали:

Alexander;10250 написал: Евгений;10248 написал: Публиковал код и видимо случайно удалил собственно строчку - base.ChildStrategies.Stop(); Распечатайте ProcessState до и после этой строчки.

Я пытаюсь распечатать, но возникает ошибка System.NotSupportedException: Указанный метод не поддерживается.

А как тогда проверить, остановились ли стратегии?

Serg
Serg

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

Alexander
Alexander

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

У того же Открытия 100% запрещены кросс-сделки по разным субсчетам. Сам с этим сталкивался пару раз. Лучше этот вопрос уточнить непосредственно у брокера - почему не прошла сделка.

Евгений
Евгений Автор

Alexander:

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

У того же Открытия 100% запрещены кросс-сделки по разным субсчетам. Сам с этим сталкивался пару раз. Лучше этот вопрос уточнить непосредственно у брокера - почему не прошла сделка.

Это демо-счет, но думаю есть смысл все-равно спросить.

Так, а как все-таки проверить останавливается стратегия или нет?