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


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

Теги:


Спасибо:


1 2 3  >
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 Перейти

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


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

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

loading
clippy