
Chiến lược giao dịch đa mục tiêu trung bình di chuyển hai chỉ số là một hệ thống giao dịch định lượng dựa trên tín hiệu chéo giữa trung bình di chuyển chỉ số ngắn hạn và dài hạn (EMA). Chiến lược này sử dụng chéo của EMA 9 chu kỳ và 21 chu kỳ làm tín hiệu đầu vào, đồng thời đặt tối đa 10 mục tiêu lợi nhuận và điểm dừng lỗ để quản lý rủi ro và tối đa hóa lợi nhuận. Chiến lược này đồng thời hỗ trợ giao dịch hai chiều đa khung, mở nhiều khi EMA ngắn hạn đi qua EMA dài hạn, trống khi EMA ngắn hạn đi qua EMA dài hạn và thoát ra khi chéo ngược.
Các nguyên tắc cốt lõi của chiến lược này dựa trên hệ thống chéo trung bình di chuyển chỉ số, được thực hiện như sau:
Chiến lược này sử dụng phương pháp quản lý rủi ro có hệ thống, sử dụng tiền tài khoản 10% cho mỗi giao dịch theo mặc định, với số tiền ban đầu là 100.000, và cấm hoạt động gia tăng rủi ro.
Để giảm thiểu những rủi ro này, khuyến nghị giới thiệu các điều kiện lọc bổ sung, chẳng hạn như chỉ số cường độ xu hướng, và xem xét điều chỉnh các điểm dừng và mục tiêu tùy theo động thái biến động của thị trường.
Thông qua các tối ưu hóa này, có thể cải thiện đáng kể tính ổn định và lợi nhuận của chiến lược, giảm tần suất rút và giao dịch thua lỗ.
Chiến lược giao dịch đa mục tiêu của đường trung bình di chuyển hai chỉ số là một hệ thống giao dịch định lượng có cấu trúc rõ ràng, logic đơn giản, dựa trên tín hiệu giao dịch EMA cổ điển và được hỗ trợ bởi các thiết lập quản lý lợi nhuận và dừng lỗ đa mục tiêu. Chiến lược này phù hợp với giao dịch xu hướng ngắn hạn và trung bình, hoạt động tốt hơn trong thị trường xu hướng rõ ràng.
Mặc dù thiết kế chiến lược tương đối đơn giản, nhưng nó bao gồm các yếu tố cốt lõi của chiến lược giao dịch: tín hiệu vào, điều kiện ra, quản lý lỗ hổng và mục tiêu lợi nhuận. Ưu điểm chính của chiến lược là hoạt động rõ ràng, dễ hiểu và thực hiện, đồng thời cung cấp hỗ trợ hình ảnh tốt.
Tuy nhiên, chiến lược cũng có những hạn chế như phụ thuộc vào chỉ số duy nhất, thiếu nhận diện môi trường thị trường và quản lý vốn không đủ linh hoạt. Chiến lược này có không gian tối ưu hóa lớn bằng cách thêm bộ lọc xu hướng, tối ưu hóa cơ chế dừng lỗ, thực hiện lợi nhuận thực sự và cải thiện phương pháp quản lý vốn.
Đối với các nhà giao dịch, chiến lược này có thể được sử dụng như một khuôn khổ cơ bản để điều chỉnh và tối ưu hóa cá nhân dựa trên sở thích rủi ro cá nhân và đặc điểm của loại giao dịch để đạt được hiệu quả giao dịch tốt hơn.
/*backtest
start: 2024-08-21 00:00:00
end: 2025-08-20 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_OKX","currency":"BNB_USDT","balance":5000}]
*/
//@version=5
strategy("9/21 EMA with 10 Targets + Stoploss",
overlay = true,
initial_capital = 100000,
default_qty_type = strategy.percent_of_equity,
default_qty_value = 10,
pyramiding = 0)
// === Inputs ===
emaFastLen = input.int(9, "Fast EMA Length")
emaSlowLen = input.int(21, "Slow EMA Length")
slPercent = input.float(0.5, "Stoploss %", step=0.1)
// 10 Targets
tp1Percent = input.float(0.5, "Target 1 %", step=0.1)
tp2Percent = input.float(1.0, "Target 2 %", step=0.1)
tp3Percent = input.float(1.5, "Target 3 %", step=0.1)
tp4Percent = input.float(2.0, "Target 4 %", step=0.1)
tp5Percent = input.float(2.5, "Target 5 %", step=0.1)
tp6Percent = input.float(3.0, "Target 6 %", step=0.1)
tp7Percent = input.float(3.5, "Target 7 %", step=0.1)
tp8Percent = input.float(4.0, "Target 8 %", step=0.1)
tp9Percent = input.float(4.5, "Target 9 %", step=0.1)
tp10Percent = input.float(5.0, "Target 10 %", step=0.1)
// === EMA Calculation ===
emaFast = ta.ema(close, emaFastLen)
emaSlow = ta.ema(close, emaSlowLen)
// === Entry Conditions ===
longCond = ta.crossover(emaFast, emaSlow)
shortCond = ta.crossunder(emaFast, emaSlow)
// === Entry ===
if (longCond and strategy.position_size <= 0)
strategy.entry("BUY", strategy.long)
if (shortCond and strategy.position_size >= 0)
strategy.entry("SELL", strategy.short)
// === Series Variables for Targets ===
var float tp1 = na
var float tp2 = na
var float tp3 = na
var float tp4 = na
var float tp5 = na
var float tp6 = na
var float tp7 = na
var float tp8 = na
var float tp9 = na
var float tp10 = na
var float stopLevel = na
// === Long Positions ===
if strategy.position_size > 0
stopLevel := strategy.position_avg_price * (1 - slPercent/100)
tp1 := strategy.position_avg_price * (1 + tp1Percent/100)
tp2 := strategy.position_avg_price * (1 + tp2Percent/100)
tp3 := strategy.position_avg_price * (1 + tp3Percent/100)
tp4 := strategy.position_avg_price * (1 + tp4Percent/100)
tp5 := strategy.position_avg_price * (1 + tp5Percent/100)
tp6 := strategy.position_avg_price * (1 + tp6Percent/100)
tp7 := strategy.position_avg_price * (1 + tp7Percent/100)
tp8 := strategy.position_avg_price * (1 + tp8Percent/100)
tp9 := strategy.position_avg_price * (1 + tp9Percent/100)
tp10 := strategy.position_avg_price * (1 + tp10Percent/100)
strategy.exit("Exit Long", "BUY", stop=stopLevel, limit=tp1)
// === Short Positions ===
if strategy.position_size < 0
stopLevel := strategy.position_avg_price * (1 + slPercent/100)
tp1 := strategy.position_avg_price * (1 - tp1Percent/100)
tp2 := strategy.position_avg_price * (1 - tp2Percent/100)
tp3 := strategy.position_avg_price * (1 - tp3Percent/100)
tp4 := strategy.position_avg_price * (1 - tp4Percent/100)
tp5 := strategy.position_avg_price * (1 - tp5Percent/100)
tp6 := strategy.position_avg_price * (1 - tp6Percent/100)
tp7 := strategy.position_avg_price * (1 - tp7Percent/100)
tp8 := strategy.position_avg_price * (1 - tp8Percent/100)
tp9 := strategy.position_avg_price * (1 - tp9Percent/100)
tp10 := strategy.position_avg_price * (1 - tp10Percent/100)
strategy.exit("Exit Short", "SELL", stop=stopLevel, limit=tp1)
// === Plotting ===
plot(emaFast, "EMA 9", color=color.yellow, linewidth=2)
plot(emaSlow, "EMA 21", color=color.orange, linewidth=2)
// Global plots (avoid local scope error)
plot(tp1, "TP1", color=color.new(color.green, 0))
plot(tp2, "TP2", color=color.new(color.green, 10))
plot(tp3, "TP3", color=color.new(color.green, 20))
plot(tp4, "TP4", color=color.new(color.green, 30))
plot(tp5, "TP5", color=color.new(color.green, 40))
plot(tp6, "TP6", color=color.new(color.green, 50))
plot(tp7, "TP7", color=color.new(color.green, 60))
plot(tp8, "TP8", color=color.new(color.green, 70))
plot(tp9, "TP9", color=color.new(color.green, 80))
plot(tp10, "TP10", color=color.new(color.green, 90))
plot(stopLevel, "Stoploss", color=color.red, linewidth=2)
// Entry Signals
plotshape(longCond, title="BUY Signal", style=shape.labelup, color=color.green, text="BUY")
plotshape(shortCond, title="SELL Signal", style=shape.labeldown, color=color.red, text="SELL")