Коллеги, по-моему нашел ошибку в использовании кастомного строителя свечей (наследника CandleBuilder<of Type>)
как я понял, алгоритм, который использования CandeBulder следующий:
- CreateCandle (значение)
- IsCandleFinishedBeforeChange(свеча, значение) если истина,то п.1 со следующим value если ложь, то 3.UpdateCandle(candle, value)
так, вот , в ситуации, когда сразу после CreateCandle(value1) срабатывает IsCandleFinishedBeforeChange(свеча, значение)= истина, в следующий вызов CreateCandle снова приходит value1 (то есть предыдущее значение)!
Если же хотя бы раз отрабатывает UpdateCandle, то все работает правильно.
Из-за этого получается лишняя свечка (в моем строителе), либо вообще возможен бесконечный цикл с одним и тем же value.
Это так срабатывает на 4.1.4
Комментарии (9)
Вход или Создать аккаунт, Войдите или зарегистрируйтесь, чтобы оставить комментарий
Опишу последовательность вызова методов 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> ?