///<summary> /// Variable Moving Average ///</summary> ///<param name="pNav">Navigator</param> ///<param name="pSource">Field Source</param> ///<param name="periods">Periods</param> ///<param name="Alias">Alias</param> ///<returns>Recordset</returns> public Recordset VariableMovingAverage(Navigator pNav, Field pSource, int periods, string Alias) { Oscillator OS = new Oscillator(); int Record; int RecordCount = pNav.RecordCount; Field Field1 = new Field(RecordCount, Alias); //CMO must be overwritten Recordset Results = OS.ChandeMomentumOscillator(pNav, pSource, 9, "CMO"); const int Start = 2; pNav.Position = Start; for (Record = Start; Record < RecordCount + 1; Record++) { pNav.MovePrevious(); double PrevVMA = Field1.ValueEx(pNav.Position); pNav.MoveNext(); double CMO = Results.ValueEx("CMO", pNav.Position) / 100; double Price = pSource.ValueEx(pNav.Position); if (CMO < 0) { CMO = -1 * CMO; } double VMA = (CMO * Price) + (1 - CMO) * PrevVMA; Field1.Value(pNav.Position, VMA); pNav.MoveNext(); }//Record pNav.MoveFirst(); Results.AddField(Field1); return(Results); }
/// <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 pSource = SeriesToField("Source", paramStr0, size); if (!EnsureField(pSource, paramStr0)) { return(false); } Navigator pNav = new Navigator(); Recordset pRS = new Recordset(); pRS.AddField(pSource); pNav.Recordset_ = pRS; // Calculate the indicator Oscillator ta = new Oscillator(); Recordset pInd = ta.ChandeMomentumOscillator(pNav, pSource, paramInt1, 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()); }