Source » Standard Deviation - source code

// Forex Strategy Builder
// Copyright (c) 2006 - 2008 Miroslav Popov - All rights reserved!
// http://forexsb.com
// info(a)forexsb.com
//
// Last changed on: 2007-06-12

using System;
using System.Drawing;

namespace Forex_Strategy_Builder
{
    /// <summary>
    /// Indicator: Standard Deviation
    /// </summary>
    public class Standard_Deviation : Indicator
    {
        /// <summary>
        /// The default constructor.
        /// </summary>
        public Standard_Deviation()
        {
        }

        /// <summary>
        /// Sets the default parameters for the designated slot type.
        /// </summary>
        /// <param name="slotType">The slot type.</param>
        public Standard_Deviation(SlotTypes slotType)
        {
            sIndicatorName  = "Standard Deviation";
            parameters      = new IndicatorParam();
            component       = new IndicatorComp[] { };
            bSeparatedChart = true;
            bIsCalculated   = false;
            typeOfIndicator = TypeOfIndicator.Additional;

            // The indicator name.
            parameters.IndicatorName = sIndicatorName;

            // The slot type.
            parameters.SlotType = slotType;

            // The ComboBox parameters.
            parameters.ListParam[0].Caption  = "Logic";
            parameters.ListParam[0].ItemList = new string[]
            {
                "The Standard Deviation rises",
                "The Standard Deviation falls",
                "The Standard Deviation is higher than the Level line",
                "The Standard Deviation is lower than the Level line",
                "The Standard Deviation crosses the Level line upward",
                "The Standard Deviation crosses the Level line downward",
                "The Standard Deviation changes its direction upward",
                "The Standard Deviation changes its direction downward"
            };
            parameters.ListParam[0].Index   = 0;
            parameters.ListParam[0].Text    = parameters.ListParam[0].ItemList[parameters.ListParam[0].Index];
            parameters.ListParam[0].Enabled = true;
            parameters.ListParam[0].ToolTip = "Logic of application";

            parameters.ListParam[1].Caption  = "Smoothing method";
            parameters.ListParam[1].ItemList = Enum.GetNames(typeof(MAMethod));
            parameters.ListParam[1].Index    = 0;
            parameters.ListParam[1].Text     = parameters.ListParam[1].ItemList[parameters.ListParam[1].Index];
            parameters.ListParam[1].Enabled  = true;
            parameters.ListParam[1].ToolTip  = "The method of Moving Average used for the calculations";

            parameters.ListParam[2].Caption  = "Base price";
            parameters.ListParam[2].ItemList = Enum.GetNames(typeof(BasePrice));
            parameters.ListParam[2].Index    = 3;
            parameters.ListParam[2].Text     = parameters.ListParam[2].ItemList[parameters.ListParam[2].Index];
            parameters.ListParam[2].Enabled  = true;
            parameters.ListParam[2].ToolTip  = "The price the indicator is based on";

            // The NumericUpDown parameters.
            parameters.NumParam[0].Caption = "Period";
            parameters.NumParam[0].Value   = 20;
            parameters.NumParam[0].Min     = 2;
            parameters.NumParam[0].Max     = 200;
            parameters.NumParam[0].Enabled = true;
            parameters.NumParam[0].ToolTip = "The period of calculation";

            parameters.NumParam[1].Caption = "Level";
            parameters.NumParam[1].Value   = 0;
            parameters.NumParam[1].Min     = 0;
            parameters.NumParam[1].Max     = 100;
            parameters.NumParam[1].Point   = 4;
            parameters.NumParam[1].Enabled = true;
            parameters.NumParam[1].ToolTip = "A critical level (for the appropriate logic)";

            // The CheckBox parameters.
            parameters.CheckParam[0].Caption = "Use previous bar value";
            parameters.CheckParam[0].Checked = Data.Strategy.PrepareUsePrevBarValueCheckBox(slotType);
            parameters.CheckParam[0].Enabled = true;
            parameters.CheckParam[0].ToolTip = "Use the indicator value from the previous bar";
        }

