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

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


Выводится в логи следующая ошибка (правильно я понял, что логируется только то, что описывается через 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). Что я неправильно делаю? Спасибо


Теги:


Спасибо:


< 1 2 3 4 5  > >>
Евгений

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


Хелп ми плиз

Спасибо:

Mikhail Sukhov

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


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

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

Спасибо:

InsiderHSE

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


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

Спасибо:

Евгений

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


InsiderHSE:

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

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

Спасибо:

Евгений

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


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

Спасибо:

Alexander

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


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

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

  • у Trader есть событие MarketTimeChanged
Спасибо:

Евгений

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


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

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


Евгений:

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(); } });



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

Евгений

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


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

             ```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

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


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

             ```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 заметно меньше строчек :)
Спасибо:
< 1 2 3 4 5  > >>

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

loading
clippy