Stratégie de tendance haussière persistante à double moyenne mobile croisée

Auteur:ChaoZhang est là., Date: 2023-11-13 à 10h47
Les étiquettes:

img

Résumé

Il s'agit d'une stratégie de trading qui utilise des modèles de croisement moyen mobile avec une tendance haussière persistante pour entrer dans les transactions. Lorsque le MA rapide franchit le niveau supérieur du MA lent, un signal de croisement doré est généré. Si la tendance haussière persiste après le croisement, une position longue peut être ouverte. Lorsque le prix atteint le niveau de stop loss ou de profit, la position peut être fermée pour un stop loss ou un profit.

La logique de la stratégie

La stratégie est principalement basée sur le croisement de la moyenne mobile pour les signaux d'entrée. Plus précisément, un MA rapide (MA1) et un MA lent (MA2) sont définis.

Pour éviter les faux signaux des croisements à court terme, un seuil d'angle est ajouté, de sorte qu'un signal d'achat n'est déclenché que lorsque l'angle MA2 est au-dessus d'un seuil défini.

La stratégie définit également un stop loss et un take profit. Le stop loss évite les pertes en cas d'inversion soudaine du marché, tandis que le take profit bloque les bénéfices. Ils sont définis en pourcentage du prix d'entrée.

Lorsque le prix s'élève pour prendre un point de profit, la stratégie fermera une position longue pour prendre un profit.

Analyse des avantages

Il s'agit d'une stratégie de tendance simple et intuitive.

  1. La combinaison MA filtre le bruit du marché et se ferme dans la direction de la tendance
  2. Le seuil d'angle évite d'être induit en erreur par les oscillations à court terme
  3. Les échanges bidirectionnels permettent de tirer profit des marchés à plage
  4. Résultats des opérations de gestion des risques

Analyse des risques

Il y a quelques risques à noter:

  1. Les MAs présentent un retard et peuvent manquer des points tournants
  2. Le stop-loss n'est pas garanti, il peut être réduit sur les marchés rapides.
  3. Le trading à double tranche double le risque, le timing de l'entrée courte est essentiel.
  4. Un mauvais réglage des paramètres comme les périodes de MA peut affecter les résultats

Les domaines d'amélioration

Quelques moyens d'optimiser davantage la stratégie:

  1. Ajouter des filtres de tendance comme MACD, Bollinger pour améliorer la précision
  2. Utiliser l'apprentissage automatique pour optimiser dynamiquement les périodes de MA
  3. Optimiser les paramètres de stop-loss et de prise de bénéfices, par exemple les trailing stops
  4. Ajouter la dimension de position pour limiter les pertes
  5. Indiquer la force de la tendance avec ADX à la position de réversion moyenne de la taille

Conclusion

Dans l'ensemble, il s'agit d'une tendance simple et pratique suivant la stratégie. Il a des avantages mais aussi des risques. Des raffinements supplémentaires tels que l'ajustement des paramètres, des indicateurs optimaux, des paramètres de stop loss, etc. peuvent l'améliorer. Mais aucune stratégie n'élimine complètement le risque systémique. La gestion des risques est la clé d'un trading prudent.


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

//written by markjames12210@gmail.com
//@version=5
strategy(title="MJ-Dual Moving Average",initial_capital=10000,overlay=false)

// import TradingView/ZigZag/6 as ZigZagLib 

// // Create Zig Zag instance from user settings.
// var zigZag = ZigZagLib.newInstance(
//   ZigZagLib.Settings.new(
//       input.float(5.0, "Price deviation for reversals (%)", 0.00001, 100.0, 0.5, "0.00001 - 100"),
//       input.int(10, "Pivot legs", 2),
//       input(#2962FF, "Line color"),
//       input(true, "Extend to last bar"),
//       input(true, "Display reversal price"),
//       input(true, "Display cumulative volume"),
//       input(true, "Display reversal price change", inline = "priceRev"),
//       input.string("Absolute", "", ["Absolute", "Percent"], inline = "priceRev"),
//       true)
//  )

// // Update 'zigZag' object on each bar with new ​pivots, ​volume, lines, labels.
// zigZag.update()
// // plot(zigZag.pivots, "zigZag")

ma1= ta.sma(close,8)
ma2= ta.sma(close,21)

angleCriteria = input.int(title="Angle", defval=7, minval=1, maxval=13)

