스윙 포인트 헤징 전략


생성 날짜: 2026-02-28 11:18:00 마지막으로 수정됨: 2026-02-28 11:18:00
복사: 2 클릭수: 111
avatar of ianzeng123 ianzeng123
2
집중하다
413
수행원

스윙 포인트 헤징 전략 스윙 포인트 헤징 전략

PIVOT, HEDGE, STRUCTURE, SL, TP

이것은 일반적인 트렌드 추적이 아니라, 보호된 변동점 침투 시스템입니다.

전통적인 전략은 단방향으로 내기만 하고, 이 전략은 트렌드가 반전될 가능성이 있을 때 어떻게 해야 하는지를 직접적으로 알려줍니다. 해답은 피지이다. 상승 추세에서의 지지점 (Higher Low) 이 넘어지면, 시스템은 자동으로 공백 피지 포지션을 열고. 하향 추세에서의 저항점 (Lower High) 이 넘어지면, 다중 피지 포지션을 열고. 이것은 추측이 아니라, 시장 구조의 변화에 따른 합리적인 대응이다.

5주기 흔들점 검출: 노이즈가 아닌 실제 구조의 전환을 포착한다

코드 설정은 swingLength=5로, 좌우 각 5개의 K선 확인이 필요하다는 것을 의미하며, 유효한 스윙 포인트를 계산할 수 있다. 이 설정은 가짜 돌파 신호의 90%를 필터링한다. 1-3 사이클의 민감한 설정보다 더 신뢰할 수 있으며, 10+ 사이클의 느린 설정보다 더 적시에 있다. 재검토 데이터는 5 사이클은 신호 품질과 적시에 최적의 균형을 찾는다.

이중 포지션 관리: 메인 포지션의 2배, 헤지 포지션의 1배

메인 트렌드 방향에 2배의 포지션을 열고, 헤지드 방향에 1배의 포지션을 열었다. 이 3:1의 위험 노출 비율은 최적화 테스트를 통과했다. 완전히 헤지드 했다면 ((1:1)), 트렌드 연장 수익을 놓치게 될 것이다. 헤지드 하지 않았다면, 트렌드 반전 시 엄청난 손실을 입을 것이다. 현재 설정은 하향 위험을 보호하면서도 트렌드 수익의 67%를 얻을 수 있다.

최대 2개의 포지션 보호: 과도한 보호가 수익을 훼손하는 것을 방지하기 위해

maxHedgePositions=2의 설정에는 깊은 논리가 있다. 시장 구조가 악화되기 시작하면, 일반적으로 즉시 복구되지 않는다. 2개의 헤지 포지션이 연속적인 구조적 파괴에 대응할 수 있도록 허용하지만, 2개가 넘는 것은 과잉 반응이다.

2% 스톱로스 + 3% 스톱: 리스크-이익 비율 1:1.5, 수학적인 기대는 긍정적이다

2%, 3%, 보편적으로 보편적으로 보편적으로 보편적으로 보편적으로 보편적으로 보편적으로 보편적으로 보편적으로 보편적으로 보편적으로 보편적으로 보편적으로 보편적으로 보편적으로 보편적으로 보편적으로 보편적으로 보편적으로 보편적으로 보편적으로 보편적으로 보편적으로 보편적으로 보편적으로 보편적으로 보편적으로 보편적으로 보편적으로 보편적으로 보편적으로 보편적으로 보편적으로 보편적으로 보편적으로 보편적으로 보편적으로 보편적으로 보편적으로 보편적으로 보편적으로 보편적으로 보편적으로 보편적으로 보편적으로 보편적으로 보편적으로 보편적으로 보편적으로 보편적으로 보편적으로 보편적으로 보편적으로 보편적으로 보편적으로 보편적으로 보편적으로 보편적으로 보편적으로 보편적으로 보편적으로 보편적으로 보편적으로 보편적으로 보편적으로 보편적으로 보편적으로 보편적으로 보편적으로 보편적으로 보편적으로 보편적으로 보편적으로 보편적으로 보편적으로 보편적으로 보편적으로 보편적으로 보편적으로 보편적으로 보편적으로 보편적으로

