ATRとRSIに基づくトレンドフォロー取引戦略


作成日: 2023-10-09 15:18:10 最終変更日: 2023-10-09 15:18:10
コピー: 0 クリック数: 1027
1
フォロー
1617
フォロワー

概要

この戦略は,平均実際の波動幅 ((ATR) と相対的に強い指数 ((RSI) をベースに,トレンド追跡機能を持つ取引システムを設計した.このシステムは,トレンドの方向を自動的に認識し,ストップとストップ機能を備えている.

戦略原則

  1. ATRとRSIを計算する. ATRは,最近の一段間の平均価格変動の幅を反映する. RSIは,多空両者の力の対比を反映する.

  2. ATRが移動平均より大きいとき,高波動期にあると考えられ,取引に適している.

  3. RSIが超買線より高いときは,オーバー;RSIが超売り線より低いときは,空き.

  4. 負債の多めにすると,高点に固定比率を掛けてストップを追跡する.

  5. 利益の割合は止まっている.

優位分析

  1. ストップトラッキングは,最大限のストップを設定し,損失を減らすことができます.

  2. RSIは多空力を判断し,波動的な状況で繰り返しポジションを開くのを防ぐことができます.

  3. ATRは波動性の指標として,震動をフィルターして,トレンドの動きのみで取引することができる.

  4. 利益率の制限は,利益の一部をロックすることができます.

リスク分析

  1. ATRとRSIは,遅滞指標であり,入場時の偏差を引き起こす可能性があります.適切なパラメータを最適化して,システムをより敏感にすることができます.

  2. 固定損益比止損は過度に最適化されやすいので,フィードバック結果と組み合わせて慎重に設定すべきである.

  3. 大周期的な振動の状況では,ATRは長期間移動平均より大きくなり,過度取引を引き起こします.他のフィルタリング条件を追加することができます.

最適化の方向

  1. ATRとRSIのパラメータを最適化して,システムをより敏感にします.

  2. 動向を判断するMAなどの指標を追加して,揺動の状況に誤り入らないようにする.

  3. 固定設定ではなく,動的な止損停止比率を試してください.

  4. 取引量管理の追加を検討する

要約する

この戦略はATRとRSIの2つの指標の優位性を統合し,シンプルで実用的なトレンド追跡取引システムを設計した.パラメータの最適化とフィルタリング条件の追加により,システムの安定性をさらに向上させることができます.全体的に,この戦略は,強力な現場で適用価値を持っています.

ストラテジーソースコード
/*backtest
start: 2023-09-08 00:00:00
end: 2023-10-08 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// © liwei666
//@version=5
// # ========================================================================= #
// #                   |   Strategy  |
// # ========================================================================= #
strategy(
 title                = "ATR_RSI_Strategy v2[liwei666]",
 shorttitle           = "ATR_RSI_Strategy",
 overlay              =  true,
 max_lines_count                 =  500, 
 max_labels_count                =  500, 
 max_boxes_count                 =  500,
 max_bars_back = 5000,
 initial_capital = 10000,
 default_qty_type=strategy.percent_of_equity, 
 default_qty_value=50, commission_type=strategy.commission.percent, pyramiding=1, 
 commission_value=0.05
 )
// # ========================================================================= #
// #                   |   Strategy  |
// # ========================================================================= #

atr_length = input.int(26, "atr_length", minval = 6, maxval = 100, step=1)
atr_ma_length = input.int(45, "atr_ma_length", minval = 6, maxval = 100, step=1)
rsi_length = input.int(15, "rsi_length", minval = 6, maxval = 100, step=1)
rsi_entry = input.int(10, "rsi_entry", minval = 6, maxval = 100, step=1)
atr_ma_norm_min = input.float(0.3, "atr_ma_norm_min", minval = 0.1, maxval = 0.5, step=0.1)
atr_ma_norm_max = input.float(0.7, "atr_ma_norm_max", minval = 0.5, maxval = 1, step=0.1)
trailing_percent= input.float(1.5, "trailing_percent", minval = 0.1, maxval = 2, step=0.1)

var rsi_buy = 50 + rsi_entry
var rsi_sell = 50 - rsi_entry

sma_norm_h_45() => 
    source = high
    n = 45
    sma = ta.sma(source, n) 
    sma_norm = (sma - ta.lowest(sma, n)) / (ta.highest(sma,n) - ta.lowest(sma, n))
    sma_norm

atr_value = ta.atr(atr_length)
atr_ma = ta.sma(atr_value, atr_ma_length) 
rsi_value = ta.rsi(close, length = rsi_length) 
atr_ma_norm = atr_ma / close * 100
sma_norm = sma_norm_h_45()

var intra_trade_high = 0.0
var intra_trade_low = 0.0

if strategy.position_size == 0
    intra_trade_high := high
    intra_trade_low := low

    if atr_ma_norm >= atr_ma_norm_min and atr_ma_norm <= atr_ma_norm_max
        if atr_value > atr_ma
            if rsi_value > rsi_buy
                strategy.entry("B1", strategy.long, limit = close + 5 )
            else if rsi_value < rsi_sell
                strategy.entry("S1", strategy.short, limit = close - 5 )
else if strategy.position_size > 0
    intra_trade_high := math.max(intra_trade_high, high)
    intra_trade_low := low

    long_tp = intra_trade_high * (1 - trailing_percent / 100)
    strategy.exit("Exit B1", from_entry="B1", stop = long_tp, limit = strategy.position_avg_price * 1.03)

else if strategy.position_size < 0
    intra_trade_high := high
    intra_trade_low := math.min(intra_trade_low, low) 

    short_tp = intra_trade_low * (1 + trailing_percent / 100)
    strategy.exit("Exit S1", from_entry="S1", stop = short_tp, limit = strategy.position_avg_price * 0.94)