Stratégie de croisement de moyenne mobile exponentielle sur plusieurs périodes

EMA SL TP TF
Date de création: 2024-07-30 12:02:23 Dernière modification: 2024-07-30 12:02:23
Copier: 3 Nombre de clics: 618
1
Suivre
1617
Abonnés

Stratégie de croisement de moyenne mobile exponentielle sur plusieurs périodes

Aperçu

Cette stratégie de croisement d’indices mobiles à plusieurs périodes est un système de trading automatisé basé sur des signaux croisés d’EMA. Elle utilise des EMA de différentes périodes pour générer des signaux de trading et combine des mécanismes de stop-loss et de profit-loss pour gérer les risques. La stratégie repose principalement sur le croisement entre les EMA rapides et les EMA lents et les EMA de périodes plus élevées pour identifier les opportunités de trading potentielles.

Principe de stratégie

Le principe central de cette stratégie est d’utiliser des moyennes mobiles indicielles (EMA) sur plusieurs périodes de temps pour identifier les tendances du marché et générer des signaux de négociation.

  1. Utilisez l’EMA à 9 cycles comme ligne rapide, l’EMA à 50 cycles comme ligne lente, et l’EMA à 100 cycles sur les périodes de 15 minutes comme ligne de référence pour les périodes plus longues.

  2. Les conditions d’achat du signal:

    • une EMA rapide sur une EMA lente et une EMA rapide sur une EMA de période plus élevée; ou
    • Les EMA rapides ont une période de temps plus élevée.
  3. Les conditions de vente du signal:

    • l’EMA rapide est inférieure à l’EMA lente et l’EMA rapide est inférieure à l’EMA de la période de temps plus élevée; ou
    • Les EMA rapides traversent des périodes de temps plus élevées sous les EMA.
  4. Gestion des opérations:

    • Les objectifs de stop loss (SL) et de profit (TP) sont fixés.
    • Lorsque le prix atteint le premier objectif de profit (TP1), la position est levée de 25% et le stop loss est déplacé vers la position de couverture.
    • La position restante continue à fonctionner jusqu’à la deuxième cible de profit ((TP2) ou d’arrêt de perte)).
  5. Contrôle du temps de transaction:

    • Vous pouvez définir une période et un jour de transaction spécifiques.

Avantages stratégiques

  1. L’analyse multi-périodes: les EMA combinées à différentes périodes permettent de réduire les faux signaux et d’améliorer la qualité des transactions.

  2. Le suivi des tendances: grâce à l’intersection des EMA et à la relation de position, il est possible de capturer efficacement les tendances du marché.

  3. Gestion des risques: une stratégie de stop loss fixe et de profit par tranches permet de limiter les pertes potentielles tout en permettant aux bénéfices de continuer à croître.

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

  5. Automatisation: la stratégie peut être entièrement automatisée via la plateforme TradingView et PineConnector.

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

Risque stratégique

  1. L’EMA est essentiellement un indicateur en retard qui peut être en retard dans un marché très volatil.

  2. Faux signaux: Dans les marchés à la croisée des marchés, les croisements EMA peuvent générer de fréquents faux signaux, entraînant des sur-échanges.

  3. Stop-loss fixe: le stop-loss avec un nombre de points fixe peut ne pas être adapté à toutes les conditions du marché et peut parfois être trop grand ou trop petit.

  4. L’efficacité d’une stratégie est fortement tributaire de l’activité du marché au cours de la période de rétroaction, et la performance future peut être différente.

  5. Adaptabilité du marché: la stratégie fonctionne bien pour certaines paires de devises, mais peut être moins efficace pour d’autres.

Orientation de l’optimisation de la stratégie

  1. Ajustement des paramètres dynamiques: considérer la dynamique des cycles EMA, des niveaux de stop-loss et de profit en fonction de la volatilité du marché.

  2. Augmentation des conditions de filtrage: l’introduction d’indicateurs techniques supplémentaires ou d’indicateurs d’humeur du marché pour filtrer les signaux de négociation et réduire les faux signaux.

  3. Amélioration des stratégies de stop loss: mise en place de stop loss suivi ou stop loss dynamique basé sur l’ATR pour mieux s’adapter aux fluctuations du marché.

  4. Optimiser les heures de transaction: effectuer une analyse plus détaillée des heures pour trouver les meilleurs moments et dates de transaction.

  5. Augmentation de la gestion du volume des transactions: 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: considérer la corrélation entre plusieurs paires de devises pour éviter une exposition excessive à des risques de marché similaires.

  7. Intégration de l’apprentissage automatique: optimisation du processus de sélection des paramètres et de génération de signaux à l’aide d’algorithmes d’apprentissage automatique.

Résumer

La stratégie multi-périodes est un système de trading automatisé qui combine le suivi des tendances et la gestion des risques. En utilisant des signaux croisés EMA de différentes périodes, la stratégie vise à capturer les tendances du marché et à effectuer des transactions au moment opportun. Bien que la stratégie se comporte bien dans certaines conditions de marché, il existe néanmoins des risques et des limites inhérents.

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