리소스 로딩... 로딩...

동적 ATR Stop-Loss RSI 과잉 매출 리바운드 양적 전략

저자:차오장, 날짜: 2024-11-29 16:18:55
태그:RSISMAATRTPSL

img

전반적인 설명

이 전략은 RSI 과잉판매 신호와 동적 ATR 스톱-러스를 기반으로 한 양적 거래 시스템이다. 매일 시간 프레임 데이터를 사용하여 RSI 과잉판매 신호와 200 일 이동 평균 트렌드 필터를 결합하여 과잉판매 시장 조건에서 리바운드 기회를 포착합니다. 이 전략은 동적 ATR 스톱-러스 및 정적 인 비율 스톱-러스 메커니즘을 모두 사용하고 단계적 인 포지션 감축을 통해 세 배의 수익 목표를 구현합니다.

전략 원칙

핵심 논리는 다음의 핵심 요소들을 포함합니다.

  1. 엔트리 신호: RSI ((5) 가 30의 과잉 판매 수준 이하로 떨어지고 가격이 200일 이동 평균 이상으로 떨어지면 시스템이 긴 신호를 생성합니다.
  2. 스톱 로스 메커니즘: 동적 스톱 로스를 1.5x ATR (XX) 와 고정 스톱 로스를 25% 결합합니다.
  3. 이윤 목표: 5%, 10% 및 15%로 세 가지 목표를 설정하여 각각 33%, 66% 및 100%로 위치를 줄입니다.
  4. 포지션 관리: 켈리 기준으로 계산된 59.13% 포지션 크기 또는 보수적인 75% 포지션 크기를 사용하는 것이 좋습니다.

전략적 장점

  1. 듀얼 트렌드 확인: RSI 과잉 판매와 이동 평균 트렌드를 통해 거래를 검증하여 승률을 향상시킵니다.
  2. 유연한 리스크 제어: 동적 ATR 스톱 로스는 시장 변동에 적응하고 고정 스톱 로스는 궁극적인 보호를 제공합니다.
  3. 지능적인 수익 관리: 단계적 위치 감소와 함께 세 개의 목표가 상승 잠재력을 유지하면서 수익을 확보합니다.
  4. 과학 자본 관리: 켈리 기준을 사용하여 포지션 크기를 최적화하고 위험과 보상을 균형 잡습니다.

전략 위험

  1. 트렌드 의존성: 전략은 다양한 시장에서 빈번한 정지를 유발할 수 있습니다. 제안: 거짓 신호 를 줄이기 위해 오시레이터 필터 를 추가 하십시오.

  2. 넓은 스톱 로스: 25%의 고정 스톱 로스는 단일 거래에서 큰 손실을 초래할 수 있습니다. 제안: 개인의 위험 용량에 따라 스톱 로스 비율을 조정합니다.

  3. 마감 위험: 단계적으로 수익을 취하는 것은 강한 트렌드에서 너무 일찍 포지션을 줄일 수 있습니다. 제안: 동적 인 수익 목표 를 고려 하거나 추세를 따라가는 부분 을 유지 하십시오.

전략 최적화 방향

  1. 신호 최적화:
  • 볼륨 확인을 추가합니다
  • MACD와 같은 트렌드 지표를 포함
  • 변동성 필터를 구현합니다
  1. 스톱 로스 최적화:
  • 동적 스톱 로스 비율을 구현
  • 시간 기반의 정지를 추가합니다
  • 리스크/보상 필터를 포함합니다
  1. 이윤 창출 최적화:
  • ATR에 기반한 동적 목표를 설정
  • 후속 정지
  • 위치 감소 비율을 최적화

요약

이 전략은 RSI 과잉 판매 신호와 이동 평균 트렌드 필터링을 결합하여 완전한 거래 시스템을 구축하며, 역동적인 ATR 스톱 로스 및 트리플 이윤 목표에 의해 보완됩니다. 이 전략의 장점은 유연한 리스크 제어 및 합리적인 수익 관리에 있습니다. 시장 조건 및 개인 리스크 선호도에 기반한 최적화가 필요하지만. 신호 시스템, 스톱 로스 메커니즘 및 수익 취득 전략의 지속적인 개선을 통해 시스템은 라이브 거래에서 더 나은 성과를 낼 수 있는 잠재력을 보여줍니다.


/*backtest
start: 2019-12-23 08:00:00
end: 2024-11-27 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This work is licensed under a Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA/4.0) https://creativecommons.org/licenses/by-nc-sa/4.0/
// © wielkieef

//@version=5
strategy("Simple RSI stock Strategy [1D] ", overlay=true, pyramiding=1, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=75, calc_on_order_fills=false, slippage=0, commission_type=strategy.commission.percent, commission_value=0.03)

// Rsi
oversoldLevel = input(30, title="Oversold Level")
overboughtLevel = input(70, title="Overbought Level")
rsi = ta.rsi(close, 5)
rsi_overbought = rsi > overboughtLevel  
rsi_oversold = rsi < oversoldLevel

// Sma 200
lenghtSMA = input(200, title = "SMA lenght")
sma200 = ta.sma(close, lenghtSMA)

// ATR stop-loss
atrLength = input.int(20, title="ATR Length")
atrMultiplier = input.float(1.5, title="ATR Multiplier")
atrValue = ta.atr(atrLength)
var float long_stop_level = na
var float short_stop_level = na
var float tp1_level = na
var float tp2_level = na
var float tp3_level = na

// Strategy entry
long = (rsi_oversold ) and close > sma200 

// Take Profit levels
tp_1 = input.float(5.0, "TP 1", minval=0.1, step=0.1)
tp_2 = input.float(10.0, "TP 2", minval=0.2, step=0.1)
tp_3 = input.float(15.0, "TP 3", minval=0.3, step=0.1)

if long
    strategy.entry('Long', strategy.long)
    long_stop_level := close - atrMultiplier * atrValue
    tp1_level := strategy.position_avg_price * (1 + tp_1 / 100)
    tp2_level := strategy.position_avg_price * (1 + tp_2 / 100)
    tp3_level := strategy.position_avg_price * (1 + tp_3 / 100)

// basic SL - this code is from author RafaelZioni, modified by wielkieef
sl = input.float(25.0, 'Basic Stop Loss %', step=0.1)
per(procent) =>
    strategy.position_size != 0 ? math.round(procent / 100 * strategy.position_avg_price / syminfo.mintick) : float(na)

// ATR SL
if (strategy.position_size > 0 and (close <= long_stop_level))
    strategy.close("Long")
    tp1_level := na
    tp2_level := na
    tp3_level := na
plot(long_stop_level, color=color.orange, linewidth=2, title="Long Stop Loss")

// TP levels
if (strategy.position_size > 0)
    if (not na(tp1_level) and close >= tp1_level)
        tp1_level := na
    if (not na(tp2_level) and close >= tp2_level)
        tp2_level := na
    if (not na(tp3_level) and close >= tp3_level)
        tp3_level := na

plot(strategy.position_size > 0 and not na(tp1_level) ? tp1_level : na, color=color.gray, style=plot.style_circles , linewidth=1, title="Take Profit 1")
plot(strategy.position_size > 0 and not na(tp2_level) ? tp2_level : na, color=color.gray, style=plot.style_circles , linewidth=1, title="Take Profit 2")
plot(strategy.position_size > 0 and not na(tp3_level) ? tp3_level : na, color=color.gray, style=plot.style_circles , linewidth=1, title="Take Profit 3")

// Strategy exit points for Take Profits
strategy.exit('TP 1', from_entry="Long", qty_percent=33, profit=per(tp_1), loss=per(sl))
strategy.exit('TP 2', from_entry="Long", qty_percent=66, profit=per(tp_2), loss=per(sl))
strategy.exit('TP 3', from_entry="Long", qty_percent=100, profit=per(tp_3), loss=per(sl))

// by wielkieef

관련

더 많은