Stratégie de négociation croisée de la moyenne mobile double

Auteur:ChaoZhang est là., Date: 2023-10-13 15:40:49 Je suis désolé
Les étiquettes:

Résumé

La stratégie de négociation croisée de la moyenne mobile double génère des signaux de négociation en calculant deux moyennes mobiles avec des paramètres différents et en négociant lorsque les moyennes mobiles se croisent.

La logique de la stratégie

La logique de base de cette stratégie est la suivante:

  1. Paramètres d'entrée: période MA plus rapide maLen1, période MA plus lente maLen2, type MA maTypeChoice

  2. Calculer une MA maValue1 plus rapide et une MA maValue2 plus lente en fonction des paramètres d'entrée

  3. Définir les conditions d'achat et de vente en comparant les deux MA:

    • Acheter lorsque maValue1 dépasse maValue2

    • Vendre lorsque maValue1 dépasse maValue2

  4. Exécuter des transactions à l'aide de signaux d'achat et de vente

  5. Visualisez les MA dans différentes couleurs en fonction de leur relation

  6. Envoyer des signaux d'alerte d'achat et de vente

Les avantages

  • Utilise un système de croisement double MA, évitant les faux signaux d'une seule MA

  • Périodes de MA personnalisables adaptées aux différents horizons de négociation

  • Logique simple et directe, facile à comprendre et à mettre en œuvre

  • Signaux d'alerte personnalisables pour une exécution rapide

  • Les tendances de MA visualisées forment un indicateur de trading intuitif

  • Paramètres optimisés pour trouver la meilleure combinaison

  • Applicable aux tests antérieurs et aux opérations en direct

Les risques

  • Les croisements MA peuvent générer de faux signaux, nécessitant une confirmation de tendance et de modèle supplémentaire

  • Les problèmes liés à l'intersection de l'AM entraînent des coûts commerciaux inutiles

  • Les paramètres incorrects conduisent à une sur-échange ou à une échange rare

  • Les événements extrêmes provoquent d'énormes fluctuations de prix, incapables de limiter les pertes

  • Les ruptures de tendance à long terme invalident les indicateurs à court terme

  • Requiert une surveillance fréquente, pas entièrement automatisée

Gestion des risques:

  • Ajouter un filtre de tendance pour éviter les transactions contre tendance

  • Ajouter un filtre de modèle pour confirmer la validité du signal

  • Optimiser les paramètres pour une fréquence de négociation raisonnable

  • Définir un stop-loss/un profit pour limiter les pertes

  • Test de robustesse sur de longues périodes

  • Filtres de prix et de temps pour éviter les fausses fuites

Directions d'optimisation

  • Testez différents paramètres MA pour trouver le paramètre optimal

  • Testez différents types de MA pour obtenir les signaux les plus précis

  • Ajouter un filtre de tendance pour éviter les transactions contre-tendance

  • Ajouter un filtre de volatilité pour identifier les points de sortie appropriés

  • Ajouter un filtre prix/temps pour réduire les faux signaux

  • Mettre en œuvre un contrôle du glissement pour les transactions réelles

  • Test de robustesse sur tous les instruments et sur toutes les périodes

  • Intégrer la perte d'arrêt automatique/prendre profit

  • Explorer l'apprentissage automatique pour améliorer la stratégie

Conclusion

Le double croisement de moyenne mobile est une stratégie d'indicateur technique classique. Il génère des signaux à partir des croisements MA et peut produire de bons résultats de backtest grâce à l'optimisation. Cependant, des risques tels que de faux signaux demeurent, nécessitant des filtres supplémentaires. Le trading réel a également besoin de détails d'exécution tels que le contrôle du glissement. Dans l'ensemble, la stratégie convient au trading à moyen terme en tant que choix simple et intuitif. Avec des améliorations continues et une validation de la robustesse, cette stratégie peut obtenir des rendements stables dans le trading en direct.


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

//@version=4
// © sehweijun
//study( title="Arch1tect's New Toy", shorttitle="Arch1tect's New Toy", overlay=true, resolution="")
// strategy( title="Arch1tect's New Toy (Strategy Tester Version)", shorttitle="Arch1tect's New Toy (Strategy Tester Version)", overlay=true, initial_capital = 100000, commission_value=0.07, commission_type=strategy.commission.cash_per_contract)

maTypeChoice = input( "EMA", title="MA Type", options=["EMA", "WMA", "SMA"] )
maSrc = input( close, title="MA Source" )
maLen1 = input( 15, minval=1, title="MA Length" )
maLen2 = input( 95, minval=1, title="MA Length" )

maValue1 = if ( maTypeChoice == "EMA" )
    ema( maSrc, maLen1 )
else if ( maTypeChoice == "WMA" )
    wma( maSrc, maLen1 )
else if ( maTypeChoice == "SMA" )
    sma( maSrc, maLen1 )
else
    0
    
maValue2 = if ( maTypeChoice == "EMA" )
    ema( maSrc, maLen2 )
else if ( maTypeChoice == "WMA" )
    wma( maSrc, maLen2 )
else if ( maTypeChoice == "SMA" )
    sma( maSrc, maLen2 )
else
    0

buySignal = crossover( maValue1, maValue2 )
sellSignal = crossunder( maValue1, maValue2 )

