EmulationTrader.Suspend() - оно работает?
Atom Ответить
06.09.2011


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

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

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

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



Спасибо:




8 Ответов
Mikhail Sukhov

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


Hamper Перейти

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


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

Hamper

Фотография
Дата: 07.09.2011
Ответить


Mikhail Sukhov Перейти

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


Нет, Михаил, не летит этот самолет Confused

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


Создаю стратегию:
Код
// создаем торговую стратегию, скользящие средние на 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, тики протикивают до конца виртуального дня и только после этого останавливаются.
Автор топика
Спасибо:

Mikhail Sukhov

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


Hamper Перейти
Mikhail Sukhov Перейти

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


Нет, Михаил, не летит этот самолет Confused


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

Hamper

Фотография
Дата: 07.09.2011
Ответить


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


Именно так.

Код
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(), то получаем то же самое для следующего виртуального дня.
Автор топика
Спасибо:

Mikhail Sukhov

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


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


Именно так.


Вы меня читаете, но не понимаете.Laugh
Спасибо:

Hamper

Фотография
Дата: 07.09.2011
Ответить


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


Именно так.


Все меня читаете, но не понимаете.Laugh


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

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

Mikhail Sukhov

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


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


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

Hamper

Фотография
Дата: 07.09.2011
Ответить


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


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


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


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

loading
clippy