Strategi perdagangan gabungan penunjuk Hall dan penunjuk stokastik


Tarikh penciptaan: 2023-10-18 12:40:23 Akhirnya diubah suai: 2023-10-18 12:40:23
Salin: 1 Bilangan klik: 1028
1
fokus pada
1617
Pengikut

Strategi perdagangan gabungan penunjuk Hall dan penunjuk stokastik

Gambaran keseluruhan

Strategi ini menggunakan penunjuk Hall untuk menentukan arah trend, kemudian digabungkan dengan penunjuk rawak untuk masuk. Apabila garis tengah Hall melintasi rel, masuklah ke dalam dan masuklah ke dalam.

Prinsip Strategi

Strategi perdagangan ini menggunakan Indeks Hall untuk menentukan arah trend pasaran, dan kemudian menggunakan Indeks Random untuk masuk tertentu.

Pertama, strategi ini menentukan kaedah pengiraan Indeks Hall, termasuk formula pengiraan untuk orbit tengah, atas dan bawah. Perhitungan WMA menggunakan rata-rata bergerak berbobot, di mana orbit atas dan bawah adalah penyimpangan orbit tengah.

Kemudian, berdasarkan hubungan antara rel tengah dan rel atas ke bawah, menilai arah trend. Apabila rel tengah menembusi rel bawah, ia mewakili harga yang lebih tinggi dan merupakan trend yang lebih rendah. Apabila rel bawah menembusi rel, ia mewakili harga yang lebih tinggi dan merupakan trend yang lebih rendah.

Di samping itu, strategi ini juga menentukan kaedah pengiraan penunjuk rawak, termasuk formula pengiraan nilai K dan nilai D. Nilai K adalah penyesuaian SMA RSI, dan nilai D adalah penyesuaian SMA semula nilai K.

Setelah menentukan arah trend, jika bullish, maka ia akan melakukan plus apabila garis K dari penunjuk rawak melintasi garis D dari bawah kawasan oversold; jika bearish, maka ia akan melakukan minus apabila garis K melintasi garis D dari kawasan oversold.

Dengan cara ini, penilaian trend yang digabungkan dengan Indeks Hall dan penilaian overbought dan oversold dari Indeks Random, boleh membuat kemasukan yang lebih stabil dan tepat.

Analisis kelebihan

Kelebihan utama strategi ini adalah bahawa ia menggabungkan penilaian trend dan penilaian overbought dan oversold, yang membolehkan analisis pelbagai dimensi terhadap pasaran, dengan ketepatan masuk yang lebih tinggi.

Secara khusus, terdapat beberapa kelebihan utama:

  1. Indeks Hall boleh memberi penilaian yang berkesan ke arah trend pasaran, untuk kedudukan peringkat besar;

  2. Indeks rawak untuk menilai kelebihan beli dan kelebihan jual, untuk mengetahui perubahan kekuatan beli dan jual, dan untuk mengetahui masa masuk yang lebih baik;

  3. Kedua-duanya boleh digunakan bersama-sama, dan menggunakan kelebihan masing-masing untuk saling mengesahkan isyarat dan mengurangkan isyarat palsu.

  4. Dengan penyesuaian parameter, ia boleh menyesuaikan diri dengan pelbagai jenis dan tempoh masa, dan sangat sesuai;

  5. Menggunakan pergeseran orbit tengah untuk membentuk saluran perdagangan di atas dan di bawah orbit, anda boleh menemui sokongan dan rintangan yang berpotensi.

  6. STOP LOSS, EXIT ON TARGETS peratusan digunakan untuk skala kedudukan

  7. Use of hull data Dictionary gives multiple asset class flexibility

  8. Arah pengoptimuman yang dipilih dapat meningkatkan kestabilan dan pulangan strategi

Analisis risiko