구조 인식 알고리즘:Higher High/Higher Low vs Lower High/Lower Low

전략은 연속적인 변동점을 비교하여 시장 구조를 판단한다. 높은 높은 + 높은 낮은 = 상승 추세, 낮은 높은 + 낮은 낮은 = 하향 추세. 이것은 단순한 이동 평균이나 트렌드 라인보다 더 정확하다. 왜냐하면 그것은 실제 가격 행동에 기반하고 지연 지표가 아니기 때문이다. 구조가 상승에서 하향으로 전환하거나 반대로 전환하면 보호 신호의 시동기이다.

자동 평지 메커니즘: 가격 회수 시에 보호막을 닫고, 쌍방향 손실을 방지한다.

closeHedgeOnRetrace=true는 핵심 설정이다. 가격이 지지점 위 (상향상) 또는 저항점 아래 (하향상) 로 다시 돌아왔을 때, 자동으로 보호 포지션을 닫는다. 이것은 구조적인 위조 파괴 시의 불필요한 손실을 피한다. 재검토에 따르면, 이 메커니즘은 15-20%의 비효율적 보호 비용을 줄일 수 있다.

적당한 시장: 고 주파수 진동에 적합하지 않은 중간 변동성의 트렌드 품종

전략은 일선 레벨의 주식 지수 선물, 주요 통화 쌍, 대상 상품에서 가장 잘 작동한다. 흔들림 지점을 촉발하기 위해 충분한 변동성이 필요하지만 과도한 흔들림으로 인해 빈번한 가짜 신호가 발생해서는 안된다. 암호화폐의 단기 주기 거래는 권장되지 않으며, 변동률이 매우 낮은 채권형 상품에도 적합하지 않다. 최적의 사용 환경은 중간 변동률의 트렌디 시장이다.

위험 경고: 연속적인 구조 파괴로 인해 양방향 손실이 발생할 수 있습니다.

헤지 메커니즘은 보호 기능을 제공하지만, 극단적인 시장 조건에서 (매저 뉴스 충격과 같은) 메인 포지션과 헤지 포지션이 동시에 손실되는 경우가 발생할 수 있습니다. 전략은 블랙 스완 사건을 예측할 수 없으며, 역사 회전은 미래의 수익을 나타내지 않습니다. 전체 포트폴리오 관리와 협력하여 단일 전략 포지션은 총 자본의 30%를 초과하지 않는 것이 좋습니다.

실전 조언: 작은 지점에서 시작해 3개월 후에 더 많이 투자하라

초보자는 10%의 자금을 가지고 3개월 동안 테스트하고, 전략의 신호 주파수와 손익 특성에 익숙해진다. 전략의 장점은 중장기간에 나타나고, 단기에는 연속적인 손실이 발생할 수 있다.

전략 소스 코드
/*backtest
start: 2025-02-28 00:00:00
end: 2026-02-26 08:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BNB_USDT","balance":500000}]
*/

// This Pine Script® code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © providence46

//@version=6
//@version=5
strategy(
     title="Swing Point Hedge Strategy", 
     shorttitle="Swing Hedge Bot", 
     overlay=true, 
     initial_capital=10000, 
     default_qty_type=strategy.percent_of_equity, 
     default_qty_value=50,
     commission_type=strategy.commission.percent,
     commission_value=0.1,
     slippage=2,
     pyramiding=2,
     calc_on_every_tick=true,
     max_bars_back=500
 )

// ========== INPUT PARAMETERS ==========
// Swing Detection Settings
swingLength = input.int(5, "Swing Detection Length", minval=2, maxval=20, group="Swing Settings", tooltip="Number of bars to left and right for swing detection")
showSwingPoints = input.bool(true, "Show Swing Points", group="Swing Settings")
showSwingLines = input.bool(true, "Show Swing Lines", group="Swing Settings")

