Signal Analyzer Guide

"Plans fail for lack of counsel, but with many advisers they succeed." — Proverbs 15:22

The PBF Signal Analyzer (V5 Beta) is a real-time NQ futures structure and context companion running inside NinjaTrader 8. It builds the session's key levels, measures how much independent structure agrees at each one, flags what is arguing against it, and reports all of that as price meets those levels — with most of the attention on the 9:45–11:00 ET window.

What it does not do. The Signal Analyzer does not tell you to buy or sell, does not publish an entry, stop or target, does not size a position, and does not claim a win rate or a probability for anything it shows. It reports market structure and session context. Every trading decision — whether, when, which direction, how much — is yours.

Contents

  1. What It Does
  2. Installation & Activation
  3. Encounter State Progression
  4. Confluence Bands
  5. Confluence Weight Table
  6. Setup IDs
  7. Time Filters
  8. Conflict Flags & Hard Blocks
  9. Order Management (ATM Templates)
  10. The Kill Zone Window (9:45–11:00)
  11. V5 Quality Strip
  12. 1M Confirmation Note
  13. Key Settings Reference
  14. HIT / STOPPED Trade Summary Card
  15. EMA200-BOUNCE + FAILED-ENGULF Setups
  16. ES Correlation Scoring
  17. Live VIX in the Quality Strip
  18. How to Read It Well

What It Does

Installation & Activation

Full walkthrough in Getting Started. Quick path:

  1. Download PBFIndicators.zip from your account
  2. NT8 → Tools → Import → NinjaScript Add-On → select the ZIP
  3. Add PBFSignalAnalyzerV5Beta to your NQ 5-minute chart
  4. First load opens browser to profitbyfaith.com/activate → click Approve → indicator unlocks within 15 seconds
Chart requirement: The Signal Analyzer is designed for a 5-minute NQ continuous contract (@NQ). It pulls daily and weekly data internally — you do not need separate timeframe panels.
Tick Replay not required: PBF Signal Analyzer ships its own delta computation. When your NinjaTrader data feed supplies native bid/ask order flow, the indicator uses it; otherwise it falls back to a clearly-labeled bar-direction proxy — never presented as native. Do not enable Tick Replay on your chart — it dramatically increases load time and memory use without improving the quality of the structural read. When the DELTA tile shows a small proxy badge, the proxy is active; the badge clears to native bid/ask delta only when your feed provides order-flow data.

Encounter State Progression

Every level encounter moves through a defined state machine. The app cannot be in two states at once.

WAITING WATCHING APPROACHING AT LEVEL RESOLVED ✓ or RESOLVED ✗
StateWhat it reportsWhat it means
WAITINGPre-market or ORB building (9:30–9:45)No structure is set yet — the indicator is arming
WATCHINGORB is set, price is away from known levelsStructure is defined and nothing is being encountered
APPROACHINGPrice has entered the ATR approach band around a levelA level is close enough to matter
AT LEVEL (ACTIVE in JSON)Price is at the levelThe encounter is happening now
RESOLVED ✓The encounter resolved in the level's favour — overlay shows a summary card of the moveResets to WATCHING in ~30 seconds (live) or 1 bar (backtest)
RESOLVED ✗The encounter resolved against the level — overlay shows a summary card of the moveResets to WATCHING in ~30 seconds (live) or 1 bar (backtest)
State is a report, not a prompt. AT LEVEL means price is at a level the session cares about — that is all it means. The app does not start a decision clock, does not grade the opportunity, and does not expect a response. Nothing bad happens if you look at it and do nothing.

Confluence Bands

BandStrengthLabelWhat it describes
A ★75+STRONGThe cleanest structural agreement the session produces — many independent factors stacked at one level
B65–74MODERATESeveral independent factors agree at the level
C55–64MOD/WEAKMarginal agreement — read the conflict chips alongside it
<55Not surfacedBelow the reporting floor — the encounter is not shown

A band is a measure of how much structure agrees at a level. It is not a forecast, not a probability, and not a rating of any trade. Higher bands mean a cleaner structural read — nothing about what price does next, and nothing about what you should do about it. Two encounters in the same band can behave completely differently, and the app makes no claim otherwise. Our historical measurement work on how levels behave is published separately, with its full method and its unresolved questions stated openly: measurement methodology →.

Confluence Weight Table

Every level encounter is scored 0–100+ on how much independent structure agrees there. The total is capped and mapped to a band. Hard blocks override any total.

