Opérations de dynamisme avec stratégie de croisement à moyenne mobile double

Auteur:ChaoZhang est là., Date: 2024-04-01 11:53:14 Je suis désolé
Les étiquettes:

img

Résumé

Cette stratégie utilise les moyennes mobiles exponentielles (MAE) à 8 périodes et à 21 périodes pour identifier les changements dans les tendances du marché. Un signal d'achat est généré lorsque l'EMA à court terme franchit au-dessus de l'EMA à long terme depuis le bas, tandis qu'un signal de vente est généré lorsque l'EMA à court terme franchit au-dessous de l'EMA à long terme depuis le haut. La stratégie intègre également trois bas plus élevés (HL) et trois hauts inférieurs (LH) consécutifs pour confirmer davantage les renversements de tendance.

Principes de stratégie

  1. Calculer les EMA à 8 périodes et à 21 périodes pour identifier la direction principale de la tendance.
  2. Identifier trois basses plus élevées (HL) et trois basses plus élevées (LH) consécutives comme des signaux précoces d'inversions de tendance potentielles.
  3. Générer un signal d'achat lorsque l'EMA de 8 périodes dépasse l'EMA de 21 périodes et qu'une rupture HL se produit; générer un signal de vente lorsque l'EMA de 8 périodes dépasse l'EMA de 21 périodes et qu'une rupture LH se produit.
  4. Le niveau de stop-loss est fixé à 5% du prix d'entrée et le niveau de prise de profit à 16% du prix d'entrée pour gérer le risque et verrouiller les bénéfices.
  5. Fermez la position et ouvrez une position inversée lorsque le signal opposé apparaît.

Les avantages de la stratégie

  1. Combine les EMA et les modèles d'action des prix (HL et LH) pour confirmer les tendances, améliorant ainsi la fiabilité du signal.
  2. Définit des niveaux clairs de stop-loss et de take-profit, aidant à gérer les risques et à verrouiller les bénéfices.
  3. Applicable à plusieurs délais et marchés différents, offrant un certain niveau de polyvalence.
  4. Une logique claire, facile à comprendre et à mettre en œuvre.

Risques stratégiques

  1. Dans les marchés instables, les croisements fréquents peuvent entraîner de multiples faux signaux, entraînant des pertes.
  2. Les niveaux fixes de stop-loss et de take-profit peuvent ne pas s'adapter bien aux différentes conditions du marché, ce qui entraîne des coûts d'opportunité potentiels ou des pertes plus importantes.
  3. La stratégie repose sur des données historiques et peut ne pas s'adapter bien à des événements soudains ou à des changements fondamentaux.

Directions d'optimisation de la stratégie

  1. Mettre en place des mécanismes adaptatifs de stop-loss et de take-profit, tels que l'ajustement des niveaux en fonction de la volatilité (par exemple, ATR), afin de mieux s'adapter aux différentes conditions du marché.
  2. Incorporer d'autres indicateurs ou facteurs, tels que le volume, l'indice de résistance relative (RSI), etc., pour filtrer davantage les signaux et améliorer la fiabilité.
  3. Optimiser les paramètres (p. ex. périodes EMA, pourcentages de stop-loss et de take-profit) afin de trouver la combinaison la mieux performante pour des marchés ou des instruments spécifiques.
  4. Envisager d'introduire des mesures de gestion des risques, telles que la taille des positions, pour contrôler l'exposition au risque des transactions individuelles.

Résumé

Cette stratégie utilise le croisement des EMA à 8 périodes et à 21 périodes, combiné avec des modèles de prix HL et LH, pour identifier les renversements de tendance et générer des signaux de trading. Des règles claires de stop-loss et de take-profit aident à gérer les risques et à verrouiller les bénéfices. Cependant, la stratégie peut générer de faux signaux dans les marchés agités, et les niveaux fixes de stop-loss et de take-profit peuvent ne pas bien s'adapter aux différentes conditions du marché. Pour améliorer davantage, envisager d'introduire un stop-loss et un take-profit adaptatifs, d'incorporer d'autres indicateurs, d'optimiser les paramètres et d'introduire des mesures de gestion des risques.


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

//@version=5
strategy('Trend Following 8&21EMA with strategy tester [ukiuro7]', overlay=true, process_orders_on_close=true, calc_on_every_tick=true, initial_capital = 10000)

//INPUTS
lh3On = true
hl3On = true
emaOn = input(title='105ema / 30min', defval=true) 
assistantOn = input(title='Assistant', defval=true)
textOn = input(title='Text', defval=true)

showRiskReward = input.bool(true, title='Show Risk/Reward Area', group="TP/SL")
stopPerc = input.float(5.0, step=0.1, minval=0.1, title='Stop-Loss %:',group="TP/SL") / 100
tpPerc = input.float(16.0, step=0.1, minval=0.1, title='Take-Profit %:',group="TP/SL") / 100

backtestFilter = input(false, title='Backtest Entries to Date Range',group="Backtest Date Range")
i_startTime = input(defval=timestamp('01 Jan 2022 00:00'), inline="b_1", title='Start',group="Backtest Date Range")
i_endTime = input(defval=timestamp('01 Jan 2029 00:00'), inline="b_1", title='End',group="Backtest Date Range")
inDateRange = true