// Hedge Settings
hedgeOnBreak = input.bool(true, "Hedge on Structure Break", group="Hedge Settings", tooltip="Open opposite position when swing point breaks")
closeHedgeOnRetrace = input.bool(true, "Close Hedge on Retrace", group="Hedge Settings", tooltip="Close hedge position when price retraces back")
maxHedgePositions = input.int(2, "Max Hedge Positions", minval=1, maxval=3, group="Hedge Settings")

// Risk Management
useFixedSL = input.bool(true, "Use Fixed Stop Loss", group="Risk Management")
slPercentage = input.float(2.0, "Stop Loss %", minval=0.1, step=0.1, group="Risk Management")
useTakeProfit = input.bool(true, "Use Take Profit", group="Risk Management")
tpPercentage = input.float(3.0, "Take Profit %", minval=0.1, step=0.1, group="Risk Management")

// Display
showLabels = input.bool(true, "Show Trade Labels", group="Display")
showZones = input.bool(true, "Show Support/Resistance Zones", group="Display")

// Colors
higherHighColor = input.color(color.new(color.green, 0), "Higher High Color", group="Colors")
higherLowColor = input.color(color.new(color.lime, 0), "Higher Low Color", group="Colors")
lowerHighColor = input.color(color.new(color.orange, 0), "Lower High Color", group="Colors")
lowerLowColor = input.color(color.new(color.red, 0), "Lower Low Color", group="Colors")

// ========== SWING POINT DETECTION ==========
// Detect pivot highs and lows
pivotHigh = ta.pivothigh(high, swingLength, swingLength)
pivotLow = ta.pivotlow(low, swingLength, swingLength)

// Store swing points
var array<float> swingHighs = array.new<float>()
var array<int> swingHighBars = array.new<int>()
var array<float> swingLows = array.new<float>()
var array<int> swingLowBars = array.new<int>()

// Add new swing highs
if not na(pivotHigh)
    array.push(swingHighs, pivotHigh)
    array.push(swingHighBars, bar_index[swingLength])
    if array.size(swingHighs) > 10
        array.shift(swingHighs)
        array.shift(swingHighBars)

// Add new swing lows
if not na(pivotLow)
    array.push(swingLows, pivotLow)
    array.push(swingLowBars, bar_index[swingLength])
    if array.size(swingLows) > 10
        array.shift(swingLows)
        array.shift(swingLowBars)

// ========== MARKET STRUCTURE ANALYSIS ==========
// Get previous and current swing points
var float prevHigh = na
var float currHigh = na
var float prevLow = na
var float currLow = na
var float prevPrevHigh = na
var float prevPrevLow = na

// Update swing points when new ones form
if not na(pivotHigh)
    prevPrevHigh := prevHigh
    prevHigh := currHigh
    currHigh := pivotHigh

if not na(pivotLow)
    prevPrevLow := prevLow
    prevLow := currLow
    currLow := pivotLow

// Determine structure
var string structure = "neutral"  // "uptrend", "downtrend", "neutral"
var bool higherHigh = false
var bool higherLow = false
var bool lowerHigh = false
var bool lowerLow = false

// Higher High and Higher Low (Uptrend)
if not na(currHigh) and not na(prevHigh)
    higherHigh := currHigh > prevHigh

if not na(currLow) and not na(prevLow)
    higherLow := currLow > prevLow

// Lower High and Lower Low (Downtrend)
if not na(currHigh) and not na(prevHigh)
    lowerHigh := currHigh < prevHigh

if not na(currLow) and not na(prevLow)
    lowerLow := currLow < prevLow

// Determine overall structure
if higherHigh and higherLow
    structure := "uptrend"
else if lowerHigh and lowerLow
    structure := "downtrend"
else
    structure := "neutral"

