Fractal Calculate problem

Created at 03 Jan 2023, 21:16
How’s your experience with the cTrader Platform?
Your feedback is crucial to cTrader's development. Please take a few seconds to share your opinion and help us improve your trading experience. Thanks!
IR

IRCtrader

Joined 17.06.2021

Fractal Calculate problem
03 Jan 2023, 21:16


i make code to draw line between fractal and show distance , pip and percenge 

but it has problem to calculate fracral.

using cAlgo.API;
using System;
using System.Collections.Generic;
using System.Text;

namespace cAlgo
{
    [Indicator(IsOverlay = true, TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
    public class AwFractal : Indicator
    {
        private class SwingPoint
        {
            public int Index { get; set; }
            public double Price { get; set; }

            public SwingPoint()
            {
                Index = 0;
                Price = double.MaxValue;
            }

            public SwingPoint(int index, double price)
            {
                Index = index;
                Price = price;
            }
        }

        #region Fields

        // Bar Index
        private int _index;

        // Direction of the Fractal
        private Direction direction = Direction.Down;

        // Price of recent High
        private double high;

        // Price of recent Low
        private double low;

        private bool isBullish;

        private SwingPoint swingPoint;
        private List<SwingPoint> swingPointList;

        private enum Direction
        {
            Up,
            Down
        }

        #endregion Fields

        #region Parameters

        [Parameter("Period", DefaultValue = 5, MinValue = 5, Group = "Fractal")]
        public int Period { get; set; }

        [Parameter("Show Distance?", DefaultValue = false, Group = "Fractal")]
        public bool ShowDistance { get; set; }

        [Parameter("Show Pip?", DefaultValue = false, Group = "Fractal")]
        public bool ShowPip { get; set; }

        [Parameter("Show Percentage?", DefaultValue = true, Group = "Fractal")]
        public bool ShowPercentChange { get; set; }

        #endregion Parameters

        #region Output

        [Output("Fractal", LineColor = "Red", Thickness = 2, PlotType = PlotType.Line)]
        public IndicatorDataSeries Result { get; set; }

        #endregion Output

        public override void Calculate(int index)
        {
            _index = index;

            low = Bars.LowPrices.LastValue;
            high = Bars.HighPrices.LastValue;

            if (Bars.ClosePrices.Count < 2)
                return;

            switch (direction)
            {
                case Direction.Up:
                    DrawUpFractal();
                    break;

                case Direction.Down:
                default:
                    DrawDownFractal();
                    break;
            }
        }

        protected override void Initialize()
        {
            swingPoint = new SwingPoint();
            swingPointList = new List<SwingPoint>();
        }

        #region Append Text

        public string GetFractalText(double currentValue, double previousValue, double thirdValue)
        {
            StringBuilder sb = new StringBuilder();

            if (ShowDistance)
                AppendDistance(sb);

            if (ShowPip)
                AppendPip(sb);

            if (ShowPercentChange)
                AppendPercentageChange(currentValue, previousValue, thirdValue, sb);



            return sb.ToString();
        }

        private void AppendPercentageChange(double currentValue, double previousValue, double thirdValue, StringBuilder sb)
        {
            if (ShowDistance || ShowPip)
                sb.AppendLine();

            string sign = isBullish ? "+" : "-";
            string percentage = (isBullish ? CalculatePercentageChange(thirdValue, previousValue, currentValue) : CalculatePercentageChange(thirdValue, previousValue, currentValue)).ToString("N0");

            sb.Append(string.Format("{0}{1}%", sign, percentage));
        }

        private void AppendDistance(StringBuilder sb)
        {
            sb.Append((swingPointList[swingPointList.Count - 1].Index - swingPointList[swingPointList.Count - 2].Index).ToString(""));
        }

        private void AppendPip(StringBuilder sb)
        {
            if (ShowDistance)
                sb.AppendLine();

            sb.Append(((swingPointList[swingPointList.Count - 1].Price - swingPointList[swingPointList.Count - 2].Price) / Symbol.PipSize).ToString("N1"));
        }

        private double CalculatePercentageChange(double third, double previous, double current)
        {
            double lastChange = Math.Abs(third - previous);
            double change = Math.Abs(current - previous);
            return 100 * (double)change / lastChange;
        }

        #endregion Append Text

        #region Create Fractal

        public void ShowFractalLabel()
        {
            // Get last value
            double currentValue = swingPointList[swingPointList.Count - 1].Price;
            // Get second last value
            double previousValue = swingPointList[swingPointList.Count - 2].Price;
            //get thirdValue
            double thirdValue = swingPointList[swingPointList.Count - 3].Price;


            isBullish = currentValue > previousValue;
            string objName = "FractalLabel" + swingPoint.Index;
            Color textColour = isBullish ? "Green" : "Red";
            string labelText = GetFractalText(currentValue, previousValue, thirdValue);

            ChartText text = Chart.DrawText(name: objName, text: labelText, barIndex: swingPoint.Index, y: swingPoint.Price, color: textColour);

            text.VerticalAlignment = isBullish ? VerticalAlignment.Top : VerticalAlignment.Bottom;
            text.HorizontalAlignment = HorizontalAlignment.Center;
        }

        private void DrawDownFractal()
        {

            int period = Period % 2 == 0 ? Period - 1 : Period;
            int middleIndex = _index - period / 2;
            double middleValue = Bars.LowPrices[middleIndex];
            bool down = true;

            for (int i = 0; i < period; i++)
            {
                if (middleValue > Bars.LowPrices[_index - i])
                {
                    down = false;
                    break;
                }
            }
            if (down)
            {
                bool moveExtremum = low <= swingPoint.Price;
                bool changeDirection = high >= swingPoint.Price;

                if (moveExtremum)
                    MoveExtremum(low);
                else if (changeDirection)
                {
                    SetExtremum(high);
                    direction = Direction.Up;
                }
            }

        }

        private void DrawUpFractal()
        {
        
            int period = Period % 2 == 0 ? Period - 1 : Period;
            int middleIndex = -_index - period / 2;
            double middleValue = Bars.HighPrices[middleIndex];

            bool up = true;

            for (int i = 0; i < period; i++)
            {
                if (middleValue < Bars.HighPrices[-_index - i])
                {
                    up = false;
                    break;
                }
            }
            if (up)
            {

                bool moveExtremum = high >= swingPoint.Price;
                bool changeDirection = low <= swingPoint.Price;

                if (moveExtremum)
                    MoveExtremum(high);
                else if (changeDirection)
                {
                    SetExtremum(low);
                    direction = Direction.Down;
                }
            }


        }

        private void MoveExtremum(double price)
        {
            Result[swingPoint.Index] = double.NaN;

            if (swingPointList.Count > 0)
                swingPointList.Remove(swingPointList[swingPointList.Count - 1]);

            Chart.RemoveObject("FractalLabel" + swingPoint.Index);

            SetExtremum(price);
        }

        private void SetExtremum(double price)
        {
            swingPoint = new SwingPoint(_index, price);
            swingPointList.Add(swingPoint);
            Result[swingPoint.Index] = swingPoint.Price;

            if (swingPointList.Count < 2)
                return;

            ShowFractalLabel();
        }

        #endregion Create Fractal




    }
}

 


@IRCtrader
Replies

PanagiotisChar
04 Jan 2023, 09:28

Hi there,

I cannot understand the problem. Can you explain the issue better?

Aieden Technologies

Need help? Join us on Telegram

Need premium support? Trade with us

 


@PanagiotisChar

IRCtrader
05 Jan 2023, 12:48 ( Updated at: 21 Dec 2023, 09:23 )

RE:

it shows wrong fractal based fractal fomula

Blue line is correct fractal

but my code show red line.

i think DrawUpFractal() and DrawDownFractal() have problems.

 

PanagiotisChar said:

Hi there,

I cannot understand the problem. Can you explain the issue better?

Aieden Technologies

Need help? Join us on Telegram

Need premium support? Trade with us

 

 


@IRCtrader