モメンタムブレイクアウト双方向トラッキング戦略


作成日: 2023-12-18 10:47:46 最終変更日: 2023-12-18 10:47:46
コピー: 0 クリック数: 625
1
フォロー
1621
フォロワー

モメンタムブレイクアウト双方向トラッキング戦略

概要

この戦略は,動態指標と双方向追跡指標の使用を組み合わせて,強い傾向の中で突破信号を捕捉し,トレンド追跡を実現する.価格が上方突破するとき多行し,価格が下方突破するとき空きをする,トレンド追跡の戦略の類である.

戦略原則

  1. HiLoアクティバータ指数を使用して中期価格を計算する.この指数は最高価格と最低価格の中間点を中期価格として使用する.価格が上昇すると中期価格を突破し,購入シグナルを生成し,価格が下がると中期価格を突破し,販売シグナルを生成する.

  2. 平均トレンド指数ADXは,トレンドの強さを判断するために使用される.ADXの値が大きいほど,トレンドが強いことを示す.この戦略は,一定の値のADXを使用して信号をフィルタリングし,トレンドが十分に強い場合にのみ信号を生成する.

  3. 多方向指針DI+とDI−は,それぞれ多頭力と空頭力を表している.この戦略は,ある値のDI+とDI−を同時に配合して,多頭と空頭力の確認を行い,誤信号を防ぐ.

  4. 価格が中期価格,ADXを減価値より高く,DI+を減価値より高く突破すると買取シグナルが生成され,価格が中期価格,ADXを減価値より高く,DI-を減価値より高く突破すると下売シグナルが生成される.

優位分析

この戦略は,動態指標とトレンド指標の優位性を組み合わせて,トレンドの発展の初期に価格の突破を捉えることができ,したがってトレンドを緊密に実行する.同時に,トレンドフィルタリング条件は厳格であり,コンソリデーション市と振動市の誤信号を回避するのに役立ちます.

動力指標を単体で使用するよりも,この戦略は信号を生成する際にトレンドの強さの判断を加えることで,誤信号を減らすことができ,利益の確率を高めることができる.トレンド追跡指標を単体で使用するよりも,この戦略は突破によって信号を生成し,より早くトレンドに入ることができる.

全体的に見ると,戦略はトレンドを順調に追跡し,タイムリーにエントリー・アウトし,泥沼を回避し,トレンドの逆転の損失を減らすことができます.

リスク分析

この策略には,価格が一定程度に反調し,反転信号を生む可能性があるという特定のウィップソーリスクがあります.また,ADXとDIでフィルタリング条件を設定することで,初期運用の機会の一部を逃す可能性があります.

ウィップソーリスクを減らすために,HiLoアクティバータのパラメータを適切に調整して突破幅を大きくすることができる.より多くのチャンスを得るために,ADXとDIの値要求を低下させることができるが,信号品質をバランスさせる必要がある.

さらに,ユーザは,異なる品種と市場環境におけるパラメータ設定の違いに注意する必要がある.一般的に,大宗商品は,より高い値を設定する必要がある.株式と外貨は,より低い値を使用することができます.

最適化の方向

この戦略は,パラメータの設定を調整することで最適化できます.主な最適化方向は,以下の通りです.

  1. HiLoアクティベーターの周期とトリガの幅を調整し,ウィップソーリスクとエントリタイムをバランスする.

  2. ADX周期と値要求を調整し,信号品質と入入周波数をバランスする.

  3. 多頭部と空頭部DIの値をそれぞれ調整し,多頭部と空頭部環境の違いを区別する.

  4. ストップ・ストラトジーを追加し,単一の損失を制御するためにストップ・ストラトジーを設定します.

  5. 戦略の全体的な安定性を向上させるための,他の補助指標と組み合わせた最適化.

要約する

この戦略は,動態指標とトレンド指標を総合的に考慮して,強烈なトレンドで買い,売るシグナルを生成する.それは,順次,緊迫的なトレンドの特性を有しており,トレンドの早期のチャンスを捕捉するのに適しています.同時に,それは,誤信号とウィップソーによる損失を減らすために,一定のリスク管理能力をも備えています.パラメータ調整とストップ・ローズ戦略の追加によって,この戦略は,継続的に安定したパフォーマンスを得ることができます.それは,さまざまな品種と市場環境に適した多機能のトレンド追跡戦略であり,量化トレーダーの重点研究と応用に価値がある.

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

//@version=4
strategy("HiLo Activator with ADX", shorttitle="HASB_ADX", overlay=true)

// Parameters for the HiLo Activator
length_ha = input(14, title="HiLo Activator Period")
offset_ha = input(0, title="Offset")
trigger_ha = input(1, title="Trigger for Buy/Sell")

// Parameters for ADX
adx_length = input(14, title="ADX Period", minval=1)
adx_threshold = input(25, title="ADX Threshold")
di_threshold = input(50, title="DI Threshold")

// Parameter for choosing the number of candles for backtest
backtest_candles = input(1000, title="Number of Candles for Backtest", minval=1)

// Function to get backtest data
getBacktestData() =>
    var float data = na
    if bar_index >= backtest_candles
        data := security(syminfo.tickerid, "D", close[backtest_candles])
    data

// HiLo Activator calculations
ha = (highest(high, length_ha) + lowest(low, length_ha)) / 2

// ADX calculations
trh = high - high[1]
trl = low[1] - low
tr = max(trh, trl)
atr = sma(tr, adx_length)
plus_dm = high - high[1] > low[1] - low ? max(high - high[1], 0) : 0
minus_dm = low[1] - low > high - high[1] ? max(low[1] - low, 0) : 0
smoothed_plus_dm = sma(plus_dm, adx_length)
smoothed_minus_dm = sma(minus_dm, adx_length)
di_plus = 100 * (smoothed_plus_dm / atr)
di_minus = 100 * (smoothed_minus_dm / atr)
dx = 100 * abs(di_plus - di_minus) / (di_plus + di_minus)
adx = sma(dx, adx_length)

// Buy and Sell signals based on HiLo Activator and ADX
signalLong = crossover(close, ha) and adx > adx_threshold and di_plus > di_threshold
signalShort = crossunder(close, ha) and adx > adx_threshold and di_minus > di_threshold

// Plot HiLo Activator and ADX
plot(ha, color=color.blue, title="HiLo Activator")
plot(offset_ha, color=color.red, style=plot.style_histogram, title="Offset")
plot(adx, color=color.purple, title="ADX")

// Backtest strategy
strategy.entry("Buy", strategy.long, when = signalLong)
strategy.entry("Sell", strategy.short, when = signalShort)
strategy.close("Buy", when = signalShort)
strategy.close("Sell", when = signalLong)

// Accuracy percentage
var accuracy = 0.0
var totalTrades = 0
var winningTrades = 0

if (signalLong or signalShort)
    totalTrades := totalTrades + 1

if (signalLong and (not na(signalLong[1]) and (not signalLong[1])))
    winningTrades := winningTrades + 1

if (signalShort and (not na(signalShort[1]) and (not signalShort[1])))
    winningTrades := winningTrades + 1

accuracy := totalTrades > 0 ? (winningTrades / totalTrades) * 100 : 0

// Plot accuracy percentage on the chart
plot(accuracy, title="Accuracy Percentage", color=color.purple, style=plot.style_histogram)