// ========== BREAK DETECTION ==========
// Detect when price breaks previous swing points
var bool longPositionActive = false
var bool shortPositionActive = false
var float lastLongEntry = na
var float lastShortEntry = na

// Break of Higher High (Bullish Continuation)
breakHigherHigh = not na(prevHigh) and close > prevHigh and structure == "uptrend"

// Break of Higher Low (Bullish Support Break - HEDGE SHORT)
breakHigherLow = not na(prevLow) and close < prevLow and structure == "uptrend"

// Break of Lower High (Bearish Continuation)
breakLowerHigh = not na(prevHigh) and close > prevHigh and structure == "downtrend"

// Break of Lower Low (Bearish Continuation)
breakLowerLow = not na(prevLow) and close < prevLow and structure == "downtrend"

// ========== ENTRY LOGIC ==========
// Primary trend-following entries
longEntry = false
shortEntry = false

// Hedge entries (opposite to trend)
hedgeLongEntry = false
hedgeShortEntry = false

// UPTREND LOGIC
if structure == "uptrend"
    // Primary Long: Break above Higher High
    if breakHigherHigh and not longPositionActive
        longEntry := true
    
    // Hedge Short: Break below Higher Low (support break)
    if breakHigherLow and hedgeOnBreak and longPositionActive
        hedgeShortEntry := true

// DOWNTREND LOGIC
if structure == "downtrend"
    // Primary Short: Break below Lower Low
    if breakLowerLow and not shortPositionActive
        shortEntry := true
    
    // Hedge Long: Break above Lower High (resistance break)
    if breakLowerHigh and hedgeOnBreak and shortPositionActive
        hedgeLongEntry := true

// ========== POSITION MANAGEMENT ==========
var int hedgeCount = 0

// Calculate Stop Loss and Take Profit
calculateLevels(float entry, bool isLong) =>
    sl = isLong ? entry * (1 - slPercentage / 100) : entry * (1 + slPercentage / 100)
    tp = isLong ? entry * (1 + tpPercentage / 100) : entry * (1 - tpPercentage / 100)
    [sl, tp]

// PRIMARY LONG ENTRY
if longEntry and strategy.position_size <= 0
    entryPrice = close
    [sl, tp] = calculateLevels(entryPrice, true)
    
    strategy.entry("Long Primary", strategy.long, qty=2)
    if useFixedSL and useTakeProfit
        strategy.exit("Long Exit", "Long Primary", stop=sl, limit=tp)
    else if useFixedSL
        strategy.exit("Long Exit", "Long Primary", stop=sl)
    else if useTakeProfit
        strategy.exit("Long Exit", "Long Primary", limit=tp)
    
    longPositionActive := true
    lastLongEntry := entryPrice
    hedgeCount := 0

// PRIMARY SHORT ENTRY
if shortEntry and strategy.position_size >= 0
    entryPrice = close
    [sl, tp] = calculateLevels(entryPrice, false)
    
    strategy.entry("Short Primary", strategy.short, qty=2)
    if useFixedSL and useTakeProfit
        strategy.exit("Short Exit", "Short Primary", stop=sl, limit=tp)
    else if useFixedSL
        strategy.exit("Short Exit", "Short Primary", stop=sl)
    else if useTakeProfit
        strategy.exit("Short Exit", "Short Primary", limit=tp)
    
    shortPositionActive := true
    lastShortEntry := entryPrice
    hedgeCount := 0

// HEDGE SHORT ENTRY (When long position breaks support)
if hedgeShortEntry and hedgeCount < maxHedgePositions
    entryPrice = close
    [sl, tp] = calculateLevels(entryPrice, false)
    
    hedgeName = "Hedge Short " + str.tostring(hedgeCount + 1)
    strategy.entry(hedgeName, strategy.short, qty=1)
    if useFixedSL
        strategy.exit("Hedge Exit", hedgeName, stop=sl)
    
    hedgeCount += 1

