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