При тестировании выдает исключение ContextSwitchDeadlock was detected

При тестировании выдает исключение ContextSwitchDeadlock was detected
Atom
11.01.2013
profts


С тестирование на тиках так и не разобрался из-за переполнения индикаторов... Пришлось тестировать на реале.

Теперь к проблеме )))
Тестировал свои стратегии на старых версиях S#. Все было отлично. Решил полностью перейти на 4.1.6. Набросал простенькую стратегию на 15мин свечках. Шаблон взял полностью из SampleHistoryTesting. Свечки не рисую.
Начинается тест, первые два дня эквити рисуется достаточно быстро, потом начинает обновляться с интервалом секунд в 5 и в итоге форма вообще зависает, через минуту выскакивает это исключение:
Ошибка

Код:

Код


 protected override void OnStarted()
        {
            //vcon.Open();
            CommissionRule commissionRule = new CommissionRule { Type = CommissionTypes.PerTradeVolume, Value = new Unit(3m) };
            _commissionManager.Rules.Add(commissionRule);
           
            Sostoyanie = "кэш";
           
            takeprofit  = decimal.Parse(MainWindow.Instance.takeprofit_form.Text);
            proskalz = decimal.Parse(MainWindow.Instance.proskalz.Text);
            vol_kontr = decimal.Parse(MainWindow.Instance.vol_lotov.Text);
            vcon.Open();
           
            // Создание элемента графика представляющего свечки
            _candlesElem = new ChartCandleElement();
            MainWindow.Instance._area.Elements.Add(_candlesElem);

            //MainWindow.Instance._area_ind.Elements.Add(_longMaElem);
            //MainWindow.Instance._area_ind.Elements.Add(_shortMaElem);

         
            this
                .WhenNewMyTrades()
                .Do(ProcessNewTrades)
                .Apply(this);

            _series
                .WhenCandlesFinished()
                .Do(ProcessCandle)
                .Apply(this);
            
            base.OnStarted();
        }

             
        private void ProcessCandle(Candle candle)
        {

          //  if (candle.State == CandleStates.Finished) MainWindow.Instance.GuiAsync(() => MainWindow.Instance.Chart.ProcessCandle(_candlesElem, candle));
            Indicator.Process(candle.ClosePrice);
            
            MainWindow.Instance.GuiAsync(() =>
            {
                MainWindow.Instance.trades_time.Text = Security.LastTrade.Time.ToString();
                MainWindow.Instance.pos2_form.Text = Sostoyanie;
                MainWindow.Instance.position_form.Text = Position.ToString();
            });

         
            if (!START)
            {
                if (Indicator.Container.Count > 2)
                {
                    START = true;
                    Security
               .WhenNewTrades()
               .Do(ProcessNewTrade)
               .Apply(this);

                }
            }

        }

        private void Comission_raschet()
        {
            comission = 0;
            foreach (MyTrade trade in MyTrades)
            {
                comission = comission + _commissionManager.ProcessMyTrade(trade);
            }
            //MainWindow.Instance.GuiAsync(() =>
            //{
            //    MainWindow.Instance.comission_form.Text = comission.ToString();
            //});
        }
       
        private void ProcessNewTrade()
        {
            if (Security.LastTrade == null)
            { goto propusk2; }

            if (Security.LastTrade.Time.Hour == 19 && Security.LastTrade.Time.Minute == 0 && Security.LastTrade.Time.Second < 10)
            { goto propusk2; }

            switch (Sostoyanie)
            {
                case "кэш":
                    {
                        if (...)
                        {
                            Sostoyanie = "Long";
                            Buy_Order(vol_kontr);
                        }
                        else if (...)
                        {
                            Sostoyanie = "Short";
                            Sell_Order(vol_kontr);
                        }
                    }
                    break;
                case "Long":
                    {
                        if (...)
                        {
                            Sostoyanie = "кэш";
                            Sell_Order(vol_kontr);
                        }
                    }
                    break;
                case "Short":
                    {
                        if (...)
                        {
                            Sostoyanie = "кэш";
                            Buy_Order(vol_kontr);
                        }
                    }
                    break;
            }

        propusk2:
    
            //MainWindow.Instance.GuiAsync(() =>
            //{

            //    MainWindow.Instance.trades_time.Text = Security.LastTrade.Time.ToString();
            //    //MainWindow.Instance.now_time.Text = DateTime.Now.ToString();
            //    MainWindow.Instance.pos2_form.Text = pos;
            //    MainWindow.Instance.position_form.Text = Position.ToString();
            //    MainWindow.Instance.komiss_form.Text = comission.ToString();
               
            //});

        }

        private void Buy_Order(decimal volume)
        {

            EntryPrice = Security.LastTrade.Price; ;

            this.AddInfoLog("Сигнал на покупку");
            nomersdelki++;
            order_open_long = this.CreateOrder(OrderDirections.Buy, Security.LastTrade.Price + proskalz, volume);
            order_open_long.Security = Security;
            this.RegisterOrder(order_open_long);
            order_open_long
                                .WhenMatched()
                                .Do(pos_change_long)
                                .Apply(this);

            this.AddInfoLog(PnLManager.PnL.ToString());
            //string vsql = string.Format("insert into Rez2 (nomer_sdelki, data_vxoda,vremya_vxoda, cena_vxoda, High, Low,stop_price) Values ({0}, {1}, {2}, {3}, {4}, {5}, {6})",
            //          (nomersdelki), (Security.LastTrade.Time.ToString("dd.MM")), (Security.LastTrade.Time.ToString("HH.mmss")), (order_open_long.Price.ToString()), (candle_high),(candle_low),(stop_price));


            //OleDbCommand vcom = new OleDbCommand(vsql, vcon);
            //vcom.ExecuteNonQuery();
        }


        private void Sell_Order(decimal volume)
        {
            EntryPrice = Security.LastTrade.Price;
            this.AddInfoLog("Сигнал на продажу");
            nomersdelki++;
            order_open_short = this.CreateOrder(OrderDirections.Sell, Security.LastTrade.Price - proskalz, volume);
            order_open_short.Security = Security;

            this.RegisterOrder(order_open_short);
            order_open_short
                                .WhenMatched()
                                .Do(pos_change_short)
                                .Apply(this);
            //string vsql = string.Format("insert into Rez2 (nomer_sdelki, data_vxoda,vremya_vxoda, cena_vxoda, High, Low,stop_price) Values ({0}, {1}, {2}, {3}, {4}, {5}, {6})",
            //          (nomersdelki), (Security.LastTrade.Time.ToString("dd.MM")), (Security.LastTrade.Time.ToString("HH.mmss")), (order_open_long.Price.ToString()), (candle_high), (candle_low), (stop_price));
            //OleDbCommand vcom = new OleDbCommand(vsql, vcon);
            //vcom.ExecuteNonQuery();
        }





