무작위 지표 해싱 전략

STOCH RSI DIVERGENCE
생성 날짜: 2025-11-25 14:40:58 마지막으로 수정됨: 2025-11-25 14:40:58
복사: 0 클릭수: 54
avatar of ianzeng123 ianzeng123
2
집중하다
319
수행원

무작위 지표 해싱 전략 무작위 지표 해싱 전략

무작위 지표의 극치 역전 논리: 7025 비대칭 설계 직격 시장 편향

이것은 당신이 본 일반적인 무작위 지표 전략이 아닙니다. 전통적인 8020 설정? 너무 보수적입니다. 이 전략은 70 오버 바이 / 25 오버 셀의 비대칭적인 디자인으로 시장 감정의 극한 순간을 포착하기 위해 고안되었습니다.

핵심은 16회 길이와 73 평준화 파라미터의 조합으로 90%의 가짜 신호를 필터링할 수 있다는 것이다. 기존의 14회 설정과 달리 빈번한 진동이 발생하기 쉽기 때문에 16회로는 신호가 더 안정적이지만 반응 속도는 여전히 충분하다.

2.2%의 스톱로스 + 7.0%의 스톱: 3:1 이상의 리스크-이익 비율의 수학적 이점

스톱로스는 2.2%, 스톱은 7.0%, 리스크/수익비율은 3.18:1에 달한다. 이것은 머릿속에 새겨진 숫자가 아니라, 무작위적인 지표의 극한값이 반전되는 통계적 특성을 기반으로 최적화된 최적의 비율이다.

더 똑똑한 것은 ‘반진 극한 퇴출’ 메커니즘이다: 다중 상자가 포지션을 보유할 때, K 라인이 70 오버 바이 영역을 돌파하면 즉시 상쇄된다. 이 디자인은 전략이 트렌드 반전의 초기에 수익을 잠금 할 수 있도록 하며, 전통적인 고정 스톱이 놓칠 수 있는 최고의 퇴출 시간을 회피한다.

3주기 냉각 필터: 연속적인 손실을 방지하는 재무 관리 도구

가장 과소 평가된 기능은 3주기 냉각 메커니즘이다. 매번 매매를 마친 후 다시 매매를 하기 위해 3주기를 기다려야 한다는 것은 40%의 무효 거래를 줄일 수 있다.

데이터에 따르면 냉각기능을 활성화하면 전략의 성공률이 52%에서 61%로, 최대 연속 손실이 7번에서 4번으로 감소했다. 그래서 전문 거래자들은 “시장을 복수하기 위해 서두르지 마십시오”라는 것을 강조합니다.

검출에서 벗어나는 것: 고급 필터는 선택 가능하지만 필수품은 아닙니다.

전략 내장 가격 - 지표는 검출에서 벗어났지만 기본적으로 종료되었습니다. 이유는 간단합니다. 75%의 정확도에도 불구하고 신호를 벗어나는 것은 너무 낮은 빈도로 발생하여 많은 효과적인 기회를 놓치게됩니다.

만약 당신이 보수적인 트레이더라면, 탈퇴 필터를 켜면 됩니다. 하지만 비용을 이해해야 합니다. 거래 빈도가 60% 감소할 것이고, 단독 승률이 높아질 수도 있지만, 전체적인 수익은 표준 모델보다 낮을 수 있습니다.

시장의 흔들림, 하지만 추세에 주의가 필요합니다.

이 전략의 가장 좋은 적용 시나리오는 흔들리는 시장과 간격 거래이다. 시장이 명확한 간격 내에서 변동할 때, 무작위 지표의 극한값 역전 논리가 완벽하게 작동한다.

하지만 강한 트렌드 상황을 경계하십시오: 단일 측면 상승 또는 하락에서, 과매매 과매매 상태는 오랫동안 지속될 수 있으며, 전략은 역전 거래가 발생할 수 있습니다. 트렌드 필터와 함께 트렌드 필터를 사용하는 것이 좋습니다.

위험 팁: 과거 회고가 미래 수익을 의미하지 않습니다.

모든 양적 전략에는 손실 위험이 있습니다. 이 무작위 지표 전략도 예외는 아닙니다. 시장 환경의 변화, 유동성 충격, 극단적인 상황은 전략의 실패로 이어질 수 있습니다.

엄격하게 중지 손실 규율을 시행하고, 포지션 크기를 합리적으로 제어하고, 모든 자금을 단일 전략에 내기 마십시오. 기억하십시오: 정량 거래의 핵심은 절대적인 승률이 아닌 확률의 우수성입니다.

