1
What a supply or demand zone is
A zone is a price where a big participant left orders behind. They wanted to buy (or sell) more than the market could give them at once, so price ran away before they finished. When price comes back, the leftover orders are still sitting there and get filled. That is the whole idea; everything else is detail.
DEMANDBuyers left behind
Price paused in a small range, then rallied fast. The buyer who caused the rally did not get his whole size. The pause is the zone. First revisit is usually bought.
SUPPLYSellers left behind
Price paused, then dropped fast. The seller has size left. The pause is the zone. First revisit is usually sold.
Base + fast move = zone. The base is where the orders are; the fast move proves someone big was there.
Three things that decide whether a zone holds
- How fast price left. A one-bar departure with no pullback means the imbalance was large. A slow drift away means it was not.
- How many times it has been tested. Each touch consumes orders. A first touch is strongest. By the third touch, assume most of it is gone and treat it as a breakout candidate.
- How thin the surrounding tape is. A zone next to single prints (section 4) is a stronger zone than one buried inside a fat, well-traded block.
2
How to find them on the chart
On a candle chart
Look for the fast move first, then walk left to the last small cluster of candles before it. That cluster is the zone. Draw it from the lowest body to the highest body of the cluster, not the wicks. Ignore clusters that price already came back through: those are used.
On the TPO letters (faster and more honest)
The profile does the work for you. A run of rows with a single letter means price went through there in one 30-minute period without trading. The thin block of letters directly beside that run is the base. Direction comes from the period: if that letter's period closed below its open, the thin block above the run is supply; if it closed above, the thin block below is demand.
price letters read
7774 D ┐
7773 D │ single prints: D period raced down
7771 D │ through here without trading
7769 D │
7767 D ┘ ← 7766–7773 = SUPPLY ★★★ (Fri Oct 16)
7765 D E
7763 D E F
7761 D E F G base thickens = ordinary trading
7759 C D E F G H
...
7727 G H I ┐ 2-letter block: a pause, not a zone
7725 G H I ┘ (walked through Sun night on tiny deltas)
Friday Oct 16's profile. The single-letter D run is the zone; the two-letter block lower down looked like one on the footprint but was not thin, and it folded on the first push.
Grading
| Grade | What the letters look like | How the card treats it |
| ★★★ | Single letters for 3+ rows, or two ★★ references agreeing at the same price | A/B anchor, resting order allowed |
| ★★ | Single letters for 1.5–3 points, a tail, a prior VA edge or naked VPOC | Support/resistance line; needs a trigger |
| ★ | Two-letter block, one-period pause, footprint-only level inside value | Noted, not traded on its own |
Thin-letter structure outranks a footprint-only level. Absorption inside a fat block is a pause.
3
Delta rules at the level
Delta is aggressive buying minus aggressive selling, in contracts. It measures effort. Price measures result. Every footprint read is the same question: did the effort produce the result?
Absorbed
Big one-sided delta and price does not move. Someone passive is eating it. Trade the other way on the first reversal bar, stop just past the extreme.
Pushing through
Stacked one-sided delta and price moves with it. Momentum. Go with the break after a 5-minute close through the level.
Mismatch
Candle color and delta sign disagree (green bar carrying a big red delta). The passive side won that bar. Lean the way price went.
Divergence
Price makes a new high while CVD falls (or new low while CVD rises). The aggressive side is being absorbed. Not a signal by itself; wait for price to confirm.
Spring vs trap: the magnitude tell
Both show green prints while price sits at a low. They mean opposite things, and only the size of the price move separates them.
| Spring (bullish) | Trap (bearish) |
| Where | Right at a known floor | Anywhere, usually mid-range or under a broken level |
| Price progress on the green prints | ≤ 3–4 pts undercut, then stalls | Keeps making lower lows, 5+ pts per bar |
| CVD | Holds above its session low | Rising while price falls for hours |
| What to do | Cover shorts, look for the long | Stay short or stand aside |
| Dated proof | Oct 19, 9:55–10:00 at 7732: +249/+401, 2-pt undercut, then +290/+256/+433 and a 26-pt rip | Sep 29: CVD +17k while price fell 44 pts; Oct 19 12:10: +1576 at 7755, price fell 20 pts after |
Stop placement
A resting buy at a support with the stop one point under it gets taken out by the very spring that makes the trade. Pad the stop by about 6% of ATR14, roughly 4 points on a 70-point ATR, on both sides of every level. A spring deeper than the pad is more often a real break.
Consumption count
Keep a tally of touches on each level through the day. On Oct 19, 7733–35 was tested three times with bounces shrinking 27 → 12 → 7 points. Shrinking bounces mean the buyer is running out. That level goes into the next day as consumed.
4
Market Profile in one page
A Market Profile is the day's candles rearranged by price. Each 30-minute period gets a letter; every price that period touched gets that letter printed on its row. Wide rows are where the market spent time. Narrow rows are where it did not.
| Letter (app) | Period | Letter (app) | Period |
| A | 9:30–10:00 | H | 13:00–13:30 |
| B | 10:00–10:30 | I | 13:30–14:00 |
| C | 10:30–11:00 | J | 14:00–14:30 |
| D | 11:00–11:30 | K | 14:30–15:00 |
| E | 11:30–12:00 | L | 15:00–15:30 |
| F | 12:00–12:30 | M | 15:30–16:00 |
| G | 12:30–13:00 | | |
The vocabulary
| Term | Meaning | Why it matters |
| VPOC | Row with the most letters | Fairest price of the day; a magnet when untested |
| Value area (VAH / VAL) | Rows holding 70% of the letters around the VPOC | Inside = balance, rotate; outside and accepted = trend |
| Initial balance (IB) | Range of A + B | Day type is judged by how far price extends beyond it |
| Single prints | Rows with one letter, inside the range | Fast move; the first repair target, and the zone marker |
| Tail | Single prints at the top or bottom of the range | Rejection; the longer the tail the stronger the other-timeframe response |
| Poor high / low | Two or more letters at the extreme, no tail | Unfinished business; usually revisited |
| Naked VPOC | A prior day's VPOC not traded through since | Expansion target above or below |
| Excess | A tail that was never traded back into | That extreme is finished |
Shapes and day types
P shape
Fat on top, tail below. Short covering, buyers in control late. Lean up next session unless the top is a poor high.
b shape
Fat at the bottom, tail above. Long liquidation or a rejected rally. Oct 19 was a b: value built 7735–55 under the 7760–73 tail.
D shape
Symmetric. Balance. Fade the edges until one is accepted.
Double distribution
Two fat blocks joined by singles. The singles are the hinge; whichever side price is on tells you which distribution is in charge.
| Day type | Range vs IB | Base rate | Trade style |
| Normal variation | 1–2× IB, one-sided extension | ~42% | Buy pullbacks in the extension direction |
| Trend | > 2× IB, closes near extreme | ~30% | Never fade; sell the lower-high retest |
| Neutral | Extends both sides of IB | ~20% | Fade the second extension; close location decides |
| Normal | Wide IB, no extension | ~8% | Range rotation only |
5
The overnight profile: speed, not location
Overnight single prints are made in thin liquidity. Price moves fast through them because nobody is there, not because anyone rejected the price. The day session repairs them casually. RTH singles are made with the whole market present; that is why they get stars and overnight singles do not.
| From the night tab | Useful? | How to use it |
| ON high / low | YES | The Build inputs. Also where overnight inventory is trapped; a break of ON low with long inventory is liquidation fuel |
| ON POC vs prior-day VA | YES | Answers the open-location question before the open |
| Thin ON ladder between ON value and the open | SPEED | If the first 30 minutes fail, expect a fast trip back to ON value. Size the stop for speed; do not fade inside the ladder |
| ON singles at the same price as an RTH single or tail | CONFIRM | Two sessions left it thin; that one earns a star |
| ON singles alone, as entry levels | NO | Keep them off the card |
Proof: Sunday night left a thin column 7755–7768 above overnight value. Monday went straight up through it to 7773 and straight back down through it. The rejection came from the RTH-built 7766–73 supply, not from the overnight singles.
6
Case study: Sunday Oct 18 – Monday Oct 19
Setup from Friday's profile
- Friday Oct 16: trend-down day, 127-point range, VPOC 7695.50, VAH 7761.50, VAL 7678.75.
- D-period single prints 7766–7773, with Thursday's VPOC 7769 inside them. Graded ★★★ supply.
- Two-letter block at 7720–27 showed absorption on the footprint. Graded a pause, not a zone.
Overnight
- Sunday 6 PM opened near 7680, rallied through the 7720–27 block on deltas of 50–160 with no seller showing (the pause folded, as graded).
- Overnight high 7768.50, straight into the D singles. Rejected 34 points to 7734 by 7:30 AM. First touch, held.
The day session, minute by minute
time price footprint read
09:30 7742 open inside ON value rotation day; wait for an edge
09:40 7749–50 −396 −244 −178 on the push open-rejection-reverse; card D armed sell-stop 7733.50
09:50 7734 D fills correct, conditional
09:55 7732 +249 undercut only 2 pts…
10:00 7728.75 +401 …this is a SPRING, not a trap (misread live)
10:10 7735+ +290 +256 +433, CVD 4.0k→8.3k short stopped; the long was here
10:20 7753 +2,859 card A buy-stop 7753.50 triggers
11:40 7772 +918 +655 +767 into the zone second touch of 7766–73
11:45 7769 −958 the passive seller shows; 24-pt drop
12:10 7755 +1,576 biggest green print of the afternoon, price fell 20 after = TRAP
14:00 7735 −1073 −756 −678 −526 absorbed 7733–35 holds for the 3rd time, bounce only 7 pts
16:00 7738 CVD +23.7k, close ≈ open all-day buying, no progress above value = absorption at the top
Monday's finished profile
- Range 7727.25–7773, VPOC 7746.50, VA 7734.50–7754.50. Shape: b.
- Thin E/F column 7760–7773 (NinjaTrader F/G). That is Tuesday's first supply, under the still-intact Friday D singles.
- B-period single prints 7727–7733 below VAL: the spring. First downside magnet if Tuesday opens inside value.
- Value migrated up about 45 points from Friday. Friday's upper distribution was accepted, but the singles were not broken.
Scorecard for the card
| Item | Result | Note |
| Level map | A | Every mapped edge held or triggered where mapped |
| Day type call | A | Digestion / rotation until an edge is accepted |
| Setup A (buy-stop 7753.50) | +20 | The winner |
| Setups C and D | stopped | Both taken out by the same 7732 spring; stop pad was 1 pt, now 6% of ATR |
| Live read at 10:00 | miss | Called the spring a trap; the magnitude rule came from this |
| Overall | B+ | Levels right, selection rules tuned |
7
Rules, dated
Oct 18–19 · confirmed twice
Single-print supply from the letters
A run of 3+ single-letter rows left by a fast move is a zone; the thin block beside it is the base. Grade by thinness, not by footprint absorption. Proof: 7766–73 rejected the overnight high and the 11:40 rally. After two touches, treat as consumed.
Oct 19 · 9:55–10:15
Spring vs trap is a magnitude question
Green absorption prints with a shallow undercut (under 3–4 pts) at a known floor and CVD above its session low is a spring: cover shorts, look for the long. It is only a trap if price keeps printing lower lows by 5+ pts per bar on the green prints.
Oct 19 · C and D stopped
Stop distance must be wider than a spring
Pad every stop by about 6% of ATR14 (floor 1 pt) beyond the level, on both sides. Companion: if D fills and green prints appear at the low with no price progress, cover at the footprint and look for C again.
Oct 19 · evening
Overnight singles are speed, not location
Use the night profile for ON high/low, ON POC vs prior value, and ladder thinness. Do not star overnight singles unless an RTH single or tail sits at the same price.
Oct 19 · full day
Consumption count
Count touches. Shrinking bounces mean the passive side is running out. Three touches with 27 → 12 → 7 point bounces sends a level into the next day as a breakout candidate, not a support.
Sep 23 / Sep 29 / Oct 19
Price confirms, CVD alone does not
CVD up with price down means the passive seller is winning. CVD down with price up means the passive buyer is winning. When price and CVD fight, price wins. Act only when price breaks structure.
Standing
Entry timing by setup type
Responsive (fade a level, buy absorption): enter on the first reversal bar with delta confirming, tight padded stop, do not wait for the close. Momentum (through a level): wait for the 5-minute close plus CVD confirming, then enter or buy the first pullback that holds.
8
NinjaTrader setup
Indicator: Order Flow Volume Profile. Profile type Price, Draw mode Letters, Ticks per level 4, Value area 70, Initial balance 60 minutes, Resolution Minute, Profile alignment Right, width 35%.
| Tab | Trading hours | Sessions | What it is for |
| DayTPO_ES | CME US Index Futures RTH | 2 | Today's RTH profile beside the prior day's. Matches the app. |
| NightTPO_ES | AfterHoursTemplateNoble1 (6:01 PM → 9:29 AM) | 1 | Overnight only, frozen at 9:29. Read at 8:45 for the Build inputs. |
| ES DEC26 | CME US Index Futures ETH | — | Continuous bars with cumulative delta in its own panel. Absorption and divergence reads. |
Set Trading hours in both places: Data Series and the indicator's own Trading hours field. Templates are edited under Control Center → Tools → Trading Hours.
Letter offset
NinjaTrader anchors letters to the clock at 8:30 ET regardless of template, so its letters run two ahead of the app's.
| App | NinjaTrader | App | NinjaTrader |
| A (9:30) | C | F–K window | H–M |
| B (10:00) | D | M (15:30) | Q |
| IB = A+B | C+D | 16:00–16:15 | R |
Shape, value area, POC and single prints are identical either way. Only the labels differ.
9
Morning routine
- 7:00 Drop the FirstRate ES and VIX files in DailyData, run Import. Levels update automatically.
- 7:10 Zones page: deactivate consumed zones, approve the new suggestions. Check the thin block from the prior day's profile is there.
- 8:45 NightTPO_ES tab: read ON open (the 6 PM candle's open, not the first close), ON high, ON low, and where ON POC sits against prior value.
- 8:50 DailyPlan: type date, ON open/high/low, Now, VIX. Build. Print.
- 9:30 DayTPO_ES for structure, the delta tab for the trigger. Arm the resting orders from the card with the padded stops. Cancel what never triggers.
- 16:15 Journal: grade the card, one lesson. If the lesson is a rule change, it goes into PlanWriter, not just the journal.
Levels come from the letters. Timing comes from the footprint. Permission comes from VIX.