This strategy utilizes the golden cross and dead cross of EMA lines for dual-directional trend following, and sets up dynamic stop loss lines for long and short positions to capture trending moves in the market.
Enhancements like ATR-based risk management, optimizing stop loss rules, adding filter indicators etc. can help improve the strategy.
In conclusion, this is a very typical trend following strategy. Dual EMA crossover with dynamic stop loss can effectively lock in trend profits. Meanwhile the risks like lagging signals and overwide stops still exist. Through parameter tuning, risk management, filter additions etc., further refinement can lead to better results.
/*backtest start: 2023-12-01 00:00:00 end: 2023-12-31 23:59:59 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("EMA Crossover Strategy", shorttitle="EMAC", overlay=true,calc_on_every_tick=true) // Input parameters shortEmaLength = input(5, title="Short EMA Length") longEmaLength = input(20, title="Long EMA Length") priceEmaLength = input(1, title="Price EMA Length") // Set stop loss level with input options (optional) longLossPerc = input.float(0.05, title="Long Stop Loss (%)", minval=0.0, step=0.1) * 0.01 shortLossPerc = input.float(0.05, title="Short Stop Loss (%)", minval=0.0, step=0.1) * 0.01 // Calculating indicators shortEma = ta.ema(close, shortEmaLength) longEma = ta.ema(close, longEmaLength) //priceEma = ta.ema(close, priceEmaLength) vwap = ta.vwap(close) // Long entry conditions longCondition = ta.crossover(shortEma, longEma) and close > vwap // Short entry conditions shortCondition = ta.crossunder(shortEma, longEma) and close > vwap // STEP 2: // Determine stop loss price longStopPrice = strategy.position_avg_price * (1 - longLossPerc) shortStopPrice = strategy.position_avg_price * (1 + shortLossPerc) if (longCondition) strategy.entry("Enter Long", strategy.long) strategy.exit("Exit Long",from_entry = "Enter Long",stop= longStopPrice) plotshape(series=longCondition, title="Long Signal", color=color.green, style=shape.triangleup, location=location.belowbar) if (shortCondition) strategy.entry("Enter Short", strategy.short) strategy.exit("Exit Short", from_entry = "Enter Short",stop = shortStopPrice) plotshape(series=shortCondition, title="Short Signal", color=color.red, style=shape.triangledown, location=location.abovebar) // Stop loss levels //longStopLoss = (1 - stopLossPercent) * close //shortStopLoss = (1 + stopLossPercent) * close // Exit conditions //strategy.exit("Long", from_entry="Long", loss=longStopLoss) //strategy.exit("Short", from_entry="Short", loss=shortStopLoss) // Plotting indicators on the chart plot(shortEma, color=color.yellow, title="Short EMA") plot(longEma, color=color.green, title="Long EMA") plot(close, color=color.black, title="Close") plot(vwap, color=color.purple, title="VWAP") // Plot stop loss values for confirmation plot(strategy.position_size > 0 ? longStopPrice : na, color=color.red, style=plot.style_line, linewidth=2, title="Long Stop Loss") plot(strategy.position_size < 0 ? shortStopPrice : na, color=color.blue, style=plot.style_line, linewidth=2, title="Short Stop Loss") // Plotting stop loss lines //plot(longStopLoss, color=color.red, title="Long Stop Loss", linewidth=2, style=plot.style_line) //plot(shortStopLoss, color=color.aqua, title="Short Stop Loss", linewidth=2, style=plot.style_line)