иногда случается следующий Exception

иногда случается следующий Exception
Atom
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==(IEnumerable1 #=qIT1iMH0n2wDEBu969ICSYQ==) в Ecng.Common.ThreadHelper.<>c__DisplayClass81.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:




Спасибо:


1 2  >
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==(IEnumerable1 #=qIT1iMH0n2wDEBu969ICSYQ==) в Ecng.Common.ThreadHelper.<>c__DisplayClass81.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/doc/html/5b90a23e-24b9-474a-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, предыдущие обнуляю. И вижу постепенный рост потребления памяти.

Что ещё нужно обнулять? Возможно ли использовать данные объекты повторно (создав из них пул)?

outofmemory

Спасибо:

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, но вот как подавать заявку на подключение к проекту не понял.

Спасибо:
1 2  >

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

loading
clippy