Спасибо:


< 1 2 
VassilSanych

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


profts
Вот такую штуку выдает:

Откройте в древовидном виде, чтоб было понятно, что зачем вызывается.
Хотя примерно ясно, что COM ошибки идут из общения с древним компонентом чарта. WPF в таких случаях просто отрисовывает через интервалы времени. Не понятно кстати откуда и зачем там поиск вызывается. Зато понятно, что именно этот поиск всё и тормозит. Причём, чем больше свечек, тем он, конечно, медленнее.

Спасибо:

profts

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


Закоментировал :
Код

//_strategy.PnLChanged += () =>
            //{
            //    var data = new EquityData
            //    {
            //        Time = _strategy.GetMarketTime(),
            //        Value = _strategy.PnL,
            //    };

            //    this.GuiAsync(() =>
            //    {
            //        _curveItems.Add(data);
            //      
               
            //};


и все залетало ))) скорость огромная без тормозов и т.д.

и вот как бы еще при этом видеть график эквити ))
и неужели только у меня такая проблема? )
Спасибо:

Moadip

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


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

В итоге тестирование делается без "визуализации". А потом, после завершения, все одним разом добавляется на график.

Можно тоже самое и с графиком эквити сделать.
Спасибо:

profts

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


я думаю сделать обновление с каким-нибудь интервалом, например раз в секунду или по какому-то другому событию, например закрытию очередной сделки
Спасибо:
< 1 2 

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

loading
clippy