Событие order.CancelFailed().Once() было активировано дважды.


Событие order.CancelFailed().Once() было активировано дважды.
Atom
07.03.2012


Я подписываюсь на событие CancelFailed в методе ReplaceOrder и только в нем.
Правило одноразовое.
К сожалению количество вызывов ReplaceOrder и CancelFailed не совпадают.
Работаю на Quik, версия S# - исправленная 4.0.20

18:45:02.230 | | CRBR | ReplaceOrder 67306126
18:45:02.232 | | CRBR | CancelOrder 67306126
18:45:02.421 | | CRBR | Правило 'Ошибка снятия заявки 67306126' активировано.
18:45:02.422 | | CRBR | OnCancelFailed Код ошибки Failed Сообщение Ошибка снятия заявки. [FORTS] "Сейчас эта сессия не идет".67306126
18:45:02.429 | | CRBR | Правило 'Ошибка снятия заявки 67306126' удалено.
18:45:02.446 | | CRBR | ex Транзакция 'CLASSCODE=SPBFUT; SECCODE=RIH2; TRANS_ID=67306127; ORDER_KEY=1393448849; ACTION=KILL_ORDER;' не была зарегистрирована. Причина 'Ошибка снятия заявки. [FORTS] "Сейчас эта сессия не идет".'.
18:45:14.100 | | CRBR | ReplaceOrder 67306126
18:45:14.102 | | CRBR | CancelOrder 67306126
18:45:14.337 | | CRBR | ex Транзакция 'CLASSCODE=SPBFUT; SECCODE=RIH2; TRANS_ID=67306128; ORDER_KEY=1393448849; ACTION=KILL_ORDER;' не была зарегистрирована. Причина 'Ошибка снятия заявки. [FORTS] "Сейчас эта сессия не идет".'.
18:45:14.339 | | CRBR | Правило 'Ошибка снятия заявки 67306126' активировано.
18:45:14.339 | | CRBR | OnCancelFailed Код ошибки Failed Сообщение Ошибка снятия заявки. [FORTS] "Сейчас эта сессия не идет".67306126
18:45:14.342 | | CRBR | Правило 'Ошибка снятия заявки 67306126' удалено.
18:45:14.342 | | CRBR | Правило 'Ошибка снятия заявки 67306126' активировано.
18:45:14.342 | | CRBR | OnCancelFailed Код ошибки Failed Сообщение Ошибка снятия заявки. [FORTS] "Сейчас эта сессия не идет".67306126
18:45:14.344 | | CRBR | Правило 'Ошибка снятия заявки 67306126' удалено.

Теги:


Спасибо:


< 1 2 3 
Mikhail Sukhov

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


vader Перейти
Дело в том, что правило CancelFailed создается только в методе ReplaceOrder, следовательно сколько вызовов ReplaceOrder, столько должно быть и срабатываний CancelFailed.

По каким признакам вы считаете что ошибка у меня? Я не говорю что ошибка именно у вас ,просто пытаюсь понять ,на основании чего вы считаете что ошыбка у меня. Может быть это поможет мне её найти.


Я увидел, что правило на одну и ту же сделку создано 2 раза. Это из лога видно?
Спасибо:

vader

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


Мне, к сожаление не видно.
Спасибо:

Mikhail Sukhov

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


vader Перейти
Мне, к сожаление не видно.


Цитата:

15:48:56.414 | | CRBR | Правило 'Ошибка снятия заявки 56876308 (33156464)' активировано.
15:48:56.418 | | CRBR | Правило 'Ошибка снятия заявки 56876308 (5923895)' активировано.


Одна и та же заявка, но номера правил разные. Значит их несколько этих самых правил.
Спасибо:

vader

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


Посмотрел.
в последнем логе видно, что правило с номером 33156464 было активировано три раза, а 5923895 - дважды.

Обнаружил ещё одну вещь.
Вставил перед и после создание правила вывод имен правил и их количества.
Количество правил, как по логике и должнон быть тавно сначала три, потом 4.
НоС каждым разом на попытку снять снятую заявку вызывается снаяала одно, потом 2, потом три правила. Где они?

