Tendance à la double chaîne ATR suivant la stratégie

Auteur:ChaoZhang est là., Date: 2023-11-01 11:40:07 Je suis désolé
Les étiquettes:

img

Résumé

La stratégie de suivi des tendances du double canal ATR est une stratégie de suivi des tendances qui combine des moyennes mobiles, des canaux ATR et de multiples indicateurs techniques pour suivre la tendance une fois qu'elle a été établie.

Comment fonctionne- t- il?

La stratégie utilise la ligne Kijun comme principal indicateur de moyenne mobile pour déterminer la direction de la tendance. Elle intègre également des canaux ATR pour limiter la gamme d'activité des prix - ne pas aller long lorsque le prix est proche de la bande supérieure et ne pas aller court lorsque le prix est proche de la bande inférieure pour éviter de poursuivre de nouveaux sommets et de vendre des bas.

Lorsque la ligne Kijun a un croisement vers le haut, un signal d'achat est généré. Lorsqu'un croisement vers le bas se produit, un signal de vente est déclenché. Pour filtrer les faux signaux, la stratégie utilise également plusieurs indicateurs techniques pour la confirmation, y compris Aroon, RSI, MACD et PSAR. Un signal d'achat ou de vente n'est déclenché que lorsque toutes les conditions de confirmation sont remplies.

Une fois dans un commerce, la stratégie utilise un stop loss et un take profit pour gérer les positions. Le stop loss est fixé à 0,5 ATR et le take profit à 0,5%.

Les avantages

  • L'utilisation de la ligne Kijun pour déterminer la tendance évite d'être piétiné par les marchés à plage
  • Les canaux ATR limitent l'activité des prix pour un meilleur contrôle des risques
  • Les confirmations multiples réduisent considérablement les faux signaux
  • Incorporer des blocs de stop loss et de prise de profit dans les bénéfices tout en gérant les risques

Les risques

  • Signaux retardés provenant de confirmations multiples, éventuellement manquant des mouvements de tendance précoces
  • Les petites pertes peuvent être arrêtées fréquemment.
  • Les paramètres de Kijun et ATR peuvent générer de nombreux signaux erronés.
  • Le fait de s'appuyer sur l'optimisation des paramètres et l'ajustement de la courbe peut ne pas fonctionner bien dans le trading en direct

Des possibilités d'amélioration

  • Testez des indicateurs de tendance plus avancés comme les nuages Ichimoku
  • Optimiser les points stop loss et take profit pour un meilleur ratio de risque-récompense
  • Trouver les paramètres optimaux pour les différents marchés
  • Ajouter un ajustement dynamique des paramètres basé sur les conditions du marché en direct
  • Tester différentes combinaisons d'indicateurs de confirmation
  • Optimisation continue pour assurer la robustesse de la stratégie

Conclusion

La stratégie de suivi de tendance du double canal ATR combine des moyennes mobiles, des canaux ATR et de multiples indicateurs techniques pour négocier dans la direction de la tendance une fois établie. Par rapport aux stratégies à indicateur unique, elle peut grandement améliorer la qualité du signal et le taux de gain. Les mécanismes de stop-loss et de prise de profit contrôlent également le risque. Grâce à l'optimisation des paramètres et aux tests combinatoires, cette stratégie a le potentiel d'obtenir des bénéfices stables. Mais sa dépendance aux données historiques est une préoccupation et les performances en direct nécessitent une vérification supplémentaire.


