Stratégie de reprise de l' EMA

Auteur:ChaoZhang est là., Date: le 21 décembre 2023 à 11h48
Les étiquettes:

img

Résumé

La stratégie de reprise de l'EMA est une stratégie de trading quantitative basée sur l'indicateur EMA. Elle construit des signaux de trading à l'aide de trois courbes EMA avec des périodes différentes et définit un stop loss et un profit basé sur les revers de prix pour automatiser le trading.

Principe de stratégie

La stratégie utilise trois courbes EMA:

  • EMA1: pour juger du niveau de soutien/résistance de recul des prix, avec une période relativement courte, par défaut à 33 périodes.
  • EMA2: pour filtrer certains signaux d'inversion, avec une période de 5 fois celle de l'EMA1, par défaut à 165 périodes.
  • EMA3: pour déterminer la direction générale de la tendance, avec une période de 11 fois celle de l'EMA1, par défaut à 365 périodes.

Les signaux de négociation sont générés selon la logique suivante:

Signal long: le prix franchit le seuil supérieur à l'EMA1, retombe en dessous de l'EMA1 formant des creux plus élevés, le rebond n'atteignant pas l'EMA2.

Signal court: le prix traverse le niveau inférieur à la EMA1, recule au-dessus de la EMA1 formant des hauts inférieurs, avec un rebond qui n'atteint pas la EMA2.

L'option de stop loss est définie au prix de retrait le plus bas/le plus élevé pour long/short.

Les avantages de la stratégie

La stratégie présente les avantages suivants:

  1. Signals de négociation construits à l'aide d'un indicateur EMA fiable.
  2. Le repli des prix évite de se faire piéger efficacement.
  3. Le risque d'arrêt des pertes défini à des contrôles antérieurs de risque élevé/faible est efficace.
  4. Prenez un profit qui satisfait le rapport risque-rendement.
  5. Les paramètres de l'EMA sont réglables pour différents cycles.

Risques stratégiques

La stratégie comporte également certains risques:

  1. L'EMA a un effet de retard, peut manquer les points d'inversion de tendance.
  2. Une fourchette de retraite trop grande pour dépasser l'EMA2 peut générer de faux signaux.
  3. Le stop loss peut être rompu sur les marchés en tendance.
  4. Des paramètres mal réglés entraînent une sur-échange ou des opportunités manquées.

Les risques peuvent être atténués en ajustant les périodes EMA, la limite de recul, etc. D'autres indicateurs peuvent également être ajoutés aux signaux filtrés.

Directions d'optimisation

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

  1. Ajouter un indicateur de tendance afin d'éviter les transactions contre tendance, par exemple MACD.
  2. Ajouter un indicateur de volume de négociation pour éviter une fausse rupture, par exemple OBV.
  3. Optimiser les périodes d'EMA ou utiliser l'EMA adaptative.
  4. Optimisez dynamiquement les paramètres en utilisant des modèles d'apprentissage automatique comme les mots.
  5. Ajoutez la prédiction du modèle pour le stop loss adaptatif et le profit.

Conclusion

La stratégie de reprise de l'EMA construit un système de négociation en utilisant trois EMA et définit un stop loss et un profit basé sur les revirements de prix pour automatiser le trading. Elle contrôle efficacement les risques commerciaux et peut être optimisée en ajustant les paramètres en fonction des conditions du marché.


