Diese Strategie basiert auf dem Keltner Channel-Indikator, um Handelssignale zu erzeugen, wenn der Preis durch die oberen und unteren Bands des Kanals bricht.
Die Strategie verwendet SMA und ATR, um den Keltner-Kanal zu bauen.
Der Betrag der Vermögenswerte wird in den folgenden Zahlen angegeben: Unterer Band = SMA - ATR * Multiplikator
Wenn der Preis über das obere Band bricht, wird ein Kaufsignal erzeugt.
Da es nur lang geht, wenn ein Verkaufssignal erscheint, wird es vorherige Aufträge annullieren und die Position flach machen.
Die Logik lautet:
Die Vorteile dieser Strategie:
Es gibt auch einige Risiken:
Lösungen:
Die Strategie kann in folgenden Aspekten optimiert werden:
Diese Strategie fängt effektiv Markttrends mit einfachen Keltner Channel Regeln. Die Logik ist klar und leicht zu verstehen. Obwohl der Mangel an Ausgängen und kurze Modul, hat es ein großes Potenzial für Verbesserungen wie Parameter-Tuning, Hinzufügen Stops, gehen kurz usw. Insgesamt eine wertvolle Quant-Strategie wert eingehende Forschung und Anwendung.
/*backtest start: 2023-11-24 00:00:00 end: 2023-12-24 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 strategy("Keltner Channel Strategy", overlay=true) source = close useTrueRange = input(true) length = input(20, minval=1) mult = input(1.0) ma = sma(source, length) range = useTrueRange ? tr : high - low rangema = sma(range, length) upper = ma + rangema * mult lower = ma - rangema * mult crossUpper = crossover(source, upper) crossLower = crossunder(source, lower) bprice = 0.0 bprice := crossUpper ? high+syminfo.mintick : nz(bprice[1]) sprice = 0.0 sprice := crossLower ? low -syminfo.mintick : nz(sprice[1]) crossBcond = false crossBcond := crossUpper ? true : na(crossBcond[1]) ? false : crossBcond[1] crossScond = false crossScond := crossLower ? true : na(crossScond[1]) ? false : crossScond[1] cancelBcond = crossBcond and (source < ma or high >= bprice ) cancelScond = crossScond and (source > ma or low <= sprice ) if (cancelBcond) strategy.cancel("KltChLE") if (crossUpper) strategy.entry("KltChLE", strategy.long, stop=bprice, comment="KltChLE") if (cancelScond) strategy.cancel("KltChSE") if (crossLower) strategy.entry("KltChSE", strategy.short, stop=sprice, comment="KltChSE") //plot(strategy.equity, title="equity", color=red, linewidth=2, style=areabr)