i_lookback   = input.int(2,     "Angle Period", minval = 1)
i_atrPeriod  = input.int(10,    "ATR Period",   minval = 1)
i_angleLevel = input.int(6,     "Angle Level",  minval = 1)
i_maSource   = input.source(close, "MA Source")
TP = input.float(1, "TP", minval = 0.1)
SL = input.float(1, "SL", minval = 0.1)

f_angle(_src, _lookback, _atrPeriod) =>
    rad2degree = 180 / 3.141592653589793238462643  //pi 
    ang = rad2degree * math.atan((_src[0] - _src[_lookback]) / ta.atr(_atrPeriod)/_lookback)
    ang
_angle = f_angle(ma2, i_lookback, i_atrPeriod)
plot(ta.atr(i_atrPeriod), "atr")
// plot(ma1,color=#FF0000)
// plot(ma2,color=#00FF00)

crosso=ta.crossover(ma1,ma2) 
crossu=ta.crossunder(ma1,ma2)

_lookback = 15

f_somethingHappened(_cond, _lookback) =>
    bool _crossed = false
    for i = 1 to _lookback
        if _cond[i]
            _crossed := true
    _crossed
    
longcrossed = f_somethingHappened(crosso,_lookback)
shortcrossed = f_somethingHappened(crossu,_lookback)

atr_factor = 1
atr = ta.atr(i_atrPeriod)
e = atr * atr_factor 

afr = close 
afr := nz(afr[1], afr)

atr_factoryHigh = close + e
atr_factoryLow = close - e 

if atr_factoryLow > afr 
    afr := atr_factoryLow
if atr_factoryHigh < afr 
    afr := atr_factoryHigh

// plot(afr, "afr", display = display.data_window)
// plot(atr_factoryHigh, "afr", color = color.yellow, display = display.all)
// plot(atr_factoryLow, "afr", color = color.green, display = display.all)


inLong() => strategy.position_size > 0
inShort() => strategy.position_size < 0
inZero() => not inLong() and not inShort()

long = longcrossed and _angle > angleCriteria
short= shortcrossed and _angle < -(angleCriteria)

plotshape(long, "Buy", shape.arrowup, location.belowbar, color = #FF0000)
plotshape(short, "Sell", shape.arrowdown, location.abovebar, color = #00FF00)

var longTp = 0.0
var longSl = 0.0
var shortTp = 0.0
var shortSl = 0.0
[b_middle, b_high, b_low] = ta.bb(close, 20, 2)
entry_price = strategy.opentrades.entry_price(0)

if inZero()
    if short
        longTp := close * (1 + TP/100)
        longSl := close * (1 - SL/100)
        strategy.entry("LONG",strategy.long, comment = "tp:" + str.tostring(longTp) + " sl:" + str.tostring(longSl))
    if long
        shortTp := close * (1 - TP/100)
        shortSl := close * (1 + SL/100)
        strategy.entry("SHORT",strategy.short, comment = "tp:" + str.tostring(shortTp) + " sl:" + str.tostring(shortSl))

if inLong()
    // if close - entry_price > close * 0.005
    //     longSl := entry_price + close * 0.001
    if high > longTp
        strategy.close("LONG")
        if (close - open) > close * 0.014
            shortTp := close * (1 - TP/100)
            shortSl := close * (1 + SL/100)
            strategy.entry("SHORT",strategy.short, comment = "tp:" + str.tostring(shortTp) + " sl:" + str.tostring(shortSl))

    if close < longSl
        strategy.close("LONG")
    if open >= b_high and close >= b_high
        strategy.close("LONG")
    // if high > b_high and entry_price < high
    //     strategy.close("LONG")


if inShort()
    // if entry_price - close > close * 0.005
    //     shortSl := entry_price - close * 0.001
    if low < shortTp
        strategy.close("SHORT")
        if (open - close) > close * 0.014
            longTp := close * (1 + TP/100)
            longSl := close * (1 - SL/100)
            strategy.entry("LONG",strategy.long, comment = "tp:" + str.tostring(longTp) + " sl:" + str.tostring(longSl))


    if close > shortSl
        strategy.close("SHORT")
    if open < b_low and close < b_low
        strategy.close("SHORT")
    // if low < b_low and entry_price > low
    //     strategy.close("SHORT")

Plus de