Strategi ini juga mempunyai beberapa risiko yang perlu diperhatikan, terutamanya:

  1. Indeks Hall mempunyai ketinggalan dan mungkin terlepas titik perubahan trend, menyebabkan kerugian yang tidak perlu.

  2. Tetapan parameter penunjuk rawak yang tidak betul mungkin menghasilkan isyarat tambahan, isyarat persilangan K dan D harus disaring dengan betul.

  3. Indikator Hall digunakan bersama-sama dengan indikator rawak. Jika parameter yang dipadankan tidak betul, isyarat salah juga mungkin berlaku.

  4. Julat yang terlalu besar atau terlalu kecil akan menjejaskan kualiti isyarat dagangan, dan perlu diuji dengan teliti untuk mencari parameter terbaik.

  5. Dalam beberapa hari kebelakangan ini, pasaran tidak stabil dan indeks garis tengah mungkin tidak berfungsi dengan baik.

  6. Data mismatches between hull and stoch causing false signals

  7. Sharp trend changes not caught by hull can cause losses

  8. Testing on more timeframes/symbols needed to verify robustness

Untuk mengatasi risiko ini, anda boleh mengoptimumkan dari:

  1. Meningkat sensitiviti kepada perubahan trend.

  2. Mengoptimumkan parameter penunjuk rawak, mengurangkan isyarat palsu.

  3. Sesuaikan parameter atas dan bawah untuk mencari lebar laluan yang optimum.

  4. Tambah isyarat pengesahan indikator lain, seperti MACD dan sebagainya.

  5. Menambah strategi henti kerugian untuk mengawal risiko.

Arah pengoptimuman

Strategi ini juga boleh dioptimumkan dalam beberapa aspek:

  1. Uji lebih banyak varieti dan lebih banyak parameter kitaran masa untuk mengesahkan kestabilan strategi.

  2. Menambah mekanisme penangguhan kerugian. Seperti penangguhan kecederaan, penangguhan bergerak, dan sebagainya, dapat mengawal risiko dengan lebih baik.

  3. Mengoptimumkan logik syarat kemasukan, menetapkan syarat penapisan yang lebih ketat, mengurangkan isyarat palsu.

  4. Kajian bagaimana menggunakan saluran indikator Hall untuk lebih menentukan sokongan dan rintangan.

  5. Meneroka sama ada isyarat pengesahan boleh ditambah kepada petunjuk lain.

  6. Pengoptimuman parameter. Pengoptimuman parameter seperti panjang indikator Hall, parameter kelancaran indikator K, D dan lain-lain.

  7. Tambah fungsi pengurusan kedudukan. Sesuaikan saiz kedudukan mengikut jumlah penarikan balik dan kemenangan berturut-turut.

  8. Peraturan Stop Loss dan Stop Stop telah ditambah.

  9. Optimize hull length parameter for better trend sensitivity

  10. Add additional filters or confirming indicators to improve signal quality

  11. Explore using hull bands to identify dynamic support/resistance levels

  12. Parameter optimization for stoch RSI lengths, overbought/oversold levels

  13. Introduce better position sizing and risk management rules

ringkaskan

Secara keseluruhannya, strategi ini mengintegrasikan penilaian trend dan penilaian overbought dan oversold untuk masuk ke dalam pasaran adalah idea yang berkesan. Tetapi kerana masalah yang ada dalam indikator itu sendiri, isyarat perdagangan tidak sepenuhnya boleh dipercayai, dan perlu dioptimumkan lagi.

