версия 3.2.10
System.IndexOutOfRangeException was unhandled
Message=Индекс находился вне границ массива.
Source=Ecng.Common
StackTrace:
в Ecng.Common.RandomIntArray.Next()
в StockSharp.Algo.Testing.MarketDepthGenerator.CreateQuote(Decimal startPrice, OrderDirections direction)
в StockSharp.Algo.Testing.TrendMarketDepthGenerator.Generate(MarketDepth data, DateTime time)
в StockSharp.Algo.Testing.MarketDepthGenerator.Generate(DateTime time)
в StockSharp.Algo.Testing.EmulationTrader.#=qaPQ2zFVEmGlcCeb1W6Fzxg==(DateTime #=qV9lC0hKzLXxXFDwtYDa2Jw==)
в StockSharp.Algo.Testing.EmulationTrader.#=qsJs5WxEsnHTRLEGnw$PwNg==(IEnumerable1 #=qIT1iMH0n2wDEBu969ICSYQ==) в Ecng.Common.ThreadHelper.<>c__DisplayClass81.<CreateThread>b__7(Object a)
в System.Threading.ThreadHelper.ThreadStart_Context(Object state)
в System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
в System.Threading.ThreadHelper.ThreadStart(Object obj)
InnerException:
Kommentare (11)
Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen
4.0.1 уже выпустили, смотрите там.
Данный Exception воспроизводится в 4.0.1, перехватывал в EmulationTrader.ProcessDataError
У меня на машине, во вложенном солюшене, воспроизводится примерно в 90% запусков. При этом если ничего не делать в ProcessDataError, то поток просто завершается, без каких либо сообщений.
А возможно EmulationTrader стартовать в том же потоке? Я бы многопоточность сам реализовал, и перехватывать всякую бяку было бы удобнее.
Ещё случается OutOfMemoryException. Но эта другая тема, я её пока сам поиследую, если конечно вы с лету не научите как избежать.
Проблема была из-за многопоточности. Будет фикс.
http://stocksharp.com/doc/html/5b90a23e-24b9-474a-a699-da47b666194a.htm Там написано про управление памятью.
Эксепшен IndexOutOfRangeException в 4.0.2 исправлен. Спасибо!
С OutOfMemory - где то явно есть утечка: Существуют ли глобальные списки Security, Portfolio, TrendMarketDepthGenerator, Strategy, CandleManager RegisterTimeFrameCandles или SimpleMovingAverage?
EmulationTrader создаю с параметром DaysInMemory = 1
Стратегию запускаю многократно, на 25 раз получаю OutOfMemory, каждый раз создаю новые Security, Portfolio, TrendMarketDepthGenerator, Strategy, CandleManager RegisterTimeFrameCandles или SimpleMovingAverage, предыдущие обнуляю. И вижу постепенный рост потребления памяти.
Что ещё нужно обнулять? Возможно ли использовать данные объекты повторно (создав из них пул)?
Прочитайте, пожалуйста, описание по ссылке. Там написано подробно, что на что влияет.
Перечитал ещё раз. Не обнаружил ничего относящегося к памяти, за исключением
Добавил в
А вы устанавливали только один параметр. На память в моменте (пик) влияют первые два, а на общую последние два.
25-ый прогон? А CandleManager у вас один и тот же?
Параметром конструктора CandleManager является источник данных. Т.к. EmulationTrader используются разные, то и CandleManager создается каждый раз новый.
Возможно повторное использование EmulationTrader или CandleManager?
Сейчас на КодеПлексе залита версия, где построение свечек из сделок вынесено отдельно в CandleBuilder. Есть мнение, что новая модель может помочь в решении проблемы.
Утечка памяти осталась.
Но вот приводят к утечке похоже не свечи, а EmulationTrader. Думаю свечи - следствие EmulationTrader, т.к. они подписаны на его события. Кстати, может эту подписку реализовать через WeakReference, а то может складываться странная ситуация когда свечи уже никому не нужны, но т.к. они остались подписанными на сделки, то остаются висеть в памяти и тормозить-засорять. Хорошая статья об этом http://habrahabr.ru/blogs/net/89529/
В общем я локализовывал утечку, сделав WeakReference на стратегию, трейдер и СandleManager. Ссылка на стратегию становиться null, а вот ссылка на EmulationTrader, и соответственно СandleManager, остается.
Освободить память занимаемую EmulationTrader пытаюсь так:
На codeplex зарегился, логин ANebotov, но вот как подавать заявку на подключение к проекту не понял.
Присоединил.