다단계 가격구조 식별 및 공정가치 갭 정량적 거래 시스템

CHoCH FVG Pivot Points Risk-Reward Ratio Price Structure SWING POINTS Quantitative Trading
생성 날짜: 2025-06-03 10:50:29 마지막으로 수정됨: 2025-06-03 10:50:29
복사: 0 클릭수: 347
avatar of ianzeng123 ianzeng123
2
집중하다
319
수행원

다단계 가격구조 식별 및 공정가치 갭 정량적 거래 시스템 다단계 가격구조 식별 및 공정가치 갭 정량적 거래 시스템

개요

다단계 가격 구조 식별과 공정 가치 격차량 거래 시스템은 가격 행동에 기반한 자동화 거래 전략으로, 두 가지 핵심 거래 개념을 결합합니다. 변화의 특성 (CHoCH, Change of Character) 과 공정 가치 격차 (FVG, Fair Value Gap). 이 전략은 시장 구조의 변화 포인트와 불균형 영역을 식별하여 높은 확률의 거래 기회를 포착하고, 가격이 공정 가치 격차로 되돌아갈 때 진입을 가능하게 하며, 정확한 입출 및 출출을 제어합니다. 이러한 체계화된 방법은 거래자가 시장을 객관적으로 분석하고, 감정 요소를 제거하고, 명확한 위험 관리 규칙을 가지고 있습니다.

전략 원칙

