Menggunakan Strategi Penjejakan Baki Purata Pergerakan Hull


Tarikh penciptaan: 2023-12-29 16:26:49 Akhirnya diubah suai: 2023-12-29 16:26:49
Salin: 2 Bilangan klik: 589
1
fokus pada
1621
Pengikut

Menggunakan Strategi Penjejakan Baki Purata Pergerakan Hull

Gambaran keseluruhan

Strategi pengesanan rata-rata menggunakan purata bergerak Hull sebagai petunjuk utama untuk memasuki pasaran untuk menentukan arah trend harga. Pada masa yang sama, strategi ini digabungkan dengan pelbagai petunjuk lain, seperti garis asas, indikator pengesahan, dan lain-lain, untuk mengesahkan trend harga dan memfilterkan isyarat palsu. Selepas masuk ke pasaran, strategi menggunakan purata gelombang sebenar untuk mengira stop loss dinamik untuk mengikuti trend.

Prinsip Strategi

Hull Moving Average lebih sensitif terhadap perubahan harga dan dapat menentukan arah trend secara berkesan. Apabila harga naik melampaui Hull Line, maka trend naik akan dipastikan dan anda akan melakukan over; apabila harga turun melampaui Hull Line, maka trend turun akan dipastikan dan anda akan melakukan over.

Selain itu, strategi ini juga memperkenalkan petunjuk garis rujukan untuk menentukan trend jangka pendek; petunjuk pengesahan untuk menyaring penembusan palsu. Isyarat perdagangan akan dikeluarkan hanya apabila garis rujukan dan petunjuk pengesahan mengesahkan arah trend.

Selepas masuk ke pasaran, strategi menggunakan purata gelombang sebenar yang dikira oleh ATR dan Hull EMA untuk menetapkan kedudukan hentian. Apabila trend berterusan, garis hentian juga akan terus bergerak ke atas / ke bawah untuk mengunci keuntungan trend.

Analisis kelebihan

Strategi mengesan purata menggabungkan keunggulan penghakiman trend dan kawalan risiko, yang dapat memperoleh keuntungan yang lebih baik dalam keadaan trend. Berbanding dengan strategi berhenti tetap, ia dapat mengesan pergerakan trend dengan berhenti bergerak, dan mengelakkan terhenti oleh turun naik pasaran yang normal.

Penggunaan gabungan banyak petunjuk juga menjadikan strategi lebih sensitif terhadap perubahan pasaran, dan dapat menyaring isyarat palsu dengan berkesan. Selain itu, strategi juga menyediakan beberapa parameter untuk disesuaikan, dan pengguna dapat mengoptimumkannya berdasarkan penilaian mereka sendiri terhadap pasaran.

Analisis risiko

Strategi ini bergantung kepada indikator trend, mudah menyebabkan isyarat yang salah dan berhenti ketika digabungkan. Selain itu, kombinasi pelbagai indikator juga mungkin berlaku apabila indikator bertentangan. Tetapan parameter yang tidak betul juga boleh menyebabkan prestasi strategi yang buruk.

Anda boleh mempertimbangkan untuk memasukkan modul penilaian tambahan ke dalam strategi, menangguhkan perdagangan jika terdapat perbezaan dalam indikator; atau menggunakan mekanisme pengundian yang menggabungkan keputusan keputusan pelbagai indikator. Dalam hal penyetempatan parameter, anda boleh mencari parameter terbaik melalui kaedah pengoptimuman feedback.

Arah pengoptimuman

Strategi pengesanan kesamaan boleh dioptimumkan dari beberapa arah:

  1. Menambah modul penilaian, seperti modul kadar turun naik, untuk menghentikan perdagangan apabila turun naik tinggi;
  2. Menambah modul pembelajaran mesin yang menggunakan algoritma pembelajaran mesin untuk menilai berat indeks;
  3. Mengoptimumkan parameter penunjuk untuk mencari kombinasi parameter yang terbaik;
  4. Mengoptimumkan algoritma Hentikan Kerosakan Mobile untuk memastikan Hentikan Kerosakan mengikuti trend dengan lebih baik;
  5. Menambah modul pengurusan risiko, seperti penangguhan pelanggaran, penyesuaian kedudukan dinamik dan sebagainya.

ringkaskan

Strategi pengesanan keseimbangan secara keseluruhan adalah strategi pengesanan trend yang sangat baik. Ia berjaya menggabungkan penghakiman trend dengan berhenti dinamik, yang dapat mengesan trend dengan berkesan. Dengan pengoptimuman lanjut, diharapkan untuk mendapatkan prestasi strategi yang lebih baik.

Kod sumber strategi
/*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")