Strategi ini menggabungkan Hull Moving Average, Fisher Transform indicator dan Commodity Channel Index ke dalam strategi multi-faktor adaptif. Ia boleh mengenal pasti trend dengan bijak, menyesuaikan parameter secara automatik, dan menyesuaikan diri dengan produk dan kitaran yang berbeza.
Logik teras strategi ini adalah berdasarkan salib emas dan salib mati penunjuk Transform Fisher untuk menentukan kemasukan dan keluar.
Strategi ini mula-mula mengira Hull Moving Average dan Fisher Transform indicator. Kemudian dengan bantuan Indeks Saluran Komoditi, membentuk syarat masuk. Apabila penunjuk Fisher Transform melintasi dari bawah garis sifar atau melintasi dari luar julat parameter yang ditetapkan, ia ditetapkan sebagai keadaan salib emas untuk membentuk isyarat panjang; apabila Fisher Transform melintasi ke bawah dari atas garis sifar atau di luar julat parameter, ia ditetapkan sebagai keadaan salib mati untuk membentuk isyarat pendek.
Syarat 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.
Kelebihan terbesar strategi ini adalah pelbagai faktor adaptif. Ia memanfaatkan purata bergerak, osilator dan penunjuk trend untuk melakukan dengan baik di kedua-dua pasaran yang jatuh dan meningkat. Parameter juga boleh diselaraskan mengikut pelbagai dan kitaran untuk mencapai kesesuaian.
Selain itu, strategi ini menggabungkan mekanisme stop loss automatik. Apabila harga kembali di atas Hull Moving Average, ia akan secara automatik menghentikan kerugian untuk keluar. Ini sangat mengurangkan risiko kerugian untuk strategi.
Risiko terbesar dari strategi ini adalah isyarat ralat antara penunjuk. Apabila harga bergerak ke sisi, penunjuk mungkin menghasilkan beberapa persilangan yang tidak perlu. Ini akan membawa kepada kemasukan yang tidak perlu dan hentikan kerugian.
Penyelesaian adalah untuk menyesuaikan parameter penunjuk dengan betul untuk menapis beberapa isyarat kecil. atau menggabungkan lebih banyak penunjuk tambahan untuk pengesahan. contohnya, tambah penunjuk kelantangan untuk menentukan isyarat sebenar.
Strategi ini boleh dioptimumkan ke arah berikut:
Tambah algoritma pembelajaran mesin untuk mencapai pengoptimuman parameter automatik. Boleh melatih berdasarkan data sejarah dan menyesuaikan parameter indikator dalam masa nyata.
Tambah lebih banyak penunjuk untuk penilaian, mengambil strategi keputusan majoriti, dan meningkatkan ketepatan keputusan.
Tambah mekanisme pengesahan pecah yang menggunakan tahap harga dan saluran penting untuk pengesahan semula untuk mengelakkan kesalahan operasi.
Tambah modul penilaian risiko yang boleh menyesuaikan saiz kedudukan dan julat stop loss secara automatik berdasarkan keadaan pasaran.
Secara keseluruhannya, ini adalah kerangka kerja multi-faktor adaptif yang sangat baik. Ia menggabungkan penilaian trend purata bergerak, pertimbangan overbought dan oversold oscillator, dan penerapan silang penunjuk, membentuk mekanisme masuk dan keluar yang lengkap. Jika ia dapat dioptimumkan lebih lanjut dan meningkatkan komponen adaptif dan pintar, ia 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)