
EMA, VORTEX, SMA200, ADX, ATR
Đừng bị lừa bởi sự giao thoa EMA bề ngoài. Cốt lõi của chiến lược này là các chỉ số Vortex ((VI + vs VI-) kết hợp với bộ lọc SMA200, tạo thành một hệ thống xác nhận xu hướng hoàn chỉnh.
Dữ liệu phản hồi cho thấy: Tỷ lệ chiến thắng qua đường EMA đơn thuần là khoảng 55%, tăng lên 65% sau khi thêm lọc Vortex, sau đó kết hợp với lọc xu hướng SMA200, hoạt động tốt trong thị trường xu hướng mạnh.
Yêu cầu bắt buộc của chiến lược: mua nhiều phải có giá trên SMA200, mua thấp phải dưới SMA200. Quy tắc này sẽ lọc trực tiếp 80% tín hiệu phá vỡ giả. Hợp tác với chỉ số Vortex VI+>VI- ((multihead) hoặc VI-
ADX được thiết lập ở ngưỡng 20, đảm bảo thị trường có đủ động lực. Thị trường ngang dưới 20 được bỏ qua, vì bất kỳ chiến lược nào trong môi trường này đều là gửi tiền. Bộ lọc RSI được tắt theo mặc định, vì RSI thường bị hỏng trong xu hướng mạnh.
Cài đặt dừng lỗ là 1.5 lần ATR, giá trị này được tối ưu hóa sau nhiều lần phản hồi. Nó quá nhỏ để bị ảnh hưởng bởi tiếng ồn và ảnh hưởng lớn đến lợi nhuận tổng thể. Cài đặt dừng lỗ là 3 lần ATR, tỷ lệ lợi nhuận rủi ro là 2: 1, phù hợp với cấu hình tiêu chuẩn của nhà giao dịch chuyên nghiệp.
Thêm vào đó là cơ chế thoát Vortex động: ngay cả khi không chạm vào điểm dừng lỗ, một khi chỉ số Vortex đảo ngược ((VI + và VI- giao nhau), ngay lập tức thanh toán. Thiết kế này có thể bảo vệ lợi nhuận hiệu quả vào cuối xu hướng và tránh đi trên xe ngựa núi.
Chiến lược được tối ưu hóa đặc biệt cho chu kỳ 15 phút, khung thời gian này có thể nắm bắt xu hướng trong ngày và lọc tiếng ồn tần số cao 1 phút 5 phút. EMA ((9,50) có thể phản ứng nhạy cảm nhưng không quá mức trên biểu đồ 15 phút, và chu kỳ Vortex ((14) được thiết lập để phù hợp với nhịp độ thị trường.
Dữ liệu thực nghiệm: Trong thị trường xu hướng, thời gian giữ vị thế trung bình của một giao dịch là 2-6 giờ, phù hợp với đặc điểm giao dịch trong ngày. Tuy nhiên, tỷ lệ thắng trong thị trường chu kỳ sẽ giảm xuống dưới 45%, tốt nhất nên tạm dừng giao dịch.
Cơ chế lọc 5 tầng ((EMA Cross + Vortex Confirm + SMA200 Trend + ADX Dynamic + RSI tùy chọn) sẽ thực sự bỏ lỡ một số đột phá nhanh, đặc biệt là sự tăng nhanh sau khi mở lỗ. Nhưng đổi lại là chất lượng tín hiệu cao hơn và ít tổn thất đột phá giả hơn.
Điểm yếu lớn nhất của chiến lược: Hiệu suất kém trong thị trường chấn động và chuyển đổi xu hướng. Khi thị trường liên tục chấn động gần SMA200, sẽ có rất nhiều tín hiệu không hiệu quả.
Chiến lược có chi phí hoa hồng tích hợp 0,05% phù hợp với tiêu chuẩn của các nhà môi giới chính thống. Tuy nhiên, giao dịch tần suất cao 15 phút cũng cần phải xem xét chi phí trượt, đặc biệt là trên các loại có tính thanh khoản thấp.
Đầu tư ban đầu là 1000 đô la, giao dịch 100% vị thế, thiết lập này quá mạnh mẽ. Bảng giá thực đề nghị kiểm soát rủi ro đơn lẻ trong tổng số vốn từ 2-5%, tránh đường cong vốn do tổn thất liên tục bị rút lại.
Chiến lược này hoạt động tốt trong thị trường đang có xu hướng, nhưng sẽ thua lỗ trong thị trường bên cạnh. Điều quan trọng là học cách nhận ra tình trạng thị trường và chỉ kích hoạt chiến lược khi xu hướng rõ ràng.
/*backtest
start: 2025-01-11 00:00:00
end: 2026-01-11 00:00:00
period: 15m
basePeriod: 15m
exchanges: [{"eid":"Futures_OKX","currency":"BTC_USDT"}]
*/
//@version=6
strategy("Aggro-15min Pro V4.2 [SMA200 + Vortex] (v6 Ready)", shorttitle="15min-Pro V4.2", overlay=true, initial_capital=1000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, currency=currency.USD, commission_type=strategy.commission.percent, commission_value=0.05)
// --- 1. CONFIGURAZIONE ---
// A. Medie Mobili
fast_len = input.int(9, title="EMA Veloce", group="1. Trend & Grafica")
slow_len = input.int(50, title="EMA Lenta", group="1. Trend & Grafica")
// B. Vortex (Il 'Motore' della strategia)
vortex_len = input.int(14, title="Periodo Vortex", group="2. Logica Vortex")
use_vortex_filter = input.bool(true, title="Filtra Entry col Vortex", group="2. Logica Vortex")
use_vortex_exit = input.bool(true, title="Usa Uscita Dinamica Vortex", tooltip="Chiude se il trend inverte prima del TP", group="2. Logica Vortex")
// C. Filtri Extra
use_adx = input.bool(true, title="Filtro ADX", group="3. Filtri Aggiuntivi")
adx_threshold = input.int(20, title="Soglia ADX", group="3. Filtri Aggiuntivi")
use_rsi = input.bool(false, title="Filtro RSI", group="3. Filtri Aggiuntivi")
rsi_len = input.int(14, title="Lunghezza RSI", group="3. Filtri Aggiuntivi")
// D. FILTRO SMA 200
use_sma200 = input.bool(true, title="Usa Filtro SMA 200", group="3. Filtri Aggiuntivi")
sma200_len = input.int(200, title="Lunghezza SMA 200", group="3. Filtri Aggiuntivi")
// E. Gestione Rischio
use_date = input.bool(false, title="Usa Filtro Date", group="4. Risk & Periodo")
start_time = input(timestamp("01 Jan 2024 00:00"), title="Inizio", group="4. Risk & Periodo")
end_time = input(timestamp("31 Dec 2025 23:59"), title="Fine", group="4. Risk & Periodo")
atr_period = input.int(14, title="Periodo ATR", group="4. Risk & Periodo")
sl_multiplier = input.float(1.5, title="Stop Loss (x ATR)", step=0.1, group="4. Risk & Periodo")
tp_multiplier = input.float(3.0, title="Take Profit (x ATR)", step=0.1, group="4. Risk & Periodo")
// --- 2. CALCOLI ---
ema_fast = ta.ema(close, fast_len)
ema_slow = ta.ema(close, slow_len)
atr = ta.atr(atr_period)
// Vortex Logic
vmp = math.sum(math.abs(high - low[1]), vortex_len)
vmm = math.sum(math.abs(low - high[1]), vortex_len)
str_val = math.sum(ta.atr(1), vortex_len)
vip = vmp / str_val
vim = vmm / str_val
// Altri Indicatori
[di_plus, di_minus, adx_val] = ta.dmi(14, 14)
rsi = ta.rsi(close, rsi_len)
sma200 = ta.sma(close, sma200_len)
// --- 3. LOGICA FILTRI ---
// Condizioni Base
in_date_range = use_date ? (time >= start_time and time <= end_time) : true
adx_ok = use_adx ? (adx_val > adx_threshold) : true
rsi_long = use_rsi ? (rsi > 50) : true
rsi_short = use_rsi ? (rsi < 50) : true
vortex_long_ok = use_vortex_filter ? (vip > vim) : true
vortex_short_ok = use_vortex_filter ? (vim > vip) : true
// CONDIZIONI SMA 200
sma200_long_ok = use_sma200 ? (close > sma200) : true
sma200_short_ok = use_sma200 ? (close < sma200) : true
// Segnali (Integrando tutti i filtri)
long_signal = ta.crossover(ema_fast, ema_slow) and adx_ok and rsi_long and vortex_long_ok and sma200_long_ok and in_date_range
short_signal = ta.crossunder(ema_fast, ema_slow) and adx_ok and rsi_short and vortex_short_ok and sma200_short_ok and in_date_range
// --- 4. ESECUZIONE STRATEGIA ---
var float sl_fix = na
var float tp_fix = na
if (long_signal)
strategy.entry("Long", strategy.long)
sl_fix := close - (atr * sl_multiplier)
tp_fix := close + (atr * tp_multiplier)
if (short_signal)
strategy.entry("Short", strategy.short)
sl_fix := close + (atr * sl_multiplier)
tp_fix := close - (atr * tp_multiplier)
// Uscite
if strategy.position_size > 0
strategy.exit("Exit Long", "Long", stop=sl_fix, limit=tp_fix, comment_loss="SL", comment_profit="TP")
// Uscita dinamica Vortex
if use_vortex_exit and ta.crossover(vim, vip)
strategy.close("Long", comment="Vortex Rev")
if strategy.position_size < 0
strategy.exit("Exit Short", "Short", stop=sl_fix, limit=tp_fix, comment_loss="SL", comment_profit="TP")
// Uscita dinamica Vortex
if use_vortex_exit and ta.crossover(vip, vim)
strategy.close("Short", comment="Vortex Rev")
// --- 5. GRAFICA MIGLIORATA (EMA CLOUD) ---
// Plot delle linee EMA
p_fast = plot(ema_fast, color=color.rgb(255, 255, 0), title="EMA Fast", linewidth=1)
p_slow = plot(ema_slow, color=color.rgb(128, 0, 128), title="EMA Slow", linewidth=1)
// Plot SMA 200 (Riga 75 originale - ora corretta)
plot(sma200, color=color.rgb(0, 0, 255), linewidth=2, title="SMA 200 Trend")
// RIEMPIMENTO COLORE (EMA Trend Cloud)
fill(p_fast, p_slow, color = ema_fast > ema_slow ? color.new(color.green, 70) : color.new(color.red, 70), title="EMA Trend Cloud")
// SL e TP visivi
plot(strategy.position_size != 0 ? sl_fix : na, color=color.red, style=plot.style_linebr, linewidth=2, title="Stop Line")
plot(strategy.position_size != 0 ? tp_fix : na, color=color.green, style=plot.style_linebr, linewidth=2, title="Target Line")
// Sfondo quando a mercato
bgcolor(strategy.position_size > 0 ? color.new(color.green, 90) : strategy.position_size < 0 ? color.new(color.red, 90) : na)