Sử dụng Chiến lược theo dõi số dư trung bình động Hull


Ngày tạo: 2023-12-29 16:26:49 sửa đổi lần cuối: 2023-12-29 16:26:49
sao chép: 2 Số nhấp chuột: 589
1
tập trung vào
1621
Người theo dõi

Sử dụng Chiến lược theo dõi số dư trung bình động Hull

Tổng quan

Chiến lược theo dõi tỷ lệ sử dụng trung bình di chuyển của Hull làm chỉ số chính để đưa ra thị trường, để xác định xu hướng của giá. Đồng thời, chiến lược này kết hợp với nhiều chỉ số khác, như đường chuẩn, chỉ số xác nhận, v.v., để xác minh xu hướng giá và lọc các tín hiệu giả. Sau khi đưa ra thị trường, chiến lược sử dụng chiều dài sóng thực trung bình để tính toán lỗ hổng động để theo dõi xu hướng và kiếm lợi nhuận.

Nguyên tắc chiến lược

Trung tâm của chiến lược theo dõi tỷ lệ là đường trung bình di chuyển của Hull. Đường trung bình di chuyển của Hull nhạy cảm hơn với sự thay đổi giá và có thể đánh giá hiệu quả hướng xu hướng. Khi giá vượt qua đường Hull lên, xác nhận xu hướng tăng lên, làm nhiều; Khi giá đi xuống, phá vỡ đường Hull, xác nhận xu hướng giảm.

Ngoài ra, chiến lược cũng giới thiệu các chỉ số đường chuẩn để xác định xu hướng dài ngắn; các chỉ số xác nhận để lọc các đột phá giả. Chỉ khi cả đường chuẩn và chỉ số xác nhận xác nhận hướng xu hướng, tín hiệu giao dịch sẽ được phát đi.

Sau khi đưa ra thị trường, chiến lược sử dụng sóng thực trung bình được tính toán bởi ATR và Hull EMA để thiết lập vị trí dừng lỗ. Dòng dừng sẽ di chuyển lên / xuống liên tục để khóa lợi nhuận theo xu hướng.

Phân tích lợi thế

Chiến lược theo dõi tỷ lệ cân bằng kết hợp lợi thế của phán đoán xu hướng và kiểm soát rủi ro, có thể thu được lợi nhuận tốt hơn trong tình huống xu hướng. So với chiến lược dừng cố định, nó có thể theo dõi xu hướng bằng cách di chuyển dừng và tránh bị dừng bởi biến động bình thường của thị trường.

Việc sử dụng kết hợp nhiều chỉ số cũng làm cho chiến lược nhạy cảm hơn với sự thay đổi của thị trường, đồng thời có thể lọc hiệu quả các tín hiệu giả. Ngoài ra, chiến lược cũng cung cấp nhiều tham số để điều chỉnh, người dùng có thể tối ưu hóa dựa trên phán đoán của mình về thị trường.

Phân tích rủi ro

Chiến lược này phụ thuộc chủ yếu vào các chỉ số xu hướng, dễ gây ra tín hiệu sai và dừng lỗ khi sắp xếp. Ngoài ra, các chỉ số xung đột có thể xảy ra khi kết hợp nhiều chỉ số. Thiết lập tham số không đúng cũng có thể dẫn đến hiệu suất kém của chiến lược.

Có thể xem xét thêm mô-đun phán đoán bổ sung vào chiến lược, tạm dừng giao dịch khi các chỉ số có sự khác biệt; hoặc sử dụng cơ chế bỏ phiếu, kết hợp kết quả phán đoán của nhiều chỉ số. Về thiết lập tham số, bạn có thể tìm ra tham số tốt nhất thông qua phương pháp tối ưu hóa phản hồi.

Hướng tối ưu hóa

Chiến lược theo dõi cân bằng có thể được tối ưu hóa theo một số hướng sau:

  1. Thêm mô-đun phán đoán, chẳng hạn như mô-đun tỷ lệ biến động, tạm dừng giao dịch khi biến động cao;
  2. Thêm mô-đun học máy, sử dụng thuật toán học máy để đánh giá trọng lượng chỉ số;
  3. Tối ưu hóa các tham số chỉ số để tìm ra sự kết hợp tham số tốt nhất;
  4. Tối ưu hóa các thuật toán dừng lỗ di động để dừng lỗ có thể theo dõi xu hướng tốt hơn;
  5. Tham gia các mô-đun quản lý rủi ro, chẳng hạn như dừng vi phạm, điều chỉnh vị trí động.

Tóm tắt

Chiến lược theo dõi tỷ lệ thuận nói chung là một chiến lược theo dõi xu hướng xuất sắc. Nó kết hợp thành công sự phán đoán xu hướng với dừng động, có thể theo dõi xu hướng một cách hiệu quả. Với sự tối ưu hóa hơn nữa, có khả năng đạt được hiệu suất chiến lược tốt hơn.

