Strasmore Research
Deep Dives · Matt ConnorBy Matt Connor · · Updated 2026-08-08

Trade Condition Codes: Wetin Dem Mean

Three platforms fit show different daily highs for the same stock. Trade condition codes decide which prints update high, low, close, and volume.

Trade condition codes na the reason three platforms fit show three different daily highs for the same stock, and none of dem dey wrong. Every print for the consolidated tape carry these tags. Dem decide whether print fit update the last price, the day’s high and low, the official open, the official close, and the consolidated volume total. Trade fit be genuine execution for genuine price and still no qualify for almost all these fields.

Wetin be trade condition codes?

Trade condition code, wey dem dey also call sale condition, na tag wey reporting venue attach to trade report as e dey go tape. Price and size tell wetin trade. The condition tell the kind report wey be say: whether e arrive on time, whether dem calculate the price from other executions instead of agreeing am for that moment, whether e happen outside regular hours, and whether e cover less than the 100 shares wey make round lot.

Every code get eligibility flags, and na this part almost nobody dey see. Dem mark each code eligible or ineligible for last price, high and low, open, close, and consolidated volume. These flags dey work independently. Plenty prints wey no fit touch high or low still dey count for volume. Na why reported share count and reported price extremes dey come from overlapping but different sets of trades. Another set of flags dey alongside the first one. One set control consolidated tape, while the other control individual market center, because exchange’s own official close dey calculate only from its own prints.

Condition codes dey come in families, but na only one family dey control wetin trade fit update.

QueryCondition code families wey dem define for US stocks
The exact SQL behind every number
SELECT
    replaceAll(type, '_', ' ') AS condition_family,
    countDistinct(id)          AS codes
FROM global_markets.stocks_condition_codes
WHERE asset_class = 'stocks'
GROUP BY condition_family
ORDER BY codes DESC
Run this yourself

The stocks dictionary get 8 families. The biggest one na the sale condition family, with 40 distinct codes. Quote conditions describe bid and offer, no be trade. Indicator families flag states like when short sale restriction dey active. Sale condition family na the one wey carry the eligibility flags, and na from this family every number below come.

Wetin really dey ride on the tape

The panel below use one fixed session from June 2026. E cover every AAPL print from the 4:00 a.m. premarket open reach the 8:00 p.m. end of post-market trading, grouped by the sale condition wey each print carry. SQL fix the window, so these figures describe only that day. Print fit carry several codes at once, and many no carry any, so the columns no go add up to 100.

QueryOne AAPL session, every print group by im sale condition
The exact SQL behind every number
WITH
    (SELECT count()
       FROM global_markets.stocks_trades
      WHERE ticker = 'AAPL'
        AND sip_timestamp >= toDateTime('2026-06-17 08:00:00', 'UTC')
        AND sip_timestamp <  toDateTime('2026-06-18 00:00:00', 'UTC')) AS day_prints,
    (SELECT sum(size)
       FROM global_markets.stocks_trades
      WHERE ticker = 'AAPL'
        AND sip_timestamp >= toDateTime('2026-06-17 08:00:00', 'UTC')
        AND sip_timestamp <  toDateTime('2026-06-18 00:00:00', 'UTC')) AS day_shares
SELECT
    multiIf(t.code = -1,     'Regular way (no code)',
            c.code_name = '', concat('Unmapped code ', toString(t.code)),
            c.code_name)                        AS condition_name,
    round(100 * count() / day_prints, 2)        AS pct_of_prints,
    round(100 * sum(t.size) / day_shares, 2)    AS pct_of_shares
FROM
(
    SELECT
        size,
        arrayJoin(if(empty(conditions),
                     [toInt32(-1)],
                     arrayMap(x -> toInt32(x), conditions))) AS code
    FROM global_markets.stocks_trades
    WHERE ticker = 'AAPL'
      AND sip_timestamp >= toDateTime('2026-06-17 08:00:00', 'UTC')
      AND sip_timestamp <  toDateTime('2026-06-18 00:00:00', 'UTC')
) AS t
LEFT JOIN
(
    SELECT toInt32(id) AS code_id, any(name) AS code_name
    FROM global_markets.stocks_condition_codes
    WHERE asset_class = 'stocks'
      AND type = 'sale_condition'
    GROUP BY code_id
) AS c ON c.code_id = t.code
GROUP BY condition_name
ORDER BY pct_of_prints DESC
LIMIT 12
Run this yourself

The tag wey show most that day na Odd Lot Trade. E dey on 65.83% of the session prints and 6.37% of its shares. Compare the two columns row by row. Where print share much pass share of volume, the code dey show small executions. Where volume share pass print share, the code dey show small number of very large executions. Counting prints and counting shares answer different questions. Na condition code dey separate the two.

