
Die Strategie basiert auf dynamischen Kanal-Indikatoren, um Handelssignale zu erzeugen, die auf Kauf- und Verkaufssignale basieren, die auf dem Kursbruch des Kanals auf- und ablaufen. Die Strategie handelt nur mit mehreren Köpfen, und wenn ein Verkaufssignal auftritt, wird die Position platziert.
Diese Strategie verwendet SMA-Mittelwerte und ATR-Realamplitude, um einen Dynamikkanal zu erstellen. Die Ober- und Unterbahn des Kanals sind:
Aufwärts = SMA + ATR * Faktor Unterstraße = SMA - ATR * Faktor
Wenn der Preis nach oben geht, erzeugt er ein Kaufsignal; wenn der Preis nach unten geht, erzeugt er ein Verkaufssignal.
Wenn ein Verkaufssignal auftritt, wird der vorherige Auftrag storniert und die Position auf einen leeren Stand gebracht.
Die Logik der Strategie lautet:
Diese Strategie hat folgende Vorteile:
Die Strategie birgt auch Risiken:
Gegenmaßnahmen:
Diese Strategie kann in folgenden Bereichen optimiert werden:
Die Strategie basiert auf dynamischen Channel-Indikatoren, die einfach und effektiv Markttrends erfassen. Die Strategie-Logik ist klar und verständlich und erzeugt Handelssignale durch Preis-Breakout-Kanal. Obwohl nur mehrere Köpfe und kein Ausstiegsmechanismus unzureichend sind, können Verbesserungen durch Parameteroptimierung, Hinzufügen von Leerlaufmodulen, Hinzufügen von Stop-Loss-Methoden usw. vorgenommen werden.
/*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)