Chiến lược TradingVMA là một chiến lược giao dịch định lượng dựa trên các đường trung bình động biến. Nó sử dụng các đường trung bình động thay đổi để nắm bắt xu hướng thị trường và tạo ra các tín hiệu giao dịch phù hợp.
Trọng tâm của chiến lược TradingVMA là tính toán các đường trung bình động có độ dài biến đổi (Variable Moving Average, VMA).
Cụ thể, chiến lược đầu tiên tính toán một loạt các số lượng trung gian, chẳng hạn như Chỉ số chuyển động theo hướng giá (PDM, MDIM), dữ liệu làm mịn (PDM, MDM). Dữ liệu này cuối cùng được sử dụng để có được sức mạnh chỉ số (iS). Chỉ số này phản ánh cường độ biến động giá.
Sau đó, chiến lược TradingVMA điều chỉnh động thời gian trung bình động dựa trên sức mạnh của chỉ số. Khi biến động thị trường tăng, thời gian trung bình động trở nên ngắn hơn và ngược lại. Điều này cho phép phản ứng nhanh hơn với những thay đổi của thị trường.
Cuối cùng, chiến lược so sánh giá hiện tại với VMA để tạo ra tín hiệu giao dịch.
Chiến lược TradingVMA có những lợi thế chính sau:
Thời gian biến thể lọc tiếng ồn ổn định hơn
Phản ứng nhanh hơn đối với sự thay đổi giá cải thiện khả năng đáp ứng
Giảm tần suất giao dịch Ít giao dịch quá mức - So với các chỉ số định kỳ, TradingVMA có thể giảm các giao dịch không cần thiết.
Độ linh hoạt của các tham số tùy chỉnh - Chiến lược cho phép người dùng chọn các tham số dựa trên sở thích của họ để phù hợp với môi trường thị trường khác nhau.
Chiến lược TradingVMA cũng có những rủi ro chính sau:
Không có sự đảo ngược nhanh
Sự thiên vị chậm trễ
Các tín hiệu sai
Khó khăn tối ưu hóa tham số
Những rủi ro này có thể được kiểm soát thông qua các phương pháp như dừng lỗ, điều chỉnh sự kết hợp các tham số, v.v.
Chiến lược TradingVMA cũng có thể được cải thiện trong các khía cạnh sau:
Kết hợp các chỉ số khác
Parameter Optimization
Quy tắc giao dịch thích nghi
Hệ thống hóa
TradingVMA là một chiến lược định lượng thích nghi. Nó nắm bắt xu hướng thị trường bằng cách sử dụng một chỉ số VMA được thiết kế đặc biệt, với lợi thế là đáp ứng và lọc ra tiếng ồn. Chiến lược có thể được nâng cấp theo nhiều cách để 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)