Les ressources ont été chargées... Je charge...

Stratégie de croisement des moyennes mobiles exponentielles sur plusieurs périodes

Auteur:ChaoZhang est là., Date: 2024-07-30 12:02:23 Je suis désolé
Les étiquettes:Le taux d'intérêtSLTPTF

img

Résumé

Cette stratégie de croisement des moyennes mobiles exponentielles multi-temps est un système de négociation automatisé basé sur les signaux de croisement de l'EMA. Elle utilise des EMA de différents délais pour générer des signaux de négociation et intègre des mécanismes de stop-loss et take-profit pour la gestion des risques.

Principes de stratégie

Le principe de base de cette stratégie est d'utiliser des moyennes mobiles exponentielles (MAA) à partir de plusieurs délais pour identifier les tendances du marché et générer des signaux de trading.

  1. Il utilise une EMA de 9 périodes comme ligne rapide, une EMA de 50 périodes comme ligne lente et une EMA de 100 périodes sur un laps de temps de 15 minutes comme référence pour un laps de temps plus long.

  2. Conditions du signal d' achat:

    • L'EMA rapide est supérieure à l'EMA lente, et l'EMA rapide est supérieure à l'EMA à plus long terme; ou
    • L'EMA rapide dépasse l'EMA à plus long terme.
  3. Conditions du signal de vente:

    • L'EMA rapide est inférieure à l'EMA lente, et l'EMA rapide est inférieure à l'EMA à plus long terme; ou
    • L'EMA rapide est inférieure à l'EMA à plus long terme.
  4. Gestion du commerce:

    • Les niveaux fixés de stop-loss (SL) et de take-profit (TP) sont définis.
    • Lorsque le prix atteint le premier niveau de prise de profit (TP1), il ferme 25% de la position et déplace le stop-loss à l'équilibre.
    • La position restante continue à fonctionner jusqu'à ce que le deuxième niveau de prise de profit (TP2) ou stop-loss soit atteint.
  5. Contrôle du temps de négociation:

    • Permet de définir des heures et des jours de négociation spécifiques.

Les avantages de la stratégie

  1. L'analyse de plusieurs délais: la combinaison des EMA de délais différents contribue à réduire les faux signaux et à améliorer la qualité des échanges.

  2. Suivi des tendances: Capture efficacement les tendances du marché à travers les croisements des EMA et les positions relatives.

  3. Gestion des risques: utilise une stratégie fixe de stop-loss et de prise de profit progressive, limitant les pertes potentielles tout en permettant aux bénéfices de fonctionner.

  4. Flexibilité: les paramètres EMA, les niveaux de stop-loss et de take-profit peuvent être ajustés pour différents marchés et styles de négociation.

  5. Automatisation: la stratégie peut être entièrement automatisée à l'aide de la plateforme TradingView et de PineConnector.

  6. Gestion du temps: Capacité de fixer des heures et des jours de négociation spécifiques pour éviter de négocier dans des conditions de marché défavorables.

Risques stratégiques

  1. Décalage: les EMA sont des indicateurs en retard et peuvent ne pas réagir assez rapidement sur les marchés volatils.

  2. Faux signaux: sur les marchés à fourchette, les croisements EMA peuvent produire de fréquents faux signaux, conduisant à une survente.

  3. L'utilisation de stop-loss fixes peut ne pas convenir à toutes les conditions de marché, étant parfois trop élevée ou trop faible.

  4. Dépendance des données historiques: l'efficacité de la stratégie dépend fortement du comportement du marché pendant la période de backtesting, qui peut différer à l'avenir.

  5. Adaptabilité du marché: Bien que la stratégie fonctionne bien sur certaines paires de devises, elle peut ne pas être aussi efficace sur d'autres.