ConfluencePointsNotes
EMA 200 align (price on the macro side)+15Macro trend agrees with the structural read
Counter-EMA−15Structure opposes the macro trend — hard block if enabled
MTF EMA 15m align+1015-min timeframe agrees
Counter-MTF 15m−10Hard filter condition if combined with counter-EMA
VWAP align+10Price is on the agreeing side of intraday fair value
Counter-VWAP−8Soft conflict — still reported if total strength is high enough
POC proximity+10Encounter at or near the volume-weighted anchor
Value Area (VAH/VAL)+8Encounter at a value-area edge — structurally significant
Opposing Value Area−10Value area is working against this level
Initial Balance (IB H/L)+6IB confluence — first 60-minute range
Prior Day High / Low+8PDH/PDL — major daily magnets
Pre-Market High / Low+8PMH/PML — overnight battlefield
ATR quality+6The session range is wide enough for the level to be meaningfully travelled to
ATR too tight−10Range is compressed — levels sit inside the noise
FVG nearby (Fair Value Gap)+6An unfilled gap sits ahead as a structural magnet
Cumulative Delta align+8Order flow agrees with the structural read
Counter-Delta−8Order flow opposes — the other side is absorbing here
RVOL ≥ 1.5×+12Strong volume — breaks are sustained
RVOL ≥ 1.2×+6Active volume
RVOL < 0.8×−12Thin participation — flagged as a Low RVOL conflict
Kill Zone (9:45–11:00)+5Prime window bonus
Power Hour (15:00–16:00)+3Secondary window bonus
Lunch (12:00–14:00)−15Chop penalty — encounters below 65 are not surfaced
Session momentum+5Trending-day confirmation (participation + persistent one-way drift)
EMA 200 touch + hold (NEW)+12Any encounter where the bar wick touched the EMA 200 zone and the close held — adds to any pattern type
ES EMA 200 bias agrees (NEW)+8ES 5-min EMA 20 sits on the same side of its EMA 200 as the NQ structural read — macro alignment
ES EMA 200 diverges (NEW)−8ES trend opposes the NQ structural read — adds an "ES Divergence" conflict chip
ES session momentum agrees (NEW)+5ES EMA 20 position relative to its EMA 200 agrees with the NQ structural read
Hard blocks override strength entirely. Counter-EMA + Counter-MTF together, or RTH + Rolling Delta both ≥300 contracts opposing, or an opposing volume-profile node within the invalidation distance — any of these suppress the encounter no matter how high the total.

Setup IDs

Each signal carries a setup ID that tells you exactly what the indicator detected:

Setup IDDescription
ORB-BREAK-LONGBreak above ORB high with volume confirmation
ORB-BREAK-SHORTBreak below ORB low with volume confirmation
VAH-RETESTValue Area High acting as support on pullback
VAL-RETESTValue Area Low bounce (prior resistance → support)
PDH-RETESTPrior Day High — major daily level test
PDL-RETESTPrior Day Low — major daily level test
VWAP-BOUNCEIntraday fair-value reversion
EMA-PULLBACKEMA 200 continuation — price pulls back into the macro trend level
PMH-RETESTPre-Market High test after RTH open
PML-RETESTPre-Market Low test after RTH open
IB-REJECTPrice wicked outside IB but closed back inside — rejection from the boundary
EMA200-BOUNCE (NEW)Price in trend, bar wick touched the EMA 200 zone (±8 ticks) and the close held — the macro level was tested and respected
FAILED-ENGULF (NEW)Outside Bar Trap (Al Brooks): bar[2] makes a strong directional move, bar[1] fully body-engulfs it in the opposite direction — trap and reversal

Time Filters

WindowET HoursScore Effect
PRE_MARKET4:00 – 9:30Nothing reported — indicator in WAITING state
ORB9:30 – 9:45WAITING — opening range still building
KILL_ZONE9:45 – 11:00+5 bonus ★ — primary session
MORNING11:00 – 12:00Normal — no adjustment
LUNCH12:00 – 14:00−15 penalty · encounters below 65 not surfaced
AFTERNOON14:00 – 15:00Normal — no adjustment
POWER_HOUR15:00 – 16:00+3 bonus — secondary session

Conflict Flags & Hard Blocks

Conflict chips appear in the web app's conflict banner. They are the app telling you what is arguing against the level — it reports them, it does not resolve them.