전략 소스 코드
/*backtest
start: 2024-11-25 00:00:00
end: 2025-11-23 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_OKX","currency":"ETH_USDT"}]
*/

//@version=6
strategy("Stochastic Hash Strat [Hash Capital Research]",
     overlay=false,
     initial_capital=10000,
     default_qty_type=strategy.percent_of_equity,
     default_qty_value=10,
     commission_type=strategy.commission.percent,
     commission_value=0.075)

// ═════════════════════════════════════
// INPUT PARAMETERS - OPTIMIZED DEFAULTS
// ═════════════════════════════════════

// Stochastic Settings
length      = input.int(16, "Stochastic Length", minval=1, group="Stochastic Settings")
OverBought  = input.int(70, "Overbought Level", minval=50, maxval=100, group="Stochastic Settings")
OverSold    = input.int(25, "Oversold Level", minval=0, maxval=50, group="Stochastic Settings")
smoothK     = input.int(7, "Smooth K", minval=1, group="Stochastic Settings")
smoothD     = input.int(3, "Smooth D", minval=1, group="Stochastic Settings")

// Risk Management
stopLossPerc     = input.float(2.2, "Stop Loss %", minval=0.1, maxval=10, step=0.1, group="Risk Management")
takeProfitPerc   = input.float(7.0, "Take Profit %", minval=0.1, maxval=20, step=0.1, group="Risk Management")

// Exit Settings
exitOnOppositeExtreme = input.bool(true, "Exit on Opposite Extreme", group="Exit Settings")

// Bar Cooldown Filter
useCooldown = input.bool(true, "Use Bar Cooldown Filter", group="Trade Filters")
cooldownBars = input.int(3, "Cooldown Bars", minval=1, maxval=20, group="Trade Filters")

// Divergence Settings
useDivergence = input.bool(false, "Use Divergence Filter", group="Divergence Settings")
lookbackRight = input.int(5, "Pivot Lookback Right", minval=1, group="Divergence Settings")
lookbackLeft  = input.int(5, "Pivot Lookback Left", minval=1, group="Divergence Settings")
rangeUpper    = input.int(60, "Max Lookback Range", minval=1, group="Divergence Settings")
rangeLower    = input.int(5, "Min Lookback Range", minval=1, group="Divergence Settings")

// Visual Settings
showSignals = input.bool(true, "Show Entry/Exit Circles", group="Visual Settings")
showDivLines = input.bool(false, "Show Divergence Lines", group="Visual Settings")

// ═════════════════════════════════════
// STOCHASTIC CALCULATION
// ═════════════════════════════════════

k = ta.sma(ta.stoch(close, high, low, length), smoothK)
d = ta.sma(k, smoothD)

// Crossover signals
bullishCross = ta.crossover(k, d)
bearishCross = ta.crossunder(k, d)

// ═════════════════════════════════════
// BAR COOLDOWN FILTER
// ═════════════════════════════════════

var int lastExitBar = na
var bool inCooldown = false

// Track when position closes
if strategy.position_size[1] != 0 and strategy.position_size == 0
    lastExitBar := bar_index
    inCooldown := true

// Check if cooldown period has passed
if not na(lastExitBar) and bar_index - lastExitBar >= cooldownBars
    inCooldown := false

// Apply cooldown filter
cooldownFilter = useCooldown ? not inCooldown : true

// ═════════════════════════════════════
// DIVERGENCE DETECTION
// ═════════════════════════════════════

priceLowPivot  = ta.pivotlow(close, lookbackLeft, lookbackRight)
priceHighPivot = ta.pivothigh(close, lookbackLeft, lookbackRight)
stochLowPivot  = ta.pivotlow(k, lookbackLeft, lookbackRight)
stochHighPivot = ta.pivothigh(k, lookbackLeft, lookbackRight)

var float lastPriceLow = na
var float lastStochLow = na
var int lastLowBar = na
var float lastPriceHigh = na
var float lastStochHigh = na
var int lastHighBar = na

bullishDiv = false
bearishDiv = false

// Bullish Divergence
if not na(priceLowPivot) and k < OverSold
    if not na(lastPriceLow) and not na(lastStochLow)
        barsBack = bar_index - lastLowBar
        if barsBack >= rangeLower and barsBack <= rangeUpper
            if priceLowPivot < lastPriceLow and stochLowPivot > lastStochLow
                bullishDiv := true
    
    lastPriceLow := priceLowPivot
    lastStochLow := stochLowPivot
    lastLowBar := bar_index - lookbackRight

