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.
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.
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 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.
Chiến lược có thể được tối ưu hóa theo các hướng sau:
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.
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.
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.
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.
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)