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


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


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

Теперь к проблеме )))
Тестировал свои стратегии на старых версиях 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  >
Alexander

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


Весь проект прикрепите. У вас где-то ком используется?
Спасибо:

profts

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


Нет, взял SampleHystoryTesting, пара стандартных индикаторов, простые условия для входов и выходов.
Спасибо:

VassilSanych

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


Похоже это вы базу данных дрючите не по-детски.
Спасибо:

Alexander

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


profts Перейти
Нет, взял SampleHystoryTesting, пара стандартных индикаторов, простые условия для входов и выходов.


Прикрепите минимальный проект на котором воспроизводится.
Спасибо:

profts

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


Цитата:
Похоже это вы базу данных дрючите не по-детски.

В базу данных у меня только сохраняются сделки, а их всего штук 500 в год.

Сейчас попробовал SampleHystoryTesting, только изменил инструмент на Si и путь к истории по нему. Ошибка не выскочила, но торможение очень сильное. Тест идет максимум месяц с торможениями, залипаниями секунд на 5-10 и потом окончательно виснет.

Прикрепляю миним. проект, на котором воспроизводится ошибка. При старте теста график эквити обновляется рывками раз в 5-10 секунд, причем значение на графике значительно отстает от тех, которые отображаются слева в параметрах. т.е. в параметрах уже конец января, а эквити отображается дня за три максимум... потом все окончательно виснет и выскакивает моя ошибка. Это с учетом того, что я закомментировал сохранение сделок в базу.

Спасибо:

profts

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


Если убираю :
Код

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


, то торможение и зависание остается, но ошибка вроде не выскакивает.
Но как это может влиять, если добавление на форму идет только после окончания 15мин свечек. В тестерах на старых версиях у меня после каждого тика выводилась подобная инфа и никаких ошибок не возникало.
Спасибо:

Alexander

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


Попробуйте на последней версии с codeplex
Спасибо:

VassilSanych

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


profts Перейти
Если убираю :
....
Но как это может влиять, если добавление на форму идет только после окончания 15мин свечек. В тестерах на старых версиях у меня после каждого тика выводилась подобная инфа и никаких ошибок не возникало.


Не занимайтесь гаданием. Запустите под DotTrace и смотрите, что у вас слишком часто и/или слишком долго выполняется.

Спасибо: Геннадий Ванин (Gennady Vanin)

profts

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


Цитата:
Попробуйте на последней версии с codeplex

Стояла последняя версия. Сейчас для надежности заново скачал - все без изменений.

Цитата:

Запустите под DotTrace и смотрите, что у вас слишком часто и/или слишком долго выполняется.


Вот такую штуку выдает:
Trace2.JPG 269 KB (224)
Спасибо:

Alexander

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


Последняя версия - 4.1.7. У вас же в архиве 4.1.6
Судя по скриншоту - у вас общение с гуём отнимает туеву хучу времени
Спасибо:
1 2  >

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

loading
clippy