иногда случается следующий 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==(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:



Спасибо:




11 Ответов
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

Фотография
Дата: 07.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. Но эта другая тема, я её пока сам поиследую, если конечно вы с лету не научите как избежать.


https://stocksharp.ru/do...4a-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

Фотография
Дата: 10.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

Фотография
Автор статей Программист Трейдер
Дата: 10.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

Фотография
Автор статей Программист Трейдер
Дата: 16.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, но вот как подавать заявку на подключение к проекту не понял.
Автор топика
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 19.10.2011
Ответить


AN Перейти
На codeplex зарегился, логин ANebotov, но вот как подавать заявку на подключение к проекту не понял.


Присоединил.
Спасибо:


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

loading
clippy