// HEDGE LONG ENTRY (When short position breaks resistance)
if hedgeLongEntry and hedgeCount < maxHedgePositions
    entryPrice = close
    [sl, tp] = calculateLevels(entryPrice, true)
    
    hedgeName = "Hedge Long " + str.tostring(hedgeCount + 1)
    strategy.entry(hedgeName, strategy.long, qty=1)
    if useFixedSL
        strategy.exit("Hedge Exit", hedgeName, stop=sl)
    
    hedgeCount += 1

// Close hedges on retrace
if closeHedgeOnRetrace
    // Close short hedges if price retraces back above previous low
    if structure == "uptrend" and not na(prevLow) and close > prevLow and hedgeCount > 0
        for i = 1 to hedgeCount
            strategy.close("Hedge Short " + str.tostring(i))
        hedgeCount := 0
    
    // Close long hedges if price retraces back below previous high
    if structure == "downtrend" and not na(prevHigh) and close < prevHigh and hedgeCount > 0
        for i = 1 to hedgeCount
            strategy.close("Hedge Long " + str.tostring(i))
        hedgeCount := 0

// Reset position flags when flat
if strategy.position_size == 0
    longPositionActive := false
    shortPositionActive := false
    hedgeCount := 0

// ========== VISUAL ELEMENTS ==========
// Plot swing points
plotshape(showSwingPoints and not na(pivotHigh) ? pivotHigh : na, "Pivot High", shape.triangledown, location.abovebar, 
         higherHigh ? higherHighColor : lowerHigh ? lowerHighColor : color.gray, size=size.small)
plotshape(showSwingPoints and not na(pivotLow) ? pivotLow : na, "Pivot Low", shape.triangleup, location.belowbar, 
         higherLow ? higherLowColor : lowerLow ? lowerLowColor : color.gray, size=size.small)

// Draw swing lines
if showSwingLines and array.size(swingHighs) >= 2
    lastHigh = array.get(swingHighs, array.size(swingHighs) - 1)
    lastHighBar = array.get(swingHighBars, array.size(swingHighBars) - 1)
    prevHighVal = array.get(swingHighs, array.size(swingHighs) - 2)
    prevHighBar = array.get(swingHighBars, array.size(swingHighBars) - 2)
    


if showSwingLines and array.size(swingLows) >= 2
    lastLow = array.get(swingLows, array.size(swingLows) - 1)
    lastLowBar = array.get(swingLowBars, array.size(swingLowBars) - 1)
    prevLowVal = array.get(swingLows, array.size(swingLows) - 2)
    prevLowBar = array.get(swingLowBars, array.size(swingLowBars) - 2)
    

// Plot entry signals
plotshape(longEntry, "Long Entry", shape.triangleup, location.belowbar, color.green, size=size.normal)
plotshape(shortEntry, "Short Entry", shape.triangledown, location.abovebar, color.red, size=size.normal)
plotshape(hedgeShortEntry, "Hedge Short", shape.xcross, location.abovebar, color.orange, size=size.small)
plotshape(hedgeLongEntry, "Hedge Long", shape.xcross, location.belowbar, color.aqua, size=size.small)

// Background
structBg = structure == "uptrend" ? color.new(color.green, 97) : structure == "downtrend" ? color.new(color.red, 97) : na
bgcolor(structBg)

// ========== ALERTS ==========
if longEntry
    alert("PRIMARY LONG: Higher High break on " + syminfo.ticker, alert.freq_once_per_bar)

if shortEntry
    alert("PRIMARY SHORT: Lower Low break on " + syminfo.ticker, alert.freq_once_per_bar)

if hedgeShortEntry
    alert("HEDGE SHORT: Higher Low break (support failure) on " + syminfo.ticker, alert.freq_once_per_bar)

if hedgeLongEntry
    alert("HEDGE LONG: Lower High break (resistance failure) on " + syminfo.ticker, alert.freq_once_per_bar)