19:14:04.278 | | CRBR | Стратегия запущена.
19:14:04.291 | | CRBR | CreateOrder OnStarting
19:14:04.395 | | CRBR | RegisterOrder 69180761
19:14:19.295 | | CRBR | Правило 'Интервал условие 00:00:15 (32460410)' активировано.
19:14:19.298 | | CRBR | ReplaceOrder RuleWaitingActivated 69180761
19:14:19.300 | | CRBR | правило Интервал условие 00:00:15
19:14:19.302 | | CRBR | правило Ошибка регистрации заявки 0
19:14:19.304 | | CRBR | правило Новые сделки заявки 0
19:14:19.306 | | CRBR | правило 3
19:14:19.309 | | CRBR | правило Интервал условие 00:00:15
19:14:19.311 | | CRBR | правило Ошибка регистрации заявки 0
19:14:19.313 | | CRBR | правило Новые сделки заявки 0
19:14:19.315 | | CRBR | правило Ошибка снятия заявки 69180761
19:14:19.317 | | CRBR | правило 4
19:14:19.320 | | CRBR | CancelOrder 69180761
19:14:19.549 | | CRBR | Правило 'Ошибка снятия заявки 69180761 (15645912)' активировано.
19:14:19.552 | | CRBR | OnCancelFailed Код ошибки Failed Сообщение Вы не можете снять данную заявку 69180761
19:14:19.560 | | CRBR | IsOrderCancelInClearing 12.03.2012 19:14:07 False
19:14:19.570 | | CRBR | Правило 'Ошибка снятия заявки 69180761 (15645912)' удалено.
19:14:19.586 | | CRBR | ex Транзакция 'CLASSCODE=SPBFUT; SECCODE=RIH2; TRANS_ID=69180762; ORDER_KEY=2715365411; ACTION=KILL_ORDER;' не была зарегистрирована. Причина 'Вы не можете снять данную заявку'.
19:14:19.587 | | CRBR | IsOrderCancelInClearing 12.03.2012 19:14:07 False
19:14:19.588 | | CRBR | IsOrderCancelInClearing 12.03.2012 19:14:07 False
19:14:34.307 | | CRBR | Правило 'Интервал условие 00:00:15 (32460410)' активировано.
19:14:34.307 | | CRBR | ReplaceOrder RuleWaitingActivated 69180761
19:14:34.310 | | CRBR | правило Интервал условие 00:00:15
19:14:34.311 | | CRBR | правило Ошибка регистрации заявки 0
19:14:34.312 | | CRBR | правило Новые сделки заявки 0
19:14:34.314 | | CRBR | правило 3
19:14:34.316 | | CRBR | правило Интервал условие 00:00:15
19:14:34.318 | | CRBR | правило Ошибка регистрации заявки 0
19:14:34.319 | | CRBR | правило Новые сделки заявки 0
19:14:34.321 | | CRBR | правило Ошибка снятия заявки 69180761
19:14:34.322 | | CRBR | правило 4
19:14:34.324 | | CRBR | CancelOrder 69180761
19:14:34.340 | | CRBR | Правило 'Ошибка снятия заявки 69180761 (15645912)' активировано.
19:14:34.340 | | CRBR | OnCancelFailed Код ошибки Failed Сообщение Вы не можете снять данную заявку 69180761
19:14:34.342 | | CRBR | IsOrderCancelInClearing 12.03.2012 19:14:07 False
19:14:34.343 | | CRBR | Правило 'Ошибка снятия заявки 69180761 (15645912)' удалено.
19:14:34.343 | | CRBR | Правило 'Ошибка снятия заявки 69180761 (33579535)' активировано.
19:14:34.343 | | CRBR | OnCancelFailed Код ошибки Failed Сообщение Вы не можете снять данную заявку 69180761
19:14:34.344 | | CRBR | IsOrderCancelInClearing 12.03.2012 19:14:07 False
19:14:34.346 | | CRBR | Правило 'Ошибка снятия заявки 69180761 (33579535)' удалено.
19:14:34.359 | | CRBR | ex Транзакция 'CLASSCODE=SPBFUT; SECCODE=RIH2; TRANS_ID=69180763; ORDER_KEY=2715365411; ACTION=KILL_ORDER;' не была зарегистрирована. Причина 'Вы не можете снять данную заявку'.
19:14:34.360 | | CRBR | IsOrderCancelInClearing 12.03.2012 19:14:07 False
19:14:34.361 | | CRBR | IsOrderCancelInClearing 12.03.2012 19:14:07 False
19:14:49.307 | | CRBR | Правило 'Интервал условие 00:00:15 (32460410)' активировано.
19:14:49.307 | | CRBR | ReplaceOrder RuleWaitingActivated 69180761
19:14:49.309 | | CRBR | правило Интервал условие 00:00:15
19:14:49.311 | | CRBR | правило Ошибка регистрации заявки 0
19:14:49.312 | | CRBR | правило Новые сделки заявки 0
19:14:49.315 | | CRBR | правило 3
19:14:49.317 | | CRBR | правило Интервал условие 00:00:15
19:14:49.318 | | CRBR | правило Ошибка регистрации заявки 0
19:14:49.320 | | CRBR | правило Новые сделки заявки 0
19:14:49.322 | | CRBR | правило Ошибка снятия заявки 69180761
19:14:49.324 | | CRBR | правило 4
19:14:49.326 | | CRBR | CancelOrder 69180761
19:14:49.539 | | CRBR | Правило 'Ошибка снятия заявки 69180761 (15645912)' активировано.
19:14:49.539 | | CRBR | OnCancelFailed Код ошибки Failed Сообщение Вы не можете снять данную заявку 69180761
19:14:49.540 | | CRBR | IsOrderCancelInClearing 12.03.2012 19:14:07 False
19:14:49.541 | | CRBR | Правило 'Ошибка снятия заявки 69180761 (15645912)' удалено.
19:14:49.541 | | CRBR | Правило 'Ошибка снятия заявки 69180761 (33579535)' активировано.
19:14:49.541 | | CRBR | OnCancelFailed Код ошибки Failed Сообщение Вы не можете снять данную заявку 69180761
19:14:49.543 | | CRBR | IsOrderCancelInClearing 12.03.2012 19:14:07 False
19:14:49.544 | | CRBR | Правило 'Ошибка снятия заявки 69180761 (33579535)' удалено.
19:14:49.544 | | CRBR | Правило 'Ошибка снятия заявки 69180761 (7995840)' активировано.
19:14:49.544 | | CRBR | OnCancelFailed Код ошибки Failed Сообщение Вы не можете снять данную заявку 69180761
19:14:49.545 | | CRBR | IsOrderCancelInClearing 12.03.2012 19:14:07 False
19:14:49.547 | | CRBR | Правило 'Ошибка снятия заявки 69180761 (7995840)' удалено.
19:14:49.560 | | CRBR | ex Транзакция 'CLASSCODE=SPBFUT; SECCODE=RIH2; TRANS_ID=69180764; ORDER_KEY=2715365411; ACTION=KILL_ORDER;' не была зарегистрирована. Причина 'Вы не можете снять данную заявку'.
19:14:49.561 | | CRBR | IsOrderCancelInClearing 12.03.2012 19:14:07 False
19:14:49.562 | | CRBR | IsOrderCancelInClearing 12.03.2012 19:14:07 False
Спасибо:

