Skip to main content
AuctionFoundry
Menu

INDICATOR MANUAL

Supply and demand zones indicatorSupply & Demand Zones - Zone Forge [AFD] · full manual · published to TradingView

Find supply and demand zones from a tight base and a decisive departure, then read how each zone was built from its glow and fill rather than from a label.

63 documented settingsPublished on TradingView · Aug 10, 2026

Start here

What the indicator does, the questions it can help answer, and its fresh-install defaults.

A zone needs two completed halves. A base is a run of bars whose entire height fits inside Base tightness × ATR(14), and a departure is a bar that closes beyond that base by at least Departure strength × ATR(14). The close is what counts, never the high or the low, so a spike that closes back inside the base creates nothing. The zone appears on the bar that closes the departure, not before.

Each zone is scored once, on the bar that creates it, from the two ratios detection already computed: the departure distance over the distance it had to clear, divided by the base height over its allowed height with a floor of 0.50. Clearing both requirements exactly scores 1.0. Fixed thresholds on that score place the zone in the Weak, Standard, or Strong tier, and the tier is expressed as glow and fill depth instead of a printed rank.

The lifecycle runs one way. A fresh zone is one price has not returned to; a tested zone is one price traded into and did not close through; a broken zone is one price closed through. A broken zone never returns to fresh, and each test after the first steps a zone further back until a fixed wear limit holds it there.

Fresh-install defaults8 documented defaults

Swipe or scroll horizontally to see every column.

Supply & Demand Zones - Zone Forge fresh-install defaults
AreaDefaultResult
Preset & themeSignature · Signature theme · 100 master opacityDraws the glow default with the shipped palette and no global fade.
Detection styleIntradaySets base length, tightness, and departure strength together; the three Custom knobs stay inactive.
Zone geometryWickBounds each zone with the base’s highest high and lowest low rather than its open/close extremes.
PatternsAll four onCreates rally-base-drop and drop-base-drop as supply, drop-base-rally and rally-base-rally as demand.
Lifecycle rulesClose through · Wick touchRequires a close beyond a zone to break it and a wick touch to test it.
Zone visibilityTested shown · Broken hidden · 10 per sideKeeps up to ten live zones per side; broken zones stay off because showing them roughly triples what is drawn.
GradingOn · emphasis 80Scores each zone at creation, with enough emphasis to keep all three tiers on distinct halo stacks.
Edge lines and labelsProximal and distal on · 50% line off · labels onDraws both zone edges and a type label; the midpoint mitigation line stays off to keep the default chart quiet.

How it works

How the indicator turns chart data into the states and drawings you see.

Both halves must complete

A zone is created from a finished base and a finished departure. Nothing is drawn while either half is still forming, and a zone appears on the bar that closes the departure. Detection also needs ATR(14) to exist, so the opening bars of a chart produce nothing.

A long tight run is rejected, not trimmed

A tight run longer than Base max length is read as a range and draws nothing. It is not shortened to its last few bars and admitted anyway, which is why loosening Base tightness past the middle of its range draws fewer zones rather than more.

The departure uses the previous bar’s ATR

The threshold a departure bar must clear is measured against the prior bar’s ATR(14), so the departure bar’s own range cannot inflate the requirement it is being tested against.

The grade is frozen at creation

The score is computed once, on the bar that creates the zone, and is never recomputed. A zone already on the chart does not restyle itself later. Grade emphasis changes how far apart the three tiers look, never which tier a zone is in.

Wear is separate from the grade

The grade describes construction and stays fixed. Wear describes what has happened since: each test after the first takes a further percentage off both fill and glow, stopping after four extra tests. Neither fill nor glow ever dims to invisible.

Break beats test on the same bar

When a bar would both test and break a zone, the break is applied. The lifecycle only ever runs one way, so a zone that has broken cannot return to tested or fresh.

Flipping creates a new zone

Flip broken zones, off by default, draws a fresh zone of the opposite type at the same levels when a zone breaks. The broken zone stays broken and nothing already drawn changes what it claims to be. A flip is graded on the bar that broke through and never flips a second time.

The chart is bounded on purpose

A cap per side, a maximum zone age, hidden broken zones, and an overlap rule that will not admit a new zone sitting on a live one all keep the drawing count inside the declared budget of 500 boxes, 500 lines, and 100 labels.

Output and state reference6 documented states

Swipe or scroll horizontally to see every column.