양자 거래 시스템은 다음과 같은 핵심 원칙에 따라 작동합니다.

  1. 가격구조 식별: Pivot Points 기술을 통해 시장의 흔들림 고점과 흔들림 저점, 시장 구조의 핵심 구성 요소를 식별합니다. 시스템은 파라미터화 된 흔들림 길이를 사용하여 이러한 핵심 지점을 결정합니다.

  2. 변화 특징 ((CHoCH) 검출:

    • 다목적 CHoCH: 가격이 낮은 하락을 형성한 후 이전 변동 고도를 돌파합니다.
    • 허공 CHoCH: 가격이 높은 고점을 형성한 후 이전 변동 하위점을 돌파했다. 시스템은 CHoCH가 생성되는 시간 간격이 최소 거리의 요구 사항을 충족하도록 요구합니다 (설정 10주기) 무효 신호를 필터링하기 위해.
  3. 공정한 가치 틈을 확인함:

    • 다목적 FVG: 현재 의 하위점은 이전 두 주기의 의 하위점보다 높습니다.
    • 공백 FVG: 현재 의 높이는 이전 두 주기 의 낮음보다 낮다 이 시스템은 최소 FVG 크기의 값을 설정하여 (기본 2점) 의미있는 가격 불균형만을 잡는 것을 보장합니다.
  4. 입력 논리:

    • 다중 입구: 다중 CHoCH 확인 후, 다중 FVG 영역으로 가격 회수까지 기다립니다.
    • 허브 입구: 허브 CHoCH를 확인한 후, 허브 FVG 영역으로 가격이 되돌릴 때까지 기다립니다. 입장료는 FVG 구역의 중간 지점으로 설정되어 균형있는 입장료를 제공합니다.
  5. 위험 관리 메커니즘:

    • 스톱 손실 설정에서 가장 가까운 흔들 낮은 점 (더 많은 머리) 또는 흔들 높은 점 (공백 머리)
    • 리스크 수익률 (default 2.0) 또는 고정 목표 점수를 기준으로 정지
    • 선택 가능한 포지션 자동 조정 기능, 계정 리스크 비율 및 스톱 거리에 따라 포지션 크기를 계산

전략적 이점

코드의 심층적인 분석에 따르면, 이 전략은 다음과 같은 중요한 장점을 가지고 있다:

  1. 구조화된 시장 분석이 전략은 가격 구조의 변화와 시장 불균형의 원칙에 기초하고 단순한 지표의 교차가 아니라 시장의 전환점을 식별하는 데 독특한 이점을 제공합니다.

  2. 정확한 입학 시간: CHoCH 이후 FVG가 형성될 때까지 기다림으로써, 전략은 유리한 가격 수준에서 진출할 수 있고, 높은 가격과 낮은 가격의 경쟁을 피하고, 진출의 질을 향상시킬 수 있다.

  3. 자율적 위험 관리전략: 실제 시장 구조에 따라 자동으로 스톱 포지션을 조정합니다. 고정된 점수를 사용하는 대신,이 방법은 시장의 실제 변동 특성에 더 적합합니다.

  4. 거래 요소를 시각화전략: 전략은 CHoCH 태그, FVG 상자, 스윙 포인트 및 거래 라인을 포함한 완전한 시각 기능을 제공하여 거래자가 시장 구조와 전략 논리를 직관적으로 이해할 수 있도록합니다.

  5. 유연한 포지션 관리: 리스크 비율을 통해 자동으로 포지션 크기를 조정할 수 있으며, 계좌 자금을 보호하면서 변동성에 따라 자동으로 리스크 을 조정할 수 있습니다.

  6. 성능 최적화 설계: 코드는 오래된 FVG 상자를 청소하는 메커니즘을 포함하고 있으며, 장기간 작동할 때 시스템의 성능이 저하되지 않도록 보장합니다.

  7. 통합적 성과 모니터링전략: 전략 상태, 승률, 수익 요소와 같은 주요 지표를 포함하는 실시간 성능 표를 제공하여 거래자가 전략의 성능을 평가할 수 있습니다.

전략적 위험

이 전략은 합리적으로 설계되었지만 몇 가지 잠재적인 위험과 한계가 있습니다.

  1. 가짜 침입 위험:CHoCH 신호는 가짜 돌파구가 될 수 있으며, 가격의 급격한 회수와 스톱 손실을 유발할 수 있다. 이 위험을 완화하기 위해, 도건 K 라인이 돌파구를 확인하는 것을 기다리는 것과 같은 확인 메커니즘을 추가하는 것을 고려할 수 있다.

  2. 빈틈의 위험: 변동성이 높은 시장이나 하룻밤 거래에서 가격이 중지 위치를 초과하여 실제 손실이 예상보다 많을 수 있습니다. 보증된 중지 주문을 사용하는 것이 좋습니다 (가능한 경우) 또는 위치 크기를 줄이는 것이 좋습니다.

  3. 매개변수 민감도전략 성능은 흔들 길이, 최소 CHoCH 거리 및 FVG 크기와 같은 파라미터 설정에 크게 의존합니다. 다른 시장과 시간 프레임에 따라 다른 파라미터 조합이 필요할 수 있으므로 전체적인 피드백 최적화를 권장합니다.

  4. 시장환경의존성: 이 전략은 트렌드 시장에서 더 잘 작동하며, 시장의 회수에서 자주 잘못된 신호를 일으킬 수 있습니다. 트렌드 필터 또는 시장 상태 식별 장치를 추가하는 것을 고려하십시오.

  5. 계산 복잡도: 전략은 여러 배열과 조건 검사를 사용하며, 낮은 구성의 장치에서 성능 문제가 발생할 수 있습니다. 쿨링 메커니즘이 포함 된 코드가 있지만, 장기간 실행은 여전히 자원 소모를 주의해야합니다.

  6. 탈퇴 관리 부족: 현재 전략은 상이한 시장 조건에 따른 포지션 규모의 동적인 조정을 고려하지 않으며, 지속되는 불리한 환경에서 더 큰 철수로 이어질 수 있다.

전략 최적화 방향

코드 분석을 바탕으로 다음과 같은 최적화 방향을 제시합니다.

  1. 다중 시간 프레임 확인: 더 높은 시간 프레임의 시장 구조 분석을 도입하여 주요 트렌드 방향에서만 거래한다. 예를 들어, 일대 트렌드 필터를 추가하여 일대 트렌드 방향이 일치하는 경우에만 거래를 수행한다.

  2. 동적 변수 최적화: 시장의 변동성에 따라 자동으로 조정되는 매개 변수 시스템을 구현합니다. 예를 들어, 최소 FVG 크기와 CHoCH 거리의 요구 사항을 높은 변동성 동안 증가시키고 낮은 변동성 동안 이러한 매개 변수를 감소시킵니다.

  3. 입시 최적화:

    • FVG 영역의 다른 수준에 여러 개의 진입 지점을 설정하는 것과 같은 집합 진입 전략을 구현합니다.
    • 거래량 돌파구 또는 동력 지표 확인과 같은 추가적인 입점 확인을 추가합니다.
  4. 위험 관리 강화:

    • 트레이킹 스톱로스 기능을 구현하여 거래 수익에 따라 자동으로 스톱로스 위치를 조정합니다.
    • 일부 수익을 창출하는 기능을 추가하여 특정 수익 수준을 달성하면 일부 포지션을 평행합니다.
    • 최대 인출 제한을 도입하여 계좌 인출이 마이너스에 도달하면 자동으로 거래 규모를 줄이거나 거래를 중지합니다.
  5. 시장 상태 적응:

    • 시장 상태 식별을 추가하고 (트렌드/조정/고동성) 다른 상태에 따라 전략 매개 변수를 조정합니다.
    • 종합시장에서 거래가 줄어들거나 피되는 경우
    • 급격한 변동성 증가 시 보다 보수적인 포지션 규모를 취하는 것
  6. 기계 학습 강화: 기계 학습 알고리즘을 도입하여 역사적인 CHoCH 및 FVG 패턴을 분석하여 성공률이 높은 패턴 특성을 식별하고 이에 따라 입시 의사 결정 중점을 조정합니다.

  7. 거래 시간 필터거래 시간 필터를 추가하여 주요 뉴스 발표와 시장 개시/폐쇄 시기의 높은 변동성을 피하고, 유동성이 좋은 거래 시간에 집중하십시오.

요약하다

다단계 가격구조 식별과 공정 가치 격차량화 거래 시스템은 첨단 가격행동 이론을 결합한 완전한 거래 솔루션이다. 그것은 시장구조의 변화 (CHoCH) 와 가격 불균형 영역 (FVG) 을 식별하여 이상적인 가격 수준에서 진입하고 체계화된 위험 관리 방법을 사용하여 거래 자본을 보호한다.

이 전략의 가장 큰 장점은 실제 시장 구조에 기반한 분석 방식이 뒤처진 지표에 의존하지 않고 시장 전환점을 더 일찍 식별 할 수 있다는 것입니다. 또한, 완벽한 시각화 기능과 성과 모니터링 시스템은 거래자가 전략 논리를 직관적으로 이해하고 그 효과를 평가 할 수 있도록합니다.

가짜 돌파구 및 변수 민감성 등의 위험이 존재하지만, 제안된 최적화 방향, 특히 다중 시간 프레임 확인, 동적 변수 조정 및 강화된 위험 관리 기능을 통해 전략의 안정성과 성능을 크게 향상시킬 수 있습니다.

이 전략은 체계적인 방법을 사용하여 거래하기를 원하는 투자자에게 강력한 프레임워크를 제공하며, 전통적인 가격 행동 거래의 본질을 흡수하고, 양적 시스템의 객관성과 규율적 장점을 활용합니다. 지속적인 매개 변수 최적화와 시장 적응성 조정으로, 이 전략은 다양한 시장 환경에서 안정적인 거래 성과를 달성 할 잠재력을 가지고 있습니다.

전략 소스 코드
/*backtest
start: 2024-06-03 00:00:00
end: 2025-06-02 00:00:00
period: 2h
basePeriod: 2h
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/

//@version=5
strategy("ICT CHoCH & FVG Strategy - NQ1!", overlay=true, pyramiding=0, calc_on_every_tick=false, calc_on_order_fills=false, max_boxes_count=500, max_lines_count=100, max_labels_count=100)

// ============================================================================
// INPUT PARAMETERS
// ============================================================================

// Strategy Settings
riskRewardRatio = input.float(2.0, title="Risk:Reward Ratio", minval=0.5, maxval=10.0, group="Strategy Settings")
fixedTarget = input.int(40, title="Fixed Target (Ticks)", minval=5, maxval=200, group="Strategy Settings")
useRRTarget = input.bool(true, title="Use Risk:Reward Target", tooltip="If false, uses fixed target", group="Strategy Settings")
riskPercent = input.float(2.0, title="Risk % of Account", minval=0.1, maxval=10.0, group="Strategy Settings")
useAutoSize = input.bool(false, title="Auto Size Positions", tooltip="Size based on risk % and stop distance", group="Strategy Settings")

// Visual Settings
showCHoCH = input.bool(true, title="Show CHoCH Labels", group="Visual Settings")
showFVG = input.bool(true, title="Show FVG Boxes", group="Visual Settings")
showSwings = input.bool(true, title="Show Swing Points", group="Visual Settings")
showTradeLines = input.bool(true, title="Show Entry/SL/TP Lines", group="Visual Settings")

// CHoCH Detection Settings
swingLength = input.int(5, title="Swing Detection Length", minval=2, maxval=20, group="CHoCH Settings")
minCHoCHDistance = input.int(10, title="Min CHoCH Distance (bars)", minval=5, maxval=50, group="CHoCH Settings")

// FVG Settings
minFVGSize = input.float(2.0, title="Min FVG Size (ticks)", minval=0.25, maxval=10.0, group="FVG Settings")
maxFVGAge = input.int(50, title="Max FVG Age (bars)", minval=10, maxval=200, group="FVG Settings")

// ============================================================================
// VARIABLES AND ARRAYS
// ============================================================================

// Swing point detection
var float lastSwingHigh = na
var float lastSwingLow = na
var int lastSwingHighBar = na
var int lastSwingLowBar = na

// CHoCH tracking
var bool bullishCHoCH = false
var bool bearishCHoCH = false
var float chochLevel = na
var int chochBar = na
var bool waitingForFVG = false

// FVG tracking
var array<box> bullishFVGs = array.new<box>()
var array<box> bearishFVGs = array.new<box>()
var float activeFVGTop = na
var float activeFVGBottom = na
var bool lookingForEntry = false

// Trade management
var float stopLossLevel = na
var float takeProfitLevel = na
var bool inPosition = false

// ============================================================================
// HELPER FUNCTIONS
// ============================================================================

// Convert ticks to price for NQ
ticksToPrice(ticks) => ticks * 0.25

// Calculate position size based on risk
calcPositionSize(stopDistance) =>
    if useAutoSize and strategy.equity > 0
        accountValue = strategy.equity
        riskAmount = accountValue * (riskPercent / 100)
        stopDistancePrice = stopDistance * syminfo.mintick
        math.max(1, math.floor(riskAmount / stopDistancePrice))
    else
        1

// ============================================================================
// SWING POINT DETECTION
// ============================================================================

// Detect swing highs and lows
swingHigh = ta.pivothigh(high, swingLength, swingLength)
swingLow = ta.pivotlow(low, swingLength, swingLength)

// Update swing points
if not na(swingHigh)
    lastSwingHigh := swingHigh
    lastSwingHighBar := bar_index - swingLength
    if showSwings
        label.new(bar_index - swingLength, swingHigh, "SH", style=label.style_triangledown, color=color.red, size=size.tiny)

if not na(swingLow)
    lastSwingLow := swingLow
    lastSwingLowBar := bar_index - swingLength
    if showSwings
        label.new(bar_index - swingLength, swingLow, "SL", style=label.style_triangleup, color=color.green, size=size.tiny)

// ============================================================================
// CHoCH DETECTION
// ============================================================================

// Check for bullish CHoCH (break above prior swing high after making lower low)
bullishCHoCHCondition = not na(lastSwingHigh) and not na(lastSwingLow) and 
                       high > lastSwingHigh and 
                       lastSwingLow < lastSwingHigh and
                       bar_index - lastSwingHighBar > minCHoCHDistance and
                       strategy.position_size == 0

// Check for bearish CHoCH (break below prior swing low after making higher high)
bearishCHoCHCondition = not na(lastSwingHigh) and not na(lastSwingLow) and 
                       low < lastSwingLow and 
                       lastSwingHigh > lastSwingLow and
                       bar_index - lastSwingLowBar > minCHoCHDistance and
                       strategy.position_size == 0

// Process CHoCH signals
if bullishCHoCHCondition and not bullishCHoCH
    bullishCHoCH := true
    bearishCHoCH := false
    chochLevel := lastSwingHigh
    chochBar := bar_index
    waitingForFVG := true
    lookingForEntry := false
    


if bearishCHoCHCondition and not bearishCHoCH
    bearishCHoCH := true
    bullishCHoCH := false
    chochLevel := lastSwingLow
    chochBar := bar_index
    waitingForFVG := true
    lookingForEntry := false
    


// ============================================================================
// FVG DETECTION
// ============================================================================

// Check for FVG formation (3-candle pattern)
if bar_index >= 2
    // Bullish FVG: low[0] > high[2]
    bullishFVG = low[0] > high[2] and (low[0] - high[2]) >= ticksToPrice(minFVGSize)
    
    // Bearish FVG: high[0] < low[2]  
    bearishFVG = high[0] < low[2] and (low[2] - high[0]) >= ticksToPrice(minFVGSize)
    
    // Process bullish FVG after bullish CHoCH
    if bullishFVG and bullishCHoCH and waitingForFVG and bar_index > chochBar
        fvgTop = low[0]
        fvgBottom = high[2]
        

        
        // Set active FVG for entry
        activeFVGTop := fvgTop
        activeFVGBottom := fvgBottom
        waitingForFVG := false
        lookingForEntry := true
    
    // Process bearish FVG after bearish CHoCH
    if bearishFVG and bearishCHoCH and waitingForFVG and bar_index > chochBar
        fvgTop = low[2]
        fvgBottom = high[0]
        

        
        // Set active FVG for entry
        activeFVGTop := fvgTop
        activeFVGBottom := fvgBottom
        waitingForFVG := false
        lookingForEntry := true

// ============================================================================
// ENTRY LOGIC
// ============================================================================

// Long entry: price touches bullish FVG after bullish CHoCH
longCondition = lookingForEntry and bullishCHoCH and 
               not na(activeFVGTop) and not na(activeFVGBottom) and
               low <= activeFVGTop and high >= activeFVGBottom and
               strategy.position_size == 0

// Short entry: price touches bearish FVG after bearish CHoCH  
shortCondition = lookingForEntry and bearishCHoCH and  not na(activeFVGTop) and not na(activeFVGBottom) and low <= activeFVGTop and high >= activeFVGBottom and  strategy.position_size == 0

// Process long entries
if longCondition
    var float entryPrice = na
    var float stopLoss = na
    var float takeProfit = na
    
    entryPrice := math.avg(activeFVGTop, activeFVGBottom)
    stopLoss := lastSwingLow
    stopDistance = entryPrice - stopLoss
    
    if useRRTarget
        takeProfit := entryPrice + (stopDistance * riskRewardRatio)
    else
        takeProfit := entryPrice + ticksToPrice(fixedTarget)
    
    // Calculate position size
    qty = calcPositionSize(stopDistance / syminfo.mintick)
    
    // Enter trade
    strategy.entry("Long", strategy.long, qty=qty)
    strategy.exit("Long Exit", "Long", stop=stopLoss, limit=takeProfit)
    
    // Update tracking
    stopLossLevel := stopLoss
    takeProfitLevel := takeProfit
    inPosition := true
    lookingForEntry := false
    
    // Reset CHoCH state
    bullishCHoCH := false
    activeFVGTop := na
    activeFVGBottom := na
    


// Process short entries
if shortCondition
    var float entryPrice = na
    var float stopLoss = na
    var float takeProfit = na
    
    entryPrice := math.avg(activeFVGTop, activeFVGBottom)
    stopLoss := lastSwingHigh
    stopDistance = stopLoss - entryPrice
    
    if useRRTarget
        takeProfit := entryPrice - (stopDistance * riskRewardRatio)
    else
        takeProfit := entryPrice - ticksToPrice(fixedTarget)
    
    // Calculate position size
    qty = calcPositionSize(stopDistance / syminfo.mintick)
    
    // Enter trade
    strategy.entry("Short", strategy.short, qty=qty)
    strategy.exit("Short Exit", "Short", stop=stopLoss, limit=takeProfit)
    
    // Update tracking
    stopLossLevel := stopLoss
    takeProfitLevel := takeProfit
    inPosition := true
    lookingForEntry := false
    
    // Reset CHoCH state
    bearishCHoCH := false
    activeFVGTop := na
    activeFVGBottom := na
    

// ============================================================================
// POSITION MANAGEMENT
// ============================================================================

// Reset position state when trade is closed
if inPosition and strategy.position_size == 0
    inPosition := false
    stopLossLevel := na
    takeProfitLevel := na

// ============================================================================
// VISUAL SIGNALS
// ============================================================================

// Plot entry signals
plotshape(longCondition, title="Long Entry", location=location.belowbar, color=color.green, 
          style=shape.triangleup, size=size.normal)

plotshape(shortCondition, title="Short Entry", location=location.abovebar, color=color.red, 
          style=shape.triangledown, size=size.normal)

// Plot active stop loss and take profit levels
plot(inPosition ? stopLossLevel : na, title="Stop Loss", color=color.red, linewidth=2, style=plot.style_linebr)
plot(inPosition ? takeProfitLevel : na, title="Take Profit", color=color.green, linewidth=2, style=plot.style_linebr)

// ============================================================================
// CLEANUP
// ============================================================================

// Clean up old FVG boxes (helps with performance)
if bar_index % 100 == 0
    while array.size(bullishFVGs) > 20
        box.delete(array.shift(bullishFVGs))
    while array.size(bearishFVGs) > 20
        box.delete(array.shift(bearishFVGs))

// ============================================================================
// ALERTS
// ============================================================================

// Alert conditions
alertcondition(longCondition, title="Long Entry Signal", message="ICT Strategy: Long entry at FVG - SL: {{strategy.position_avg_price}}")
alertcondition(shortCondition, title="Short Entry Signal", message="ICT Strategy: Short entry at FVG - SL: {{strategy.position_avg_price}}")