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

다단계 변동성 조정 동적 슈퍼 트렌드 전략

저자:차오장, 날짜: 2024-11-29 16:57:19
태그:ATRSMA성병TP

img

전반적인 설명

다단계 변동성 조정 동적 슈퍼트렌드 전략 (Multi-Step Volatility-Adjusted Dynamic SuperTrend Strategy) 은 베가스 채널과 슈퍼트렌드 지표를 결합한 혁신적인 거래 시스템이다. 전략의 독특함은 시장 변동성에 동적으로 적응할 수 있는 능력과 리스크-어워드 비율을 최적화하기 위한 다단계 영리 메커니즘에 있다. 베가스 채널의 변동성 분석을 슈퍼트렌드의 트렌드 추적 기능과 결합함으로써 전략은 시장 조건의 변화에 따라 자동으로 매개 변수를 조정하여 보다 정확한 거래 신호를 제공한다.

전략 원칙

이 전략은 세 가지 핵심 구성 요소로 작동합니다: 베가스 채널 계산, 트렌드 탐지 및 다단계 수익 메커니즘. 베가스 채널은 가격 변동 범위를 정의하기 위해 간단한 이동 평균 (SMA) 및 표준 편차 (STD) 를 사용하며 슈퍼 트렌드 지표는 조정된 ATR 값을 기반으로 트렌드 방향을 결정합니다. 시장 트렌드가 변경되면 거래 신호가 생성됩니다. 다단계 수익 메커니즘은 다른 가격 수준에서 부분 출구를 허용하며 수익을 잠금하고 남은 포지션이 잠재적 인 이윤을 얻을 수 있습니다. 전략의 독특함은 베가스 채널 너비에 따라 슈퍼 트렌드 멀티플리퍼를 동적으로 조정하는 변동성 조정 요인에 있습니다.

전략적 장점

  1. 동적 적응력: 전략은 변동성 조정 인자를 통해 다른 시장 조건에 자동으로 적응합니다.
  2. 리스크 관리: 여러 단계의 이익 취득 메커니즘은 수익 실현에 대한 체계적인 접근 방식을 제공합니다.
  3. 사용자 정의 가능: 다양한 거래 스타일을 수용하기 위해 여러 매개 변수 설정을 제공합니다.
  4. 포괄적인 시장 커버리지: 긴 거래와 짧은 거래를 지원합니다.
  5. 시각적 피드백: 분석 및 의사 결정에 대한 명확한 그래픽 인터페이스를 제공합니다.

전략 위험

  1. 매개 변수 민감도: 다른 매개 변수 조합은 상당한 성능 변동으로 이어질 수 있습니다.
  2. 지연: 이동 평균에 기반한 지표는 고유한 지연을 가지고 있습니다.
  3. 가짜 브레이크업 위험: 다양한 시장에서 잘못된 신호를 생성할 수 있습니다.
  4. 영업이익 교류: 초기 영업이익은 주요 트렌드를 놓칠 수 있으며 늦은 영업이익은 축적된 이익을 잃을 위험이 있습니다.

전략 최적화 방향

  1. 다른 시장 조건에서 전략 매개 변수를 조정하기 위해 시장 환경 필터를 도입하십시오.
  2. 신호 신뢰성을 높이기 위해 볼륨 분석을 추가합니다.
  3. 시장 변동성에 따라 수익 수준을 동적으로 조정하는 적응 가능한 수익 메커니즘을 개발합니다.
  4. 신호 확인을 위한 추가 기술 지표들을 통합한다.
  5. 시장 리스크에 기반한 동적 포지션 크기를 구현합니다.

요약

다단계 변동성 조정 동적 슈퍼 트렌드 전략은 여러 기술적 지표와 혁신적인 수익 취득 메커니즘을 결합하여 종합적인 거래 시스템을 제공하여 고급 양적 거래 접근 방식을 나타냅니다. 동적 적응력과 위험 관리 기능은 좋은 확장성과 최적화 잠재력으로 다양한 시장 환경에서 운영에 특히 적합합니다. 지속적인 개선과 최적화를 통해 전략은 미래에 더 안정적인 거래 성능을 제공하는 것을 약속합니다.


