
이 전략은 무작위적으로 상대적으로 약한 지표 ((SRSI) 와 이동 평균 동향/분산 지표 ((MACD) 를 결합한 동적 거래 시스템이다. ATR 지표를 통해 스톱로스와 스톱포트를 동적으로 조정하여 위험에 대한 지능적인 관리를 구현한다. 이 전략의 핵심은 다중 기술 지표의 교차 확인을 통해 거래 신호를 생성하는 것과 동시에 시장의 변동성을 결합하여 포지션 관리를 수행하는 것이다.
이 전략은 다음과 같은 핵심 메커니즘을 기반으로 작동합니다.
이 전략은 SRSI와 MACD의 장점을 결합하여 안정적인 거래 시스템을 구축한다. 동적 위험 관리 메커니즘은 이를 잘 적응하게 하지만 여전히 거래자가 실제 시장 상황에 따라 매개 변수를 최적화해야 한다. 전략의 성공적인 운영은 시장에 대한 깊은 이해가 필요하며, 개인의 위험 감수 능력과 함께 합리적인 위치 관리를 수행한다.
/*backtest
start: 2024-09-01 00:00:00
end: 2025-02-18 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Binance","currency":"BTC_USDT"}]
*/
//@version=6
strategy(title="SRSI + MACD Strategy with Dynamic Stop-Loss and Take-Profit", shorttitle="SRSI + MACD Strategy", overlay=false, default_qty_type=strategy.percent_of_equity, default_qty_value=10)
// User Inputs
smoothK = input.int(3, "K", minval=1)
smoothD = input.int(3, "D", minval=1)
lengthRSI = input.int(16, "RSI Length", minval=1)
lengthStoch = input.int(16, "Stochastic Length", minval=1)
src = input(close, title="RSI Source")
enableStopLoss = input.bool(true, "Enable Stop-Loss")
enableTakeProfit = input.bool(true, "Enable Take-Profit")
riskFactor = input.float(2.5, "Risk Factor", minval=0.1, step=1)
// Calculate K and D lines
rsi1 = ta.rsi(src, lengthRSI)
k = ta.sma(ta.stoch(rsi1, rsi1, rsi1, lengthStoch), smoothK)
d = ta.sma(k, smoothD)
differenceKD = k - d
// Calculate MACD and normalization
[macdLine, signalLine, _] = ta.macd(close, 12, 26, 9)
lowestK = ta.lowest(k, lengthRSI)
highestK = ta.highest(k, lengthRSI)
normalizedMacd = (macdLine - ta.lowest(macdLine, lengthRSI)) / (ta.highest(macdLine, lengthRSI) - ta.lowest(macdLine, lengthRSI)) * (highestK - lowestK) + lowestK
differenceKMacd = k - normalizedMacd
// Sum both differences for a unique display
differenceTotal = (differenceKD + differenceKMacd) / 2
// Check if MACD is falling or rising
isMacdFalling = ta.falling(macdLine, 1)
isMacdRising = ta.rising(macdLine, 1)
// Check if K is falling or rising
isKFalling = ta.falling(k, 1)
isKdRising = ta.rising(k, 1)
// Calculate ATR and dynamic levels
atrValue = ta.atr(14)
stopLossDistance = atrValue * riskFactor
takeProfitDistance = atrValue * riskFactor
// Variables for stop-loss and take-profit levels
var float longStopPrice = na
var float longTakeProfitPrice = na
// Buy and sell conditions with differenceKD added
buyCondition = ((differenceTotal > 0 or differenceKD > 0) and (isKdRising or isMacdRising) and k < 20 )
sellCondition = ((differenceTotal <= 0 or differenceKD <= 0) and (isKFalling or isMacdFalling) and k > 80)
// Execute strategy orders with conditional stop-loss and take-profit
if buyCondition and strategy.position_size == 0
strategy.entry("Buy", strategy.long)
if strategy.position_size > 0
longStopPrice := strategy.position_avg_price - stopLossDistance
longTakeProfitPrice := strategy.position_avg_price + takeProfitDistance
if enableStopLoss or enableTakeProfit
strategy.exit("Sell/Exit", "Buy", stop=(enableStopLoss ? longStopPrice : na), limit=(enableTakeProfit ? longTakeProfitPrice : na))
if sellCondition
strategy.close("Buy")
// Hide lines when position is closed
stopLossToPlot = strategy.position_size > 0 ? longStopPrice : na
takeProfitToPlot = strategy.position_size > 0 ? longTakeProfitPrice : na
// Plot stop-loss and take-profit lines only when long positions are active
plot(enableStopLoss ? stopLossToPlot : na, title="Stop-Loss", color=color.yellow, linewidth=1, style=plot.style_linebr, offset=0, force_overlay=true)
plot(enableTakeProfit ? takeProfitToPlot : na, title="Take-Profit", color=color.yellow, linewidth=1, style=plot.style_linebr, offset=0, force_overlay=true)
// Plot the MACD and candles
plot(normalizedMacd, "Normalized MACD", color=color.new(color.purple, 0), linewidth=1, display=display.all)
h0 = hline(80, "Upper Band", color=#787B86)
hline(50, "Middle Band", color=color.new(#787B86, 50))
h1 = hline(20, "Lower Band", color=#787B86)
fill(h0, h1, color=color.rgb(33, 150, 243, 90), title="Background")
// New candle based on the sum of differences
plotcandle(open=0, high=differenceTotal, low=0, close=differenceTotal, color=(differenceTotal > 0 ? color.new(color.green, 60) : color.new(color.red, 60)), title="K-D + MACD Candles")