FlagMeaningSeverity
Counter-EMAStructural read opposes the EMA 200 macro trendHard block — encounter suppressed
Counter-MTFAgainst 15-minute EMA trendHard filter when combined with Counter-EMA
Counter-VWAPPrice is on the opposing side of intraday fair valueSoft — strength reduced
Counter-deltaRTH + rolling delta both oppose the structural readStrong warning — hard block if ≥300 contracts
Low RVOL [x]Volume below 0.8× averageSoft on retests, hard on breaks
VIX [x] high riskVIX ≥ 30Regime flag — wide, unpredictable ranges
VIX [x] elevatedVIX 25–29Regime flag — volatility running above normal
Lunch12–2 PM chop window activeReporting floor raised to 75
Conflicts stack. Two soft conflicts weigh like a hard one, and three or more means the structure at that level is genuinely contested no matter how high the strength total reads. The app shows you the stack — what you do with a contested level is your judgement.

Order Management (ATM Templates)

The package ships a set of NinjaTrader ATM templates. They are ordinary NinjaTrader order-management templates — they belong to your order entry, not to the analyzer. The Signal Analyzer does not select one for you, does not place an order, and has no knowledge of your position.

What ships

Eleven templates covering funded and evaluation account sizes across calm, normal, high-volatility and ranging conditions. Every one of them is built around the same hard risk cap: $200 maximum per contract. That cap is a fixed guardrail on the templates themselves — it is not a stop the app recommends, and the app never tells you which template to load or when.

Why a fixed risk cap

Prop evaluations are lost by outsized single-trade damage far more often than by a poor read. Capping per-contract risk at the template level means the cap holds even on a day when discipline is thin. Whether you use the templates at all, and which one, is entirely your decision.

Nothing on this page is a trading instruction. Full ATM template specifications — stop distances, target ladders and the conditions each was built for — are documented in the member Training area and ship with your download in your account.

The Kill Zone Window (9:45–11:00)

The indicator is tuned for this window. Outside it the structural picture is thinner, participation is lower, and the levels the app reports carry less agreement behind them — the app says so, via the time-filter penalties below. When and whether you engage with any of it remains your decision.

Typical Session Rhythm

TimeWhat usually happens
9:45Opening range is set — first level encounters begin registering
~10:00The first encounter typically resolves; the app resets to WATCHING after the cooldown
~10:15Second wave of level encounters
~10:30Third wave
10:45Structural activity usually thins out from here

A typical session produces four or five encounters that clear the reporting floor — the market decides how many, not the indicator. Daily limits, if you use them, are yours to set per account.

Structure Rows

During an encounter the app shows three price rows. They are the structure around price — not order levels, and not a plan.

RowWhat it reports
Level AboveThe nearest meaningful structural level above current price
Level NearThe level currently under encounter — the one the state machine is tracking
Level BelowThe nearest meaningful structural level below current price
Distance to LevelHow far price currently sits from the level under encounter, in points
These rows fail closed. If the rail has not supplied a real structural price for a row, it reads -- rather than showing a substitute number. A blank row means "no level here", never "use the last one you saw".

V5 Quality Strip

The strip shows 6 cells above the structure rows. Each cell is one independent factor, green when it agrees with the structural read at the level. More green means more of the market's moving parts are pointing the same way — it is a count of agreement, not a score for a trade.

CellGreen meansDim/Red means
RVOLParticipation is behind the moveThin — the move is happening on low volume
MTF EMA15-min trend agrees with the structural readThe higher timeframe is pointing the other way
DELTAOrder flow agrees with the structural read (shows proxy badge when running on the bar-direction proxy rather than native bid/ask delta)Order flow is fading against the level
FVGAn unfilled gap sits ahead as a structural magnetNo magnet ahead — nothing structural pulling price on
TIMEKill zone activeLunch chop — penalty applied to confluence strength
VIX (NEW)Green (VIX 12–18): calm trending conditionsOrange (18–25): elevated volatility regime. Red (25+): high volatility regime. Shows MAN badge when using manual override. Blank during backtest unless ManualVIX is set.

1M Confirmation Note

Every AT LEVEL encounter includes a trigger_note field. It describes, on the 1-minute chart, what would count as the level being genuinely accepted or rejected rather than merely touched.

Example: "1m: a 1-min close above 28782.50, then a retest holding the level — acceptance."

It is a description of the confirmation condition, in the app's own terms. It is not a cue to act, and the app does not know or care whether you do.

Key Settings Reference