        /// <summary>
        /// Calculates the indicator's components.
        /// </summary>
        /// <param name="slotType">The slot type.</param>
        public override void Calculate(SlotTypes slotType)
        {
            if (parameters.SlotType == SlotTypes.NotDefined) return;

            // Reading the parameters
            MAMethod  maMethod = (MAMethod)Enum.GetValues(typeof(MAMethod)).GetValue(parameters.ListParam[1].Index);
            BasePrice price    = (BasePrice)Enum.GetValues(typeof(BasePrice)).GetValue(parameters.ListParam[2].Index);
            int   iPeriod = (int)parameters.NumParam[0].Value;
            float fLevel  =      parameters.NumParam[1].Value;
            int iPrvs = parameters.CheckParam[0].Checked ? 1 : 0;

            // Calculation
            float[] afPrice = Price(price);
            float[] afMA    = MovingAverage(iPeriod, 0, maMethod, afPrice);
            float[] afSTDV  = new float[Bars];

            int iFirstBar = iPeriod + 1;

            for (int iBar = iPeriod; iBar < Bars; iBar++)
            {
                float fSum = 0f;
                for (int index = 0; index < iPeriod; index++)
                {
                    float fDelta = (afPrice[iBar - index] - afMA[iBar]);
                    fSum  += fDelta * fDelta;
                }
                afSTDV[iBar] = (float)Math.Sqrt(fSum / (iPeriod - 1));
            }

            // Saving the components
            component = new IndicatorComp[3];

            component[0] = new IndicatorComp();
            component[0].CompName   = "Standard Deviation";
            component[0].DataType   = IndComponentType.IndicatorValue;
            component[0].ChartType  = IndChartType.Line;
            component[0].ChartColor = Color.Blue;
            component[0].FirstBar   = iFirstBar;
            component[0].Value      = afSTDV;

            component[1] = new IndicatorComp();
            component[1].ChartType = IndChartType.NoChart;
            component[1].FirstBar  = iFirstBar;
            component[1].Value     = new float[Bars];

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

            // Sets the component's type.
            if (slotType == SlotTypes.OpenFilter)
            {
                component[1].DataType = IndComponentType.AllowOpenLong;
                component[1].CompName = "Allows long positions opening";
                component[2].DataType = IndComponentType.AllowOpenShort;
                component[2].CompName = "Allows short positions opening";
            }
            else if (slotType == SlotTypes.CloseFilter)
            {
                component[1].DataType = IndComponentType.ForceCloseLong;
                component[1].CompName = "Forces long positions closing";
                component[2].DataType = IndComponentType.ForceCloseShort;
                component[2].CompName = "Forces short positions closing";
            }

            // Calculation of the logic.
            IndicatorLogic indLogic = IndicatorLogic.It_does_not_act_as_a_filter;

            switch (parameters.ListParam[0].Text)
            {
                case "The Standard Deviation rises":
                    indLogic = IndicatorLogic.The_indicator_rises;
                    break;

                case "The Standard Deviation falls":
                    indLogic = IndicatorLogic.The_indicator_falls;
                    break;

                case "The Standard Deviation is higher than the Level line":
                    indLogic = IndicatorLogic.The_indicator_is_higher_than_the_level_line;
                    afSpecValue = new float[1] { fLevel };
                    break;

                case "The Standard Deviation is lower than the Level line":
                    indLogic = IndicatorLogic.The_indicator_is_lower_than_the_level_line;
                    afSpecValue = new float[1] { fLevel };
                    break;

                case "The Standard Deviation crosses the Level line upward":
                    indLogic = IndicatorLogic.The_indicator_crosses_the_level_line_upward;
                    afSpecValue = new float[1] { fLevel };
                    break;

                case "The Standard Deviation crosses the Level line downward":
                    indLogic = IndicatorLogic.The_indicator_crosses_the_level_line_downward;
                    afSpecValue = new float[1] { fLevel };
                    break;

                case "The Standard Deviation changes its direction upward":
                    indLogic = IndicatorLogic.The_indicator_changes_its_direction_upward;
                    break;

                case "The Standard Deviation changes its direction downward":
                    indLogic = IndicatorLogic.The_indicator_changes_its_direction_downward;
                    break;

                default:
                    break;
            }

            bIsCalculated = NoDirectionOscillatorLogic(iFirstBar, iPrvs, afSTDV, fLevel, ref component[1], indLogic);
            component[2].Value = component[1].Value;
        }
    }
}
 

Top