Chiến lược đa yếu tố thông minh thích nghi của Hull Fisher

Tác giả:ChaoZhang, Ngày: 2024-01-16 15:10:06
Tags:

img

Tổng quan

Chiến lược này kết hợp trung bình chuyển động Hull, chỉ số biến đổi Fisher và chỉ số kênh hàng hóa thành một chiến lược đa yếu tố thích nghi. Nó có thể nhận diện các xu hướng một cách thông minh, tự động điều chỉnh các tham số và thích nghi với các sản phẩm và chu kỳ khác nhau.

Chiến lược logic

Lý thuyết cốt lõi của chiến lược này dựa trên chữ thập vàng và chữ thập chết của chỉ số biến đổi Fisher để xác định bước vào và bước ra.

Chiến lược này đầu tiên tính toán chỉ số trung bình chuyển động Hull và Fisher Transform. Sau đó với sự giúp đỡ của Chỉ số kênh hàng hóa, tạo thành các điều kiện nhập cảnh. Khi chỉ số Fisher Transform vượt qua từ dưới đường không hoặc vượt qua từ bên ngoài phạm vi tham số được đặt, nó được thiết lập như một điều kiện chéo vàng để tạo thành một tín hiệu dài; khi Fisher Transform vượt qua từ trên đường không hoặc bên ngoài phạm vi tham số, nó được thiết lập như một điều kiện chéo chết để tạo thành một tín hiệu ngắn.

Các điều kiện thoát là ngược lại, các lệnh dài mở trên thập tự vàng được đóng trên thập tự chết; các lệnh ngắn mở trên thập tự chết được đóng trên thập tự vàng.

Phân tích lợi thế

Lợi thế lớn nhất của chiến lược này là đa yếu tố thích nghi. Nó tận dụng lợi thế của đường trung bình động, dao động và chỉ số xu hướng để hoạt động tốt trong cả thị trường giảm và tăng. Các thông số cũng có thể được điều chỉnh theo đa dạng và chu kỳ để đạt được khả năng thích nghi.

Ngoài ra, chiến lược này kết hợp một cơ chế dừng lỗ tự động. Khi giá phá vỡ trở lại trên Trung bình Di chuyển Hull, nó sẽ tự động dừng lỗ để thoát ra. Điều này làm giảm đáng kể rủi ro thua lỗ cho chiến lược.

Rủi ro và giải pháp

Rủi ro lớn nhất của chiến lược này là các tín hiệu lỗi giữa các chỉ báo. Khi giá di chuyển sang một bên, các chỉ báo có thể tạo ra một số chéo không cần thiết. Điều này sẽ dẫn đến nhập và dừng lỗ không cần thiết.

Giải pháp là điều chỉnh các thông số chỉ số một cách thích hợp để lọc ra một số tín hiệu nhỏ. Hoặc kết hợp nhiều chỉ số phụ để xác nhận. Ví dụ, thêm một chỉ số âm lượng để xác định tín hiệu thực.

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

Chiến lược có thể được tối ưu hóa theo các hướng sau:

  1. Thêm thuật toán học máy để đạt được tối ưu hóa tham số tự động. Có thể đào tạo dựa trên dữ liệu lịch sử và điều chỉnh các tham số chỉ số trong thời gian thực.

  2. Thêm thêm các chỉ số để ghi điểm, thực hiện chiến lược quyết định đa số và cải thiện độ chính xác quyết định.

  3. Thêm một cơ chế xác nhận đột phá sử dụng mức giá quan trọng và các kênh xác nhận lại để tránh lỗi hoạt động.

  4. Thêm một mô-đun đánh giá rủi ro có thể tự động điều chỉnh kích thước vị trí và phạm vi dừng lỗ dựa trên điều kiện thị trường.

Kết luận

Nhìn chung, đây là một khung đa yếu tố thích nghi rất tốt. Nó kết hợp phán đoán xu hướng của các đường trung bình động, phán đoán mua quá nhiều và bán quá nhiều của các dao động, và ứng dụng các đường chéo chỉ số, tạo thành một cơ chế vào và ra hoàn chỉnh. Nếu nó có thể được tối ưu hóa hơn nữa và tăng các thành phần thích nghi và thông minh, nó sẽ trở thành một sản phẩm chiến lược có giá trị thương mại cực kỳ cao.


