Back to Research
Day Trading 12 min read

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.

Published December 15, 2022 Updated February 25, 2026
Spot Trend Days Early in the Morning (Market Internal Clues)
10-12%Sessions That Are True Trend Days
30 MinWindow to Identify After the Open
1.5+ ATRTypical Range of a Trend Day Session
80%+Accuracy When Multiple Internals Align

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.

Pre-Market Checklist for Trend Day Identification: Check overnight futures range, identify key levels from the prior session, review the economic calendar for catalysts, assess gap size relative to ATR, and note whether the pre-market range is expanding or contracting. This 10-minute routine dramatically improves your ability to read the opening 30 minutes.

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 TypeSize vs ATRTrend Day ProbabilityRecommended Action
Small GapLess than 25% ATRLow (5-8%)Wait for OR confirmation
Medium Gap25-50% ATRModerate (15-20%)Monitor internals for alignment
Large Gap50-100% ATRHigh (30-40%)Prepare for continuation
Extreme GapGreater than 100% ATRVery 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 Measurement ScriptThinkScript
# 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 Breakout with ATR ContextThinkScript
# 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);
Key Takeaway: A narrow opening range (less than 30% of ATR) that breaks out with volume confirmation is one of the most reliable early trend day signals. When this aligns with a gap hold and one-sided internals, trend day probability exceeds 70%.

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 and Slope MonitorThinkScript
# 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 IndicatorBullish Trend SignalBearish Trend SignalNeutral Signal
TICK 10-period MASustained above +200Sustained below -200Oscillating near zero
ADD CumulativeAbove +1500 first hourBelow -1500 first hourBetween -500 and +500
VOLD RatioGreater than 3:1 upGreater than 3:1 downBetween 1:1 and 2:1
TICK ExtremesMultiple above +800Multiple below -800Bound -500 to +500
Combined Score3-4 bullish signals3-4 bearish signalsMixed readings
Market Internals Trend Day DashboardThinkScript
# 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:

  1. Gap Analysis: Gap exceeds 50% of ATR and holds in the first 15 minutes (1 point)
  2. Opening Range: 30-minute OR is less than 30% of ATR with a clean breakout (1 point)
  3. VWAP Behavior: Price separates from VWAP with zero touches after the first 30 minutes (1 point)
  4. Market Internals: At least 2 of 3 internals (TICK, ADD, VOLD) confirm direction (1 point)
  5. Volume Profile: First 30-minute volume exceeds the 20-day average for that period (1 point)
Scoring Guide: A score of 1-2 suggests normal conditions with no trend day advantage. A score of 3 indicates elevated probability (approximately 50-60%). A score of 4-5 represents a high-confidence setup where aggressive positioning is warranted. Track scores daily for at least 30 sessions to calibrate the system.

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.

Caution: The TTM Squeeze alone does not identify trend days. Many squeeze releases occur during range-bound sessions where price expands briefly before reverting. Always require confirmation from intraday signals (gap, VWAP, internals) before treating a squeeze release as a trend day catalyst.

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.

Recommended Layout:
  • 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 LabelThinkScript
# 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.

Caution: Avoid counter-trend trading on confirmed trend days. The instinct to fade the move at perceived extremes destroys accounts on trend days because the usual mean-reversion signals fail. If your composite score indicates a trend day, trade only in the confirmed direction until the score deteriorates or the session nears its close.

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.

Key Takeaway: Trend day identification is a probability exercise. Your goal is to identify sessions where 3+ independent factors align, position accordingly, and manage the trade with a trailing stop. Over 30+ sessions, this systematic approach produces significantly better results than discretionary guessing.

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.

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.
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.
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.
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.
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.
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