индикатор фракталы

индикатор фракталы
Atom
11/25/2013
pft_man


Здравствуйте. Подскажите, пожалуйста, как пользоваться индикатором фракталы? У него (Fractals) есть FractalPart Up и Down. Что возвращает метод GetCurrentValue<>()? Например, я создал такой индикатор, как проверить, что на данной свечке получен фрактал? Up или Down? Можно ли узнать значение high/low свечки, на которой получен фрактал? Пытался сам разобраться с исходниками индикатора, но что-то не получается.




Thanks:


IvanB

Avatar
Date: 11/26/2013
Reply


pft_man: Здравствуйте. Подскажите, пожалуйста, как пользоваться индикатором фракталы? У него (Fractals) есть FractalPart Up и Down. Что возвращает метод GetCurrentValue<>()? T GetCurrentValue<T>() этот метод возвращает значение текущего состояния индикатора в виде типа T, т.е. текущее значение индикатора преобразовывается в тип T, который указан в угловых скобках. pft_man: Например, я создал такой индикатор, как проверить, что на данной свечке получен фрактал? Up или Down? Можно ли узнать значение high/low свечки, на которой получен фрактал? Пытался сам разобраться с исходниками индикатора, но что-то не получается. Примерно так Вы получаете значение фрактала на свечу: fractal.Process(candle) здесь метод Process вернет комплексное значение, состоящее из Up и Down, в виде коллекции. Затем для каждого Up и Down Вы анализируете что вернет метод GetCurrentValue(), и на основе этого делаете вывод о том, что у Вас Up или Down. И если хотите посмотреть свойства свечи, по которой сработал индикатор, то анализируете свечу candle.

Thanks:

pft_man

Avatar
Date: 11/28/2013
Reply


Ok, пытаюсь нарисовать эти фракталы на графике.

Сначала попробовал нарисовать их стандартно:


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, у которого на всех свечках есть значение и верхней полосы и нижней.

Поэтому я разделил отрисовку на две части - для фракталов вверх и для фракталов вниз, включив проверку на пустоту индикатора. Для краткости привожу только фрагмент кода для фракталов вверх.


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>) передаётся та свеча, на которой обнаружен фрактал?

fractals.jpg 147 KB (382)
Thanks:

pft_man

Avatar
Date: 12/1/2013
Reply


Иван, что с этим делать-то, возможно поправить? Очень хочется фракталы на графике нарисовать.

Thanks:

IvanB

Avatar
Date: 12/1/2013
Reply


pft_man: Иван, что с этим делать-то, возможно поправить? Очень хочется фракталы на графике нарисовать.

Разбираемся с вопросом...

Thanks:

pft_man

Avatar
Date: 12/16/2013
Reply


Две недели прошло, удалось что-нибудь выяснить?

Thanks:

IvanB

Avatar
Date: 12/19/2013
Reply


pft_man: Две недели прошло, удалось что-нибудь выяснить?

Пока что не удалось. Работаем над этим.

Thanks:


Attach files by dragging & dropping, , or pasting from the clipboard.

loading
clippy