/*backtest
start: 2023-01-09 00:00:00
end: 2024-01-15 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is free to copy/paste/use. no permission required. just do it!
// © @SeaSide420 
//@version=4
strategy(title="Hull Fisher",currency="USD",default_qty_type=strategy.percent_of_equity,default_qty_value=100,commission_type=strategy.commission.percent,commission_value=0.25)

//=================================== Inputs =========================================================
period =input(title="HullMA Length", type=input.integer, defval=14, minval=2)
length =input(9, minval=1, title="Signal Length")
line1 = input(5, minval=2, title="Top Line")
line5 = input(-5, maxval=-2, title="Bottom Line")
price = input(open, type=input.source, title="Price data")
entry1 =input(true,type=input.bool, title="Open when HullFisher crossover outside Lines")
entry2 =input(true,type=input.bool, title="Open when HullFisher past zero")
useHMA =input(true,type=input.bool, title="Include Hull_moving_average")
useCCI =input(true,type=input.bool, title="Include Commodity_channel_index")
fishclose=input(true,type=input.bool, title="Close order when Fisher crossover")
HMAclose=input(true,type=input.bool, title="Close order when Hull crossover")

//================================ Calculations ======================================================
HMA = hma(price,period)
HMA2 = HMA[1]
high_ = highest(HMA, length)
low_ = lowest(HMA, length)
round_(val) => val > .99 ? .999 : val < -.99 ? -.999 : val
value = 0.0
value := round_(.66 * ((HMA - low_) / max(high_ - low_, .001) - .5) + .67 * nz(value[1]))
value1 = 0.0
value1 := .5 * log((1 + value) / max(1 - value, .001)) + .5 * nz(value1[1])
value2 = value1[1]
CCI1 = cci(price,period)
CCI2 = CCI1[1]
line2 = line1/2
line4 = line5/2

//================================ Draw Plots =======================================================
colorchange1 =CCI1>CCI2?color.lime:color.red
colorchange2 =value1>value2?color.lime:color.red
a =plot(line1,style=plot.style_line,color=color.red,transp=50,linewidth=2,title="Top Line")
b =plot(line2,style=plot.style_line,color=color.red,transp=50,linewidth=2,title="Upper Line")
c =plot(0,style=plot.style_line,color=color.black,transp=50,linewidth=2,title="Middle Line")
d =plot(line4,style=plot.style_line,color=color.lime,transp=50,linewidth=2,title="Lower Line")
e =plot(line5,style=plot.style_line,color=color.lime,transp=50,linewidth=2,title="Bottom Line")
f =plot(value1, color=color.black,transp=50,linewidth=2, title="Value 1")
g =plot(value2, color=color.black,transp=50,linewidth=2, title="Value 2")
h =plot(CCI1/50,style=plot.style_area, color=colorchange1,transp=50,linewidth=2, title="CCI")
fill(f,g,color=colorchange2,transp=20,title="Color fill")
plot(cross(value1, value2) ? value1 : na, style=plot.style_circles, color=color.black, linewidth=10)
plot(cross(value1, value2) ? value1 : na, style=plot.style_circles, color=color.white, linewidth=8)
plot(cross(value1, value2) ? value1 : na, style=plot.style_circles, color=colorchange2, linewidth=5)

//============================= Entry conditions ====================================================
// Outside Lines crossover or zero lines crossover
LongCondition1 = value1>value2 and value1<line5 and entry1 and not useCCI and not useHMA
ShortCondition1 = value1<value2 and value1>line1 and entry1 and not useCCI and not useHMA
LongCondition2 = value1>value2 and value1>0 and entry2 and not useCCI and not useHMA
ShortCondition2 = value1<value2 and value1<0 and entry2 and not useCCI and not useHMA

// Use CCI
LongCondition3 = value1>value2 and value1<line5 and CCI1>CCI2 and entry1 and useCCI and not useHMA
ShortCondition3 = value1<value2 and value1>line1 and CCI1<CCI2 and entry1 and useCCI and not useHMA
LongCondition4 = value1>value2 and value1>0 and CCI1>CCI2 and entry2 and useCCI and not useHMA
ShortCondition4 = value1<value2 and value1<0 and CCI1<CCI2 and entry2 and useCCI and not useHMA

// Use HMA
LongCondition5 = value1>value2 and value1<line5 and CCI1>CCI2 and HMA>HMA2 and entry1 and not useCCI and useHMA
ShortCondition5 = value1<value2 and value1>line1 and CCI1<CCI2 and HMA<HMA2 and entry1 and not useCCI and useHMA
LongCondition6 = value1>value2 and value1>0 and CCI1>CCI2 and HMA>HMA2 and entry2 and not useCCI and useHMA
ShortCondition6 = value1<value2 and value1<0 and CCI1<CCI2 and HMA<HMA2 and entry2 and not useCCI and useHMA

//Use CCI & HMA
LongCondition7 = value1>value2 and value1<line5 and CCI1>CCI2 and HMA>HMA2 and entry1 and useCCI and useHMA
ShortCondition7 = value1<value2 and value1>line1 and CCI1<CCI2 and HMA<HMA2 and entry1 and useCCI and useHMA
LongCondition8 = value1>value2 and value1>0 and CCI1>CCI2 and HMA>HMA2 and entry2 and useCCI and useHMA
ShortCondition8 = value1<value2 and value1<0 and CCI1<CCI2 and HMA<HMA2 and entry2 and useCCI and useHMA

//========================= Exit & Entry excecution =================================================
if HMAclose and fishclose and value1<value2 and HMA<HMA2
    strategy.close("BUY")
if HMAclose and fishclose and value1>value2 and HMA>HMA2
    strategy.close("SELL")
if HMAclose and HMA<HMA2
    strategy.close("BUY")
if HMAclose and HMA>HMA2
    strategy.close("SELL")
if fishclose and value1<value2
    strategy.close("BUY")
if fishclose and value1>value2
    strategy.close("SELL")    
if LongCondition1 or LongCondition2 or LongCondition3 or LongCondition4 or LongCondition5 or LongCondition6 or LongCondition7 or LongCondition8
    strategy.entry("BUY", strategy.long)
if ShortCondition1 or ShortCondition2 or ShortCondition3 or ShortCondition4 or ShortCondition5 or ShortCondition6 or ShortCondition7 or ShortCondition8
    strategy.entry("SELL", strategy.short)


Thêm nữa