
Chiến lược này là một hệ thống giao dịch định lượng kết hợp nhiều chỉ số di chuyển trung bình (EMA), chỉ số tương đối mạnh (RSI) và chỉ số phân tán xu hướng trung bình di chuyển (MACD). Chiến lược này tạo thành một khung quyết định giao dịch hoàn chỉnh thông qua sự phối hợp hợp của nhiều chỉ số kỹ thuật. Chiến lược sử dụng bốn đường EMA 10, 20, 50 và 100 ngày làm công cụ định hướng chính và kết hợp RSI và MACD làm chỉ số xác nhận phụ trợ, đồng thời thiết lập các chỉ số dừng lỗ và dừng để kiểm soát rủi ro.
Logic cốt lõi của chiến lược này dựa trên các yếu tố chính sau:
Đây là một chiến lược giao dịch định lượng được thiết kế hợp lý, logic nghiêm ngặt. Bằng cách sử dụng kết hợp nhiều chỉ số kỹ thuật, nó có thể nắm bắt được xu hướng thị trường một cách hiệu quả và có cơ chế kiểm soát rủi ro hoàn hảo.
/*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)