Баг в классе Strategy
Atom Ответить
20.04.2012


Все относится к релизу 4.0.22, вполне вероятно что и дальше тоже.

Путем изысканий пришел к выводу такому:

У меня есть стратегия, которая перед тем как совсем остановиться, пытается отменить все свои ордера активные. Проверка происходит в методе
Код

        public override void Stop()
        {
            if (this.HaveActiveStopOrders())
            {
                this.AddInfoLog("Стратегия имеет активные ордера, пробуем отменить их.");
                this.GuarantyCancelOrders(new [] {_stopOrder});

                this
                    .When(_stopOrder.Canceled())
                    .Do(o =>
                            {
                                this.AddInfoLog("Активные ордера отменены, останавливаем стратегию.");
                                Stop();
                            });

                return;
            }
            
            base.Stop();
        }


GuarantyCancelOrders использует стратегию для отмены ордеров. По факту при выполнении сего метода в нашу стратегию подключается дочерняя стартегия, которая отменяет ордера достаточно надежно. Что именно происходит НЕ так? Вот пример другого кода, только уже в методе OnStopping

Код

        public override void OnStopping()
        {
            if (this.HaveActiveStopOrders())
            {
                this.AddInfoLog("Стратегия имеет активные ордера, пробуем отменить их.");
                this.GuarantyCancelOrders(new [] {_stopOrder});

                this
                    .When(_stopOrder.Canceled())
                    .Do(o =>
                            {
                                this.AddInfoLog("Активные ордера отменены, останавливаем стратегию.");
                                Stop();
                            });

                return;
            }
            
            base.OnStopping();
        }

Этот код приведет к тому что для дочерних стратегий из метода GuarantyCancelOrders будет вызван только метод OnStopping без вызова метода OnStarting. Ну а если вы при запуске делаете инициализацию чего либо, то легко можете получить исключение если работаете с этими объектами в завершающих методах. Это связано я полагаю с тем что в дочернюю стратегию передается статус родительской. А в родительской будет Stopping. Отсюда стартовый метод не выполняется, НО вот завершающий метод почему-то выполняется. Что мне кажется не совсем правильно. Если стратегия собственно еще и не была запущена, то с какого лешего выполнять метод OnStopping??? Ну вот как-то так :). По идее если стратегия добавляемая как дочерняя в статусе Stopped, то статус может измениться только на Starting или в этом духе. Есь даж паттерн такой :).

Надеюсь понятно изложил. А то кажется слегка запутанно.

Теги:


Спасибо:




4 Ответов
Alexander

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


Перечитал 3 раза, если честно, то не понял.
Приложите что ли лог того что на ваш взгляд работает не так и попробуйте другими словами объяснить :)
Спасибо:

ra81

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


Alexander Mukhanchikov Перейти
Перечитал 3 раза, если честно, то не понял.
Приложите что ли лог того что на ваш взгляд работает не так и попробуйте другими словами объяснить :)

В методе OnStopping я создаю любую стратегию и добавляю ее как дочернюю. Метод OnStopping вызывается когда стратегия начинает останавливаться и при вызове метода стратегия уже имеет ProcessState == Stopping. Когда дочерняя стратегия добавляется в родительскую, ей походу статус передается от родительской. То есть нашей дочерней будет поставлен ProcessState == Stopping, и начнется выполняться метод OnStopping у нашей дочерней стратегии. А если стратегия которую мы делали дочерней тупо сейчас стоит, нафиг ее переводить в состояние ProcessState == Stopping???
Автор топика
Спасибо:

OvcharenkoVI

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


ra81 Перейти
Alexander Mukhanchikov Перейти
Перечитал 3 раза, если честно, то не понял.
Приложите что ли лог того что на ваш взгляд работает не так и попробуйте другими словами объяснить :)

В методе OnStopping я создаю любую стратегию и добавляю ее как дочернюю. Метод OnStopping вызывается когда стратегия начинает останавливаться и при вызове метода стратегия уже имеет ProcessState == Stopping. Когда дочерняя стратегия добавляется в родительскую, ей походу статус передается от родительской. То есть нашей дочерней будет поставлен ProcessState == Stopping, и начнется выполняться метод OnStopping у нашей дочерней стратегии. А если стратегия которую мы делали дочерней тупо сейчас стоит, нафиг ее переводить в состояние ProcessState == Stopping???


Ну то что при остановке базовой стратегии останавливаются все дочерние - так и должно быть, разве нет?
Спасибо:

ra81

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


OvcharenkoVI Перейти
ra81 Перейти
Alexander Mukhanchikov Перейти
Перечитал 3 раза, если честно, то не понял.
Приложите что ли лог того что на ваш взгляд работает не так и попробуйте другими словами объяснить :)

В методе OnStopping я создаю любую стратегию и добавляю ее как дочернюю. Метод OnStopping вызывается когда стратегия начинает останавливаться и при вызове метода стратегия уже имеет ProcessState == Stopping. Когда дочерняя стратегия добавляется в родительскую, ей походу статус передается от родительской. То есть нашей дочерней будет поставлен ProcessState == Stopping, и начнется выполняться метод OnStopping у нашей дочерней стратегии. А если стратегия которую мы делали дочерней тупо сейчас стоит, нафиг ее переводить в состояние ProcessState == Stopping???


Ну то что при остановке базовой стратегии останавливаются все дочерние - так и должно быть, разве нет?

Суть вопроса не в этом, а в том что если стратегия уже стояла, нафиг она еще раз останавливается? :)
Автор топика
Спасибо:


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

loading
clippy