Hull Filter Moving Average chiến lược

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

img

Tổng quan

Chiến lược này sử dụng trung bình di chuyển Hull 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 Hull ngắn hạn được sử dụng để tạo ra tín hiệu, trong khi trung bình di chuyển Hull dài hạn được sử dụng để lọc tín hiệu. Các giao dịch chỉ được thực hiện khi trung bình di chuyển Hull ngắn hạn thay đổi hướng và trung bình di chuyển Hull dài hạn đang di chuyển theo cùng một hướng tổng thể.

Chiến lược cũng sử dụng chỉ số ATR để thiết lập dừng lỗ và lấy mức lợi nhuận một cách năng động khi tham gia giao dịch.

Chiến lược logic

Đường trung bình di chuyển ngắn hạn Hull ghi lại xu hướng giá ngắn hạn và các điểm chuyển hướng.

Trung bình động dài hạn của Hull xác định xu hướng giá tổng thể. Ví dụ, khi nó tăng, giá có xu hướng tăng tổng thể.

Các giao dịch chỉ được thực hiện khi đường trung bình chuyển động Hull ngắn hạn chuyển hướng, và hướng mới của nó phù hợp với đường trung bình chuyển động Hull dài hạn. Điều này lọc ra các tín hiệu đi ngược lại xu hướng tổng thể và có thể chỉ là tiếng ồn thị trường ngắn hạn.

Sau khi nhập vào các vị trí, mức dừng lỗ và lấy lợi nhuận được thiết lập dựa trên giá trị chỉ số ATR. ATR phản ánh sự biến động của thị trường và mức độ rủi ro. Stop loss được đặt dưới mức giá thấp trong khi lấy lợi nhuận đặt mục tiêu giá cao, với phạm vi gắn liền với việc đọc ATR hiện tại.

Phân tích lợi thế

Kết hợp các tín hiệu ngắn hạn và các bộ lọc dài hạn có hiệu quả xác định xu hướng trung hạn và điểm chuyển đổi, tránh các tín hiệu sai từ tiếng ồn thị trường.

Động thái dừng lỗ và lấy lợi nhuận dựa trên ATR đặt ra các phạm vi hợp lý dựa trên biến động hiện tại, cân bằng lấy lợi nhuận và ngăn ngừa lỗ.

Trung bình di chuyển Hull có lợi thế linh hoạt và chính xác so với các trung bình di chuyển tiêu chuẩn, với việc theo dõi xu hướng tốt hơn.

Phân tích rủi ro

Chiến lược dựa trên các đường chéo giữa các đường trung bình động Hull để tạo ra tín hiệu.

Trong phạm vi, thị trường hỗn loạn với giá dao động trong phạm vi giao dịch, lỗi tín hiệu và giao dịch không cần thiết có thể tích tụ. Điều này có thể tránh được bằng cách lọc tín hiệu với điều kiện rộng hơn trong các thị trường như vậy.

Dừng lỗ và lấy lợi nhuận phụ thuộc vào ATR có nghĩa là đọc biến động không chính xác sẽ dẫn đến việc đặt không tốt.

Tối ưu hóa

Các chỉ số ngắn hạn bổ sung như RSI có thể cải thiện độ chính xác tín hiệu thông qua hội tụ.

Logic lọc giữa các đường trung bình động Hull có thể được tăng cường để có các yêu cầu nhập khẩu nghiêm ngặt hơn, tránh tín hiệu sai.

Nghiên cứu điều chỉnh tham số có thể phát hiện ra sự ổn định và cải thiện lợi nhuận từ những thay đổi về chiều dài trung bình động, thời gian ATR, v.v.

Tóm lại

Chiến lược này kết hợp việc tạo tín hiệu ngắn hạn, lọc tín hiệu dài hạn và dừng lỗ / lấy lợi nhuận dựa trên ATR trong một khuôn khổ theo xu hướng trung hạn mạnh mẽ. Nó có khả năng xác định các điểm uốn cong trung hạn trong khi lọc ra tiếng ồn ngắn hạn. Với tối ưu hóa tham số và các bộ lọc bổ sung, nó có thể đạt được hiệu suất thậm chí tốt hơn.


/*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)


Thêm nữa