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.
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
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.
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.
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.
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.
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ó.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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ử.
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))