Chiến lược này sử dụng sự kết hợp của ba chỉ số kỹ thuật khác nhau để xây dựng một chiến lược điều chỉnh chu kỳ chéo nắm bắt xu hướng giá trên các khung thời gian khác nhau để đạt được lợi nhuận vượt quá rủi ro thấp.
Các chỉ số kỹ thuật được sử dụng trong chiến lược này là Keltner Channel (KC), Volatility Stop (Vstop), và Williams Alligator (WAE). Keltner Channel được sử dụng để xác định giá có nằm ngoài phạm vi kênh và do đó tạo ra tín hiệu giao dịch.
Khi giá cao hơn đường ray trên kênh Keltner, nó được coi là tín hiệu tăng. Khi giá thấp hơn đường ray dưới kênh Keltner, nó được coi là tín hiệu giảm.
Dừng biến động đặt vị trí dừng lỗ dựa trên biến động giá và chiều rộng kênh. Nó có thể điều chỉnh năng động để đảm bảo dừng lỗ trong khi tránh các vị trí dừng lỗ quá bảo thủ.
Chỉ số Williams Alligator đánh giá liệu giá có đang trong xu hướng tăng hoặc giảm mạnh bằng cách tính toán chiều rộng kênh MACD và Bollinger Band.
Bằng cách kết hợp ba chỉ số này, các tín hiệu trên các khung thời gian khác nhau được xác nhận chéo. Điều này làm giảm khả năng đánh giá sai và xây dựng một chiến lược tối ưu hóa logic.
Lợi thế lớn nhất của chiến lược này là các tín hiệu giao dịch chính xác được mang lại bởi sự kết hợp của nhiều chỉ số. Ba chỉ số hoạt động trong các khung thời gian khác nhau và xác nhận chéo nhau, có thể làm giảm hiệu quả khả năng đánh giá sai và tăng độ chính xác của tín hiệu. Ngoài ra, cài đặt dừng biến động là năng động và có thể điều chỉnh vị trí dừng lỗ theo biến động thời gian thực để kiểm soát thêm rủi ro.
So với các chiến lược chỉ số duy nhất, chiến lược kết hợp này có thể cung cấp các tín hiệu giao dịch chính xác và hiệu quả hơn. Đồng thời, ba chỉ số làm việc cùng nhau để hình thành các phán đoán giao dịch trong nhiều khung thời gian, đó là một thiết kế logic rất khoa học và hợp lý đáng học hỏi.
Rủi ro chính của chiến lược này là việc cài đặt tham số không chính xác có thể gây quá mức. Ba chỉ số có tổng cộng 8 tham số. Các thiết lập không chính xác có thể ảnh hưởng tiêu cực đến chiến lược. Ngoài ra, mối quan hệ trọng lượng giữa các chỉ số cũng cần được cấu hình đúng cách, nếu không các tín hiệu có thể trung hòa lẫn nhau và trở nên vô hiệu.
Để giảm rủi ro này, khả năng thích nghi với các môi trường thị trường khác nhau nên được xem xét đầy đủ trong quá trình thiết lập tham số và sự kết hợp tham số tối ưu nên được điều chỉnh thông qua phân tích backtesting. Ngoài ra, điều chỉnh đúng cân nặng giữa các chỉ số để đảm bảo tín hiệu giao dịch có thể được kích hoạt hiệu quả. Khi xảy ra thua lỗ liên tiếp, hãy xem xét giảm kích thước vị trí để kiểm soát thua lỗ.
Không gian tối ưu hóa của chiến lược này chủ yếu tập trung vào hai khía cạnh: điều chỉnh tham số và cải thiện các chiến lược dừng lỗ.
Chọn các tham số chỉ số một cách khoa học hơn và tối ưu hóa sự kết hợp các tham số. Các thuật toán có thể được sử dụng để tìm các tham số tối ưu với các mục tiêu như tối đa hóa lợi nhuận và giảm thiểu rủi ro.
Cải thiện chiến lược stop loss để giảm thêm stop loss không cần thiết trong khi đảm bảo stop loss, do đó cải thiện tỷ lệ thắng. Ví dụ, kết hợp nhiều chỉ số hơn như tín hiệu stop loss, hoặc đặt pullback dần dần của các vị trí stop loss.
Tối ưu hóa trọng lượng giữa các chỉ số và logic của các phán quyết tín hiệu giao dịch để giảm tỷ lệ đánh giá sai. Nhiều tính năng hành vi giá có thể được giới thiệu để xây dựng các quy tắc đánh giá ổn định và đáng tin cậy hơn.
Cố gắng giới thiệu các mô hình học máy để đạt được tối ưu hóa tham số tự động hoặc sử dụng lập trình học tăng cường sâu để đánh giá và cải thiện chiến lược.
Chiến lược này xây dựng một hệ thống trọng tài chéo chu kỳ thông qua sự kết hợp của Keltner Channel, Volatility Stop và Williams Alligator. Sự kết hợp nhiều chỉ số cải thiện độ chính xác tín hiệu và kiểm soát rủi ro dừng mất động. Nhưng có chỗ để cải thiện trong thiết lập và tối ưu hóa các tham số. Nhìn chung, chiến lược này có tính khoa học mạnh mẽ và đáng nghiên cứu và áp dụng thêm.
/*backtest start: 2023-12-01 00:00:00 end: 2023-12-31 23:59:59 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy("QuarryLake", overlay=true) ///Ultilized modified full kelly for this strategy = 36% ///Keltner channel/// nPeriod = input(title="Keltner Period", type=input.integer, defval=200, minval=1) Mult = input(title="Keltner Mult", type=input.integer, defval=5, minval=1) xPrice = ema(hlc3, nPeriod) xMove = ema(high - low, nPeriod) xMoveMult = xMove * Mult xUpper = xPrice + xMoveMult xLower = xPrice - xMoveMult // plot(xPrice, color=red, title="KSmid") p1 = plot(xUpper, color=color.white, title="KSup") p2 = plot(xLower, color=color.white, title="KSdn") fill(p1, p2, color=close > xUpper ? color.green : close < xLower ? color.red : color.white) kclongcondition = close > xUpper kcshortcondition = close < xLower kccloselongcondition = crossunder(close, xUpper) kccloseshortcondition = crossover(close, xLower) ///Volatility Stop/// length = input(title="Vstop length", type=input.integer, defval=3, minval=1) mult1 = 1.5 atr_ = atr(length) max1 = 0.0 min1 = 0.0 is_uptrend_prev = false stop = 0.0 vstop_prev = 0.0 vstop1 = 0.0 is_uptrend = false is_trend_changed = false max_ = 0.0 min_ = 0.0 vstop = 0.0 max1 := max(nz(max_[1]), close) min1 := min(nz(min_[1]), close) is_uptrend_prev := nz(is_uptrend[1], true) stop := is_uptrend_prev ? max1 - mult1 * atr_ : min1 + mult1 * atr_ vstop_prev := nz(vstop[1]) vstop1 := is_uptrend_prev ? max(vstop_prev, stop) : min(vstop_prev, stop) is_uptrend := close - vstop1 >= 0 is_trend_changed := is_uptrend != is_uptrend_prev max_ := is_trend_changed ? close : max1 min_ := is_trend_changed ? close : min1 vstop := is_trend_changed ? is_uptrend ? max_ - mult1 * atr_ : min_ + mult1 * atr_ : vstop1 plot(vstop, color=is_uptrend ? color.green : color.red, style=plot.style_line, linewidth=1) vstoplongcondition = close > vstop vstoplongclosecondition = crossunder(close, vstop) vstopshortcondition = close < vstop vstopshortclosecondition = crossover(close, vstop) ///Waddah Attar Explosion/// sensitivity = input(150, title="Sensitivity") fastLength = input(20, title="FastEMA Length") slowLength = input(40, title="SlowEMA Length") channelLength = input(20, title="BB Channel Length") mult = input(2.0, title="BB Stdev Multiplier") DEAD_ZONE = nz(rma(tr(true), 100)) * 3.7 calc_macd(source, fastLength, slowLength) => fastMA = ema(source, fastLength) slowMA = ema(source, slowLength) fastMA - slowMA calc_BBUpper(source, length, mult) => basis = sma(source, length) dev = mult * stdev(source, length) basis + dev calc_BBLower(source, length, mult) => basis = sma(source, length) dev = mult * stdev(source, length) basis - dev t1 = (calc_macd(close, fastLength, slowLength) - calc_macd(close[1], fastLength, slowLength)) * sensitivity t2 = (calc_macd(close[2], fastLength, slowLength) - calc_macd(close[3], fastLength, slowLength)) * sensitivity e1 = calc_BBUpper(close, channelLength, mult) - calc_BBLower(close, channelLength, mult) trendUp = t1 >= 0 ? t1 : 0 trendDown = t1 < 0 ? -1 * t1 : 0 waelongcondition = trendUp and trendUp > DEAD_ZONE and trendUp > e1 waeshortcondition = trendDown and trendDown > DEAD_ZONE and trendDown > e1 ///Long Entry/// longcondition = kclongcondition and vstoplongcondition and waelongcondition if longcondition strategy.entry("Long", strategy.long) ///Long exit/// closeconditionlong = kccloselongcondition or vstoplongclosecondition if closeconditionlong strategy.close("Long") ///Short Entry/// shortcondition = kcshortcondition and vstopshortcondition and waeshortcondition if shortcondition strategy.entry("Short", strategy.short) ///Short exit/// closeconditionshort = kccloseshortcondition or vstopshortclosecondition if closeconditionshort strategy.close("Short") ///Free Hong Kong, the revolution of our time///