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:
La stratégie comporte deux niveaux de prise de profit et un niveau de stop-loss.
Les croisements SMA et EMA sont utilisés pour déterminer la direction de la tendance.
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.
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.
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.
L'identification des tendances est relativement précise pour éviter les transactions contre tendance.
Le canal Keltner montre des niveaux de support et de résistance clairs.
L'indicateur DM mesure la dynamique longue/courte pour assurer la direction.
Des règles d'entrée strictes aident à filtrer les fausses fuites.
Les points de prise de profit et d'arrêt de perte permettent de capturer des profits.
Il y a aussi quelques risques à prendre en considération:
La tendance peut s'inverser lorsque l'EMA traverse le niveau inférieur à la SMA, alors sortez en temps opportun.
Le canal peut échouer dans des tendances fortes, pas dans un support/résistance strict.
DM peut générer de faux signaux, vérifier l'action des prix.
Une fausse fuite peut déclencher une entrée, mais rapidement, utilisez un stop loss raisonnable.
Le profit et le stop loss doivent être continuellement optimisés pour s'adapter aux conditions changeantes du marché.
Quelques moyens d'optimiser davantage la stratégie:
Ajuster les paramètres et tester différentes méthodes d'identification des tendances.
Optimisez les paramètres du canal pour mieux s'adapter à la portée réelle.
Testez différents paramètres DM et trouvez la combinaison optimale.
Ajoutez plus de filtres d'entrée comme le volume.
Essayez de suivre le stop loss pour obtenir plus de profits.
Test séparément pour différents produits afin de trouver les meilleurs ensembles de paramètres.
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")