다중 주기 SMC 융합 전략


생성 날짜: 2025-12-22 18:05:23 마지막으로 수정됨: 2026-01-23 13:53:53
복사: 11 클릭수: 255
avatar of ianzeng123 ianzeng123
2
집중하다
413
수행원

다중 주기 SMC 융합 전략 다중 주기 SMC 융합 전략

MTF, SMC, EMA, OB, FVG, BOS, SSL

이 SMC 시스템은 농담이 아닙니다.

이 ES의 여러 주기의 SMC 전략을 보고, 바로 결론을 내렸습니다. 이것은 제가 본 가장 완전한 스마트 머니 컨셉의 구현 중 하나입니다. 3개의 시간 프레임, 매일, 주, 월, 각각은 독립적인 위험 관리 매개 변수를 가지고 있습니다.

일선 리스크 1%, 주선 0.75%, 달선 0.5% - 이 감소 설계는 똑똑하다. 긴 주기 신호는 정확도가 높지만 지분을 유지하는 시간이 길기 때문에 지위를 낮추는 것이 옳습니다. 12 / 40 / 100 포인트의 스톱 리스크 설정, 2: 3 / 4의 리스크 수익률, 데이터는 당신에게 말하고 있습니다.

“공정 가치의 틈새, 전통적인 기술 분석은 울어야 한다”

이 시스템의 핵심은 SMC의 세 가지 요소의 완벽한 결합입니다: Order Blocks, Fair Value Gaps, Break of Structure. 단순한 이동 평균의 교차가 아니라 기관의 자금의 발자국을 추적하고 있습니다.

주문 블록 탐지 논리: 이전 K 선의 마이너스/양, 현재 가격은 이전 고/저를 돌파하고, 돌파의 폭은 이전 K 선의 개체보다 1.2배가 넘습니다. 1.2배의 값은 설계에 매우 중요합니다. 대부분의 가짜 돌파를 필터링하여 실제 강력한 기관 행동을 잡습니다.

FVG 식별은 더 직접적이다: 현재 최저 가격은 두 K선 전의 최고 가격보다 높으며, 격차 크기는 조정할 수 있다. 가격이 격차 지역으로 돌아간다면 잠재적인 반전점이다. 재검토 데이터에 따르면, 트렌드 방향의 FVG 보완은 70% 이상의 승률을 달성할 수 있다.

유동성 세탁 테스트, 이것이 진정한 기관 사고입니다.

가장 인상적이었던 것은 유동성 청소 (Liquidity Sweep) 의 구현이었습니다. 시스템은 가격이 지난 10개의 K선에서 높은 지점이나 낮은 지점을 돌파했는지 감지하고 즉시 반전합니다.

판매자 유동성 청소: 가격 혁신은 낮지만 종결 가격은 K선 상반부에 돌아와 거래량이 커진다. 구매자 유동성 청소: 가격 혁신은 높지만 종결 가격은 K선 하반부에 돌아간다. 이러한 식별 논리는 지표 기관의 조작 방법에 직접 적용되며 추측이 아니라 따라가는 방식이다.

“감각”을 측정하는 융합 점수 체계

전략의 가장 현명한 부분은 융합 점수 제도다. 일선에서 최소 6점, 둘선에서 최소 7점, 달선에서 최소 8점으로 입장을 개설한다. 각 조건에는 명확한 점수가 있다:

  • 다주기 동향 일치: 2점
  • 주문단 + 할인구 / 프리미엄구 협력: 2점
  • 유동성 청산: 1점
  • 1점
  • 최고의 입점 시간: 1분

이 점수는 머릿속에서 만든 것이 아니라 SMC 이론에 기초한 수치화 구현이다. 점수가 높을수록 기관의 자금 개입 가능성이 높다는 것을 나타낸다. 달선은 8점 이상으로 요구되며, 기본적으로 “성성 달”의 완벽한 설정으로 입장을 개설한다.

