Cette stratégie est conçue sur la base de l'indicateur Keltner Channel pour générer des signaux de trading lorsque le prix franchit les bandes supérieure et inférieure du canal.
La stratégie utilise SMA et ATR pour construire le canal de Keltner.
La bande supérieure = SMA + ATR * multiplicateur La bande inférieure = SMA - ATR * multiplicateur
Lorsque le prix dépasse la bande supérieure, un signal d'achat est généré. Lorsque le prix dépasse la bande inférieure, un signal de vente est généré.
Puisqu'il ne va que long, si un signal de vente apparaît, il annulera les commandes précédentes et aplatira la position.
La logique est la suivante:
Les avantages de cette stratégie:
Il y a aussi des risques:
Les solutions:
La stratégie peut être optimisée dans les aspects suivants:
Cette stratégie capte efficacement les tendances du marché avec des règles simples du canal de Keltner. La logique est claire et facile à comprendre. Bien que l'absence de sorties et de module court, elle a un grand potentiel d'amélioration comme le réglage des paramètres, l'ajout d'arrêts, le short, etc. Dans l'ensemble, une stratégie quantitative précieuse qui mérite une recherche et une application approfondies.
/*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)