Why two platforms dey show different daily highs?

Four types of print each dey excluded from different groups of fields.

  • Late reported and out of sequence. If trade happen at 10:14 but dem report am at 10:31, e reach tape tagged out of sequence, or priced from prior reference. E count for volume. E no fit set last price, and e no fit raise day’s high even if the price pass every other trade for the session. Negotiated block trades and prints routed through trade reporting facility from dark pool trading venues often dey enter here.
  • Derivatively priced. Average price trade or VWAP fill carry price wey dem calculate across many other executions instead of agreeing am at that moment. Dem exclude am from last price and extremes because the price wey e show never exist as live quote.
  • Odd lot. Less than 100 shares. Odd lots no qualify for last price or high and low, but dem count fully for consolidated volume. Dem no dey report odd lots to consolidated tape at all until late 2013. Any volume comparison wey reach before that point dey compare two different meanings of the word, and our guide to average daily volume explain the matter well.
  • Extended hours and form T. Dem tag premarket and post-close prints and exclude dem from regular session open, high, low and close, but dem still count for consolidated volume. Platform wey chart dem go show different daily range from platform wey no chart dem. Na why after-hours and premarket trading fit appear for one chart but no appear for another.

This one show how much of one session each bucket represent across five popular names, for the same fixed day.

QueryShare of one session im prints wey carry price-ineligible conditions
The exact SQL behind every number
WITH
    (SELECT groupArray(toInt32(id))
       FROM global_markets.stocks_condition_codes
      WHERE asset_class = 'stocks'
        AND type = 'sale_condition'
        AND name ILIKE '%odd lot%')                       AS odd_lot_codes,
    (SELECT groupArray(toInt32(id))
       FROM global_markets.stocks_condition_codes
      WHERE asset_class = 'stocks'
        AND type = 'sale_condition'
        AND multiSearchAnyCaseInsensitive(name,
              ['form t', 'extended trading hours']))      AS extended_codes,
    (SELECT groupArray(toInt32(id))
       FROM global_markets.stocks_condition_codes
      WHERE asset_class = 'stocks'
        AND type = 'sale_condition'
        AND multiSearchAnyCaseInsensitive(name,
              ['out of sequence', 'prior reference', 'derivatively priced',
               'average price', 'price variation', 'seller'])
        AND NOT multiSearchAnyCaseInsensitive(name,
              ['form t', 'extended trading hours']))      AS late_or_derived_codes
SELECT
    ticker,
    round(100 * countIf(hasAny(conditions, odd_lot_codes))         / count(), 2) AS odd_lot_pct,
    round(100 * countIf(hasAny(conditions, late_or_derived_codes)) / count(), 2) AS late_or_derived_pct,
    round(100 * countIf(hasAny(conditions, extended_codes))        / count(), 2) AS extended_hours_pct
FROM global_markets.stocks_trades
WHERE ticker IN ('AAPL', 'KO', 'MSFT', 'NVDA', 'SPY')
  AND sip_timestamp >= toDateTime('2026-06-17 08:00:00', 'UTC')
  AND sip_timestamp <  toDateTime('2026-06-18 00:00:00', 'UTC')
GROUP BY ticker
ORDER BY odd_lot_pct DESC
Run this yourself

Odd lot prints make up 46.8% to 85.14% of all prints across the five names. That column dey follow share price closely because fixed dollar order go buy fewer shares for higher-priced name. NVDA top the list, with 2.4% of its prints tagged late or derivatively priced and 3.53% tagged extended hours. Every print for all three buckets na real trade at real price. But every one no qualify to set high and low.

The next panel use the same fixed AAPL session. E divide the regular 9:30 a.m. to 4:00 p.m. window into fifteen-minute buckets and draw two highs for each bucket. One line take the highest price of any print. The other take the highest price among prints whose conditions allow dem to set the high.

QueryTwo versions of the same AAPL session high, every fifteen minutes
The exact SQL behind every number
WITH
    (SELECT groupArray(toInt32(id))
       FROM global_markets.stocks_condition_codes
      WHERE asset_class = 'stocks'
        AND type = 'sale_condition'
        AND multiSearchAnyCaseInsensitive(name,
              ['odd lot', 'form t', 'extended trading hours', 'out of sequence',
               'prior reference', 'derivatively priced', 'average price',
               'price variation', 'seller'])) AS not_high_low_codes
SELECT
    formatDateTime(toStartOfFifteenMinutes(toTimeZone(sip_timestamp, 'America/New_York')), '%H:%i') AS et_time,
    round(toFloat64(max(price)), 2)                                              AS tape_high,
    round(toFloat64(maxIf(price, NOT hasAny(conditions, not_high_low_codes))), 2) AS eligible_high
