← Zurück

NullReferenceException при вызове Strategy.Security.BestAsk.Price

В версии 4.0.23 при вызове Strategy.Security.BestAsk.Price получал нужную цену. Скачал самую последнюю версию 17334, с dev-ветки. Теперь Strategy.Security.BestAsk равно null и вылетает NullReferenceException

Kommentare (15)

Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen

Alexander
Alexander

Какой шлюз? Экспорт стакана запускается?

Кот Матроскин
Кот Матроскин Autor

Alexander Mukhanchikov: Какой шлюз? Экспорт стакана запускается? Тестирую в EmulationTrader Экспорт стакана не запускал ни в 4.0.23, ни в текущей

esper
esper

Кот Матроскин: Тестирую в EmulationTrader Экспорт стакана не запускал ни в 4.0.23, ни в текущей Если нет сохраненных стаканов, то у EmulationTrader надо выставить UseMarketDepth = false

Кот Матроскин
Кот Матроскин Autor

esper:

Кот Матроскин: Тестирую в EmulationTrader Экспорт стакана не запускал ни в 4.0.23, ни в текущей Если нет сохраненных стаканов, то у EmulationTrader надо выставить UseMarketDepth = false Спасибо, помогло, NullReferenceException больше не вылетает. В 4.0.23 не было такого свойства. А то, что мы создаем генератор стаканов: _trader.DepthGenerators[_security] = new TrendMarketDepthGenerator(_security) это что-то другое?

esper
esper

Если UseMarketDepth = false, то стаканы как раз генерируются, иначе читаются из БД.

Кот Матроскин
Кот Матроскин
Кот Матроскин Autor

esper: Если UseMarketDepth = false, то стаканы как раз генерируются, иначе читаются из БД. Спасибо, теперь полностью разобрался)))

Кот Матроскин
Кот Матроскин Autor

Все-таки еще иногда вылазит NullReferenceException. Но не всегда:

Метка 3-1 MarketTime:2012.03.07 18:30:01, BestAsk = 97,42000, H = 97,56000, L = 97,36000 Метка 3-1 MarketTime:2012.03.07 18:40:00, BestAsk = 97,25000, H = 97,65000, L = 97,21000 Метка 3-1 MarketTime:2012.03.11 <mark>09:59:59</mark>, NullReferenceException Метка 3-1 MarketTime:2012.03.11 10:00:00, BestAsk = 99,60000, H = 99,60000, L = 99,60000 Метка 3-1 MarketTime:2012.03.11 10:10:00, BestAsk = 99,44000, H = 99,80000, L = 99,39000 Метка 3-1 MarketTime:2012.03.11 10:20:00, BestAsk = 99,51000, H = 99,57000, L = 99,35000 Сначала думал, что из-за корявого времени свечи, но в других случаях все нормально

Метка 3-1 MarketTime:2012.03.15 18:30:00, BestAsk = 100,86000, H = 100,89000, L = 100,65000 Метка 3-1 MarketTime:2012.03.15 18:40:00, BestAsk = 100,69000, H = 100,88000, L = 100,54000 Метка 3-1 MarketTime:2012.03.16 <mark>09:59:59</mark>, BestAsk = 100,67000, H = 100,70000, L = 100,54000 Метка 3-1 MarketTime:2012.03.16 10:00:00, BestAsk = 100,99000, H = 100,99000, L = 100,99000 Метка 3-1 MarketTime:2012.03.16 10:10:00, BestAsk = 100,75000, H = 100,97000, L = 100,35000

Кот Матроскин
Кот Матроскин Autor

Опять полезло NullReferenceException при вызове Strategy.Security.BestBid.Price при этом UseMarketDepth = false

10:00:00.000 | Error | FDS_SBER@EQBR_test account | System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта. в SampleHistoryTesting.FDStrategy.OnCandlesFinished(Candle candle) в F:\S#\4.1.0\StockSharp_4.1\Samples\Testing\HistoryTesting\Strategy\FDStrategy.cs:строка 334 в SampleHistoryTesting.FDStrategy.<OnStarting>b__6(Candle newCandles) в F:\S#\4.1.0\StockSharp_4.1\Samples\Testing\HistoryTesting\Strategy\FDStrategy.cs:строка 96 в StockSharp.Algo.Strategies.StrategyRule1.#=qbKPfZP$sHNKewBoWTxOVIZWKc2RxMGQkOvMNrefS8FE=() в StockSharp.Algo.Strategies.Strategy.#=qYja9YukY0RAy8kUzPEwBAg==(IStrategyRule #=quLfxru5uzbPCCVRiCLmC0g==, Func1 #=qyw4EbBr3D$tMVupgMHmy2Q==, Object #=qayY1ai3QioJ7b725$BZRPA==, Boolean #=qUT7qwl2456HPh4xYvHuyMA==) Причем вылезает постоянно Версия stocksharp-17830 trunk

pyhta4og
pyhta4og

Вообще-то вы в своей стратегии случай BestBid=null должны сами обрабатывать отдельно потому что это вполне норм ситуация - в стакане нет бидов.

