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

볼링거 밴드 및 RSI를 기반으로 한 동적 비용 평균화 전략 시스템

저자:차오장, 날짜: 2024-11-27 16:37:12
태그:BBRSIDCASMATP

img

전반적인 설명

이 전략은 볼링거 밴드, 상대적 강도 지수 (RSI) 및 동적 비용 평균 (DCA) 를 결합한 양적 거래 시스템이다. 이 전략은 시장 변동 중에 기존의 돈 관리 규칙을 통해 자동 포지션 구축을 구현하며 제어된 위험 실행을 달성하기 위해 구매/판매 신호 결정에 대한 기술적 지표를 통합합니다. 이 시스템은 또한 영업 성과를 효과적으로 모니터링하고 관리하기 위해 영업 논리와 누적 수익 추적 기능을 포함합니다.

전략 원칙

이 전략은 다음과 같은 핵심 요소에 기반합니다.

  1. 가격 변동성 범위를 결정하는 볼링거 밴드, 하위 밴드에서 구매하고 상위 밴드에서 판매하는 것을 고려
  2. 과잉 구매/ 과잉 판매 조건을 확인하는 RSI, 25 이하의 과잉 판매 및 75 이상 과잉 구매를 확인하는 RSI
  3. DCA 모듈은 적응형 자본 관리를 위해 계좌 자금에 기초한 포지션 크기를 동적으로 계산합니다.
  4. 이윤 취득 모듈은 자동 포지션 폐쇄에 5%의 이윤 목표를 설정합니다.
  5. 시장 상태 모니터링은 전체 추세를 평가하기 위해 90일 시장 변화를 계산합니다.
  6. 누적 수익 추적은 전략 성과 평가에 대한 각 거래의 이익/손실을 기록합니다.

전략적 장점

  1. 여러 기술 지표의 교차 검증은 신호 신뢰성을 향상시킵니다.
  2. 역동적 위치 관리로 고정 위치 위험을 피합니다.
  3. 합리적인 영업 조건은 적시에 수익을 보장합니다
  4. 시장 동향 모니터링 능력은 큰 그림을 이해하는 데 도움이 됩니다
  5. 포괄적 인 수익 추적 시스템은 전략 분석을 촉진합니다.
  6. 잘 구성된 경고 시스템은 실시간 거래 기회를 제공합니다.

전략 위험

  1. 불안한 시장은 거래 비용을 증가시키는 빈번한 신호를 유발할 수 있습니다.
  2. RSI 지표는 트렌딩 시장에서 뒤쳐질 수 있습니다.
  3. 고액 수익률은 강한 추세에서 너무 일찍 종료 될 수 있습니다.
  4. DCA 전략은 장기적인 하락 추세에서 상당한 마감을 일으킬 수 있습니다. 위험 관리 권고:
  • 최대 위치 제한을 설정
  • 시장 변동성에 따라 매개 변수를 동적으로 조정합니다.
  • 트렌드 필터를 추가
  • 계층화된 영업 전략 실행

전략 최적화 방향

  1. 매개 변수 동적 최적화
  • 볼링거 밴드 매개 변수는 변동성에 적응합니다
  • RSI 문턱은 시장 주기에 따라 달라집니다.
  • DCA 할당은 계좌 크기에 따라 조정됩니다.
  1. 신호 시스템 강화:
  • 볼륨 확인을 추가합니다
  • 트렌드 라인 분석을 포함
  • 추가 기술 지표의 교차 검증 통합
  1. 위험 관리 개선:
  • 동적 스톱 로스 구현
  • 최대 유출 제어 추가
  • 일일 손실 제한을 설정

요약

이 전략은 기술 분석과 돈 관리 방법을 결합하여 포괄적인 거래 시스템을 구축합니다. 이 전략의 강점은 여러 신호 확인과 철저한 위험 관리에 있습니다. 그러나 여전히 라이브 거래에서 광범위한 테스트와 최적화를 필요로합니다. 매개 변수 설정 및 추가 보조 지표의 지속적인 개선으로 전략은 실제 거래에서 안정적인 성능을 약속합니다.


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

//@version=5
strategy("Combined BB RSI with Cumulative Profit, Market Change, and Futures Strategy (DCA)", shorttitle="BB RSI Combined DCA Strategy", overlay=true)

