
대부분의 거래자들은 EMA를 단일 시간 프레임으로 교차하고 있습니다. 오늘 날씨를 보고 일주일 동안 무엇을 입어야할지 결정하는 것과 마찬가지로 신뢰할 수 없습니다. 이 전략이 얼마나 강력한가? 1분과 5분 EMA 클라우드 그래프를 동시에 모니터링하는 것은 마치 날씨 예보 + 실시간 기상 스테이션의 이중 보장이있는 것과 같습니다.
구덩이 안내서가 왔어요!이 전략의 가장 똑똑한 부분은 거래 거부 기능입니다.
이것은 마치 슈퍼-논리적 거래 보조자가 시장의 감정이 통제되지 않을 때 “아, 지금은 아니야!“라고 말하는 것과 같다고 상상해보세요.
이 전략은 시장을 4단계로 나누고, 마치 시장에 대한 ‘감정 분석’을 하는 것과 같습니다.
“RANGE BOUND”이 표시되면 커피 한 잔을 마시고 더 나은 기회를 기다려야 한다는 것을 알 수 있습니다.
이 전략이 어떤 문제를 해결하는 데 도움이 될까요?
기억하세요, 최고의 거래 전략은 더 많이 거래하는 것이 아니라 더 정확하게 거래하는 것입니다. 이 클라우드 이 전략은 당신에게 기회를 잡을 수 있고 위험으로부터 보호할 수 있는 전문적인 ‘거래 수호자’를 부여하는 것과 같습니다.
/*backtest
start: 2025-01-01 00:00:00
end: 2025-09-24 00:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT","balance":500000}]
*/
//@version=5
strategy("EMA Crossover Cloud w/Range-Bound Filter", overlay=true, default_qty_type=strategy.fixed, default_qty_value=500, initial_capital=50000)
// === INPUTS ===
rsi_length = input.int(14, "RSI Length")
rsi_overbought = input.int(70, "RSI Overbought Level")
rsi_oversold = input.int(30, "RSI Oversold Level")
ema_fast_1m = input.int(10, "1m Cloud Fast EMA")
ema_slow_1m = input.int(20, "1m Cloud Slow EMA")
ema_fast_5m = input.int(10, "5m Cloud Fast EMA")
ema_slow_5m = input.int(20, "5m Cloud Slow EMA")
volume_multiplier = input.float(1.3, "Volume Multiplier (vs 20-bar avg)")
// === STAY OUT FILTER INPUTS ===
enable_stay_out_filter = input.bool(true, "Enable Stay Out Filter", group="Range-Bound Filter")
enable_filter_for_backtest = input.bool(false, "Apply Filter to Backtest", group="Range-Bound Filter")
range_threshold_pct = input.float(0.5, "Max Range % for Stay Out", group="Range-Bound Filter")
range_period = input.int(60, "Period to Check Range (bars)", group="Range-Bound Filter")
min_bars_in_range = input.int(25, "Min Bars in Range to Trigger", group="Range-Bound Filter")
// === MARKET ATTENTION INPUTS ===
volume_attention_multiplier = input.float(2.0, "Volume Multiplier for Attention", group="Market Attention")
range_attention_threshold = input.float(1.5, "Range ($) Threshold for Attention", group="Market Attention")
// === CALCULATIONS ===
rsi = ta.rsi(close, rsi_length)
volume_avg = ta.sma(volume, 20)
volume_surge = volume > (volume_avg * volume_multiplier)
// Multi-timeframe EMAs
ema_fast_1m_val = ta.ema(close, ema_fast_1m)
ema_slow_1m_val = ta.ema(close, ema_slow_1m)
ema_fast_5m_val = request.security(syminfo.tickerid, "5", ta.ema(close, ema_fast_5m))
ema_slow_5m_val = request.security(syminfo.tickerid, "5", ta.ema(close, ema_slow_5m))
// === STAY OUT FILTER ===
// Range-bound detection: Count consecutive tight-range bars
range_threshold_dollar = close * (range_threshold_pct / 100) // Convert % to dollar amount
// Calculate current bar's range
current_bar_range = high - low
// Count consecutive tight-range bars
var int consecutive_tight_bars = 0
// Check if current bar is within tight range threshold
current_bar_tight = current_bar_range <= range_threshold_dollar
if current_bar_tight
consecutive_tight_bars := consecutive_tight_bars + 1
else
consecutive_tight_bars := 0 // Reset counter when range expands
tight_range_bars = consecutive_tight_bars
// Market is range-bound if we've had enough consecutive tight bars
market_range_bound = enable_stay_out_filter and tight_range_bars >= min_bars_in_range
market_ok_to_trade = not market_range_bound
// Separate condition for backtest - can override the filter
backtest_ok_to_trade = enable_filter_for_backtest ? market_ok_to_trade : true
// For display purposes, also calculate recent period range
highest_in_period = ta.highest(high, range_period)
lowest_in_period = ta.lowest(low, range_period)
dollar_range = highest_in_period - lowest_in_period
// Consolidation stage determination
consolidation_stage = tight_range_bars < min_bars_in_range ? "TRENDING" :
tight_range_bars <= 60 ? "RANGE BOUND" :
tight_range_bars <= 90 ? "COILING" : "LOADING"
consolidation_color = consolidation_stage == "TRENDING" ? color.green :
consolidation_stage == "RANGE BOUND" ? color.red :
consolidation_stage == "COILING" ? color.yellow : color.orange
// === MARKET ATTENTION GAUGE ===
// Current bar activity indicators
current_range = high - low
recent_volume_avg = ta.sma(volume, 10)
volume_spike = volume > (recent_volume_avg * volume_attention_multiplier)
range_expansion = current_range > range_attention_threshold
// Activity level determination
market_activity = volume_spike and range_expansion ? "ACTIVE" :
volume_spike or range_expansion ? "BUILDING" :
not market_range_bound ? "QUIET" : "DEAD"
// Cloud Definitions
cloud_1m_bull = ema_fast_1m_val > ema_slow_1m_val
cloud_5m_bull = ema_fast_5m_val > ema_slow_5m_val
// Price position relative to clouds
price_above_5m_cloud = close > math.max(ema_fast_5m_val, ema_slow_5m_val)
price_below_5m_cloud = close < math.min(ema_fast_5m_val, ema_slow_5m_val)
// === CROSSOVER SIGNALS ===
// When 1m fast crosses above/below 1m slow with volume
crossoverBull = ta.crossover(ema_fast_1m_val, ema_slow_1m_val) and volume_surge and backtest_ok_to_trade
crossoverBear = ta.crossunder(ema_fast_1m_val, ema_slow_1m_val) and volume_surge and backtest_ok_to_trade
// Visual warnings for blocked signals (always uses the indicator filter, not backtest filter)
blocked_crossover_bull = ta.crossover(ema_fast_1m_val, ema_slow_1m_val) and volume_surge and market_range_bound
blocked_crossover_bear = ta.crossunder(ema_fast_1m_val, ema_slow_1m_val) and volume_surge and market_range_bound
// === STRATEGY EXECUTION ===
// Crossover entries (original 1/3 size from diamonds)
if crossoverBull
strategy.entry("Cross Long", strategy.long, qty=167)
if crossoverBear
strategy.entry("Cross Short", strategy.short, qty=167)
// === EXIT LOGIC ===
// Conservative stops using recent swing levels (not wide cloud stops)
longStop = ta.lowest(low[3], 10) // Recent swing low
shortStop = ta.highest(high[3], 10) // Recent swing high
// Position management exits
price_above_1m_cloud = close > math.max(ema_fast_1m_val, ema_slow_1m_val)
price_below_1m_cloud = close < math.min(ema_fast_1m_val, ema_slow_1m_val)
// Exit when price breaks opposite cloud structure
longExit = price_below_1m_cloud and price_below_5m_cloud
shortExit = price_above_1m_cloud and price_above_5m_cloud
// Execute exits for all positions
if strategy.position_size > 0
if close <= longStop
strategy.close_all(comment="Stop Loss")
else if longExit or rsi >= rsi_overbought
strategy.close_all(comment="Exit Signal")
if strategy.position_size < 0
if close >= shortStop
strategy.close_all(comment="Stop Loss")
else if shortExit or rsi <= rsi_oversold
strategy.close_all(comment="Exit Signal")
// === VISUAL ELEMENTS ===
plotshape(crossoverBull, "CROSS BULL", shape.triangleup, location.belowbar,
color.new(color.aqua, 50), size=size.small, text="↑")
plotshape(crossoverBear, "CROSS BEAR", shape.triangledown, location.abovebar,
color.new(color.orange, 50), size=size.small, text="↓")
// STAY OUT warnings - signals you should see but not take
plotshape(blocked_crossover_bull, "BLOCKED BULL", shape.triangleup, location.belowbar,
color.new(color.gray, 0), size=size.tiny, text="RANGE")
plotshape(blocked_crossover_bear, "BLOCKED BEAR", shape.triangledown, location.abovebar,
color.new(color.gray, 0), size=size.tiny, text="RANGE")
// Clouds with abbreviated titles
ema1 = plot(ema_fast_1m_val, "1F", color.new(color.blue, 60), linewidth=1, display=display.none)
ema2 = plot(ema_slow_1m_val, "1S", color.new(color.blue, 60), linewidth=1, display=display.none)
fill(ema1, ema2, color=cloud_1m_bull ? color.new(color.green, 85) : color.new(color.red, 85))
ema3 = plot(ema_fast_5m_val, "5F", color.new(color.orange, 40), linewidth=2, display=display.none)
ema4 = plot(ema_slow_5m_val, "5S", color.new(color.orange, 40), linewidth=2, display=display.none)
fill(ema3, ema4, color=cloud_5m_bull ? color.new(color.blue, 85) : color.new(color.purple, 85))
// === ALERTS ===
// Consolidation stage changes
alertcondition(consolidation_stage == "RANGE BOUND" and consolidation_stage[1] == "TRENDING", "Range Bound Alert", "🔴 TSLA RANGE BOUND - Stay Out!")
alertcondition(consolidation_stage == "COILING" and consolidation_stage[1] == "RANGE BOUND", "Coiling Alert", "🟡 TSLA COILING - Watch Close!")
alertcondition(consolidation_stage == "LOADING" and consolidation_stage[1] == "COILING", "Loading Alert", "🟠 TSLA LOADING - Big Move Coming!")
alertcondition(consolidation_stage == "TRENDING" and consolidation_stage[1] != "TRENDING", "Breakout Alert", "🟢 TSLA BREAKOUT - Back to Trading!")
// Market attention changes
alertcondition(market_activity == "ACTIVE" and market_activity[1] != "ACTIVE", "Market Active", "🔥 TSLA ACTIVE - Watch Close!")
alertcondition(market_activity == "DEAD" and market_activity[1] != "DEAD", "Market Dead", "💀 TSLA DEAD - Handle Other Business")
// Blocked signals
alertcondition(blocked_crossover_bull or blocked_crossover_bear, "Signal Blocked", "⚠️ SIGNAL BLOCKED - Range Bound Period")