Chiến lược này chủ yếu kết hợp các tín hiệu chéo Hull Moving Average và WT để tận dụng những lợi thế của mỗi chỉ số để đánh giá xu hướng chính xác hơn và thời gian nhập cảnh.
Chiến lược bao gồm các tín hiệu chéo trung bình chuyển động Hull và WT.
Phần Hull Moving Average tính toán MAs Hull ngắn hạn và dài hạn và điền màu để xác định hướng xu hướng.
MA vỏ ngắn = WMA ((2*WMA ((n/2) - WMA ((n), sqrt ((n))
Long Hull MA = WMA(WMA(n/3) *3 - WMA(n/2), n/2)
Khi MA ngắn vượt qua MA dài, đó là tín hiệu tăng, nếu không là tín hiệu giảm.
Phần WT tính toán các đường WT và quan sát các giao điểm của chúng để xác định các mục.
TCI = (Close - EMA(Close,n1)) / (k * STD(Close - EMA(Close,n1),n1))
WT1 = EMA ((TCI,n2)
WT2 = SMA(WT1,m)
Trong đó TCI là Chỉ số Trends Composite, phản ánh độ lệch của giá so với EMA; WT1 là EMA của TCI, WT2 là SMA của WT1, m thường là 4.
Bằng cách kết hợp đánh giá xu hướng của Hull MA và các tín hiệu băng qua WT, chúng ta có thể bước vào thị trường theo đúng hướng.
Những lợi thế của chiến lược này là:
Hull MA nắm bắt các thay đổi giá nhanh hơn bằng cách sửa đổi tính toán và lọc tiếng ồn thị trường hiệu quả để đánh giá xu hướng đáng tin cậy.
WT sử dụng biến động giá trong kênh để nắm bắt các điểm chuyển đổi nhanh chóng và tạo ra các tín hiệu giao dịch tương đối chính xác.
Sự kết hợp xem xét cả xu hướng và giao nhau để kiểm soát rủi ro tốt hơn khi xu hướng phù hợp.
Các tham số Hull MA và WT có thể được tùy chỉnh để điều chỉnh và tối ưu hóa dựa trên các đặc điểm biểu tượng và sở thích giao dịch.
Các tín hiệu MA và WT của thân tàu có thể được sử dụng một mình hoặc cùng nhau cho cả xác nhận theo xu hướng và chéo.
Dừng lỗ và lấy lợi nhuận có thể được thiết lập để kiểm soát hiệu quả rủi ro thương mại duy nhất.
Những rủi ro chính của chiến lược này là:
Cả Hull MA và WT đều làm mịn mượt giá ở một mức độ nào đó, có thể gây ra tín hiệu nhập cảnh chậm.
WT có thể tạo ra các tín hiệu chênh lệch tăng / giảm sai mà không có xu hướng rõ ràng.
Cài đặt tham số không phù hợp có thể ảnh hưởng đến hiệu suất giao dịch và yêu cầu tối ưu hóa liên tục.
Dừng lỗ có thể được kích hoạt thường xuyên trong quá trình củng cố xu hướng, gây ra một số lỗ.
Các rủi ro có thể được giải quyết và tối ưu hóa như sau:
Điều chỉnh các thông số Hull MA và WT để tìm sự cân bằng tối ưu.
Thêm các cơ chế xác nhận xu hướng để tránh các tín hiệu WT sai mà không có xu hướng được xác nhận.
Tối ưu hóa các thông số thông qua backtesting và giao dịch demo, và thiết lập phạm vi dừng lỗ hợp lý.
Giảm kích thước vị trí hoặc ngừng giao dịch khi xu hướng không rõ ràng.
Chiến lược có thể được tối ưu hóa thêm từ các khía cạnh sau:
Kiểm tra các đường trung bình động khác nhau kết hợp với WT, để tìm sự cân bằng tốt hơn, ví dụ: KAMA, TEMA v.v.
Thêm các chỉ số khác như dao động, Bollinger Bands để cải thiện độ chính xác quyết định.
Tối ưu hóa các tham số thông qua backtesting và demo giao dịch. Xây dựng các chương trình tối ưu hóa tham số để điều chỉnh nhanh chóng.
Tối ưu hóa các chiến lược dừng lỗ, ví dụ như dừng lại, dừng dựa trên biến động, di chuyển từ gần đến xa, v.v., để giảm kích hoạt không mong muốn.
Tối ưu hóa các chiến lược định kích thước vị trí, giảm kích thước và tần suất trong xu hướng không rõ ràng để giảm rủi ro.
Đưa ra máy học và các kỹ thuật tiên tiến khác để đưa ra các quyết định giao dịch thông minh hơn và các thông số thích nghi.
Chiến lược này kết hợp các điểm mạnh của MA Hull và WT để đánh giá và xác nhận xu hướng. Giao dịch với hướng xác nhận giúp kiểm soát rủi ro. Có thể cải thiện thêm về tối ưu hóa tham số, chiến lược dừng lỗ, kích thước vị trí vv. Kết hợp các chỉ số khác và kỹ thuật thông minh cũng là các hướng tối ưu hóa trong tương lai. Nhìn chung, đây là một xu hướng thực tế sau chiến lược với sự đơn giản, đáng tin cậy và dễ dàng tối ưu hóa.
/*backtest start: 2023-08-26 00:00:00 end: 2023-09-25 00:00:00 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/ // WT CROSS @author [© LazyBear] // © pigsq // @version=5 strategy("Kahlman HullMA / WT Cross Strategy", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100, initial_capital=100) _1 = input(false, '───────── SP/TP SETTINGS ─────────') stoploss1 = input(title='Stop Loss On/Off?', defval=true) stoploss = input.float(5, "Stop Loss", minval = 1, step = 1)/100 takeprofit1 = input(title='Take Profit On/Off?', defval=true) takeprofit = input.float(10, "Take Profit", minval = 1, step = 1)/100 _2 = input(false, '──────── WT CROSS SETTINGS ────────') wtcross = input(title='WT Cross On/Off?', defval=true) wtcross2 = input(title='Change WT Cross Method ( If WT Cross ON )', defval=false) /// WT CROSS /// n1 = input(10, 'Channel Length') n2 = input(21, 'Average Length') ap = hlc3 esa = ta.ema(ap, n1) r = ta.ema(math.abs(ap - esa), n1) ci = (ap - esa) / (0.015 * r) tci = ta.ema(ci, n2) wt1 = tci wt2 = ta.sma(wt1, 4) /// WT CROSS /// /// HULL TREND WITH KAHLMAN /// _3 = input(false, '──────── HULLMA SETTINGS ────────') srchull = input(hl2, 'Source') lengthhull = input(24, 'Lookback') gain = input(10000, 'Gain') kh = input(true, 'Use Kahlman') hma(_srchull, _lengthhull) => ta.wma((2 * ta.wma(_srchull, _lengthhull / 2)) - ta.wma(_srchull, _lengthhull), math.round(math.sqrt(_lengthhull))) hma3(_srchull, _lengthhull) => p = lengthhull / 2 ta.wma(ta.wma(close, p / 3) * 3 - ta.wma(close, p / 2) - ta.wma(close, p), p) kahlman(x, g) => kf = 0.0 dk = x - nz(kf[1], x) smooth = nz(kf[1], x) + dk * math.sqrt(g / 10000 * 2) velo = 0.0 velo := nz(velo[1], 0) + g / 10000 * dk kf := smooth + velo kf a = kh ? kahlman(hma(srchull, lengthhull), gain) : hma(srchull, lengthhull) b = kh ? kahlman(hma3(srchull, lengthhull), gain) : hma3(srchull, lengthhull) c = b > a ? color.lime : color.red crossdn = a > b and a[1] < b[1] crossup = b > a and b[1] < a[1] p1hma = plot(a, color=c, linewidth=1, title='Long Plot', transp=75) p2hma = plot(b, color=c, linewidth=1, title='Short Plot', transp=75) fill(p1hma, p2hma, color=c, title='Fill', transp=55) /// HULL TREND WITH KAHLMAN /// /// DATE /// _4 = input(false, '───────── DATE SETTINGS ─────────') FromMonth = input.int(defval=1, title='From Month', minval=1, maxval=12) FromDay = input.int(defval=1, title='From Day', minval=1, maxval=31) FromYear = input.int(defval=999, title='From Year', minval=999) ToMonth = input.int(defval=1, title='To Month', minval=1, maxval=12) ToDay = input.int(defval=1, title='To Day', minval=1, maxval=31) ToYear = input.int(defval=9999, title='To Year', minval=999) start = timestamp(FromYear, FromMonth, FromDay, 00, 00) finish = timestamp(ToYear, ToMonth, ToDay, 23, 59) window() => time >= start and time <= finish ? true : false /// DATE /// /// LONG/SHORT CONDITION /// longCondition = crossup and ta.crossover(wt1,wt2) longCondition1 = crossup longCondition2 = crossup and wt1 > wt2 if (wtcross == true ? longCondition : wtcross == false ? longCondition1:na) strategy.entry("LONG", strategy.long, when=window(), comment="Enter Long") else if (wtcross2 == true ? longCondition2 : wtcross2 == false ? longCondition:na) strategy.entry("LONG", strategy.long, when=window(), comment="Enter Long") shortCondition = crossdn and ta.crossunder(wt1,wt2) shortCondition1 = crossdn shortCondition2 = crossdn and wt1 < wt2 if (wtcross == true ? shortCondition : wtcross == false ? shortCondition1:na) strategy.entry("SHORT", strategy.short, when=window(), comment="Enter Short") else if (wtcross2 == true ? shortCondition2 : wtcross2 == false ? shortCondition:na) strategy.entry("LONG", strategy.long, when=window(), comment="Enter Short") /// LONG/SHORT CONDITION /// /// CLOSE STRATEGY /// strategy.close("LONG", when=wtcross == true ? shortCondition : wtcross == false ? shortCondition1:na, comment = "Close Long") strategy.close("SHORT", when=wtcross == true ? longCondition : wtcross == false ? longCondition1:na, comment = "Close Short") /// EXIT STRATEGY /// strategy.exit("LONG", when=strategy.position_size > 0, stop=stoploss1 == true ? strategy.position_avg_price * (1 - stoploss):na, limit=takeprofit1 == true ? strategy.position_avg_price * (1 + takeprofit):na, comment="Exit Long") strategy.exit("SHORT", when=strategy.position_size < 0, stop=stoploss1 == true ? strategy.position_avg_price * (1 + stoploss):na, limit=takeprofit1 == true ? strategy.position_avg_price * (1 - takeprofit):na, comment ="Exit Short") /// LONG SL/TP LINE /// plot(strategy.position_size > 0 ? strategy.position_avg_price * (1 - stoploss) : na, title='Long Stop Loss', color=stoploss1 == true ? color.new(color.red, 0):na, style=plot.style_linebr) plot(strategy.position_size > 0 ? strategy.position_avg_price * (1 + takeprofit) : na, title='Long Take Profit', color=takeprofit1 == true ? color.new(color.green, 0):na, style=plot.style_linebr) /// LONG SL/TP LINE /// /// SHORT SL/TP LINE /// plot(strategy.position_size < 0 ? strategy.position_avg_price * (1 + stoploss) : na, title='Short Stop Loss', color=stoploss1 == true ? color.new(color.red, 0):na, style=plot.style_linebr) plot(strategy.position_size < 0 ? strategy.position_avg_price * (1 - takeprofit) : na, title='Short Take Profit', color=takeprofit1 == true ? color.new(color.green, 0):na, style=plot.style_linebr) /// SHORT SL/TP LINE ///