S#

Инициализация стратегии в тестировании на истории


Инициализация стратегии в тестировании на истории
Atom Reply
11/9/2012


Я бы инициализацию стратегии перенес сюда. А то ошибка происходит, про состояние объекта что-то.

Код
_trader.StateChanged += (oldState, newState) =>
{
	if (_trader.State == EmulationStates.Stopped)
	{
		this.GuiAsync(() =>
		{
			StartBtn.IsEnabled = true;

			if (_trader.IsFinished)
			{
				TestingProcess.Value = TestingProcess.Maximum;
				MessageBox.Show(this, "Закончено за " + (DateTime.Now - _startEmulationTime));
			}
			else
				MessageBox.Show(this, "Отменено");
		});
	}
	else if (_trader.State == EmulationStates.Started)
	{
        //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
        // создаем торговую стратегию, скользящие средние на 80 5-минуток и 10 5-минуток
        _strategy = new SmaStrategy(series, new SimpleMovingAverage { Length = 80 }, new SimpleMovingAverage { Length = 10 })
        {
            Volume = 1,
            Portfolio = portfolio,
            Security = security,
            Trader = _trader
        };
        //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
		// запускаем стратегию когда эмулятор запустился
		_strategy.Start();
	}
};



Thanks:




10 Answers
pyhta4og

Avatar
Date: 11/9/2012
Reply


vk37 Перейти
Я бы инициализацию стратегии перенес сюда. А то ошибка происходит, про состояние объекта что-то.

Код
_trader.StateChanged += (oldState, newState) =>
{
	if (_trader.State == EmulationStates.Stopped)
	{
		this.GuiAsync(() =>
		{
			StartBtn.IsEnabled = true;

			if (_trader.IsFinished)
			{
				TestingProcess.Value = TestingProcess.Maximum;
				MessageBox.Show(this, "Закончено за " + (DateTime.Now - _startEmulationTime));
			}
			else
				MessageBox.Show(this, "Отменено");
		});
	}
	else if (_trader.State == EmulationStates.Started)
	{
        //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
        // создаем торговую стратегию, скользящие средние на 80 5-минуток и 10 5-минуток
        _strategy = new SmaStrategy(series, new SimpleMovingAverage { Length = 80 }, new SimpleMovingAverage { Length = 10 })
        {
            Volume = 1,
            Portfolio = portfolio,
            Security = security,
            Trader = _trader
        };
        //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
		// запускаем стратегию когда эмулятор запустился
		_strategy.Start();
	}
};


тогда у вас стратегия не факт что запустится с начала данных - эмулятор уедет вперед
Thanks:

vk37

Avatar
Training
Date: 11/9/2012
Reply


Ошибка, в общем, возникает при инициализации старетгии. Вне зависимости в каком месте ее инициализировать. Возникает не при каждом запуске. Одна и та же сборка иногда нормально сработает, а иногда с ошибкой. Может кто сталкивался?
Topic starter
Thanks:

pyhta4og

Avatar
Date: 11/12/2012
Reply


судя по колстаку у вас Parallel.For или что-то в этом духе. Там точно нет ситуации что EmulationTrader дергается из двух разных потоков? Он вполне может быть не потокобезопасным.

если вам надо сделать оптимизацию гораздо быстрее будет сделать кучу экземпляров стратегии с разными параметрами и всю кучу прогнать в одном эмуляйшн-трейдере.
Thanks:

vk37

Avatar
Training
Date: 11/12/2012
Reply


В упрощенном виде код оптимизации такой:
Вроде EmulationTrader на правильном месте. Не знаю как правильно )
Topic starter
Thanks:

Mikhail Sukhov

Avatar
Articles author Programmer Trader
Date: 11/12/2012
Reply


Цитата:
System.InvalidOperationException: Operation is not valid due to the current state of the object.
at StockSharp.Algo.BaseTrader.ProcessEvents(Action handler)
at AlgoTrading.HistoryTesting.Optimizer.<>c__DisplayClassb.<Optimize>b__5(ParamsDto period) in c:\ActiveProjects\AlgoTrading3\trunk\SourceCode\HistoryTesting\Optimizer.cs:line 83


По стек трейсу видно, что напрямую вызывается BaseTrader.ProcessEvents. Зачем?
Thanks:

vk37

Avatar
Training
Date: 11/12/2012
Reply


Mikhail Sukhov Перейти
Цитата:
System.InvalidOperationException: Operation is not valid due to the current state of the object.
at StockSharp.Algo.BaseTrader.ProcessEvents(Action handler)
at AlgoTrading.HistoryTesting.Optimizer.<>c__DisplayClassb.<Optimize>b__5(ParamsDto period) in c:\ActiveProjects\AlgoTrading3\trunk\SourceCode\HistoryTesting\Optimizer.cs:line 83


По стек трейсу видно, что напрямую вызывается BaseTrader.ProcessEvents. Зачем?

Даже не знаю что это такое. Строка 83 - инициализация стратегии.
Упрощенный код моей стратегии:
Может неявно как-то вызывается. Могу выслать код стратегии котирования. Для ревью )


Topic starter
Thanks:

Mikhail Sukhov

Avatar
Articles author Programmer Trader
Date: 11/12/2012
Reply


vk37 Перейти
Может неявно как-то вызывается. Могу выслать код стратегии котирования. Для ревью )


Если только Михаил заинтересуетсяBigGrin Мне и своего кода для ревьирования хватает, спасибо. Надо поднтянуть матчасть связанную с отладкой ошибок. Дебаггер, рефлектор.
Thanks:

vk37

Avatar
Training
Date: 11/12/2012
Reply


Mikhail Sukhov Перейти
Дебаггер, рефлектор.
деобфускатор? )

Topic starter
Thanks:

Mikhail Sukhov

Avatar
Articles author Programmer Trader
Date: 11/12/2012
Reply


vk37 Перейти
Mikhail Sukhov Перейти
Дебаггер, рефлектор.
деобфускатор? )



Да я про ваш код имел ввиду. Хотя конечно я бы начал с основ - что такое исключение и что такое стектрейс. Но я так понял вы не из тех, кто любит на всякие разности отвлекаться.RollEyes
Thanks:

komaranton

Avatar
Date: 9/8/2019
Reply


Получилось разобраться?
Thanks:


Attach files by dragging & dropping, , or pasting from the clipboard.

loading
clippy