/*backtest
start: 2024-10-01 00:00:00
end: 2024-10-31 23:59:59
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Multi-Step Vegas SuperTrend - strategy [presentTrading]", shorttitle="Multi-Step Vegas SuperTrend - strategy [presentTrading]", overlay=true, precision=3, commission_value=0.1, commission_type=strategy.commission.percent, slippage=1, currency=currency.USD)

// Input settings allow the user to customize the strategy's parameters.
tradeDirectionChoice = input.string(title="Trade Direction", defval="Both", options=["Long", "Short", "Both"]) // Option to select the trading direction
atrPeriod = input(10, "ATR Period for SuperTrend") // Length of the ATR for volatility measurement
vegasWindow = input(100, "Vegas Window Length") // Length of the moving average for the Vegas Channel
superTrendMultiplier = input(5, "SuperTrend Multiplier Base") // Base multiplier for the SuperTrend calculation
volatilityAdjustment = input.float(5, "Volatility Adjustment Factor") // Factor to adjust the SuperTrend sensitivity to the Vegas Channel width

// User inputs for take profit settings
useTakeProfit = input.bool(true, title="Use Take Profit", group="Take Profit Settings")
takeProfitPercent1 = input.float(3.0, title="Take Profit % Step 1", group="Take Profit Settings")
takeProfitPercent2 = input.float(6.0, title="Take Profit % Step 2", group="Take Profit Settings")
takeProfitPercent3 = input.float(12.0, title="Take Profit % Step 3", group="Take Profit Settings")
takeProfitPercent4 = input.float(21.0, title="Take Profit % Step 4", group="Take Profit Settings")

takeProfitAmount1 = input.float(25, title="Take Profit Amount % Step 1", group="Take Profit Settings")
takeProfitAmount2 = input.float(20, title="Take Profit Amount % Step 2", group="Take Profit Settings")
takeProfitAmount3 = input.float(10, title="Take Profit Amount % Step 3", group="Take Profit Settings")
takeProfitAmount4 = input.float(15, title="Take Profit Amount % Step 4", group="Take Profit Settings")

numberOfSteps = input.int(4, title="Number of Take Profit Steps", minval=1, maxval=4, group="Take Profit Settings")

// Calculate the Vegas Channel using a simple moving average and standard deviation.
vegasMovingAverage = ta.sma(close, vegasWindow)
vegasChannelStdDev = ta.stdev(close, vegasWindow)
vegasChannelUpper = vegasMovingAverage + vegasChannelStdDev
vegasChannelLower = vegasMovingAverage - vegasChannelStdDev

// Adjust the SuperTrend multiplier based on the width of the Vegas Channel.
channelVolatilityWidth = vegasChannelUpper - vegasChannelLower
adjustedMultiplier = superTrendMultiplier + volatilityAdjustment * (channelVolatilityWidth / vegasMovingAverage)

// Calculate the SuperTrend indicator values.
averageTrueRange = ta.atr(atrPeriod)
superTrendUpper = hlc3 - (adjustedMultiplier * averageTrueRange)
superTrendLower = hlc3 + (adjustedMultiplier * averageTrueRange)
var float superTrendPrevUpper = na
var float superTrendPrevLower = na
var int marketTrend = 1

// Update SuperTrend values and determine the current trend direction.
superTrendPrevUpper := nz(superTrendPrevUpper[1], superTrendUpper)
superTrendPrevLower := nz(superTrendPrevLower[1], superTrendLower)
marketTrend := close > superTrendPrevLower ? 1 : close < superTrendPrevUpper ? -1 : nz(marketTrend[1], 1)
superTrendUpper := marketTrend == 1 ? math.max(superTrendUpper, superTrendPrevUpper) : superTrendUpper
superTrendLower := marketTrend == -1 ? math.min(superTrendLower, superTrendPrevLower) : superTrendLower
superTrendPrevUpper := superTrendUpper
superTrendPrevLower := superTrendLower

// Enhanced Visualization
// Plot the SuperTrend and Vegas Channel for visual analysis.
plot(marketTrend == 1 ? superTrendUpper : na, "SuperTrend Upper", color=color.green, linewidth=2)
plot(marketTrend == -1 ? superTrendLower : na, "SuperTrend Lower", color=color.red, linewidth=2)
plot(vegasChannelUpper, "Vegas Upper", color=color.purple, linewidth=1)
plot(vegasChannelLower, "Vegas Lower", color=color.purple, linewidth=1)

// Apply a color to the price bars based on the current market trend.
barcolor(marketTrend == 1 ? color.green : marketTrend == -1 ? color.red : na)

// Detect trend direction changes and plot entry/exit signals.
trendShiftToBullish = marketTrend == 1 and marketTrend[1] == -1
trendShiftToBearish = marketTrend == -1 and marketTrend[1] == 1

plotshape(series=trendShiftToBullish, title="Enter Long", location=location.belowbar, color=color.green, style=shape.labelup, text="Buy")
plotshape(series=trendShiftToBearish, title="Enter Short", location=location.abovebar, color=color.red, style=shape.labeldown, text="Sell")

// Define conditions for entering long or short positions, and execute trades based on these conditions.
enterLongCondition = marketTrend == 1
enterShortCondition = marketTrend == -1

// Check trade direction choice before executing trade entries.
if enterLongCondition and (tradeDirectionChoice == "Long" or tradeDirectionChoice == "Both")
    strategy.entry("Long Position", strategy.long)

if enterShortCondition and (tradeDirectionChoice == "Short" or tradeDirectionChoice == "Both")
    strategy.entry("Short Position", strategy.short)

// Close all positions when the market trend changes.
if marketTrend != marketTrend[1]
    strategy.close_all()

// Multi-Stage Take Profit Logic
if (strategy.position_size > 0)
    entryPrice = strategy.opentrades.entry_price(strategy.opentrades - 1)
    if numberOfSteps >= 1
        strategy.exit("Take Profit 1", from_entry="Long Position", qty_percent=takeProfitAmount1, limit=entryPrice * (1 + takeProfitPercent1 / 100))
    if numberOfSteps >= 2
        strategy.exit("Take Profit 2", from_entry="Long Position", qty_percent=takeProfitAmount2, limit=entryPrice * (1 + takeProfitPercent2 / 100))
    if numberOfSteps >= 3
        strategy.exit("Take Profit 3", from_entry="Long Position", qty_percent=takeProfitAmount3, limit=entryPrice * (1 + takeProfitPercent3 / 100))
    if numberOfSteps >= 4
        strategy.exit("Take Profit 4", from_entry="Long Position", qty_percent=takeProfitAmount4, limit=entryPrice * (1 + takeProfitPercent4 / 100))

if (strategy.position_size < 0)
    entryPrice = strategy.opentrades.entry_price(strategy.opentrades - 1)
    if numberOfSteps >= 1
        strategy.exit("Take Profit 1", from_entry="Short Position", qty_percent=takeProfitAmount1, limit=entryPrice * (1 - takeProfitPercent1 / 100))
    if numberOfSteps >= 2
        strategy.exit("Take Profit 2", from_entry="Short Position", qty_percent=takeProfitAmount2, limit=entryPrice * (1 - takeProfitPercent2 / 100))
    if numberOfSteps >= 3
        strategy.exit("Take Profit 3", from_entry="Short Position", qty_percent=takeProfitAmount3, limit=entryPrice * (1 - takeProfitPercent3 / 100))
    if numberOfSteps >= 4
        strategy.exit("Take Profit 4", from_entry="Short Position", qty_percent=takeProfitAmount4, limit=entryPrice * (1 - takeProfitPercent4 / 100))


관련

더 많은