RSI トレイリングストップ戦略のモメント ADX

作者: リン・ハーンチャオチャン開催日:2023年10月9日15時36分07秒
タグ:

概要

この戦略は,相対強度指数 (RSI) とモメントインジケーターを組み合わせ,リスクを制御しながらトレンド方向を把握するためのダイナミック・トレリング・ストップメカニズムを組み合わせます.強い上向きモメントがある場合,長引く,強い下向きモメントがある場合,短引く.この戦略は,利益を得て損失を減らすためにトレリング・ストップを使用して利益を得たり,損失を止める条件を設定します.

機能 する 方法

モメント ADX と RSI と入力

  • ADX インディケーターを使用して価格動向方向を決定する

    • ADX 20 以上の傾向を示しています.

    • +DIが -DIより上にあるのは長い信号です

    • -DIの横断は短信号です

  • RSI は,買い過ぎ/売過ぎを特定するものです.

    • RSIが70を超えると 過剰購入とショートシグナルを示します

    • RSIが30を下回ると過剰売り,ロングシグナルです

ADX がトレンド+RSI 確認信号を示したときにロング/ショートポジションを取ります

調節可能な追尾停止

この戦略は2つのパラメータを持つ動的トレーリングストップメカニズムを使用します.

  • アクティベーションレベル: 価格がエントリー後に設定されたパーセントに達したとき,トレーリングストップをアクティブにする

  • トレイリングパーセント: 最高利益から設定された停止レベルトレイルのパーセント

トレイリングストップは,トレイル値が上昇すると,ストップ値が下がります.トレイル値が上昇すると,ストップ値が下がります.ストップ値が上昇すると,ストップ値が上昇します.

利点

  • モメントADXはトレンド方向を決定し,偽のブレイクを回避します

  • RSIの確認は逆転の機会を逃さないようにします

  • 調整可能なストップは,利益を固定し,損失を最小限に抑える

  • シンプルで明快な戦略論理,理解しやすい

  • 異なる市場と時間枠に適用可能

リスクと緩和策

  • ADXは誤ったブレイクシグナルを 発信する可能性があります

    • ADX パラメータを調節して真のトレンド動きを検出する
  • RSIは複数の誤った信号を与える可能性があります.

    • 過剰購入/過剰販売レベルを調整し,ウィップソウを減らす
  • トレイリングストップパラメータが悪い

    • 最適の停止レベルを見つけるためにパラメータを最適化
  • ギャップは停留を逃す可能性があります

    • ストップ・リミット・オーダーを使用することを検討する

最適化 の 機会

  • 入力を最適化するために ADX/RSI の組み合わせをテストする

  • バックテスト 様々なアクティベーションレベルとトライルパーセント

  • 信号品質を改善するために追加のフィルターを追加します

  • 信頼性の高いパラメータを見つけるために異なる市場でのテスト

結論

この戦略は,動力分析,RSIおよびトレーリングストップを統合して,トレンド方向,スポット逆転,およびリスクを効果的に決定する. シンプルな論理により,株式,フォレックス,暗号,および他のトレンド市場では簡単に実装できます. パラメータの最適化およびフィルターを追加することでさらなる改善ができます. 全体的に,トレーダーは強力な定量的な取引フレームワークを提供します.


/*backtest
start: 2023-10-01 00:00:00
end: 2023-10-03 00:00:00
period: 30m
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Trailing Stop with RSI", overlay=true)

length = input.int(12, "Momentum Length")
price = close
momentum(seria, length) =>
    mom = seria - seria[length]
    mom
mom0 = momentum(price, length)
mom1 = momentum(mom0, 1)

rsiLength = input.int(14, "RSI Length")
rsiOverbought = input(70, "RSI Overbought Level")
rsiOversold = input(30, "RSI Oversold Level")

rsiValue = ta.rsi(close, rsiLength)

tsact = input.float(0.0, "Trailing Stop Activation (%)", group="strategy", tooltip="Activates the Trailing Stop once this PnL is reached.") / 100
tsact := tsact ? tsact : na
ts = input.float(0.0, "Position Trailing Stop (%)", group="strategy", tooltip="Trails your position with a stop loss at this distance from the highest PnL") / 100
ts := ts ? ts : na

in_long = strategy.position_size > 0
in_short = strategy.position_size < 0

var ts_ = array.new_float()
ts_size = array.size(ts_)
ts_get = ts_size > 0 ? array.get(ts_, ts_size - 1) : 0

if in_long
    if tsact and high > strategy.position_avg_price + strategy.position_avg_price * tsact
        if ts_size > 0 and ts_get < high
            array.push(ts_, high)
        if ts_size < 1
            array.push(ts_, high)
    if not tsact
        if ts_size > 0 and ts_get < high
            array.push(ts_, high)
        if ts_size < 1
            array.push(ts_, high)
if in_short
    if tsact and low < strategy.position_avg_price - strategy.position_avg_price * tsact
        if ts_size > 0 and ts_get > low
            array.push(ts_, low)
        if ts_size < 1
            array.push(ts_, low)
    if not tsact
        if ts_size > 0 and ts_get > low
            array.push(ts_, low)
        if ts_size < 1
            array.push(ts_, low)

trail = in_long and ts_size > 0 ? low < ts_get - ts_get * ts : in_short and ts_size > 0 ? high > ts_get + ts_get * ts : na

if (mom0 > 0 and mom1 > 0)
    strategy.entry("MomLE", strategy.long, stop=high+syminfo.mintick, comment="MomLE")
else
    strategy.cancel("MomLE")
if (mom0 < 0 and mom1 < 0)
    strategy.entry("MomSE", strategy.short, stop=low-syminfo.mintick, comment="MomSE")
else
    strategy.cancel("MomSE")

tsClose = in_long ? ts_get - ts_get * ts : in_short ? ts_get + ts_get * ts : na
if trail
    strategy.close_all()
if not strategy.opentrades
    array.clear(ts_)

rsiOverboughtCondition = rsiValue >= rsiOverbought
rsiOversoldCondition = rsiValue <= rsiOversold

if rsiOverboughtCondition
    strategy.close("SHORT", "SX")
    strategy.entry("LONG", strategy.long)

if rsiOversoldCondition
    strategy.close("LONG", "LX")
    strategy.entry("SHORT", strategy.short)

plotchar(ts_get, "GET", "")
plot(strategy.position_avg_price > 0 ? strategy.position_avg_price : na, "Average", color.rgb(251, 139, 64), 2, plot.style_cross)
plot(tsClose > 0 ? tsClose : na, "Trailing", color.rgb(251, 64, 64), 2, plot.style_cross)
plot(strategy.position_avg_price - strategy.position_avg_price * tsact > 0 ? strategy.position_avg_price - strategy.position_avg_price * tsact : na, "TS Activation", color.fuchsia, 2, plot.style_cross)


もっと