
Cette stratégie permet de suivre les transactions en calculant des canaux et des indicateurs dynamiques, d’identifier les tendances et de suivre les tendances. Plus précisément, elle combine les indicateurs dynamiques et les indicateurs de canaux équilibrés, en utilisant les deux en combinaison, tout en intervenant dans les tendances à long terme, en utilisant les canaux équilibrés pour localiser les zones de profit multiples.
La stratégie est basée sur deux critères principaux:
Indicateur de dynamique ((DMI): pour juger de la tendance à la hausse du marché, l’indicateur génère un signal de transaction lorsque la valeur de seuil est supérieure à la valeur de seuil définie.
Le canal d’équilibre (Keltner Channel): pour déterminer la zone de tendance, le prix est considéré comme une opportunité d’achat lorsqu’il franchit la trajectoire, et comme un signal de placement lorsque le prix tombe dans la trajectoire moyenne.
La logique de négociation spécifique est la suivante: lorsque l’indicateur de dynamique + DI est supérieur au seuil de réglage ((par défaut 32), il est jugé que la tendance à plusieurs têtes est formée, à ce moment-là, le prix franchit le canal d’équilibre sur la trajectoire, générant un signal d’achat. Ensuite, utilisez le canal d’équilibre sur la trajectoire moyenne comme ligne de stop-loss, pour suivre le stop-loss et réaliser la protection des bénéfices.
La stratégie utilise les avantages des deux indicateurs pour déterminer la direction de la tendance à l’aide de l’indicateur de dynamique et de l’équilibre pour déterminer le moment d’entrée et la zone d’arrêt. La combinaison de deux indicateurs permet à la stratégie d’entrer efficacement plus tôt dans la détection de la tendance, tout en utilisant l’indicateur de la voie pour localiser les gains et les pertes.
La stratégie utilise les indicateurs de dynamique pour détecter les tendances du marché plus tôt que les indicateurs retardés tels que les moyennes mobiles simples.
L’utilisation d’un canal d’équilibrage pour déterminer les zones de transactions spécifiques permet de délimiter efficacement les zones de profit.
Les paramètres de l’indicateur et les règles de négociation sont rigoureux et raisonnables, les données de retracement fonctionnent bien, l’efficacité est vérifiée en direct.
Les stratégies sont simples, claires et faciles à comprendre, adaptées aux débutants en trading quantitatif.
Le risque de la stratégie est contrôlable, l’arrêt dynamique linéaire moyen est utilisé pour contrôler efficacement les pertes individuelles.
La stratégie ne s’applique qu’à la tendance et ne s’applique pas à la correction de la volatilité du marché, si le canal QtCore augmente et que les arrêts de la voie médiane sont trop lâches pour contrôler les pertes.
L’indicateur DMI est en retard, il n’est pas possible de déterminer la confirmation de la tendance et il est possible que l’intervention précoce de la tendance entraîne des pertes.
Il existe un risque que la méthode de stop-loss à pourcentage fixe ne soit pas en mesure de réintervenir dans la tendance après un choc majeur et de rater la suite.
Les données de détection sont suffisantes, mais le disque dur a encore besoin de beaucoup de temps pour vérifier la stabilité des paramètres.
Il est possible de tester différentes méthodes de stop, telles que le stop ATR, le stop mobile, etc. pour remplacer le stop à pourcentage fixe.
Des indicateurs de confirmation secondaires peuvent être ajoutés, tels que l’augmentation du volume de transactions, afin d’assurer l’admission après la confirmation de la tendance.
Il est possible de tester l’optimisation de différentes combinaisons de paramètres pour trouver la meilleure combinaison de paramètres.
La stabilité des paramètres peut être vérifiée par l’optimisation par étapes et la rétroaction flottante.
Cette stratégie utilise un double indicateur de jugement, permettant une capture efficace de la tendance. La stratégie est simple, intuitive, logiquement claire, fonctionne bien avec la rétro-évaluation et peut être utilisée comme une stratégie d’entrée dans le trading quantitatif. Cependant, il est nécessaire de vérifier les données du marché réel et d’optimiser les paramètres pour réduire le risque de perte de marché réel.
/*backtest
start: 2023-11-11 00:00:00
end: 2023-12-11 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//Original Idea by: @Wunderbit
//@version=4
strategy("Keltner Channel [LINKUSDT] 1H", overlay=true, initial_capital=3000,pyramiding = 0, currency="USD", default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent,commission_value=0.1)
/// TREND
trend_cond = input(true, title="Enable Ribbon Filter")
ribbon_period = input(30, "Ribbon 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(80, "KELTNER Period", step=1, minval=1)
mult = input(3.0,"KELTNER Multiple", step=0.1)
// Calculate Keltner Channel
ma = ema(source, length)
range = useTrueRange ? tr : high - low
rangema = ema(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 //
lensig = input(14, title="ADX Smoothing", minval=1, maxval=50)
len = input(14, minval=1, title="DI Length")
up = change(high)
down = -change(low)
plusDM = na(up) ? na : (up > down and up > 0 ? up : 0)
minusDM = na(down) ? na : (down > up and down > 0 ? down : 0)
trur = rma(tr, len)
plus = fixnan(100 * rma(plusDM, len) / trur)
minus = fixnan(100 * rma(minusDM, len) / trur)
sum = plus + minus
adx = 100 * rma(abs(plus - minus) / (sum == 0 ? 1 : sum), lensig)
trig_level=input(title="+DI Trigger Level", defval=32, minval=1,step=1)
//trig_level_adx=input(title="ADX Trigger Level", defval=30, minval=1,step=1)
//plot(adx, color=#FF006E, title="ADX")
//plot(plus, color=#0094FF, title="+DI")
//plot(minus, color=#FF6A00, title="-DI")
// plot(trig_level, 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(2030, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0)
testPeriod() =>
time >= testPeriodStart and time <= testPeriodStop ? true : false
///// Component Code Stop //////////////////////////////////////////
//////////////// STRATEGY EXECUTION //////////////////////////
// STRATEGY CONDITION
// LONG
long = ((open > lower and open < upper) and close > upper) and plus > minus and plus > trig_level and volume[0] > volume[1]
entry_long = trend_cond ? long and UT : long
exit_long = (close < ma) //or low < SL_long
//LONG SET UP
// Take Profit / Stop Loss
entry_price_long=valuewhen(entry_long,close,0)
//SL_long = entry_price_long * (1 - long_sl_inp)
long_tp1_inp = input(8, title='Long Take Profit 1 Target %', step=0.1)/100
long_tp1_qty = input(20, title="Long Take Profit 1 Qty %", step=1)
long_tp2_inp = input(16, title='Long Take Profit 2 Target %', step=0.1)/100
long_tp2_qty = input(30, 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 EXECUTION
if testPeriod()
// LONG
strategy.entry(id="Long", long=true, when=entry_long, comment = "INSERT ENTRY 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")