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


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

Код

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

Код

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())
Подскажите что я делаю не так?

Теги:


Спасибо:




25 Ответов
Moadip

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


Если надо чтобы какое то правило отработало определенное кол-во раз и потом было удалено делаю так.
Код

    bool flag = false;
            
    Security
        .WhenNewTrades()
        .Do(() =>
                {
                    ...

                    if (Условие == true) flag = true;
                })
        .Periodical(() => flag)
        .Apply(this);


В 4.1.3 появилась удобная фишка - взаимоисключающие правила.
Правила которые отменяются при срабатывании другого правила. Плюс удаление правил по токену.
Попробуйте, возможно удобнее будет работать с кодом.
Спасибо:

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

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


Использование Once() действительно делает Rules.Romove() ненужным в этом случае. Правда заработал у меня Once() только если поставить его после Apply(this) что, скажем, оказалось не очевидным для меня, а иначе программа падает.

Автор топика
Спасибо:

Alexander

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


"Падает" - приводите стэктрейс.
По поводу Apply(this) - всё написано в документации
Спасибо:

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

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


Alexander Mukhanchikov Перейти
"Падает" - приводите стэктрейс.
По поводу Apply(this) - всё написано в документации


13:51:49.050 | Error | UnhandleException | System.IndexOutOfRangeException: Index was outside the bounds of the array.
at StockSharp.Algo.MarketRuleHelper.#=q5tE5pMwBLHpbY5GB03GIig==.#=qpwQa0ec4L11d9qoHhvukUQ==(MarketTimer #=qrp1xDbP_kZMfjVGQfYoKiQ==, Boolean #=qkLAqWGH2XKiJVtIFuXfv0Q==)
at StockSharp.Algo.MarketTimer.#=qHWOSW6k$_YnVe_5fvF$1lVbPeaqRg9hj5p9vwh7OX6w=()
at Ecng.Common.DelegateHelper.SafeInvoke(Action handler)
at StockSharp.Algo.BaseTrader.RaiseMarketTimeChanged()
at StockSharp.Algo.BaseTrader.OnMarketTimeChanged()
at Ecng.Common.ThreadingHelper.<>c__DisplayClass1.<Timer>b__0(Object s)
at System.Threading._TimerCallback.TimerCallback_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
at System.Threading._TimerCallback.PerformTimerCallback(Object state)


Вот такое исключение сразу после вызова OnStarting();

Автор топика
Спасибо:

Alexander

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


Проблема уже описана тут

Будет время - решим, выложим фикс.

с Apply(this) никак не связана
Спасибо:

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

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


Alexander Mukhanchikov Перейти

Будет время - решим, выложим фикс.


На данный момент получается так что у всех у кого в алгоритме есть WhenTimeCome робот запускается через раз.
Автор топика
Спасибо:

Alexander

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


Андрей Александрович Перейти
Alexander Mukhanchikov Перейти

Будет время - решим, выложим фикс.


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



Вы готовы пофиксить данную проблему?
Спасибо:

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

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


Alexander Mukhanchikov Перейти
[quote=Андрей Александрович;20486][quote=Alexander Mukhanchikov;20485]
Вы готовы пофиксить данную проблему?


Если бы она была в моем коде то я должен был быть готов и постарался бы её устранить.
Автор топика
Спасибо:

Alexander

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


Андрей Александрович Перейти
Alexander Mukhanchikov Перейти
[quote=Андрей Александрович;20486][quote=Alexander Mukhanchikov;20485]
Вы готовы пофиксить данную проблему?


Если бы она была в моем коде то я должен был быть готов и постарался бы её устранить.



Я могу вам выслать исходный код данного правила.
Спасибо:

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

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


Alexander Mukhanchikov Перейти

Я могу вам выслать исходный код данного правила.


Если поместится то можно передать его через личные сообщения. Почему бы не попробовать.
Автор топика
Спасибо:

Alexander

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


Отправил
Спасибо:

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

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


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

mdv

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


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

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

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