Supply & Demand Zones - Zone Forge outputs and states
Output or stateWhen it appearsMeaning
FRESH ZONEA base and departure completed and price has not returned to the zoneDrawn at full fill and glow for its tier; the area price left, not a level to act on.
TESTED ZONEPrice met the zone under the selected Test rule without breaking itFill and glow step back, and step back further with each additional test up to the wear limit.
BROKEN ZONEPrice closed through the zone under the selected Break ruleThe zone is finished and hidden by default; it can never return to tested or fresh.
STRONG · STANDARD · WEAKThe construction score crosses a fixed tier threshold at creationDescribes how the zone was built. It is not a ranking of what price will do at the zone.
50% LINEShow 50% line is enabled and the zone is live or testedMarks the zone midpoint; a broken zone’s midpoint is history and is not drawn.
DATA WINDOW VALUESRead on every execution from the live closeDistance to the nearest demand zone and to the nearest supply zone, each as a percentage of the current close, plus a zone state of 1 inside demand, -1 inside supply, and 0 outside both. They create, test, break, and prune nothing.

Settings

The 63-input reference follows the published Preset & theme, Zone detection, Zone lifecycle, Zone grading, Zone body & border, Demand appearance, Supply appearance, Tested & broken appearance, Edge lines, Zone labels, and Zone count table groups. Detection style is the only group that changes what is found; everything below it changes how what was found is drawn.

Preset & theme4 inputs

Swipe or scroll horizontally to see every column.

Preset & theme settings and defaults
SettingControlDefaultChoices, limits & availability
PresetpresetInputChoice / textSignatureSignature · Clean · Minimal · Custom
Colour themethemeInputChoice / textSignatureSignature · Neon · Muted · Mono · Terminal · Midnight · Ocean · Ember · Paper · Custom
Master opacitymasterOpacityInputWhole number100Min 5 · Max 100
Glow intensityglowIntensityInputWhole number35Min 0 · Max 100 | Conditional
Zone detection9 inputs

Swipe or scroll horizontally to see every column.

Zone detection settings and defaults
SettingControlDefaultChoices, limits & availability
Detection styledetectionStyleInputChoice / textIntradayScalp · Intraday · Swing · Custom
Base max lengthbaseMaxLengthInputWhole number5Min 1 · Max 20 | Conditional
Base tightnessbaseTightnessInputDecimal1.0Min 0.25 · Max 1.5 · Step 0.05 | Conditional
Departure strengthdepartureStrengthInputDecimal1.0Min 0.25 · Max 5.0 · Step 0.05 | Conditional
Zone geometrygeometryInputChoice / textWickWick · Body
Rally-base-drop (supply)showRbdInputToggleOn—
Drop-base-drop (supply)showDbdInputToggleOn—
Drop-base-rally (demand)showDbrInputToggleOn—
Rally-base-rally (demand)showRbrInputToggleOn—
Zone lifecycle7 inputs

Swipe or scroll horizontally to see every column.

Zone lifecycle settings and defaults
SettingControlDefaultChoices, limits & availability
Break rulebreakRuleInputChoice / textClose throughClose through · Wick through
Test ruletestRuleInputChoice / textWick touchWick touch · Close inside
Show tested zonesshowTestedInputToggleOn—
Show broken zonesshowBrokenInputToggleOff—
Max zones per sidemaxZonesPerSideInputWhole number10Min 1 · Max 18
Max zone age (bars)maxZoneAgeInputWhole number5000Min 50 · Max 5000
Flip broken zonesflipBrokenInputToggleOff—
Zone grading2 inputs

Swipe or scroll horizontally to see every column.

Zone grading settings and defaults
SettingControlDefaultChoices, limits & availability
Grade zonesgradeZonesInputToggleOn—
Grade emphasisgradeEmphasisInputWhole number80Min 0 · Max 100 | Conditional
Zone body & border3 inputs

Swipe or scroll horizontally to see every column.

Zone body & border settings and defaults
SettingControlDefaultChoices, limits & availability
Fill zone bodyfillZoneBodyInputToggleOn—
Show zone bordershowZoneBorderInputToggleOn—
Emphasise nearest zoneemphasiseNearestInputToggleOnConditional
Demand appearance6 inputs

Swipe or scroll horizontally to see every column.

Demand appearance settings and defaults
SettingControlDefaultChoices, limits & availability
Fill colourdemandFillInputColor#00E5FF · 72% transparentConditional
Border colourdemandBorderInputColor#00E5FF · 20% transparentConditional
Border widthdemandBorderWidthInputWhole number1Min 1 · Max 4 | Conditional
Border styledemandBorderStyleInputChoice / textDashedSolid · Dashed · Dotted | Conditional
Glow colourdemandGlowInputColor#00E5FF · 55% transparentConditional
Glow spreaddemandGlowSpreadInputDecimal0.5Min 0.1 · Max 3.0 · Step 0.1
Supply appearance6 inputs

