Не могу разобраться как удалить правило из стратегии после перехода на 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)
登录 或 创建账户, 登录或注册以发表评论
Если надо чтобы какое то правило отработало определенное кол-во раз и потом было удалено делаю так.
В 4.1.3 появилась удобная фишка - взаимоисключающие правила. Правила которые отменяются при срабатывании другого правила. Плюс удаление правил по токену. Попробуйте, возможно удобнее будет работать с кодом.
Использование Once() действительно делает Rules.Romove() ненужным в этом случае. Правда заработал у меня Once() только если поставить его после Apply(this) что, скажем, оказалось не очевидным для меня, а иначе программа падает.
"Падает" - приводите стэктрейс. По поводу 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();
Проблема уже описана тут
Будет время - решим, выложим фикс.
с Apply(this) никак не связана
На данный момент получается так что у всех у кого в алгоритме есть WhenTimeCome робот запускается через раз.
Вы готовы пофиксить данную проблему?
Если бы она была в моем коде то я должен был быть готов и постарался бы её устранить.
Я могу вам выслать исходный код данного правила.
Если поместится то можно передать его через личные сообщения. Почему бы не попробовать.
Отправил
Чтобы попробовать разобраться что к чему мне потребуется также код правила в предыдущей версии библиотеки а также коды методов которые используются в правиле. Есть возможность вместо WhenTimeCome использовать WhenIntervalElapsed который похоже не вызывает исключений.
Удалось ли решить проблему?
Я ежедневно в одно время проверяю с помощью WhenTimeCome, все ли хорошо. И если не все, запускаю котирование иногда из обработчика WhenTimeCome. Там же добавляю правило на следующие сутки. Так вот если и только если запускается котирование, программа при добавлении правила падает по IndexOutOfRangeException (несколько потоков выкидывают это исключение).
Если проблема не решена, тоже хочу сорцы.
юзайте 4.1.3
вопрос немного другой, но дабы не плодить похожие тему отпишусь сюда. Создаю новую стратегию в 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 удаляется, но стратегия при этом останавливается.
Если у вашей стратегии не осталось больше правил (вы сами удалили последнее например) она останавливается на вполне законных основаниях. У вас есть еще правила?
Я все же берусь утверждать что логика такова как я описал. Возможно в версиях с 4.1 поменялось, но не думаю. То что вы можете в OnStarting подписаться напрямую и колбасить сколько хотите это факт, но он никак не связан с тем что при удалении последнего правила стратегия останавливается :). Вот можно взять и проверить. Я проверял.
может я чтото не так понимаю но первое правило Rules.Add(_instr1.WhenChanged().Do(ProcessStrateg).Apply(this)); я не трогаю не удаляю и оно остается в Rules после удаления второго правила но стратегия останавливается, такое чувство что после вызова Remove автоматически стратегия получает сигнал на остановку (хотя это больше похоже на бред).
Возьмем стандартный пример SampleHistoryTesting, заменим код стратегии на следующий:
В итоге получаем такой лог:
Если стратегия останавливается сама по себе, то надо смотреть что она пишет в лог и какие ошибки выдает.
Тогда вопрос на засыпку. У вас там между приходом сделки и остановской стратегии проходит меньше секунды. Вы руками ее останавливаете? Или Она сама останавливается?? Уточните сей момент.
В примере она останавливается через 10 вызовов Trader.NewTrades. В принципе, можно это ограничение убрать и стратегия продолжит работать дальше без остановки.
Ага вижу. Видимо логика изменилась в новой версии. ФАк. Везде сюрпризы с новой версией. Спасибо за инфу.
Попробуйте сделать так, что правило при приходе свечки просто ничего не делает, вызывает пустой метод. Что покажет? Очень интересно. В старой версии такой ход сразу же завершал работу стратегии потому что правило после отработки удалялось и больше правил не оставалось. Стратегия стопалась.
Нет ошибок не было. Я целое блин исследование провел тогда по части: Как работают долбанные стратегии :).
Видимо поменяли логику. Спасибо за тесты и информацию буду знать. Это важно.