Alexander

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


юзайте 4.1.3
Спасибо:

maxws

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


вопрос немного другой, но дабы не плодить похожие тему отпишусь сюда.
Создаю новую стратегию в 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 удаляется, но стратегия при этом останавливается.
Спасибо:

ra81

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


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 удаляется, но стратегия при этом останавливается.


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

Спасибо:

esper

Фотография
Программист
Дата: 21.08.2012
Ответить


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

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

ra81

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


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

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


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

maxws

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


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

esper

Фотография
Программист
Дата: 21.08.2012
Ответить


Возьмем стандартный пример SampleHistoryTesting, заменим код стратегии на следующий:
Код
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;
		}
	}
}


В итоге получаем такой лог:
Цитата:
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.

Если стратегия останавливается сама по себе, то надо смотреть что она пишет в лог и какие ошибки выдает.
Спасибо: Sergey Masyura

ra81

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


esper Перейти

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

Если стратегия останавливается сама по себе, то надо смотреть что она пишет в лог и какие ошибки выдает.


Тогда вопрос на засыпку. У вас там между приходом сделки и остановской стратегии проходит меньше секунды. Вы руками ее останавливаете? Или Она сама останавливается?? Уточните сей момент.

Спасибо:

esper

Фотография
Программист
Дата: 21.08.2012
Ответить


ra81 Перейти
Тогда вопрос на засыпку. У вас там между приходом сделки и остановской стратегии проходит меньше секунды. Вы руками ее останавливаете? Или Она сама останавливается?? Уточните сей момент.


В примере она останавливается через 10 вызовов Trader.NewTrades. В принципе, можно это ограничение убрать и стратегия продолжит работать дальше без остановки.
Спасибо:

ra81

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


esper Перейти
ra81 Перейти
Тогда вопрос на засыпку. У вас там между приходом сделки и остановской стратегии проходит меньше секунды. Вы руками ее останавливаете? Или Она сама останавливается?? Уточните сей момент.


В примере она останавливается через 10 вызовов Trader.NewTrades. В принципе, можно это ограничение убрать и стратегия продолжит работать дальше без остановки.


Ага вижу. Видимо логика изменилась в новой версии. ФАк. Везде сюрпризы с новой версией. Спасибо за инфу.

Попробуйте сделать так, что правило при приходе свечки просто ничего не делает, вызывает пустой метод. Что покажет? Очень интересно. В старой версии такой ход сразу же завершал работу стратегии потому что правило после отработки удалялось и больше правил не оставалось. Стратегия стопалась.
Спасибо:

esper

Фотография
Программист
Дата: 21.08.2012
Ответить


ra81 Перейти
Ага вижу. Видимо логика изменилась в новой версии. ФАк. Везде сюрпризы с новой версией. Спасибо за инфу.

Попробуйте сделать так, что правило при приходе свечки просто ничего не делает, вызывает пустой метод. Что покажет?

Стратегия так же продолжает работать.

ra81 Перейти
Очень интересно. В старой версии такой ход сразу же завершал работу стратегии потому что правило после отработки удалялось и больше правил не оставалось. Стратегия стопалась.

Ошибок никаких не выводилось?
Спасибо: ra81

ra81

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


esper Перейти
ra81 Перейти
Ага вижу. Видимо логика изменилась в новой версии. ФАк. Везде сюрпризы с новой версией. Спасибо за инфу.

Попробуйте сделать так, что правило при приходе свечки просто ничего не делает, вызывает пустой метод. Что покажет?

Стратегия так же продолжает работать.

ra81 Перейти
Очень интересно. В старой версии такой ход сразу же завершал работу стратегии потому что правило после отработки удалялось и больше правил не оставалось. Стратегия стопалась.

Ошибок никаких не выводилось?


Нет ошибок не было. Я целое блин исследование провел тогда по части: Как работают долбанные стратегии :).

Видимо поменяли логику. Спасибо за тесты и информацию буду знать. Это важно.
Спасибо:


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

loading
clippy