public Recordset Keltner(Navigator pNav, Recordset pOHLCV, int Periods, double Factor, IndicatorType MAType, string Alias) { // Same as STARC Recordset Results = new Recordset(); int recordCount = pOHLCV.GetField("Close").RecordCount; Field top = new Field(); top.Initialize(recordCount, Alias + " Top"); Field bottom = new Field(); bottom.Initialize(recordCount, Alias + " Bottom"); Oscillator os = new Oscillator(); Field tr = os.TrueRange(pNav, pOHLCV, "atr").GetField("atr"); MovingAverage ma = new MovingAverage(); Field atr = ma.SimpleMovingAverage(pNav, tr, Periods, "atr").GetField("atr"); Field median = ma.MovingAverageSwitch(pNav, pOHLCV.GetField("Close"), Periods, MAType, Alias + " Median").GetField(Alias + " Median"); for (int record = 1; record < recordCount + 1; record++) { double shift = Factor * atr.ValueEx(record); top.SetValue(record, median.Value(record) + shift); bottom.SetValue(record, median.Value(record) - shift); } Results.AddField(top); Results.AddField(median); Results.AddField(bottom); return(Results); }
///<summary> /// High Low Bands ///</summary> ///<param name="pNav">Navigator</param> ///<param name="HighPrice">Field High Price</param> ///<param name="LowPrice">Field Low Price</param> ///<param name="ClosePrice">Field ClosePrice</param> ///<param name="periods">Periods</param> ///<returns>Recordset</returns> public Recordset HighLowBands(Navigator pNav, Field HighPrice, Field LowPrice, Field ClosePrice, int periods) { MovingAverage MA = new MovingAverage(); Recordset Results = new Recordset(); if (periods < 6 || periods > pNav.RecordCount) { return(null); } Recordset RS1 = MA.VIDYA(pNav, HighPrice, periods, 0.8, "High Low Bands Top"); Recordset RS2 = MA.VIDYA(pNav, ClosePrice, periods / 2, 0.8, "High Low Bands Median"); Recordset RS3 = MA.VIDYA(pNav, LowPrice, periods, 0.8, "High Low Bands Bottom"); Results.AddField(RS1.GetField("High Low Bands Top")); Results.AddField(RS2.GetField("High Low Bands Median")); Results.AddField(RS3.GetField("High Low Bands Bottom")); // Remove fields so recordset can be deleted RS1.RemoveField("High Low Bands Top"); RS2.RemoveField("High Low Bands Median"); RS3.RemoveField("High Low Bands Bottom"); pNav.MoveFirst(); return(Results); }
///<summary> /// Commodity Channel Index ///</summary> ///<param name="pNav">Navigator</param> ///<param name="pOHLCV">OHLCV Recordset</param> ///<param name="periods">Periods</param> ///<param name="Alias">Alias</param> ///<returns>Recordset</returns> public Recordset CommodityChannelIndex(Navigator pNav, Recordset pOHLCV, int periods, string Alias) { General GN = new General(); MovingAverage MA = new MovingAverage(); Recordset Results = new Recordset(); int Record; int RecordCount = pNav.RecordCount; Field Field1 = new Field(RecordCount, Alias); Recordset TPrs = GN.TypicalPrice(pNav, pOHLCV, "TP"); Recordset MArs = MA.SimpleMovingAverage(pNav, TPrs.GetField("TP"), periods, "TPMA"); for (Record = 1; Record != (2 * periods) + 1; ++Record) { Field1.Value(Record, 0); } for (Record = (2 * periods); Record != RecordCount + 1; ++Record) { double dMeanDeviation = 0; double dTmp; int Count; for (Count = (Record - periods); Count != Record + 1; ++Count) { double?d1 = TPrs.GetField("TP").Value(Count); double?d2 = MArs.GetField("TPMA").Value(Count); d1 = d1.HasValue ? d1 : 0.0; d2 = d2.HasValue ? d2 : 0.0; dTmp = Math.Abs(d1.Value - d2.Value); dMeanDeviation = dMeanDeviation + dTmp; } //Count dMeanDeviation = dMeanDeviation / periods; dTmp = (double)((TPrs.GetField("TP").Value(Record) - MArs.GetField("TPMA").Value(Record)) / (dMeanDeviation * 0.015)); Field1.Value(Record, dTmp); } //Record pNav.MoveFirst(); Results.AddField(Field1); return(Results); }
///<summary> /// Median Price ///</summary> ///<param name="pNav">Navigator</param> ///<param name="pOHLCV">OHLCV RecordSet</param> ///<param name="Alias">Alias</param> ///<returns>Recordset</returns> public Recordset MedianPrice(Navigator pNav, Recordset pOHLCV, string Alias) { Recordset Results = new Recordset(); int Record; int RecordCount = pNav.RecordCount; Field Field1 = new Field(RecordCount, Alias); pNav.MoveFirst(); for (Record = 1; Record < RecordCount + 1; Record++) { double Value = (pOHLCV.GetField("High").Value(Record).Value + pOHLCV.GetField("Low").Value(Record).Value) / 2; Field1.Value(Record, Value); pNav.MoveNext(); } //Record pNav.MoveFirst(); Results.AddField(Field1); return(Results); }
///<summary> /// Mass Index ///</summary> ///<param name="pNav">Navigator</param> ///<param name="pOHLCV">OHLCV Recordset</param> ///<param name="periods">Periods</param> ///<param name="Alias">Alias</param> ///<returns>Recordset</returns> public Recordset MassIndex(Navigator pNav, Recordset pOHLCV, int periods, string Alias) { Recordset Results = new Recordset(); General GE = new General(); MovingAverage MA = new MovingAverage(); int Record; int RecordCount = pNav.RecordCount; if (periods < 1 || periods > RecordCount) { return(null); } Field Field1 = new Field(RecordCount, Alias); Recordset HML = GE.HighMinusLow(pNav, pOHLCV, "HML"); Field Temp = HML.GetField("HML"); Recordset EMA1 = MA.ExponentialMovingAverage(pNav, Temp, 9, "EMA"); Temp = EMA1.GetField("EMA"); Recordset EMA2 = MA.ExponentialMovingAverage(pNav, Temp, 9, "EMA"); int Start = (periods * 2) + 1; pNav.Position = Start; for (Record = Start; Record < RecordCount + 2; Record++) { double?Sum = 0; pNav.Position = Record - periods; int Period; for (Period = 1; Period < periods + 1; Period++) { Sum = Sum + (EMA1.Value("EMA", pNav.Position) / EMA2.Value("EMA", pNav.Position)); pNav.MoveNext(); }//Period pNav.MovePrevious(); Field1.Value(pNav.Position, Sum); pNav.MoveNext(); }//Record pNav.MoveFirst(); Results.AddField(Field1); return(Results); }
///<summary> /// Stochastic Momentum Index ///</summary> ///<param name="pNav">Navigator</param> ///<param name="pOHLCV">OHLCV Recordser</param> ///<param name="KPeriods">K Periods</param> ///<param name="KSmooth">K Smooth</param> ///<param name="KDoubleSmooth">K Double Smooth</param> ///<param name="DPeriods">D Periods</param> ///<param name="MAType">Moving Average Type</param> ///<param name="PctD_MAType">%D Movering Average Type</param> ///<returns>Recordset</returns> public Recordset StochasticMomentumIndex(Navigator pNav, Recordset pOHLCV, int KPeriods, int KSmooth, int KDoubleSmooth, int DPeriods, IndicatorType MAType, IndicatorType PctD_MAType) { MovingAverage MA = new MovingAverage(); Recordset Results = new Recordset(); General GN = new General(); int Record; double? Value = 0; KSmooth += 1; int RecordCount = pNav.RecordCount; Field Field1 = new Field(RecordCount, "%K"); Recordset Temp = GN.HHV(pNav, pOHLCV.GetField("High"), KPeriods, "HHV"); Field HHV = new Field(RecordCount, "HHV"); Temp.CopyField(HHV, "HHV"); Temp = GN.LLV(pNav, pOHLCV.GetField("Low"), KPeriods, "LLV"); Field LLV = new Field(RecordCount, "LLV"); Temp.CopyField(LLV, "LLV"); Field HHLL = new Field(RecordCount, "HHLL"); for (Record = 1; Record != RecordCount + 1; ++Record) { Value = HHV.Value(Record) - LLV.Value(Record); HHLL.Value(Record, Value); } Field CHHLL = new Field(RecordCount, "CHHLL"); for (Record = 1; Record != RecordCount + 1; ++Record) { Value = pOHLCV.Value("Close", Record) - (0.5f * (HHV.Value(Record) + LLV.Value(Record))); CHHLL.Value(Record, Value); } if (KSmooth > 1) { switch (MAType) { case IndicatorType.SimpleMovingAverage: Temp = MA.SimpleMovingAverage(pNav, CHHLL, KSmooth, "CHHLL"); break; case IndicatorType.ExponentialMovingAverage: Temp = MA.ExponentialMovingAverage(pNav, CHHLL, KSmooth, "CHHLL"); break; case IndicatorType.TimeSeriesMovingAverage: Temp = MA.TimeSeriesMovingAverage(pNav, CHHLL, KSmooth, "CHHLL"); break; case IndicatorType.TriangularMovingAverage: Temp = MA.TriangularMovingAverage(pNav, CHHLL, KSmooth, "CHHLL"); break; case IndicatorType.VariableMovingAverage: Temp = MA.VariableMovingAverage(pNav, CHHLL, KSmooth, "CHHLL"); break; case IndicatorType.WeightedMovingAverage: Temp = MA.WeightedMovingAverage(pNav, CHHLL, KSmooth, "CHHLL"); break; case IndicatorType.VIDYA: Temp = MA.VIDYA(pNav, CHHLL, KSmooth, 0.65, "CHHLL"); break; } Temp.CopyField(CHHLL, "CHHLL"); } if (KDoubleSmooth > 1) { switch (MAType) { case IndicatorType.SimpleMovingAverage: Temp = MA.SimpleMovingAverage(pNav, CHHLL, KDoubleSmooth, "CHHLL"); break; case IndicatorType.ExponentialMovingAverage: Temp = MA.ExponentialMovingAverage(pNav, CHHLL, KDoubleSmooth, "CHHLL"); break; case IndicatorType.TimeSeriesMovingAverage: Temp = MA.TimeSeriesMovingAverage(pNav, CHHLL, KDoubleSmooth, "CHHLL"); break; case IndicatorType.TriangularMovingAverage: Temp = MA.TriangularMovingAverage(pNav, CHHLL, KDoubleSmooth, "CHHLL"); break; case IndicatorType.VariableMovingAverage: Temp = MA.VariableMovingAverage(pNav, CHHLL, KDoubleSmooth, "CHHLL"); break; case IndicatorType.WeightedMovingAverage: Temp = MA.WeightedMovingAverage(pNav, CHHLL, KDoubleSmooth, "CHHLL"); break; case IndicatorType.VIDYA: Temp = MA.VIDYA(pNav, CHHLL, KDoubleSmooth, 0.65, "CHHLL"); break; } Temp.CopyField(CHHLL, "CHHLL"); } if (KSmooth > 1) { switch (MAType) { case IndicatorType.SimpleMovingAverage: Temp = MA.SimpleMovingAverage(pNav, HHLL, KSmooth, "HHLL"); break; case IndicatorType.ExponentialMovingAverage: Temp = MA.ExponentialMovingAverage(pNav, HHLL, KSmooth, "HHLL"); break; case IndicatorType.TimeSeriesMovingAverage: Temp = MA.TimeSeriesMovingAverage(pNav, HHLL, KSmooth, "HHLL"); break; case IndicatorType.TriangularMovingAverage: Temp = MA.TriangularMovingAverage(pNav, HHLL, KSmooth, "HHLL"); break; case IndicatorType.VariableMovingAverage: Temp = MA.VariableMovingAverage(pNav, HHLL, KSmooth, "HHLL"); break; case IndicatorType.WeightedMovingAverage: Temp = MA.WeightedMovingAverage(pNav, HHLL, KSmooth, "HHLL"); break; case IndicatorType.VIDYA: Temp = MA.VIDYA(pNav, HHLL, KSmooth, 0.65, "HHLL"); break; } Temp.CopyField(HHLL, "HHLL"); } if (KDoubleSmooth > 1) { switch (MAType) { case IndicatorType.SimpleMovingAverage: Temp = MA.SimpleMovingAverage(pNav, HHLL, KDoubleSmooth, "HHLL"); break; case IndicatorType.ExponentialMovingAverage: Temp = MA.ExponentialMovingAverage(pNav, HHLL, KDoubleSmooth, "HHLL"); break; case IndicatorType.TimeSeriesMovingAverage: Temp = MA.TimeSeriesMovingAverage(pNav, HHLL, KDoubleSmooth, "HHLL"); break; case IndicatorType.TriangularMovingAverage: Temp = MA.TriangularMovingAverage(pNav, HHLL, KDoubleSmooth, "HHLL"); break; case IndicatorType.VariableMovingAverage: Temp = MA.VariableMovingAverage(pNav, HHLL, KDoubleSmooth, "HHLL"); break; case IndicatorType.WeightedMovingAverage: Temp = MA.WeightedMovingAverage(pNav, HHLL, KDoubleSmooth, "HHLL"); break; case IndicatorType.VIDYA: Temp = MA.VIDYA(pNav, HHLL, KDoubleSmooth, 0.65, "HHLL"); break; } Temp.CopyField(HHLL, "HHLL"); } for (Record = KPeriods + 1; Record != RecordCount + 1; ++Record) { double?a = CHHLL.Value(Record); double?b = (0.5f * HHLL.Value(Record)); if (a != b && b != 0) { Value = 100.0f * (a / b); } Field1.Value(Record, Value); } if (DPeriods > 1) { switch (PctD_MAType) { case IndicatorType.SimpleMovingAverage: Temp = MA.SimpleMovingAverage(pNav, Field1, DPeriods, "%D"); break; case IndicatorType.ExponentialMovingAverage: Temp = MA.ExponentialMovingAverage(pNav, Field1, DPeriods, "%D"); break; case IndicatorType.TimeSeriesMovingAverage: Temp = MA.TimeSeriesMovingAverage(pNav, Field1, DPeriods, "%D"); break; case IndicatorType.TriangularMovingAverage: Temp = MA.TriangularMovingAverage(pNav, Field1, DPeriods, "%D"); break; case IndicatorType.VariableMovingAverage: Temp = MA.VariableMovingAverage(pNav, Field1, DPeriods, "%D"); break; case IndicatorType.WeightedMovingAverage: Temp = MA.WeightedMovingAverage(pNav, Field1, DPeriods, "%D"); break; case IndicatorType.VIDYA: Temp = MA.VIDYA(pNav, Field1, DPeriods, 0.65, "%D"); break; } Field Field2 = new Field(RecordCount, "%D"); Temp.CopyField(Field2, "%D"); Results.AddField(Field2); } Results.AddField(Field1); return(Results); }
///<summary> /// Money Flow Index ///</summary> ///<param name="pNav">Navigator</param> ///<param name="pOHLCV">OHLCV Recordset</param> ///<param name="periods">Periods</param> ///<param name="Alias">Alias</param> ///<returns>Recordset</returns> public Recordset MoneyFlowIndex(Navigator pNav, Recordset pOHLCV, int periods, string Alias) { Recordset Results = new Recordset(); int Record; int RecordCount = pNav.RecordCount; if (periods < 1 || periods > RecordCount) { return(null); } Field Field1 = new Field(RecordCount, Alias); int Start = periods + 2; pNav.Position = Start; for (Record = Start; Record < RecordCount + 2; Record++) { double PosFlow = 0; double NegFlow = 0; pNav.Position = Record - periods; int Period; for (Period = 1; Period < periods + 1; Period++) { pNav.MovePrevious(); double Price1 = (pOHLCV.GetField("High").Value(pNav.Position).Value + pOHLCV.GetField("Low").Value(pNav.Position).Value + pOHLCV.GetField("Close").Value(pNav.Position).Value) / 3; pNav.MoveNext(); double V = pOHLCV.GetField("Volume").Value(pNav.Position).Value; if (V < 1) { V = 1; } double Price2 = (pOHLCV.GetField("High").Value(pNav.Position).Value + pOHLCV.GetField("Low").Value(pNav.Position).Value + pOHLCV.GetField("Close").Value(pNav.Position).Value) / 3; if (Price2 > Price1) { PosFlow += Price2 * V; } else if (Price2 < Price1) { NegFlow += Price2 * V; } pNav.MoveNext(); }//Period pNav.MovePrevious(); if (PosFlow != 0 && NegFlow != 0) { double MoneyRatio = PosFlow / NegFlow; double MoneyIndex = 100 - (100 / (1 + MoneyRatio)); Field1.Value(pNav.Position, MoneyIndex); } }//Record pNav.MoveFirst(); Results.AddField(Field1); return(Results); }
///<summary> /// Swing Index ///</summary> ///<param name="pNav">Navigator</param> ///<param name="pOHLCV">OHLCV Recordset</param> ///<param name="LimitMoveValue">Limit Move Value</param> ///<param name="Alias">Alias</param> ///<returns>RecordSet</returns> public Recordset SwingIndex(Navigator pNav, Recordset pOHLCV, double LimitMoveValue, string Alias) { TASDK TASDK1 = new TASDK(); Recordset Results = new Recordset(); int Record; double R = 0; int RecordCount = pNav.RecordCount; if (LimitMoveValue <= 0) { return(null); } Field Field1 = new Field(RecordCount, Alias); const int Start = 2; pNav.Position = Start; for (Record = Start; Record < RecordCount + 1; Record++) { double Oy = pOHLCV.GetField("Open").Value(pNav.Position - 1).Value; double Ot = pOHLCV.GetField("Open").Value(pNav.Position).Value; double Ht = pOHLCV.GetField("High").Value(pNav.Position).Value; double Lt = pOHLCV.GetField("Low").Value(pNav.Position).Value; double Cy = pOHLCV.GetField("Close").Value(pNav.Position - 1).Value; double Ct = pOHLCV.GetField("Close").Value(pNav.Position).Value; double K = TASDK1.max(Math.Abs(Ht - Cy), Math.Abs(Lt - Cy), 0.0); double A = Math.Abs(Ht - Cy); double B = Math.Abs(Lt - Cy); double C = Math.Abs(Ht - Lt); if (A > B && A > C) { R = Math.Abs(Ht - Cy) - 0.5 * Math.Abs(Lt - Cy) + 0.25 * Math.Abs(Cy - Oy); } else if (B > A && B > C) { R = Math.Abs(Lt - Cy) - 0.5 * Math.Abs(Ht - Cy) + 0.25 * Math.Abs(Cy - Oy); } else if (C > A && C > B) { R = Math.Abs(Ht - Lt) + 0.25 * Math.Abs(Cy - Oy); } double Value; if (R > 0 && LimitMoveValue > 0) { Value = 50 * ((Ct - Cy) + 0.5 * (Ct - Ot) + 0.25 * (Cy - Oy)) / R * K / LimitMoveValue; } else { Value = 0; } Field1.Value(pNav.Position, Value); pNav.MoveNext(); }//Record pNav.MoveFirst(); Results.AddField(Field1); return(Results); }
///<summary> /// Fractal Chaos bands ///</summary> ///<param name="pNav">Navigator</param> ///<param name="pOHLCV">OHLCV Recordset</param> ///<param name="periods">Periods</param> ///<returns>Records</returns> public Recordset FractalChaosBands(Navigator pNav, Recordset pOHLCV, int periods) { MovingAverage MA = new MovingAverage(); Recordset Results = new Recordset(); int RecordCount = pNav.RecordCount; int Record; if (periods < 1) { periods = 100; } Field fHiFractal = new Field(RecordCount, "Fractal High"); Field fLoFractal = new Field(RecordCount, "Low High"); Field fH = pOHLCV.GetField("High"); Field fL = pOHLCV.GetField("Low"); Field fFR = new Field(RecordCount, "FR"); Field fH1 = new Field(RecordCount, "High 1"); Field fH2 = new Field(RecordCount, "High 2"); Field fH3 = new Field(RecordCount, "High 3"); Field fH4 = new Field(RecordCount, "High 4"); Field fL1 = new Field(RecordCount, "Low 1"); Field fL2 = new Field(RecordCount, "Low 2"); Field fL3 = new Field(RecordCount, "Low 3"); Field fL4 = new Field(RecordCount, "Low 4"); for (Record = 5; Record < RecordCount + 1; ++Record) { fH1.Value(Record, fH.ValueEx(Record - 4)); fL1.Value(Record, fL.ValueEx(Record - 4)); fH2.Value(Record, fH.ValueEx(Record - 3)); fL2.Value(Record, fL.ValueEx(Record - 3)); fH3.Value(Record, fH.ValueEx(Record - 2)); fL3.Value(Record, fL.ValueEx(Record - 2)); fH4.Value(Record, fH.ValueEx(Record - 1)); fL4.Value(Record, fL.ValueEx(Record - 1)); } for (Record = 1; Record < RecordCount + 1; ++Record) { fHiFractal.Value(Record, (fH.ValueEx(Record) + fL.ValueEx(Record)) / 3); } Recordset rsFractals = MA.SimpleMovingAverage(pNav, fHiFractal, periods, "Fractal High"); fHiFractal = rsFractals.GetField("Fractal High"); rsFractals.RemoveField("Fractal High"); rsFractals = MA.SimpleMovingAverage(pNav, fLoFractal, periods, "Fractal Low"); fLoFractal = rsFractals.GetField("Fractal Low"); rsFractals.RemoveField("Fractal Low"); for (Record = 1; Record < RecordCount + 1; ++Record) { fHiFractal.Value(Record, fH3.ValueEx(Record) + fHiFractal.ValueEx(Record)); fLoFractal.Value(Record, fL3.ValueEx(Record) - fLoFractal.ValueEx(Record)); } for (Record = 2; Record < RecordCount + 1; ++Record) { if ((fH3.Value(Record) > fH1.Value(Record)) && (fH3.Value(Record) > fH2.Value(Record)) && (fH3.Value(Record) >= fH4.Value(Record)) && (fH3.Value(Record) >= fH.Value(Record))) { fFR.Value(Record, fHiFractal.Value(Record).Value); } else { fFR.Value(Record, 0); } if (fFR.Value(Record) == 0) { if ((fL3.Value(Record) < fL1.Value(Record)) && (fL3.Value(Record) < fL2.Value(Record)) && (fL3.Value(Record) <= fL4.Value(Record)) && (fL3.Value(Record) <= fL.Value(Record))) { fFR.Value(Record, fLoFractal.Value(Record)); } else { fFR.Value(Record, 0); } } if (fHiFractal.Value(Record) == fFR.Value(Record)) { fHiFractal.Value(Record, fH3.Value(Record)); } else { fHiFractal.Value(Record, fHiFractal.Value(Record - 1)); } if (fLoFractal.Value(Record) == fFR.Value(Record)) { fLoFractal.Value(Record, fL3.Value(Record)); } else { fLoFractal.Value(Record, fLoFractal.Value(Record - 1)); } } // Added 12/19/2005 TW for (Record = 2; Record < RecordCount + 1; ++Record) { if (fLoFractal.Value(Record) == 0) { fLoFractal.Value(Record, null); } if (fHiFractal.Value(Record) == 0) { fHiFractal.Value(Record, null); } } Results.AddField(fHiFractal); Results.AddField(fLoFractal); return(Results); }