/*backtest
start: 2023-11-20 00:00:00
end: 2023-12-20 00:00:00
period: 1h
basePeriod: 15m
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/
// created by Space Jellyfish
//@version=4

strategy("EMA pullback strategy", overlay = true, initial_capital=10000, commission_value = 0.075)

target_stop_ratio = input(title="Take Profit Stop Loss ratio", type=input.float, defval=2.06, minval=0.5, maxval=100)
riskLimit_low =  input(title="lowest risk per trade", type=input.float, defval=0.008, minval=0, maxval=100)
riskLimit_high =  input(title="highest risk per trade", type=input.float, defval=0.02, minval=0, maxval=100)
//give up the trade, if the risk is smaller than limit, adjust position size if risk is bigger than limit

ema_pullbackLevel_period = input(title="EMA1 for pullback level Period", type=input.integer, defval=33, minval=1, maxval=10000)
ema_pullbackLimiit_period = input(title="EMA2 for pullback limit Period", type=input.integer, defval=165, minval=1, maxval=10000)
ema_trend_period = input(title="EMA3 for trend Period", type=input.integer, defval=365, minval=1, maxval=10000)

startDate = input(title="Start Date", type=input.integer, defval=1, minval=1, maxval=31)
startMonth = input(title="Start Month", type=input.integer, defval=1, minval=1, maxval=12)
startYear = input(title="Start Year", type=input.integer, defval=2018, minval=2008, maxval=2200)

inDateRange = (time >= timestamp(syminfo.timezone, startYear, startMonth, startDate, 0, 0))

ema_pullbackLevel = ema(close, ema_pullbackLevel_period)
ema_pullbackLimit = ema(close, ema_pullbackLimiit_period)
ema_trendDirection = ema(close, ema_trend_period)

//ema pullback 
float pricePullAboveEMA_maxClose = na
float pricePullAboveEMA_maxHigh = na

float pricePullBelowEMA_minClose = na
float pricePullBelowMA_minLow = na

if(crossover(close, ema_pullbackLevel))
    pricePullAboveEMA_maxClose := close
    pricePullAboveEMA_maxHigh := high
else
    pricePullAboveEMA_maxClose := pricePullAboveEMA_maxClose[1]
    pricePullAboveEMA_maxHigh := pricePullAboveEMA_maxHigh[1]

if(close > pricePullAboveEMA_maxClose)
    pricePullAboveEMA_maxClose := close
if(high > pricePullAboveEMA_maxHigh)
    pricePullAboveEMA_maxHigh := high

if(crossunder(close, ema_pullbackLevel))
    pricePullBelowEMA_minClose := close
    pricePullBelowMA_minLow := low
else
    pricePullBelowEMA_minClose :=pricePullBelowEMA_minClose[1]
    pricePullBelowMA_minLow:=pricePullBelowMA_minLow[1]
    
if(close < pricePullBelowEMA_minClose)
    pricePullBelowEMA_minClose := close
if(low < pricePullBelowMA_minLow)
    pricePullBelowMA_minLow := low


long_strategy = crossover(close, ema_pullbackLevel) and pricePullBelowEMA_minClose < ema_pullbackLimit and ema_pullbackLevel>ema_trendDirection 
short_strategy = crossunder(close, ema_pullbackLevel) and pricePullAboveEMA_maxClose > ema_pullbackLimit and ema_pullbackLevel<ema_trendDirection


var open_long_or_short = 0// long = 10000, short = -10000, no open = 0

//check if position is closed
if(strategy.position_size == 0)
    open_long_or_short := 0
else
    open_long_or_short := open_long_or_short[1]

float risk_long = na
float risk_short = na
float stopLoss = na
float takeProfit = na
float entry_price = na

float entryContracts = 0



risk_long := risk_long[1]
risk_short := risk_short[1]
    
//open a position determine the position size
if (strategy.position_size == 0 and long_strategy and inDateRange)
    risk_long := (close - pricePullBelowMA_minLow) / close

    if(risk_long < riskLimit_high)
        entryContracts := strategy.equity / close
    else
        entryContracts := (strategy.equity * riskLimit_high / risk_long)/close
    
    if(risk_long > riskLimit_low)
        strategy.entry("long", strategy.long, qty = entryContracts, when = long_strategy)


    open_long_or_short := 10000
    
if (strategy.position_size == 0 and short_strategy and inDateRange)
    risk_short := (pricePullAboveEMA_maxHigh - close) / close
    if(risk_short < riskLimit_high)
        entryContracts := strategy.equity / close
    else
        entryContracts := (strategy.equity * riskLimit_high / risk_short)/close

    if(risk_short > riskLimit_low)
        strategy.entry("short", strategy.short, qty = entryContracts, when = short_strategy)

    
    open_long_or_short := -10000

//take profit / stop loss
if(open_long_or_short == 10000)

    stopLoss :=   strategy.position_avg_price*(1 - risk_long)
    takeProfit :=  strategy.position_avg_price*(1 + target_stop_ratio * risk_long)
    entry_price := strategy.position_avg_price
    strategy.exit("Long exit","long", limit = takeProfit , stop = stopLoss)
    
if(open_long_or_short == -10000)
    stopLoss :=  strategy.position_avg_price*(1 + risk_short)
    takeProfit :=  strategy.position_avg_price*(1 - target_stop_ratio * risk_short)
    entry_price := strategy.position_avg_price
    strategy.exit("Short exit","short", limit = takeProfit, stop = stopLoss)



plot(ema_pullbackLevel, color=color.aqua,  title="ema pullback level")
plot(ema_pullbackLimit, color=color.purple,  title="ema pullback limit")
plot(ema_trendDirection, color=color.white,  title="ema trend")

plot(entry_price, color = color.yellow, linewidth = 1, style = plot.style_linebr)
plot(stopLoss, color = color.red, linewidth = 1, style = plot.style_linebr)
plot(takeProfit, color = color.green, linewidth = 1, style = plot.style_linebr)





//

Plus de