Swipe or scroll horizontally to see every column.

Supply appearance settings and defaults
SettingControlDefaultChoices, limits & availability
Fill coloursupplyFillInputColor#FF2D6F · 72% transparentConditional
Border coloursupplyBorderInputColor#FF2D6F · 20% transparentConditional
Border widthsupplyBorderWidthInputWhole number1Min 1 · Max 4 | Conditional
Border stylesupplyBorderStyleInputChoice / textDashedSolid · Dashed · Dotted | Conditional
Glow coloursupplyGlowInputColor#FF2D6F · 55% transparentConditional
Glow spreadsupplyGlowSpreadInputDecimal0.5Min 0.1 · Max 3.0 · Step 0.1
Tested & broken appearance7 inputs

Swipe or scroll horizontally to see every column.

Tested & broken appearance settings and defaults
SettingControlDefaultChoices, limits & availability
Tested fill dimtestedFillDimInputDecimal25.0Min 0.0 · Max 80.0 · Step 5.0
Tested glow dimtestedGlowDimInputDecimal40.0Min 0.0 · Max 80.0 · Step 5.0
Wear per extra testwearPerTestInputDecimal10.0Min 0.0 · Max 25.0 · Step 2.5
Tested border colourtestedBorderColourInputColor#FFB300 · 20% transparent—
Broken colourbrokenColourInputColor#78849A · 60% transparentConditional
Broken border stylebrokenStyleInputChoice / textDottedSolid · Dashed · Dotted | Conditional
Fade broken zonesfadeBrokenInputToggleOnConditional
Edge lines9 inputs

Swipe or scroll horizontally to see every column.

Edge lines settings and defaults
SettingControlDefaultChoices, limits & availability
Show proximal edgeshowProximalInputToggleOnConditional
Show distal edgeshowDistalInputToggleOnConditional
Line widthedgeWidthInputWhole number1Min 1 · Max 4
Line styleedgeStyleInputChoice / textDashedSolid · Dashed · Dotted
Extend rightextendRightInputToggleOff—
Glow on edge linesedgeGlowInputToggleOn—
Show 50% lineshowMidInputToggleOff—
50% line colourmidColourInputColor#B0BEC5 · 35% transparentConditional
50% line stylemidStyleInputChoice / textDashedSolid · Dashed · Dotted | Conditional
Zone labels8 inputs

Swipe or scroll horizontally to see every column.

Zone labels settings and defaults
SettingControlDefaultChoices, limits & availability
Show labelsshowLabelsInputToggleOnConditional
ContentlabelContentInputChoice / textTypeType · Type + age · Type + grade · Type + touches · Age
Text sizelabelSizeInputChoice / textSmallTiny · Small · Normal · Large
Text colourlabelTextColourInputColor#E8EEF5 · 0% transparent—
BackgroundlabelBgColourInputColor#0B1520 · 30% transparent—
PositionlabelPositionInputChoice / textRightLeft · Centre · Inside · Right
Offset (bars)labelOffsetInputWhole number10Min -20 · Max 20
Type wordingtypeWordingInputChoice / textRally-base-dropSupply / Demand · Rally-base-drop · RBD | Conditional
Zone count table2 inputs

Swipe or scroll horizontally to see every column.

Zone count table settings and defaults
SettingControlDefaultChoices, limits & availability
Show zone countshowZoneCountInputToggleOff—
Table text sizetableSizeInputChoice / textSmallTiny · Small · Normal · Large | Conditional

Alerts and limitations

What can notify you, what can change the output, and what the indicator cannot establish.

4 fixed alert conditions

New demand zone

A drop-base-rally or rally-base-rally zone was created on the current bar.

New supply zone

A rally-base-drop or drop-base-drop zone was created on the current bar.

Zone tested

Price met a live zone under the selected Test rule without closing through it.

Zone broken

Price closed through a live zone under the selected Break rule.

