← Zurück

Баг в классе Strategy

Все относится к релизу 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 или в этом духе. Есь даж паттерн такой :).

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

War dieses Thema hilfreich?

Thema teilen

Kommentare (4)

Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen

Alexander
Alexander

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

ra81
ra81 Autor

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

OvcharenkoVI
OvcharenkoVI

ra81:

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

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

ra81
ra81 Autor

OvcharenkoVI:

ra81:

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

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