アダプティブ 価格 チャネル 戦略

作者: リン・ハーンチャオチャン開催日:2023年12月4日16時33分45秒
タグ:

img

概要

この戦略は,平均真の範囲 (ATR) 指標と平均方向指数 (ADX) をベースとした適応価格チャネル戦略である.これは横向市場と価格変動の傾向を特定し,それに応じて取引を行うことを目的としている.

戦略の論理

  1. 与えられた長度における最高高値 (HH) と最低低値 (LL) を計算する.また同じ長度における ATR を計算する.

  2. ADX を計算します. 価格の上昇と下落を計算します.

  3. ADX < 25 の場合,市場は横向きとみなされます. 閉じる > 上部チャネル (HH - ATR マルチプリキュア * ATR) の場合は,ロングに行く. 閉じる < 下部チャネル (LL + ATR マルチプリキュア * ATR) の場合は,ショートに行く.

  4. ADX >= 25 +DI > -DIなら,市場は上昇傾向にある.閉じる > 上部チャネルなら,ロングする.

  5. ADX >= 25 +DI < -DI ならば,市場は下落傾向にある. 閉じる場合 < 下のチャネル,ショートに行く.

  6. 出口位置は入口以来の exit_length バーの後.

利点分析

  1. 戦略は,市場状況に基づいて自動的に適応し,横向市場でのチャネル戦略とトレンド市場でのトレンドをフォローします.

  2. ATRとADXを使用すると適応性が確保される.ATRはチャネル幅を調整し,ADXはトレンドを決定する.

  3. 強制出口は安定性を増やします

リスク分析

  1. ADXは頻繁に偽信号を生成します.

  2. ATRとADXのパラメータが悪ければ 性能が悪い

  3. ブラック・スワン事件を 効果的に防げない

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

  1. ATRとADXのパラメータを最適化して適応性を向上させる.

  2. 損失を制限するためにストップ損失を追加します.

  3. 偽信号を避けるためにフィルターを追加します.

結論

戦略は,市場条件に適応するための指標とメカニズムを組み合わせています. しかし,指標の制限により判断が誤りになり得ます. パラメータとリスク管理の将来の最適化.


/*backtest
start: 2023-11-03 00:00:00
end: 2023-12-03 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Adaptive Price Channel Strategy", overlay=true)

length = input(20, title="Length")
exit_length = input(10, title="Exit After X Periods")
atr_multiplier = input(3.2, title="ATR Multiplier")

startDate = input(defval = timestamp("2019-01-15T08:15:15+00:00"), title = "Start Date")
endDate = input(defval = timestamp("2033-04-01T08:15:00+00:00"), title = "End Date")

hh = ta.highest(high, length)
ll = ta.lowest(low, length)
atr = ta.atr(length)

// calculate +DI and -DI
upMove = high - high[1]
downMove = low[1] - low
plusDM = na(upMove[1]) ? na : (upMove > downMove and upMove > 0 ? upMove : 0)
minusDM = na(downMove[1]) ? na : (downMove > upMove and downMove > 0 ? downMove : 0)
plusDI = ta.rma(plusDM, length) / atr * 100
minusDI = ta.rma(minusDM, length) / atr * 100

// calculate ADX
dx = math.abs(plusDI - minusDI) / (plusDI + minusDI) * 100
adx = ta.rma(dx, length)

var int barSinceEntry = na

if (not na(close[length]) )
    if (adx < 25) // Sideways market
        if (close > hh - atr_multiplier * atr)
            strategy.entry("PChLE", strategy.long, comment="PChLE")
            barSinceEntry := 0
        else if (close < ll + atr_multiplier * atr)
            strategy.entry("PChSE", strategy.short, comment="PChSE")
            barSinceEntry := 0
    else if (adx >= 25 and plusDI > minusDI) // Bullish market
        if (close > hh - atr_multiplier * atr)
            strategy.entry("PChLE", strategy.long, comment="PChLE")
            barSinceEntry := 0
    else if (adx >= 25 and plusDI < minusDI) // Bearish market
        if (close < ll + atr_multiplier * atr)
            strategy.entry("PChSE", strategy.short, comment="PChSE")
            barSinceEntry := 0

if (na(barSinceEntry))
    barSinceEntry := barSinceEntry[1] + 1
else if (barSinceEntry >= exit_length)
    strategy.close("PChLE")
    strategy.close("PChSE")
    barSinceEntry := na

plot(hh, title="Highest High", color=color.green, linewidth=2)
plot(ll, title="Lowest Low", color=color.red, linewidth=2)



もっと