SettingDefaultWhat it controls
StopTicks40The fixed invalidation distance the indicator uses internally to judge whether a level held (only when EnableAtrStop=false). 40 ticks = 10 pts. Not an order parameter — the app places nothing.
EnableAtrStoptrueScales that invalidation distance with volatility, so "the level failed" means the same thing on quiet and violent days
AtrStopMult / MinStopTicks / MaxStopTicks1.05 / 10 / 28ATR multiplier with a 2.5pt floor and a 7pt cap on that internal distance
TargetRR2.0The reward-distance multiple used internally when measuring whether a level extended. Purely a measurement setting.
MinFireScore53Minimum confluence strength for an encounter to be surfaced. Lowered from 60 → 53 in the 2026-05-11 tune so band C and above stay visible
ApproachTicks7 (~1.75 pts)Distance from level that triggers APPROACHING state. Lowered from 12 → 7 (scalp tune)
CooldownBars1 (5 min)Minimum gap between any two reported encounters
HitResetBars1Backtest only: bars to show the resolution card before resetting. In live mode the indicator resets after 30 seconds regardless of bar close.
ManualVIX0 (auto)Set to 0 for live auto-poll of /api/vix every 5 min. Paste a value (e.g. 18.5) to override — useful in backtest where auto-poll is disabled.
EnableESCorrelationtrueLoads a secondary ES 5-min data series. ES EMA 20 vs EMA 200 cross contributes ±8 pts (bias) + ±5 pts (session momentum) to the active encounter.
ESSymbol@ESES continuous contract symbol. If @ES isn't in your Instrument Manager, use the front-month (e.g. ES 06-26). Rolls quarterly.
SetupRearmBars4 (20 min)Delay before the same specific pattern (e.g. ORB-BREAK-LONG) can be reported again
MinRVOLForBreak0.70Minimum RVOL for break patterns (trending days have lagging RVOL)
CounterDeltaHardBlockMin300Both delta readings ≥ this magnitude opposing = hard block. Set 0 to disable
EnableHardFiltertrueMaster switch for all hard-block conditions
HttpPort8081Must match your cloudflared tunnel config
OutputPathG:\…\Telemetry\Relocated 2026-05-13 from C:\PBF\ to Google Drive for auto-backup. Falls back to C:\PBF\Telemetry-fallback\ on IOException after 3 retries.
DollarPerPoint20Point value used when logging move sizes. NQ is $20/pt; change for MNQ ($2/pt) or other instruments
SheetsLogUrl(blank)Paste your Apps Script URL here to enable Google Sheets logging

Session-Adaptive Scoring (NEW · 2026-05-13)

The indicator flexes its reporting floor and approach distance by session phase. KILLZONE (9:30–11:00 ET) and POWER_HOUR (15:00–16:00 ET) loosen; LUNCH (12:00–14:00 ET) tightens. Shadow variables reset to your user-set baseline every bar — no ratcheting across phases.

SettingDefaultEffect
EnableSessionAdaptivetrueMaster switch. Off = always use the raw MinFireScore/ApproachTicks.
KillzoneMinScore48Lower reporting floor during momentum phases. Uses min(MinFireScore, KillzoneMinScore) — never raises.
LunchMinScore62Higher reporting floor during chop. Uses max(MinFireScore, LunchMinScore) — never lowers.
KillzoneApproachTicks / LunchApproachTicks6 / 12Faster trigger in momentum (6) / slower in chop (12).

JSON snapshot now includes eff_min_fire_score, eff_approach_ticks, and session_adaptive.

Daily Discipline Caps (NEW · 2026-05-13)

Three optional rails that stop the indicator surfacing new encounters for the rest of the day once a limit you set is reached. OFF by default. Built for prop accounts (Apex, TPT, MFFU, Tradeify) where one bad day busts the eval. State transitions on an encounter already in progress are unaffected. These are limits you configure on what the app shows you — they are not the app managing your trading.

SettingDefaultRecommended (prop)Behavior
EnableDailyCapsfalsetrueMaster switch.
DailyMaxFires0 (unlimited)5Hard cap on encounters surfaced per session.
DailyTargetR0+4RStop surfacing new encounters once the day's logged R reaches +X.
DailyMaxLossR0−2RStop surfacing new encounters once the day's logged R drops to −X.

NT8 Output window prints which cap fired and why. JSON exposes daily_r, daily_caps_tripped, daily_cap_reason ("MAX_FIRES" / "TARGET_R" / "MAX_LOSS_R").

Why this exists: a screen that keeps producing new things to look at, late in a bad day, is working against you. These rails let you decide in advance when the app should go quiet. The decision is set by you, before the session, in the indicator settings.

Resolution Summary Card (NEW · 2026-05-14)

