This strategy is a quantitative trading system that combines multiple Exponential Moving Averages (EMA), Relative Strength Index (RSI), and Moving Average Convergence Divergence (MACD). The strategy forms a complete trading decision framework through the coordination of multiple technical indicators. It uses four EMA lines (10, 20, 50, and 100-day) as the main trend judgment tools, combined with RSI and MACD as auxiliary confirmation indicators, while setting stop-loss and take-profit to control risk.
The core logic of the strategy is based on the following key elements:
This is a well-designed quantitative trading strategy with rigorous logic. Through the combined use of multiple technical indicators, it can effectively capture market trends while maintaining comprehensive risk control mechanisms. The strategy has significant optimization potential, and through continuous improvement and adjustment, better trading results can be expected. It is recommended to conduct thorough backtesting before live trading and adjust parameters according to specific market conditions.
/*backtest start: 2019-12-23 08:00:00 end: 2024-12-04 00:00:00 period: 1d basePeriod: 1d exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("4 EMA Strategy with RSI & MACD", shorttitle="4 EMA + RSI + MACD", overlay=true) // Input EMA periods ema1 = input(10, title="EMA 1") ema2 = input(20, title="EMA 2") ema3 = input(50, title="EMA 3") ema4 = input(100, title="EMA 4") // Input RSI & MACD settings rsiLength = input(14, title="RSI Length") rsiOverbought = input(70, title="RSI Overbought") rsiOversold = input(30, title="RSI Oversold") macdFast = input(12, title="MACD Fast Length") macdSlow = input(26, title="MACD Slow Length") macdSignal = input(9, title="MACD Signal Length") // Stop Loss and Take Profit Inputs stopLossPct = input.float(1.5, title="Stop Loss %") / 100 takeProfitPct = input.float(3, title="Take Profit %") / 100 // Calculate EMAs ema_1 = ta.ema(close, ema1) ema_2 = ta.ema(close, ema2) ema_3 = ta.ema(close, ema3) ema_4 = ta.ema(close, ema4) // Calculate RSI rsi = ta.rsi(close, rsiLength) // Calculate MACD [macdLine, signalLine, _] = ta.macd(close, macdFast, macdSlow, macdSignal) // Plot EMAs plot(ema_1, color=color.blue, title="EMA 10") plot(ema_2, color=color.green, title="EMA 20") plot(ema_3, color=color.orange, title="EMA 50") plot(ema_4, color=color.red, title="EMA 100") // Entry Conditions longCondition = ta.crossover(ema_1, ema_4) and ta.crossover(ema_2, ema_3) and rsi > 50 and macdLine > signalLine shortCondition = ta.crossunder(ema_1, ema_4) and ta.crossunder(ema_2, ema_3) and rsi < 50 and macdLine < signalLine // Declare Stop Loss and Take Profit Variables var float stopLossPrice = na var float takeProfitPrice = na var line stopLossLine = na var line takeProfitLine = na // Long Trade if (longCondition) strategy.entry("Buy", strategy.long) stopLossPrice := strategy.position_avg_price * (1 - stopLossPct) takeProfitPrice := strategy.position_avg_price * (1 + takeProfitPct) // stopLossLine := line.new(bar_index, stopLossPrice, bar_index + 1, stopLossPrice, color=color.red, width=2, style=line.style_dotted) // takeProfitLine := line.new(bar_index, takeProfitPrice, bar_index + 1, takeProfitPrice, color=color.green, width=2, style=line.style_dotted) // Short Trade if (shortCondition) strategy.entry("Sell", strategy.short) stopLossPrice := strategy.position_avg_price * (1 + stopLossPct) takeProfitPrice := strategy.position_avg_price * (1 - takeProfitPct) // stopLossLine := line.new(bar_index, stopLossPrice, bar_index + 1, stopLossPrice, color=color.red, width=2, style=line.style_dotted) // takeProfitLine := line.new(bar_index, takeProfitPrice, bar_index + 1, takeProfitPrice, color=color.green, width=2, style=line.style_dotted) // Clear Lines on Trade Exit // if (strategy.position_size == 0) // line.delete(stopLossLine) // line.delete(takeProfitLine) // Exit Trades if (strategy.position_size > 0) strategy.exit("Sell", from_entry="Buy", stop=stopLossPrice, limit=takeProfitPrice) if (strategy.position_size < 0) strategy.exit("Cover", from_entry="Sell", stop=stopLossPrice, limit=takeProfitPrice)