거래 전략에 따른 ATR 및 RSI 기반 트렌드

저자:차오장, 날짜: 2023-10-09 15:18:10
태그:

전반적인 설명

이 전략은 트렌드를 따르는 기능을 가진 트렌드 시스템을 설계합니다. 평균 진정한 범위 (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 지표의 장점을 통합하고 거래 시스템을 따르는 간단하고 실용적인 트렌드를 설계합니다. 매개 변수 최적화 및 필터를 추가하여 시스템 안정성을 더욱 향상시킵니다. 전반적으로이 전략은 라이브 거래에 강력한 실용적 가치를 가지고 있습니다.


/*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)

더 많은