
Chiến lược này là một hệ thống phân tích tổng hợp kết hợp nhiều chỉ số, chủ yếu dựa trên chỉ số VAWSI, chỉ số liên tục xu hướng và ATR sửa đổi để đánh giá xu hướng thị trường và điểm đảo ngược có thể. Chiến lược này cũng giới thiệu tính toán chiều dài động để thích ứng với các điều kiện thị trường khác nhau. Nó quản lý rủi ro bằng cách thiết lập các điểm dừng và lợi nhuận động và giao dịch khi nhận ra tín hiệu đảo ngược tiềm năng.
Cốt lõi của chiến lược này là đo lường cường độ, thời gian và biến động của xu hướng thị trường thông qua một số chỉ số tùy chỉnh để tìm thời gian giao dịch tốt nhất. Nó đặc biệt phù hợp với thị trường có xu hướng rõ ràng, nhưng cũng bao gồm các cơ chế thích ứng để xử lý các tình trạng thị trường khác nhau.
Chỉ số VAWSI: Đây là một chỉ số nguyên thủy, tương tự như RSI, nhưng sử dụng VAWMA (về khối lượng và ATR trung bình chuyển động trọng lượng) thay vì RMA. Nó đo lường cường độ của xu hướng mới nổi.
Chỉ số liên tục xu hướng: Một chỉ số khác được tạo ra để đo thời gian kéo dài của xu hướng. Nó tính toán độ lệch lớn nhất của dữ liệu nguồn với điểm cao nhất / thấp nhất trong độ dài được chỉ định, sau đó tích lũy độ lệch này và tạo ra một chỉ số cường độ.
Bản sửa đổi ATR: lấy giá trị tối đa của high-low và source-source trước đó, sau đó lấy giá trị tuyệt đối của sự thay đổi của nó và thống nhất với dữ liệu nguồn.
Tính năng tính chiều dài: Sử dụng phương pháp tính chiều dài động của BlackCat1402, điều chỉnh tham số chiều dài của chỉ số theo điều kiện thị trường.
Phân tích tổng hợp: Kết hợp các bài đọc của VAWSI, xu hướng liên tục và ATR để tạo ra một chỉ số tổng hợp. Số lượng cuối cùng thấp hơn cho thấy sự đảo ngược sắp xảy ra, số lượng cao hơn cho thấy thị trường không ổn định hoặc chấn động.
Động thái dừng / lợi nhuận: mức dừng và lợi nhuận động dựa trên chỉ số tổng hợp và hướng xu hướng hiện tại.
Tín hiệu giao dịch: Khi giá hoàn toàn vượt qua mốc giá được tính toán, hệ thống sẽ xác nhận giao dịch và tạo tín hiệu giao dịch.
Phân tích đa chiều: Bằng cách kết hợp nhiều chỉ số, chiến lược có thể phân tích thị trường từ nhiều góc độ khác nhau, tăng độ chính xác của phán đoán.
Khả năng thích ứng: tính toán chiều dài động cho phép chiến lược thích ứng với các điều kiện thị trường khác nhau, tăng tính linh hoạt của chiến lược.
Quản lý rủi ro: Các thiết lập dừng lỗ và lợi nhuận động giúp kiểm soát rủi ro tốt hơn và thích ứng với sự thay đổi của thị trường.
Chỉ số nguyên thủy: Chỉ số VAWSI và xu hướng liên tục cung cấp thông tin thị trường độc đáo, có thể bắt được các tín hiệu mà các chỉ số truyền thống bỏ qua.
Ngăn chặn tái vẽ: Sử dụng barstate.isconfirmed để đảm bảo tín hiệu không bị tái vẽ, cải thiện độ chính xác của phản hồi.
Tính tùy chỉnh: Nhiều tham số có thể được điều chỉnh để chiến lược có thể thích ứng với các loại giao dịch và khung thời gian khác nhau.
Tối ưu hóa quá mức: Một số lượng lớn các tham số có thể dẫn đến tối ưu hóa quá mức, không hoạt động tốt trong giao dịch trên đĩa thực.
Thị trường thích ứng: Mặc dù hoạt động tốt trong một số thị trường, nhưng có thể không áp dụng cho tất cả các điều kiện thị trường, đặc biệt là trong thị trường có biến động thấp.
Sự phức tạp: Sự phức tạp của các chiến lược có thể khiến chúng khó hiểu và bảo trì, tăng nguy cơ sai sót trong hoạt động.
Tính toán chuyên sâu: Nhiều chỉ số tùy chỉnh và tính toán động có thể dẫn đến khối lượng tính toán cao, ảnh hưởng đến tốc độ thực hiện.
Tùy thuộc vào dữ liệu lịch sử: Chiến lược sử dụng một lượng lớn dữ liệu lịch sử để tính toán, trong một số trường hợp có thể dẫn đến chậm trễ.
Tối ưu hóa tham số: Sử dụng thuật toán học máy để tối ưu hóa các tham số trọng lượng và chiều dài khác nhau để cải thiện hiệu suất của chiến lược trong các điều kiện thị trường khác nhau.
Nhận dạng trạng thái thị trường: thêm mô-đun nhận dạng trạng thái thị trường để tự động điều chỉnh các tham số chiến lược trong các môi trường thị trường khác nhau.
Bộ lọc tín hiệu: giới thiệu các cơ chế lọc bổ sung, chẳng hạn như ngưỡng cường độ xu hướng, để giảm tín hiệu giả.
Phân tích lượng giao dịch: Phân tích sâu hơn về lượng giao dịch, có thể giới thiệu nhận dạng hình thức giao dịch để tăng cường độ tin cậy của tín hiệu.
Phân tích nhiều khung thời gian: tích hợp các tín hiệu từ nhiều khung thời gian để cải thiện sự ổn định của quyết định giao dịch.
Tối ưu hóa quản lý rủi ro: thực hiện các chiến lược quản lý rủi ro phức tạp hơn, chẳng hạn như kích thước vị trí động và dừng nhiều cấp.
Hiệu quả tính toán: Tối ưu hóa mã để tăng hiệu quả tính toán, đặc biệt là khi xử lý một lượng lớn dữ liệu lịch sử.
VAWSI và chiến lược đảo ngược xu hướng liên tục là một hệ thống giao dịch phức tạp và toàn diện, kết hợp nhiều chỉ số sáng tạo và điều chỉnh các tham số động. Ưu điểm của nó là phân tích thị trường đa chiều và khả năng tự điều chỉnh, cho phép nó tìm kiếm các cơ hội đảo ngược tiềm năng trong các điều kiện thị trường khác nhau. Tuy nhiên, sự phức tạp của chiến lược cũng mang lại những thách thức về quá trình tối ưu hóa và thích ứng.
Chiến lược này có tiềm năng trở thành một công cụ giao dịch mạnh mẽ thông qua việc tối ưu hóa thêm, đặc biệt là trong điều chỉnh tham số, nhận diện trạng thái thị trường và quản lý rủi ro. Tuy nhiên, người dùng nên lưu ý rằng không có chiến lược nào là hoàn hảo và cần phải được giám sát và điều chỉnh liên tục. Trong ứng dụng thực tế, nên thử nghiệm đầy đủ trên tài khoản mô phỏng và kết hợp với các công cụ phân tích khác và kiến thức thị trường để đưa ra quyết định giao dịch.
/*backtest
start: 2024-05-21 00:00:00
end: 2024-06-20 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("VAWSI and Trend Persistance Reversal", overlay=true, max_bars_back = 4999, process_orders_on_close = true)
//INPUTS
sltp = input.float(title = "Minimum SL/TP", defval = 5.0)
rsi_weight = input.float(title = "Wawsi weight", defval = 100.0)
half_weight= input.float(title = "Trend Persistence Weight", defval = 79.0)
atr_weight = input.float(title = "ATR Weight", defval = 20.0)
com_mult = input.float(title = "Combination Mult", defval = 1, step = .001)
smoothing = input.int(title = "Trend Persistence smooth length", defval = 3)
CycPart = input.float(1.1, step = .001, title = "Length Cycle Decimal")
src = close
hclose = request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, src)
//BlackCat1402's Dynamic Length Calculation
EhlersHoDyDC(Price, CycPart) =>
// Vars:
Smooth = 0.00
Detrender = 0.00
I1 = 0.00
Q1 = 0.00
jI = 0.00
jQ = 0.00
I2 = 0.00
Q2 = 0.00
Re = 0.00
Im = 0.00
Period = 0.00
SmoothPeriod = 0.00
pi = 2 * math.asin(1)
DomCycle = 0.0
//Hilbert Transform
Smooth := bar_index > 5 ? (4 * Price + 3 * nz(Price[1]) + 2 * nz(Price[2]) + nz(Price[3])) / 10 : Smooth
Detrender := bar_index > 5 ? (.0962 * Smooth + .5769 * nz(Smooth[2]) - .5769 * nz(Smooth[4]) - .0962 * nz(Smooth[6])) * (.075 * nz(Period[1]) + .54) : Detrender
//Compute InPhase and Quadrature components
Q1 := bar_index > 5 ? (.0962 * Detrender + .5769 * nz(Detrender[2]) - .5769 * nz(Detrender[4]) - .0962 * nz(Detrender[6])) * (.075 * nz(Period[1]) + .54) : Q1
I1 := bar_index > 5 ? nz(Detrender[3]) : I1
//Advance the phase of I1 and Q1 by 90 degrees
jI := (.0962 * I1 + .5769 * nz(I1[2]) - .5769 * nz(I1[4]) - .0962 * nz(I1[6])) * (.075 * nz(Period[1]) + .54)
jQ := (.0962 * Q1 + .5769 * nz(Q1[2]) - .5769 * nz(Q1[4]) - .0962 * nz(Q1[6])) * (.075 * nz(Period[1]) + .54)
//Phasor addition for 3 bar averaging
I2 := I1 - jQ
Q2 := Q1 + jI
//Smooth the I and Q components before applying the discriminator
I2 := .2 * I2 + .8 * nz(I2[1])
Q2 := .2 * Q2 + .8 * nz(Q2[1])
//Homodyne Discriminator
Re := I2 * nz(I2[1]) + Q2 * nz(Q2[1])
Im := I2 * nz(Q2[1]) - Q2 * nz(I2[1])
Re := .2 * Re + .8 * nz(Re[1])
Im := .2 * Im + .8 * nz(Im[1])
Period := Im != 0 and Re != 0 ? 2 * pi / math.atan(Im / Re) : Period
Period := Period > 1.5 * nz(Period[1]) ? 1.5 * nz(Period[1]) : Period
Period := Period < .67 * nz(Period[1]) ? .67 * nz(Period[1]) : Period
//Limit Period to be within the bounds of 6 bar and 50 bar cycles
Period := Period < 6 ? 6 : Period
Period := Period > 50 ? 50 : Period
Period := .2 * Period + .8 * nz(Period[1])
SmoothPeriod := .33 * Period + .67 * nz(SmoothPeriod[1])
//it can add filter to Period here
DomCycle := math.ceil(CycPart * SmoothPeriod) > 34 ? 34 : math.ceil(CycPart * SmoothPeriod) < 1 ? 1 : math.ceil(CycPart * SmoothPeriod)
DomCycle
wma(src, length) =>
wma = 0.0
sum = 0.0
norm = length * (length + 1) / 2
for i = 0 to length - 1
sum := sum + src[i] * (length - i)
wma := sum / norm
length = math.round(math.ceil(EhlersHoDyDC(hclose,CycPart)))
// Traditional Function initialization
highest_custom(src, length) =>
x = src
for i = 0 to math.min(length, 4999)
if src[i] > x
x := src[i]
x
lowest_custom(src, length) =>
x = src
for i = 0 to math.min(length, 4999)
if src[i] < x
x := src[i]
x
rma(src, len) =>
sum = 0.0
for i = 0 to len - 1
math.min(1, len)
sum += src[i]
rma = sum / len
rma := nz(rma[1]) * (len - 1) / len + src / len
sma(src, length) =>
math.sum(src, length) / length
hln(src, length) =>
TR = math.max(math.abs(src - src[1]), high - low)
TR := src / math.abs(ta.change(rma(TR, length)))
TR := (1 / TR) * 100
vawma(src, length) =>
atr = ta.atr(1)
aavg = sma(atr, length)
vavg = sma(volume, length)
weighted_sum = 0.0
sum_weights = 0.0
weighted = 0.0
for i = 0 to length
weight = ((volume[i] / vavg + (atr[i]) / aavg) / 2)
weighted_sum += src[i] * weight
sum_weights += weight
a = (weighted_sum / sum_weights)
vawsi(src, len) =>
rmaUp = vawma(math.max(ta.change(src), 0), len)
rmaDown = vawma(-math.min(ta.change(src), 0), len)
rsi = 100 - (100 / (1 + rmaUp / rmaDown))
trendPersistence(src, length, smoothing) =>
trendu = math.abs(src - highest_custom(src, length))
trendd = math.abs(src - lowest_custom(src, length))
trendu := wma(trendu, smoothing)
trendd := wma(trendd, smoothing)
trendu := ta.change(ta.cum(trendu))
trendd := ta.change(ta.cum(trendd))
trend = wma(math.max(trendu, trendd), smoothing)
rmaUp = rma(math.max(ta.change(trend), 0), length)
rmaDown = rma(-math.min(ta.change(trend), 0), length)
rsi = 100 - (100 / (1 + rmaUp / rmaDown))
//Strategy Calculations
sl = ((100 - sltp) / 100) * close
tp = ((100 + sltp) / 100) * close
var bool crossup = na
var bool crossdown = na
var float dir = na
var float BearGuy = 0
BullGuy = ta.barssince(crossup or crossdown)
if na(BullGuy)
BearGuy += 1
else
BearGuy := math.min(BullGuy, 4999)
rsiw = rsi_weight / 100
cew = half_weight / 100
atrw = atr_weight / 100
atr = hln(hclose, length) * atrw
ce = 1 / trendPersistence(hclose, length, smoothing)
com = 1 / math.max(math.abs(vawsi(hclose, length) - 50) * 2, 20)
comfin = (((com * rsiw) + (ce * cew) - atr)) * com_mult
lower = highest_custom(math.min((math.max(highest_custom(src, BearGuy) * (1 - comfin), sl)), src[1]), BearGuy)
upper = lowest_custom(math.max((math.min(lowest_custom(src, BearGuy) * (1 + comfin), tp)), src[1]), BearGuy)
var float thresh = na
if na(thresh)
thresh := lower
if na(dir)
dir := 1
if crossdown
dir := -1
if crossup
dir := 1
if dir == 1
thresh := lower
if dir == -1
thresh := upper
crossup := ta.crossover(hclose, thresh) and barstate.isconfirmed
crossdown := ta.crossunder(hclose, thresh) and barstate.isconfirmed
//STRATEGY
if crossup
strategy.entry("long", strategy.long)
if crossdown
strategy.entry("Short", strategy.short)
//PLOTTING
col = hclose > thresh ? color.lime : color.red
plot(thresh, linewidth = 2, color = color.new(col[1], 0))