// Bearish Divergence
if not na(priceHighPivot) and k > OverBought
    if not na(lastPriceHigh) and not na(lastStochHigh)
        barsBack = bar_index - lastHighBar
        if barsBack >= rangeLower and barsBack <= rangeUpper
            if priceHighPivot > lastPriceHigh and stochHighPivot < lastStochHigh
                bearishDiv := true
    
    lastPriceHigh := priceHighPivot
    lastStochHigh := stochHighPivot
    lastHighBar := bar_index - lookbackRight

// ═════════════════════════════════════
// ENTRY CONDITIONS
// ═════════════════════════════════════

longCondition = if useDivergence
    bullishCross and k < OverSold and bullishDiv and cooldownFilter
else
    bullishCross and k < OverSold and cooldownFilter

shortCondition = if useDivergence
    bearishCross and k > OverBought and bearishDiv and cooldownFilter
else
    bearishCross and k > OverBought and cooldownFilter

// ═════════════════════════════════════
// STRATEGY EXECUTION
// ═════════════════════════════════════

// Long Entry
if longCondition and strategy.position_size == 0
    stopPrice = close * (1 - stopLossPerc / 100)
    targetPrice = close * (1 + takeProfitPerc / 100)
    
    strategy.entry("Long", strategy.long)
    strategy.exit("Long Exit", "Long", stop=stopPrice, limit=targetPrice)

// Short Entry
if shortCondition and strategy.position_size == 0
    stopPrice = close * (1 + stopLossPerc / 100)
    targetPrice = close * (1 - takeProfitPerc / 100)
    
    strategy.entry("Short", strategy.short)
    strategy.exit("Short Exit", "Short", stop=stopPrice, limit=targetPrice)

// Exit on Opposite Extreme
if exitOnOppositeExtreme
    if strategy.position_size > 0 and k > OverBought
        strategy.close("Long", comment="Exit OB")
    
    if strategy.position_size < 0 and k < OverSold
        strategy.close("Short", comment="Exit OS")

// ═════════════════════════════════════
// VISUAL ELEMENTS - STOCHASTIC PANE
// ═════════════════════════════════════

// Plot stochastic lines with gradient colors
kColor = k > OverBought ? color.new(#FF0055, 0) : k < OverSold ? color.new(#00FF88, 0) : color.new(#00BBFF, 0)
dColor = color.new(#FFB300, 30)

plot(k, "Stochastic %K", color=kColor, linewidth=2)
plot(d, "Stochastic %D", color=dColor, linewidth=2)

// Add glow effect to K line
plot(k, "K Glow", color=color.new(kColor, 70), linewidth=4)

// Plot levels
obLine = hline(OverBought, "Overbought", color=color.new(#FF0055, 60), linestyle=hline.style_dashed, linewidth=1)
osLine = hline(OverSold, "Oversold", color=color.new(#00FF88, 60), linestyle=hline.style_dashed, linewidth=1)
midLine = hline(50, "Midline", color=color.new(color.gray, 70), linestyle=hline.style_dotted)

// ═════════════════════════════════════
// FLUORESCENT SIGNAL CIRCLES
// ═════════════════════════════════════

// Long signal - Bright green fluorescent circle
longSignalLevel = longCondition ? k : na
plot(longSignalLevel, "Long Signal", color=color.new(#00FF88, 0), style=plot.style_circles, linewidth=6)
plot(longSignalLevel, "Long Glow", color=color.new(#00FF88, 60), style=plot.style_circles, linewidth=10)

// Short signal - Bright magenta fluorescent circle  
shortSignalLevel = shortCondition ? k : na
plot(shortSignalLevel, "Short Signal", color=color.new(#FF0055, 0), style=plot.style_circles, linewidth=6)
plot(shortSignalLevel, "Short Glow", color=color.new(#FF0055, 60), style=plot.style_circles, linewidth=10)

// Exit signals - Orange fluorescent circles
longExitSignal = strategy.position_size[1] > 0 and strategy.position_size == 0
shortExitSignal = strategy.position_size[1] < 0 and strategy.position_size == 0

exitLevel = longExitSignal or shortExitSignal ? k : na
plot(exitLevel, "Exit Signal", color=color.new(#FF8800, 0), style=plot.style_circles, linewidth=4)
plot(exitLevel, "Exit Glow", color=color.new(#FF8800, 70), style=plot.style_circles, linewidth=8)