mainMAColour = ( maValue1 > maValue2 ) ? color.green : color.red 

plot( maValue1, title="Arch1tect's New Toy", color=mainMAColour, offset=0, linewidth=4 )
//plot( maValue2, title="Arch1tect's Filter", color=color.black, offset=0, linewidth=2 )

var color buyCandleColour = #00ff0a
var color sellCandleColour = #ff1100

barcolor( buySignal ? buyCandleColour : sellSignal ? sellCandleColour : na, title="Signal Bar Colour" )
bgcolor( color=buySignal ? buyCandleColour : sellSignal ? sellCandleColour : na, transp=85, title="Signal Background Colour")

alertcondition( buySignal or sellSignal, title="Signal change!", message="Signal change!")
alertcondition( buySignal, title="Buy signal!", message="Buy signal!")
alertcondition( sellSignal, title="Sell signal!", message="Sell signal!")

// Strategy Tester
stratTesterOn    = input( title="Strategy Tester [ON/OFF]", group="Strategy Tester", type=input.bool, defval=true)
entryTime        = input( "2200-1200", title = "Daily trading time session (in Exchange GMT)", group="Strategy Tester", type = input.session )
startTime        = input( "2200-2201", title = "Start Time", group="Strategy Tester", type = input.session )
maxDailyLoss     = input( 2500, title = "Max daily loss", group="Strategy Tester", type = input.integer )
maxTotalDrawdown = input( 12000, title = "Max daily loss", group="Strategy Tester", type = input.integer )
contractSize     = input( 1, title = "Contract size", group="Strategy Tester", type = input.integer )

tradeOnStartSess = input( title="First trade on session start [ON/OFF]", group="Strategy Tester", type=input.bool, defval=true)

fixedTPSL        = input( title="Fixed TP/SL PIPS [ON/OFF]", group="Strategy Tester", type=input.bool, defval=false)
fixedTPValue     = input ( 10.00, minval=0.01, type=input.float, title="TP", group="Strategy Tester" )
fixedSLValue     = input ( 10.00, minval=0.01, type=input.float, title="SL", group="Strategy Tester" )

fromDay          = input(defval = 1,    title = "From Day", group="Date Range", type = input.integer, minval = 1, maxval = 31)
fromMonth        = input(defval = 1,    title = "From Month", group="Date Range", type = input.integer, minval = 1, maxval = 12)
fromYear         = input(defval = 2020, title = "From Year", group="Date Range", type = input.integer, minval = 1970)
thruDay          = input(defval = 1,    title = "Thru Day", group="Date Range", type = input.integer, minval = 1, maxval = 31)
thruMonth        = input(defval = 1,    title = "Thru Month", group="Date Range", type = input.integer, minval = 1, maxval = 12)
thruYear         = input(defval = 2112, title = "Thru Year", group="Date Range", type = input.integer, minval = 1970)

start     = timestamp(fromYear, fromMonth, fromDay, 00, 00)        // backtest start window
finish    = timestamp(thruYear, thruMonth, thruDay, 23, 59)        // backtest finish window
window()  => time >= start and time <= finish ? true : false       // create function "within window of time"

// strategy.risk.max_intraday_loss( maxDailyLoss, strategy.cash )
// strategy.risk.max_drawdown( maxTotalDrawdown, strategy.cash )

isTime(_position) =>
    range = time( timeframe.period, _position + ':1234567' )
bgcolor( color=isTime( entryTime ) and stratTesterOn and window() ? color.yellow : na, title="Daily trading time session (in Exchange GMT)", transp=75 )

if ( stratTesterOn and window() )
    if ( buySignal and isTime( entryTime ) )
        if ( not fixedTPSL )
            strategy.close_all()
            strategy.entry( "Buy", strategy.long, contractSize )
        
        if ( fixedTPSL and strategy.position_size == 0 )
            strategy.entry( "Buy", strategy.long, contractSize )
            strategy.exit( "TP/SL", "Buy", stop=close[0]-fixedSLValue, limit=close[0]+fixedTPValue )
        
    if ( sellSignal and isTime( entryTime ))
        if ( not fixedTPSL )
            strategy.close_all()
            strategy.entry( "Sell", strategy.short, contractSize )
        
        if ( fixedTPSL and strategy.position_size == 0  )
            strategy.entry( "Sell", strategy.short, contractSize )
            strategy.exit( "TP/SL", "Sell", stop=close[0]+fixedSLValue, limit=close[0]-fixedTPValue )
    
    if ( isTime( startTime ) and tradeOnStartSess and strategy.position_size == 0 )
        if ( maValue1 > maValue2 )
            strategy.entry( "Buy", strategy.long, contractSize )
            
            if ( fixedTPSL )
                strategy.exit( "TP/SL", "Buy", stop=close[0]-fixedSLValue, limit=close[0]+fixedTPValue )
        else
            strategy.entry( "Sell", strategy.short, contractSize ) 
            
            if ( fixedTPSL )
                strategy.exit( "TP/SL", "Sell", stop=close[0]+fixedSLValue, limit=close[0]-fixedTPValue )
    
    strategy.close_all( when=not isTime( entryTime ) )

plot( strategy.equity )

Plus de