
Strategi ini adalah strategi multi-faktor yang dapat beradaptasi sendiri dengan menggabungkan Hull Moving Average, Fisherman’s Turnover Indicator, dan Commodity Channel Index. Strategi ini dapat secara cerdas mengenali tren, menyesuaikan parameter secara otomatis, dan menyesuaikan dengan varietas dan periode yang berbeda.
Logika inti dari strategi ini didasarkan pada indikator yang diputar oleh peserta untuk menentukan masuk dan keluar. Indikator yang diputar oleh peserta menggabungkan keuntungan dari rata-rata bergerak dan indikator getaran untuk menentukan titik balik tren dengan lebih akurat.
Strategi pertama menghitung Hull Moving Average dan Fisherman’s Turning Indicator. Kemudian digabungkan dengan penilaian tambahan dari Commodity Channel Index, membentuk kondisi masuk. Ketika Fisherman’s Turning Indicator melewati dari bawah sumbu nol atau melewati dari luar parameter yang ditetapkan, diatur sebagai kondisi Gold Fork, membentuk sinyal multi; Ketika Fisherman’s Turning melewati dari atas sumbu nol atau melewati dari luar parameter yang ditetapkan, ditetapkan sebagai kondisi Dead Fork, membentuk sinyal kosong.
Kondisi keluar adalah sebaliknya, Gold Forks melakukan multiples dengan dead fork; dead forks melakukan blanks dengan Gold Forks. Dengan demikian, menggunakan persilangan antara indikator untuk menangkap titik balik tren.
Keuntungan terbesar dari strategi ini adalah beradaptasi multi-faktor. Ini memanfaatkan keuntungan dari rata-rata bergerak, indikator gesekan dan indikator tren, yang dapat memberikan kinerja yang baik di pasar yang bergelombang. Pengaturan parameter dapat disesuaikan dengan varietas dan siklus, untuk beradaptasi.
Selain itu, strategi ini memiliki mekanisme stop loss otomatis. Jika harga kembali ke Hull Moving Average, stop loss akan terjadi secara otomatis. Ini sangat mengurangi risiko kerugian strategi.
Risiko terbesar dari strategi ini adalah adanya sinyal kesalahan di antara indikator. Ketika harga bergejolak, indikator dapat menghasilkan beberapa crossover yang tidak perlu. Ini dapat menyebabkan masuk dan stop loss yang tidak perlu.
Solusinya adalah dengan menyesuaikan parameter indikator dengan benar, menyaring beberapa sinyal kecil. Atau dengan menggabungkan lebih banyak indikator tambahan untuk mengkonfirmasi. Misalnya dengan menambahkan indikator volume transaksi untuk menentukan sinyal yang benar.
Strategi ini dapat dioptimalkan dari beberapa arah:
Menambahkan algoritma pembelajaran mesin untuk mengoptimalkan parameter secara otomatis. Parameter indikator dapat disesuaikan secara real-time berdasarkan pelatihan data historis.
Menambahkan lebih banyak portofolio indikator untuk penilaian, mengambil sebagian besar strategi keputusan, dan meningkatkan keakuratan keputusan.
Menambahkan mekanisme konfirmasi terobosan, menggunakan tingkat harga penting dan saluran untuk konfirmasi ulang, menghindari kesalahan operasi.
Menambahkan modul penilaian risiko, yang dapat secara otomatis menyesuaikan ukuran posisi dan stop loss sesuai dengan kondisi pasar.
Secara keseluruhan, strategi ini merupakan kerangka kerja adaptasi multi-faktor yang sangat baik. Ini menggabungkan penilaian tren dari rata-rata bergerak, penilaian overbought dan oversold dari indikator getaran, dan aplikasi silang dari indikator tren, membentuk mekanisme masuk dan keluar yang lengkap. Jika dapat dioptimalkan lebih lanjut, menambahkan komponen adaptasi dan kecerdasan, ini akan menjadi produk strategi yang sangat berharga secara komersial.
/*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)