На днях писал простой графический интерфейс c графиком и индикаторами. Задача была сделать онлайн отрисовку индикатора. У каждого значения индикатора есть свойство IIndicatorValue.IsFinal которое как бы говорит графику что это значение нужно взять за расчет и закрепить по оси X.
Рисовал индикатор SMA вот так:
// Это обработчик событие получения свечи _candleManager.Processing += (series, candle) => { if (series != _series) return; // Рассчитываем значение индикатора var smaValue = _sma.Process(candle); //Если свеча закончена то берем текущее значение за расчет и фиксируем по оси X smaValue.IsFinal = candle.State == CandleStates.Active; // Создаем экземпляр класса ChartDrawData - класс, где группируются данные для отрисовки var data = new ChartDrawData(); // chartItem - набор элементов, привязанных к одной точке на шкале X var chartItem = data.Group(candle.OpenTime).Add(_candleElement, candle); chartItem.Add(_indicatorElement, smaValue); // Безопасно отрисовываем элементы на графике this.GuiSync(() => Chart.Draw(data)); };
Я долго пытался понять что я делаю не так. В значение IsFinal по закрытии свечи передавалось значение true, но скользяшка упорно не хотела правильно ложиться га график. После чего обратился к разработчикам StockSharp на форум где описал суть проблемы. Оказалось что это баг. Информация была передана разработчикам и в следующей версии сию проблему устранят. К стати текущая версия 4.4.4. В более ранних версиях эта ошибка так же наблюдалась, но я не обращал не неё внимания так как не было нужды реализовать что то подобное.