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

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


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

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

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

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

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

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

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


Теги:


Спасибо:


Tauler

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


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

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

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

Спасибо:

Tauler

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


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

Спасибо:

Tauler

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


Вот лог

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 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 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

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


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

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

Спасибо:

Tauler

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


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

Спасибо:

Tauler

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


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

Спасибо:

Tauler

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


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

Спасибо:

Alexander

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


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

Спасибо:

Tauler

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


Наверно уже не смогу проверить - я долго химичил со своей реализацией 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 ?

Спасибо:


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

loading
clippy