
MTF, SMC, EMA, OB, FVG, BOS, SSL
このESの多周期SMC戦略を見て,すぐにこう結論付けました:これは私が見た中で最も完全なSmart Money Conceptsの実現の一つです. 3つの日/週/月の時間枠があり,それぞれに独立したリスク管理パラメータがあります.
日線リスク1%,周線0.75%,月線0.5% - この減減設計は賢明である. 長周期シグナルはより高い正確性があるが,長期間保有するので,ポジションを下げることは正しい. 止損設定12/40/100ポイント,リスクリターン比は2:3:4です. データが示すように,時間枠が長くなるほど,与えられたスペースは大きくなるほど,要求されたリターンも高くなります.
このシステムの中心は,SMCの3つの要素の完璧な組み合わせです: 注文ブロック,フェアバリューギャップ,構造の破綻. 単純な移動平均の交差ではなく,実際に機関資金の足跡を追跡しています.
注文ブロック検出論理:前K線は陰/陽で,現在の価格は前高/低を突破し,突破幅は前K線実体より1.2倍以上である.この1.2倍という値設計は重要な - ほとんどの偽の突破をフィルタリングし,本当に強力な機関行動のみを捕捉する.
FVGはより直接的に識別される:現在の最低価格は2つのK線前の最高価格より高く,ギャップの大きさは調整できる.価格がギャップ領域に戻ると潜在的反転点である.回測データによると,トレンド方向のFVGの補足は,勝利率は70%以上に達する.
私が最も感銘を受けたのは,流動性の掃描 (Liquidity Sweep) の実現です. システムは,価格が過去10K線の高点や低点を突破したかどうかを検出し,すぐに逆転します. これは典型的な”Stop Hunt”です.
売り方流動性掃描:価格創新は低だが,閉盘価格はK線上半部分に戻り,取引量が増大する.買い方流動性掃描:価格創新は高だが,閉盘価格はK線下半部分に戻る.この識別論理は,指数機関の操縦手法に直接,推測ではなく,従うものである.
策略の最も賢明なところは,融合スコアメカニズムである. 日線最低6点,周線最低7点,月線最低8点でポジションを開く. 各条件には明確なスコアがあります:
この評価は頭で作ったものではなく,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)