Chiến lược này dựa trên các tín hiệu chéo của Hull Moving Average (HMA). Hull Moving Average là một chỉ số kỹ thuật được phát triển bởi Alan Hull, nhằm giảm sự chậm trễ của các đường trung bình chuyển động truyền thống. Chiến lược sử dụng hai HMA với các khoảng thời gian khác nhau. Một tín hiệu mua được tạo ra khi HMA ngắn hạn vượt qua trên HMA dài hạn, và một tín hiệu bán được tạo ra khi điều ngược lại xảy ra.
HMA được tính như sau:
So với Mức trung bình di chuyển đơn giản và Mức trung bình di chuyển cân nhắc, Mức trung bình di chuyển Hull có độ trễ ít hơn, do đó nó có thể phản ứng nhanh hơn với những thay đổi giá, cải thiện khả năng đáp ứng của chiến lược.
Bằng cách sử dụng sự chéo chéo của hai HMA với thời gian khác nhau để tạo tín hiệu, rất nhiều tiếng ồn và tín hiệu sai có thể được lọc hiệu quả, tăng độ tin cậy của tín hiệu.
Các tham số có thể điều chỉnh. Bằng cách điều chỉnh các tham số thời gian của HMA, chiến lược có thể được điều chỉnh cho các thị trường và công cụ giao dịch khác nhau.
Trung bình di chuyển Hull là một chỉ số chậm, có thể tạo ra tín hiệu sai trong giai đoạn đầu của sự đảo ngược xu hướng.
Chọn tham số không phù hợp có thể dẫn đến hiệu suất chiến lược kém. Nếu thời gian quá dài, chiến lược sẽ chậm phản ứng; nếu thời gian quá ngắn, nó có thể dẫn đến tín hiệu sai quá mức.
Giống như tất cả các chiến lược dựa trên một chỉ số duy nhất, chiến lược này có thể không hoạt động tốt trong thị trường bên cạnh, tạo ra nhiều tín hiệu sai và thua lỗ giao dịch.
Xem xét việc đưa ra các chỉ số kỹ thuật hoặc các yếu tố cơ bản khác làm bộ lọc, chẳng hạn như khối lượng giao dịch, chỉ số xu hướng, v.v., để xác nhận thêm tính hợp lệ của các tín hiệu chéo HMA.
Đối với tối ưu hóa tham số, các phương pháp như thuật toán di truyền và tìm kiếm lưới có thể được sử dụng để tìm kết hợp tham số tối ưu trên dữ liệu lịch sử phù hợp nhất với thị trường hiện tại.
Kết hợp các cơ chế dừng lỗ và lấy lợi nhuận vào chiến lược để kiểm soát rủi ro và lợi nhuận của mỗi giao dịch.
Xem xét xu hướng của thị trường. Bằng cách giới thiệu các chỉ số để đánh giá xu hướng thị trường, người ta có thể giao dịch trên các thị trường xu hướng và tránh các thị trường bên.
Chiến lược Hull Moving Average Crossover là một chiến lược giao dịch đơn giản và dễ sử dụng. Với đặc điểm phản ứng nhanh của HMA, nó có thể nắm bắt sự thay đổi giá theo thời gian. Tuy nhiên, giống như tất cả các chiến lược, nó cũng có những hạn chế của nó và hiệu suất của nó sẽ bị ảnh hưởng bởi các loại thị trường và lựa chọn tham số. Trong ứng dụng thực tế, nó có thể được kết hợp với các phương pháp phân tích khác để xác nhận thêm các tín hiệu. Đồng thời, các biện pháp kiểm soát rủi ro hợp lý, chẳng hạn như dừng lỗ và lấy lợi nhuận, quản lý vị trí, vv, cũng là những phần không thể thiếu cho hoạt động ổn định của chiến lược.
/*backtest start: 2023-03-16 00:00:00 end: 2024-03-21 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 //Basic Hull Ma Pack tinkered by InSilico strategy("RKTD BETA - Hull Suite by InSilico", overlay=true) //INPUT src = input(close, title="Source") modeSwitch = input("Ehma", title="Hull Variation", options=["Hma", "Thma", "Ehma"]) length = input(200, title="Length(180-200 for floating S/R , 55 for swing entry)") lengthMult = input(1.0, title="Length multiplier (Used to view higher timeframes with straight band)") useHtf = input(false, title="Show Hull MA from X timeframe? (good for scalping)") htf = input("240", title="Higher timeframe", type=input.resolution) switchColor = input(true, "Color Hull according to trend?") candleCol = input(false,title="Color candles based on Hull's Trend?") visualSwitch = input(true, title="Show as a Band?") thicknesSwitch = input(1, title="Line Thickness") transpSwitch = input(40, title="Band Transparency",step=5) // Alert Messages longAlertMessage = '{"base": "BTC", "quote": "USDT", "price": ' + tostring(close) + ', "action": "long", "orderType": "market", "close":true}' shortAlertMessage = '{"base": "BTC", "quote": "USDT", "price": ' + tostring(close) + ', "action": "short", "orderType": "market", "close":true}' //FUNCTIONS //HMA HMA(_src, _length) => wma(2 * wma(_src, _length / 2) - wma(_src, _length), round(sqrt(_length))) //EHMA EHMA(_src, _length) => ema(2 * ema(_src, _length / 2) - ema(_src, _length), round(sqrt(_length))) //THMA THMA(_src, _length) => wma(wma(_src,_length / 3) * 3 - wma(_src, _length / 2) - wma(_src, _length), _length) //SWITCH Mode(modeSwitch, src, len) => modeSwitch == "Hma" ? HMA(src, len) : modeSwitch == "Ehma" ? EHMA(src, len) : modeSwitch == "Thma" ? THMA(src, len/2) : na //OUT _hull = Mode(modeSwitch, src, int(length * lengthMult)) HULL = useHtf ? security(syminfo.ticker, htf, _hull) : _hull MHULL = HULL[0] SHULL = HULL[2] //COLOR hullColor = switchColor ? (HULL > HULL[2] ? #00ff00 : #ff0000) : #ff9800 //PLOT ///< Frame Fi1 = plot(MHULL, title="MHULL", color=hullColor, linewidth=thicknesSwitch, transp=50) Fi2 = plot(visualSwitch ? SHULL : na, title="SHULL", color=hullColor, linewidth=thicknesSwitch, transp=50) alertcondition(crossover(MHULL, SHULL), title="Hull trending up.", message="Hull trending up.") alertcondition(crossover(SHULL, MHULL), title="Hull trending down.", message="Hull trending down.") ///< Ending Filler fill(Fi1, Fi2, title="Band Filler", color=hullColor, transp=transpSwitch) ///BARCOLOR barcolor(color = candleCol ? (switchColor ? hullColor : na) : na) // Define Buy and Sell Conditions based on crossovers buyCondition = crossover(MHULL, SHULL) sellCondition = crossunder(MHULL, SHULL) // Plotting the Hull Moving Average (HMA) plot(MHULL, title="MHULL", color=hullColor, linewidth=thicknesSwitch) plot(SHULL, title="SHULL", color=hullColor, linewidth=thicknesSwitch, transp=transpSwitch) fill(Fi1, Fi2, title="Band Filler", color=hullColor, transp=transpSwitch) // Execute Strategy based on Buy and Sell Conditions strategy.entry("Buy", strategy.long, when=buyCondition, alert_message=longAlertMessage) strategy.entry("Sell", strategy.short, when=sellCondition, alert_message=shortAlertMessage) // Additional elements like bar coloring remain unchanged barcolor(color = candleCol ? (switchColor ? hullColor : na) : na)