
Chiến lược này sử dụng hai trung bình di chuyển Hall ngắn hạn và dài hạn để tạo ra và lọc tín hiệu giao dịch. Trung bình di chuyển Hall ngắn hạn được sử dụng để tạo ra tín hiệu, trong khi trung bình di chuyển Hall dài hạn được sử dụng để lọc tín hiệu, chỉ khi trung bình Hall ngắn hạn và trung bình Hall dài hạn thay đổi đồng bộ sẽ tạo ra tín hiệu giao dịch.
Chiến lược này sử dụng chỉ số ATR để thiết lập điểm dừng và điểm dừng đồng thời. Mỗi lần mở vị trí, điểm dừng và điểm dừng của vị trí hiện tại sẽ được thiết lập động theo giá trị của ATR.
Trung bình di chuyển Hall ngắn hạn được sử dụng để nắm bắt xu hướng ngắn hạn của giá và các điểm biến. Khi hướng của trung bình di chuyển Hall ngắn hạn thay đổi, nó cho thấy xu hướng ngắn hạn của giá đã thay đổi.
Trung bình di chuyển Hall dài hạn được sử dụng để xác định xu hướng chung của giá. Ví dụ, khi hướng của trung bình di chuyển Hall dài hạn tăng lên, nó cho thấy giá đang trong xu hướng tăng chung.
Một tín hiệu giao dịch chỉ được tạo ra khi đường trung bình di chuyển của Hall ngắn hạn bị đảo ngược và hướng đảo ngược của nó phù hợp với hướng di chuyển tổng thể của đường trung bình di chuyển của Hall dài hạn. Đó là, chỉ khi xu hướng ngắn hạn của giá thay đổi và xu hướng tổng thể cũng thay đổi theo cùng một hướng, tín hiệu ngắn hạn này sẽ được giao dịch. Điều này có thể hiệu quả lọc các tín hiệu sai do tiếng ồn của thị trường ngắn hạn.
Sau khi mở vị trí, bạn sẽ thiết lập điểm dừng lỗ và điểm dừng dựa trên kích thước của chỉ số ATR. Chỉ số ATR có thể phản ánh mức độ biến động và mức độ rủi ro của thị trường. Vị trí dừng lỗ sẽ được đặt dưới mức giá thấp, trong khi vị trí dừng lỗ sẽ được đặt trên mức giá cao, và tất cả sẽ được gắn với giá trị ATR, tùy theo mức độ biến động của thị trường để điều chỉnh phạm vi dừng lỗ.
Chiến lược này kết hợp các tín hiệu ngắn hạn và lọc dài hạn, có thể xác định hiệu quả xu hướng giá trong thời gian trung bình và nắm bắt các điểm biến đổi kịp thời. So với các chỉ số như trung bình di chuyển đơn lẻ, có thể giảm khả năng bị lừa bởi tiếng ồn thị trường.
Động thái điều chỉnh vị trí dừng lỗ, có thể thiết lập một điểm dừng lỗ hợp lý theo mức độ biến động của thị trường, tránh quá quyết liệt, giảm thiểu rủi ro thua lỗ trong khi đảm bảo lợi nhuận.
Với những ưu điểm của trung bình di chuyển Hall, nó có thể xác định các biến động giá một cách linh hoạt và chính xác hơn, và có khả năng theo dõi mạnh hơn so với trung bình di chuyển thông thường.
Chiến lược này dựa vào sự giao thoa của hai đường trung bình di chuyển của Hall trong ngắn hạn và dài hạn làm tín hiệu, và nếu có sự giao thoa giả giữa hai đường trung bình di chuyển, có thể gây ra sai lầm nhập cảnh. Trong trường hợp này, cần phải quyết định lọc tín hiệu dựa trên cấu trúc thị trường dài hạn.
Trong trường hợp xung đột, giá có thể dao động trong một phạm vi giao dịch nhỏ hơn, điều này làm tăng tỷ lệ lỗi tín hiệu và tăng khả năng giao dịch vô nghĩa. Khi đó, bạn có thể tránh giao dịch vô nghĩa bằng cách mở rộng các điều kiện lọc tín hiệu giao dịch.
Cài đặt dừng lỗ phụ thuộc vào chỉ số ATR, và nếu biến động thị trường được phản ánh bởi chỉ số ATR không chính xác, vị trí dừng lỗ cũng sẽ không có hiệu lực. Trong trường hợp này, bạn có thể cân nhắc sửa đổi giá trị ATR kết hợp với các chỉ số biến động khác.
Có thể xem xét kết hợp với các chỉ số ngắn hạn khác để hỗ trợ phán đoán tín hiệu, chẳng hạn như các chỉ số quá mua quá bán như RSI, để tăng hiệu quả lọc.
Có thể tăng hoặc tối ưu hóa các mối quan hệ logic lọc giữa các trung bình di chuyển Hall dài và ngắn, làm cho các quy tắc lọc nghiêm ngặt hơn, tránh các tín hiệu sai.
Có thể nghiên cứu ảnh hưởng của các thiết lập tham số khác nhau đối với sự ổn định và lợi nhuận của chiến lược. Ví dụ, các kết hợp khác nhau của tham số trung bình di chuyển, tham số ATR và các tham số khác nhau có thể tạo ra hiệu suất giao dịch khác nhau.
Chiến lược này tổng hợp các phương pháp thu thập tín hiệu của trung bình di chuyển Hall ngắn hạn, lọc tín hiệu của trung bình di chuyển Hall dài hạn và thiết lập trạm dừng lỗ của chỉ số ATR để tạo thành một hệ thống chiến lược theo dõi xu hướng trung hạn hoàn chỉnh. Chiến lược này có thể phát hiện hiệu quả các điểm biến giá trung hạn và tránh bị nhiễu bởi tiếng ồn thị trường ngắn hạn, là một công cụ chọn cổ phiếu quan trọng để xây dựng hệ thống giao dịch xu hướng.
/*backtest
start: 2023-12-04 00:00:00
end: 2024-01-03 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
strategy("Hull Filtered Strategy", overlay=true, pyramiding=0, default_qty_type= strategy.percent_of_equity, default_qty_value = 10, calc_on_order_fills=false, slippage=0,commission_type=strategy.commission.percent,commission_value=0)
// Parameters for Hull Moving Averages
src = input(close, title="Source")
signal_period = input(50, title="Period of signal HMA")
filter_period = input(200, title="Period of filter HMA")
strat_dir_input = input(title="Strategy Direction", defval="all", options=["long", "short", "all"])
// Set allowed trading directions
strat_dir_value = strat_dir_input == "long" ? strategy.direction.long : strat_dir_input == "short" ? strategy.direction.short : strategy.direction.all
strategy.risk.allow_entry_in(strat_dir_value)
// stop loss and take profit
sl_factor = input(2,title="Stop Loss Factor")
tp_factor = input(3,title="Take Profit Factor")
atr_period = input(14, title="ATR Period (SL/TP)")
// Testing Start dates
testStartYear = input(2010, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)
//Stop date if you want to use a specific range of dates
testStopYear = input(2030, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0)
// -----------------------------------------------------------------------------
// Global variables
// -----------------------------------------------------------------------------
var float tp = na
var float sl = na
var float position = na
// -----------------------------------------------------------------------------
// Functions
// -----------------------------------------------------------------------------
testWindow() =>
time >= testPeriodStart and time <= testPeriodStop ? true : false
// -----------------------------------------------------------------------------
// The engine
// -----------------------------------------------------------------------------
hma_signal = hma(src, signal_period)
hma_filter = hma(src, filter_period)
// Used to determine exits and stop losses
atr_e = atr(atr_period)
// if hma_filter increases hma_trend is set to 1, if it decreases hma_trend is set to -1. If no trend is available, hma_trend is set to ß0
trend = hma_filter > hma_filter[1] ? 1 : hma_filter < hma_filter[1] ? -1 : 0
signal = hma_signal > hma_signal[1] ? 1 : hma_signal < hma_signal[1] ? -1 : 0
// -----------------------------------------------------------------------------
// signals
// -----------------------------------------------------------------------------
if signal[0] == 1 and signal[1] != 1 and trend == 1 and testWindow()
sl := close - sl_factor*atr_e
tp := close + tp_factor*atr_e
strategy.entry("HMA_LNG", strategy.long)
strategy.exit("LE", "HMA_LNG", profit=100*tp_factor*atr_e, loss=100*sl_factor*atr_e)
if signal[0] == -1 and signal[1] != -1 and trend == -1 and testWindow()
sl := close + sl_factor*atr_e
tp := close - tp_factor*atr_e
strategy.entry("HMA_SHRT", strategy.short)
strategy.exit("SE", "HMA_SHRT", profit=100*tp_factor*atr_e, loss=100*sl_factor*atr_e)
if strategy.position_size != 0
sl := sl[1]
tp := tp[1]
// -----------------------------------------------------------------------------
// PLOT
// -----------------------------------------------------------------------------
hma_s = plot(hma_signal, title="SIGNAL", color = signal == 1 ? color.green : color.red)
hma_l = plot(hma_filter, title="TREND", color = trend == 1 ? color.green : color.red)
plot(tp, title="TAKE PROFIT", color= strategy.position_size != 0 ? color.blue: na, linewidth=1)
plot(sl, title="STOP LOSS", color= strategy.position_size != 0 ? color.red: na, linewidth = 1)