Directions d'optimisation de la stratégie

  1. Ajustement dynamique des paramètres: envisager d'ajuster dynamiquement les périodes EMA, les niveaux de stop-loss et de take-profit en fonction de la volatilité du marché.

  2. Conditions de filtrage supplémentaires: introduire des indicateurs techniques ou de sentiment supplémentaires pour filtrer les signaux commerciaux et réduire les faux positifs.

  3. Amélioration de la stratégie d'arrêt des pertes: mettre en œuvre des arrêts de retard ou des arrêts de pertes dynamiques basés sur ATR pour mieux s'adapter à la volatilité du marché.

  4. Optimiser les heures de négociation: procéder à une analyse plus détaillée des heures pour trouver les meilleures heures et dates de négociation.

  5. Amélioration de la taille des positions: ajustement de la taille des positions en fonction de la volatilité du marché et du risque du compte.

  6. Analyse de la corrélation entre plusieurs devises: examiner les corrélations entre plusieurs paires de devises pour éviter une surexposition à des risques de marché similaires.

  7. Intégration de l'apprentissage automatique: Utiliser des algorithmes d'apprentissage automatique pour optimiser les processus de sélection de paramètres et de génération de signaux.

Conclusion

La stratégie de croisement des moyennes mobiles exponentielles multi-temps est un système de trading automatisé qui combine le suivi des tendances avec la gestion des risques. En tirant parti des signaux de croisement EMA de différents délais, la stratégie vise à capturer les tendances du marché et à exécuter des transactions aux moments appropriés. Bien que la stratégie fonctionne bien dans certaines conditions de marché, elle présente toujours des risques et des limitations inhérents. Pour améliorer encore la robustesse et l'adaptabilité de la stratégie, il peut être envisagé d'introduire des ajustements dynamiques des paramètres, des conditions de filtrage supplémentaires et des techniques de gestion des risques plus sophistiquées.


