Stratégie basée sur les tendances du canal Keltner

Auteur:ChaoZhang est là., Date: 2023-11-03 16h59: 39
Les étiquettes:

img

Résumé

Cette stratégie repose sur trois indicateurs principaux: l'indicateur de tendance, le canal Keltner et l'indicateur DM.

L'indicateur de tendance est composé de SMA et EMA. Le canal Keltner est utilisé pour déterminer le prix d'ouverture et de fermeture des bougies. L'indicateur DM est utilisé pour juger de la direction du long et du court.

Le signal d'entrée est déclenché lorsque:

  1. L'EMA dépasse la SMA, confirmant la tendance à la hausse
  2. La bougie s'ouvre au-dessus de la bande supérieure et se ferme à l'intérieur du canal
  3. L'indicateur DM est supérieur à la valeur de référence

La stratégie comporte deux niveaux de prise de profit et un niveau de stop-loss.

Principes de stratégie

Identification des tendances

Les croisements SMA et EMA sont utilisés pour déterminer la direction de la tendance.

Le canal Keltner

Le canal a trois lignes: moyenne, supérieure et inférieure. La ligne du milieu est SMA de prix de clôture avec une longueur de 81. Les bandes supérieure et inférieure sont placées à un multiple de la plage vraie au-dessus et au-dessous de la ligne du milieu. Ici, nous utilisons 2,5 fois la plage vraie.

Le canal Keltner montre les niveaux de support et de résistance.

Indicateur DM

L'indicateur DM contient ADX, +DI et -DI. +DI mesure la force de la tendance haussière tandis que -DI mesure la force de la tendance baissière.

Lorsque +DI dépasse le niveau de référence (défaut 27), il indique une forte tendance haussière et est bon pour une entrée longue.

Analyse des avantages

Cette stratégie combine des indicateurs de tendance, de canal et de dynamique pour déterminer efficacement les actions des prix et l'orientation longue/courte.

  1. L'identification des tendances est relativement précise pour éviter les transactions contre tendance.

  2. Le canal Keltner montre des niveaux de support et de résistance clairs.

  3. L'indicateur DM mesure la dynamique longue/courte pour assurer la direction.

  4. Des règles d'entrée strictes aident à filtrer les fausses fuites.

  5. Les points de prise de profit et d'arrêt de perte permettent de capturer des profits.

Analyse des risques

Il y a aussi quelques risques à prendre en considération:

  1. La tendance peut s'inverser lorsque l'EMA traverse le niveau inférieur à la SMA, alors sortez en temps opportun.

  2. Le canal peut échouer dans des tendances fortes, pas dans un support/résistance strict.

  3. DM peut générer de faux signaux, vérifier l'action des prix.

  4. Une fausse fuite peut déclencher une entrée, mais rapidement, utilisez un stop loss raisonnable.

  5. Le profit et le stop loss doivent être continuellement optimisés pour s'adapter aux conditions changeantes du marché.

Directions d'optimisation

Quelques moyens d'optimiser davantage la stratégie:

  1. Ajuster les paramètres et tester différentes méthodes d'identification des tendances.

  2. Optimisez les paramètres du canal pour mieux s'adapter à la portée réelle.

  3. Testez différents paramètres DM et trouvez la combinaison optimale.

  4. Ajoutez plus de filtres d'entrée comme le volume.

  5. Essayez de suivre le stop loss pour obtenir plus de profits.

  6. Test séparément pour différents produits afin de trouver les meilleurs ensembles de paramètres.

Conclusion

La stratégie intègre plusieurs indicateurs pour déterminer la tendance, le support/résistance et l'élan, ce qui permet de capturer efficacement les tendances et de contrôler les risques.


