This strategy is a trend following system based on multiple Exponential Moving Average (EMA) crossovers, combined with dynamic stop-loss and take-profit mechanisms. The strategy employs three EMAs - 21-period, 50-period, and 200-period - generating trading signals through short-term and medium-term EMA crossovers while using the long-term EMA to confirm overall trend direction. It includes flexible stop-loss and take-profit levels for risk management. The strategy is particularly suitable for markets with significant volatility and medium to long-term trend trading.
The core logic is based on the synergistic effect of a triple EMA system:
This strategy effectively captures market trends through the coordination of multiple EMA systems. Its comprehensive risk management mechanism and clear trading logic make it a practical trading tool. Through continuous optimization and improvement, the strategy can better adapt to different market environments, enhancing trading efficiency and stability. Traders are advised to conduct thorough backtesting and parameter optimization before live implementation, making appropriate adjustments based on market characteristics and individual risk preferences.
/*backtest start: 2019-12-23 08:00:00 end: 2024-11-17 00:00:00 period: 1d basePeriod: 1d exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("EMA Crossover with SL and TP Levels", overlay=true) // Input settings for stop loss and take profit slTicks = input.int(50, title="Stop Loss (ticks)", minval=1) tpTicks = input.int(100, title="Take Profit (ticks)", minval=1) // Input settings for moving averages shortMAPeriod = input.int(21, title="Short MA Period") longMAPeriod = input.int(50, title="Long MA Period") thirdMAPeriod = input.int(200, title="Third MA Period") // Calculate moving averages shortMA = ta.ema(close, shortMAPeriod) // Short EMA (21-period) longMA = ta.ema(close, longMAPeriod) // Long EMA (50-period) thirdMA = ta.ema(close, thirdMAPeriod) // Third EMA (200-period) // Detect crossovers for entry signals bullishCross = ta.crossover(shortMA, longMA) and close > thirdMA bearishCross = ta.crossunder(shortMA, longMA) and close < thirdMA // Initialize variables for SL and TP var float longSL = na var float longTP = na var float shortSL = na var float shortTP = na // Execute trades based on crossovers if (bullishCross) longSL := close - slTicks * syminfo.mintick longTP := close + tpTicks * syminfo.mintick strategy.entry("Long", strategy.long) strategy.exit("Exit Long", "Long", stop=longSL, limit=longTP) if (bearishCross) shortSL := close + slTicks * syminfo.mintick shortTP := close - tpTicks * syminfo.mintick strategy.entry("Short", strategy.short) strategy.exit("Exit Short", "Short", stop=shortSL, limit=shortTP) // Plot the MAs plot(shortMA, color=color.green, linewidth=2, title="21-period EMA") plot(longMA, color=color.red, linewidth=2, title="50-period EMA") plot(thirdMA, color=color.blue, linewidth=2, title="200-period EMA") // Plot buy/sell signals plotshape(series=bullishCross, title="Buy Signal", location=location.belowbar, color=color.green, style=shape.labelup, text="BUY", size=size.small, offset=-1) plotshape(series=bearishCross, title="Sell Signal", location=location.abovebar, color=color.red, style=shape.labeldown, text="SELL", size=size.small, offset=-1) // // Draw SL and TP lines for Long positions // if (bullishCross) // line.new(x1=bar_index, y1=longSL, x2=bar_index + 1, y2=longSL, color=color.red, width=2, style=line.style_dotted) // line.new(x1=bar_index, y1=longTP, x2=bar_index + 1, y2=longTP, color=color.green, width=2, style=line.style_dotted) // label.new(bar_index, longSL, text="Long SL", style=label.style_label_down, color=color.red, textcolor=color.white, size=size.small) // label.new(bar_index, longTP, text="Long TP", style=label.style_label_up, color=color.green, textcolor=color.white, size=size.small) // // Draw SL and TP lines for Short positions // if (bearishCross) // line.new(x1=bar_index, y1=shortSL, x2=bar_index + 1, y2=shortSL, color=color.red, width=2, style=line.style_dotted) // line.new(x1=bar_index, y1=shortTP, x2=bar_index + 1, y2=shortTP, color=color.green, width=2, style=line.style_dotted) // label.new(bar_index, shortSL, text="Short SL", style=label.style_label_down, color=color.red, textcolor=color.white, size=size.small) // label.new(bar_index, shortTP, text="Short TP", style=label.style_label_up, color=color.green, textcolor=color.white, size=size.small)