Last week's post made the case for session timing: the four killzones are where liquidity concentrates, and filtering by them removes a category of poor trades without changing your strategy.
But a killzone is a blunt instrument. The New York Open killzone runs two hours. Sit through one and you'll notice the activity isn't evenly spread — it clusters into short bursts with quiet stretches between them. Those bursts recur at consistent clock times, which is the tell that they're driven by scheduled algorithmic activity rather than by anything discretionary.
Macros are those windows. ICT Macros detects eight of them across London and New York — and then does something more interesting than marking them.
What a macro is
A macro is a narrow, predefined time window — typically around twenty minutes — in which price behaviour follows a recognisable pattern. The indicator covers eight: the London macros, the New York AM macros, the NY Lunch macro, and the NY PM macros.
The premise is that a meaningful share of intraday movement is produced by programs running on a schedule. Programs don't drift; they execute in windows. If the same behaviour appears in the same clock window across many sessions, you're looking at something structural rather than a pattern you've imagined.
Crucially, macros are defined in Eastern time and calculated in Eastern time regardless of what your NinjaTrader instance is set to. The indicator reads your machine clock and handles the conversion, so a macro window lands correctly whether you trade from Toronto or Kuala Lumpur, and stays correct through daylight saving changes.
The classification is the point
Marking a time window on a chart is easy, and on its own it tells you nothing about what to do. The part of this indicator that earns its place is that each detected macro is classified into one of three behavioural states:
Manipulation
Liquidity is being swept, often on both sides. Stops above get taken, then stops below, or vice versa. Price probes, traps, and reverses.
The correct response to a manipulation macro is usually to do nothing. This is the phase designed to remove participants who committed early, and entering into it means becoming the liquidity rather than using it. If you already hold a position, it's the phase where a stop placed at an obvious level is most exposed.
Accumulation
Range-building. Price compresses, the range narrows, and positions are being established without directional commitment showing on the chart.
The response here is preparation rather than action: mark the range boundaries, because the expansion that follows tends to resolve out of one side of them. Accumulation macros are where you decide what you'll do, not where you do it.
Expansion
Directional movement with intent. The setup that manipulation and accumulation built now resolves, and price moves with follow-through.
This is the phase most strategies are actually designed for. Trend-following logic, breakout logic, continuation entries — all of it works better inside expansion than the other two states, and the reason a lot of otherwise sound strategies underperform is that they fire indiscriminately across all three.
The sequence often runs in that order: sweep the liquidity, build the position, then move. Knowing which phase you're currently in tells you whether to wait, prepare, or act — which is a genuinely different kind of information from a buy or sell arrow.
Dynamic macro levels
Each macro gets three levels drawn from its range: top, mid, and bottom. Those levels then extend forward until the next macro begins.
This turns each macro into a small piece of intraday structure that persists after the window closes. The high of the 9:50–10:10 macro is a level with a reason behind it — it's where a specific algorithmic window stopped pushing. Price returning to it later in the session is a test of that level, not a coincidence.
The mid level is worth watching specifically. A macro's midpoint functions as its equilibrium, and price accepting or rejecting it after the window closes often indicates whether the macro's move is being confirmed or unwound.
The plots, and what they enable
Four categories are exposed for automation:
-
macroSignal— whether price is currently inside a macro window (the binary filter) -
macroType— which specific macro, by ID - Classification — manipulation, accumulation, or expansion
- Top, mid and bottom levels for the active macro
The combination of the second and third is where this gets powerful. You aren't just filtering by "inside a macro" — you can build a strategy that runs only during expansion macros and stands down during manipulation. That's a filter no price-based indicator can produce, because it isn't derived from price at all; it's derived from time plus a behavioural model.
And because macros are time-based and fixed, backtests are honest. There's no pivot to confirm and no possibility of the window shifting retroactively. Time-based filters are among the very few where historical and live behaviour are identical by construction.
Practical constraints worth knowing
Two real limitations, stated plainly:
Chart interval. The indicator works on time-based charts from 1 minute up to (but not including) 30 minutes. That range is a consequence of what it's measuring — a twenty-minute window can't be meaningfully resolved on a 30-minute chart, and it isn't defined on tick or volume charts.
1-minute data dependency. Macro calculations use 1-minute data underneath, which means loading a lot of history can affect performance. If you're running several instruments with long lookbacks, this is the tool to watch. Trimming your chart's days-to-load is usually the fix.
Where macros sit relative to killzones
Two layers of the same idea at different resolutions:
- Killzones answer "is this a session worth trading?" — a two-to-three hour filter
- Macros answer "is this the twenty minutes where something happens, and what kind?" — a precision filter with behavioural context
Run them together and the timing filter becomes quite specific: inside the New York Open killzone, inside an expansion macro, aligned with the higher-timeframe bias. Add an execution tool and you have a genuinely narrow set of conditions.
Natural pairings from the rest of the toolkit: Liquidity Sweeps during manipulation macros — the two describe the same event from different angles. Equal Highs and Lows to know in advance which liquidity a manipulation window is likely to target. Auto Anchored VWAP to measure whether an expansion is moving away from or back toward value.
Common mistakes
Trading inside manipulation macros. The most expensive one, and the most understandable — manipulation windows are volatile and volatility looks like opportunity. It's the phase specifically constructed to take positions from people who entered too early.
Ignoring the classification and using only the window flag. If all you take from this tool is "price is inside a macro", you've thrown away the part that distinguishes it from a session indicator. The three states call for three different responses.
Running it on a 30-minute or higher chart. Outside the supported range, and conceptually meaningless — a single bar would swallow the entire window.
Expecting every macro to deliver. Some macros pass with nothing. The framework describes where behaviour tends to cluster; it doesn't promise a move in every window.
Loading years of history and then blaming the indicator for lag. The 1-minute data requirement is real. Reduce your loaded days before concluding something is broken.
Time as a filter
Almost every tool in this series derives its signal from price. Macros derive theirs from the clock, and then describe what price tends to do inside each window. That makes them genuinely non-correlated with everything else in the stack — which is exactly what you want from a filter.
Disclaimer: Trading futures and other leveraged instruments involves substantial risk of loss and is not suitable for all investors. Past performance and indicator signals are not indicative of future results.