Ejemplo n.º 1
0
        /// <summary>
        /// Action to be executd for calculating indicator
        /// </summary>
        /// <returns>for future usage. Must be ignored at this time.</returns>
        protected override bool TrueAction()
        {
            // Validate
            int iSize = _chartPanel._chartX.RecordCount;

            if (iSize == 0)
            {
                return(false);
            }

            if (ParamInt(1) < 1 || ParamInt(1) > iSize / 2)
            {
                ProcessError("Invalid Periods for indicator " + FullName, IndicatorErrorType.ShowErrorMessage);
                return(false);
            }
            if (ParamInt(2) < (int)Constants.MA_START || ParamInt(2) > (int)Constants.MA_END)
            {
                ProcessError("Invalid Moving Average Type for indicator " + FullName, IndicatorErrorType.ShowErrorMessage);
                return(false);
            }

            // Get the data
            string paramStr0 = ParamStr(0);
            Field  pOpen     = SeriesToField("Open", paramStr0 + ".open", iSize);

            if (!EnsureField(pOpen, paramStr0 + ".open"))
            {
                return(false);
            }
            Field pHigh = SeriesToField("High", paramStr0 + ".high", iSize);

            if (!EnsureField(pHigh, paramStr0 + ".high"))
            {
                return(false);
            }
            Field pLow = SeriesToField("Low", paramStr0 + ".low", iSize);

            if (!EnsureField(pLow, paramStr0 + ".low"))
            {
                return(false);
            }
            Field pClose = SeriesToField("Close", paramStr0 + ".close", iSize);

            if (!EnsureField(pClose, paramStr0 + ".close"))
            {
                return(false);
            }
            Field pVolume = SeriesToField("Volume", paramStr0 + ".volume", iSize);

            if (!EnsureField(pVolume, paramStr0 + ".volume"))
            {
                return(false);
            }

            Navigator pNav = new Navigator();
            Recordset pRS  = new Recordset();

            pRS.AddField(pOpen);
            pRS.AddField(pHigh);
            pRS.AddField(pLow);
            pRS.AddField(pClose);
            pRS.AddField(pVolume);

            pNav.Recordset_ = pRS;


            // Calculate the indicator
            Oscillator ta   = new Oscillator();
            Recordset  pInd = ta.ElderRay(pNav, pRS, ParamInt(1), (IndicatorType)ParamInt(2), FullName);

            string ind_name = FullName + " Bear Power";

            // Output the indicator values
            Clear();
            for (int n = 0; n < iSize; ++n)
            {
                AppendValue(DM.TS(n), n < ParamInt(1) + 1 ? null : pInd.Value(ind_name, n + 1));
            }

            return(_calculateResult = PostCalculate());
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Action to be executd for calculating indicator
        /// </summary>
        /// <returns>for future usage. Must be ignored at this time.</returns>
        protected override bool TrueAction()
        {
            // Validate
            int size = _chartPanel._chartX.RecordCount;

            if (size == 0)
            {
                return(false);
            }

            if (ParamInt(1) < 1 || ParamInt(1) > size / 2)
            {
                ProcessError("Invalid Periods for indicator " + FullName, IndicatorErrorType.ShowErrorMessage);
                return(false);
            }
            if (ParamInt(2) < 0 || ParamInt(2) > 10)
            {
                ProcessError("Invalid Standard Deviations for indicator " + FullName, IndicatorErrorType.ShowErrorMessage);
                return(false);
            }
            if (ParamInt(3) < (int)Constants.MA_START || ParamInt(3) > (int)Constants.MA_END)
            {
                ProcessError("Invalid Moving Average Type for indicator " + FullName, IndicatorErrorType.ShowErrorMessage);
                return(false);
            }

            Field pSource = SeriesToField("Source", ParamStr(0), size);

            if (!EnsureField(pSource, ParamStr(0)))
            {
                return(false);
            }

            Navigator pNav = new Navigator();
            Recordset pRS  = new Recordset();

            pRS.AddField(pSource);
            pNav.Recordset_ = pRS;

            // Calculate the indicator
            Bands     ta   = new Bands();
            Recordset pInd = ta.BollingerBands(pNav, pSource, ParamInt(1), ParamInt(2), (IndicatorType)ParamInt(3));

            // Output the indicator values
            Clear();
            Series series = _chartPanel._chartX.GetSeriesByName(ParamStr(0));

            TwinIndicator pTop = (TwinIndicator)EnsureSeries(FullName + " Top");

            pTop.SetStrokeColor(StrokeColor, false);
            pTop.SetStrokeThickness(StrokeThickness, false);
            pTop.SetStrokePattern(_strokePattern, false);

            TwinIndicator pBottom = (TwinIndicator)EnsureSeries(FullName + " Bottom");

            pBottom.SetStrokeColor(StrokeColor, false);
            pBottom.SetStrokeThickness(StrokeThickness, false);
            pBottom.SetStrokePattern(_strokePattern, false);

            int paramInt1 = ParamInt(1);

            for (int n = 0; n < size; ++n)
            {
                double?top;
                double?median;
                double?bottom;
                if (n < paramInt1)
                {
                    top    = null;
                    median = null;
                    bottom = null;
                }
                else
                {
                    top    = pInd.Value("Bollinger Band Top", n + 1);
                    median = pInd.Value("Bollinger Band Median", n + 1);
                    bottom = pInd.Value("Bollinger Band Bottom", n + 1);
                }
                AppendValue(series[n].TimeStamp, median);
                pTop.AppendValue(series[n].TimeStamp, top);
                pBottom.AppendValue(series[n].TimeStamp, bottom);
            }

            return(_calculateResult = PostCalculate());
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Action to be executd for calculating indicator
        /// </summary>
        /// <returns>for future usage. Must be ignored at this time.</returns>
        protected override bool TrueAction()
        {
// Validate
            int iSize = _chartPanel._chartX.RecordCount;

            if (iSize == 0)
            {
                return(false);
            }

            int paramInt1 = ParamInt(1);
            int paramInt2 = ParamInt(2);

            if (paramInt1 > paramInt2 || paramInt1 < 1)
            {
                ProcessError("Invalid Short Term Period for indicator " + FullName, IndicatorErrorType.ShowErrorMessage);
                return(false);
            }
            if (paramInt2 < 8)
            {
                ProcessError("Invalid Long Term Period (min 8) for indicator " + FullName, IndicatorErrorType.ShowErrorMessage);
                return(false);
            }
            int paramInt3 = ParamInt(3);

            if (paramInt3 != 1 && paramInt3 != 2)
            {
                ProcessError("Invalid Points or Percent for indicator " + FullName, IndicatorErrorType.ShowErrorMessage);
                return(false);
            }


            // Get the data
            string paramStr0 = ParamStr(0);
            Field  pVolume   = SeriesToField("Volume", paramStr0, iSize);

            if (!EnsureField(pVolume, paramStr0))
            {
                return(false);
            }

            Navigator pNav = new Navigator();
            Recordset pRS  = new Recordset();

            pRS.AddField(pVolume);
            pNav.Recordset_ = pRS;


            // Calculate the indicator
            Oscillator ta   = new Oscillator();
            Recordset  pInd = ta.VolumeOscillator(pNav, pVolume, paramInt1, paramInt2, paramInt3, FullName);


            // Output the indicator values
            Clear();
            for (int n = 0; n < iSize; ++n)
            {
                AppendValue(DM.TS(n), n < paramInt2 ? null : pInd.Value(FullName, n + 1));
            }
            return(_calculateResult = PostCalculate());
        }
Ejemplo n.º 4
0
        /// <summary>
        /// Action to be executd for calculating indicator
        /// </summary>
        /// <returns>for future usage. Must be ignored at this time.</returns>
        protected override bool TrueAction()
        {
            // Validate
            int iSize = _chartPanel._chartX.RecordCount;

            if (iSize == 0)
            {
                return(false);
            }

            int paramInt1 = ParamInt(1);

            if (paramInt1 < 1)
            {
                ProcessError("Invalid Cycle 1 for indicator " + FullName, IndicatorErrorType.ShowErrorMessage);
                return(false);
            }
            int paramInt2 = ParamInt(2);

            if (paramInt2 < 1)
            {
                ProcessError("Invalid Cycle 2 for indicator " + FullName, IndicatorErrorType.ShowErrorMessage);
                return(false);
            }
            int paramInt3 = ParamInt(3);

            if (paramInt3 < 1)
            {
                ProcessError("Invalid Cycle 3 for indicator " + FullName, IndicatorErrorType.ShowErrorMessage);
                return(false);
            }

            // Get the data
            string paramStr0 = ParamStr(0);
            Field  pHigh     = SeriesToField("High", paramStr0 + ".high", iSize);

            if (!EnsureField(pHigh, paramStr0 + ".high"))
            {
                return(false);
            }
            Field pLow = SeriesToField("Low", paramStr0 + ".low", iSize);

            if (!EnsureField(pLow, paramStr0 + ".low"))
            {
                return(false);
            }
            Field pClose = SeriesToField("Close", paramStr0 + ".close", iSize);

            if (!EnsureField(pClose, paramStr0 + ".close"))
            {
                return(false);
            }

            Navigator pNav = new Navigator();
            Recordset pRS  = new Recordset();

            pRS.AddField(pHigh);
            pRS.AddField(pLow);
            pRS.AddField(pClose);

            pNav.Recordset_ = pRS;


            // Calculate the indicator
            Oscillator ta   = new Oscillator();
            Recordset  pInd = ta.UltimateOscillator(pNav, pRS, paramInt1, paramInt2, paramInt3, FullName);


            // Output the indicator values
            Clear();
            int max = paramInt1;

            if (paramInt2 > max)
            {
                max = paramInt2;
            }
            if (paramInt3 > max)
            {
                max = paramInt3;
            }
            for (int n = 0; n < iSize; ++n)
            {
                AppendValue(DM.TS(n), n < max ? null : pInd.Value(FullName, n + 1));
            }

            return(_calculateResult = PostCalculate());
        }
Ejemplo n.º 5
0
        /// <summary>
        /// Action to be executd for calculating indicator
        /// </summary>
        /// <returns>for future usage. Must be ignored at this time.</returns>
        protected override bool TrueAction()
        {
// Validate
            int size = _chartPanel._chartX.RecordCount;

            if (size == 0)
            {
                return(false);
            }

            int paramInt1 = ParamInt(1);

            if (paramInt1 < 1 || paramInt1 > size)
            {
                ProcessError("Invalid Periods for indicator " + FullName, IndicatorErrorType.ShowErrorMessage);
                return(false);
            }

            // Get the data
            string paramStr0 = ParamStr(0);
            Field  pHigh     = SeriesToField("High", paramStr0 + ".high", size);

            if (!EnsureField(pHigh, paramStr0 + ".high"))
            {
                return(false);
            }
            Field pLow = SeriesToField("Low", paramStr0 + ".low", size);

            if (!EnsureField(pLow, paramStr0 + ".low"))
            {
                return(false);
            }

            Navigator pNav = new Navigator();
            Recordset pRS  = new Recordset();

            pRS.AddField(pHigh);
            pRS.AddField(pLow);

            pNav.Recordset_ = pRS;


            // Calculate the indicator
            Bands     ta   = new Bands();
            Recordset pInd = ta.FractalChaosBands(pNav, pRS, paramInt1);


            // Output the indicator values
            Clear();

            TwinIndicator sHigh = (TwinIndicator)EnsureSeries(FullName + " High");

            sHigh.SetStrokeColor(StrokeColor, false);
            sHigh.SetStrokeThickness(StrokeThickness, false);

            _title = FullName + " Low";

            for (int n = 0; n < size; ++n)
            {
                double?low;
                double?high;
                if (n < paramInt1)
                {
                    high = null;
                    low  = null;
                }
                else
                {
                    high = pInd.Value("Fractal High", n + 1);
                    low  = pInd.Value("Fractal Low", n + 1);
                }
                AppendValue(DM.GetTimeStampByIndex(n), low);
                sHigh.AppendValue(DM.GetTimeStampByIndex(n), high);
            }

            return(_calculateResult = PostCalculate());
        }
        /// <summary>
        /// Action to be executd for calculating indicator
        /// </summary>
        /// <returns>for future usage. Must be ignored at this time.</returns>
        protected override bool TrueAction()
        {
            // Validate
            int iSize = _chartPanel._chartX.RecordCount;

            if (iSize == 0)
            {
                return(false);
            }

            if (ParamInt(1) < 1 || ParamInt(1) > iSize / 2)
            {
                ProcessError("Invalid Periods for indicator " + FullName, IndicatorErrorType.ShowErrorMessage);
                return(false);
            }
            // Get the data
            string paramStr0 = ParamStr(0);
            Field  pOpen     = SeriesToField("Open", paramStr0 + ".open", iSize);

            if (!EnsureField(pOpen, paramStr0 + ".open"))
            {
                return(false);
            }
            Field pHigh = SeriesToField("High", paramStr0 + ".high", iSize);

            if (!EnsureField(pHigh, paramStr0 + ".high"))
            {
                return(false);
            }
            Field pLow = SeriesToField("Low", paramStr0 + ".low", iSize);

            if (!EnsureField(pLow, paramStr0 + ".low"))
            {
                return(false);
            }
            Field pClose = SeriesToField("Close", paramStr0 + ".close", iSize);

            if (!EnsureField(pClose, paramStr0 + ".close"))
            {
                return(false);
            }
            Field pVolume = SeriesToField("Volume", paramStr0 + ".volume", iSize);

            if (!EnsureField(pVolume, paramStr0 + ".volume"))
            {
                return(false);
            }

            Navigator pNav = new Navigator();
            Recordset pRS  = new Recordset();

            pRS.AddField(pOpen);
            pRS.AddField(pHigh);
            pRS.AddField(pLow);
            pRS.AddField(pClose);
            pRS.AddField(pVolume);

            pNav.Recordset_ = pRS;


            // Calculate the indicator
            Index     ta   = new Index();
            Recordset pInd = ta.GopalakrishnanRangeIndex(pNav, pRS, ParamInt(1), FullName);

            // Output the indicator values
            Clear();
            for (int n = 0; n < iSize; ++n)
            {
                AppendValue(DM.TS(n), n < ParamInt(1) + 1 ? null : pInd.Value(FullName, n + 1));
            }

            return(_calculateResult = PostCalculate());
        }
Ejemplo n.º 7
0
        /// <summary>
        /// Action to be executd for calculating indicator
        /// </summary>
        /// <returns>for future usage. Must be ignored at this time.</returns>
        protected override bool TrueAction()
        {
            // Validate
            int iSize = _chartPanel._chartX.RecordCount;

            if (iSize == 0)
            {
                return(false);
            }

            double paramDbl1 = ParamDbl(1);

            if (paramDbl1 <= 0)
            {
                ProcessError("Invalid Limit Move Value for indicator " + FullName, IndicatorErrorType.ShowErrorMessage);
                return(false);
            }

            // Get the data
            string paramStr0 = ParamStr(0);
            Field  pOpen     = SeriesToField("Open", paramStr0 + ".open", iSize);

            if (!EnsureField(pOpen, paramStr0 + ".open"))
            {
                return(false);
            }
            Field pHigh = SeriesToField("High", paramStr0 + ".high", iSize);

            if (!EnsureField(pHigh, paramStr0 + ".high"))
            {
                return(false);
            }
            Field pLow = SeriesToField("Low", paramStr0 + ".low", iSize);

            if (!EnsureField(pLow, paramStr0 + ".low"))
            {
                return(false);
            }
            Field pClose = SeriesToField("Close", paramStr0 + ".close", iSize);

            if (!EnsureField(pClose, paramStr0 + ".close"))
            {
                return(false);
            }

            Navigator pNav = new Navigator();
            Recordset pRS  = new Recordset();

            pRS.AddField(pOpen);
            pRS.AddField(pHigh);
            pRS.AddField(pLow);
            pRS.AddField(pClose);

            pNav.Recordset_ = pRS;


            // Calculate the indicator
            Index     ta   = new Index();
            Recordset pInd = ta.SwingIndex(pNav, pRS, paramDbl1, FullName);

            // Output the indicator values
            Clear();
            for (int n = 0; n < iSize; ++n)
            {
                AppendValue(DM.TS(n), pInd.Value(FullName, n + 1));
            }
            return(_calculateResult = PostCalculate());
        }
Ejemplo n.º 8
0
        /// <summary>
        /// Action to be executd for calculating indicator
        /// </summary>
        /// <returns>for future usage. Must be ignored at this time.</returns>
        protected override bool TrueAction()
        {
            // Validate
            int size = _chartPanel._chartX.RecordCount;

            if (size == 0)
            {
                return(false);
            }

            int paramInt1 = ParamInt(1);

            if (paramInt1 < 1 || paramInt1 > size / 2)
            {
                ProcessError("Invalid Periods for indicator " + FullName, IndicatorErrorType.ShowErrorMessage);
                return(false);
            }

            // Get the data
            string paramStr0 = ParamStr(0);
            Field  pOpen     = SeriesToField("Open", paramStr0 + ".open", size);

            if (!EnsureField(pOpen, paramStr0 + ".open"))
            {
                return(false);
            }
            Field pHigh = SeriesToField("High", paramStr0 + ".high", size);

            if (!EnsureField(pHigh, paramStr0 + ".high"))
            {
                return(false);
            }
            Field pLow = SeriesToField("Low", paramStr0 + ".low", size);

            if (!EnsureField(pLow, paramStr0 + ".low"))
            {
                return(false);
            }
            Field pClose = SeriesToField("Close", paramStr0 + ".close", size);

            if (!EnsureField(pClose, paramStr0 + ".close"))
            {
                return(false);
            }

            Navigator pNav = new Navigator();
            Recordset pRS  = new Recordset();

            pRS.AddField(pOpen);
            pRS.AddField(pHigh);
            pRS.AddField(pLow);
            pRS.AddField(pClose);

            pNav.Recordset_ = pRS;


            // Calculate the indicator
            Oscillator ta   = new Oscillator();
            Recordset  pInd = ta.Aroon(pNav, pRS, paramInt1);


            // Output the indicator values
            Clear();

            TwinIndicator pAroonDown = (TwinIndicator)EnsureSeries(FullName + " Down");

            pAroonDown.SetStrokeThickness(StrokeThickness, false);
            pAroonDown.SetStrokeColor(Colors.Red, false);

            pAroonDown.Clear();
            _title = FullName + " Up";

            for (int n = 0; n < size; ++n)
            {
                double?top;
                double?bottom;
                if (n < paramInt1)
                {
                    top    = null;
                    bottom = null;
                }
                else
                {
                    top    = pInd.Value("Aroon Up", n + 1);
                    bottom = pInd.Value("Aroon Down", n + 1);
                }
                AppendValue(DM.GetTimeStampByIndex(n), top);
                pAroonDown.AppendValue(DM.GetTimeStampByIndex(n), bottom);
            }

            return(_calculateResult = PostCalculate());
        }
        /// <summary>
        /// Action to be executd for calculating indicator
        /// </summary>
        /// <returns>for future usage. Must be ignored at this time.</returns>
        protected override bool TrueAction()
        {
// Validate
            int size = _chartPanel._chartX.RecordCount;

            if (size == 0)
            {
                return(false);
            }

            int paramInt2 = ParamInt(2);

            if (paramInt2 < 1 || paramInt2 > size / 2)
            {
                ProcessError("Invalid Periods for indicator " + FullName, IndicatorErrorType.ShowErrorMessage);
                return(false);
            }


            // Get the data
            string paramStr0 = ParamStr(0);
            string paramStr1 = ParamStr(1);
            Field  pOpen     = SeriesToField("Open", paramStr0 + ".open", size);

            if (!EnsureField(pOpen, paramStr0 + ".open"))
            {
                return(false);
            }
            Field pHigh = SeriesToField("High", paramStr0 + ".high", size);

            if (!EnsureField(pHigh, paramStr0 + ".high"))
            {
                return(false);
            }
            Field pLow = SeriesToField("Low", paramStr0 + ".low", size);

            if (!EnsureField(pLow, paramStr0 + ".low"))
            {
                return(false);
            }
            Field pClose = SeriesToField("Close", paramStr0 + ".close", size);

            if (!EnsureField(pClose, paramStr0 + ".close"))
            {
                return(false);
            }
            Field pVolume = SeriesToField("Volume", paramStr1, size);

            if (!EnsureField(pVolume, paramStr1))
            {
                return(false);
            }

            Navigator pNav = new Navigator();
            Recordset pRS  = new Recordset();

            pRS.AddField(pOpen);
            pRS.AddField(pHigh);
            pRS.AddField(pLow);
            pRS.AddField(pClose);
            pRS.AddField(pVolume);

            pNav.Recordset_ = pRS;

            // Calculate the indicator
            Index     ta   = new Index();
            Recordset pInd = ta.ChaikinMoneyFlow(pNav, pRS, paramInt2, FullName);

            // Output the indicator values
            Clear();
            for (int n = 0; n < size; ++n)
            {
                AppendValue(DM.GetTimeStampByIndex(n), n < paramInt2 ? null : pInd.Value(FullName, n + 1));
            }

            return(_calculateResult = PostCalculate());
        }
Ejemplo n.º 10
0
        /// <summary>
        /// Action to be executd for calculating indicator
        /// </summary>
        /// <returns>for future usage. Must be ignored at this time.</returns>
        protected override bool TrueAction()
        {
            // Validate
            int iSize = _chartPanel._chartX.RecordCount;

            if (iSize == 0)
            {
                return(false);
            }

            int paramInt1 = ParamInt(1);
            int paramInt2 = ParamInt(2);

            if (paramInt1 > 500)
            {
                paramInt1 = 500;
            }
            if (paramInt2 > 500)
            {
                paramInt2 = 500;
            }
            if (paramInt1 < 0)
            {
                paramInt1 = 0;
            }
            if (paramInt2 < 0)
            {
                paramInt2 = 0;
            }

            if (paramInt1 < 1 || paramInt1 > iSize / 2)
            {
                ProcessError("Invalid Short Cycle for indicator " + FullName, IndicatorErrorType.ShowErrorMessage);
                return(false);
            }

            if (paramInt2 < 1 || paramInt2 > iSize / 2 || paramInt2 < paramInt1)
            {
                ProcessError("Invalid Long Cycle for indicator " + FullName, IndicatorErrorType.ShowErrorMessage);
                return(false);
            }

            // Get the data
            Field pSource = SeriesToField("Source", ParamStr(0), iSize);

            if (!EnsureField(pSource, ParamStr(0)))
            {
                return(false);
            }

            Navigator pNav = new Navigator();
            Recordset pRS  = new Recordset();

            pRS.AddField(pSource);

            pNav.Recordset_ = pRS;

            // Calculate the indicator
            Index     ta   = new Index();
            Recordset pInd = ta.RAVI(pNav, pSource, paramInt1, paramInt2, FullName);


            // Output the indicator values
            Clear();

            for (int n = 0; n < iSize; ++n)
            {
                AppendValue(DM.TS(n), n < paramInt1 ? null : pInd.Value(FullName, n + 1));
            }

            return(_calculateResult = PostCalculate());
        }
Ejemplo n.º 11
0
        /// <summary>
        /// Action to be executd for calculating indicator
        /// </summary>
        /// <returns>for future usage. Must be ignored at this time.</returns>
        protected override bool TrueAction()
        {
// Validate
            int size = _chartPanel._chartX.RecordCount;

            if (size == 0)
            {
                return(false);
            }

            int paramInt1 = ParamInt(1);

            if (paramInt1 < 1 || paramInt1 > size / 2)
            {
                ProcessError("Invalid Periods for indicator " + FullName, IndicatorErrorType.ShowErrorMessage);
                return(false);
            }

            // Get the data
            string paramStr0 = ParamStr(0);
            Field  pOpen     = SeriesToField("Open", paramStr0 + ".open", size);

            if (!EnsureField(pOpen, paramStr0 + ".open"))
            {
                return(false);
            }
            Field pHigh = SeriesToField("High", paramStr0 + ".high", size);

            if (!EnsureField(pHigh, paramStr0 + ".high"))
            {
                return(false);
            }
            Field pLow = SeriesToField("Low", paramStr0 + ".low", size);

            if (!EnsureField(pLow, paramStr0 + ".low"))
            {
                return(false);
            }
            Field pClose = SeriesToField("Close", paramStr0 + ".close", size);

            if (!EnsureField(pClose, paramStr0 + ".close"))
            {
                return(false);
            }

            Navigator pNav = new Navigator();
            Recordset pRS  = new Recordset();

            pRS.AddField(pOpen);
            pRS.AddField(pHigh);
            pRS.AddField(pLow);
            pRS.AddField(pClose);

            pNav.Recordset_ = pRS;


            // Calculate the indicator
            Oscillator ta   = new Oscillator();
            Recordset  pInd = ta.DirectionalMovementSystem(pNav, pRS, paramInt1);


            // Output the indicator values
            Clear();

            TwinIndicator sDIPlus  = (TwinIndicator)EnsureSeries(FullName + " DI+");
            TwinIndicator sDIMinus = (TwinIndicator)EnsureSeries(FullName + " DI-");

            sDIPlus.SetStrokeColor(Colors.Red, false);
            sDIMinus.SetStrokeColor(Colors.Blue, false);

            _title = "ADX";


            for (int n = 0; n < size; ++n)
            {
                double?adx;
                double?din;
                double?dip;
                if (n < paramInt1)
                {
                    adx = null;
                    dip = null;
                    din = null;
                }
                else
                {
                    adx = pInd.Value("ADX", n + 1);
                    dip = pInd.Value("DI+", n + 1);
                    din = pInd.Value("DI-", n + 1);
                }
                AppendValue(DM.GetTimeStampByIndex(n), adx);
                sDIPlus.AppendValue(DM.GetTimeStampByIndex(n), dip);
                sDIMinus.AppendValue(DM.GetTimeStampByIndex(n), din);
            }

            return(_calculateResult = PostCalculate());
        }
        /// <summary>
        /// Action to be executd for calculating indicator
        /// </summary>
        /// <returns>for future usage. Must be ignored at this time.</returns>
        protected override bool TrueAction()
        {
// Validate
            int size = _chartPanel._chartX.RecordCount;

            if (size == 0)
            {
                return(false);
            }

            int           paramInt1 = ParamInt(1);
            int           paramInt2 = ParamInt(2);
            IndicatorType param3    = (IndicatorType)ParamInt(3);

            if (paramInt1 < 1 || paramInt1 > size / 2)
            {
                ProcessError("Invalid Periods for indicator " + FullName, IndicatorErrorType.ShowErrorMessage);
                return(false);
            }
            if (paramInt2 <= 0)
            {
                ProcessError("Invalid Rate of Change for indicator " + FullName, IndicatorErrorType.ShowErrorMessage);
                return(false);
            }
            if (param3 < Constants.MA_START || param3 > Constants.MA_END)
            {
                ProcessError("Invalid Moving Average Type for indicator " + FullName, IndicatorErrorType.ShowErrorMessage);
                return(false);
            }


            // Get the data
            string paramStr0 = ParamStr(0);
            Field  pOpen     = SeriesToField("Open", paramStr0 + ".open", size);

            if (!EnsureField(pOpen, paramStr0 + ".open"))
            {
                return(false);
            }
            Field pHigh = SeriesToField("High", paramStr0 + ".high", size);

            if (!EnsureField(pHigh, paramStr0 + ".high"))
            {
                return(false);
            }
            Field pLow = SeriesToField("Low", paramStr0 + ".low", size);

            if (!EnsureField(pLow, paramStr0 + ".low"))
            {
                return(false);
            }
            Field pClose = SeriesToField("Close", paramStr0 + ".close", size);

            if (!EnsureField(pClose, paramStr0 + ".close"))
            {
                return(false);
            }

            Navigator pNav = new Navigator();
            Recordset pRS  = new Recordset();

            pRS.AddField(pOpen);
            pRS.AddField(pHigh);
            pRS.AddField(pLow);
            pRS.AddField(pClose);

            pNav.Recordset_ = pRS;


            // Calculate the indicator
            Oscillator ta   = new Oscillator();
            Recordset  pInd = ta.ChaikinVolatility(pNav, pRS, paramInt1, paramInt2, param3, FullName);


            // Output the indicator values
            Clear();
            for (int n = 0; n < size; ++n)
            {
                AppendValue(DM.GetTimeStampByIndex(n), n < paramInt1 ? null : pInd.Value(FullName, n + 1));
            }

            return(_calculateResult = PostCalculate());
        }
Ejemplo n.º 13
0
            ///<summary>
            /// Regression
            ///</summary>
            ///<param name="pNav">Navigator</param>
            ///<param name="pSource">Field Source</param>
            ///<param name="periods">Periods</param>
            ///<returns>Recordset</returns>
            public Recordset Regression(Navigator pNav, Field pSource, int periods)
            {
                List <double?> Y         = new List <double?>(); //Value
                double?        dRSquared = 0;

                Recordset Results = new Recordset();
                int       iRecord;

                int iRecordCount = pNav.RecordCount;

                Field Field1 = new Field(iRecordCount, "Slope");
                Field Field2 = new Field(iRecordCount, "Intercept");
                Field Field3 = new Field(iRecordCount, "Forecast");
                Field Field4 = new Field(iRecordCount, "RSquared");

                pNav.MoveFirst();

                for (iRecord = periods; iRecord < iRecordCount + 1; iRecord++)
                {
                    int X = periods;                //Period
                    Y.AddRange(new double?[X + 1]); //Y.resize(X + 1);

                    //Move back n periods
                    int iPosition = iRecord;
                    pNav.Position = iRecord - periods + 1;

                    int iPeriod;
                    for (iPeriod = 1; iPeriod < periods + 1; iPeriod++)
                    {
                        double?dValue = pSource.Value(pNav.Position);
                        Y[iPeriod] = dValue;
                        pNav.MoveNext();
                    } //Period

                    //Return to original position and reset
                    pNav.Position = iPosition;
                    double?XSum        = 0;
                    double?YSum        = 0;
                    double?XSquaredSum = 0;
                    double?YSquaredSum = 0;
                    double?XYSum       = 0;

                    //Square
                    int N;
                    for (N = 1; N < X + 1; N++)
                    {
                        XSum        += N;
                        YSum        += Y[N];
                        XSquaredSum += (N * N);
                        YSquaredSum += (Y[N] * Y[N]);
                        XYSum       += (Y[N] * N);
                    }//N

                    N = X; //Number of periods in calculation
                    double?q1 = (XYSum - ((XSum * YSum) / N));
                    double?q2 = (XSquaredSum - ((XSum * XSum) / N));
                    double?q3 = (YSquaredSum - ((YSum * YSum) / N));

                    double?dSlope     = (q1 / q2);
                    double?dIntercept = (((1 / (double)N) * YSum) - (((int)((double)N / 2)) * dSlope));
                    double?dForecast  = ((N * dSlope) + dIntercept);


                    if ((q1 * q1) != 0 && (q2 * q3) != 0)
                    {
                        dRSquared = (q1 * q1) / (q2 * q3); //Coefficient of determination (R-Squared)
                    }

                    if (iRecord > periods)
                    {
                        Field1.Value(iRecord, dSlope);
                        Field2.Value(iRecord, dIntercept);
                        Field3.Value(iRecord, dForecast);
                        Field4.Value(iRecord, dRSquared);
                    }

                    pNav.MoveNext();
                }//Record

                //Append fields to CNavigator
                Results.AddField(Field1);
                Results.AddField(Field2);
                Results.AddField(Field3);
                Results.AddField(Field4);

                pNav.MoveFirst();
                return(Results);
            }