Chiến lược giao dịch dựa trên sự giao nhau của đường trung bình động Hull và chỉ báo WT


Ngày tạo: 2023-09-26 20:00:32 sửa đổi lần cuối: 2023-09-26 20:00:32
sao chép: 0 Số nhấp chuột: 540
1
tập trung vào
1166
Người theo dõi

Tổng quan

Chiến lược này chủ yếu kết hợp các tín hiệu chéo của các chỉ số Hull Moving Average và WT để tận dụng lợi thế của các chỉ số tương ứng để đưa ra quyết định chính xác hơn trong việc đánh giá xu hướng và chọn thời gian nhập cảnh.

Nguyên tắc chiến lược

Chiến lược này chủ yếu bao gồm các tín hiệu chéo của chỉ số Hull Moving Average và WT.

Phần Hull Moving Average, định hướng xu hướng bằng cách tính Hull MA ngắn hạn và dài hạn, và điền màu. Công thức tính toán là:

Thời gian ngắn Hull MA = WMA*WMA(n/2) - WMA(n), sqrt(n))

Hull MA dài hạn = WMA ((WMA ((n/3))*3 - WMA(n/2), n/2)

Trong đó, WMA là đường trung bình di chuyển có trọng lượng.

Phần chỉ số WT, bằng cách tính toán đường trung bình đa không của chỉ số WT và quan sát sự giao nhau của đường trung bình. Công thức tính toán là:

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ố tổng hợp xu hướng, phản ánh mức độ lệch của EMA giữa giá và đường trung bình; WT1 là giá trị làm mịn của EMA của TCI, WT2 là giá trị SMA của WT1, m thường lấy 4.

Kết hợp phán đoán xu hướng của Hull MA và tín hiệu chéo của chỉ số WT, có thể tham gia vào trường hợp hướng xu hướng là chính xác.

Phân tích lợi thế

Chiến lược này kết hợp các lợi thế của chỉ số Hull MA và WT, với một số ưu điểm sau:

  1. Hull MA có thể nắm bắt xu hướng thay đổi giá nhanh hơn bằng cách thay đổi cách tính toán của moving average, và có thể loại bỏ hiệu quả tiếng ồn thị trường để đánh giá xu hướng một cách chính xác và đáng tin cậy.

  2. Chỉ số WT sử dụng tính năng biến động giá trong kênh để nhanh chóng nắm bắt các điểm biến đổi và phát ra tín hiệu giao dịch chính xác hơn.

  3. Sử dụng cả hai kết hợp, xem xét cả phán đoán xu hướng và chú ý đến tín hiệu chéo, có thể kiểm soát rủi ro trong khi xu hướng mạnh.

  4. Các tham số Hull MA Smoothing và tham số WT Indicator đều có thể được tùy chỉnh, có thể được điều chỉnh và tối ưu hóa theo các đặc điểm khác nhau của giống và sở thích giao dịch.

  5. Có thể sử dụng tín hiệu chéo của chỉ số Hull MA hoặc WT để giao dịch một mình hoặc có thể kết hợp để sử dụng theo dõi xu hướng và xác minh chéo.

  6. Có thể thiết lập chiến lược dừng lỗ để kiểm soát rủi ro giao dịch một cách hiệu quả.

Phân tích rủi ro

Chiến lược này có một số rủi ro:

  1. Cả chỉ số Hull MA và WT đều có mức độ mờ đối với giá, có thể bị chậm lại một chút, dẫn đến thời gian nhập cảnh không chính xác.

  2. Chỉ số WT dễ tạo ra các tín hiệu giả mạo của các đà nhiều đầu và đà không đầu, làm tăng rủi ro giao dịch nếu không kết hợp với phán đoán xu hướng.

  3. Thiết lập tham số không đúng cũng có thể ảnh hưởng đến kết quả giao dịch, cần phải liên tục kiểm tra và tối ưu hóa theo đặc điểm của giống.

  4. Trong một thời điểm có sự biến động của xu hướng, các lệnh dừng có thể được kích hoạt thường xuyên, dẫn đến tổn thất cho giao dịch.

Phản ứng với rủi ro có thể được tối ưu hóa và cải thiện bằng cách:

  1. Điều chỉnh các tham số Hull MA và WT để tìm điểm cân bằng tốt nhất. Các chỉ số khác cũng có thể được thử nghiệm với Hull MA.

  2. Tăng cơ chế đánh giá xu hướng, tránh các tín hiệu sai khi chỉ số WT không có xu hướng rõ ràng.

  3. Sử dụng phản hồi và mô phỏng giao dịch để tìm ra các tham số tốt nhất và đặt mức dừng lỗ hợp lý.

  4. Giảm kích thước vị trí hoặc tạm thời không giao dịch khi xu hướng không rõ ràng.

Hướng tối ưu hóa

Chiến lược này có thể được tối ưu hóa hơn nữa theo một số hướng sau:

  1. Kiểm tra các kết hợp của các chỉ số WT với các trung bình di chuyển khác nhau để tìm ra điểm cân bằng tốt hơn. Ví dụ: KAMA, TEMA, v.v.

  2. Thêm các chỉ số khác, chẳng hạn như chỉ số biến động, Bollinger Bands, để cải thiện độ chính xác của quyết định.

Thiết lập tham số tối ưu hóa, tìm kiếm sự kết hợp tham số tối ưu nhất thông qua phản hồi và mô phỏng. Có thể xây dựng chương trình tối ưu hóa tham số để nhanh chóng tìm kiếm tham số tối ưu nhất.

  1. Tối ưu hóa các chiến lược dừng lỗ, chẳng hạn như sử dụng dừng di chuyển, dừng rung, dừng gần và từ xa, để giảm khả năng dừng lỗ được kích hoạt.

  2. Tối ưu hóa chiến lược quản lý vị trí, chủ động giảm tần suất giao dịch và kích thước vị trí khi xu hướng không rõ ràng, giảm rủi ro.

  3. Thêm các công nghệ tiên tiến như học máy để đưa ra quyết định giao dịch thông minh hơn và tùy chỉnh tham số.

Tóm tắt

Chiến lược này kết hợp các tính năng chéo của các chỉ số Hull MA và WT, cùng với các lợi thế của phán đoán xu hướng và xác minh chéo. Giao dịch có thể kiểm soát rủi ro một cách hiệu quả với điều kiện đảm bảo đúng hướng.

Mã nguồn chiến lược
/*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 ///