When an encounter resolves — in the level's favour or against it — the structure rows are replaced by a compact summary of the move. This prevents confusion: those prices describe something that already happened, not structure currently in play.

ElementWhat it shows
Band rowShows ✓ Resolved (green) or ✗ Resolved (red). No band, no state label.
Summary cardLevel → where it resolved · distance travelled (pts) — e.g. "19574.50 → 19588.50 | +14.00 pts"
Reset timingLive: card auto-clears in ~30 seconds, then WATCHING resumes on the next level. Backtest: clears after 1 bar (bar-based so Market Replay doesn't flash past it).
Distance chipHidden while a resolution card is showing — it returns when price next approaches a level.
Why this matters: before this change the overlay kept stale price rows lit in green and red after an encounter had already resolved — visually indistinguishable from live structure. Reporting resolved history as if it were current is the one failure mode a structure display cannot have.

EMA200-BOUNCE + FAILED-ENGULF Setups (NEW · 2026-05-14)

Two pattern types in the detection engine. Both can reach band A when confluence at the level is high.

EMA200-BOUNCE

Detects when price is in a trend, pulls back to touch the EMA 200 zone (±2 pts), and the bar closes holding above/below it. Structurally this is one of the cleanest continuation reads available — price came to the macro level, tested it, and it held.

Why this was missing before: The indicator had EMA alignment scoring (+15 when price is on the right side) but never detected the specific touch-and-hold pattern. A bar that dipped to the EMA then ripped scored 0 and was never surfaced. This fixes that.

FAILED-ENGULF (Outside Bar Trap)

Detects Al Brooks' "Outside Bar Trap" — where a strong directional bar is immediately followed by a larger bar that fully body-engulfs it in the opposite direction. The first bar's traders are trapped.

ES Correlation Scoring (NEW · 2026-05-14)

The indicator loads a secondary ES (S&P 500 futures) 5-minute data series and uses the relationship between ES EMA 20 and EMA 200 as a macro bias filter on every NQ level encounter.

ConditionScore effectLogic
ES EMA 20 above EMA 200 (bull) + NQ long-side context+8 +5 = +13ES trending up, NQ structure is with the tide — max bonus
ES EMA 20 below EMA 200 (bear) + NQ short-side context+8 +5 = +13ES trending down, NQ short-side structure confirmed
ES EMA 20 above EMA 200 (bull) + NQ short-side context−8NQ short-side structure against a bullish ES — adds "ES Divergence" conflict chip
ES EMA 20 below EMA 200 (bear) + NQ long-side context−8Long-side NQ structure against bearish ES — adds "ES Divergence" chip
ES data unavailable / indicator not loaded0Neutral — scoring proceeds without ES factor. es_corr_ok: false in JSON.
Setup: In indicator properties under Group 6 - Market Context, set EnableESCorrelation = true and ESSymbol to the front-month contract in your Instrument Manager (e.g. ES 06-26). If the symbol isn't found, ES scoring silently disables — the indicator still loads and all other scoring works normally. The VIX strip cell shows es_corr_ok status; the score breakdown panel shows an ES pill with the ± points when active.

Live VIX in the Quality Strip (NEW · 2026-05-14)

The VIX tile polls profitbyfaith.com/api/vix every 5 minutes in the background and displays live volatility in the quality strip. No manual paste needed in live trading.

How to Read It Well

  1. Read the state before the numbers. WATCHING, APPROACHING and AT LEVEL mean different things. A price row means very little until you know which state produced it.
  2. Band A with a full green strip is the cleanest structural agreement the session offers. That is a statement about structure, not about outcome — the app is not telling you it will work, and it is not telling you to do anything.
  3. Read the conflict chips as carefully as the strength number. A high total with three chips under it is a contested level, not a good one.
  4. The 1M Confirmation note is the finer-grained version of the same read. It describes what acceptance or rejection would look like on the 1-minute chart — nothing more.
  5. Delta describes participation, it does not decide anything. It tells you who is leaning on the level right now.
  6. The app reports the structure. Every decision is yours. Whether to engage, which direction, what size, where risk sits, when to be flat — none of that is in the app, by design.
  7. Same structure, different accounts. The structural picture is one thing; how each of your accounts is run is entirely separate from it.
  8. Nothing here is advice. The Signal Analyzer publishes no direction, no entry, no stop, no target, no probability and no win rate — and it never will. It is a structure and context companion.
Educational tool only. The Signal Analyzer is a trading education and analysis platform — not financial advice. Past performance does not guarantee future results. Trading futures involves substantial risk and is not suitable for every investor.