EmulationTrader.Suspend() - оно работает?

EmulationTrader.Suspend() - оно работает?
Atom
9/6/2011
Hamper


Мне необходимо написать тестирование так, чтобы исторические данные выдавались либо с определенной задержкой между тиками, либо при срабатывании сигнала на покупку/продажу тестирование приостанавливалось и потом возобнавлялось бы при нажатии кнопки. Фактически хочется сделать некий "мультик", чтобы показать как и где сработала стратегия и визуально оценить этот момент.

Попытался вызвать метод EmulationTrader.Suspend() Срабатывает событие EmulationTrader.StateChanged, но при этом тики продолжают тикать. Т.е. фактически остановки эмуляции не происходит. Останавливается только после достижения конца виртуального дня.

Подскажите, как все таки остановить эмуляцию и потом ее продолжить с места остановки?

PS: Эксперименты проводил на том примере, который дан в дистрибутиве - SampleHistoryTesting



Thanks:


Mikhail Sukhov

Avatar
Date: 9/6/2011
Reply


Hamper

Подскажите, как все таки остановить эмуляцию и потом ее продолжить с места остановки?


По идее через http://stocksharp.com/do...sting_StrategyDebug.htm Но вы правильно сказали, что эмуляция не сразу останавливается. Нужно пофиксить. Так что пока только из кода стратегии. Тестирование идет в одном потоке, так что проблем остановить его в нужном событие думаю не составит.
Thanks:

Hamper

Avatar
Date: 9/7/2011
Reply


Mikhail Sukhov

По идее через http://stocksharp.com/do...sting_StrategyDebug.htm Но вы правильно сказали, что эмуляция не сразу останавливается. Нужно пофиксить. Так что пока только из кода стратегии. Тестирование идет в одном потоке, так что проблем остановить его в нужном событие думаю не составит.


Нет, Михаил, не летит этот самолет [confused]

В класс SmaStrategy добавил переменную:
Code
public StrategyDebug debug;


Создаю стратегию:
Code
// создаем торговую стратегию, скользящие средние на 80 5-минуток и 10 5-минуток
strategy = new SmaStrategy(candleManager, new SimpleMovingAverage(80), new SimpleMovingAverage(10), timeFrame){
	Volume    = 1,
	Portfolio = portfolio,
	Security  = security,
	Trader    = trader,
	debug     = StrategyDebug.Get(trader)
};
strategy.debug.BreakOnNewTrade = true;
strategy.debug.BreakOnTime = new DateTime(2011, 8, 30, 10, 0, 10);


Стратегия стартует, при первом же событии OnProcess срабатывает debug, trader докладывает о том, что у него состояние Suspended и... И работа продолжается как ни в чем не бывало - тики тикают, стратегия запускается и обрабатывается, в логах сделки и прочее...

Кстати статус trader изменяется один (!) раз. Добавлял явный debug.Break() в событие стратегии OnProcess - картинка не меняется. Происходит suspend, тики протикивают до конца виртуального дня и только после этого останавливаются.
Thanks:

Mikhail Sukhov

Avatar
Date: 9/7/2011
Reply


Hamper
Mikhail Sukhov

По идее через http://stocksharp.com/do...sting_StrategyDebug.htm Но вы правильно сказали, что эмуляция не сразу останавливается. Нужно пофиксить. Так что пока только из кода стратегии. Тестирование идет в одном потоке, так что проблем остановить его в нужном событие думаю не составит.


Нет, Михаил, не летит этот самолет [confused]


Вообще-то я имел ввиду что-то типа MessageBox из обработчика событий NewOrder NewTrader and so on.
Thanks:

Hamper

Avatar
Date: 9/7/2011
Reply


Mikhail Sukhov
Вообще-то я имел ввиду что-то типа MessageBox из обработчика событий NewOrder NewTrader and so on.


Именно так.

Code
trader.StateChanged += () => {
	this.GuiAsync(() => {
	LOG.Text += "State: ";
	switch (trader.State){
		case EmulationStates.Started  : LOG.Text += "started \n"; break;
		case EmulationStates.Stopped  : LOG.Text += "stopped \n"; break;
		case EmulationStates.Stopping : LOG.Text += "stopping\n"; break;
		case EmulationStates.Suspended: LOG.Text += "suspend \n"; break;
		default:                        LOG.Text += "unknown \n"; break;
	}
	});

	if (trader.State == EmulationStates.Started){
		// запускаем стратегию когда эмулятор запустился
		strategy.Start();
	}
};

trader.SecuritiesChanged += sc => {
	this.GuiAsync(() => {
	LOG.Text += "MT:"+trader.MarketTime.ToLongTimeString()+" ";
	LOG.Text += "Price:"+security.LastTrade.Price+"\n";
	});
};


LOG - это TextBox. Получаем в нем вот что:

State: started
State: suspend
MT:10:29:59 Price:82,00000
MT:10:30:01 Price:82,19000
MT:10:30:03 Price:82,15000
MT:10:30:03 Price:82,15000
MT:10:30:03 Price:82,19000
MT:10:30:07 Price:82,12000
... И т.д. до конца виртуального дня. Если потом сделать strategy.debug.Resume(), то получаем то же самое для следующего виртуального дня.
Thanks:

Mikhail Sukhov

Avatar
Date: 9/7/2011
Reply


Hamper
Mikhail Sukhov
Вообще-то я имел ввиду что-то типа MessageBox из обработчика событий NewOrder NewTrader and so on.


Именно так.


Вы меня читаете, но не понимаете.[laugh]
Thanks:

Hamper

Avatar
Date: 9/7/2011
Reply


Mikhail Sukhov
Hamper
Mikhail Sukhov
Вообще-то я имел ввиду что-то типа MessageBox из обработчика событий NewOrder NewTrader and so on.


Именно так.


Все меня читаете, но не понимаете.[laugh]


Хммм... Как-то наверное да. Что именно надо сделать? NewTraders дает точно такую же картинку. NewOrders выдает кучу новых ордеров. Я же выше писал, что после того как был сделан trader.Suspend() и после strategy.debug.Break() стратегия и тики все равно работают до конца виртуального дня.

Может быть я не верно использовал StrategyDebug ???? Но из документации понять, как он работает можно только интуитивно.
Thanks:

Mikhail Sukhov

Avatar
Date: 9/7/2011
Reply


Hamper
Может быть я не верно использовал StrategyDebug ????


Я же написал, что пока не останавливает StrategyDebug мгновенно. И предложил решение с MessageBox
Thanks:

Hamper

Avatar
Date: 9/7/2011
Reply


Mikhail Sukhov
Hamper
Может быть я не верно использовал StrategyDebug ????


Я же написал, что пока не останавливает StrategyDebug мгновенно. И предложил решение с MessageBox


Аааа... Семен Семенычь! (с) [biggrin]
Теперь я протупился. Т.е. в событиях просто использовать искусственный тормоз...
Thanks:


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

loading
clippy