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.
Contents
- What It Does
- Installation & Activation
- Encounter State Progression
- Confluence Bands
- Confluence Weight Table
- Setup IDs
- Time Filters
- Conflict Flags & Hard Blocks
- Order Management (ATM Templates)
- The Kill Zone Window (9:45–11:00)
- V5 Quality Strip
- 1M Confirmation Note
- Key Settings Reference
- HIT / STOPPED Trade Summary Card
- EMA200-BOUNCE + FAILED-ENGULF Setups
- ES Correlation Scoring
- Live VIX in the Quality Strip
- How to Read It Well
What It Does
- Confluence bands — every level encounter is banded A (most structure agreeing), B, or C, from the factor count and the conflicts present
- RTH + Rolling Delta — both delta timeframes must align for full credit; strong opposition suppresses the encounter
- ATR-adaptive measurement — the approach band and internal level-resolution distances scale with volatility, so "close to a level" means the same thing on quiet and violent days
- ORB + Cornerstone confluence — overlays the opening range with prior-day levels, IB, VWAP and volume-profile nodes
- Counter-Delta hard block — suppresses an encounter when both delta readings strongly oppose the structural read (≥300 contracts NQ default)
- Live web app — read the same structure from any browser, tied to your Supabase account, 7-day session
- Google Sheets logging — every reported encounter auto-logs with how it resolved, for your own review
Installation & Activation
Full walkthrough in Getting Started. Quick path:
- Download
PBFIndicators.zipfrom your account - NT8 → Tools → Import → NinjaScript Add-On → select the ZIP
- Add
PBFSignalAnalyzerV5Betato your NQ 5-minute chart - First load opens browser to
profitbyfaith.com/activate→ click Approve → indicator unlocks within 15 seconds
@NQ). It pulls daily and weekly data internally — you do not need separate timeframe panels.
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.
| State | What it reports | What it means |
|---|---|---|
| WAITING | Pre-market or ORB building (9:30–9:45) | No structure is set yet — the indicator is arming |
| WATCHING | ORB is set, price is away from known levels | Structure is defined and nothing is being encountered |
| APPROACHING | Price has entered the ATR approach band around a level | A level is close enough to matter |
AT LEVEL (ACTIVE in JSON) | Price is at the level | The encounter is happening now |
| RESOLVED ✓ | The encounter resolved in the level's favour — overlay shows a summary card of the move | Resets to WATCHING in ~30 seconds (live) or 1 bar (backtest) |
| RESOLVED ✗ | The encounter resolved against the level — overlay shows a summary card of the move | Resets to WATCHING in ~30 seconds (live) or 1 bar (backtest) |
Confluence Bands
| Band | Strength | Label | What it describes |
|---|---|---|---|
| A ★ | 75+ | STRONG | The cleanest structural agreement the session produces — many independent factors stacked at one level |
| B | 65–74 | MODERATE | Several independent factors agree at the level |
| C | 55–64 | MOD/WEAK | Marginal agreement — read the conflict chips alongside it |
| — | <55 | Not surfaced | Below 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.
| Confluence | Points | Notes |
|---|---|---|
| EMA 200 align (price on the macro side) | +15 | Macro trend agrees with the structural read |
| Counter-EMA | −15 | Structure opposes the macro trend — hard block if enabled |
| MTF EMA 15m align | +10 | 15-min timeframe agrees |
| Counter-MTF 15m | −10 | Hard filter condition if combined with counter-EMA |
| VWAP align | +10 | Price is on the agreeing side of intraday fair value |
| Counter-VWAP | −8 | Soft conflict — still reported if total strength is high enough |
| POC proximity | +10 | Encounter at or near the volume-weighted anchor |
| Value Area (VAH/VAL) | +8 | Encounter at a value-area edge — structurally significant |
| Opposing Value Area | −10 | Value area is working against this level |
| Initial Balance (IB H/L) | +6 | IB confluence — first 60-minute range |
| Prior Day High / Low | +8 | PDH/PDL — major daily magnets |
| Pre-Market High / Low | +8 | PMH/PML — overnight battlefield |
| ATR quality | +6 | The session range is wide enough for the level to be meaningfully travelled to |
| ATR too tight | −10 | Range is compressed — levels sit inside the noise |
| FVG nearby (Fair Value Gap) | +6 | An unfilled gap sits ahead as a structural magnet |
| Cumulative Delta align | +8 | Order flow agrees with the structural read |
| Counter-Delta | −8 | Order flow opposes — the other side is absorbing here |
| RVOL ≥ 1.5× | +12 | Strong volume — breaks are sustained |
| RVOL ≥ 1.2× | +6 | Active volume |
| RVOL < 0.8× | −12 | Thin participation — flagged as a Low RVOL conflict |
| Kill Zone (9:45–11:00) | +5 | Prime window bonus |
| Power Hour (15:00–16:00) | +3 | Secondary window bonus |
| Lunch (12:00–14:00) | −15 | Chop penalty — encounters below 65 are not surfaced |
| Session momentum | +5 | Trending-day confirmation (participation + persistent one-way drift) |
| EMA 200 touch + hold (NEW) | +12 | Any 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) | +8 | ES 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) | −8 | ES trend opposes the NQ structural read — adds an "ES Divergence" conflict chip |
| ES session momentum agrees (NEW) | +5 | ES EMA 20 position relative to its EMA 200 agrees with the NQ structural read |
Setup IDs
Each signal carries a setup ID that tells you exactly what the indicator detected:
| Setup ID | Description |
|---|---|
ORB-BREAK-LONG | Break above ORB high with volume confirmation |
ORB-BREAK-SHORT | Break below ORB low with volume confirmation |
VAH-RETEST | Value Area High acting as support on pullback |
VAL-RETEST | Value Area Low bounce (prior resistance → support) |
PDH-RETEST | Prior Day High — major daily level test |
PDL-RETEST | Prior Day Low — major daily level test |
VWAP-BOUNCE | Intraday fair-value reversion |
EMA-PULLBACK | EMA 200 continuation — price pulls back into the macro trend level |
PMH-RETEST | Pre-Market High test after RTH open |
PML-RETEST | Pre-Market Low test after RTH open |
IB-REJECT | Price 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
| Window | ET Hours | Score Effect |
|---|---|---|
PRE_MARKET | 4:00 – 9:30 | Nothing reported — indicator in WAITING state |
ORB | 9:30 – 9:45 | WAITING — opening range still building |
KILL_ZONE | 9:45 – 11:00 | +5 bonus ★ — primary session |
MORNING | 11:00 – 12:00 | Normal — no adjustment |
LUNCH | 12:00 – 14:00 | −15 penalty · encounters below 65 not surfaced |
AFTERNOON | 14:00 – 15:00 | Normal — no adjustment |
POWER_HOUR | 15: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.
| Flag | Meaning | Severity |
|---|---|---|
| Counter-EMA | Structural read opposes the EMA 200 macro trend | Hard block — encounter suppressed |
| Counter-MTF | Against 15-minute EMA trend | Hard filter when combined with Counter-EMA |
| Counter-VWAP | Price is on the opposing side of intraday fair value | Soft — strength reduced |
| Counter-delta | RTH + rolling delta both oppose the structural read | Strong warning — hard block if ≥300 contracts |
| Low RVOL [x] | Volume below 0.8× average | Soft on retests, hard on breaks |
| VIX [x] high risk | VIX ≥ 30 | Regime flag — wide, unpredictable ranges |
| VIX [x] elevated | VIX 25–29 | Regime flag — volatility running above normal |
| Lunch | 12–2 PM chop window active | Reporting floor raised to 75 |
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.
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
| Time | What usually happens |
|---|---|
| 9:45 | Opening range is set — first level encounters begin registering |
| ~10:00 | The first encounter typically resolves; the app resets to WATCHING after the cooldown |
| ~10:15 | Second wave of level encounters |
| ~10:30 | Third wave |
| 10:45 | Structural 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.
| Row | What it reports |
|---|---|
| Level Above | The nearest meaningful structural level above current price |
| Level Near | The level currently under encounter — the one the state machine is tracking |
| Level Below | The nearest meaningful structural level below current price |
| Distance to Level | How far price currently sits from the level under encounter, in points |
-- 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.
| Cell | Green means | Dim/Red means |
|---|---|---|
| RVOL | Participation is behind the move | Thin — the move is happening on low volume |
| MTF EMA | 15-min trend agrees with the structural read | The higher timeframe is pointing the other way |
| DELTA | Order 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 |
| FVG | An unfilled gap sits ahead as a structural magnet | No magnet ahead — nothing structural pulling price on |
| TIME | Kill zone active | Lunch chop — penalty applied to confluence strength |
| VIX (NEW) | Green (VIX 12–18): calm trending conditions | Orange (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.
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
| Setting | Default | What it controls |
|---|---|---|
StopTicks | 40 | The 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. |
EnableAtrStop | true | Scales that invalidation distance with volatility, so "the level failed" means the same thing on quiet and violent days |
AtrStopMult / MinStopTicks / MaxStopTicks | 1.05 / 10 / 28 | ATR multiplier with a 2.5pt floor and a 7pt cap on that internal distance |
TargetRR | 2.0 | The reward-distance multiple used internally when measuring whether a level extended. Purely a measurement setting. |
MinFireScore | 53 | Minimum 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 |
ApproachTicks | 7 (~1.75 pts) | Distance from level that triggers APPROACHING state. Lowered from 12 → 7 (scalp tune) |
CooldownBars | 1 (5 min) | Minimum gap between any two reported encounters |
HitResetBars | 1 | Backtest only: bars to show the resolution card before resetting. In live mode the indicator resets after 30 seconds regardless of bar close. |
ManualVIX | 0 (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. |
EnableESCorrelation | true | Loads 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 | @ES | ES continuous contract symbol. If @ES isn't in your Instrument Manager, use the front-month (e.g. ES 06-26). Rolls quarterly. |
SetupRearmBars | 4 (20 min) | Delay before the same specific pattern (e.g. ORB-BREAK-LONG) can be reported again |
MinRVOLForBreak | 0.70 | Minimum RVOL for break patterns (trending days have lagging RVOL) |
CounterDeltaHardBlockMin | 300 | Both delta readings ≥ this magnitude opposing = hard block. Set 0 to disable |
EnableHardFilter | true | Master switch for all hard-block conditions |
HttpPort | 8081 | Must match your cloudflared tunnel config |
OutputPath | G:\…\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. |
DollarPerPoint | 20 | Point 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.
| Setting | Default | Effect |
|---|---|---|
EnableSessionAdaptive | true | Master switch. Off = always use the raw MinFireScore/ApproachTicks. |
KillzoneMinScore | 48 | Lower reporting floor during momentum phases. Uses min(MinFireScore, KillzoneMinScore) — never raises. |
LunchMinScore | 62 | Higher reporting floor during chop. Uses max(MinFireScore, LunchMinScore) — never lowers. |
KillzoneApproachTicks / LunchApproachTicks | 6 / 12 | Faster 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.
| Setting | Default | Recommended (prop) | Behavior |
|---|---|---|---|
EnableDailyCaps | false | true | Master switch. |
DailyMaxFires | 0 (unlimited) | 5 | Hard cap on encounters surfaced per session. |
DailyTargetR | 0 | +4R | Stop surfacing new encounters once the day's logged R reaches +X. |
DailyMaxLossR | 0 | −2R | Stop 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").
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.
| Element | What it shows |
|---|---|
| Band row | Shows ✓ Resolved (green) or ✗ Resolved (red). No band, no state label. |
| Summary card | Level → where it resolved · distance travelled (pts) — e.g. "19574.50 → 19588.50 | +14.00 pts" |
| Reset timing | Live: 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 chip | Hidden while a resolution card is showing — it returns when price next approaches a level. |
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.
- Long bias: Price above EMA 200 → bar wicks down into ±2pt zone → close holds above EMA. Not a break — a test and hold.
- Short bias: Inverse — price below EMA 200 → wick up into zone → close holds below.
- Auto-bonus: any pattern (not just EMA200-BOUNCE) where the bar wick touches the EMA 200 zone also earns the EMA Touch +12 bonus. A PDH-RETEST at EMA 200 scores both simultaneously.
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.
- Requires minimum 2pt bodies (filters out doji noise).
- Bullish structure: bar[2] bearish → bar[1] bull body fully engulfs it (opens at or below bar[2] close, closes at or above bar[2] open). Bears trapped, bulls take over.
- Bearish structure: inverse.
- Invalidation is measured from bar[2] high/low — the level where the original move started. That is where the pattern would be proven wrong, not an order price.
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.
| Condition | Score effect | Logic |
|---|---|---|
| ES EMA 20 above EMA 200 (bull) + NQ long-side context | +8 +5 = +13 | ES trending up, NQ structure is with the tide — max bonus |
| ES EMA 20 below EMA 200 (bear) + NQ short-side context | +8 +5 = +13 | ES trending down, NQ short-side structure confirmed |
| ES EMA 20 above EMA 200 (bull) + NQ short-side context | −8 | NQ short-side structure against a bullish ES — adds "ES Divergence" conflict chip |
| ES EMA 20 below EMA 200 (bear) + NQ long-side context | −8 | Long-side NQ structure against bearish ES — adds "ES Divergence" chip |
| ES data unavailable / indicator not loaded | 0 | Neutral — scoring proceeds without ES factor. es_corr_ok: false in JSON. |
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.
- Green (VIX 12–18): calm regime — ranges behave, levels tend to hold or break cleanly.
- Orange (VIX 18–25): elevated regime — wider swings around every level. Conflict chips appear when VIX ≥ 25.
- Red (VIX ≥ 25): high-volatility regime — levels are frequently overshot before they matter. VIX ≥ 30 triggers a hard "VIX high risk" conflict chip.
- MAN badge: Shows when
ManualVIXis set to a non-zero value — auto-poll is overridden. Useful in backtest to simulate specific volatility environments. - Backtest: Auto-poll is disabled (live URL data has no meaning for historical replay). Set
ManualVIXto whatever VIX was on the day you're backtesting — this also feeds the VIX conflict scoring in the engine.
How to Read It Well
- 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.
- 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.
- 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.
- 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.
- Delta describes participation, it does not decide anything. It tells you who is leaning on the level right now.
- 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.
- Same structure, different accounts. The structural picture is one thing; how each of your accounts is run is entirely separate from it.
- 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.