RSI 모멘텀과 ADX 트렌드 강도를 기반으로 한 자금 관리 시스템

RSI ADX ATR EMA TP
생성 날짜: 2024-12-20 14:24:34 마지막으로 수정됨: 2024-12-20 14:24:34
복사: 0 클릭수: 119
1
집중하다
1214
수행원

RSI 모멘텀과 ADX 트렌드 강도를 기반으로 한 자금 관리 시스템

개요

이 전략은 트렌드 추적과 진동 거래의 혼합 전략 시스템으로, 다중 기술 지표 필터링과 엄격한 자금 관리를 통해 안정적인 거래를 구현합니다. 전략은 단계적 중지 방식을 사용하여 수익을 잠금하고, 수익을 보장하는 동시에 최대 철회 제어를 설정하여 위험을 제어합니다. 시스템은 RSI 동력 지표와 ADX 트렌드 강도 지표를 주요 거래 신호 촉발 조건으로 사용하고, 거래량, ATR 및 EMA와 같은 다중 필터와 결합하여 거래의 유효성을 보장합니다.

전략 원칙

전략의 핵심 논리에는 다음과 같은 핵심 요소가 포함됩니다.

  1. 입시 조건 요구 사항은 동시에 충족됩니다: 거래량이 100만 개 이상, ADX가 25 개 이상으로 트렌드가 뚜렷하다는 것을 나타냅니다. RSI가 60 개 이상으로 강력한 동력을 나타냅니다. ATR이 2 개 이상으로 충분한 변동 공간을 보장합니다.
  2. 스텝 스톱 디자인: 첫 번째 스톱은 15%이며, 지분 50%; 두 번째 스톱은 30%이며, 남은 지점을 평정한다. 이 디자인은 수익의 일부를 일찍 잠금 할 수 있지만 큰 추세를 놓치지 않습니다.
  3. 스톱 손실 제어: 15%의 스톱 손실 보호 자금을 설정하고 RSI가 50보다 낮거나 가격이 200의 평균선 아래로 떨어질 때 청산합니다.
  4. 철수 관리: 전략 순액을 실시간으로 추적하고, 철수가 30%를 넘으면 체계적인 풍력 조절을 촉발하고, 모든 보유량을 공백시킨다.

전략적 이점

  1. 여러 기술 지표가 교차 검증되어 거래 신호의 신뢰성이 향상됩니다.
  2. 스텝 스톱은 단기 수익과 큰 트렌드를 파악하는 것을 고려한 디자인입니다.
  3. 개인 주식 손해 방지 및 체계적인 위험 통제를 포함한 철저한 위험 제어 시스템
  4. 거래 조건이 엄격하여 가짜 신호를 효과적으로 필터링합니다.
  5. 전략 논리가 명확하여 시장 상황에 따라 변수를 조정할 수 있습니다.

전략적 위험

  1. 다중 지표 필터링으로 인해 일부 거래 기회를 놓칠 수 있습니다.
  2. 변동성이 큰 시장에서는 손절매가 자주 발생할 수 있습니다.
  3. 고정 비율의 중지 및 중지 설정은 모든 시장 환경에 적합하지 않을 수 있습니다.
  4. 기술적인 지표에 의존하는 전략, 근본적인 급격한 사건에 대한 반응이 부족할 수 있습니다.
  5. 거래량 요구 사항을 충족하기 위해 더 큰 규모의 자금이 필요합니다.

전략 최적화 방향

  1. 시장의 변동에 따라 동적으로 조정되는 적응형 상쇄 제동을 도입합니다.
  2. 시장 환경 판단 모듈을 추가하여 다른 시장 조건에 따라 다른 파라미터 설정을 사용합니다.
  3. ADX 계산 방법을 최적화하고, 적응 주기 사용을 고려한다
  4. 거래비용을 고려하여 포지션 관리 시스템을 최적화합니다.
  5. 기계 학습 기반의 신호 필터링 메커니즘 개발

요약하다

이 전략은 다중 기술 지표와 엄격한 자금 관리를 통해 안정적인 거래를 실현하는 종합적인 거래 시스템이다. 전략의 핵심 장점은 완벽한 위험 제어 시스템과 단계적 차단 메커니즘에 있습니다. 그러나 실제 응용에서 시장 상황에 따라 적절한 수정을 위해 파라미터를 조정하는 것에 주의를 기울여야 합니다. 전략의 추가 최적화 공간은 주로 파라미터의 동적 적응과 신호 필터링 메커니즘의 개선에 있습니다.

