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


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


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

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

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


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

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

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

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

Tags:


Thanks:


Tauler

Avatar
Date: 10/31/2012
Reply


Опишу последовательность вызова методов 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
CreateCandle(v3) -- снова значение номер 3!
IsCandleFinishedBeforeChange(v3) = false
UpdateCandle(v3)
ну и так далее
Thanks:

Tauler

Avatar
Date: 10/31/2012
Reply


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

Tauler

Avatar
Date: 10/31/2012
Reply


Вот лог

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

Mikhail Sukhov

Avatar
Date: 11/1/2012
Reply


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


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

Tauler

Avatar
Date: 11/1/2012
Reply


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

Tauler

Avatar
Date: 11/1/2012
Reply


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

Tauler

Avatar
Date: 11/1/2012
Reply


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

Alexander

Avatar
Date: 11/13/2012
Reply


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

Tauler

Avatar
Date: 11/13/2012
Reply


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

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

Code
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> ?
Thanks:


Attach files by dragging & dropping, , or pasting from the clipboard.

loading
clippy