/*backtest
start: 2023-10-24 00:00:00
end: 2023-10-27 00:00:00
period: 15m
basePeriod: 5m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
// strategy(title="NoNonsense Forex", overlay=true, default_qty_value=100000, initial_capital=100)

//////////////////////
////// BASELINE //////
//////////////////////
ma_slow_type = input(title="Baseline Type", type=input.string, defval="Kijun", options=["ALMA", "EMA", "DEMA", "TEMA", "WMA", "VWMA", "SMA", "SMMA", "HMA", "LSMA", "Kijun", "McGinley"])
ma_slow_src = close //input(title="MA Source", type=input.source, defval=close)
ma_slow_len = input(title="Baseline Length", type=input.integer, defval=20)
ma_slow_len_fast = input(title="Baseline Length Fast", type=input.integer, defval=12)

lsma_offset  = input(defval=0, title="* Least Squares (LSMA) Only - Offset Value", minval=0)
alma_offset  = input(defval=0.85, title="* Arnaud Legoux (ALMA) Only - Offset Value", minval=0, step=0.01)
alma_sigma   = input(defval=6, title="* Arnaud Legoux (ALMA) Only - Sigma Value", minval=0)

ma(type, src, len) =>
    float result = 0
    if type=="SMA" // Simple
        result := sma(src, len)
    if type=="EMA" // Exponential
        result := ema(src, len)
    if type=="DEMA" // Double Exponential
        e = ema(src, len)
        result := 2 * e - ema(e, len)
    if type=="TEMA" // Triple Exponential
        e = ema(src, len)
        result := 3 * (e - ema(e, len)) + ema(ema(e, len), len)
    if type=="WMA" // Weighted
        result := wma(src, len)
    if type=="VWMA" // Volume Weighted
        result := vwma(src, len) 
    if type=="SMMA" // Smoothed
        w = wma(src, len)
        result := na(w[1]) ? sma(src, len) : (w[1] * (len - 1) + src) / len
    if type=="HMA" // Hull
        result := wma(2 * wma(src, len / 2) - wma(src, len), round(sqrt(len)))
    if type=="LSMA" // Least Squares
        result := linreg(src, len, lsma_offset)
    if type=="ALMA" // Arnaud Legoux
        result := alma(src, len, alma_offset, alma_sigma)
    if type=="Kijun" //Kijun-sen
        kijun = avg(lowest(len), highest(len))
        result :=kijun
    if type=="McGinley"
        mg = 0.0
        mg := na(mg[1]) ? ema(src, len) : mg[1] + (src - mg[1]) / (len * pow(src/mg[1], 4))
        result :=mg
    result

baseline = ma(ma_slow_type, ma_slow_src, ma_slow_len)
plot(baseline, title='Baseline', color=rising(baseline,1) ? color.green : falling(baseline,1) ? color.maroon : na, linewidth=3)

//////////////////
////// ATR ///////
//////////////////
atrlength=input(14, title="ATR Length")
one_atr=rma(tr(true), atrlength)
upper_atr_band=baseline+one_atr
lower_atr_band=baseline-one_atr
plot(upper_atr_band, color=color.gray, style=plot.style_areabr, transp=95, histbase=50000, title='ATR Cave')
plot(lower_atr_band, color=color.gray, style=plot.style_areabr, transp=95, histbase=0, title='ATR Cave')
plot(upper_atr_band, color=close>upper_atr_band ? color.fuchsia : na, style=plot.style_line, linewidth=5, transp=50, title='Close above ATR cave')
plot(lower_atr_band, color=close<lower_atr_band ? color.fuchsia : na, style=plot.style_line, linewidth=5, transp=50, title='Close below ATR cave')
donttradeoutside_atrcave=input(true)
too_high = close>upper_atr_band and donttradeoutside_atrcave
too_low = close<lower_atr_band and donttradeoutside_atrcave

////////////////////////////
////// CONFIRMATION 1 ////// the trigger actually
////////////////////////////
lenaroon = input(8, minval=1, title="Length Aroon")
c1upper = 100 * (highestbars(high, lenaroon+1) + lenaroon)/lenaroon
c1lower = 100 * (lowestbars(low, lenaroon+1) + lenaroon)/lenaroon
c1CrossUp=crossover(c1upper,c1lower)
c1CrossDown=crossunder(c1upper,c1lower)


////////////////////////////////
////// CONFIRMATION: MACD //////
////////////////////////////////
dont_use_macd=input(false)
macd_fast_length = input(title="Fast Length", type=input.integer, defval=13)
macd_slow_length = input(title="Slow Length", type=input.integer, defval=26)
macd_signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9)
macd_fast_ma = ema(close, macd_fast_length)
macd_slow_ma = ema(close, macd_slow_length)
macd = macd_fast_ma - macd_slow_ma
macd_signal = ema(macd, macd_signal_length)
macd_hist = macd - macd_signal

macdLong=macd_hist>0 or dont_use_macd
macdShort=macd_hist<0 or dont_use_macd

/////////////////////////////
///// CONFIRMATION: RSI /////
/////////////////////////////
dont_use_rsi=input(false)
lenrsi = input(14, minval=1, title="RSI Length") //14
up = rma(max(change(close), 0), lenrsi)
down = rma(-min(change(close), 0), lenrsi)
rsi = down == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up / down))
rsiLong=rsi>50 or dont_use_rsi
rsiShort=rsi<50 or dont_use_rsi

//////////////////////////////
///// CONFIRMATION: PSAR /////
//////////////////////////////
dont_use_psar=input(false)
psar_start = input(0.03, step=0.01)
psar_increment = input(0.018, step=0.001)
psar_maximum = input(0.11, step=0.01) //default 0.08
psar = sar(psar_start, psar_increment, psar_maximum)

plot(psar, style=plot.style_cross, color=color.blue, title='PSAR')
psarLong=close>psar or dont_use_psar
psarShort=close<psar or dont_use_psar

/////////////////////////
///// CONFIRMATIONS /////
/////////////////////////
Long_Confirmations=psarLong and rsiLong and macdLong
Short_Confirmations=psarShort and rsiShort and macdShort

GoLong=c1CrossUp and Long_Confirmations and not too_high
GoShort=c1CrossDown and Short_Confirmations and not too_low

////////////////////
///// STRATEGY /////
////////////////////

use_exit=input(false)
KillLong=c1CrossDown and use_exit
KillShort=c1CrossUp and use_exit

SL=input(0.5, step=0.1)/syminfo.mintick
TP=input(0.005, step=0.001)/syminfo.mintick

strategy.entry("nnL", strategy.long, when = GoLong)
strategy.entry("nnS", strategy.short, when = GoShort)
strategy.exit("XL-nn", from_entry = "nnL", loss = SL, profit=TP)
strategy.exit("XS-nn", from_entry = "nnS", loss = SL, profit=TP)
strategy.close("nnL", when = KillLong)
strategy.close("nnS", when = KillShort)



Plus de