Tendance à suivre la stratégie de rupture de canal avec moyenne mobile et arrêt de suivi

Auteur:ChaoZhang est là., Date: 15 janvier 2024 à 12h25
Les étiquettes:

img

Résumé

Il s'agit d'une stratégie de rupture basée sur le canal des prix, combinée à des indicateurs de moyenne mobile et à un stop/take profit pour l'entrée et la sortie.

La logique de la stratégie

La stratégie calcule les moyennes mobiles des prix élevés/faibles pour former un canal de prix. Plus précisément, elle calcule la longueur 10 SMA des prix élevés/faibles pour tracer la bande supérieure et inférieure du canal. Lorsque le prix dépasse la bande inférieure dans la bande supérieure, il entre long. Lorsque le prix dépasse la bande supérieure dans la bande inférieure, il entre court.

Après l'entrée, la stratégie utilise soit un stop loss fixe, soit un stop trailing pour la sortie. Le stop trailing se compose de deux paramètres: le niveau de profit fixe et le décalage d'activation. Lorsque le prix atteint le décalage d'activation, le niveau de profit commence à traîner le prix. Cela permet de verrouiller les profits tout en gardant un peu d'espace ouvert.

La stratégie combine également un filtre d'intervalle de temps, n'exécutant que des backtests dans un laps de temps historique spécifié, pour tester la performance à travers différentes étapes du marché.

Analyse des avantages

La stratégie exploite le canal de prix et la tendance suivante avec trailing stop, ce qui lui permet de capturer les directions de tendance à moyen et long terme.

Dans l'ensemble, la stratégie présente une logique claire, des indicateurs et paramètres minimaux, est facile à vérifier, convient au trading de tendance à moyen et à long terme et peut tirer profit de fortes tendances.

Analyse des risques

La stratégie a tendance à s'arrêter facilement pendant les marchés agités, incapables de maintenir des profits.

Le réglage des paramètres est assez subjectif, nécessitant des ajustements à travers les différentes étapes du marché.

Des possibilités d'amélioration

D'autres indicateurs tels que le volume, les bandes de Bollinger peuvent être incorporés pour filtrer les signaux d'entrée, évitant les pièges.

Les règles de sortie peuvent être mises à niveau pour un arrêt de traîneau ou une sortie de lustre.

Conclusion

En résumé, il s'agit d'une stratégie quantitative basée sur le canal de prix, le suivi de la tendance, la gestion de la prise de profit/perte d'arrêt. Il a un flux logique clair, une structure de paramètres simple, facile à comprendre et un backtest. Il convient à l'apprentissage des concepts de trading algorithmique. La stratégie peut être améliorée dans divers aspects pour améliorer la stabilité et la rentabilité.


/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-21 23:59:59
period: 3h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy("Generalized SSL Backtest w/ TSSL", shorttitle="GSSL Backtest", overlay=true )
// Generalized SSL:
//  This is the very first time the SSL indicator, whose acronym I ignore, is on Tradingview. 
//  It is based on moving averages of the highs and lows. 
//  Similar channel indicators can be found, whereas 
//  this one implements the persistency inside the channel, which is rather tricky.
//  The green line is the base line which decides entries and exits, possibly with trailing stops.
//  With respect to the original version, here one can play with different moving averages.
//  The default settings are (10,SMA)
//
// Vitelot/Yanez/Vts March 2019

lb = input(10, title="Lb", minval=1)
maType = input( defval="SMA", title="MA Type", options=["SMA","EMA","HMA","McG","WMA","Tenkan"])

fixedSL = input(title="SL Activation", defval=300)
trailSL = input(title="SL Trigger", defval=1)
fixedTP = input(title="TP Activation", defval=150)
trailTP = input(title="TP Trigger", defval=1)

FromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromYear  = input(defval = 2019, title = "From Year", minval = 2017)
ToMonth   = input(defval = 6, title = "To Month", minval = 1, maxval = 12)
ToDay     = input(defval = 19, title = "To Day", minval = 1, maxval = 31)
ToYear    = input(defval = 2020, title = "To Year", minval = 2017)
start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)  // backtest start window
finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)        // backtest finish window
startTimeOk()  => true // create function "within window of time" if statement true
// QUANDL:BCHAIN/ETRVU is USD-denominated daily transaction value on BTC blockchain
// QUANDL:BCHAIN/MKTCP is USD-denominated Bitcoin marketcap

hma(sig, n) => // Hull moving average definition
    wma( 2*wma(sig,round(n/2))-wma(sig,n), round(sqrt(n)))

mcg(sig,length) => // Mc Ginley MA definition
    mg = 0.0
    mg := na(mg[1]) ? ema(sig, length) : mg[1] + (sig - mg[1]) / (length * pow(sig/mg[1], 4))

tenkan(sig,len) =>
    0.5*(highest(sig,len)+lowest(sig,len))

ma(t,sig,len) =>
    sss=na
    if t =="SMA"
        sss := sma(sig,len)
    if t == "EMA"
        sss := ema(sig,len)
    if t == "HMA"
        sss := hma(sig,len)
    if t == "McG" // Mc Ginley
        sss := mcg(sig,len)
    if t == "Tenkan"
        sss := tenkan(sig,len)
    if t == "WMA"
        sss := wma(sig,len)
    sss

base(mah, mal) =>
    bbb = na
    inChannel = close<mah and close>mal
    belowChannel = close<mah and close<mal
    bbb := inChannel? bbb[1]: belowChannel? -1: 1
    uuu = bbb==1? mal: mah
    ddd = bbb==1? mah: mal
    [uuu, ddd]

maH = ma(maType, high, lb)
maL = ma(maType, low, lb)

[up, dn] = base(maH,maL)

plot(up, title="High MA", color=lime, linewidth=3)
plot(dn, title="Low MA", color=orange, linewidth=3)

long = crossover(dn,up)
short = crossover(up,dn)

// === STRATEGY - LONG POSITION EXECUTION ===
strategy.entry("Long", strategy.long, when= long and startTimeOk())
strategy.exit("Exit", qty_percent = 100, loss=fixedSL, trail_offset=trailTP, trail_points=fixedTP) 
strategy.exit("Exit", when= short)
// === STRATEGY - SHORT POSITION EXECUTION ===
strategy.entry("Short", strategy.short, when= short and startTimeOk())
strategy.exit("Exit", qty_percent = 100, loss=fixedSL, trail_offset=trailTP, trail_points=fixedTP)
strategy.exit("Exit", when= long)

Plus de