Почему так получается в вашем случае с генерироваными стаканами сложно сразу понять, но есть гипотеза Поставьте Emulator.Settings.DepthExpirationTime=TimeSpan.MaxValue

Дело в том, что эмулятор очищает стаканы которые старше чем 1 сутки.

Дйте знать, изменится ли поведение.

Кот Матроскин
Кот Матроскин Autor

pyhta4og: Вообще-то вы в своей стратегии случай BestBid=null должны сами обрабатывать отдельно потому что это вполне норм ситуация - в стакане нет бидов. Мне кажется, что для Сбербанка отсутствие в стакане бидов все же не есть норма pyhta4og: Почему так получается в вашем случае с генерироваными стаканами сложно сразу понять, но есть гипотеза Поставьте Emulator.Settings.DepthExpirationTime=TimeSpan.MaxValue

Дело в том, что эмулятор очищает стаканы которые старше чем 1 сутки.

Дйте знать, изменится ли поведение. Поставил _trader.MarketEmulator.Settings.DepthExpirationTime = TimeSpan.MaxValue; Результат то же

pyhta4og
pyhta4og

Судя по тому что у вас ошибка в 10:00:00 утра я думаю что у вас 1я свечка сформировалась до того как пришел первый стакан

Поэтому все-таки моя рекомендация случай Bid=null считать нормальным, во всяком случае на исторических данных. Вы можете просто пропустить эту свечу.

Сам CandleFinished который приходит ровно в 10:00:00 тоже подозрителен - это какие же тики вошли в эту свечу? которые были ДО 10:00:00 - так их быть не должно.

Возможно вам приходит свеча с нулевым объемом?

Кот Матроскин
Кот Матроскин Autor

pyhta4og: Судя по тому что у вас ошибка в 10:00:00 утра я думаю что у вас 1я свечка сформировалась до того как пришел первый стакан Поэтому все-таки моя рекомендация случай Bid=null считать нормальным, во всяком случае на исторических данных. Вы можете просто пропустить эту свечу. Возможно вам приходит свеча с нулевым объемом? Сделал так, чтобы BestAsk спрашивался посередине дня в разное время - вылетает то же самое исключение. Так как Bid и Ask у Сбера не могут быть нулевые, ошибка в чем-то другом

pyhta4og: Сам CandleFinished который приходит ровно в 10:00:00 тоже подозрителен - это какие же тики вошли в эту свечу? которые были ДО 10:00:00 - так их быть не должно. Что Гидра с Финама скачала, то и юзаем)))))

pyhta4og
pyhta4og

Кот Матроскин:

pyhta4og: Судя по тому что у вас ошибка в 10:00:00 утра я думаю что у вас 1я свечка сформировалась до того как пришел первый стакан Поэтому все-таки моя рекомендация случай Bid=null считать нормальным, во всяком случае на исторических данных. Вы можете просто пропустить эту свечу. Возможно вам приходит свеча с нулевым объемом? Сделал так, чтобы BestAsk спрашивался посередине дня в разное время - вылетает то же самое исключение. Так как Bid и Ask у Сбера не могут быть нулевые, ошибка в чем-то другом

pyhta4og: Сам CandleFinished который приходит ровно в 10:00:00 тоже подозрителен - это какие же тики вошли в эту свечу? которые были ДО 10:00:00 - так их быть не должно. Что Гидра с Финама скачала, то и юзаем)))))

правильно я понимаю, что у вас в течение одного дня сначала BestBid!=null, а потом BestBid==null получается?

Можете прислать истор. данные за 1 день на которых такое поведение EmulationTrader? какая версия StockSharp?

Кот Матроскин
Кот Матроскин Autor

pyhta4og: правильно я понимаю, что у вас в течение одного дня сначала BestBid!=null, а потом BestBid==null получается? Нет, BestBid == null постоянно (BestAsk тоже постоянно == null) pyhta4og: Можете прислать истор. данные за 1 день на которых такое поведение EmulationTrader? какая версия StockSharp? Версия вроде как stocksharp-17830

У вас, я так понял, не получается воспроизвести ошибку?

pyhta4og
pyhta4og

Кот Матроскин:

pyhta4og: правильно я понимаю, что у вас в течение одного дня сначала BestBid!=null, а потом BestBid==null получается? Нет, BestBid == null постоянно (BestAsk тоже постоянно == null) pyhta4og: Можете прислать истор. данные за 1 день на которых такое поведение EmulationTrader? какая версия StockSharp? Версия вроде как stocksharp-17830

У вас, я так понял, не получается воспроизвести ошибку?

Воспроизввел. UseMarketDepth=false теперь значит вообще никаких стаканов не использовать, ни генерированных, ни настоящих.

Чтобы использовать настоящие ставьте UseMarketDepth=true, DepthGenerator-ы НЕ регистрируйте Чтобы использовать генерированные ставьте UseMarketDepth=true и зарегистрируйте генератор через RegisterMarketDepth(new TrendMarketDepthGenerator...)

при генерации стаканов в первом за день NewTrades BestBid/BestAsk будут null, потому что их еще не сгенерировали (генерация происходит после прихода сделки), но это только 1 раз за день.