Alexander
|
Дата: 05.10.2011
|
|
|
|
AN версия 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==(IEnumerable`1 #=qIT1iMH0n2wDEBu969ICSYQ==) в Ecng.Common.ThreadHelper.<>c__DisplayClass8`1.<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: 4.0.1 уже выпустили, смотрите там.
|
|
Спасибо:
|
|
|
|
|
AN
|
Дата: 08.10.2011
Данный Exception воспроизводится в 4.0.1, перехватывал в EmulationTrader.ProcessDataError У меня на машине, во вложенном солюшене, воспроизводится примерно в 90% запусков. При этом если ничего не делать в ProcessDataError, то поток просто завершается, без каких либо сообщений. А возможно EmulationTrader стартовать в том же потоке? Я бы многопоточность сам реализовал, и перехватывать всякую бяку было бы удобнее. Ещё случается OutOfMemoryException. Но эта другая тема, я её пока сам поиследую, если конечно вы с лету не научите как избежать.
|
|
Спасибо:
|
|
|
|
|
Mikhail Sukhov
|
Дата: 08.10.2011
AN Данный Exception воспроизводится в 4.0.1, перехватывал в EmulationTrader.ProcessDataError
У меня на машине, во вложенном солюшене, воспроизводится примерно в 90% запусков. При этом если ничего не делать в ProcessDataError, то поток просто завершается, без каких либо сообщений.
Проблема была из-за многопоточности. Будет фикс. AN Ещё случается OutOfMemoryException. Но эта другая тема, я её пока сам поиследую, если конечно вы с лету не научите как избежать. http://stocksharp.com/do...a-a699-da47b666194a.htm Там написано про управление памятью.
|
|
Спасибо:
|
|
|
|
|
AN
|
Дата: 10.10.2011
Эксепшен IndexOutOfRangeException в 4.0.2 исправлен. Спасибо! С OutOfMemory - где то явно есть утечка: Существуют ли глобальные списки Security, Portfolio, TrendMarketDepthGenerator, Strategy, CandleManager RegisterTimeFrameCandles или SimpleMovingAverage? EmulationTrader создаю с параметром DaysInMemory = 1 Стратегию запускаю многократно, на 25 раз получаю OutOfMemory, каждый раз создаю новые Security, Portfolio, TrendMarketDepthGenerator, Strategy, CandleManager RegisterTimeFrameCandles или SimpleMovingAverage, предыдущие обнуляю. И вижу постепенный рост потребления памяти. Что ещё нужно обнулять? Возможно ли использовать данные объекты повторно (создав из них пул)?
|
|
Спасибо:
|
|
|
|
|
Mikhail Sukhov
|
Дата: 10.10.2011
AN EmulationTrader создаю с параметром DaysInMemory = 1 Прочитайте, пожалуйста, описание по ссылке. Там написано подробно, что на что влияет.
|
|
Спасибо:
|
|
|
|
|
AN
|
Дата: 11.10.2011
Перечитал ещё раз. Не обнаружил ничего относящегося к памяти, за исключением - EmulationTrader.DaysInMemory
- EmulationTrader.LoadingThreadCount
- CandleContainer.MaxCandleCount
- CandleContainer.MaxTradeCount
У меня немного другая ситуация: тестирование запускается и нормально отрабатывает и один, и даже 10 раз. Но идет постоянное накопление данных в памяти. Соответственно раз, эдак на 25 память заканчивается, и возникает OutOfMemory. Т.е. EmulationTrader не удаляется из памяти после использования, хотя ссылок на него, в моём коде, уже не остается. Добавил в Цитата: trader.StateChanged += () => { if (trader.State == EmulationStates.Stopped)
код: Цитата:trader.StopExport(); trader.Disconnect(); trader.Dispose(); trader = null;
strategy.Stop(); strategy.Dispose(); strategy = null; Со стратегией помогло, она теперь освобождается. А вот trader продолжает занимать память.
|
|
Спасибо:
|
|
|
|
|
Mikhail Sukhov
|
Дата: 11.10.2011
AN Перечитал ещё раз. Не обнаружил ничего относящегося к памяти, за исключением - EmulationTrader.DaysInMemory
- EmulationTrader.LoadingThreadCount
- CandleContainer.MaxCandleCount
- CandleContainer.MaxTradeCount
А вы устанавливали только один параметр. На память в моменте (пик) влияют первые два, а на общую последние два. AN У меня немного другая ситуация: тестирование запускается и нормально отрабатывает и один, и даже 10 раз. Но идет постоянное накопление данных в памяти. Соответственно раз, эдак на 25 память заканчивается, и возникает OutOfMemory.
25-ый прогон? А CandleManager у вас один и тот же?
|
|
Спасибо:
|
|
|
|
|
AN
|
Дата: 15.10.2011
Параметром конструктора CandleManager является источник данных. Т.к. EmulationTrader используются разные, то и CandleManager создается каждый раз новый.
Возможно повторное использование EmulationTrader или CandleManager?
|
|
Спасибо:
|
|
|
|
|
Mikhail Sukhov
|
Дата: 17.10.2011
AN Параметром конструктора CandleManager является источник данных. Т.к. EmulationTrader используются разные, то и CandleManager создается каждый раз новый.
Возможно повторное использование EmulationTrader или CandleManager? Сейчас на КодеПлексе залита версия, где построение свечек из сделок вынесено отдельно в CandleBuilder. Есть мнение, что новая модель может помочь в решении проблемы.
|
|
Спасибо:
|
|
|
|
|
AN
|
Дата: 19.10.2011
|
|
|
|
Утечка памяти осталась. Но вот приводят к утечке похоже не свечи, а EmulationTrader. Думаю свечи - следствие EmulationTrader, т.к. они подписаны на его события. Кстати, может эту подписку реализовать через WeakReference, а то может складываться странная ситуация когда свечи уже никому не нужны, но т.к. они остались подписанными на сделки, то остаются висеть в памяти и тормозить-засорять. Хорошая статья об этом http://habrahabr.ru/blogs/net/89529/
В общем я локализовывал утечку, сделав WeakReference на стратегию, трейдер и СandleManager. Ссылка на стратегию становиться null, а вот ссылка на EmulationTrader, и соответственно СandleManager, остается. Освободить память занимаемую EmulationTrader пытаюсь так: Код
trader.StateChanged += () =>
{
if (trader.State == EmulationStates.Stopped)
{
Optimizer.StrategyResults.Add(strategy as Optimization.IStrategy4Optimization);
trader.StopExport();
trader.Disconnect();
trader.Dispose();
trader = null;
strategy.Stop();
strategy.Dispose();
strategy = null;
//Запускаем следующую стратегию
if (runFlag == true)
startNewStrategy();
}
}
На codeplex зарегился, логин ANebotov, но вот как подавать заявку на подключение к проекту не понял.
|
|
Спасибо:
|
|
|
|