
Chiến lược Trading VMA là một chiến lược giao dịch định lượng dựa trên các đường trung bình di chuyển biến động. Chiến lược này sử dụng các đường trung bình di chuyển biến động để nắm bắt xu hướng thị trường và tạo ra tín hiệu giao dịch.
Cốt lõi của chiến lược VMA là tính toán trung bình di chuyển có độ dài thay đổi. Trung bình di chuyển là một chỉ số kỹ thuật phổ biến, nó tính toán giá trung bình trong một chu kỳ nhất định.
Cụ thể, chiến lược này đầu tiên tính toán một loạt các số liệu trung gian, chẳng hạn như chỉ số chuyển động hướng giá (PDM, MDIM), dữ liệu xử lý trơn tru (PDMs, MDMs). Dữ liệu này cuối cùng được sử dụng để có được cường độ của chỉ số (iS). Chỉ số này phản ánh mức độ biến động giá.
Sau đó, chiến lược TradingVMA sẽ thay đổi chiều dài của đường trung bình di chuyển tùy theo cường độ của chỉ số. Khi thị trường biến động, chu kỳ của đường trung bình di chuyển sẽ ngắn hơn và ngược lại, chu kỳ sẽ dài hơn.
Cuối cùng, chiến lược so sánh giá hiện tại với kích thước của VMA, tạo ra tín hiệu giao dịch. Đặt nhiều khi giá cao hơn VMA và bỏ trống khi giá thấp hơn VMA.
Chiến lược giao dịch VMA có những ưu điểm chính sau:
Chu kỳ biến động Filters Noise ổn định hơn - Chu kỳ trung bình di chuyển biến động được điều chỉnh theo sự thay đổi của thị trường, có thể lọc tiếng ồn và có được tín hiệu xu hướng ổn định hơn.
Đáp ứng nhanh với sự thay đổi giá Improves Responsiveness - Đường trung bình di chuyển biến động có thể phản ứng nhanh với sự thay đổi giá, nắm bắt các điểm biến của xu hướng mới.
Giảm tần suất giao dịch Reduce Overtrading - TradingVMA có thể làm giảm số lần giao dịch không cần thiết so với chỉ số chu kỳ cố định.
Các tham số có thể tùy chỉnh Flexible Parameters - Chính sách này cho phép người dùng chọn tham số theo sở thích của họ, thích ứng với các môi trường thị trường khác nhau.
Chiến lược giao dịch VMA cũng có những rủi ro chính sau:
Miss Rapid Reversals - Khi xu hướng thay đổi nhanh chóng, trung bình di chuyển được điều chỉnh liên tục có thể trì hoãn phản ứng.
Lagging Bias ảnh hưởng bởi sai lệch theo dõi - Tất cả các chiến lược trung bình di chuyển đều có một mức độ sai lệch theo dõi
Lỗi tín hiệu đa trống - Trong thị trường được sắp xếp ngang, TradingVMA có thể tạo ra tín hiệu đa trống sai.
Khó khăn trong việc tối ưu hóa tham số - Tìm ra sự kết hợp tham số tối ưu có thể khó khăn hơn.
Những rủi ro này có thể được kiểm soát bằng cách dừng lỗ, điều chỉnh các tham số.
Chiến lược VMA giao dịch cũng có thể được tối ưu hóa theo một số hướng sau:
Kết hợp các chỉ số khác - Sử dụng kết hợp các chỉ số khác như xu hướng, xu hướng đảo ngược có thể cải thiện chất lượng tín hiệu.
Parameter Optimization - Tìm các tham số tối ưu thông qua lịch sử và tham số tối ưu.
Quy tắc giao dịch thích ứng (Adaptive Trading Rules) - áp dụng các quy tắc mở vị trí, dừng lỗ khác nhau theo các điều kiện thị trường khác nhau.
Hệ thống hóa giao dịch thuật toán - Hệ thống hóa và hệ thống hóa chiến lược để có thể đo lường và tối ưu hóa.
Trading VMA là một chiến lược định lượng tự thích ứng. Nó sử dụng các chỉ số VMA được thiết kế đặc biệt để nắm bắt xu hướng thị trường, có lợi thế là phản ứng nhanh, lọc tiếng ồn. Chiến lược này có thể được tối ưu hóa bằng nhiều cách để có được hiệu suất tốt hơn.
/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-24 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © laptevmaxim92
//@version=4
strategy("Variable Moving Average Strategy", overlay=true)
src=close
l =input(5, title="VMA Length")
std=input(true, title="Show Trend Direction Colors")
utp = input(false, "Use take profit?")
pr = input(100, "Take profit pips")
usl = input(false, "Use stop loss?")
sl = input(100, "Stop loss pips")
fromday = input(01, defval=01, minval=01, maxval=31, title="From Day")
frommonth = input(01, defval=01, minval= 01, maxval=12, title="From Month")
fromyear = input(2000, minval=1900, maxval=2100, title="From Year")
today = input(31, defval=01, minval=01, maxval=31, title="To Day")
tomonth = input(12, defval=12, minval=01, maxval=12, title="To Month")
toyear = input(2019, minval=1900, maxval=2100, title="To Year")
use_date = (time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 00, 00))
k = 1.0/l
pdm = 0.0
pdm := max((src - src[1]), 0)
mdm = 0.0
mdm := max((src[1] - src), 0)
pdmS = 0.0
pdmS := ((1 - k)*nz(pdmS[1]) + k*pdm)
mdmS = 0.0
mdmS := ((1 - k)*nz(mdmS[1]) + k*mdm)
s = pdmS + mdmS
pdi = pdmS/s
mdi = mdmS/s
pdiS = 0.0
pdiS := ((1 - k)*nz(pdiS[1]) + k*pdi)
mdiS = 0.0
mdiS := ((1 - k)*nz(mdiS[1]) + k*mdi)
d = abs(pdiS - mdiS)
s1 = pdiS + mdiS
iS = 0.0
iS := ((1 - k)*nz(iS[1]) + k*d/s1)
hhv = highest(iS, l)
llv = lowest(iS, l)
d1 = hhv - llv
vI = (iS - llv)/d1
vma = 0.0
vma := (1 - k*vI)*nz(vma[1]) + k*vI*src
vmaC=(vma > vma[1]) ? color.lime : (vma<vma[1]) ? color.red : (vma==vma[1]) ? color.yellow : na
plot(vma, color=std?vmaC:color.white, linewidth=3, title="VMA")
longCondition = vma > vma[1]
if (longCondition)
strategy.entry("BUY", strategy.long and use_date)
shortCondition = vma < vma[1]
if (shortCondition)
strategy.entry("SELL", strategy.short and use_date)
if (utp and not usl)
strategy.exit("TP", "BUY", profit = pr)
strategy.exit("TP", "SELL", profit = pr)
if (usl and not utp)
strategy.exit("SL", "BUY", loss = sl)
strategy.exit("SL", "SELL", loss = sl)
if (usl and utp)
strategy.exit("TP/SL", "BUY", loss = sl, profit = pr)
strategy.exit("TP/SL", "SELL", loss = sl, profit = pr)