Tài nguyên đang được tải lên... tải...

VAWSI và Chiến lược đảo ngược sự bền vững của xu hướng với hệ thống phân tích đa chỉ số tính toán chiều dài động

Tác giả:ChaoZhang, Ngày: 2024-06-21 15:36:43
Tags:VAWSIATRRSIWMASMARMA

nguồn - nguồn trước đó, sau đó lấy giá trị tuyệt đối của sự thay đổi của nó và bình thường hóa nó với nguồn.

  1. Tính toán chiều dài động: Sử dụng phương pháp tính toán chiều dài động của BlackCat1402 để điều chỉnh các tham số chiều dài chỉ số dựa trên điều kiện thị trường.

  2. Phân tích tổng hợp: Kết hợp các phép đọc từ VAWSI, Trend Persistence và ATR để tạo ra một chỉ số tổng hợp. Giá trị cuối cùng thấp hơn cho thấy sự đảo ngược sắp xảy ra, trong khi giá trị cao hơn cho thấy thị trường không ổn định hoặc hỗn loạn.

  3. Dynamic Stop-Loss/Take-Profit: Tính toán các mức stop-loss và take-profit năng động dựa trên chỉ số tổng hợp và hướng xu hướng hiện tại.

  4. Các tín hiệu giao dịch: Xác nhận các giao dịch chéo và tạo ra các tín hiệu giao dịch khi giá vượt qua hoàn toàn đường ngưỡng được tính toán.

Ưu điểm chiến lược

  1. 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ừ các góc độ khác nhau, cải thiện độ chính xác quyết định.

  2. Khả năng thích nghi: Tính toán chiều dài năng động cho phép chiến lược thích nghi với các điều kiện thị trường khác nhau, tăng tính linh hoạt của nó.

  3. Quản lý rủi ro: Cài đặt dừng lỗ và lấy lợi nhuận năng động giúp kiểm soát rủi ro tốt hơn và thích nghi với những thay đổi trên thị trường.

  4. Các chỉ số ban đầu: Các chỉ số VAWSI và Trend Persistence cung cấp thông tin thị trường độc đáo có thể nắm bắt các tín hiệu bị bỏ qua bởi các chỉ số truyền thống.

  5. Chống tái sơn: Sử dụng barstate.isconfirmed đảm bảo tín hiệu không tái sơn, cải thiện độ chính xác backtesting.

  6. Khả năng tùy chỉnh: Nhiều tham số có thể điều chỉnh cho phép chiến lược được điều chỉnh cho các công cụ giao dịch và khung thời gian khác nhau.

Rủi ro chiến lược

  1. Tối ưu hóa quá mức: Số lượng lớn các thông số có thể dẫn đến tối ưu hóa quá mức, có khả năng hoạt động kém trong giao dịch trực tiếp.

  2. Khả năng thích nghi thị trường: Mặc dù hoạt động tốt trên một số thị trường, nhưng nó có thể không phù hợp với tất cả các điều kiện thị trường, đặc biệt là trên các thị trường biến động thấp.

  3. Sự phức tạp: Sự phức tạp của chiến lược có thể làm cho nó khó hiểu và duy trì, làm tăng nguy cơ lỗi hoạt động.

  4. 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 tải tính toán cao, ảnh hưởng đến tốc độ thực hiện.

  5. Sự dựa 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, có thể dẫn đến sự chậm trễ trong một số tình huống.

Hướng dẫn tối ưu hóa

  1. 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 chiến lược trong các điều kiện thị trường khác nhau.

  2. Nhận dạng trạng thái thị trường: Thêm một 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.

  3. Bộ lọc tín hiệu: Đưa ra các cơ chế lọc bổ sung, chẳng hạn như ngưỡng sức mạnh xu hướng, để giảm các tín hiệu sai.

  4. Phân tích khối lượng: Làm sâu sắc phân tích khối lượng, có thể giới thiệu nhận dạng mẫu khối lượng để tăng độ tin cậy tín hiệu.

  5. 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 độ chắc chắn của các quyết định giao dịch.

  6. 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í năng động và dừng lỗ đa cấp.

  7. Hiệu quả tính toán: Tối ưu hóa mã để cải thiện 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ử.

Kết luận

VAWSI và Chiến lược đảo ngược sự bền vững của xu hướng 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 tham số năng động.

Thông qua việc tối ưu hóa hơn nữa, đặc biệt là trong điều chỉnh tham số, nhận thức trạng thái thị trường và quản lý rủi ro, 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ẽ. 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à việc giám sát và điều chỉnh liên tục là cần thiết. Trong ứng dụng thực tế, nên tiến hành kiểm tra kỹ lưỡng trên tài khoản demo và kết hợp chiến lược này 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))



Có liên quan

Thêm nữa