← Zurück

Дефект в пользователе кастомного строителя свечей(думаю, в CandleManager)

Коллеги, по-моему нашел ошибку в использовании кастомного строителя свечей (наследника CandleBuilder<of Type>)

как я понял, алгоритм, который использования CandeBulder следующий:

  1. CreateCandle (значение)
  2. IsCandleFinishedBeforeChange(свеча, значение) если истина,то п.1 со следующим value если ложь, то 3.UpdateCandle(candle, value)

так, вот , в ситуации, когда сразу после CreateCandle(value1) срабатывает IsCandleFinishedBeforeChange(свеча, значение)= истина, в следующий вызов CreateCandle снова приходит value1 (то есть предыдущее значение)!

Если же хотя бы раз отрабатывает UpdateCandle, то все работает правильно.

Из-за этого получается лишняя свечка (в моем строителе), либо вообще возможен бесконечный цикл с одним и тем же value.

Это так срабатывает на 4.1.4

War dieses Thema hilfreich?

Thema teilen

Kommentare (9)

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

Tauler
Tauler Autor

Опишу последовательность вызова методов MyCandleBulder : CandleBuilder<MyCandle>

упростил вызовы. v3 - это параметр ICandleBuilderSourceValue value

CreateCandle(v1) IsCandleFinishedBeforeChange(v1) = false UpdateCandle(v1) IsCandleFinishedBeforeChange(v2) = false UpdateCandle(v2) IsCandleFinishedBeforeChange(v3) = true CreateCandle(v3) IsCandleFinishedBeforeChange(v3) = true <mark>CreateCandle(v3) -- снова значение номер 3!</mark> IsCandleFinishedBeforeChange(v3) = false UpdateCandle(v3) ну и так далее

Tauler
Tauler Autor

на 4.1.5 то же самое

Tauler
Tauler Autor

Вот лог

2012.10.31 23:07:45.499| |RangeHLCandleBuilder|Создана свеча(CreateCandle), value.ID = 1 2012.10.31 23:07:45.553| |RangeHLCandleBuilder|Cвеча обновлена(UpdateCandle), value.ID = 1 2012.10.31 23:07:45.556| |RangeHLCandleBuilder|Cвеча обновлена(UpdateCandle), value.ID = 2 <mark>2012.10.31 23:07:45.556| |RangeHLCandleBuilder|Cвеча готова(IsCandleFinishedBeforeChange == true), value.ID = 3 2012.10.31 23:07:45.556| |RangeHLCandleBuilder|Создана свеча(CreateCandle), value.ID = 3 2012.10.31 23:07:45.557| |RangeHLCandleBuilder|Cвеча готова(IsCandleFinishedBeforeChange == true),, value.ID = 3 2012.10.31 23:07:45.557| |RangeHLCandleBuilder|Создана свеча(CreateCandle), value.ID = 3 2012.10.31 23:07:45.557| |RangeHLCandleBuilder|Cвеча обновлена(UpdateCandle), value.ID = 3</mark> 2012.10.31 23:07:45.558| |RangeHLCandleBuilder|Cвеча готова(IsCandleFinishedBeforeChange == true),, value.ID = 4 2012.10.31 23:07:45.558| |RangeHLCandleBuilder|Создана свеча(CreateCandle), value.ID = 4 2012.10.31 23:07:45.558| |RangeHLCandleBuilder|Cвеча готова(IsCandleFinishedBeforeChange == true),, value.ID = 4 2012.10.31 23:07:45.558| |RangeHLCandleBuilder|Создана свеча(CreateCandle), value.ID = 4 2012.10.31 23:07:45.558| |RangeHLCandleBuilder|Cвеча обновлена(UpdateCandle), value.ID = 4 2012.10.31 23:07:45.558| |RangeHLCandleBuilder|Cвеча готова(IsCandleFinishedBeforeChange == true),, value.ID = 5

Mikhail Sukhov
Mikhail Sukhov

Tauler: так, вот , в ситуации, когда сразу после CreateCandle(value1) срабатывает IsCandleFinishedBeforeChange(свеча, значение)= истина, в следующий вызов CreateCandle снова приходит value1 (то есть предыдущее значение)!

И это правильное решение. Если свечка старая, и ее не надо обновлять. Range свечки кстати поддерживаются и так стандартно.

Tauler
Tauler Autor

Так два раза подряд приходит значение v3 в CreateCandle :) Что же тут правильного?

Tauler
Tauler Autor

Вкратце - если после CreateCandle IsCandleFinishedBeforeChange выдал true (то есть не дошло до UpdateCande) в следующий CreateCandle придет ровно то же value, что и в предыдущий CreateCandle

Tauler
Tauler Autor

Коллеги, проблему то я обошел. Но ведь бага есть это факт. Надо в коде закладываться фикс в дальнейших версиях?

Alexander
Alexander

Проверьте на 4.1.6

Tauler
Tauler Autor

Наверно уже не смогу проверить - я долго химичил со своей реализацией CandleBuilder (был ряд других проблем), так реализация, которая есть сейчас не страдает такими проблемами и на 4.1.4 :) попробую найти старую ревизию, воспроизвести на 4.1.4, потом на 4.1.6

Я смотрю, на 4.1.6 устранился еще один дефект (я о нем не писал): если в создании новой свечи я полю OpenTime присваивал значение из сделки, но в один прекрасный момент серия ранее сформированных свечей очищалась

protected override RangeHLCandle CreateCandle(StockSharp.Algo.Candles.CandleSeries series, ICandleBuilderSourceValue value)
        {
            RangeHLCandle candle = new RangeHLCandle
                                       {
                                           Range = (decimal) series.Arg
                                       };
            FirstInitCandle(series, candle, value);
            

            candle.OpenTime = value.Time;
            candle.CloseTime = value.Time;
            candle.LowTime = value.Time;

            if (prevClose == 0)
                return candle;

            candle.OpenPrice = prevClose;

            this.AddInfoLog(String.Format("Created, Open = {0}", candle.OpenPrice));
            return candle;
        }

Мне приходилось комментировать candle.OpenTime = value.Time;. Сейчас вроде все работает, завтра тоже перепроверю на 4.1.4 Я так понял, починили работу CandleBuilder с RawConvertableCandleBuilderSource<Trade> ?