Kod sumber strategi
/*backtest
start: 2023-10-16 00:00:00
end: 2023-10-17 00:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
//Basic Hull Ma Pack tinkered by InSilico 
//Converted to Strategy by DashTrader
strategy("Hull Suite + Stoch RSI Strategy v1.1", overlay=true, pyramiding=1, initial_capital=100, default_qty_type= strategy.percent_of_equity, default_qty_value = 100, calc_on_order_fills=false, slippage=0,commission_type=strategy.commission.percent,commission_value=0.023)
strat_dir_input = input(title="Strategy Direction", defval="all", options=["long", "short", "all"])
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)
//////////////////////////////////////////////////////////////////////
// Testing Start dates
testStartYear = input(2016, "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(30, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0)

stoch_upper_input = input(88, "Stoch Upper Threshold", type=input.float)
stoch_lower_input = input(5, "Stoch Lower Threshold", type=input.float)
sl = input(0.7, "SL %", type=input.float, step=0.1)
tp = input(2.1, "TP %", type=input.float, step=0.1)
// slowEMA = ema(close, slowEMA_input)

// vwap = vwap(close)
// rsi = rsi(close, rsi_input)


// stoch rsi
smoothK = 3
smoothD = 3
lengthRSI = 14
lengthStoch = 14
rsi1 = rsi(close, 14)
k = sma(stoch(rsi1, rsi1, rsi1, lengthStoch), smoothK)
d = sma(k, smoothD)

testPeriod() =>
    time >= testPeriodStart and time <= testPeriodStop ? true : false
// Component Code Stop
//////////////////////////////////////////////////////////////////////
//INPUT
src = input(close, title="Source")
modeSwitch = input("Hma", title="Hull Variation", options=["Hma", "Thma", "Ehma"])
length = input(180, title="Length(180-200 for floating S/R , 55 for swing entry)")
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)

//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, length)
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)
///< Ending Filler
fill(Fi1, Fi2, title="Band Filler", color=hullColor, transp=transpSwitch)
///BARCOLOR
barcolor(color = candleCol ? (switchColor ? hullColor : na) : na)

bgcolor(color = k < stoch_lower_input  and crossover(k, d) ? color.green : na)
bgcolor(color = d > stoch_upper_input and crossover(d, k) ? color.red : na)

notInTrade = strategy.position_size == 0

if notInTrade and HULL[0] > HULL[2] and testPeriod() and k < stoch_lower_input and crossover(k, d)
// if HULL[0] > HULL[2] and testPeriod()
    stopLoss = close * (1 - sl / 100) 
    profit25 = close * (1 + (tp / 100) * 0.25)
    profit50 = close * (1 + (tp / 100) * 0.5)
    takeProfit = close * (1 + tp / 100)
    
    
    strategy.entry("long", strategy.long, alert_message="buy")
    strategy.exit("exit long 25%", "long", stop=stopLoss, limit=profit25, qty_percent=25, alert_message="profit_25")
    strategy.exit("exit long 50%", "long", stop=stopLoss, limit=profit50, qty_percent=25, alert_message="profit_50")
    strategy.exit("exit long", "long", stop=stopLoss, limit=takeProfit)
    
    // line.new(bar_index, profit25, bar_index + 4, profit25, color=color.green)
    // line.new(bar_index, profit50, bar_index + 4, profit50, color=color.green)
    // box.new(bar_index, stopLoss, bar_index + 4, close, border_color=color.red, bgcolor=color.new(color.red, 80))
    // box.new(bar_index, close, bar_index + 4, takeProfit, border_color=color.green, bgcolor=color.new(color.green, 80))

    
if notInTrade and HULL[0] < HULL[2] and testPeriod() and d > stoch_upper_input and crossover(d, k)
// if HULL[0] < HULL[2] and testPeriod()
    stopLoss = close * (1 + sl / 100)
    profit25 = close * (1 - (tp / 100) * 0.25)
    profit50 = close * (1 - (tp / 100) * 0.5)
    takeProfit = close * (1 - tp / 100)
    
    

    strategy.entry("short", strategy.short, alert_message="sell")
    strategy.exit("exit short 25%", "short", stop=stopLoss, limit=profit25, qty_percent=25, alert_message="profit_25")
    strategy.exit("exit short 50%", "short", stop=stopLoss, limit=profit50, qty_percent=25, alert_message="profit_50")
    strategy.exit("exit short", "short", stop=stopLoss, limit=takeProfit)
    
    // line.new(bar_index, profit25, bar_index + 4, profit25, color=color.green)
    // line.new(bar_index, profit50, bar_index + 4, profit50, color=color.green)
    // box.new(bar_index, stopLoss, bar_index + 4, close, border_color=color.red, bgcolor=color.new(color.red, 80))
    // box.new(bar_index, close, bar_index + 4, takeProfit, border_color=color.green, bgcolor=color.new(color.green, 80))

// var table winrateDisplay = table.new(position.bottom_right, 1, 1)
// table.cell(winrateDisplay, 0, 0, "Winrate: " + tostring(strategy.wintrades / strategy.closedtrades * 100, '#.##')+" %", text_color=color.white)