vader

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


Вот проект, в котором можно воспроизвести ошибку.

Код

var entityFactory = new EntityFactory();
                        var portfolio = entityFactory.CreatePortfolio("SPBFUT00000");

                        strategy = new TestOnceFailed(p.BestBid.Price)
                        {
                            Security = p,
                            Portfolio = portfolio,
                            Trader = MainWindow.Instance.Trader,
                        };
                        strategy.Start();


class TestOnceFailed : Strategy
    {
        private TimeSpan _waitingPeriod;
        private Order _order;
        private decimal _priceOfTask;

        public TestOnceFailed(decimal priceOfOrder)
        {
            _priceOfTask = priceOfOrder;
            _waitingPeriod = new TimeSpan(0, 0, 15);
        }

        protected override void OnStarting() 
        {
            base.OnStarting();

            ((QuikTrader)Trader).IsAsyncMode = false;
            RegisterTestOrder();
        }

        private void RegisterTestOrder()
        {
            
            _order = new Order
            {
                Portfolio = this.Portfolio,
                Volume = 1,
                Price = _priceOfTask - 300,
                Security = this.Security,
                Direction = OrderDirections.Buy,
            };

            this.When(_order.CancelFailed())
                .Do(OnCancelFailed)
                .Once();

            CreateRuleWaiting();

            RegisterOrder(_order);

            CancelOrder();
            
        }

        private void OnCancelFailed(OrderFail orderFail)
        {
            string message = orderFail.Error.Message;
            WriteDiagnostics("OnCancelFailed " + message + " " + orderFail.Order.TransactionId.ToString());
        }

        private StrategyRule CreateRuleWaiting()
        {
            StrategyRule rule = this.When(() => true, _waitingPeriod)
                .Do(() => CancelOrder());

            return rule;
        }

        public void CancelOrder()
		{
			WriteDiagnostics("CancelOrder");
			try{
                Trader.CancelOrder(_order);
			}
            catch(Exception ex) {
                WriteDiagnostics("CancelOrder " + ex.Message);
            }
            
        }

        protected void WriteDiagnostics(string message)
        {
            LogMessage logMessage = new LogMessage(this, DateTime.Now, ErrorTypes.None, message);
            AddLog(logMessage);
            string markInfo = this.Name.PadRight(5) + this.Security.Code.PadRight(5) + DateTime.Now.ToString() + " " + message;
            System.Diagnostics.Debug.WriteLine(markInfo);
        }
    }
Спасибо:

Alexander

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


Положил на codeplex\trunk фикс.
Проверьте, пожалуйста.
Спасибо: vader

Alexander

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


freelancer Перейти
Напишите уже наконец в документации, что некоторые правила исполняются несколько раз (хотя должны 1 раз) и что Once() не работает. Люди же жалуются.
У меня с Matched то же самое. Once() не помогает


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

vader

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


Теперь CancelFailed отрабатывает один раз.
Сейчас потестирую остальную функциональность.
Спасибо большое.
Спасибо:
< 1 2 3 

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

loading
clippy