Stratégie de trading croisée à double moyenne mobile


Date de création: 2023-10-13 15:40:49 Dernière modification: 2023-10-13 15:40:49
Copier: 0 Nombre de clics: 449
1
Suivre
1235
Abonnés

Aperçu

Stratégie de négociation de croisement de deux lignes équivalentes en calculant une ligne équivalente avec deux paramètres différents et en effectuant des opérations d’achat et de vente à travers la croix de la ligne équivalente. Cette stratégie est simple et directe et convient aux transactions à court et moyen terme.

Principe de stratégie

La stratégie consiste à calculer les moyennes rapides et les moyennes lentes en entrant des paramètres tels que la période de la moyenne rapide, la période de la moyenne lente et le type de la moyenne. L’opération d’achat est effectuée lorsque la moyenne rapide traverse la moyenne lente sur la moyenne rapide et l’opération de vente lorsque la moyenne lente traverse la moyenne rapide en dessous.

La logique de cette stratégie est la suivante:

  1. Paramètres d’entrée: période moyenne rapide maLen1, période moyenne lente maLen2, type moyenne maTypeChoice

  2. Calcul de la moyenne rapide maValue1 et moyenne lente maValue2 en fonction des paramètres d’entrée

  3. Comparer deux lignes de grandeur équivalentes pour définir les conditions d’achat et de vente:

    • Conditions de l’achat: maValue1 est porté avec maValue2

    • Conditions de vente: maValue1 avec maValue2

  4. Opération de transaction au moment où les conditions d’achat et de vente sont réunies

  5. Affichage visuel de l’équilibre et de la relation entre la taille de l’équilibre avec différentes couleurs

  6. Envoyer des signaux d’achat et de vente

Avantages stratégiques

  • Utilisez le principe de la croix biuniversale pour éviter d’être induit en erreur par une seule oscillation universale

  • Les paramètres de la ligne moyenne sont réglables pour s’adapter à différents cycles

  • La logique des transactions est simple, directe et facile à comprendre.

  • Les signaux d’achat et de vente personnalisables vous permettent de connaître le moment de la transaction.

  • Visualisation des mouvements de la courbe moyenne pour former un indicateur de négociation intuitif

  • Optimisation des paramètres pour trouver la meilleure combinaison de paramètres

  • Peut être utilisé pour la rétro-analyse pour trouver des paramètres optimaux ou pour les transactions sur disque dur

Risque stratégique

  • Le croisement de l’équilibre est susceptible de générer de faux signaux et doit être jugé en fonction des tendances et des formes.

  • Les positions fréquentes peuvent entraîner des pertes de frais de transaction en cas d’oscillation de la courbe

  • Des paramètres incorrects peuvent entraîner des transactions trop ou peu fréquentes

  • Les événements imprévus peuvent entraîner des situations extrêmes qui ne peuvent être évitées.

  • L’indicateur de courte période peut être désactivé lors d’une rupture du grand cycle

  • Il faut une surveillance fréquente, pas automatique

Comment gérer les risques:

  • Les indicateurs de tendance peuvent être combinés pour éviter les chocs.

  • Combiné avec des indicateurs de forme, confirme l’efficacité du signal

  • Optimisation des paramètres pour une fréquence de transaction raisonnable

  • Réglez le point d’arrêt pour contrôler les pertes individuelles

  • Vérifier la stabilité des paramètres sur plusieurs périodes

  • Filtrage du temps ou des signaux pour éviter les fausses percées

Orientation de l’optimisation de la stratégie

  • Tester différents paramètres de moyenne pour trouver le paramètre optimal

  • Tester différents types de moyenne et choisir la moyenne qui produit le signal le plus précis

  • Combiner les indicateurs de tendance pour éviter les écarts de tendance

  • Le meilleur moment pour jouer, combiné à des indicateurs de volatilité

  • Ajouter des filtres de temps ou de signal pour réduire les signaux erronés

  • Configurer le contrôle des points de glissement pour optimiser l’effet de la transaction sur le disque dur

  • Stabilité vérifiée sur plusieurs cycles

  • Adhésion à une stratégie de stop-loss automatique

  • Des technologies telles que l’apprentissage automatique pour améliorer les résultats de la détection

Résumer

La stratégie de double équilibre est une stratégie d’indicateur technique très typique. Elle utilise le principe de la croix équilibre rapide et lente pour générer des signaux de négociation, qui peuvent obtenir de bons résultats de retracement grâce à l’optimisation des paramètres. Mais la stratégie comporte également un certain risque, qui doit être vérifié avec d’autres indicateurs techniques tels que la tendance, la forme, etc., afin de réduire le taux de signaux erronés.

Code source de la stratégie
/*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 )