Hull Fisher Adaptive Intelligent Multi-faktor Strategi

Penulis:ChaoZhang, Tanggal: 2024-01-16 15:10:06
Tag:

img

Gambaran umum

Strategi ini menggabungkan Hull Moving Average, Fisher Transform indicator dan Commodity Channel Index menjadi strategi multi-faktor adaptif.

Logika Strategi

Logika inti dari strategi ini didasarkan pada salib emas dan salib mati dari indikator Fisher Transform untuk menentukan masuk dan keluar. indikator Fisher Transform menggabungkan keuntungan dari moving average dan osilator untuk lebih akurat menilai titik balik.

Strategi ini pertama-tama menghitung indikator Hull Moving Average dan Fisher Transform. Kemudian dengan bantuan Indeks Saluran Komoditas, membentuk kondisi masuk. Ketika indikator Fisher Transform melintasi dari bawah garis nol atau melintasi dari luar kisaran parameter yang ditetapkan, itu ditetapkan sebagai kondisi salib emas untuk membentuk sinyal panjang; ketika Fisher Transform melintasi ke bawah dari di atas garis nol atau di luar kisaran parameter, itu ditetapkan sebagai kondisi salib mati untuk membentuk sinyal pendek.

Kondisi keluar adalah sebaliknya, pesanan panjang yang dibuka pada salib emas ditutup pada salib mati; pesanan pendek yang dibuka pada salib mati ditutup pada salib emas. Ini menggunakan silang indikator untuk menangkap titik pembalikan tren.

Analisis Keuntungan

Keuntungan terbesar dari strategi ini adalah multi-faktor adaptif. Ini mengambil keuntungan dari moving average, osilator dan indikator tren untuk berkinerja baik di pasar yang jatuh dan naik. Parameter juga dapat disesuaikan sesuai dengan variasi dan siklus untuk mencapai kemampuan beradaptasi.

Selain itu, strategi ini menggabungkan mekanisme stop loss otomatis. Ketika harga pecah kembali di atas Hull Moving Average, itu akan secara otomatis menghentikan kerugian untuk keluar. Ini sangat mengurangi risiko kerugian untuk strategi.

Risiko dan Solusi

Risiko terbesar dari strategi ini adalah sinyal kesalahan antara indikator. Ketika harga bergerak ke samping, indikator dapat menghasilkan beberapa persilangan yang tidak perlu. Ini akan menyebabkan masuk dan stop loss yang tidak perlu.

Solusinya adalah dengan menyesuaikan parameter indikator dengan tepat untuk menyaring beberapa sinyal kecil. atau menggabungkan lebih banyak indikator bantu untuk konfirmasi. misalnya, tambahkan indikator volume untuk menentukan sinyal sejati.

Arahan Optimasi

Strategi dapat dioptimalkan dalam arah berikut:

  1. Tambahkan algoritma pembelajaran mesin untuk mencapai optimasi parameter otomatis. Dapat melatih berdasarkan data historis dan menyesuaikan parameter indikator secara real time.

  2. Tambahkan lebih banyak indikator untuk skor, mengambil strategi keputusan mayoritas, dan meningkatkan akurasi keputusan.

  3. Tambahkan mekanisme konfirmasi breakout yang menggunakan tingkat harga dan saluran penting untuk konfirmasi lagi untuk menghindari kesalahan operasi.

  4. Tambahkan modul penilaian risiko yang dapat secara otomatis menyesuaikan ukuran posisi dan rentang stop loss berdasarkan kondisi pasar.

Kesimpulan

Secara keseluruhan, ini adalah kerangka kerja multi-faktor adaptif yang sangat baik. Ini menggabungkan penilaian tren rata-rata bergerak, penilaian overbought dan oversold dari osilator, dan penerapan silang indikator, membentuk mekanisme masuk dan keluar yang lengkap. Jika dapat dioptimalkan lebih lanjut dan meningkatkan komponen adaptif dan cerdas, itu akan menjadi produk strategi dengan nilai komersial yang sangat tinggi.


