4.1.2 Проблемы с удалением правил из стратегии.

4.1.2 Проблемы с удалением правил из стратегии.


Не могу разобраться как удалить правило из стратегии после перехода на 4.1.
Для примера возьмем правило которое теперь называется Trader.WhenTimeCome. Если использовать его в качестве таймера который вызывает некий метод раз в секунду то до 4.1 код выглядел примерно так.

Code

nextCall = Trader.MarketTime.AddSecond(1);
this.When.Ttrader.TimeCome(nextCall)
    .Do(Meth);


public void Meth()
{
Rules.Remove(Trader.TimeCome(nextCall);
nextCall = Trader.MarketTime.AddSecond(1);
this.When.Ttrader.TimeCome(nextCall)
    .Do(Meth);
}


Вот как я реализовал этот код в 4.1

Code

nextCall = Trader.MarketTime.AddSecond(1);
this.Trader.WhenTimeCome(nextCall)
    .Do(Meth).Apply(this);


public void Meth()
{
Rules.Remove(Trader.TimeCome(nextCall);
nextCall = Trader.MarketTime.AddSecond(1);
this.Trader.WhenTimeCome(nextCall)
    .Do(Meth);
}


Проблема в том что зарегистрированное правило не удаляется привычным образом, и при регистрации очередного программа падает из-за не обрабатываемого исключения. Добавив вывод на экран значения Rules.Count я пришёл к выводу что у меня не получается уменьшить это значение ни одним из доступных способов(Rules.Remove(); TryRemoveRule(); Rules.Clear())
Подскажите что я делаю не так?

Tags:


Thanks:


< 1 2 3  >
Alexander

Avatar
Date: 7/24/2012
Reply


Отправил
Thanks:

Андрей Александрович

Avatar
Date: 7/24/2012
Reply


Чтобы попробовать разобраться что к чему мне потребуется также код правила в предыдущей версии библиотеки а также коды методов которые используются в правиле. Есть возможность вместо WhenTimeCome использовать WhenIntervalElapsed который похоже не вызывает исключений.
Thanks:

mdv

Avatar
Date: 8/8/2012
Reply


Удалось ли решить проблему?

Я ежедневно в одно время проверяю с помощью WhenTimeCome, все ли хорошо. И если не все, запускаю котирование иногда из обработчика WhenTimeCome. Там же добавляю правило на следующие сутки. Так вот если и только если запускается котирование, программа при добавлении правила падает по IndexOutOfRangeException (несколько потоков выкидывают это исключение).

Если проблема не решена, тоже хочу сорцы.
Thanks:

Alexander

Avatar
Date: 8/8/2012
Reply


юзайте 4.1.3
Thanks:

maxws

Avatar
Date: 8/20/2012
Reply


вопрос немного другой, но дабы не плодить похожие тему отпишусь сюда.
Создаю новую стратегию в OnStarted()добавляю правило Rules.Add(_instr1.WhenChanged().Do(ProcessStrateg).Apply(this));
после чего в ProcessStrateg() создаю еще одно правило
activrule = this._indexSeries.WhenCandlesFinished().Do(CloseBuyOrder).Apply(this);
Rules.Add(activrule);
и после срабатывая условий в CloseBuyOrder() хочу его удалить Rules.Remove(activrule);
все отлично правило из Rules удаляется, но стратегия при этом останавливается.
Thanks:

ra81

Avatar
Date: 8/21/2012
Reply


maxws
вопрос немного другой, но дабы не плодить похожие тему отпишусь сюда.
Создаю новую стратегию в OnStarted()добавляю правило Rules.Add(_instr1.WhenChanged().Do(ProcessStrateg).Apply(this));
после чего в ProcessStrateg() создаю еще одно правило
activrule = this._indexSeries.WhenCandlesFinished().Do(CloseBuyOrder).Apply(this);
Rules.Add(activrule);
и после срабатывая условий в CloseBuyOrder() хочу его удалить Rules.Remove(activrule);
все отлично правило из Rules удаляется, но стратегия при этом останавливается.


Если у вашей стратегии не осталось больше правил (вы сами удалили последнее например) она останавливается на вполне законных основаниях. У вас есть еще правила?

Thanks:

esper

Avatar
Date: 8/21/2012
Reply


ra81
Если у вашей стратегии не осталось больше правил (вы сами удалили последнее например) она останавливается на вполне законных основаниях. У вас есть еще правила?

У стратегии в принципе может не быть правил и при этом она будет нормально работать, например, мы напрямую подписываемся на события NewOrders, NewMyTrades и т.д. Не думаю, что сам факт удаления последнего правила является причиной ее остановки.
Thanks:

ra81

Avatar
Date: 8/21/2012
Reply


esper
ra81
Если у вашей стратегии не осталось больше правил (вы сами удалили последнее например) она останавливается на вполне законных основаниях. У вас есть еще правила?

У стратегии в принципе может не быть правил и при этом она будет нормально работать, например, мы напрямую подписываемся на события NewOrders, NewMyTrades и т.д. Не думаю, что сам факт удаления последнего правила является причиной ее остановки.


Я все же берусь утверждать что логика такова как я описал. Возможно в версиях с 4.1 поменялось, но не думаю. То что вы можете в OnStarting подписаться напрямую и колбасить сколько хотите это факт, но он никак не связан с тем что при удалении последнего правила стратегия останавливается :). Вот можно взять и проверить. Я проверял.
Thanks:

maxws

Avatar
Date: 8/21/2012
Reply


может я чтото не так понимаю но первое правило Rules.Add(_instr1.WhenChanged().Do(ProcessStrateg).Apply(this)); я не трогаю не удаляю и оно остается в Rules после удаления второго правила но стратегия останавливается, такое чувство что после вызова Remove автоматически стратегия получает сигнал на остановку (хотя это больше похоже на бред).
Thanks:

esper

Avatar
Date: 8/21/2012
Reply


Возьмем стандартный пример SampleHistoryTesting, заменим код стратегии на следующий:
Code
namespace SampleHistoryTesting
{
	using StockSharp.Algo;
	using StockSharp.Algo.Candles;
	using StockSharp.Algo.Indicators.Trend;
	using StockSharp.Algo.Logging;
	using StockSharp.Algo.Strategies;
	using StockSharp.BusinessEntities;

	class SmaStrategy : Strategy
	{
		private readonly CandleSeries _series;
		private bool _processed;

		private int _count;

		public SmaStrategy(CandleSeries series, SimpleMovingAverage longSma, SimpleMovingAverage shortSma)
		{
			_series = series;

			LongSma = longSma;
			ShortSma = shortSma;
		}

		public SimpleMovingAverage LongSma { get; private set; }
		public SimpleMovingAverage ShortSma { get; private set; }

		protected override void OnStarted()
		{
			Trader.NewTrades += trades => 
			{ 
				if(!_processed)
					return;

				if(_count++ > 10)
				{
					this.Stop();
				}

				this.AddInfoLog("Trader.NewTrades event. Правил в стратегии: {0}", Rules.Count);
			};

			Trader.NewMyTrades += trades => this.AddInfoLog("Trader.NewMyTrades event. Новая сделка по заявке. Правил в стратегии: {0}", Rules.Count);

			_series
				.WhenCandlesFinished()
				.Do(ProcessCandle)
				.Once()
				.Apply(this);

			base.OnStarted();
		}

		private void ProcessCandle(Candle candle)
		{
			this.AddInfoLog("Правил в стратегии при первой свечке: {0}", Rules.Count);

			var order = this.CreateOrder(OrderDirections.Buy, 300000, 1);

			order
				.WhenCanceled()
				.Do(() => this.AddInfoLog("Заявка успешно отменена"))
				.Once()
				.Apply(this)
				.Name = "WhenCanceled";

			order
				.WhenRegistered()
				.Do((rule, o) => this.AddInfoLog("Заявка успешно зарегестрирована"))
				.Once()
				.Apply(this)
				.Name = "WhenRegistered";

			order
				.WhenRegisterFailed()
				.Do(() => this.AddInfoLog("Заявка не принята биржей"))
				.Once()
				.Apply(this)
				.Name = "WhenRegisterFailed";

			order
				.WhenMatched()
				.Do((rule, o) =>
				{
					this.AddInfoLog("Заявка полностью исполнена");

					this.AddInfoLog("Удаляем все правила связанные с заявкой.");

					// удаление всех правил связанных с order
					Rules.RemoveRulesByToken(rule.Token, rule);
				})
				.Once()
				.Apply(this)
				.Name = "WhenMatched";

			this.AddInfoLog("Правил в стратегии перед регистрацией заявки: {0}", Rules.Count);

			// регистрирация заявки
			RegisterOrder(order);

			_processed = true;
		}
	}
}


В итоге получаем такой лог:
Quote:
2012.06.14 21:00:00.000| |SS_RIU2@RTS_test account|Стратегия запущена.
2012.06.15 07:05:00.073| |SS_RIU2@RTS_test account|Правил в стратегии при первой свечке: 1
2012.06.15 07:05:00.073| |SS_RIU2@RTS_test account|Правил в стратегии перед регистрацией заявки: 5
2012.06.15 07:05:00.073| |SS_RIU2@RTS_test account|Заявка успешно зарегестрирована
2012.06.15 07:05:00.073| |SS_RIU2@RTS_test account|Новая Buy сделка 1 по цене 130875 на 1 заявки 45478274.
2012.06.15 07:05:00.073| |SS_RIU2@RTS_test account|Trader.NewMyTrades event. Новая сделка по заявке. Правил в стратегии: 5
2012.06.15 07:05:00.073| |SS_RIU2@RTS_test account|Новая позиция 1.
2012.06.15 07:05:00.073| |SS_RIU2@RTS_test account|Заявка полностью исполнена
2012.06.15 07:05:00.073| |SS_RIU2@RTS_test account|Удаляем все правила связанные с заявкой.
2012.06.15 07:05:00.073| |SS_RIU2@RTS_test account|Заявка 45478274 больше не активна.
2012.06.15 07:05:00.073| |SS_RIU2@RTS_test account|Trader.NewTrades event. Правил в стратегии: 0
2012.06.15 07:05:00.080| |SS_RIU2@RTS_test account|Trader.NewTrades event. Правил в стратегии: 0
2012.06.15 07:05:00.167| |SS_RIU2@RTS_test account|Trader.NewTrades event. Правил в стратегии: 0
2012.06.15 07:05:00.297| |SS_RIU2@RTS_test account|Trader.NewTrades event. Правил в стратегии: 0
2012.06.15 07:05:00.313| |SS_RIU2@RTS_test account|Trader.NewTrades event. Правил в стратегии: 0
2012.06.15 07:05:00.370| |SS_RIU2@RTS_test account|Trader.NewTrades event. Правил в стратегии: 0
2012.06.15 07:05:00.433| |SS_RIU2@RTS_test account|Trader.NewTrades event. Правил в стратегии: 0
2012.06.15 07:05:00.470| |SS_RIU2@RTS_test account|Trader.NewTrades event. Правил в стратегии: 0
2012.06.15 07:05:00.520| |SS_RIU2@RTS_test account|Trader.NewTrades event. Правил в стратегии: 0
2012.06.15 07:05:00.570| |SS_RIU2@RTS_test account|Trader.NewTrades event. Правил в стратегии: 0
2012.06.15 07:05:00.577| |SS_RIU2@RTS_test account|Trader.NewTrades event. Правил в стратегии: 0
2012.06.15 07:05:00.600| |SS_RIU2@RTS_test account|Стратегия останавливается.
2012.06.15 07:05:00.600| |SS_RIU2@RTS_test account|Ожидание снятия всех активных заявок.
2012.06.15 07:05:00.600| |SS_RIU2@RTS_test account|Стратегия остановлена.

т.е. правил в стратегии больше нет, но стратегия продолжает работать. Версия последняя с codeplex.

Если стратегия останавливается сама по себе, то надо смотреть что она пишет в лог и какие ошибки выдает.
Thanks: Sergey Masyura
< 1 2 3  >

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

loading
clippy