ハル・フィッシャー 適応型 インテリジェント 多要素戦略

作者: リン・ハーンチャオチャン,日付: 2024-01-16 15:10:06
タグ:

img

概要

この戦略は,ハル移動平均値,フィッシャー変換指標,およびコモディティチャネルインデックスを適応可能な多要素戦略に組み合わせます. 傾向を知的に特定し,パラメータを自動的に調整し,異なる製品とサイクルに適応することができます.

戦略の論理

この戦略のコア論理は,フィッシャー・トランスフォームの指標の金十字と死十字をベースに,エントリーと出口を決定する.フィッシャー・トランスフォームの指標は,ターニングポイントをより正確に判断するために,移動平均値と振動器の利点を組み合わせます.

この戦略は,まずハル移動平均値とフィッシャー変換指標を計算する.その後,コモディティチャネルインデックスの助けにより,エントリー条件を形成する.フィッシャー変換指標がゼロラインの下から上へと横切るか,設定されたパラメータ範囲外から上へと横切ると,それは長い信号を形成するために金十字条件として設定されます.フィッシャー変換がゼロライン上から下へと横切るか,パラメータ範囲外へ下へと横切ると,それはショート信号を形成するために死十字条件として設定されます.

出口条件は逆で,金色のクロスで開いたロングオーダーはデッドクロスで閉まる.デッドクロスで開いたショートオーダーは金色のクロスで閉まる.これはトレンド逆転点を捕捉するために指標のクロスオーバーを使用する.

利点分析

この戦略の最大の利点は,適応性多要素性である.移動平均値,振動器,トレンドインジケーターを利用して,下落する市場と上昇する市場の両方で良好なパフォーマンスを発揮する.パラメータは,適応性を達成するために多様性とサイクルに応じて調整することもできる.

また,この戦略には自動ストップ損失メカニズムが含まれています.価格がハル移動平均値を超えると,自動的にストップ損失を終了します.これは戦略の損失リスクを大幅に軽減します.

リスク と 解決策

この戦略の最大のリスクは,指標間のエラー・シグナルである.価格が横向きに動くと,指標は不必要なクロスを発生させる可能性がある.これは不必要なエントリーとストップ・ロストにつながる.

解決策は,いくつかの小さな信号をフィルタリングするために指標パラメータを適切に調整することです.または確認のためにより多くの補助指標を組み合わせます.例えば,真の信号を決定するために音量指標を追加します.

オプティマイゼーションの方向性

戦略は以下の方向で最適化できる:

  1. 自動パラメータ最適化を達成するために機械学習アルゴリズムを追加します. 履歴データに基づいてトレーニングし,リアルタイムで指標パラメータを調整できます.

  2. ポイント付けの指標を増やし 多数決策の戦略を採用し 意思決定の正確性を向上させてください

  3. 誤った操作を避けるために重要な価格レベルとチャネルを使用して再確認する 突破確認メカニズムを追加します

  4. リスク評価モジュールを追加し,市場の状況に基づいて,ポジションサイズとストップロスの範囲を自動的に調整できます.

結論

一般的に,これは非常に良い適応性多要素フレームワークである.移動平均値のトレンド判断,振動器の過買いと過売判断,インジケータークロスの適用を組み合わせ,完全なエントリー&エグジットメカニズムを形成する.さらに最適化され,適応性およびインテリジェントなコンポーネントを増やすことができれば,非常に高い商業価値を持つ戦略製品になるだろう.


/*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)


もっと