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 base de cette stratégie est la suivante:
Paramètres d'entrée: période MA plus rapide maLen1, période MA plus lente maLen2, type MA maTypeChoice
Calculer une MA maValue1 plus rapide et une MA maValue2 plus lente en fonction des paramètres d'entrée
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
Exécuter des transactions à l'aide de signaux d'achat et de vente
Visualisez les MA dans différentes couleurs en fonction de leur relation
Envoyer des signaux d'alerte d'achat et de vente
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 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
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
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 )