
이 전략은 부린 밴드 (Bollinger Bands), 상대적으로 강한 지표 (RSI) 및 동적 비용 평균 (DCA) 을 결합한 정량 거래 시스템이다. 전략은 자금 관리 규칙을 설정하여 시장 변동에 따라 자동으로 대량 포지션 작업을 수행하며 기술 지표와 결합하여 구매 신호 판단을 수행하여 위험을 제어 할 수 있는 거래를 수행한다. 시스템은 또한 정지 논리 및 누적 수익 추적 기능을 포함하여 거래 성과를 효과적으로 모니터링하고 관리 할 수 있습니다.
이 전략은 주로 다음과 같은 핵심 구성 요소를 기반으로 합니다.
이 전략은 기술 분석과 자금 관리 방법을 종합적으로 적용하여 비교적 완전한 거래 시스템을 구축한다. 전략의 장점은 다중 신호 확인과 완벽한 위험 관리에 있다. 그러나 여전히 실전에서 충분한 테스트와 최적화가 필요하다.
/*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)