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


Дефект в пользователе кастомного строителя свечей(думаю, в CandleManager)
Atom Ответить
31.10.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

Теги:


Спасибо:




9 Ответов
Tauler

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


Опишу последовательность вызова методов 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)
ну и так далее
Автор топика
Спасибо:

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

Фотография
Автор статей Программист Трейдер
Дата: 31.10.2012
Ответить


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


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

Tauler

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


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

Tauler

Фотография
Дата: 31.10.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<Trade> ?
Автор топика
Спасибо:


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

loading
clippy