
MTF, SMC, EMA, OB, FVG, BOS, SSL
Посмотрев на эту ES многоциклическую стратегию SMC, я сразу же пришел к выводу: это одна из самых полных реализаций Smart Money Concepts, которые я когда-либо видел.
Риск солнечной линии 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-линиями, разрыв может быть скорректирован. В случае, если цена возвращается в зону разрыва, то это потенциальная точка разворота.
Наиболее впечатляющим для меня было то, что внедряется Liquidity Sweep. Система обнаруживает, пробились ли цены высокие или низкие точки на прошлых 10 K-линиях, и сразу же переворачивает. Это типичный “Stop Hunt” - агентство сначала прочищает остановки розничных торговцев, а затем работает в истинном направлении.
Продавец ликвидность очистка: цена инновации низкая, но цена закрытия возвращается к верхней половине линии K, объем торгов увеличивается. Покупатель ликвидность очистка: цена инноваций высокая, но цена закрытия возвращается к нижней половине линии K. Эта логика идентификации непосредственно к методу манипулирования рейтинговых агентств, а не в догадках, а в следовании.
Наиболее разумным вариантом стратегии является система слияния баллов. Минимальные баллы для открытия позиции составляют 6 баллов на солнечной линии, 7 баллов на круговой линии и 8 баллов на лунной линии.
Эта оценка не придуманная, а количественная реализация, основанная на теории SMC. Чем выше балл, тем больше вероятность вмешательства финансовых учреждений.
В стратегию добавлена временная фильтрация: оптимальное время входа - с 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)