Limits to keep visible

  • The indicator describes how an area was constructed from bars that have already printed. It does not predict direction, establish a reaction at a zone edge, or identify an entry, exit, target, or position size.
  • Supply and demand here name where a price move originated. The script reads only the open, high, low, close, and volume of the chart in front of it, so it knows nothing about order flow, dealer positioning, or where anyone’s orders actually rest.
  • The grade is a construction score, not a quality-of-outcome score. A Strong tier means a tight base and a decisive departure; it does not mean the zone is more likely to hold, and no tier is presented as the one to trade.
  • The script makes no request.security() calls and imports no higher timeframe. Everything it finds depends on the symbol, interval, session, and bars supplied by the active data feed.
  • Standard time-based candles are assumed. On Heikin Ashi, Renko, or Range charts the engine measures those synthetic values rather than traded prices, so the bases it finds are not the bases on a price chart.
  • Base tightness is not a strictness dial. The zone count peaks in the middle of its range and falls away at both ends, so loosening it past the peak draws fewer zones rather than more.
  • Detection requires ATR(14) history before anything can be measured, so the opening bars of a chart produce no zones regardless of what they look like.
  • Drawing history is finite. Every glow layer, edge line, and label spends from budgets of 500 boxes, 500 lines, and 100 labels, so Max zones per side and Max zone age bound what can be kept rather than being preferences alone.
  • Zone geometry is fixed once created and only its lifecycle state changes, on closed bars. The published build carries compiler and owner-confirmed render evidence rather than a completed replay-and-reload study, so confirm behavior with Bar Replay on your own symbol and timeframe.
  • Alert creation and script conditions do not guarantee delivery. TradingView plan limits, chart execution, network state, and notification settings remain outside the script.

Troubleshooting

Start with what you see on the chart. Each answer explains the likely cause and the first setting, timeframe, or data condition to check.

Why are there no zones on my chart?

Check the timeframe first. A zone needs a completed base and a completed departure, and that pattern completes far more often on a fast chart, so a 5-minute or lower interval gives the most to read. Also confirm enough history is loaded for ATR(14) to exist, since the opening bars of a chart produce nothing.

Why did loosening Base tightness draw fewer zones?

That is the expected behavior, not a fault. A looser limit lets tight runs grow past Base max length, and a run longer than that is rejected as a range rather than trimmed to fit. The zone count peaks in the middle of the range and falls away at both ends, which is why the range stops where it does.

Why did a strong-looking move not create a zone?

The departure is measured on the close, never the high or low. A bar that spikes past the base and closes back inside it draws nothing. The threshold is also measured against the previous bar’s ATR, so a wide departure bar does not raise its own requirement.

Why do my zones all look the same?

Check Grade emphasis and Glow intensity together. At an emphasis of 0 every zone draws alike, and below 76 two tiers share a halo stack, so the shipped 80 sits just clear of that edge. If Preset is Custom, a Glow intensity below about 25 also stops the grade showing through the halo.

Why did the edge lines disappear when I turned the border off?

Show zone border removes the box outline and both edge lines together. The two edge switches stay lit but do nothing while it is off. The 50% line is unaffected, because it is a level rather than part of the box.

Why is the chart suddenly crowded?

Show broken zones is the usual cause; keeping broken zones roughly triples what is drawn. Raising Max zones per side helps less than it looks, because most zones end broken and those ship hidden. Reduce the cap or the maximum age rather than raising them.

Why did a zone change type?

It did not. Flip broken zones draws a new zone of the opposite type at the same levels when a zone breaks, and the broken zone stays broken. Nothing already on the chart changes what it claims to be, and a flipped zone never flips again.

Why does a tested zone keep fading?

Wear per extra test takes a further percentage off fill and glow for each test after the first, stopping after four extra tests. The grade itself is frozen and still describes formation. Set Wear per extra test to 0 to turn the effect off.

Why do the colors look wrong on a light chart?

Eight of the nine themes are built for a dark background. Choose the Paper theme for a light chart, or Custom to set the six pickers yourself. Master opacity fades every color together without changing any individual setting.

Why did an existing alert keep the old behavior?

TradingView alerts retain the symbol, timeframe, and input snapshot they were created with. Delete and recreate the alert after changing detection style, lifecycle rules, timeframe, or symbol, then verify the new condition in the alert dialog.

Risk disclosure

Auction Foundry LLC provides educational charting tools and general market commentary only. This is not investment, financial, legal or tax advice, and nothing here is a recommendation, offer or solicitation to buy or sell any instrument. Auction Foundry is not registered with the SEC as an investment adviser, nor with the CFTC as a commodity trading advisor, and is not an NFA member.

Trading involves risk, including loss of principal. Losses can exceed a modeled stop and, for leveraged or margin products, can exceed the amount initially deposited or invested. Indicators can be wrong, delayed or unsuitable for your circumstances, and past or hypothetical results do not predict future results. Free access does not change any of this. Consider your objectives and consult a licensed professional before acting. Using these tools does not create an advisory or brokerage relationship.

Auction Foundry LLC is an independent publisher and is not affiliated with, endorsed by, or sponsored by TradingView, Inc. “TradingView” is a trademark of TradingView, Inc., used here only to identify the platform our scripts are published on. Scripts are published to TradingView as a community author on the same terms as any other author.

Read the full Risk Disclosure for the dated, versioned document this summarizes.