Stratégie de croisement des moyennes mobiles

Auteur:ChaoZhang est là., Date: le 10 octobre 2023 à 10 h 44 min 25 s
Les étiquettes:

Résumé

La stratégie de croisement des moyennes mobiles est une stratégie de négociation couramment utilisée basée sur des moyennes mobiles. Elle utilise le croisement d'une moyenne mobile plus rapide et d'une moyenne mobile plus lente comme signaux de négociation. Lorsque la moyenne mobile plus rapide traverse au-dessus de la moyenne mobile plus lente depuis le bas, c'est un signal d'achat. Lorsque la moyenne mobile plus rapide traverse au-dessous de la moyenne mobile plus lente depuis le haut, c'est un signal de vente. Cette stratégie utilise une moyenne mobile de 50 jours comme la moyenne mobile plus rapide et une moyenne mobile de 200 jours comme la moyenne mobile plus lente.

La logique de la stratégie

La logique de base de cette stratégie est basée sur la théorie des moyennes mobiles. Les moyennes mobiles peuvent effectivement assouplir les fluctuations des prix et indiquer les tendances des prix. Le MA plus rapide est plus sensible aux changements de prix et peut capturer les points d'inversion de tendance. Le MA plus lent est moins sensible aux changements de prix et peut filtrer les fluctuations à court terme. Lorsque le MA plus rapide dépasse le MA plus lent, cela indique une tendance haussière des prix. Lorsque le MA plus rapide dépasse le MA plus lent, cela indique une tendance à la baisse des prix.

Plus précisément, cette stratégie définit d'abord le MA de 50 jours et le MA de 200 jours. La condition d'entrée longue est définie lorsque le MA plus rapide traverse le MA plus lent. La condition d'entrée courte est définie lorsque le MA plus rapide traverse le MA plus lent. Pour éviter les opérations qui se chevauchent, la stratégie utilise les drapeaux isEntry et isExit pour le contrôle. Lorsque la condition d'entrée est remplie, isEntry est définie sur true. Lorsque la condition de sortie est remplie, isExit est définie sur true. Une position longue ne sera ouverte que lorsque isEntry est faux et qu'un signal d'achat apparaît. Une position courte ne sera ouverte que lorsque isExit est faux et qu'un signal de vente apparaît.

En outre, la stratégie définit également les niveaux de prise de profit et de stop-loss. Les utilisateurs peuvent définir la distance en pourcentage TP / SL à travers les entrées. Les prix TP et SL seront calculés en fonction du pourcentage du prix d'entrée. Lorsque la taille de la position est supérieure à 0, TP et SL seront exécutés en fonction du pourcentage long TP / SL. Lorsque la taille de la position est inférieure à 0, TP et SL seront basés sur le pourcentage court TP / SL.

Analyse des avantages

Les avantages de cette stratégie sont les suivants:

  1. Simple à mettre en œuvre, il négocie uniquement sur la base de croisements MA, adapté aux débutants sans expérience de trading.

  2. Les moyennes mobiles peuvent filtrer les fluctuations à court terme et éviter d'être arrêtées.

  3. Les utilisateurs peuvent optimiser des paramètres tels que les périodes MA et les niveaux TP/SL.

  4. Une visualisation claire. La stratégie trace sur le graphique les principaux MA, les entrées et les niveaux TP/SL.

  5. La structure de la stratégie est complète, de nouveaux signaux et indicateurs peuvent être ajoutés pour l'améliorer.

Analyse des risques

Les risques de cette stratégie comprennent:

  1. Incapacité d'arrêter les pertes lors d'événements de marché extrêmes, entraînant un retrait énorme.

  2. Prédisposé à des baisses sur les marchés variés, causant des pertes consécutives.

  3. Les frais de négociation ne sont pas pris en compte, les frais et les décalages dans les transactions réelles auront une incidence significative sur la rentabilité.

  4. Les conditions réelles du marché sont complexes et les résultats des tests antérieurs peuvent ne pas représenter les performances en direct.

Les solutions sont les suivantes:

  1. Utilisez un stop loss plus large ou ajoutez un stop loss de rupture supplémentaire.

  2. Élargir la distance MA, réduire la fréquence des échanges ou ajouter d'autres filtres.

  3. Prenez en compte les coûts de négociation réels, fixez un objectif de profit plus large.

  4. Optimiser progressivement les paramètres et réduire les surajustements en tenant compte des conditions changeantes du marché.

Directions d'optimisation

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

  1. Testez différentes combinaisons de paramètres pour trouver les paramètres optimaux, comme les périodes de MA.

  2. Ajoutez d'autres indicateurs comme filtres pour éviter les sauts de marée, tels que le MACD, le KD, etc.

  3. Optimiser la stratégie de stop loss pour une meilleure gestion des risques, comme le stop loss de trailing.

  4. Augmenter la taille de la position avec un effet de levier pour augmenter les bénéfices tout en contrôlant les risques.

  5. Considérez les coûts de négociation, optimiser les paramètres pour le trading en direct.

  6. Évaluer la stabilité des paramètres à l'aide de méthodes statistiques pour réduire le surmonté.

Conclusion

En conclusion, cette stratégie de croisement MA a une logique claire et est simple à mettre en œuvre, adaptée comme stratégie d'introduction au trading alg. Mais elle comporte également des risques et des limitations. Une optimisation minutieuse des paramètres et des filtres, ainsi qu'un contrôle des risques sont nécessaires pour réaliser des profits stables. Cette stratégie a une grande extensibilité pour les utilisateurs d'innover et d'optimiser en fonction de son propre style de trading.


