Коллеги, по-моему нашел ошибку в использовании кастомного строителя свечей (наследника CandleBuilder<of Type>)
как я понял, алгоритм, который использования CandeBulder следующий:
- CreateCandle (значение)
- IsCandleFinishedBeforeChange(свеча, значение) если истина,то п.1 со следующим value если ложь, то 3.UpdateCandle(candle, value)
так, вот , в ситуации, когда сразу после CreateCandle(value1) срабатывает IsCandleFinishedBeforeChange(свеча, значение)= истина, в следующий вызов CreateCandle снова приходит value1 (то есть предыдущее значение)!
Если же хотя бы раз отрабатывает UpdateCandle, то все работает правильно.
Из-за этого получается лишняя свечка (в моем строителе), либо вообще возможен бесконечный цикл с одним и тем же value.
Это так срабатывает на 4.1.4
Kommentare (9)
Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen
Опишу последовательность вызова методов 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) ну и так далее
на 4.1.5 то же самое
Вот лог
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
И это правильное решение. Если свечка старая, и ее не надо обновлять. Range свечки кстати поддерживаются и так стандартно.
Так два раза подряд приходит значение v3 в CreateCandle :) Что же тут правильного?
Вкратце - если после CreateCandle IsCandleFinishedBeforeChange выдал true (то есть не дошло до UpdateCande) в следующий CreateCandle придет ровно то же value, что и в предыдущий CreateCandle
Коллеги, проблему то я обошел. Но ведь бага есть это факт. Надо в коде закладываться фикс в дальнейших версиях?
Проверьте на 4.1.6
Наверно уже не смогу проверить - я долго химичил со своей реализацией CandleBuilder (был ряд других проблем), так реализация, которая есть сейчас не страдает такими проблемами и на 4.1.4 :) попробую найти старую ревизию, воспроизвести на 4.1.4, потом на 4.1.6
Я смотрю, на 4.1.6 устранился еще один дефект (я о нем не писал): если в создании новой свечи я полю OpenTime присваивал значение из сделки, но в один прекрасный момент серия ранее сформированных свечей очищалась
Мне приходилось комментировать candle.OpenTime = value.Time;. Сейчас вроде все работает, завтра тоже перепроверю на 4.1.4 Я так понял, починили работу CandleBuilder с RawConvertableCandleBuilderSource<Trade> ?