이 전략은 평균 실제 변동량 (ATR) 과 상대적으로 강한 지수 (RSI) 를 기반으로 트렌드 추적 기능을 갖춘 거래 시스템을 설계했습니다. 이 시스템은 자동으로 트렌드 방향을 인식하고 손실 및 중지 기능을 갖습니다.
ATR과 RSI를 계산한다. ATR은 최근 기간 동안의 평균 가격 변동의 폭을 나타낸다. RSI는 다공계 쌍방의 힘의 대립을 나타낸다.
ATR이 이동 평균보다 크면, 높은 변동 기간에 있다고 여겨지며, 거래에 적합하다.
RSI가 초과 구매 라인보다 높을 때, 더 많이 구매하십시오. RSI가 초과 판매 라인보다 낮을 때, 더 많이 구매하지 마십시오.
더하면, 높은 점에 고정 비율을 곱하여 트래킹 스톱 로드 . 헐면 낮은 점에 고정 비율을 곱하여 트래킹 스톱 로드 .
수익률이 떨어지네요.
트래킹 스톱로스는 스톱로스를 최소화하고 손실을 줄일 수 있다.
RSI는 상공의 힘을 효과적으로 판단하여, 흔들리는 상황에서 반복적으로 포지션을 열지 않을 수 있습니다.
ATR은 변동성의 지표로서, 동요상태를 필터링하여, 동요상태에서만 거래한다.
이윤 비율 제약은 이윤의 일부를 잠금할 수 있다.
ATR와 RSI는 모두 지연 지표이며, 입시 시점 지연을 초래할 수 있다. 적절한 최적화 파라미터를 사용하여 시스템을 더 민감하게 만들 수 있다.
고정 적자 손실은 스톱 손실 스톱보다 과도하게 최적화 될 수 있으며, 피드백 결과와 함께 신중하게 설정해야합니다.
대주기적 변동 시, ATR은 이동 평균보다 장기적으로 커져서 과도한 거래가 발생할 수 있다. 다른 필터링 조건을 추가할 수 있다.
ATR와 RSI의 매개 변수를 최적화하여 시스템을 더 민감하게 만듭니다.
트렌드 방향을 판단하는 MA와 같은 지표를 추가하여 흔들림 상황을 피하십시오.
고정된 설정이 아닌 동적 스톱 손해 스톱 비율을 시도하십시오.
거래량 조절을 고려하십시오.
이 전략은 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)