← Back

начудил :(

теперь при запуске экспорта по ДДЕ одно ядро проца грузится по полной. где можно было так ошибиться? стратегия еще не запущена.

когда стратегия работает, то ошибками сыпет 2010-03-16T20:51:09.8750000+03:00 [0] None => Strategy runned ошибка ренжа: System.ArgumentOutOfRangeException: Specified argument was out of the range of valid values. Parameter name: min at Ecng.ComponentModel.Range1.ValidateBounds(T min, T max) at Ecng.ComponentModel.Range1.Init(T min, T max) at Ecng.ComponentModel.Range`1..ctor(T min, T max) at SampleSMA.MainWindow.DrawSma() in D:\trade\bot\code\stockSharp \SampleSMA\MainWindow.xaml.cs:line 267 Первый этап обработки исключения типа "System.ArgumentOutOfRangeException" в приложении Ecng.ComponentModel.dll 2010-03-16T20:53:35.7187500+03:00 [0] None => Strategy stopping 2010-03-16T20:53:35.8281250+03:00 [0] None => Strategy stopped

код private void DrawSma() { // нас не интересует текущая свечка, так как она еще не сформировалась // и из нее нельзя брать цену закрытия

                   // вычисляем временные отрезки текущей свечки
                    var bounds = _timeFrame.GetCandleBounds(_trader);

                   // если появились новые полностью сформированные свечки
                    if (_lastCandleTime < bounds.Min)
                    {
            try
            {
                // отстут с конца интервала, чтобы не захватить

текущую свечку. var endOffset = TimeSpan.FromSeconds(1); bounds = new Range<DateTime>(_lastCandleTime + _timeFrame, bounds.Min - endOffset); // line 267

               // получаем эти свечки
                var candles =

_candleManager.GetTimeFrameCandles(_strategy.Security, _timeFrame, bounds);

но перед этим еще вилы были с вот этим this._trader.NewTrades += (_all_trades) => this.Sync(() => { try { var _lt = _all_trades.Last(tmp => tmp.Security.Code.Equals(mysec)); // trap papir.price = _lt.Price; } catch (InvalidOperationException ex) { Console.WriteLine("ошибка определения последней сделки: {0}", ex); } }); кривой обработчик всех сделок может грузить проц при выключенной стратегии?

Comments (34)

Login or Create account, Log in or register to leave a comment

Mikhail Sukhov
Mikhail Sukhov
  1. ArgumentOutOfRangeException выбрасывается по всей видимости от того, что _lastCandleTime + _timeFrame оказался больше чем bounds.Min
  • endOffset
  1. Насчет обработчика всех сделок. Его деятельность не зависит от того, работают стратегии или нет. Но я не вижу особых тормозов в его коде.
denis
denis Author
  1. Да, вываливается на первой свечке. Только сегодня заметил.
  2. С утра попробовал на 1,6 - летает, потом на 1,7 - аналогично... подожду вечера, может выловлю чего Хорошо что SVN поставил, спасает. А то бы ща уже с бубнами плясал :)
denis
denis Author

На риме опять заргуз до включения стратегии, возможно, я не так обрабатываю "все сделки". Сейчас откачусь на 1.6, может что нового узнаю.

Mikhail Sukhov
Mikhail Sukhov

Загрузка - это случайно не та, которая при первом экспорте всех сделок? Так может подождать? Попробуйте отписаться от события? Что-нибудь изменится? Какие свечки созданы? CandleManager тоже зависит от всех сделок. Вообщем, локализация ошибки.

denis
denis Author

Да, верно, туплю :( спать надо больше. Откатывался на разные версии своих изменений - бесполезно. Выключал все кроме минутных свечек. 1,6 отличается от 1,7 тем, что нагрузка на первом постоянная, а на втором падает до нуля, а когда проходят сделки в окне "все сделки", то подскакивает до 80% от ядра. В обоих случаях помогает следующая последовательность:

  1. выбрать Лукойл, чтобы в окне "все сделки" был только лук, 2) запустить экспорт, 3) игнорировать следуещее: ошибка определения последней сделки: System.InvalidOperationException: Sequence contains no matching element at System.Linq.Enumerable.Last[TSource](IEnumerable1 source, Func2 predicate) at SampleSMA.MainWindow.<>c__DisplayClass21.<Connect_Click>b__c() in D:\trade\bot\code\stockSharp\SampleSMA\MainWindow.xaml.cs:line 201
  2. переключится на риму, 5) через 5-15 сек наслаждаться нагрузкой от 0 до 10% ядра. Если не плясать с бубнами, то до 80% ядра будет поедаться.

Учел что конфиги для квика отличаются у 1,6 и 1,7. То же про длл. На лукойле воспроизвести такое поведение не удалось. Какую очевидную вещь я упустил из виду? Может при переходе с 1,6 на 1,7 нужно не только перекинуть библиотеки и поправить код, но и еще что-то где-то нажать/прописать?

Mikhail Sukhov
Mikhail Sukhov

Подождите, так Ваш же код код ошибки кидает =) Вот это "System.InvalidOperationException: Sequence contains no matching element" говорит о том, что выражение _all_trades.Last(tmp => tmp.Security.Code.Equals(mysec)); не находит необходимой сделки. Вам нужно вызывать LastOrDefault, тогда в случае ненахождения он возвратит null. А так действительно, у Вас каждый тик (хотел сказать чих) по ошибке. Вот и получается, что как только вы сменили фильтр, ошибки прекратились. Потому как приходят только те сделки, которые соответветствуют Вашему инструменту. Не нужно забывать, ITrader.NewTrades возвращает сделки для ВСЕХ инструментов.

denis
denis Author

Ну не нашел, сгенерил исключение, перехватили, отпечатали... если бы все так просто :) я пробовал комментировать этот обработчик и другие, кроме работы со свечками. Нагрузка остается. Сейчас делаю так: this._trader.NewTrades += (_all_trades) => this.Sync(() => { var _lt = _all_trades.LastOrDefault(tmp => tmp.Security.Code.Equals(mysec)); if (_lt != null) papir.price = _lt.Price; }); изменений нет, кроме как отсутствия провалов в нагрузке проца. Комментирую этот обработчик - аналогично. Завтра вырежу все что не требуется дальше обработки кнопки "экспорт ДДЕ" и потестирую на риме, после обеда :) ибо до обеда оно работает. А на луке работает всегда.

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

У других-то работает :( чего же я не так сделал?

denis
denis Author

ехо! :) нарыл! смысл такой: у симплСМА оторвать рисовалку, чтобы эксперимент был точнее. Потом поставить таймфрейм 30 сек и заменить LKOH на RIM0. Запустить, подключится, начать экспорт. Могу выложить свою версию покоцанного симплСМА.

dart
dart

Давай

Mikhail Sukhov
Mikhail Sukhov

LKOH - это та, которая акция?

Конечно, присылай. Только я позднее посмотрю. А в чем причина?

denis
denis Author

https://docs.google.com/leaf?id=0Bw2gQDvf41vtZTJkMzQ0Y2UtZmY2MC00N2Y2LTgzOWItNjI5YzQ1MTgzM2Rh&sort=name&layout=list&num=50

думаю что и-за малого тайм фрейма и большого кол-ва свечек начинаются тормоза

Dord
Dord

Тормоза могут быть из-за таблицы "Все сделки" если там выбраны все инструменты. У меня за сегодня например на учебном квике накопилось почти 540к сделок. Отключив висфаир, выбор по всем сделкам любого нужного инструмента у меня занимал по 18-20 секунд времени загружая проц на 100%, при этом таймфрейм у свечек был разный от 5 секунд до 30 минут. Если оставить в таблице "Все сделки" только "RIM0", по которому накопилось 24к сделок, то dde будет висеть 2-3 секунды. Тормоза из-за малого таймфрейма и большого кол-ва свечек начинаются при отрисовке графика видимо из-за тормознутости висфаир чарта. Я сегодня разбирался с премудростями amCharts, визуально он мне больше нравится. Если получится то в симплСМА его прикручу, надо взглянуть на его скорострельность.

denis
denis Author

Вчера на РИМ0 сделок 220т, на луке 65т. Тромоза были на РИМ0, но не на луке. Визифайр выключил еще две недели назад, как только понял что он жрет ресурсы и может быть отключен. Таймфрейм минута. Инструмент только РИМ0. Тормозит всегда после обеда. Как включил, пошел экспорт, так и тормозит, хоть полчаса, но иногда загруз падает до 0. Проц АМД Х2 5200.

Но если вырезать менеджер свечек - все летает. В обоих случаях стратегия не запущена.

зачем рисовалка-то? терминала от тестера не хватает? :)

Mikhail Sukhov
Mikhail Sukhov

Ну вот как раз один из наших роботов - это фьюч на индекс. ТФ - аж 20 сек... А алго стартует сразу, не дожидаясь падения нагрузки при экспорте всех сделок? К этому довольно привередлив CandleManager. Его лучше запускать, когда уже все экспортнулось.

denis
denis Author

Кнопка старта стратегии становится активной через 5-15 сек, видимо когда экспорт пройдет. Сейчас попробую перенести запуск CandleManager из кнопки "экспорт ДДЕ" в кнопку "Старт". В этом случае не будет потерянных данных?

Mikhail Sukhov
Mikhail Sukhov

Я не закладывал никакой логики с активностью кнопки. Видимо это просто тормоза.

Dord
Dord

Эти 5-15 секунд уходят на экспорт по дде сделок по выбранному инструменту из квика. Для проверки можешь оставить в окне все сделки какой-нибудь малоликвидный инструмент (я вчера на акциях автоваза это проверял) по которому есть какие-то сделки за сегодня и прописав его в симплсма запустить и посмотреть.

denis
denis Author

за половину недели ковыряний, я слегка уловил что ДДЕ экспорт при старте может прогружать проц, но вот чего мне до сих пор не понятно, так это почему он жрет 100% ядра все остальное торговое время? и не жрет во время клиринга. Стратегия выключена в обоих случаях.

Вопрос ни разу в этих стартовых 15 секах, вопрос все время в полном прогрузе ядра.

Что мне делать? Куда бежать?

Mikhail Sukhov
Mikhail Sukhov

Локализация ошибки?

  1. Отключить весь код логики (+ выкинуть логику из обработчиков).
  2. Включить экспорт всех сделок. Тормозит больше чем нужно (скажем, уже все сделки подгрузились, а нагрузка не спадает)? Если да, то выход.
  3. Включить CandleManager на нужный тайм фрейм. Тормозит? Если да, то выход.
  4. Влючить стратегию. Тормозит? Если да, то выход.

Пока надо определить шаг, на котором происходит нагрузка.

denis
denis Author

на риме это тормозит? ссылка на симплСМА

http://www.google.com/url?sa=D&q=https://docs.google.com/leaf%3Fid%3D0Bw2gQDvf41vtZTJkMzQ0Y2UtZmY2MC00N2Y2LTgzOWItNjI5YzQ1MTgzM2Rh%26sort%3Dname%26layout%3Dlist%26num%3D50&usg=AFQjCNHB_jc4k8D3GeWbBmLdBQUc0w4Rwg

То что на автовазе оно не будет тормозить это я и без тестов могу сказать, ибо на луке оно летает, а таз вообще шлак папир. И спасибо что напомнил о тазе, он застрял в среднесрочном роботе, написанном в экселе. Там 65 папир, 400 уровней при прохождении которых заявы выставляются или снимаются. Жрет не более 5% ядра, но глючит иногда :(

denis
denis Author

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

Для быстрого воспроизведения ситуации можно переставить таймфрейм на 30 секунд и лук заменить на риму.

Mikhail Sukhov
Mikhail Sukhov

Тоесть, виновник CandleManager? Для чистоты эксперимента, можете именно оставить скажем минут на 10. Ничего не нужно включать, просто регистрация свечки. Не упадет нагрузка?

denis
denis Author

однако засада :( включаю 10 мин на риме - тормоза остаются, переключаюсь на лук - летает, ставлю фрейм 1 мин - летает, переключаюсь на фьюч лука - летает.

Mikhail Sukhov
Mikhail Sukhov

Тоесть, на 10 минут тормозит, а на 1 - нет? Интересно. Надо бы поглубже копнуть. Пока с ходу не ясно.

denis
denis Author

На риме тормозит и на 1 мин и на 10 мин, на луке 1 мин - летает, на фуче лука тоже летает как будто боится риму :)

Mikhail Sukhov
Mikhail Sukhov

Сколько сделок на луке и на риме?

denis
denis Author

в окне "все сделки" 250 тыс строк, сейчас отфильтрую по каждому инструменту LKM0 = 12800 LKOH = 32500 RIM0 = 204700 хм :/

Mikhail Sukhov
Mikhail Sukhov

Написал нагрузочный тест -

http://stocksharp.googlegroups.com/web/Program.cs?gda=zvVZazwAAAD7ujiFr5Ha_HYNmvj19Tvy_GKAELyqx4z3GZqV5NKOAvOTqSfJAS8Ae9iSzNYZ2LPJFhoxmpKOtqIfKEM19Vl5&gsc=UoP_5QsAAABbesp6p5Fpqgb_84TDDYjR

.

1m сделок. ТФ - 10 сек. Нагрузки на проц никакой. Опять же, спрашивал у других, кто пользуется роботами. Выставляли ТФ - 2 сек. Тоже нет нагрузки... Прогони этот тест. Какие у тебя будут показатели?

denis
denis Author

Спасибо за тест. Погонял, нагрузка около 2-4% вместе с другими приложениями. Изменил // спим секунду, эмулируя задержку Квика Thread.Sleep(TimeSpan.FromSeconds(0.01)); т.е. теперь ждет на порядок меньше, нагрузка стала от 5 до 10% только на это приложение.

От симплСМА оторвал стратегию, нагрузка осталась, сейчас почитаю инструкцию к профилировщику, если он может измерять время выполнения функций и методов, то узнаю где собака порылась.

Mikhail Sukhov
Mikhail Sukhov

Я думаю она в обработчиках... Еще полезно смотреть на DdeError. Если там что-то плохое пишется часто, то оно сильно снижает нагрузку. Вот заметка на эту темуhttp://dotnetperls.com/exception-performance-test

Результаты в самом начале. Падение производительности аж в 6 раз.

denis
denis Author

С профилировщиком пока не разобрался :( Но воспроизвел тупняк на Sample и не смог воспроизвести на SampleConsole. Сейчас еще немного поковыряю и добавлю стратегию. О резалтах отпишусь.

denis
denis Author

Сделал пока вывод пять сек свечи на риме - летает! :) Супер! респекты и уважуха! Пошел приделывать остальные куски. ссылка на код

https://docs.google.com/leaf?id=0Bw2gQDvf41vtNTVkOWEwNTgtMmU1ZS00MjRmLTg1NDEtNGM2NGU4NjliNmFh&sort=name&layout=list&num=50

Mikhail Sukhov
Mikhail Sukhov

Я что-то упустил. Проблема идентифицировалась?

denis
denis Author

Летает в SampleConsole, а в Sample и SampleSMA - тормозит. Куда думать

  • не знаю, но может из-за GUI-морды и синхронизаций с ней. Кусок из SampleConsole:

                             const string secCode = "RIM0";
                              Security lkoh = null;
              CandleManager _candleManager;
              TimeSpan _timeFrame = TimeSpan.FromSeconds(5);
              StrategyManager _manager = new StrategyManager();
    
                             const string quikPath = @"C:\Program Files\info\";
    
                             // создаем соединение с Quik-ом
                              using (var trader = new QuikTrader(quikPath))
                              {
                  _candleManager = new CandleManager(trader);
                                      // подписываемся на событие появление инструментов
                                      trader.NewSecurities += securities =>
                                      {
                                              if (lkoh == null)
                                              {
                                                      // находим Лукойл и присваиваем ее переменной lkoh
                                                      lkoh = securities.FirstOrDefault(sec => sec.Code == secCode);
    
                                                     if (lkoh != null)
                                                      {
                                                              Console.WriteLine("Инструмент Лукойл появился");
    
                                                             //new TestCandleManager(trader, lkoh).NewCandles += (t, c) =>
    

Console.WriteLine(c.Count()); //waitHandle.Set();

_candleManager.RegisterTimeFrameCandles(lkoh, _timeFrame); _candleManager.NewCandles += (token, candles) => { //DrawCandles(candles); var _lc = candles.LastOrDefault(tmp => tmp.Security.Code.Equals("RIM0")); if (_lc != null) Console.WriteLine("o = " + _lc.OpenPrice + " h = " + _lc.HighPrice + " l = " + _lc.LowPrice + " c = " + _lc.ClosePrice);

                           };
                                                    }
                                            }
                                    };
                //

                                   // запускаем экспорт по DDE
                                    //trader.StartDde(new[] { trader.SecuritiesTable });
                trader.StartDde();

если и есть нагрузка, то она пренебрежительно мала и не поддается обнаружению "на глаз"