전략 소스 코드
/*backtest
start: 2023-12-20 00:00:00
end: 2024-12-18 08:00:00
period: 2d
basePeriod: 2d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy(title="Swing Strategy (<30% DD)", shorttitle="SwingStratDD", overlay=true)

//-----------------------------------------------------
// Example Indicators and Logic
//-----------------------------------------------------
emaLen   = input.int(200, "EMA Length", minval=1)
emaValue = ta.ema(close, emaLen)

plot(emaValue, color=color.yellow, linewidth=2, title="EMA 200")


//-----------------------------------------------------
// User Inputs
//-----------------------------------------------------
adxLen           = input.int(14,  "ADX Length",      minval=1)
rsiLen           = input.int(14,  "RSI Length",      minval=1)
atrLen           = input.int(14,  "ATR Length",      minval=1)

rsiBuyThresh     = input.float(60, "RSI Buy Threshold",     minval=1, maxval=100)
adxThresh        = input.float(25, "ADX Threshold (Trend)", minval=1, maxval=100)
minVolume        = input.float(1e6,"Minimum Volume",         minval=1)
minATR           = input.float(2,  "Minimum ATR(14)",        minval=0.1, step=0.1)

stopLossPerc     = input.float(15, "Stop-Loss %",            minval=0.1, step=0.1)
// We’ll do two partial take-profit levels to aim for consistent cashflow:
takeProfit1Perc  = input.float(15, "Take-Profit1 %",         minval=0.1, step=0.1)
takeProfit2Perc  = input.float(30, "Take-Profit2 %",         minval=0.1, step=0.1)

ddLimit          = input.float(30, "Max Drawdown %",         minval=0.1, step=0.1)

//-----------------------------------------------------
// Indicators
//-----------------------------------------------------

rsiValue = ta.rsi(close, rsiLen)
atrValue = ta.atr(atrLen)

//--- Fully Manual ADX Calculation ---
upMove      = high - high[1]
downMove    = low[1] - low
plusDM      = (upMove > downMove and upMove > 0) ? upMove : 0.0
minusDM     = (downMove > upMove and downMove > 0) ? downMove : 0.0
smPlusDM    = ta.rma(plusDM, adxLen)
smMinusDM   = ta.rma(minusDM, adxLen)
smTR        = ta.rma(ta.tr, adxLen)
plusDI      = (smPlusDM / smTR) * 100
minusDI     = (smMinusDM / smTR) * 100
dx          = math.abs(plusDI - minusDI) / (plusDI + minusDI) * 100
adxValue    = ta.rma(dx, adxLen)

//-----------------------------------------------------
// Screener-Like Conditions (Technical Only)
//-----------------------------------------------------
volumeCondition   = volume > minVolume
adxCondition      = adxValue > adxThresh
rsiCondition      = rsiValue > rsiBuyThresh
atrCondition      = atrValue > minATR
aboveEmaCondition = close > emaValue

longCondition = volumeCondition and adxCondition and rsiCondition and atrCondition and aboveEmaCondition

//-----------------------------------------------------
// Strategy Entry / Exit Logic
//-----------------------------------------------------
var bool inTrade = false

// Entry
if longCondition and not inTrade
    strategy.entry("Long", strategy.long)

// Basic Exit Condition: RSI < 50 or Price < EMA
exitCondition = (rsiValue < 50) or (close < emaValue)
if inTrade and exitCondition
    strategy.close("Long")

// Update inTrade status
inTrade := strategy.position_size > 0

//-----------------------------------------------------
// Multi-Level Stop-Loss & Partial Profits
//-----------------------------------------------------
if inTrade
    float entryPrice = strategy.position_avg_price

    // Stop-Loss
    float stopPrice     = entryPrice * (1 - stopLossPerc / 100)

    // Two partial take-profit levels
    float tp1Price      = entryPrice * (1 + takeProfit1Perc / 100)
    float tp2Price      = entryPrice * (1 + takeProfit2Perc / 100)

    // Example approach: exit half at TP1, half at TP2
    strategy.exit("TP1/SL",     from_entry="Long", stop=stopPrice,    limit=tp1Price, qty_percent=50)
    strategy.exit("TP2",        from_entry="Long", limit=tp2Price,    qty_percent=50)

//-----------------------------------------------------
// Dynamic Drawdown Handling
//-----------------------------------------------------
var float peakEquity = strategy.equity
peakEquity := math.max(peakEquity, strategy.equity)

currentDrawdownPerc = (peakEquity - strategy.equity) / peakEquity * 100
if currentDrawdownPerc > ddLimit
    strategy.close_all("Max Drawdown Exceeded")

//-----------------------------------------------------
// Plotting
//-----------------------------------------------------
plot(emaValue, title="EMA 200", color=color.yellow, linewidth=2)
plotchar(rsiValue, title="RSI", char='●', location=location.bottom, color=color.new(color.teal, 50))
plot(adxValue, title="Manual ADX", color=color.orange)