Forex_Strategy_Builder.Fractal.Calculate C# (CSharp) Метод

Calculate() публичный Метод

Calculates the indicator's components
public Calculate ( SlotTypes slotType ) : void
slotType SlotTypes
Результат void
        public override void Calculate(SlotTypes slotType)
        {
            // Reading the parameters
            bool   bIsVisible = IndParam.ListParam[1].Text == "The fractal is visible";
            double dShift     = (double)IndParam.NumParam[0].Value * Point;
            int    iFirstBar  = 8;

            double[] adFrUp = new double[Bars];
            double[] adFrDn = new double[Bars];

            for (int iBar = 8; iBar < Bars - 1; iBar++)
            {
                if (High[iBar - 1] < High[iBar - 2] && High[iBar] < High[iBar - 2])
                {
                    // Fractal type 1
                    if (High[iBar - 4] < High[iBar - 2] &&
                        High[iBar - 3] < High[iBar - 2])
                        adFrUp[iBar + 1] = High[iBar - 2];

                    // Fractal type 2
                    if (High[iBar - 5] <  High[iBar - 2] &&
                        High[iBar - 4] <  High[iBar - 2] &&
                        High[iBar - 3] == High[iBar - 2])
                        adFrUp[iBar + 1] = High[iBar - 2];

                    // Fractal type 3, 4
                    if (High[iBar - 6] <  High[iBar - 2] &&
                        High[iBar - 5] <  High[iBar - 2] &&
                        High[iBar - 4] == High[iBar - 2] &&
                        High[iBar - 3] <= High[iBar - 2])
                        adFrUp[iBar + 1] = High[iBar - 2];

                    // Fractal type 5
                    if (High[iBar - 7] <  High[iBar - 2] &&
                        High[iBar - 6] <  High[iBar - 2] &&
                        High[iBar - 5] == High[iBar - 2] &&
                        High[iBar - 4] <  High[iBar - 2] &&
                        High[iBar - 3] == High[iBar - 2])
                        adFrUp[iBar + 1] = High[iBar - 2];

                    // Fractal type 6
                    if (High[iBar - 7] <  High[iBar - 2] &&
                        High[iBar - 6] <  High[iBar - 2] &&
                        High[iBar - 5] == High[iBar - 2] &&
                        High[iBar - 4] == High[iBar - 2] &&
                        High[iBar - 3] <  High[iBar - 2])
                        adFrUp[iBar + 1] = High[iBar - 2];

                    // Fractal type 7
                    if (High[iBar - 8] <  High[iBar - 2] &&
                        High[iBar - 7] <  High[iBar - 2] &&
                        High[iBar - 6] == High[iBar - 2] &&
                        High[iBar - 5] <  High[iBar - 2] &&
                        High[iBar - 4] == High[iBar - 2] &&
                        High[iBar - 3] <  High[iBar - 2])
                        adFrUp[iBar + 1] = High[iBar - 2];
                }

                if (Low[iBar - 1] > Low[iBar - 2] && Low[iBar] > Low[iBar - 2])
                {
                    // Fractal type 1
                    if (Low[iBar - 4] >  Low[iBar - 2] &&
                        Low[iBar - 3] >  Low[iBar - 2])
                        adFrDn[iBar + 1] = Low[iBar - 2];

                    // Fractal type 2
                    if (Low[iBar - 5] >  Low[iBar - 2] &&
                        Low[iBar - 4] >  Low[iBar - 2] &&
                        Low[iBar - 3] == Low[iBar - 2])
                        adFrDn[iBar + 1] = Low[iBar - 2];

                    // Fractal type 3, 4
                    if (Low[iBar - 6] >  Low[iBar - 2] &&
                        Low[iBar - 5] >  Low[iBar - 2] &&
                        Low[iBar - 4] == Low[iBar - 2] &&
                        Low[iBar - 3] >= Low[iBar - 2])
                        adFrDn[iBar + 1] = Low[iBar - 2];

                    // Fractal type 5
                    if (Low[iBar - 7] >  Low[iBar - 2] &&
                        Low[iBar - 6] >  Low[iBar - 2] &&
                        Low[iBar - 5] == Low[iBar - 2] &&
                        Low[iBar - 4] >  Low[iBar - 2] &&
                        Low[iBar - 3] == Low[iBar - 2])
                        adFrDn[iBar + 1] = Low[iBar - 2];

                    // Fractal type 6
                    if (Low[iBar - 7] >  Low[iBar - 2] &&
                        Low[iBar - 6] >  Low[iBar - 2] &&
                        Low[iBar - 5] == Low[iBar - 2] &&
                        Low[iBar - 4] == Low[iBar - 2] &&
                        Low[iBar - 3] >  Low[iBar - 2])
                        adFrDn[iBar + 1] = Low[iBar - 2];

                    // Fractal type 7
                    if (Low[iBar - 8] >  Low[iBar - 2] &&
                        Low[iBar - 7] >  Low[iBar - 2] &&
                        Low[iBar - 6] == Low[iBar - 2] &&
                        Low[iBar - 5] >  Low[iBar - 2] &&
                        Low[iBar - 4] == Low[iBar - 2] &&
                        Low[iBar - 3] > Low[iBar - 2])
                        adFrDn[iBar + 1] = Low[iBar - 2];
                }
            }

            // Is visible
            if (bIsVisible)
                for (int iBar = iFirstBar; iBar < Bars; iBar++)
                {
                    if (adFrUp[iBar - 1] > 0 && adFrUp[iBar] == 0 && High[iBar - 1] < adFrUp[iBar - 1])
                        adFrUp[iBar] = adFrUp[iBar - 1];
                    if (adFrDn[iBar - 1] > 0 && adFrDn[iBar] == 0 && Low[iBar - 1]  > adFrDn[iBar - 1])
                        adFrDn[iBar] = adFrDn[iBar - 1];
                }
            else
                for (int iBar = iFirstBar; iBar < Bars; iBar++)
                {
                    if (adFrUp[iBar] == 0) adFrUp[iBar] = adFrUp[iBar - 1];
                    if (adFrDn[iBar] == 0) adFrDn[iBar] = adFrDn[iBar - 1];
                }

            double[] adFrUpEntry = new double[Bars];
            double[] adFrDnEntry = new double[Bars];

            // Saving the components
            Component = new IndicatorComp[4];

            Component[0] = new IndicatorComp();
            Component[0].CompName   = "Up Fractal";
            Component[0].DataType   = IndComponentType.IndicatorValue;
            Component[0].ChartType	= IndChartType.Level;
            Component[0].ChartColor	= Color.SpringGreen;
            Component[0].FirstBar	= iFirstBar;
            Component[0].Value	    = adFrUp;

            Component[1] = new IndicatorComp();
            Component[1].CompName   = "Down Fractal";
            Component[1].DataType   = IndComponentType.IndicatorValue;
            Component[1].ChartType	= IndChartType.Level;
            Component[1].ChartColor = Color.DarkRed;
            Component[1].FirstBar	= iFirstBar;
            Component[1].Value	    = adFrDn;

            Component[2] = new IndicatorComp();
            Component[2].ChartType = IndChartType.NoChart;
            Component[2].FirstBar  = iFirstBar;
            Component[2].Value     = new double[Bars];

            Component[3] = new IndicatorComp();
            Component[3].ChartType = IndChartType.NoChart;
            Component[3].FirstBar  = iFirstBar;
            Component[3].Value     = new double[Bars];

            if (slotType == SlotTypes.Open)
            {
                Component[2].CompName = "Long position entry price";
                Component[2].DataType = IndComponentType.OpenLongPrice;
                Component[3].CompName = "Short position entry price";
                Component[3].DataType = IndComponentType.OpenShortPrice;
            }
            else if (slotType == SlotTypes.Close)
            {
                Component[2].CompName = "Long position closing price";
                Component[2].DataType = IndComponentType.CloseLongPrice;
                Component[3].CompName = "Short position closing price";
                Component[3].DataType = IndComponentType.CloseShortPrice;
            }

            switch (IndParam.ListParam[0].Text)
            {
                case "Enter long at an Up Fractal":
                case "Exit long at an Up Fractal":
                    for (int iBar = iFirstBar; iBar < Bars; iBar++)
                    {
                        if(adFrUp[iBar] > Point)
                            Component[2].Value[iBar] = adFrUp[iBar] + dShift;
                        if (adFrDn[iBar] > Point)
                            Component[3].Value[iBar] = adFrDn[iBar] - dShift;
                    }
                    break;
                case "Enter long at a Down Fractal":
                case "Exit long at a Down Fractal":
                    for (int iBar = iFirstBar; iBar < Bars; iBar++)
                    {
                        if (adFrDn[iBar] > Point)
                            Component[2].Value[iBar] = adFrDn[iBar] - dShift;
                        if(adFrUp[iBar] > Point)
                            Component[3].Value[iBar] = adFrUp[iBar] + dShift;
                    }
                    break;
                default:
                    break;
            }

            return;
        }