message_long_entry = input.string(title='Alert Msg: LONG Entry', defval ='', group='Alert Message')
message_short_entry = input.string(title='Alert Msg: SHORT Entry', defval='', group='Alert Message')
message_long_exit = input.string(title='Alert Msg: LONG SL/TP', defval='', group='Alert Message')
message_short_exit = input.string(title='Alert Msg: SHORT SL/TP', defval='', group='Alert Message')  

//CALCS
threeHigherLows() =>
    low[0] >= low[1] and low[1] >= low[2]

threeLowerHighs() =>
    high[2] >= high[1] and high[1] >= high[0]

breakHigher() =>
    padding = timeframe.isintraday ? .02 : .1
    high >= high[1] + padding

breakLower() =>
    padding = timeframe.isintraday ? .02 : .1
    low <= low[1] - padding

lh3 = threeLowerHighs() and lh3On
lh3bh = lh3[1] and breakHigher() and lh3On

hl3 = threeHigherLows() and hl3On
hl3bl = hl3[1] and breakLower() and hl3On

ema8 = ta.ema(close, 8)
ema21 = ta.ema(close, 21)

//VARS
var float longStop = na, var float longTp = na
var float shortStop = na, var float shortTp = na

//CONDS
isUptrend = ema8 >= ema21
isDowntrend = ema8 <= ema21
trendChanging = ta.cross(ema8, ema21)

buySignal = lh3bh and lh3[2] and lh3[3] and isUptrend and timeframe.isintraday
sellSignal = hl3bl and hl3[2] and hl3[3] and isDowntrend and timeframe.isintraday

goingDown = hl3 and isDowntrend and timeframe.isintraday
goingUp = lh3 and isUptrend and timeframe.isintraday

projectXBuy = trendChanging and isUptrend
projectXSell = trendChanging and isDowntrend

longCond = trendChanging and isUptrend and assistantOn
shortCond = trendChanging and isDowntrend and assistantOn

//STRATEGY
if shortCond and strategy.position_size > 0 and barstate.isconfirmed
    strategy.close('Long', comment='CLOSE LONG', alert_message=message_long_exit)

if longCond and strategy.position_size < 0 and barstate.isconfirmed
    strategy.close('Short', comment='CLOSE SHORT', alert_message=message_short_exit) 

if longCond and strategy.position_size <= 0 and barstate.isconfirmed and inDateRange
    longStop := close * (1 - stopPerc)
    longTp := close * (1 + tpPerc)
    strategy.entry('Long', strategy.long, comment='LONG', alert_message=message_long_entry)
    strategy.exit('Long Exit', 'Long', comment_loss="SL LONG", comment_profit = "TP LONG", stop=longStop, limit=longTp, alert_message=message_long_exit)

if shortCond and strategy.position_size >= 0 and barstate.isconfirmed and inDateRange
    shortStop := close * (1 + stopPerc)
    shortTp := close * (1 - tpPerc)
    strategy.entry('Short', strategy.short, comment='SHORT', alert_message=message_short_entry)
    strategy.exit('Short Exit', 'Short', comment_loss="SL SHORT", comment_profit="TP SHORT", stop=shortStop, limit=shortTp, alert_message=message_short_exit)

//PLOTS
plotshape(longCond, style=shape.triangleup, location=location.belowbar, color=color.new(color.green, 0), size=size.small, text='Buy')
plotshape(shortCond, style=shape.triangledown, location=location.abovebar, color=color.new(color.red, 0), size=size.small, text='Sell')
plotchar(trendChanging and isUptrend and close < open and assistantOn, char='!', location=location.abovebar, color=color.new(color.green, 0), size=size.small)

aa = plot(ema8, linewidth=3, color=color.new(color.green, 0), editable=true)
bb = plot(ema21, linewidth=3, color=color.new(color.red, 0), editable=true)
fill(aa, bb, color=isUptrend ? color.new(color.green,90) : color.new(color.red,90))
buyZone = isUptrend and lh3 and high < ema21 and timeframe.isintraday
sellZone = isDowntrend and hl3 and low > ema21 and timeframe.isintraday

L1 = plot(showRiskReward and strategy.position_size > 0 ? strategy.position_avg_price : na, color=color.new(color.green, 0), linewidth=1, style=plot.style_linebr, title='Long Entry Price')
L2 = plot(showRiskReward and strategy.position_size > 0 ? longTp : na, color=color.new(color.green, 0), linewidth=1, style=plot.style_linebr, title='Long TP Price')
L3 = plot(showRiskReward and strategy.position_size > 0 ? longStop : na, color=color.new(color.red, 0), linewidth=1, style=plot.style_linebr, title='Long Stop Price')

S1 = plot(showRiskReward and strategy.position_size < 0 ? strategy.position_avg_price : na, color=color.new(color.teal, 0), linewidth=1, style=plot.style_linebr, title='Short Entry Price')
S2 = plot(showRiskReward and strategy.position_size < 0 ? shortTp : na, color=color.new(color.teal, 0), linewidth=1, style=plot.style_linebr, title='Short TP Price')
S3 = plot(showRiskReward and strategy.position_size < 0 ? shortStop : na, color=color.new(color.maroon, 0), linewidth=1, style=plot.style_linebr, title='Short Stop Price')

fill(L1, L2, color=color.new(color.green, 90))
fill(L1, L3, color=color.new(color.red, 90))
fill(S1, S2, color=color.new(color.teal, 90))
fill(S1, S3, color=color.new(color.maroon, 90))

bgcolor(inDateRange == false ? color.new(color.red,90) : na, title="Backtest Off-Range") 


Plus de