Stratégie de croisement à double moyenne mobile

Auteur:ChaoZhang est là., Date: 2023-11-16 17h50 et 52 min
Les étiquettes:

img

Résumé

La stratégie de croisement des moyennes mobiles doubles juge la direction de la tendance des prix en calculant les moyennes mobiles de différentes périodes et réalise la tendance suivante.

La logique de la stratégie

Cette stratégie est basée sur des moyennes mobiles exponentielles (EMA) de 9, 21 et 50 périodes.

Lorsque l'EMA à 9 périodes traverse l'EMA à 21 périodes, il indique une tendance haussière à court terme, donc une tendance longue.

La logique d'entrée longue/courte, de prise de profit et d'arrêt de perte est configurée. La condition d'entrée est le croisement des MAs. Le profit de prise de long est le prix d'entrée * (1 + ratio de prise de profit d'entrée), le profit de prise de court est le prix d'entrée * (1 - ratio de prise de profit d'entrée). Le stop-loss long est le prix d'entrée * (1 - ratio de stop-loss d'entrée), le stop-loss court est le prix d'entrée * (1 + ratio de stop-loss d'entrée).

Certains filtres sont également ajoutés, comme le filtre de tendance pour éviter les déviations latérales et le filtre d'équité pour éviter les transactions lorsque l'équité de la stratégie est trop faible.

En résumé, cette stratégie utilise des doubles croisements EMA pour déterminer la direction de la tendance des prix, avec une logique de prise de profit et de stop-loss appropriée, qui peut capturer les tendances à moyen et long terme.

Analyse des avantages

  • L'utilisation de doubles croisements MA pour déterminer la direction de la tendance, la logique est simple et facile à comprendre.

  • L'adoption des EMA de périodes différentes permet de juger des tendances à court et à long terme.

  • La logique du profit et du stop-loss maintient le profit et contrôle le risque.

  • Les filtres permettent d'éviter certains faux signaux dans une certaine mesure.

  • Les paramètres peuvent être librement configurés, les périodes peuvent être optimisées pour différents environnements de marché.

Analyse des risques

  • En tant que stratégie à facteur unique, les signaux de trading peuvent ne pas être suffisamment stables.

  • Lorsqu'un croisement se produit, le prix peut avoir déjà augmenté ou diminué, avec un risque d'achat élevé et de vente faible.

  • Les coûts de négociation ne sont pas pris en compte, les rendements réels pourraient être inférieurs.

  • Aucun stop loss en place, risque de perte illimitée dans des conditions de marché extrêmes.

Les solutions:

  1. Optimiser les périodes de MA pour des signaux plus stables.

  2. Ajouter d'autres indicateurs aux signaux filtrés.

  3. Augmenter la taille des échanges pour réduire l'impact sur les coûts.

  4. Définir un stop-loss approprié pour limiter la perte maximale.

Directions d'optimisation

La stratégie peut être optimisée dans les aspects suivants:

  1. Optimiser les périodes de MA pour trouver les meilleures combinaisons, ou utiliser l'optimisation adaptative pour sélectionner dynamiquement les meilleures périodes.

  2. Ajoutez d'autres indicateurs techniques tels que MACD, KD, etc. pour filtrer les signaux et améliorer la qualité, ou utilisez l'apprentissage automatique pour noter les signaux et filtrer les faux.

  3. Incorporer l'analyse du volume. Ne prenez pas le signal si le volume est insuffisant sur le croisement MA.

  4. Vérifiez les fluctuations de prix avant que le croisement ne se produise.

  5. Mettre en place des mécanismes de stop loss dynamiques tels que le stop loss à la traîne, le Chandelier Exit, etc., afin de réduire la distance de stop loss mais de la maintenir efficace.

  6. Optimiser la taille des positions comme fixe/dynamique/effet de levier, afin d'obtenir des ratios bénéfice/perte plus raisonnables.

  7. Considérez de manière exhaustive les coûts de négociation, le glissement, optimiser les ratios profit/stop loss pour assurer la rentabilité dans le trading en direct.

Conclusion

La structure globale de cette stratégie est solide, avec une logique simple de double croisement EMA pour déterminer la direction de la tendance, couplée à une logique de prise de profit et d'arrêt de perte pour capturer les tendances. En tant que stratégie à facteur unique, elle peut être optimisée sur les paramètres, les filtres de signal, etc. pour la rendre plus robuste. Avec un stop-loss et un dimensionnement de position appropriés, les risques peuvent être encore réduits. Dans l'ensemble, elle fournit une tendance solide en suivant le cadre de la stratégie, qui peut réaliser des profits cohérents après des optimisations et des ajustements.


/*backtest
start: 2023-10-16 00:00:00
end: 2023-11-15 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © TradingMentalist

//@version=4
strategy("Initial template",initial_capital=1000, overlay=true, pyramiding=0, commission_type=strategy.commission.percent, commission_value=0.04, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, currency = currency.USD)

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////inputs
//turn on/off longs/shorts / extraneous conditions
longinc=input(true, title="include longs?")
lConSw2=input(true, title="condition two?")
lConSw3=input(true, title="condition three?")
shotinc=input(true, title="include shorts?")
sConSw2=input(true, title="condition two?")
sConSw3=input(true, title="condition three?")

//turn on/off / adjust trade filters (average range/average equity)
sidein2     = input(200, step=10, title='lookback for average range (bars)')
sidein      = input(1, title='filter trades if range is less than (%)')/100
equityIn    = input(40, title='filter trades if equity is below ema()')
sidewayssw  = input(true, title='sideways filter?')
equitysw    = input(true, title='equity filter?')
longtpin    = input(1,step=0.1, title='long TP %')/100
longslin    = input(0.4,step=0.1, title='long SL %')/100
shorttpin   = input(1,step=0.1, title='short TP %')/100
shortslin   = input(0.4,step=0.1, title='short SL %')/100

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////filters
//(leave as is)
side1       = (close[1] + close[sidein2]) / 2
side2       = close[1] - close[sidein2] 
side3       = side2 / side1
notsideways = side3 > sidein
equityMa    = equitysw ? ema(strategy.equity, equityIn) : 0
equityCon   = strategy.equity >= equityMa

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////indicators
ma1 = ema(close, 9)
ma2 = ema(close, 21)
ma3 = ema(close, 50)

plot(ma1, color=color.new(#E8B6B0,50))
plot(ma2, color=color.new(#B0E8BE,50))
plot(ma3, color=color.new(#00EEFF,50))

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////conditions
//adjust conditions
//-------------------------------------------
longCondition1  = crossover(ma2,ma3)
longCondition2  = close[5] > close[10]
longCondition3  = close[1] > close[2]

shortCondition1 = crossover(ma3,ma2)
shortCondition2 = close[5] < close[10]
shortCondition3 = close[1] < close[2]

closelong       = shortCondition1
closeshort      = longCondition1
//-------------------------------------------

//(leave as is)
longCondition1in  = longCondition1
longCondition2in  = lConSw2 ? longCondition2 : true
longCondition3in  = lConSw3 ? longCondition3 : true
shortCondition1in = shortCondition1
shortCondition2in = sConSw2 ? shortCondition2: true
shortCondition3in = sConSw3 ? shortCondition3: true
longConditions    = longCondition1in and longCondition2in and longCondition3in
shortConditions   = shortCondition1in and shortCondition2in and shortCondition3in

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////execution
//(leave as is)
long            = sidewayssw ? notsideways and equityCon and longConditions : equityCon and longConditions
short           = sidewayssw ? notsideways and equityCon and shortConditions : equityCon and shortConditions

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////risk
//(leave as is)
longtplevel     = strategy.position_avg_price * (1 + longtpin)
longsllevel     = strategy.position_avg_price * (1 - longslin)
shorttplevel    = strategy.position_avg_price * (1 - shorttpin)
shortsllevel    = strategy.position_avg_price * (1 + shortslin)

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////timeframe
//adjust timeframe
//-------------------------------------------
startyear   = 2000
startmonth  = 1
startday    = 1

stopyear    = 9999
stopmonth   = 12
stopday     = 31
//-------------------------------------------

//(leave as is)
startperiod = timestamp(startyear,startmonth,startday,0,0)
periodstop  = timestamp(stopyear,stopmonth,stopday,0,0)
timeframe()    =>
    time >= startperiod and time <= periodstop ? true : false

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////orders
//comments are empty characters for clear chart
if timeframe()
    if longinc
        if strategy.position_size == 0 or strategy.position_size > 0 
            strategy.entry(id="long", long=true, when=long, comment=" ")
            strategy.exit("stop","long", limit=longtplevel, stop=longsllevel,comment=" ")
            strategy.close(id="long", when=closelong, comment = " ")
    if shotinc
        if strategy.position_size == 0 or strategy.position_size < 0 
            strategy.entry(id="short", long=false, when=short, comment = " ")
            strategy.exit("stop","short", limit=shorttplevel, stop=shortsllevel,comment = " ")
            strategy.close(id="short", when=closeshort, comment = " ")

Plus de