/*backtest
start: 2023-07-30 00:00:00
end: 2024-07-29 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Miles Multi TF EMA Strategy v 1", overlay=true)

Fast = input.int(9, "Fast EMA")
Xslow = input.int(50, "Slow EMA")

var bool inTrade = false // Ensure inTrade is declared and initialized
var int tradeDirection = 0
var float buy_slPrice = na
var float buy_tp1Price = na
var float buy_tp2Price = na
var float sell_slPrice = na
var float sell_tp1Price = na
var float sell_tp2Price = na
var bool tp1Hit = false
var bool buytp1Hit = false
var bool selltp1Hit = false
var float entryPrice = na
var float lastSignalBar = na
fastEMA = ta.ema(close, Fast)
XslowEMA = ta.ema(close, Xslow)
var int step = 0

// Example SL and TP settings (adjust according to your strategy)
slPips = input.int(150, "Stop Loss")
tp1Pips = input.int(75, "Take Profit 1")
tp2Pips = input.int(150, "Take Profit 2")
beoff = input.int(25, "Breakeven Offset")

// Define the higher time frame
higherTimeFrame = input.timeframe("15", "Higher Timeframe EMA")

// Fetch the EMA from the higher time frame
higherTimeFrameEMA = request.security(syminfo.tickerid, higherTimeFrame, ta.ema(close, 100))

// Input for trading start and end times, allowing end time to extend beyond midnight
startHour = input.int(1, "Start Hour", minval=0, maxval=23)
endHour = input.int(25, "End Hour", minval=0, maxval=47) // Extend maxval to 47 to allow specifying times into the next day

// Adjust endHour to be within 24-hour format using modulo operation
adjustedEndHour = endHour % 24

// Function to determine if the current time is within the trading hours
isTradingTime(currentHour) =>
    if startHour < adjustedEndHour
        currentHour >= startHour and currentHour < adjustedEndHour
    else
        currentHour >= startHour or currentHour < adjustedEndHour

// Get the current hour in the exchange's timezone
currentHour = hour(time, "Australia/Sydney")

// Check if the current time is within the trading hours
trading = isTradingTime(currentHour)

// Plot background color if within trading hours
bgcolor(trading ? color.new(color.blue, 90) : na)

// Inputs for trading days
tradeOnMonday = input.bool(true, "Trade on Monday")
tradeOnTuesday = input.bool(true, "Trade on Tuesday")
tradeOnWednesday = input.bool(true, "Trade on Wednesday")
tradeOnThursday = input.bool(true, "Trade on Thursday")
tradeOnFriday = input.bool(true, "Trade on Friday")

// Current time checks
currentDayOfWeek = dayofweek(time, "Australia/Sydney")

// Check if current time is within trading hours
isTradingHour = (currentHour >= startHour and currentHour < endHour)

// Check if trading is enabled for the current day of the week
isTradingDay = (currentDayOfWeek == dayofweek.monday and tradeOnMonday) or 
               (currentDayOfWeek == dayofweek.tuesday and tradeOnTuesday) or 
               (currentDayOfWeek == dayofweek.wednesday and tradeOnWednesday) or 
               (currentDayOfWeek == dayofweek.thursday and tradeOnThursday) or 
               (currentDayOfWeek == dayofweek.friday and tradeOnFriday)

// Combined check for trading time and day
isTradingTime = isTradingHour and isTradingDay

buySignal = false
sellSignal = false

// Conditions
if (step == 0 or step == 4) and ta.crossover(fastEMA, XslowEMA) and fastEMA > higherTimeFrameEMA
    step := 1

if (step == 0 or step == 4) and ta.crossover(fastEMA, higherTimeFrameEMA)
    step := 1

if step == 3 and ta.crossover(fastEMA, XslowEMA) and fastEMA > higherTimeFrameEMA
    step := 3

if step == 2 and ta.crossover(fastEMA, XslowEMA) and fastEMA > higherTimeFrameEMA
    step := 1

if (step == 0 or step == 3) and ta.crossunder(fastEMA, XslowEMA) and fastEMA < higherTimeFrameEMA
    step := 2

if (step == 0 or step == 3) and ta.crossunder(fastEMA, higherTimeFrameEMA)
    step := 2

if step == 4 and ta.crossunder(fastEMA, XslowEMA) and fastEMA < higherTimeFrameEMA
    step := 4

if step == 1 and ta.crossunder(fastEMA, XslowEMA) and fastEMA < higherTimeFrameEMA
    step := 2

// For buy signals
if step == 1 and isTradingTime and fastEMA > ta.ema(close, Xslow) and fastEMA > higherTimeFrameEMA
    buySignal := true
    inTrade := true
    entryPrice := close
    tradeDirection := 1
    buytp1Hit := false
    lastSignalBar := bar_index
    buy_slPrice := entryPrice - slPips * syminfo.mintick
    buy_tp1Price := entryPrice + tp1Pips * syminfo.mintick // Set TP1
    buy_tp2Price := entryPrice + tp2Pips * syminfo.mintick // Set TP2
    tp1Hit := false
    step := 3
    strategy.entry("Buy", strategy.long, stop=buy_slPrice, limit=buy_tp1Price)

if step == 2 and isTradingTime and fastEMA < ta.ema(close, Xslow) and fastEMA < higherTimeFrameEMA
    sellSignal := true
    inTrade := true
    entryPrice := close
    tradeDirection := -1
    lastSignalBar := bar_index
    selltp1Hit := false
    sell_slPrice := entryPrice + slPips * syminfo.mintick
    sell_tp1Price := entryPrice - tp1Pips * syminfo.mintick // Set TP1
    sell_tp2Price := entryPrice - tp2Pips * syminfo.mintick // Set TP2
    tp1Hit := false
    step := 4
    strategy.entry("Sell", strategy.short, stop=sell_slPrice, limit=sell_tp1Price)

// Move SL to breakeven once TP1 is hit and close 25% of the trade
if (ta.valuewhen(strategy.position_size != 0, strategy.position_size, 0) > 0)
    if high >= buy_tp1Price and not tp1Hit
        tp1Hit := true
        buy_slPrice := entryPrice + beoff * syminfo.mintick
        strategy.close("Buy", qty_percent = 25, comment = "TP1 Hit")
        strategy.exit("Close", from_entry="Buy", stop=buy_slPrice, limit=buy_tp2Price)
        
if (ta.valuewhen(strategy.position_size != 0, strategy.position_size, 0) < 0)
    if low <= sell_tp1Price and not tp1Hit
        tp1Hit := true
        sell_slPrice := entryPrice - beoff * syminfo.mintick
        strategy.close("Sell", qty_percent = 25, comment = "TP1 Hit")
        strategy.exit("Close", from_entry="Sell", stop=sell_slPrice, limit=sell_tp2Price)

// Managing the trade after it's initiated
if inTrade and tradeDirection == 1 and sellSignal
    inTrade := false
    tradeDirection := 0
    buy_slPrice := na
    buy_tp1Price := na
    buy_tp2Price := na
    tp1Hit := false
    step := 2

if inTrade and tradeDirection == -1 and buySignal
    inTrade := false
    tradeDirection := 0
    sell_slPrice := na
    sell_slPrice := na
    sell_tp2Price := na
    tp1Hit := false
    step := 1

if inTrade and tradeDirection == 1 and step == 1
    step := 0

if inTrade and tradeDirection == -1 and step == 2
    step := 0

if inTrade and tradeDirection == 1 and (bar_index - lastSignalBar) >= 1
    if high >= buy_tp1Price and not tp1Hit
        tp1Hit := true
        buytp1Hit := true
        lastSignalBar := bar_index
        buy_slPrice := entryPrice + beoff * syminfo.mintick
        step := 3

    if low <= buy_slPrice and not tp1Hit and (bar_index - lastSignalBar) >= 1
        strategy.close("Buy", qty_percent = 100, comment = "SL Hit")
        inTrade := false
        tradeDirection := 0
        buy_slPrice := na
        buy_tp1Price := na
        buy_tp2Price := na
        tp1Hit := false
        buytp1Hit := false
        step := 0

if inTrade and tradeDirection == 1 and tp1Hit and (bar_index - lastSignalBar) >= 1
    if low <= buy_slPrice
        inTrade := false
        tradeDirection := 0
        buy_slPrice := na
        buy_tp1Price := na
        buy_tp2Price := na
        tp1Hit := false
        buytp1Hit := false
        step := 0

    if high >= buy_tp2Price and (bar_index - lastSignalBar) >= 1
        inTrade := false
        tradeDirection := 0
        buy_slPrice := na
        buy_tp1Price := na
        buy_tp2Price := na
        tp1Hit := false
        buytp1Hit := false
        step := 0

if inTrade and tradeDirection == -1 and (bar_index - lastSignalBar) >= 1
    if low <= sell_tp1Price and not tp1Hit
        tp1Hit := true
        lastSignalBar := bar_index
        selltp1Hit := true
        sell_slPrice := entryPrice - beoff * syminfo.mintick
        step := 4

    if high >= sell_slPrice and not tp1Hit and (bar_index - lastSignalBar) >= 1
        strategy.close("Sell", qty_percent = 100, comment = "SL Hit")
        inTrade := false
        tradeDirection := 0
        sell_slPrice := na
        sell_tp1Price := na
        sell_tp2Price := na
        tp1Hit := false
        selltp1Hit := false
        step := 0

if inTrade and tradeDirection == -1 and tp1Hit  and (bar_index - lastSignalBar) >= 1
    if high >= sell_slPrice
        inTrade := false
        tradeDirection := 0
        sell_slPrice := na
        sell_tp1Price := na
        sell_tp2Price := na
        tp1Hit := false
        selltp1Hit := false
        step := 0
    if low <= sell_tp2Price
        inTrade := false
        tradeDirection := 0
        sell_slPrice := na
        sell_tp1Price := na
        sell_tp2Price := na
        tp1Hit := false
        selltp1Hit := false
        step := 0

Relationnée

Plus de