[HandlerCategory("vvTSLtools")] public class QQE : IDouble2DoubleHandler { [HandlerParameter(false, "false", NotOptimized = true)] public bool DrawSignalLine { get; set; } [HandlerParameter(true, "5", Min = "1", Max = "510", Step = "1")] public int SF { get; set; } [HandlerParameter(true, "14", Min = "10", Max = "30", Step = "1")] public int RSIperiod { get; set; } public IList GenQQE(IList source, bool DrawSignalLine_, int SF_, int RSIperiod_) { var AtrRsi = new double[source.Count]; var TrLevelSlowBuffer = new double[source.Count]; int Wilders_Period=RSIperiod_ * 2 - 1; var rsi = Series.RSI(source, RSIperiod_); var rsiMa = Series.EMA(rsi, SF_); for (int i = 1; i < source.Count; i++) { AtrRsi[i] = Math.Abs(rsiMa[i] - rsiMa[i-1]); } AtrRsi[0] = AtrRsi[1] = AtrRsi[2] = AtrRsi[3]; var MaAtrRsi = Series.EMA(AtrRsi, Wilders_Period); var MaMaAtrRsi = Series.EMA(MaAtrRsi, Wilders_Period); double rsi0, rsi1, dar, tr, dv; tr = TrLevelSlowBuffer[source.Count - 1]; rsi1 = rsiMa[source.Count - 1]; for (int i = 0; i < source.Count; i++) { rsi0 = rsiMa[i]; dar = MaMaAtrRsi[i] * 4.236; dv = tr; if (rsi0 < tr) { tr = rsi0 + dar; if ((rsi1 < dv) && (tr > dv)) tr = dv; } else if (rsi0 > tr) { tr = rsi0 - dar; if ((rsi1 > dv) && (tr < dv)) tr = dv; } TrLevelSlowBuffer[i] = tr; rsi1 = rsi0; } if (DrawSignalLine) return TrLevelSlowBuffer; return rsiMa; } public IList Execute(IList source) { return GenQQE(source, DrawSignalLine, SF, RSIperiod); } }