/*backtest
start: 2023-01-09 00:00:00
end: 2024-01-15 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is free to copy/paste/use. no permission required. just do it!
// © @SeaSide420 
//@version=4
strategy(title="Hull Fisher",currency="USD",default_qty_type=strategy.percent_of_equity,default_qty_value=100,commission_type=strategy.commission.percent,commission_value=0.25)

//=================================== Inputs =========================================================
period =input(title="HullMA Length", type=input.integer, defval=14, minval=2)
length =input(9, minval=1, title="Signal Length")
line1 = input(5, minval=2, title="Top Line")
line5 = input(-5, maxval=-2, title="Bottom Line")
price = input(open, type=input.source, title="Price data")
entry1 =input(true,type=input.bool, title="Open when HullFisher crossover outside Lines")
entry2 =input(true,type=input.bool, title="Open when HullFisher past zero")
useHMA =input(true,type=input.bool, title="Include Hull_moving_average")
useCCI =input(true,type=input.bool, title="Include Commodity_channel_index")
fishclose=input(true,type=input.bool, title="Close order when Fisher crossover")
HMAclose=input(true,type=input.bool, title="Close order when Hull crossover")

//================================ Calculations ======================================================
HMA = hma(price,period)
HMA2 = HMA[1]
high_ = highest(HMA, length)
low_ = lowest(HMA, length)
round_(val) => val > .99 ? .999 : val < -.99 ? -.999 : val
value = 0.0
value := round_(.66 * ((HMA - low_) / max(high_ - low_, .001) - .5) + .67 * nz(value[1]))
value1 = 0.0
value1 := .5 * log((1 + value) / max(1 - value, .001)) + .5 * nz(value1[1])
value2 = value1[1]
CCI1 = cci(price,period)
CCI2 = CCI1[1]
line2 = line1/2
line4 = line5/2

//================================ Draw Plots =======================================================
colorchange1 =CCI1>CCI2?color.lime:color.red
colorchange2 =value1>value2?color.lime:color.red
a =plot(line1,style=plot.style_line,color=color.red,transp=50,linewidth=2,title="Top Line")
b =plot(line2,style=plot.style_line,color=color.red,transp=50,linewidth=2,title="Upper Line")
c =plot(0,style=plot.style_line,color=color.black,transp=50,linewidth=2,title="Middle Line")
d =plot(line4,style=plot.style_line,color=color.lime,transp=50,linewidth=2,title="Lower Line")
e =plot(line5,style=plot.style_line,color=color.lime,transp=50,linewidth=2,title="Bottom Line")
f =plot(value1, color=color.black,transp=50,linewidth=2, title="Value 1")
g =plot(value2, color=color.black,transp=50,linewidth=2, title="Value 2")
h =plot(CCI1/50,style=plot.style_area, color=colorchange1,transp=50,linewidth=2, title="CCI")
fill(f,g,color=colorchange2,transp=20,title="Color fill")
plot(cross(value1, value2) ? value1 : na, style=plot.style_circles, color=color.black, linewidth=10)
plot(cross(value1, value2) ? value1 : na, style=plot.style_circles, color=color.white, linewidth=8)
plot(cross(value1, value2) ? value1 : na, style=plot.style_circles, color=colorchange2, linewidth=5)

//============================= Entry conditions ====================================================
// Outside Lines crossover or zero lines crossover
LongCondition1 = value1>value2 and value1<line5 and entry1 and not useCCI and not useHMA
ShortCondition1 = value1<value2 and value1>line1 and entry1 and not useCCI and not useHMA
LongCondition2 = value1>value2 and value1>0 and entry2 and not useCCI and not useHMA
ShortCondition2 = value1<value2 and value1<0 and entry2 and not useCCI and not useHMA

// Use CCI
LongCondition3 = value1>value2 and value1<line5 and CCI1>CCI2 and entry1 and useCCI and not useHMA
ShortCondition3 = value1<value2 and value1>line1 and CCI1<CCI2 and entry1 and useCCI and not useHMA
LongCondition4 = value1>value2 and value1>0 and CCI1>CCI2 and entry2 and useCCI and not useHMA
ShortCondition4 = value1<value2 and value1<0 and CCI1<CCI2 and entry2 and useCCI and not useHMA

// Use HMA
LongCondition5 = value1>value2 and value1<line5 and CCI1>CCI2 and HMA>HMA2 and entry1 and not useCCI and useHMA
ShortCondition5 = value1<value2 and value1>line1 and CCI1<CCI2 and HMA<HMA2 and entry1 and not useCCI and useHMA
LongCondition6 = value1>value2 and value1>0 and CCI1>CCI2 and HMA>HMA2 and entry2 and not useCCI and useHMA
ShortCondition6 = value1<value2 and value1<0 and CCI1<CCI2 and HMA<HMA2 and entry2 and not useCCI and useHMA

//Use CCI & HMA
LongCondition7 = value1>value2 and value1<line5 and CCI1>CCI2 and HMA>HMA2 and entry1 and useCCI and useHMA
ShortCondition7 = value1<value2 and value1>line1 and CCI1<CCI2 and HMA<HMA2 and entry1 and useCCI and useHMA
LongCondition8 = value1>value2 and value1>0 and CCI1>CCI2 and HMA>HMA2 and entry2 and useCCI and useHMA
ShortCondition8 = value1<value2 and value1<0 and CCI1<CCI2 and HMA<HMA2 and entry2 and useCCI and useHMA

//========================= Exit & Entry excecution =================================================
if HMAclose and fishclose and value1<value2 and HMA<HMA2
    strategy.close("BUY")
if HMAclose and fishclose and value1>value2 and HMA>HMA2
    strategy.close("SELL")
if HMAclose and HMA<HMA2
    strategy.close("BUY")
if HMAclose and HMA>HMA2
    strategy.close("SELL")
if fishclose and value1<value2
    strategy.close("BUY")
if fishclose and value1>value2
    strategy.close("SELL")    
if LongCondition1 or LongCondition2 or LongCondition3 or LongCondition4 or LongCondition5 or LongCondition6 or LongCondition7 or LongCondition8
    strategy.entry("BUY", strategy.long)
if ShortCondition1 or ShortCondition2 or ShortCondition3 or ShortCondition4 or ShortCondition5 or ShortCondition6 or ShortCondition7 or ShortCondition8
    strategy.entry("SELL", strategy.short)


Lebih banyak