/*backtest
start: 2022-10-27 00:00:00
end: 2023-11-02 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Original Idea by: Wunderbit Trading

//@version=4
strategy("Keltner Channel ETH/USDT 1H", overlay=true, initial_capital=1000,pyramiding = 0, currency="USD", default_qty_type=strategy.percent_of_equity, default_qty_value=100,  commission_type=strategy.commission.percent,commission_value=0.07)


/// TREND
ribbon_period = input(46, "Period", step=1)

leadLine1 = ema(close, ribbon_period)
leadLine2 = sma(close, ribbon_period)

// p3 = plot(leadLine1, color= #53b987, title="EMA", transp = 50, linewidth = 1)
// p4 = plot(leadLine2, color= #eb4d5c, title="SMA", transp = 50, linewidth = 1)
// fill(p3, p4, transp = 60, color = leadLine1 > leadLine2 ? #53b987 : #eb4d5c)

//Upward Trend
UT=leadLine2 < leadLine1
DT=leadLine2>leadLine1

///////////////////////////////////////INDICATORS

// KELTNER //
source       = close
useTrueRange = input(true)
length       = input(81, step=1, minval=1)
mult         = input(2.5, step=0.1)

// Calculate Keltner Channel
ma      = sma(source, length)
range   = useTrueRange ? tr : high - low
rangema = sma(range, length)
upper = ma + rangema * mult
lower = ma - rangema * mult

plot(ma, title="Middle", color=color.orange)
p1=plot(upper, title="Upper", color=color.orange)
p2=plot(lower, title="Lower", color=color.orange)
fill(p1,p2)


// DMI INDICATOR //
adxlen = 10 // input(10, title="ADX Smoothing")
dilen = input(19, title="DI Length")
keyLevel = 23// input(23, title="key level for ADX")
dirmov(len) =>
	up = change(high)
	down = -change(low)
	truerange = rma(tr, len)
	plus = fixnan(100 * rma(up > down and up > 0 ? up : 0, len) / truerange)
	minus = fixnan(100 * rma(down > up and down > 0 ? down : 0, len) / truerange)
	[plus, minus]

adx(dilen, adxlen) =>
	[plus, minus] = dirmov(dilen)
	sum = plus + minus
	adx = 100 * rma(abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen)
	[adx, plus, minus]

[sig, up, down] = adx(dilen, adxlen)

benchmark=input(title="DMI Benchmark", defval=27, minval=1,step=1)

// plot(sig, color=color.red, title="ADX")
// plot(up, style=plot.style_histogram, color=color.green, title="+DI")
// plot(down, style=plot.style_histogram, color=color.red, title="-DI")
// plot(keyLevel, color=color.white, title="Key Level")

///////////////////////////////////////////////////////////


////////////////////////////////////////////////////Component Code Start

testStartYear = input(2019, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)

testStopYear = input(9999, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0)

testPeriod() => true
///// Component Code Stop //////////////////////////////////////////

//////////////// STRATEGY EXECUTION //////////////////////////

//LONG SET UP
// Take Profit / Stop Loss
long_tp1_inp = input(4.5, title='Long Take Profit 1 %', step=0.1)/100
long_tp1_qty = input(15, title="Long Take Profit 1 Qty", step=1)

long_tp2_inp = input(20, title='Long Take Profit 2%', step=0.1)/100
long_tp2_qty = input(100, title="Long Take Profit 2 Qty", step=1)

long_take_level_1 = strategy.position_avg_price * (1 + long_tp1_inp)
long_take_level_2 = strategy.position_avg_price * (1 + long_tp2_inp)

long_sl_inp = input(4, title='Long Stop Loss %', step=0.1)/100
long_stop_level = strategy.position_avg_price * (1 - long_sl_inp)


// STRATEGY CONDITION
// LONG
entry_long = ((open > lower and open < upper) and close > upper) and up > down and up > benchmark //  and volume[0] > volume[1]
entry_price_long=valuewhen(entry_long,close,0)
SL_long = entry_price_long * (1 - long_sl_inp)
exit_long = (close < lower) or low < SL_long


// STRATEGY EXECUTION
if testPeriod()

    // LONG
    if UT
        strategy.entry(id="Long", long=true, when=entry_long, comment = "INSERT ENTER LONG COMMAND")
    strategy.exit("TP1","Long", qty_percent=long_tp1_qty, limit=long_take_level_1) // PLACE TAKE PROFIT IN WBT BOT SETTINGS 
    strategy.exit("TP2","Long", qty_percent=long_tp2_qty, limit=long_take_level_2) // PLACE TAKE PROFIT IN WBT BOT SETTINGS
    strategy.close(id="Long", when=exit_long, comment= "INSERT EXIT LONG COMMAND")


//PLOT FIXED SLTP LINE
// LONG POSITION
plot(strategy.position_size > 0 ? long_take_level_1 : na, style=plot.style_linebr, color=color.green, linewidth=1, title="1st Long Take Profit")
plot(strategy.position_size > 0 ? long_take_level_2 : na, style=plot.style_linebr, color=color.green, linewidth=1, title="2nd Long Take Profit")
plot(strategy.position_size > 0 ? long_stop_level : na, style=plot.style_linebr, color=color.red, linewidth=1, title="Long Stop Loss")

Plus de