Mã nguồn chiến lược
/*backtest
start: 2023-11-28 00:00:00
end: 2023-12-28 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// © Milleman
//@version=4
strategy("MilleMachine", overlay=true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, initial_capital=10000, commission_type=strategy.commission.percent, commission_value=0.06)


// Additional settings
Mode = input(title="Mode", defval="LongShort", options=["LongShort", "OnlyLong", "OnlyShort","Indicator Mode"])
UseTP = false                               //input(false, title="Use Take Profit?")
QuickSwitch = true                          //input(true, title="Quickswitch")
UseTC = true                                //input(true, title="Use Trendchange?")

// Risk management settings
//Spacer2 = input(false, title="======= Risk management settings =======")
Risk = input(1.0, title="% Risk",minval=0)/100
RRR = 2                                     //input(2,title="Risk Reward Ratio",step=0.1,minval=0,maxval=20)
SL_Mode = false                             // input(true, title="ON = Fixed SL / OFF = Dynamic SL (ATR)")
SL_Fix = 3                                  //input(3,title="StopLoss %",step=0.25, minval=0)/100
ATR = atr(14)                               //input(14,title="Periode ATR"))
Mul = input(2,title="ATR Multiplier",step=0.1)
xATR = ATR * Mul
SL = SL_Mode ? SL_Fix : (1 - close/(close+xATR))

// INDICATORS  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Ind(type, src, len) =>
    float result = 0
    if type=="McGinley"
        result := na(result[1]) ? ema(src, len) : result[1] + (src - result[1]) / (len * pow(src/result[1], 4))
    if type=="HMA"
        result := wma(2*wma(src, len/2)-wma(src, len), round(sqrt(len)))
    if type=="EHMA"
        result := ema(2*ema(src, len/2)-ema(src, len), round(sqrt(len)))
    if type=="THMA"
        lend = len/2
        result := wma(wma(src, lend/3)*3-wma(src, lend/2)-wma(src,lend), lend)
    if type=="SMA" // Simple
        result := sma(src, len)
    if type=="EMA" // Exponential
        result := ema(src, len)
    if type=="DEMA" // Double Exponential
        e = ema(src, len)
        result := 2 * e - ema(e, len)
    if type=="TEMA" // Triple Exponential
        e = ema(src, len)
        result := 3 * (e - ema(e, len)) + ema(ema(e, len), len)
    if type=="WMA" // Weighted
        result := wma(src, len)
    if type=="VWMA" // Volume Weighted
        result := vwma(src, len) 
    if type=="SMMA" // Smoothed
        w = wma(src, len)
        result := (w[1] * (len - 1) + src) / len
    if type == "RMA"
        result := rma(src, len)
    if type=="LSMA" // Least Squares
        result := linreg(src, len, 0)
    if type=="ALMA" // Arnaud Legoux
        result := alma(src, len, 0.85, 6)
    if type=="Kijun" //Kijun-sen
        kijun = avg(lowest(len), highest(len))
        result :=kijun
    if type=="WWSA" // Welles Wilder Smoothed Moving Average
        result := nz(result[1]) + (close -nz(result[1]))/len
    result

// Baseline : Switch from Long to Short and vice versa
BL_Act = input(true, title="====== Activate Baseline - Switch L/S ======")
BL_type = input(title="Baseline Type", defval="McGinley", options=["McGinley","HMA","EHMA","THMA","SMA","EMA","DEMA","TEMA","WMA","VWMA","SMMA","RMA","LSMA","ALMA","Kijun","WWSA"])
BL_src = input(close, title="BL source")
BL_len = input(50, title="BL length", minval=1)
BL = Ind(BL_type,BL_src, BL_len)

// Confirmation indicator
C1_Act = input(false, title="===== Activate Confirmation indicator =====")
C1_type = input(title="C1 Entry indicator", defval="SMA", options=["McGinley","HMA","EHMA","THMA","SMA","EMA","DEMA","TEMA","WMA","VWMA","SMMA","RMA","LSMA","ALMA","Kijun","WWSA"])
C1_src = input(close, title="Source")
C1_len = input(5,title="Length", minval=1)
C1 = Ind(C1_type,C1_src,C1_len)

// Entry indicator : Hull Moving Average
Spacer5 = input(true, title="====== ENTRY indicator =======")
EI_type = input(title="EI Entry indicator", defval="HMA", options=["McGinley","HMA","EHMA","THMA","SMA","EMA","DEMA","TEMA","WMA","VWMA","SMMA","RMA","LSMA","ALMA","Kijun","WWSA"])
EI_src = input(close, title="Source")
EI_Len = input(46,title="Length", minval=1)
EI = Ind(EI_type,EI_src,EI_Len)

// Trail stop settings
TrailActivation = input(true, title="===== Activate Trailing Stop =====")
TS_type = input(title="TS Traling Stop Type", defval="EMA", options=["McGinley","HMA","EHMA","THMA","SMA","EMA","DEMA","TEMA","WMA","VWMA","SMMA","RMA","LSMA","ALMA","Kijun","WWSA"])
TrailSLScaling = 1 //input(100, title="SL Scaling", minval=0, step=5)/100
TrailingSourceLong = Ind(TS_type,low,input(5,"Smoothing Trail Long EMA", minval=1))
TrailingSourceShort = Ind(TS_type,high,input(2,"Smoothing Trail Short EMA", minval=1))

//VARIABLES MANAGEMENT
TriggerPrice = 0.0, TriggerPrice := TriggerPrice[1]
TriggerSL = 0.0, TriggerSL := TriggerSL[1]
SLPrice = 0.0, SLPrice := SLPrice[1], TPPrice = 0.0, TPPrice := TPPrice[1]
isLong = false, isLong := isLong[1], isShort = false, isShort := isShort[1]

//LOGIC
GoLong = crossover(EI,EI[1]) and (strategy.position_size == 0.0 and QuickSwitch) and (not BL_Act or BL/BL[1] > 1) and (not C1_Act or C1>C1[1]) and (Mode == "LongShort" or Mode == "OnlyLong")
GoShort = crossunder(EI,EI[1]) and (strategy.position_size == 0.0 and QuickSwitch) and (not BL_Act or BL/BL[1] < 1) and (not C1_Act or C1<C1[1]) and (Mode == "LongShort" or Mode == "OnlyShort")
ExitLong = isLong and crossunder(EI,EI[1]) and UseTC
ExitShort = isShort and crossover(EI,EI[1]) and UseTC

//FRAMEWORK
//Reset Long-Short memory
if isLong and strategy.position_size == 0.0
    isLong := false
if isShort and strategy.position_size == 0.0
    isShort := false
//Long
if GoLong
    isLong := true, TriggerPrice := close, TriggerSL := SL
    TPPrice := UseTP? TriggerPrice * (1 + (TriggerSL * RRR)) : na
    SLPrice := TriggerPrice * (1-TriggerSL)
    Entry_Contracts = strategy.equity * Risk / ((TriggerPrice-SLPrice)/TriggerPrice) / TriggerPrice
    strategy.entry("Long", strategy.long, comment=tostring(round((TriggerSL/TriggerPrice)*1000)), qty=Entry_Contracts)
    strategy.exit("TPSL","Long", limit=TPPrice, stop=SLPrice)
if isLong
    NewValSL = TrailingSourceLong * (1 - (SL*TrailSLScaling))
    if TrailActivation and NewValSL > SLPrice
        SLPrice := NewValSL
    strategy.exit("TPSL","Long", limit=TPPrice, stop=SLPrice)
if ExitLong
    strategy.close_all(comment="TrendChange")
    isLong := false

//Short
if GoShort
    isShort := true, TriggerPrice := close, TriggerSL := SL
    TPPrice := UseTP? TriggerPrice * (1 - (TriggerSL * RRR)) : na
    SLPrice := TriggerPrice * (1 + TriggerSL)
    Entry_Contracts = strategy.equity * Risk / ((SLPrice-TriggerPrice)/TriggerPrice) / TriggerPrice
    strategy.entry("Short", strategy.short, comment=tostring(round((TriggerSL/TriggerPrice)*1000)), qty=Entry_Contracts)
    strategy.exit("TPSL","Short", limit=TPPrice, stop=SLPrice)
if isShort
    NewValSL = TrailingSourceShort * (1 + (SL*TrailSLScaling))
    if TrailActivation and NewValSL < SLPrice
        SLPrice := NewValSL
    strategy.exit("TPSL","Short", limit=TPPrice, stop=SLPrice)
if ExitShort
    strategy.close_all(comment="TrendChange")
    isShort := false

//VISUALISATION
plot(BL_Act?BL:na, color=color.blue,title="Baseline")
plot(C1_Act?C1:na, color=color.yellow,title="confirmation Indicator")
EIColor = EI>EI[1] ? color.green : color.red
Fill_EI = plot(EI, color=EIColor, linewidth=1, transp=40, title="Entry Indicator EI")
Fill_EID = plot(EI[1], color=EIColor, linewidth=1, transp=40, title="Entry Indicator EID")
fill(Fill_EI,Fill_EID, title="EI_Fill", color=EIColor,transp=50)

plot(strategy.position_size != 0.0 and (isLong or isShort) ? TriggerPrice : na, title="TriggerPrice", color=color.yellow, style=plot.style_linebr)
plot(strategy.position_size != 0.0 and (isLong or isShort) ? TPPrice : na, title="TakeProfit", color=color.green, style=plot.style_linebr)
plot(strategy.position_size != 0.0 and (isLong or isShort) ? SLPrice : na, title="StopLoss", color=color.red, style=plot.style_linebr)
bgcolor(isLong[1] and cross(low,SLPrice) and low[1] > SLPrice and TriggerPrice>SLPrice ? color.yellow : na, transp=75, title="SL Long")
bgcolor(isShort[1] and cross(high,SLPrice) and high[1] < SLPrice and TriggerPrice<SLPrice ? color.yellow : na, transp=75, title="SL Short")