この戦略は,ハル移動平均 (HMA) のクロスオーバー信号に基づいている.ハル移動平均 (Hull Moving Average,HMA) は,アラン・ハルが開発した技術指標で,伝統的な移動平均の遅れを減らすことを目的としている.この戦略は,異なる期間を持つ2つのHMAを使用している.短期間HMAが長期間HMAを超えると購入信号が生成され,逆が起こると販売信号が生成される.
HMA は次のように計算されます.
シンプル・ムービング・アベアと重度のムービング・アベアと比較して,ハル・ムービング・アベアには遅延が少ないので,価格変動により早く反応し,戦略の応答性を向上させることができます.
異なる周期を持つ2つのHMAのクロスオーバーを使用して信号を生成することで,多くのノイズと偽信号を効果的にフィルタリングし,信号の信頼性を高めることができます.
パラメータは調整可能で,HMAの期間パラメータを調整することで,戦略は異なる市場や取引手段に適応できます.
Hull Moving Averageは遅れている指標で,トレンド逆転の初期段階では誤った信号を生む可能性があります.
適切なパラメータの選択が不適切である場合,戦略のパフォーマンスが低下する可能性があります. 期間が長すぎると,戦略は反応が遅くなるでしょう. 期間が短すぎると,過剰な誤った信号につながる可能性があります.
単一指標に基づくすべての戦略と同様に,この戦略は横向市場ではうまく機能せず,より多くの誤った信号を生み出し,取引を損なう可能性があります.
HMAのクロスオーバー信号の有効性をさらに確認するために,取引量,トレンド指標など,他の技術指標または基本的な要因をフィルターとして導入することを検討する.
パラメータ最適化のために,遺伝子アルゴリズムやグリッド検索などの方法を使用して,現在の市場に最も適した歴史的データ上の最適なパラメータ組み合わせを見つけることができます.
ストップ・ロストとテイク・プロフィートのメカニズムを戦略に組み込む.
市場の傾向を考慮します.市場の傾向を判断するための指標を導入することで,傾向市場で取引し,横向市場を回避することができます.
ハル移動平均クロスオーバー戦略は,シンプルで使いやすい取引戦略である.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)