モメントブレイク 双方向追跡戦略

作者: リン・ハーンチャオチャン, 日付: 2023-12-18 10:47:46
タグ:

img

概要

この戦略は,トレンド追跡のための強いトレンドにおけるブレイクアウト信号を捕捉するために,モメント指標と双方向追跡指標を組み合わせます.価格が上昇するときに長くなって,価格が低下するときに短くなります.これはトレンド追跡戦略カテゴリーに属します.

戦略の論理

  1. HiLoアクティベーターインジケータは,最高値と最低値の真ん中点を用いて中値を計算する.価格が中値を超えると,購入信号が生成される.価格が中値を下回ると,販売信号が生成される.

  2. ADX (平均方向指数) は,トレンドの強さを測定するために使用される.ADX値が高くなるほど,トレンドが強くなる.この戦略は,信号をフィルタリングするために値を持つ ADX を使用し,トレンドが十分に強いときにのみ信号を生成する.

  3. 方向指標DI+とDI-は,それぞれ上昇傾向と下落傾向の強さを表しています.この戦略は,間違った信号を避けるために強さを確認するためにDI+とDI-の値も使用します.

  4. 購入シグナルは,価格が中値を超えると,ADXが値を超えると,DI+が値を超えると生成される.販売シグナルは,価格が中値を下回ると,ADXが値を超えると,DI-が値を超えると生成される.

利点分析

この戦略は,初期ブレイクを把握し,トレンドを注意深く追跡するために,モメントとトレンドフォローする指標の利点を組み合わせます.厳格なトレンドフィルタ条件はまた,統合およびレンジング期間に間違った信号を避けるのに役立ちます.

この戦略は,インパクト指標のみを使用すると比較して,シグナルをフィルタリングし,収益性を向上させるためにトレンド強度評価を追加します.純粋なトレンドフォロー戦略と比較して,この戦略はブレイクアウト信号を通じてトレンドを早期に入力することができます.

全体的に見ると,戦略はトレンドをスムーズに追跡し,タイミングでエントリーとアウトリースを可能にし,統合に引っかかることを避け,トレンド逆転による損失を減らすことができます.

リスク分析

この戦略には,誤った信号を生む一時的な価格逆転によるいくつかのリスクがあります.また,ADXとDIの値を使用すると,初期の機会を逃す可能性があります.

ハイロ・アクティベーターのパラメータを調整して,ブレイクアウト範囲を拡大します.より多くの機会を掴むために,信号品質を犠牲にして ADX と DI の値を下げます.

ユーザーには,製品と市場環境の違いも注意すべきである.より高い値は一般的に商品によりうまく機能する一方,より低い値は株式と外為に適している.

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

この戦略を最適化する主な方法は以下の通りです.

  1. ハイロアクティベーター期間とトリガーレベルを調整して リスクとタイミングを バランスさせる

  2. ADX 期間と値を調整し,信号の質と周波数をバランスにする.

  3. DI+と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)


もっと