Ok, пытаюсь нарисовать эти фракталы на графике.
Сначала попробовал нарисовать их стандартно:
Code
Fractals fractals = new Fractals();
chartFractalsElement = new ChartIndicatorElement() { Title = "Fractals", Color = Colors.Green, Indicator = fractals, DrawStyle = ChartIndicatorDrawStyles.Dot,
StrokeThickness = 5 };
riCandleChartArea.Elements.Add(chartFractalsElement);
bool final = candle.State == CandleStates.Finished;
IIndicatorValue fractalsValue = fractals.Process(new CandleIndicatorValue(candle) { IsFinal = final });
ChartIndicatorValue chartFractalsValue = new ChartIndicatorValue(fractals, fractalsValue);
if (candle.State == CandleStates.Finished || candle.OpenTime >= candleBounds.Min)
{
this.GuiAsync(() => riChartWindow.RiChart.ProcessValues(candle.OpenTime, new Dictionary<IChartElement, object>
{
{ chartFractalsElement, chartFractalsValue }
}));
}
Но тут метод ProcessValues вызывает Exception о том, что индикатор пустой (точнее не установлено значение индикатора). И правильно, ведь у нас в индикаторе fractals есть Up и Down и один из них (или оба) всегда будет пустым, потому что обычно на одной свечке не бывает сразу двух фракталов - и вверх и вниз. Поэтому и нарисовать мы это значение не можем, поскольку его просто не существует. Это отличает этот индикатор от, например, BollingerBands, у которого на всех свечках есть значение и верхней полосы и нижней.
Поэтому я разделил отрисовку на две части - для фракталов вверх и для фракталов вниз, включив проверку на пустоту индикатора. Для краткости привожу только фрагмент кода для фракталов вверх.
Code
Fractals fractals = new Fractals();
chartUpFractalsElement = new ChartIndicatorElement() { Title = "Fractals", Color = Colors.Green, Indicator = fractals.Up, DrawStyle =
ChartIndicatorDrawStyles.Dot, StrokeThickness = 5 };
riCandleChartArea.Elements.Add(chartUpFractalsElement);
bool final = candle.State == CandleStates.Finished;
fractals.Process(new CandleIndicatorValue(candle) { IsFinal = final });
if (fractals.IsFormed)
{
IIndicatorValue upFractalValue = fractals.Up.GetCurrentValue<ShiftedIndicatorValue>();
if (!upFractalValue.IsEmpty)
{
ChartIndicatorValue chartFractalsValue = new ChartIndicatorValue(fractals.Up, upFractalValue);
this.GuiAsync(() => riChartWindow.RiChart.ProcessValues(candle.OpenTime, new Dictionary<IChartElement, object>
{ { chartUpFractalsElement, chartFractalsValue } }));
}
}
Но теперь почему-то все фракталы (точки на графике) рисуются в левой части графика (см. рисунок)! Горизонтальные линии я добавил сам, они указывают на центральный бар фрактала. Это ошибка в библиотеке или можно в моём коде что-то поправить?
************************
Update. Кстати, заметил, что эти фракталы рисуются на каждом баре поочереди, начиная с нулевого. Как так, ведь в ProcessValues(candle.OpenTime, new Dictionary<IChartElement, object>) передаётся та свеча, на которой обнаружен фрактал?