/*backtest
start: 2023-10-02 00:00:00
end: 2023-10-09 00:00:00
period: 3m
basePeriod: 1m
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/
// © gjfsdrtytru

//@version=4
strategy("Backtest Engine", "Backtest", overlay=true, commission_type=strategy.commission.percent, commission_value=0.07, initial_capital = 1000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, currency = currency.USD)


// Start code here...
fastMA = sma(close,50)
slowMA = sma(close,200)

plot(fastMA, "Fast MA",  color.blue)
plot(slowMA, "Slow MA",  color.red)

// Long Enrty/Exit
longCondition = crossover(fastMA,slowMA)
closeLong = crossover(slowMA,fastMA)

// Short Enrty/Exit
shortCondition = crossover(slowMA,fastMA)
closeShort = crossover(fastMA,slowMA)


// Bot web-link alert - {{strategy.order.comment}}
botLONG = "ENTRY LONG ALERT"
botCLOSELONG = "CLOSE LONG ALERT"
botSHORT = "ENTRY SHORT ALERT"
botCLOSESHORT = "CLOSE SHORT ALERT"

//////////////////////////////////////////////////////////////////
//////////////////////// BACKTEST ENGINE \\\\\\\\\\\\\\\\\\\\\\\\\
/////////////////// [NO USER INPUT REQUIRED] /////////////////////
//////////////////////////////////////////////////////////////////

// Time period
testStartYear = input(2020, "Backtest Start Year")
testStartMonth = input(5, "Backtest Start Month")
testStartDay = input(11, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)

periodLength = input(3650, "Backtest Period (days)", minval=0,tooltip="Days until strategy ends") * 86400000 // convert days into UNIX time
testPeriodStop = testPeriodStart + periodLength

testPeriod() =>
    time >= testPeriodStart and time <= testPeriodStop ? true : false

// Convert Take profit and Stop loss to percentage
longTP = input(title="Long Take Profit (%)", type=input.float, minval=0.0, step=0.1, defval=0) * 0.01 // Set levels with input options
longSL = input(title="Long Stop Loss (%)", type=input.float, minval=0.0, step=0.1, defval=0) * 0.01 // Set levels with input options
shortTP = input(title="Short Take Profit (%)", type=input.float, minval=0.0, step=0.1, defval=0) * 0.01 // Set levels with input options
shortSL = input(title="Short Stop Loss (%)", type=input.float, minval=0.0, step=0.1, defval=0) * 0.01 // Set levels with input options

// 0% TP/SL = OFF (a value of 0 turns off TP/SL feature)
longProfitPerc = longTP == 0 ? 1000 : longTP
longStopPerc = longSL == 0 ? 1 : longSL
shortProfitPerc = shortTP == 0 ? 1 : shortTP
shortStopPerc = shortSL == 0 ? 1000 : shortSL

// Determine TP/SL price based on percentage given
longProfitPrice  = strategy.position_avg_price * (1 + longProfitPerc)
longStopPrice  = strategy.position_avg_price * (1 - longStopPerc)
shortProfitPrice  = strategy.position_avg_price * (1 - shortProfitPerc)
shortStopPrice  = strategy.position_avg_price * (1 + shortStopPerc)

// Anti-overlap
isEntry_Long = false
isEntry_Long := nz(isEntry_Long[1], false)
isExit_Long = false
isExit_Long := nz(isExit_Long[1], false)
isEntry_Short = false
isEntry_Short := nz(isEntry_Short[1], false)
isExit_Short = false
isExit_Short := nz(isExit_Short[1], false)

entryLong = not isEntry_Long and longCondition
exitLong = not isExit_Long and closeLong
entryShort = not isEntry_Short and  shortCondition
exitShort = not isExit_Short and closeShort

if (entryLong)
    isEntry_Long := true
    isExit_Long := false
if (exitLong)
    isEntry_Long := false
    isExit_Long := true
if (entryShort)
    isEntry_Short := true
    isExit_Short := false
if (exitShort)
    isEntry_Short := false
    isExit_Short := true

// Order Execution
if testPeriod() 
    if entryLong
        strategy.entry(id="Long", long=true, when = entryLong, comment=botLONG) // {{strategy.order.comment}}
    if entryShort
        strategy.entry(id="Short", long=false, when = entryShort, comment=botSHORT) // {{strategy.order.comment}}


// TP/SL Execution
if (strategy.position_size > 0)
    strategy.exit(id="Long SL/TP", from_entry="Long", limit=longProfitPrice, stop=longStopPrice)
    strategy.close(id="Long", when=exitLong, comment=botCLOSELONG) // {{strategy.order.comment}}

if (strategy.position_size < 0)
    strategy.exit(id="Short TP/SL", from_entry="Short", limit=shortProfitPrice, stop=shortStopPrice)
    strategy.close(id="Short", when=exitShort, comment=botCLOSESHORT) // {{strategy.order.comment}}
    
// Draw Entry, TP and SL Levels for Long Positions
plot(strategy.position_size > 0 ? longTP == 0 ? na : longProfitPrice : na, style=plot.style_linebr, color=color.green, title="Long TP")
plot(strategy.position_size > 0 ? strategy.position_avg_price : na, style=plot.style_linebr, color=color.blue, title="Long Entry")
plot(strategy.position_size > 0 ? longSL == 0 ? na : longStopPrice : na, style=plot.style_linebr, color=color.red, title="Long SL")
// Draw Entry, TP and SL Levels for Short Positions
plot(strategy.position_size < 0 ? shortTP == 0 ? na : shortProfitPrice : na, style=plot.style_linebr, color=color.green, title="Short TP")
plot(strategy.position_size < 0 ? strategy.position_avg_price : na, style=plot.style_linebr, color=color.blue, title="Short Entry")
plot(strategy.position_size < 0 ? shortSL == 0 ? na : shortStopPrice : na, style=plot.style_linebr, color=color.red, title="Short SL")

Plus de