ハル移動平均クロスオーバー戦略


作成日: 2024-03-22 14:57:10 最終変更日: 2024-03-22 14:57:10
コピー: 2 クリック数: 1150
1
フォロー
1617
フォロワー

ハル移動平均クロスオーバー戦略

戦略概要

この戦略は,ハル移動平均 (Hull Moving Average, HMA) の交差信号に基づいて取引する.ハル移動平均は,移動平均の遅れを減らすための技術指標で,アラン・ハルによって開発された.この戦略は,異なる周期のHMAの2つのラインを使用し,より短い周期のHMAがより長い周期のHMAを上から横断すると,買い信号が生まれ,逆に売り信号が生まれます.

戦略原則

  1. ハル移動平均 (HMA) を計算する

HMAの計算過程は以下の通りである.

  • 価格を計算した加重移動平均 ((WMA),周期は入力パラメータlengthの半分
  • 周期はlength で,その WMA を計算します.
  • 公式を使用する:HMA = 2 * WMA (長さ/2) - WMA (長さ)
  • 上記の結果に対して WMA を再計算し,周期はlength の平方根で,最終的な HMA が得られます.
  1. 取引信号を生成する
  • HMAが閉店価格に突入すると,買取シグナルが生成されます.
  • HMAが閉店価格を下回ったとき,売り込みシグナルが作られます.
  1. 取引信号による取引実行
  • 買取シグナル:多頭ポジション
  • 売り出しのシグナル:空頭ポジション

戦略的優位性

  1. ハル移動平均は,単純移動平均と重み付け移動平均に比べて遅滞が少ないため,価格変化により早く反応することができ,戦略の感度が向上する.

  2. 2つの異なる周期のHMA線を交差して信号を生成し,いくつかのノイズと偽信号を効果的にフィルターし,信号の信頼性を向上させる.

  3. パラメータは調整可能で,HMAの周期パラメータを調整することで,異なる市場と取引品種に適応できます.

戦略リスク

  1. ハル移動平均は後退した指標で,トレンドの逆転の初期段階では誤った信号を発する可能性があります.

  2. パラメータの選択を間違えた場合,戦略の不良なパフォーマンスを引き起こす可能性があります. 周期が長すぎると,戦略の反応が遅くなる. 周期が短すぎると,偽信号が多すぎる可能性があります.

  3. 単一の指数に基づくすべての戦略と同様に,この戦略は,波動的な市場において,誤ったシグナルと損失を伴う取引を多く生み出し,不良な結果をもたらす可能性があります.

最適化の方向

  1. HMA交差信号の有効性をさらに確認するために,取引量,トレンド指標など,他の技術指標または基本的要因をフィルタリング条件として導入することを考慮することができます.

  2. 参数最適化には,遺伝的アルゴリズム,格子検索などの方法を使用して,歴史的なデータ上で参数最適化を行い,現在の市場に最も適した参数組み合わせを見つけることができます.

  3. ストップ・ロスとストップ・ストップのメカニズムを戦略に組み込み,単一取引のリスクと収益を制御する.

  4. 市場のトレンド性を考慮して,市場トレンドを導入して指標を判断し,トレンド型市場で取引し,震動市場を回避することができる.

要約する

ハル移動平均交差策略は,HMAの迅速な応答特性により,価格の変化を比較的にタイムリーに捉える簡単な取引策策である.しかし,すべての策略のように,それにも限界があり,そのパフォーマンスは,市場タイプ,パラメータ選択の影響を受ける.実用的なアプリケーションでは,それを他の分析方法と組み合わせて,信号をさらに確認することができる.同時に,合理的な風力管理措置,例えば,損失停止,ポジション管理なども,戦略の健全な運営の不可欠な部分である.

ストラテジーソースコード
/*backtest
start: 2023-03-16 00:00:00
end: 2024-03-21 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
//Basic Hull Ma Pack tinkered by InSilico 
strategy("RKTD BETA - Hull Suite by InSilico", overlay=true)

//INPUT
src = input(close, title="Source")
modeSwitch = input("Ehma", title="Hull Variation", options=["Hma", "Thma", "Ehma"])
length = input(200, title="Length(180-200 for floating S/R , 55 for swing entry)")
lengthMult = input(1.0, title="Length multiplier (Used to view higher timeframes with straight band)")

useHtf = input(false, title="Show Hull MA from X timeframe? (good for scalping)")
htf = input("240", title="Higher timeframe", type=input.resolution)

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)

// Alert Messages
longAlertMessage = '{"base": "BTC", "quote": "USDT", "price": ' + tostring(close) + ', "action": "long", "orderType": "market", "close":true}'
shortAlertMessage = '{"base": "BTC", "quote": "USDT", "price": ' + tostring(close) + ', "action": "short", "orderType": "market", "close":true}'

//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, int(length * lengthMult))
HULL = useHtf ? security(syminfo.ticker, htf, _hull) : _hull
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)
alertcondition(crossover(MHULL, SHULL), title="Hull trending up.", message="Hull trending up.")
alertcondition(crossover(SHULL, MHULL), title="Hull trending down.", message="Hull trending down.")
///< Ending Filler
fill(Fi1, Fi2, title="Band Filler", color=hullColor, transp=transpSwitch)
///BARCOLOR
barcolor(color = candleCol ? (switchColor ? hullColor : na) : na)

// Define Buy and Sell Conditions based on crossovers
buyCondition = crossover(MHULL, SHULL)
sellCondition = crossunder(MHULL, SHULL)

// Plotting the Hull Moving Average (HMA)
plot(MHULL, title="MHULL", color=hullColor, linewidth=thicknesSwitch)
plot(SHULL, title="SHULL", color=hullColor, linewidth=thicknesSwitch, transp=transpSwitch)
fill(Fi1, Fi2, title="Band Filler", color=hullColor, transp=transpSwitch)

// Execute Strategy based on Buy and Sell Conditions
strategy.entry("Buy", strategy.long, when=buyCondition, alert_message=longAlertMessage)
strategy.entry("Sell", strategy.short, when=sellCondition, alert_message=shortAlertMessage)

// Additional elements like bar coloring remain unchanged
barcolor(color = candleCol ? (switchColor ? hullColor : na) : na)