// Input Parameters
length = input.int(20, title="BB Length")  // Adjusted BB length
mult = input.float(2.5, title="BB Multiplier")  // Adjusted BB multiplier
rsiLength = input.int(14, title="RSI Length")  // Adjusted RSI length
rsiBuyLevel = input.int(25, title="RSI Buy Level")  // Adjusted RSI Buy Level
rsiSellLevel = input.int(75, title="RSI Sell Level")  // Adjusted RSI Sell Level
dcaPositionSizePercent = input.float(1, title="DCA Position Size (%)", tooltip="Percentage of equity to use in each DCA step")
takeProfitPercentage = input.float(5, title="Take Profit (%)", tooltip="Take profit percentage for DCA strategy")

// Calculate DCA position size
equity = strategy.equity  // Account equity
dcaPositionSize = (equity * dcaPositionSizePercent) / 100  // DCA position size as percentage of equity

// Bollinger Bands Calculation
basis = ta.sma(close, length)
dev = mult * ta.stdev(close, length)
upper = basis + dev
lower = basis - dev

// RSI Calculation
rsi = ta.rsi(close, rsiLength)

// Plotting Bollinger Bands and RSI levels
plot(upper, color=color.red, title="Bollinger Upper")
plot(lower, color=color.green, title="Bollinger Lower")
hline(rsiBuyLevel, "RSI Buy Level", color=color.green)
hline(rsiSellLevel, "RSI Sell Level", color=color.red)

// Buy and Sell Signals
buySignal = (rsi < rsiBuyLevel and close <= lower)
sellSignal = (rsi > rsiSellLevel and close >= upper)

// DCA Strategy: Enter Long or Short based on signals with calculated position size
if (buySignal)
    strategy.entry("DCA Buy", strategy.long)

if (sellSignal)
    strategy.entry("DCA Sell", strategy.short)

// Take Profit Logic
if (strategy.position_size > 0)  // If long
    strategy.exit("Take Profit Long", from_entry="DCA Buy", limit=close * (1 + takeProfitPercentage / 100))

if (strategy.position_size < 0)  // If short
    strategy.exit("Take Profit Short", from_entry="DCA Sell", limit=close * (1 - takeProfitPercentage / 100))

// Plot Buy/Sell Signals on the chart
plotshape(buySignal, title="Buy Signal", location=location.belowbar, color=color.green, style=shape.labelup, text="BUY", textcolor=color.white)
plotshape(sellSignal, title="Sell Signal", location=location.abovebar, color=color.red, style=shape.labeldown, text="SELL", textcolor=color.white)

// Alerts for Buy/Sell Signals
alertcondition(buySignal, title="Buy Alert", message="Buy Signal Detected")
alertcondition(sellSignal, title="Sell Alert", message="Sell Signal Detected")

// Cumulative Profit Calculation
var float buyPrice = na
var float profit = na
var float cumulativeProfit = 0.0  // Cumulative profit tracker

if (buySignal)
    buyPrice := close
if (sellSignal and not na(buyPrice))
    profit := (close - buyPrice) / buyPrice * 100
    cumulativeProfit := cumulativeProfit + profit  // Update cumulative profit
    label.new(bar_index, high, text="P: " + str.tostring(profit, "#.##") + "%", color=color.blue, style=label.style_label_down)
    buyPrice := na  // Reset buyPrice after sell

// Plot cumulative profit on the chart
var label cumulativeLabel = na
if (not na(cumulativeProfit))
    if not na(cumulativeLabel)
        label.delete(cumulativeLabel)
    cumulativeLabel := label.new(bar_index, high + 10, text="Cumulative Profit: " + str.tostring(cumulativeProfit, "#.##") + "%", color=color.purple, style=label.style_label_up)

// Market Change over 3 months Calculation
threeMonthsBars = 3 * 30 * 24  // Approximation of 3 months in bars (assuming 1 hour per bar)
priceThreeMonthsAgo = request.security(syminfo.tickerid, "D", close[threeMonthsBars])
marketChange = (close - priceThreeMonthsAgo) / priceThreeMonthsAgo * 100

// Plot market change over 3 months
var label marketChangeLabel = na
if (not na(marketChange))
    if not na(marketChangeLabel)
        label.delete(marketChangeLabel)
    marketChangeLabel := label.new(bar_index, high + 20, text="Market Change (3 months): " + str.tostring(marketChange, "#.##") + "%", color=color.orange, style=label.style_label_up)

// Both labels (cumulative profit and market change) are displayed simultaneously
var label infoLabel = na
if (not na(cumulativeProfit) and not na(marketChange))
    if not na(infoLabel)
        label.delete(infoLabel)
    infoLabel := label.new(bar_index, high + 30, text="Cumulative Profit: " + str.tostring(cumulativeProfit, "#.##") + "% | Market Change (3 months): " + str.tostring(marketChange, "#.##") + "%", color=color.purple, style=label.style_label_upper_right)


관련

더 많은