상대 강도 지수와 평균 진정 범위를 기반으로 한 다중 레벨 동적 비용 평균 스윙 거래 전략

RSI ATR DCA TP
생성 날짜: 2025-02-20 17:25:04 마지막으로 수정됨: 2025-02-27 17:22:25
복사: 0 클릭수: 369
avatar of ianzeng123 ianzeng123
2
집중하다
319
수행원

상대 강도 지수와 평균 진정 범위를 기반으로 한 다중 레벨 동적 비용 평균 스윙 거래 전략 상대 강도 지수와 평균 진정 범위를 기반으로 한 다중 레벨 동적 비용 평균 스윙 거래 전략

개요

이 전략은 상대적으로 강한 지수 ((RSI) 와 평균 실제 파도 ((ATR) 를 결합한 다단계 역동적인 비용평균 (DCA) 거래 시스템이다. 이는 주로 시장 과매도 조건을 식별하여 대량으로 포지션을 구축하고 ATR을 동적으로 조정하여 교두보 위치를 조정하여 배역 운영을 통해 수익을 얻는다. 이 전략은 위험 분산, 비용 최적화 및 수익 안정성 등의 특징을 가지고 있다.

전략 원칙

전략은 4시간 또는 일선 수준에서 작동하며, 핵심 논리는 다음과 같은 몇 가지 측면을 포함합니다:

  1. 입시 신호는 RSI 30 이하의 과매매 판단을 바탕으로 최대 4회까지 매장 수단을 허용한다
  2. 각 포지션의 금액은 200 달러의 총 위험 분량에 기반하며, 2배의 ATR 동적으로 포지션 규모를 계산합니다.
  3. 매장 관리는 동적 평균 비용 추적을 적용하여 여러 번 매장 한 후의 평균 가격을 실시간으로 계산합니다.
  4. 스톱은 평균보다 3배 높은 ATR로 설정되어 있으며, 시장의 변동성에 적응합니다.
  5. 표시 라인을 통해 실시간으로 평균 가격 및 정지 위치를 표시하여 시각적으로 추적 할 수 있습니다.

전략적 이점

  1. 리스크 컨트롤의 정밀성 - 리스크 금액을 미리 설정하고 ATR을 동적으로 조정하여 단일 거래의 위험을 정확하게 제어합니다.
  2. 유연한 창고 구축 - 분량 창고 구축은 비용을 절감하고 기회를 최대한 활용할 수 있습니다.
  3. 스마트 스톱 - ATR 기반의 동적 스톱은 수익을 보장하고 시장의 변동에 적응합니다.
  4. 가시성 강 - 평균 가격 라인 및 정지 라인의 실시간 표시가 직관적인 거래 참조를 제공합니다.
  5. 적응성 - 전략의 매개 변수는 시장 특성에 따라 유연하게 조정할 수 있습니다.

전략적 위험

  1. 지속적인 과매매 위험 - 시장의 지속적인 하락으로 인해 과도한 포지션이 발생할 수 있습니다. 해결책: 최대 매장 수 제한을 엄격하게 시행하고, 필요한 경우 손실을 중지하십시오.
  2. 스톱 설정 위험 - 너무 높은 스톱 배수는 수익 기회를 놓치게 할 수 있습니다. 해결책: 시장 특성에 따라 ATR 배수를 조정합니다.
  3. 재무 관리 위험 - 분량으로 창고 건설은 과도한 재원을 차지할 수 있습니다. 해결책: 합리적인 위험 제한과 포지션 규모를 설정하는 것

전략 최적화 방향

  1. 진입 신호 최적화
  • 동향 판단 지표를 늘리고, 강세를 보인 하락시 조기 포지션 구축을 피하십시오.
  • 합성 거래량 지표, 과매매 판단의 신뢰성 향상
  1. 제동기계 개선
  • 트레일링 스톱 메커니즘을 도입하여 수익을 더 잘 고정합니다.
  • ‘조작’을 고려하고 수익을 창출하는 유연성을 높여라
  1. 위험 통제 강화
  • 전체 철회 컨트롤을 추가
  • 자금 분배 알고리즘 최적화

요약하다

이 전략은 RSI와 ATR 지표의 결합을 통해 위험 제어와 수익 안정성을 겸비한 거래 시스템을 구현한다. 분기 포지션 메커니즘은 비용 최적화의 가능성을 제공하며, 동적 막기의 디자인은 수익의 합리적인 수행을 보장한다. 약간의 잠재적인 위험이 있지만, 합리적인 매개 변수 설정과 최적화 방향의 구현을 통해 전략의 전체적인 성능은 더욱 향상될 것이다.

전략 소스 코드
/*backtest
start: 2024-02-21 00:00:00
end: 2025-02-18 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Binance","currency":"DOGE_USDT"}]
*/

//@version=6
strategy("DCA-Based Swing Strategy (Risk $200) with Signals", overlay=true)

// === Main Indicators ===
// RSI for identifying oversold conditions
rsi = ta.rsi(close, 14)

// ATR for volatility estimation
atr = ta.atr(14)

// === Strategy Parameters ===
// Risk management
riskPerTrade = 200                       // Total risk ($200)
atrRisk = 2 * atr                        // Risk in dollars per buy (2 ATR)
positionSize = riskPerTrade / atrRisk    // Position size (shares)

// DCA Parameters
maxEntries = 4                           // Maximum of 4 buys
takeProfitATR = 3                        // Take profit: 3 ATR

// === Position Management ===
var float avgEntryPrice = na             // Average entry price
var int entryCount = 0                   // Number of buys
var line takeProfitLine = na             // Take profit line
var line avgPriceLine = na               // Average entry price line

// === Buy and Sell Conditions ===
buyCondition = rsi < 30 and entryCount < maxEntries  // Buy when oversold
if (buyCondition)
    strategy.entry("DCA Buy", strategy.long, qty=positionSize)
    
    // Update the average entry price
    avgEntryPrice := na(avgEntryPrice) ? close : (avgEntryPrice * entryCount + close) / (entryCount + 1)
    entryCount += 1

    // Display "BUY" signal on the chart
    label.new(bar_index, low, "BUY", style=label.style_label_up, color=color.green, textcolor=color.white, size=size.normal)

    // Update lines for average entry price and take profit
    if (not na(takeProfitLine))
        line.delete(takeProfitLine)
    if (not na(avgPriceLine))
        line.delete(avgPriceLine)
    takeProfitPrice = avgEntryPrice + takeProfitATR * atr


// Sell condition: Take profit = 3 ATR from average entry price
takeProfitPrice = avgEntryPrice + takeProfitATR * atr
if (close >= takeProfitPrice and entryCount > 0)
    strategy.close("DCA Buy")
    
    // Reset parameters after closing
    avgEntryPrice := na
    entryCount := 0

    // Remove lines after selling
    if (not na(takeProfitLine))
        line.delete(takeProfitLine)
    if (not na(avgPriceLine))
        line.delete(avgPriceLine)