Stratégie de suivi des tendances du canal d'équilibre de l'élan

Auteur:ChaoZhang est là., Date: 12 décembre 2023 18:07:31
Les étiquettes:

img

Résumé

Cette stratégie identifie les formations de tendance en calculant les canaux et les indicateurs de dynamique pour atteindre le suivi des tendances.

Principe de stratégie

La stratégie utilise principalement les deux indicateurs suivants pour le jugement:

  1. Indicateur de dynamique (DMI): Évalue la tendance longue et courte du marché et génère des signaux de trading lorsque l'indice est supérieur au seuil fixé.

  2. Canal d'équilibre (canal Keltner): Déterminez la zone de tendance. Lorsque le prix franchit le rail supérieur, il est temps d'acheter, et lorsque le prix tombe en dessous du rail du milieu, c'est un signal pour fermer la position.

La logique de trading spécifique est la suivante: lorsque l'indicateur de dynamique +DI est supérieur au seuil défini (par défaut 32), il est déterminé qu'une tendance haussière s'est formée. À ce moment-là, si le prix traverse le rail supérieur du canal d'équilibre, un signal d'achat est généré; après cela, le canal d'équilibre est utilisé. Le rail du milieu est utilisé comme ligne de stop loss pour suivre le stop loss et obtenir une protection des bénéfices.

Cette stratégie combine les avantages de deux indicateurs, utilise des indicateurs de dynamique pour déterminer la direction de la tendance et utilise des canaux d'équilibre pour déterminer le moment d'entrée et les zones de stop-loss.

Analyse des avantages

  1. La stratégie utilise des indicateurs de dynamique pour déterminer le stade précoce des tendances du marché, ce qui est plus efficace que les indicateurs de retard tels que les moyennes mobiles simples.

  2. L'utilisation du canal d'équilibre pour déterminer la fourchette de négociation spécifique peut effectivement verrouiller la zone de profit.

  3. Les paramètres de l'indicateur et les règles de négociation sont rigoureux et raisonnables, et les données de backtest fonctionnent bien et vérifient l'effet de combat réel.

  4. La stratégie est relativement simple et claire, facile à comprendre et à mettre en œuvre, et adaptée aux débutants du trading quantitatif.

  5. Le risque de la stratégie est contrôlable et elle adopte un stop loss dynamique avec la ligne médiane pour contrôler efficacement les pertes uniques.

Analyse des risques

  1. Si le canal QtCore augmente et que la perte d'arrêt du rail du milieu est trop faible, elle ne peut pas contrôler la perte.

  2. L'indicateur DMI a un certain décalage et ne peut pas déterminer la confirmation de la tendance.

  3. La méthode du stop loss à pourcentage fixe comporte des risques, car elle ne peut pas intervenir de nouveau dans les tendances après une forte fluctuation, ce qui fait que les tendances ultérieures sont manquantes.

  4. Il existe suffisamment de données sur les tests antérieurs, mais une mise en œuvre à long terme est encore nécessaire pour vérifier la stabilité des paramètres dans le commerce réel.

Optimisation

  1. Il est possible de tester différentes méthodes d'arrêt des pertes, telles que l'arrêt des pertes ATR, l'arrêt des pertes en mouvement, etc., pour remplacer le pourcentage fixe d'arrêt des pertes.

  2. Des indicateurs de confirmation secondaires, tels que l'amplification du volume, peuvent être ajoutés pour assurer l'entrée après la confirmation de la tendance.

  3. Différentes combinaisons de paramètres peuvent être testées pour trouver la combinaison optimale de paramètres.

  4. La robustesse des paramètres peut être vérifiée par l'optimisation progressive et les essais par étapes.

Résumé

Cette stratégie permet de capturer efficacement les marchés en tendance en utilisant des jugements de double indicateur. La stratégie est relativement simple et intuitive avec une logique claire et de bonnes performances de backtest. Elle peut servir d'une des stratégies d'entrée pour le trading quantitatif. Mais une vérification suffisante des données de trading réelles et une optimisation des paramètres sont toujours nécessaires pour réduire les pertes de trading réelles.


/*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")

Plus de