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);
            }

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

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

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

            if (paramInt2 == paramInt3)
            {
                ProcessError("Signal Periods cannot be the same as Short Cycle", 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
            Oscillator ta   = new Oscillator();
            Recordset  pInd = ta.MACD(pNav, pRS, paramInt3, paramInt1, paramInt2, FullName);


            // Output the indicator values
            Clear();

            TwinIndicator sSignal = (TwinIndicator)EnsureSeries(FullName + " Signal");

            sSignal.SetStrokeColor(Colors.Blue, false);
            sSignal.SetStrokeThickness(StrokeThickness, false);

            ForceLinearChart         = true;
            sSignal.ForceLinearChart = true;

            //_title = "MACD";

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

            return(_calculateResult = PostCalculate());
        }