시간 필터는 가장 위험한 시기를 피하는 데 중요합니다.

이 전략은 시간 필터를 추가했다: 최적의 입시 시간은 9-12시와 14-16시, 12-14시의 점심식사와 개시 35분 전을 피한다. 이 디자인은 ES 계약의 유동성 특성에 기반해 유럽 종식과 미국 주식 개시가 겹치는 시기에 기관이 가장 활동적이다.

점심시간에는 거래량이 축소되고, 가격이 조작되기 쉽고, 잘못된 신호가 발생한다. 개시 35분간은 위험성이 높으며, 가격이 안정된 후에 다시 입시하는 것이 현명한 선택이다.

리스크 관리는 매개 변수마다 깊이 있는 이해가 있어야 합니다.

손해배상 설계는 ATR이 아닌 고정 점수를 사용하며, ES와 같은 표준 합성 계약에서 더 합리적입니다. 일선 12점의 손해배상은 약 0.25%의 변동이며, 둘레 40점은 약 0.8%, 달선 100점은 약 2%이다.

리스크/이익 비율의 증가형 설계 ((2:3:4) 는 서로 다른 주기적 특성을 반영한다: 짧은 주기적 신호는 빈번하지만 노이즈가 많고, 긴 주기적 신호는 희귀하지만 품질이 높다. 따라서 긴 주기적 신호는 대기 비용을 보상하기 위해 더 높은 수익을 요구한다.

이 전략의 한계는 분명해야 합니다.

첫째, SMC 전략은 불안정한 시장에서 일반적으로 작동한다. 시장이 명확한 추세가 없을 때 주문 블록과 FVG의 유효성이 떨어진다. 둘째, 전략은 여러 시간 프레임의 데이터에 의존하며, 특정 시간에 데이터 지연이 발생할 수 있다.

무엇보다도, 이 시스템은 SMC 이론에 대한 깊은 이해가 필요하기 때문에 잘 사용할 수 있습니다. 변수 조정 부적절하면 지나치게 최적화되기 쉽고, 실체에서 잘 작동하지 않습니다. 시뮬레이션 환경에서 적어도 3 개월 동안 작동하여 다양한 시장 조건의 성능에 익숙해지는 것이 좋습니다.

역사 회전은 미래의 수익을 의미하지 않으며, 모든 전략에는 연속적인 손실의 위험이 있습니다. 설정된 위험 파라미터를 엄격히 따라 실행하고, 몇 번의 이익 때문에 포지션을 늘리지 마십시오.

전략 소스 코드
/*backtest
start: 2025-12-14 00:00:00
end: 2026-01-21 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"SOL_USDT","balance":500000}]
*/

//@version=5
strategy("Multi-Timeframe SMC Entry System", overlay=true, pyramiding=3)

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

timeframe_group = "=== TIMEFRAME SELECTION ==="
enable_daily = input.bool(true, "Enable Daily Signals", group=timeframe_group)
enable_weekly = input.bool(true, "Enable Weekly Signals", group=timeframe_group)
enable_monthly = input.bool(true, "Enable Monthly Signals", group=timeframe_group)

risk_group = "=== RISK MANAGEMENT ==="
account_risk_daily = input.float(0.1, "Daily Risk %", minval=0, maxval=5, step=0.1, group=risk_group)
account_risk_weekly = input.float(0.075, "Weekly Risk %", minval=0, maxval=5, step=0.1, group=risk_group)
account_risk_monthly = input.float(0.05, "Monthly Risk %", minval=0, maxval=5, step=0.1, group=risk_group)

daily_stop_atr = input.float(1.5, "Daily Stop (ATR)", minval=0.5, maxval=5, step=0.5, group=risk_group)
weekly_stop_atr = input.float(2.5, "Weekly Stop (ATR)", minval=1, maxval=8, step=0.5, group=risk_group)
monthly_stop_atr = input.float(4.0, "Monthly Stop (ATR)", minval=2, maxval=12, step=0.5, group=risk_group)

daily_rr_ratio = input.float(2.0, "Daily R:R", minval=1.0, maxval=5.0, step=0.5, group=risk_group)
weekly_rr_ratio = input.float(3.0, "Weekly R:R", minval=1.0, maxval=6.0, step=0.5, group=risk_group)
monthly_rr_ratio = input.float(4.0, "Monthly R:R", minval=1.0, maxval=10.0, step=0.5, group=risk_group)

confluence_group = "=== CONFLUENCE THRESHOLDS ==="
daily_min_score = input.int(6, "Daily Min Score", minval=1, maxval=10, group=confluence_group)
weekly_min_score = input.int(7, "Weekly Min Score", minval=1, maxval=10, group=confluence_group)
monthly_min_score = input.int(8, "Monthly Min Score", minval=1, maxval=10, group=confluence_group)

smc_group = "=== SMC SETTINGS ==="
ob_length = input.int(20, "Order Block Lookback", minval=5, maxval=100, group=smc_group)
fvg_atr_mult = input.float(0.5, "FVG Min Size (ATR)", minval=0.1, maxval=2, step=0.1, group=smc_group)
liquidity_lookback = input.int(10, "Liquidity Lookback", minval=3, maxval=50, group=smc_group)
swing_lookback = input.int(50, "Swing Lookback", minval=20, maxval=200, group=smc_group)

visual_group = "=== VISUALS ==="
show_premium_discount = input.bool(true, "Premium/Discount Zones", group=visual_group)

// ============================================================================
// ATR CALCULATION - 核心参考指标
// ============================================================================

atr_period = 14
atr_value = ta.atr(atr_period)
atr_4h = request.security(syminfo.tickerid, "240", ta.atr(atr_period))
atr_daily = request.security(syminfo.tickerid, "D", ta.atr(atr_period))
atr_weekly = request.security(syminfo.tickerid, "W", ta.atr(atr_period))

// ============================================================================
// MULTI-TIMEFRAME DATA
// ============================================================================

ema20_4h = request.security(syminfo.tickerid, "240", ta.ema(close, 20))
ema50_4h = request.security(syminfo.tickerid, "240", ta.ema(close, 50))
ema20_daily = request.security(syminfo.tickerid, "D", ta.ema(close, 20))
ema50_daily = request.security(syminfo.tickerid, "D", ta.ema(close, 50))
ema20_weekly = request.security(syminfo.tickerid, "W", ta.ema(close, 20))
ema50_weekly = request.security(syminfo.tickerid, "W", ta.ema(close, 50))
ema12_monthly = request.security(syminfo.tickerid, "M", ta.ema(close, 12))
ema26_monthly = request.security(syminfo.tickerid, "M", ta.ema(close, 26))

// ============================================================================
// MARKET STRUCTURE
// ============================================================================

var float last_swing_high = na
var float last_swing_low = na

if ta.pivothigh(high, 3, 3)
    last_swing_high := high[3]
if ta.pivotlow(low, 3, 3)
    last_swing_low := low[3]

is_bullish_bos = not na(last_swing_high) and close > last_swing_high
is_bearish_bos = not na(last_swing_low) and close < last_swing_low

trend_bullish_4h = close > ema20_4h and ema20_4h > ema50_4h
trend_bearish_4h = close < ema20_4h and ema20_4h < ema50_4h
trend_bullish_daily = close > ema20_daily and close > ema50_daily
trend_bearish_daily = close < ema20_daily and close < ema50_daily
trend_bullish_weekly = close > ema20_weekly and close > ema50_weekly
trend_bearish_weekly = close < ema20_weekly and close < ema50_weekly
trend_bullish_monthly = close > ema12_monthly and close > ema26_monthly
trend_bearish_monthly = close < ema12_monthly and close < ema26_monthly

// ============================================================================
// PREMIUM/DISCOUNT ZONES
// ============================================================================

swing_range_high = ta.highest(high, swing_lookback)
swing_range_low = ta.lowest(low, swing_lookback)
swing_midpoint = (swing_range_high + swing_range_low) / 2

in_premium = close > swing_midpoint
in_discount = close < swing_midpoint

range_position = (swing_range_high != swing_range_low) ? ((close - swing_range_low) / (swing_range_high - swing_range_low)) * 100 : 50
deep_discount = range_position < 30
deep_premium = range_position > 70

// ============================================================================
// ORDER BLOCKS
// ============================================================================

var float bull_ob_high = na
var float bull_ob_low = na
var int bull_ob_bar = na
var float bear_ob_high = na
var float bear_ob_low = na
var int bear_ob_bar = na

if close[1] < open[1] and close > high[1] and (close - open) > (high[1] - low[1]) * 1.2
    bull_ob_high := high[1]
    bull_ob_low := low[1]
    bull_ob_bar := bar_index[1]

if close[1] > open[1] and close < low[1] and (open - close) > (high[1] - low[1]) * 1.2
    bear_ob_high := high[1]
    bear_ob_low := low[1]
    bear_ob_bar := bar_index[1]

in_bullish_ob = not na(bull_ob_high) and low <= bull_ob_high and high >= bull_ob_low and (bar_index - bull_ob_bar) < ob_length
in_bearish_ob = not na(bear_ob_high) and low <= bear_ob_high and high >= bear_ob_low and (bar_index - bear_ob_bar) < ob_length

bull_ob_fresh = not na(bull_ob_bar) and (bar_index - bull_ob_bar) < 10
bear_ob_fresh = not na(bear_ob_bar) and (bar_index - bear_ob_bar) < 10

// ============================================================================
// FAIR VALUE GAPS - 使用ATR作为阈值
// ============================================================================

fvg_threshold = atr_value * fvg_atr_mult
bullish_fvg = low > high[2] and (low - high[2]) >= fvg_threshold
bearish_fvg = high < low[2] and (low[2] - high) >= fvg_threshold

var float last_bull_fvg_top = na
var float last_bull_fvg_bottom = na
var float last_bear_fvg_top = na
var float last_bear_fvg_bottom = na

if bullish_fvg
    last_bull_fvg_top := low
    last_bull_fvg_bottom := high[2]

if bearish_fvg
    last_bear_fvg_top := low[2]
    last_bear_fvg_bottom := high

near_bullish_fvg = not na(last_bull_fvg_top) and low <= last_bull_fvg_top and high >= last_bull_fvg_bottom
near_bearish_fvg = not na(last_bear_fvg_top) and low <= last_bear_fvg_top and high >= last_bear_fvg_bottom

if near_bullish_fvg and low <= last_bull_fvg_bottom
    last_bull_fvg_top := na
    last_bull_fvg_bottom := na

if near_bearish_fvg and high >= last_bear_fvg_top
    last_bear_fvg_top := na
    last_bear_fvg_bottom := na

// ============================================================================
// LIQUIDITY SWEEPS
// ============================================================================

sellside_sweep = low < ta.lowest(low[1], liquidity_lookback) and close > open and close > low + (high - low) * 0.6
buyside_sweep = high > ta.highest(high[1], liquidity_lookback) and close < open and close < high - (high - low) * 0.6

var bool recent_ssl_sweep = false
var bool recent_bsl_sweep = false
var int ssl_sweep_bar = 0
var int bsl_sweep_bar = 0

if sellside_sweep
    recent_ssl_sweep := true
    ssl_sweep_bar := bar_index

if buyside_sweep
    recent_bsl_sweep := true
    bsl_sweep_bar := bar_index

if bar_index - ssl_sweep_bar > 10
    recent_ssl_sweep := false

if bar_index - bsl_sweep_bar > 10
    recent_bsl_sweep := false

// ============================================================================
// VOLUME FILTER
// ============================================================================

volume_avg = ta.sma(volume, 20)
volume_confirmation = volume > volume_avg * 1.2

// ============================================================================
// CONFLUENCE SCORING
// ============================================================================

daily_score = 0
if (trend_bullish_4h and trend_bullish_daily) or (trend_bearish_4h and trend_bearish_daily)
    daily_score += 2
if (in_bullish_ob and in_discount and trend_bullish_4h) or (in_bearish_ob and in_premium and trend_bearish_4h)
    daily_score += 2
if recent_ssl_sweep or recent_bsl_sweep
    daily_score += 1
if volume_confirmation
    daily_score += 1
if is_bullish_bos or is_bearish_bos
    daily_score += 1
if near_bullish_fvg or near_bearish_fvg
    daily_score += 1
daily_score += 1

weekly_score = 0
if (trend_bullish_weekly and trend_bullish_monthly) or (trend_bearish_weekly and trend_bearish_monthly)
    weekly_score += 2
if (trend_bullish_daily and trend_bullish_weekly) or (trend_bearish_daily and trend_bearish_weekly)
    weekly_score += 2
if (deep_discount and trend_bullish_weekly) or (deep_premium and trend_bearish_weekly)
    weekly_score += 2
if recent_ssl_sweep or recent_bsl_sweep
    weekly_score += 1
if in_bullish_ob or in_bearish_ob
    weekly_score += 1
if bull_ob_fresh or bear_ob_fresh
    weekly_score += 1
weekly_score += 1

monthly_score = 0
if (trend_bullish_monthly and trend_bullish_weekly) or (trend_bearish_monthly and trend_bearish_weekly)
    monthly_score += 2
if (in_bullish_ob and deep_discount) or (in_bearish_ob and deep_premium)
    monthly_score += 2
if recent_ssl_sweep or recent_bsl_sweep
    monthly_score += 2
if (trend_bullish_daily and trend_bullish_weekly and trend_bullish_monthly) or (trend_bearish_daily and trend_bearish_weekly and trend_bearish_monthly)
    monthly_score += 2
if range_position < 20 or range_position > 80
    monthly_score += 1
monthly_score += 1

// ============================================================================
// ENTRY CONDITIONS
// ============================================================================

daily_long_condition = enable_daily and daily_score >= daily_min_score and trend_bullish_4h and in_discount and (in_bullish_ob or recent_ssl_sweep or near_bullish_fvg) 
daily_short_condition = enable_daily and daily_score >= daily_min_score and trend_bearish_4h and in_premium and (in_bearish_ob or recent_bsl_sweep or near_bearish_fvg) 
weekly_long_condition = enable_weekly and weekly_score >= weekly_min_score and trend_bullish_weekly and trend_bullish_daily and in_discount and (in_bullish_ob or recent_ssl_sweep)
weekly_short_condition = enable_weekly and weekly_score >= weekly_min_score and trend_bearish_weekly and trend_bearish_daily and in_premium and (in_bearish_ob or recent_bsl_sweep)
monthly_long_condition = enable_monthly and monthly_score >= monthly_min_score and trend_bullish_monthly and trend_bullish_weekly and deep_discount and in_bullish_ob
monthly_short_condition = enable_monthly and monthly_score >= monthly_min_score and trend_bearish_monthly and trend_bearish_weekly and deep_premium and in_bearish_ob

// ============================================================================
// STOP LOSS CALCULATION - 基于ATR
// ============================================================================

daily_stop_distance = atr_4h * daily_stop_atr
weekly_stop_distance = atr_daily * weekly_stop_atr
monthly_stop_distance = atr_weekly * monthly_stop_atr

// ============================================================================
// POSITION SIZING 
// ============================================================================

calculate_position_size(risk_pct, stop_distance) =>
    risk_amount = strategy.equity * (risk_pct / 100)
    // 止损距离就是每单位的风险金额
    position = risk_amount / stop_distance

daily_contracts = calculate_position_size(account_risk_daily, daily_stop_distance)
weekly_contracts = calculate_position_size(account_risk_weekly, weekly_stop_distance)
monthly_contracts = calculate_position_size(account_risk_monthly, monthly_stop_distance)

// ============================================================================
// STRATEGY EXECUTION
// ============================================================================

if daily_long_condition
    strategy.entry("Daily Long", strategy.long, qty=daily_contracts)
    strategy.exit("DL Exit", "Daily Long", stop=close - daily_stop_distance, limit=close + (daily_stop_distance * daily_rr_ratio))

if daily_short_condition
    strategy.entry("Daily Short", strategy.short, qty=daily_contracts)
    strategy.exit("DS Exit", "Daily Short", stop=close + daily_stop_distance, limit=close - (daily_stop_distance * daily_rr_ratio))

if weekly_long_condition
    strategy.entry("Weekly Long", strategy.long, qty=weekly_contracts)
    strategy.exit("WL Exit", "Weekly Long", stop=close - weekly_stop_distance, limit=close + (weekly_stop_distance * weekly_rr_ratio))

if weekly_short_condition
    strategy.entry("Weekly Short", strategy.short, qty=weekly_contracts)
    strategy.exit("WS Exit", "Weekly Short", stop=close + weekly_stop_distance, limit=close - (weekly_stop_distance * weekly_rr_ratio))

if monthly_long_condition
    strategy.entry("Monthly Long", strategy.long, qty=monthly_contracts)
    strategy.exit("ML Exit", "Monthly Long", stop=close - monthly_stop_distance, limit=close + (monthly_stop_distance * monthly_rr_ratio))

if monthly_short_condition
    strategy.entry("Monthly Short", strategy.short, qty=monthly_contracts)
    strategy.exit("MS Exit", "Monthly Short", stop=close + monthly_stop_distance, limit=close - (monthly_stop_distance * monthly_rr_ratio))

// ============================================================================
// VISUALS 
// ============================================================================

p1 = plot(show_premium_discount ? swing_range_high : na, color=na)
p2 = plot(show_premium_discount ? swing_midpoint : na, "EQ", color.new(color.white, 50), 1)
p3 = plot(show_premium_discount ? swing_range_low : na, color=na)
fill(p1, p2, color.new(color.red, 92))
fill(p2, p3, color.new(color.green, 92))

plotshape(daily_long_condition, "D Long", shape.triangleup, location.belowbar, color.new(color.lime, 0), size=size.small, text="D")
plotshape(daily_short_condition, "D Short", shape.triangledown, location.abovebar, color.new(color.red, 0), size=size.small, text="D")
plotshape(weekly_long_condition, "W Long", shape.triangleup, location.belowbar, color.new(color.green, 0), size=size.normal, text="W")
plotshape(weekly_short_condition, "W Short", shape.triangledown, location.abovebar, color.new(color.maroon, 0), size=size.normal, text="W")
plotshape(monthly_long_condition, "M Long", shape.triangleup, location.belowbar, color.new(color.aqua, 0), size=size.large, text="M")
plotshape(monthly_short_condition, "M Short", shape.triangledown, location.abovebar, color.new(color.fuchsia, 0), size=size.large, text="M")

plotshape(sellside_sweep, "SSL", shape.labeldown, location.top, color.new(color.yellow, 20), size=size.tiny, text="SSL")
plotshape(buyside_sweep, "BSL", shape.labelup, location.bottom, color.new(color.yellow, 20), size=size.tiny, text="BSL")
plotshape(is_bullish_bos, "BOS↑", shape.circle, location.belowbar, color.new(color.lime, 50), size=size.tiny)
plotshape(is_bearish_bos, "BOS↓", shape.circle, location.abovebar, color.new(color.red, 50), size=size.tiny)