
다단계 가격 구조 식별과 공정 가치 격차량 거래 시스템은 가격 행동에 기반한 자동화 거래 전략으로, 두 가지 핵심 거래 개념을 결합합니다. 변화의 특성 (CHoCH, Change of Character) 과 공정 가치 격차 (FVG, Fair Value Gap). 이 전략은 시장 구조의 변화 포인트와 불균형 영역을 식별하여 높은 확률의 거래 기회를 포착하고, 가격이 공정 가치 격차로 되돌아갈 때 진입을 가능하게 하며, 정확한 입출 및 출출을 제어합니다. 이러한 체계화된 방법은 거래자가 시장을 객관적으로 분석하고, 감정 요소를 제거하고, 명확한 위험 관리 규칙을 가지고 있습니다.
양자 거래 시스템은 다음과 같은 핵심 원칙에 따라 작동합니다.
가격구조 식별: Pivot Points 기술을 통해 시장의 흔들림 고점과 흔들림 저점, 시장 구조의 핵심 구성 요소를 식별합니다. 시스템은 파라미터화 된 흔들림 길이를 사용하여 이러한 핵심 지점을 결정합니다.
변화 특징 ((CHoCH) 검출:
공정한 가치 틈을 확인함:
입력 논리:
위험 관리 메커니즘:
코드의 심층적인 분석에 따르면, 이 전략은 다음과 같은 중요한 장점을 가지고 있다:
구조화된 시장 분석이 전략은 가격 구조의 변화와 시장 불균형의 원칙에 기초하고 단순한 지표의 교차가 아니라 시장의 전환점을 식별하는 데 독특한 이점을 제공합니다.
정확한 입학 시간: CHoCH 이후 FVG가 형성될 때까지 기다림으로써, 전략은 유리한 가격 수준에서 진출할 수 있고, 높은 가격과 낮은 가격의 경쟁을 피하고, 진출의 질을 향상시킬 수 있다.
자율적 위험 관리전략: 실제 시장 구조에 따라 자동으로 스톱 포지션을 조정합니다. 고정된 점수를 사용하는 대신,이 방법은 시장의 실제 변동 특성에 더 적합합니다.
거래 요소를 시각화전략: 전략은 CHoCH 태그, FVG 상자, 스윙 포인트 및 거래 라인을 포함한 완전한 시각 기능을 제공하여 거래자가 시장 구조와 전략 논리를 직관적으로 이해할 수 있도록합니다.
유연한 포지션 관리: 리스크 비율을 통해 자동으로 포지션 크기를 조정할 수 있으며, 계좌 자금을 보호하면서 변동성에 따라 자동으로 리스크 을 조정할 수 있습니다.
성능 최적화 설계: 코드는 오래된 FVG 상자를 청소하는 메커니즘을 포함하고 있으며, 장기간 작동할 때 시스템의 성능이 저하되지 않도록 보장합니다.
통합적 성과 모니터링전략: 전략 상태, 승률, 수익 요소와 같은 주요 지표를 포함하는 실시간 성능 표를 제공하여 거래자가 전략의 성능을 평가할 수 있습니다.
이 전략은 합리적으로 설계되었지만 몇 가지 잠재적인 위험과 한계가 있습니다.
가짜 침입 위험:CHoCH 신호는 가짜 돌파구가 될 수 있으며, 가격의 급격한 회수와 스톱 손실을 유발할 수 있다. 이 위험을 완화하기 위해, 도건 K 라인이 돌파구를 확인하는 것을 기다리는 것과 같은 확인 메커니즘을 추가하는 것을 고려할 수 있다.
빈틈의 위험: 변동성이 높은 시장이나 하룻밤 거래에서 가격이 중지 위치를 초과하여 실제 손실이 예상보다 많을 수 있습니다. 보증된 중지 주문을 사용하는 것이 좋습니다 (가능한 경우) 또는 위치 크기를 줄이는 것이 좋습니다.
매개변수 민감도전략 성능은 흔들 길이, 최소 CHoCH 거리 및 FVG 크기와 같은 파라미터 설정에 크게 의존합니다. 다른 시장과 시간 프레임에 따라 다른 파라미터 조합이 필요할 수 있으므로 전체적인 피드백 최적화를 권장합니다.
시장환경의존성: 이 전략은 트렌드 시장에서 더 잘 작동하며, 시장의 회수에서 자주 잘못된 신호를 일으킬 수 있습니다. 트렌드 필터 또는 시장 상태 식별 장치를 추가하는 것을 고려하십시오.
계산 복잡도: 전략은 여러 배열과 조건 검사를 사용하며, 낮은 구성의 장치에서 성능 문제가 발생할 수 있습니다. 쿨링 메커니즘이 포함 된 코드가 있지만, 장기간 실행은 여전히 자원 소모를 주의해야합니다.
탈퇴 관리 부족: 현재 전략은 상이한 시장 조건에 따른 포지션 규모의 동적인 조정을 고려하지 않으며, 지속되는 불리한 환경에서 더 큰 철수로 이어질 수 있다.
코드 분석을 바탕으로 다음과 같은 최적화 방향을 제시합니다.
다중 시간 프레임 확인: 더 높은 시간 프레임의 시장 구조 분석을 도입하여 주요 트렌드 방향에서만 거래한다. 예를 들어, 일대 트렌드 필터를 추가하여 일대 트렌드 방향이 일치하는 경우에만 거래를 수행한다.
동적 변수 최적화: 시장의 변동성에 따라 자동으로 조정되는 매개 변수 시스템을 구현합니다. 예를 들어, 최소 FVG 크기와 CHoCH 거리의 요구 사항을 높은 변동성 동안 증가시키고 낮은 변동성 동안 이러한 매개 변수를 감소시킵니다.
입시 최적화:
위험 관리 강화:
시장 상태 적응:
기계 학습 강화: 기계 학습 알고리즘을 도입하여 역사적인 CHoCH 및 FVG 패턴을 분석하여 성공률이 높은 패턴 특성을 식별하고 이에 따라 입시 의사 결정 중점을 조정합니다.
거래 시간 필터거래 시간 필터를 추가하여 주요 뉴스 발표와 시장 개시/폐쇄 시기의 높은 변동성을 피하고, 유동성이 좋은 거래 시간에 집중하십시오.
다단계 가격구조 식별과 공정 가치 격차량화 거래 시스템은 첨단 가격행동 이론을 결합한 완전한 거래 솔루션이다. 그것은 시장구조의 변화 (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}}")