
La stratégie utilise les moyennes mobiles indicielles de 8 cycles et de 21 cycles (EMA) pour identifier les changements de tendance du marché. Elle génère un signal d’achat lorsque l’EMA de plus courte durée traverse l’EMA de plus longue durée en bas; et inversement, elle génère un signal de vente lorsque l’EMA de plus courte durée traverse l’EMA de plus longue durée en haut. La stratégie combine également trois basses plus élevées (HLL) et trois hautes plus basses (LLH) consécutives comme signal de confirmation d’un renversement de tendance.
La stratégie utilise le croisement des EMA de 8 cycles et de 21 cycles, en combinaison avec les modèles de prix HLL et LLH, pour identifier un renversement de tendance et générer un signal de négociation. Des règles claires de stop-loss aident à contrôler les risques et à bloquer les bénéfices. Cependant, la stratégie peut générer de faux signaux dans des marchés instables et des niveaux de stop-loss fixes peuvent ne pas s’adapter aux différents environnements de marché.
/*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")