FROM global_markets.stocks_trades
WHERE ticker = 'AAPL'
  AND sip_timestamp >= toDateTime('2026-06-17 08:00:00', 'UTC')
  AND sip_timestamp <  toDateTime('2026-06-18 00:00:00', 'UTC')
  AND (toHour(toTimeZone(sip_timestamp, 'America/New_York')) * 60
       + toMinute(toTimeZone(sip_timestamp, 'America/New_York'))) >= 570
  AND (toHour(toTimeZone(sip_timestamp, 'America/New_York')) * 60
       + toMinute(toTimeZone(sip_timestamp, 'America/New_York'))) < 960
GROUP BY et_time
HAVING countIf(NOT hasAny(conditions, not_high_low_codes)) > 0
ORDER BY et_time
Run this yourself

The session open at 09:30, with tape high of $302.07 against eligible high of $302.07, and e run 26 buckets reach close. Eligible line no fit ever dey above tape line because eligible prints na subset of all prints. Where the two lines sit together, every print for that fifteen-minute period fit set the high. Where upper line pull away, at least one print for that window trade above the highest eligible price. No chart wey follow the eligibility rules go ever show that print as the high.

That gap na the correct explanation for the difference. Source wey take maximum price of every print go report one high. Source wey apply eligibility flags go report another. Source wey also remove premarket and post-close sessions go report third one. All three dey read the same tape.

How reliable be the eligibility layer?

E thin. The flags na reference data, and people dey correct reference data. One commercial market data provider fix its own condition dictionary and reclassified one sale condition’s eligibility to set official open and official close. No trade change. Tape for every affected day remain the same before and after the fix. Na one flag inside lookup table change. That change also changed the official open and close wey every chart and backtest downstream from that dictionary had been printing.

Treat any single vendor’s OHLC as one reading of the tape, no be absolute fact about am. When two sources disagree, ask which eligibility rules each one apply. Delayed and consolidated quote feeds add another version of the same problem, this time about timing instead of eligibility.

Where authoritative trade condition code list dey

The tapes dey operate under two national market system plans: CTA Plan for NYSE-listed securities and UTP Plan for Nasdaq-listed ones. Each plan publish sale condition specification for the tape wey e administer. Those specifications na the authority. Everything downstream, including the id numbers behind the panels above, na vendor mapping into its own numbering system. Code id from one provider no necessarily mean the same thing for another. Learn the categories instead of the numbers. The categories don stable for years. The numbers na lookup table, and people dey edit lookup tables.

Data notes

The condition buckets for the panels above come from the dictionary itself, no be hardcoded id numbers. Each bucket na name match inside sale condition family: odd lot, form T and extended trading hours, out of sequence, prior reference price, derivatively priced, average price, price variation, seller. Open the SQL under any panel to see the exact patterns. Codes no dey mutually exclusive, so one print fit carry several. Because of that, bucket percentages overlap and no go add up to the session. Both AAPL panels and the five-name panel cover one fixed session in June 2026, pinned inside SQL. So nothing for this page go change as new sessions arrive.

FAQ

Wetin be trade condition code?

Na tag wey dem attach to trade report for consolidated tape to describe the kind report wey e be. Examples include late reported, derivatively priced, odd lot or extended hours. Each code carry flags wey show whether that trade fit update last price, high and low, open, close and consolidated volume.

Why two websites dey show different daily highs for the same stock?

Each website apply different eligibility rules to the same prints. One fit take highest price of any reported trade. Another fit exclude prints whose condition codes no allow dem set the high. A third fit also remove premarket and post-close sessions. All of dem dey read the same tape.

Odd lot trades dey count for volume?

Yes. Odd lot, meaning less than 100 shares, dey count for consolidated volume but no qualify to set last price or day’s high and low. Dem no report odd lots to consolidated tape at all before late 2013. So long-term volume comparison cross a change in definition at that point.

After-hours trades dey count for daily high and low?

No, not for regular session high and low. Premarket and post-close prints carry extended hours or form T condition. This keeps dem out of regular session open, high, low and close, while dem still count for the day’s consolidated volume.

Where official list of sale condition codes dey?

CTA Plan and UTP Plan publish sale condition specifications for the tapes wey dem administer, and those documents na the authority. Vendor feeds renumber the conditions into their own id space. So numeric code from one provider no necessarily match the same number for another provider.


Every panel here come with the SQL wey produce am. Open one, change the ticker or date, and run the same condition breakdown for any session on the Strasmore terminal.

#market data#trade conditions#consolidated tape#volume#ohlc