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

作者: リン・ハーンチャオチャン開催日: 2024-03-22 14:57:10
タグ:

img

概要

この戦略は,ハル移動平均 (HMA) のクロスオーバー信号に基づいている.ハル移動平均 (Hull Moving Average,HMA) は,アラン・ハルが開発した技術指標で,伝統的な移動平均の遅れを減らすことを目的としている.この戦略は,異なる期間を持つ2つのHMAを使用している.短期間HMAが長期間HMAを超えると購入信号が生成され,逆が起こると販売信号が生成される.

原則

  1. Hull Moving Average (HMA) を計算する

HMA は次のように計算されます.

  • まず,インプットパラメータの半分の周期で価格の重度の移動平均 (WMA) を計算します
  • 次に,前回のWMAのWMAを計算し,周期がです.
  • HMA = 2 * WMA (長さ/2) - WMA (長さ)
  • 上記の結果のWMAを,最終HMAを得るために,の平方根の周期で再び計算します.
  1. トレーディング・シグナル生成
  • 閉じる価格がHMAを超えると,購入信号が生成されます.
  • 閉じる価格がHMAを下回ると,売り信号が生成されます.
  1. シグナルに基づく取引の実行
  • 買い信号: ロングポジションを開く
  • 売り信号:ショートポジションを開く

利点

  1. シンプル・ムービング・アベアと重度のムービング・アベアと比較して,ハル・ムービング・アベアには遅延が少ないので,価格変動により早く反応し,戦略の応答性を向上させることができます.

  2. 異なる周期を持つ2つのHMAのクロスオーバーを使用して信号を生成することで,多くのノイズと偽信号を効果的にフィルタリングし,信号の信頼性を高めることができます.

  3. パラメータは調整可能で,HMAの期間パラメータを調整することで,戦略は異なる市場や取引手段に適応できます.

リスク

  1. Hull Moving Averageは遅れている指標で,トレンド逆転の初期段階では誤った信号を生む可能性があります.

  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)


もっと