Spot Trend Days Early in the Morning (Market Internal Clues)
Learn how to identify trend days within the first 30-60 minutes using opening range analysis, VWAP distance, market internals (TICK, ADD, VOLD), gap analysis, and ThinkOrSwim indicators with ThinkScript code.
- What Makes a Trend Day Different from Every Other Session
- Pre-Market Preparation: Setting Up Before the Bell
- Gap Analysis: The First Signal Before Price Prints
- Opening Range Analysis: The 30-Minute Framework
- VWAP Distance Measurement: Tracking Institutional Commitment
- Market Internals in the First Hour: TICK, ADD, and VOLD
- Combining Signals: The Multi-Factor Confirmation Framework
- The TTM Squeeze and Trend Day Context
- ThinkOrSwim Workspace Setup for Trend Day Scanning
- Managing Positions on Confirmed Trend Days
- Common Mistakes and How to Avoid Them
- Tool Links
- Frequently Asked Questions
What Makes a Trend Day Different from Every Other Session
Trend days represent the highest-opportunity sessions in the market. Price moves directionally with minimal pullbacks, closing at or near the extreme of the day. These sessions account for roughly 10-12% of all trading days, yet they generate outsized returns for traders who recognize them early.
The challenge is straightforward: most traders fail to identify trend days until halfway through the session, or they misidentify normal sessions as trend days and get chopped apart. Developing a systematic morning routine using thinkorswim indicators solves both problems.
Trend days share specific characteristics that become visible within the first 30-60 minutes: directional gap behavior, VWAP separation patterns, one-sided market internals, and opening range expansion. When you read these signals together, you can position yourself correctly while most traders are still guessing.
Pre-Market Preparation: Setting Up Before the Bell
Trend day identification starts before 9:30 AM ET. A structured pre-market routine helps you walk into the session with a bias framework instead of reacting to price after the fact.
Start by measuring the overnight range in ES, NQ, or your primary instrument. A narrow overnight range followed by a gap open beyond the prior day's range creates a setup where trend days frequently develop. The market stores energy during compressed sessions and releases it directionally.
Check the economic calendar next. Trend days often align with major data releases (FOMC, CPI, NFP) or unexpected geopolitical developments. While not every catalyst day produces a trend, having a fundamental reason for directional movement increases the probability that early momentum sustains through the close.
Gap Analysis: The First Signal Before Price Prints
The opening gap is your earliest trend day indicator. Not all gaps lead to trend days, but nearly all trend days begin with a meaningful gap. Understanding gap classification helps you filter high-probability setups from noise.
| Gap Type | Size vs ATR | Trend Day Probability | Recommended Action |
|---|---|---|---|
| Small Gap | Less than 25% ATR | Low (5-8%) | Wait for OR confirmation |
| Medium Gap | 25-50% ATR | Moderate (15-20%) | Monitor internals for alignment |
| Large Gap | 50-100% ATR | High (30-40%) | Prepare for continuation |
| Extreme Gap | Greater than 100% ATR | Very High (50%+) | Assume trend until disproven |
Gaps exceeding 50% of the average true range deserve immediate attention. These gaps indicate significant overnight positioning, where the opening price represents a new valuation level rather than a temporary dislocation.
The critical distinction is between gaps that fill and gaps that hold. Trend day gaps typically hold within the first 15 minutes. If price tests the gap edge and reverses back in the gap direction, this is a strong early confirmation signal. Use volatility box levels to define gap fill zones and continuation targets.
# Gap Size Relative to ATR
def priorClose = close(period = AggregationPeriod.DAY)[1];
def todayOpen = open(period = AggregationPeriod.DAY);
def gapSize = AbsValue(todayOpen - priorClose);
def atr14 = Average(TrueRange(high(period = AggregationPeriod.DAY), close(period = AggregationPeriod.DAY), low(period = AggregationPeriod.DAY)), 14);
def gapPctATR = (gapSize / atr14) * 100;
AddLabel(yes, "Gap: " + AsPercent(gapSize / priorClose) + " | ATR%: " + Round(gapPctATR, 1) + "%",
if gapPctATR >= 50 then Color.GREEN
else if gapPctATR >= 25 then Color.YELLOW
else Color.GRAY);
def gapDir = if todayOpen > priorClose then 1 else -1;
AddLabel(yes, "Gap: " + (if gapDir == 1 then "UP" else "DOWN"),
if gapDir == 1 then Color.GREEN else Color.RED);Opening Range Analysis: The 30-Minute Framework
The opening range (OR) is the price range established during the first 30 minutes. On trend days, the opening range behaves distinctly compared to rotational sessions.
On a trend day, the opening range is typically narrow relative to the expected daily range. Price breaks out decisively and does not return. This contrasts with range days where price repeatedly tests both sides of the OR throughout the session.
Measure the OR width against ATR. If the 30-minute opening range is less than 30% of the 14-period daily ATR, the market is compressing. A breakout from a compressed OR, combined with gap confirmation, creates one of the highest-probability trend day signals available.
# Opening Range with ATR Comparison
input ORLength = 30;
def marketOpen = 0930;
def ORActive = SecondsFromTime(marketOpen) >= 0 and
SecondsFromTime(marketOpen) < ORLength * 60;
def ORHigh = if ORActive and !ORActive[1] then high
else if ORActive then Max(ORHigh[1], high) else ORHigh[1];
def ORLow = if ORActive and !ORActive[1] then low
else if ORActive then Min(ORLow[1], low) else ORLow[1];
def ORWidth = ORHigh - ORLow;
def dailyATR = Average(TrueRange(high(period = AggregationPeriod.DAY),
close(period = AggregationPeriod.DAY),
low(period = AggregationPeriod.DAY)), 14);
def ORpctATR = (ORWidth / dailyATR) * 100;
plot ORHighLine = if !ORActive and !IsNaN(close) then ORHigh else Double.NaN;
plot ORLowLine = if !ORActive and !IsNaN(close) then ORLow else Double.NaN;
ORHighLine.SetDefaultColor(Color.CYAN);
ORLowLine.SetDefaultColor(Color.CYAN);
AddLabel(yes, "OR Width: " + Round(ORWidth, 2) + " | ATR%: " + Round(ORpctATR, 1) + "%",
if ORpctATR < 30 then Color.GREEN
else if ORpctATR < 50 then Color.YELLOW else Color.RED);VWAP Distance Measurement: Tracking Institutional Commitment
Volume Weighted Average Price (VWAP) serves as the institutional benchmark for fair value. On trend days, price separates from VWAP early and continues distancing itself throughout the day. This separation reflects persistent institutional buying or selling pressure.
On normal sessions, price oscillates around VWAP, touching or crossing it multiple times. On trend days, price touches VWAP zero or one time after the opening range establishes. The VWAP slope provides additional confirmation: on trend days, VWAP establishes a clear directional slope within the first 45 minutes and maintains it.
# VWAP Distance Monitor for Trend Day Detection
def vwapValue = vwap;
def vwapDist = close - vwapValue;
def atrVal = Average(TrueRange(high(period = AggregationPeriod.DAY),
close(period = AggregationPeriod.DAY),
low(period = AggregationPeriod.DAY)), 14);
def vwapSlope = vwapValue - vwapValue[10];
def vwapTouch = if AbsValue(low - vwapValue) < 0.5 or
AbsValue(high - vwapValue) < 0.5 then 1 else 0;
def touchCount = if SecondsFromTime(0930) == 0 then 0
else touchCount[1] + vwapTouch;
AddLabel(yes, "VWAP Dist: " + Round(vwapDist, 2) + " | Touches: " + touchCount,
if AbsValue(vwapDist) > atrVal * 0.15 and touchCount <= 1
then Color.GREEN else Color.YELLOW);Using volatility box for futures alongside VWAP measurements creates a layered approach. The volatility box defines expected range boundaries while VWAP tracks institutional flow within those boundaries.
Market Internals in the First Hour: TICK, ADD, and VOLD
Market internals are the most underused trend day identification tool among retail traders. The NYSE TICK, Advance-Decline (ADD), and Up Volume-Down Volume (VOLD) indicators provide a direct read on breadth and participation that price alone cannot reveal.
On bullish trend days, TICK readings consistently stay above zero with spikes above +800. For bearish trend days, TICK stays below zero with readings below -800. Calculate a 10-period moving average of TICK on a 5-minute chart. If this average stays above +200 (or below -200) during the first hour, trend day conditions are developing.
The ADD indicator shows advancing versus declining stocks. Look for the cumulative ADD to reach extreme readings (above +1500 or below -1500) within the first 60 minutes, indicating broad market participation. VOLD measures whether volume flows into advancing or declining stocks. A VOLD ratio above 3:1 in the first hour is a strong trend day signal.
| Internal Indicator | Bullish Trend Signal | Bearish Trend Signal | Neutral Signal |
|---|---|---|---|
| TICK 10-period MA | Sustained above +200 | Sustained below -200 | Oscillating near zero |
| ADD Cumulative | Above +1500 first hour | Below -1500 first hour | Between -500 and +500 |
| VOLD Ratio | Greater than 3:1 up | Greater than 3:1 down | Between 1:1 and 2:1 |
| TICK Extremes | Multiple above +800 | Multiple below -800 | Bound -500 to +500 |
| Combined Score | 3-4 bullish signals | 3-4 bearish signals | Mixed readings |
# Market Internals Trend Day Score
def tickValue = close("$TICK");
def tickMA = Average(tickValue, 10);
def tickBullish = if tickMA > 200 then 1 else 0;
def tickBearish = if tickMA < -200 then 1 else 0;
def addValue = close("$ADD");
def addBullish = if addValue > 1500 then 1 else 0;
def addBearish = if addValue < -1500 then 1 else 0;
def voldValue = close("$VOLD");
def voldBullish = if voldValue > 3 then 1 else 0;
def voldBearish = if voldValue < -3 then 1 else 0;
def bullScore = tickBullish + addBullish + voldBullish;
def bearScore = tickBearish + addBearish + voldBearish;
AddLabel(yes, "Bull: " + bullScore + "/3",
if bullScore >= 2 then Color.GREEN else Color.GRAY);
AddLabel(yes, "Bear: " + bearScore + "/3",
if bearScore >= 2 then Color.RED else Color.GRAY);
AddLabel(yes,
if bullScore >= 2 then "TREND DAY ALERT: BULLISH"
else if bearScore >= 2 then "TREND DAY ALERT: BEARISH"
else "NO TREND SIGNAL",
if bullScore >= 2 then Color.GREEN
else if bearScore >= 2 then Color.RED else Color.GRAY);Combining Signals: The Multi-Factor Confirmation Framework
No single indicator reliably identifies trend days in isolation. The power comes from combining multiple independent signals into a scoring framework. When three or more factors align, trend day probability increases dramatically.
Build your scoring system around five core factors:
- Gap Analysis: Gap exceeds 50% of ATR and holds in the first 15 minutes (1 point)
- Opening Range: 30-minute OR is less than 30% of ATR with a clean breakout (1 point)
- VWAP Behavior: Price separates from VWAP with zero touches after the first 30 minutes (1 point)
- Market Internals: At least 2 of 3 internals (TICK, ADD, VOLD) confirm direction (1 point)
- Volume Profile: First 30-minute volume exceeds the 20-day average for that period (1 point)
Trend days are confirmed by convergence, not by any single metric. Thinkorswim scanners can automate parts of this scoring process, alerting you when multiple conditions trigger simultaneously.
The TTM Squeeze and Trend Day Context
The TTM Squeeze on thinkorswim provides valuable context when applied to higher timeframes. A daily chart squeeze that fires on the same day as strong morning signals creates a particularly powerful setup.
When the TTM Squeeze dots shift from red (squeeze on) to green (squeeze off) on the daily chart, volatility compression has resolved into expansion. If this squeeze release coincides with your morning trend day signals, the session has elevated probability of producing an extended directional move.
ThinkOrSwim Workspace Setup for Trend Day Scanning
Efficient trend day identification requires a dedicated workspace. Organize your screens to deliver maximum information density without clutter.
- Screen 1: Primary instrument with VWAP, opening range, and gap levels overlaid
- Screen 2: Market internals panel with TICK, ADD, and VOLD (5-min timeframe)
- Screen 3: Volume profile chart with developing POC and value area
- Screen 4: Daily chart with TTM Squeeze and ATR reference
Use thinkorswim scripts for day trading custom label studies to display your trend day score directly on the chart. This eliminates manual calculation during the fast-moving opening period.
# Trend Day Composite Score
input atrPeriod = 14;
input orMinutes = 30;
def dailyATR = Average(TrueRange(high(period = AggregationPeriod.DAY),
close(period = AggregationPeriod.DAY),
low(period = AggregationPeriod.DAY)), atrPeriod);
# Factor 1: Gap Size
def priorClose = close(period = AggregationPeriod.DAY)[1];
def todayOpen = open(period = AggregationPeriod.DAY);
def gapPct = AbsValue(todayOpen - priorClose) / dailyATR * 100;
def gapScore = if gapPct >= 50 then 1 else 0;
# Factor 2: Opening Range Compression
def mktOpen = 0930;
def orActive = SecondsFromTime(mktOpen) >= 0 and
SecondsFromTime(mktOpen) < orMinutes * 60;
def orH = if orActive and !orActive[1] then high
else if orActive then Max(orH[1], high) else orH[1];
def orL = if orActive and !orActive[1] then low
else if orActive then Min(orL[1], low) else orL[1];
def orPctATR = ((orH - orL) / dailyATR) * 100;
def orScore = if orPctATR < 30 then 1 else 0;
# Factor 3: VWAP Distance
def vwapDist = AbsValue(close - vwap);
def vwapScore = if vwapDist > dailyATR * 0.1 then 1 else 0;
def totalScore = gapScore + orScore + vwapScore;
AddLabel(yes, "TREND SCORE: " + totalScore + "/3 | Gap: " +
Round(gapPct, 0) + "% | OR: " + Round(orPctATR, 0) + "%",
if totalScore >= 3 then Color.GREEN
else if totalScore == 2 then Color.YELLOW else Color.RED);Managing Positions on Confirmed Trend Days
Identifying a trend day is only half the equation. Position management on trend days differs fundamentally from standard day trading approaches.
On confirmed trend days, reduce trading frequency. Establish a position in the trend direction during the first hour and hold it with a trailing stop rather than scalping in and out. Set your initial stop below the opening range low (bullish) or above the opening range high (bearish). Trail your stop using VWAP or the 20-period EMA on the 5-minute chart.
Add to your position on shallow pullbacks. The first and second pullbacks to the 8 or 20 EMA on a 5-minute chart offer re-entry points. Avoid adding after the third pullback, as momentum typically fades in the final 90 minutes.
Common Mistakes and How to Avoid Them
Mistake 1: Declaring a trend day too early. Wait for the full 30-minute opening range. Many sessions open with apparent momentum that fades within the first half hour.
Mistake 2: Ignoring internals divergence. Price may move directionally while internals are mixed. If TICK trends lower while price makes new highs, the move lacks breadth. Trend days require internals alignment.
Mistake 3: Abandoning the thesis on the first pullback. Trend days do have pullbacks, but they are shallow and brief. Exiting on the first red bar (in a bullish trend day) is a common and costly error.
Mistake 4: Using fixed profit targets. Trend days exceed normal range expectations by definition. Switch to a trailing stop approach when a trend day is confirmed.
Mistake 5: Failing to track results. Keep a log of identifications versus outcomes. Use thinkorswim scripts for day trading to automate parts of this tracking.
Tool Links
- Volatility Box - Define expected daily range boundaries for any instrument
- Volatility Box for Futures - Futures-specific range and level calculations
- TTM Squeeze Course - Master volatility compression and expansion patterns
- ThinkOrSwim Indicators - Full library of custom ThinkScript studies and scanners
Frequently Asked Questions
How early can you realistically identify a trend day?
The earliest reliable window is 30-45 minutes after the open. Pre-market analysis provides a preliminary bias, but confirmation from the opening range, VWAP behavior, and market internals requires at least 30 minutes of regular session data. Attempting identification in the first 10-15 minutes leads to frequent false signals.
Do trend days work the same way on futures versus individual stocks?
The core principles apply across instruments, but thresholds differ. Futures (ES, NQ, RTY) produce cleaner signals because market internals directly measure the underlying index components. For individual stocks, focus more on volume, VWAP behavior, and relative strength versus the sector rather than NYSE internals.
What percentage of trading days are actual trend days?
Research across multiple decades of S&P 500 data shows approximately 10-12% of sessions qualify as true trend days. Another 15-20% are partial trend days where the morning trends but the afternoon reverses. Your composite scoring system helps distinguish between these categories during the first hour.
Can thinkorswim indicators automate trend day identification?
ThinkOrSwim indicators can automate approximately 70-80% of the process through custom studies, labels, and alerts. Gap measurement, opening range calculation, VWAP tracking, and internals scoring all run automatically. The remaining 20-30% involves discretionary judgment about price action quality and catalyst assessment.
How should position sizing change on confirmed trend days?
Many experienced traders increase size by 25-50% on confirmed trend days (score of 4-5) because the reward-to-risk profile improves substantially. The wider expected range combined with a defined stop creates favorable R multiples. Only increase size after validating your scoring system over at least 30 sessions.
What happens if the trend day thesis fails after the first hour?
Failed signals typically become apparent when price returns to VWAP and the internals score drops below 2. Reduce or exit your trend position and switch to a range-trading approach. The transition from trend to range usually happens between 10:30 and 11:30 AM ET. Having a clear invalidation point prevents holding a directional position during a rotational session.
Ready to Trade With an Edge?
Join 40,000+ traders using institutional-grade tools for ThinkOrSwim.
Get the Bundle