Gold rips into weekly resistance — real yields still say fade
Gold rips into weekly resistance — real yields still say fade
The tape: Spot gold ripped +2.96% intraday to 4,113.40, printing a session high 4,113.89 that tags weekly R1 (4,094.57) and daily R1 (4,102.09) at the same time. The macro: but the 10y TIPS real yield ticked up another 2 bp to 2.37% and Fed-funds futures now price 27% odds of a hike at the July 29 FOMC — that's a hawkish rates tape, not the kind of backdrop that sustains a runaway metal. The read: the intraday move is real but stretched (1h RSI 78.9, price $46 above 1h EMA20), and it's happening under a still-bearish daily EMA stack. Net desk bias is a fade, but only into the 4,130–4,180 resistance shelf; the dip-buy is the daily-pivot / golden-pocket confluence around 4,045–4,055.
The session
Gold spent most of the last five sessions coiling in the 3,982–4,050 pocket, absorbing repeated tests of the psychological 4,000 handle. That base broke in the last few hours: PAXGUSDT ran from ~4,000 to 4,113.89 in a single impulse, closing +2.96% at 4,113.40. COMEX front-month (GC=F) followed with a smaller +2.25%, so PAXG is now trading at a 17-bp premium to futures — a small dislocation that usually mean-reverts inside 24h. Investing.com framed the same move: "Gold up nearly 2%, catching a bid after repeatedly testing key $4,000/oz level" and "Gold hits 5h high near upper Bollinger Band." The bid appears to be a squeeze of positioning that had been leaning short into the 4,000 test, not a fundamental repricing — DXY is essentially unchanged (101.19, +0.01%) and 10y real yields rose, which is the opposite of what a real macro bid for gold looks like.
Multi-timeframe read
- 15m: RSI 76.9, MACD histogram +3.72 and rising, price $26 above EMA20 and $38 above EMA50. Textbook overextension.
- 1h: RSI 78.9, price $45 above EMA20, $68 above EMA50. Trend up, but far above trend.
- 4h: RSI 72.7, MACD hist +9.49, price $71 above EMA20 (no EMA50 series available this run). Cleanly bullish but overbought.
- 1d: RSI only 53.0, MACD hist +10.31, price above EMA20 (4,067) but still $53 below EMA50 (4,167) and $272 below EMA200 (4,386).
The three intraday frames agree: overbought squeeze. The daily says something different — this is a rally inside a still-bearish EMA structure. Investing.com's automated aggregate reads Daily = Neutral with a Strong-Buy MA panel; that Neutral tag matches the daily RSI 53 and disagrees with the intraday euphoria — divergence worth noting.
Macro frame
Lead with the real-yield tape because that's what actually prices gold. US 10y TIPS real yield: 2.37%, +2 bp d/d. 10y breakeven inflation 2.26% (+1 bp). 10y nominal 4.63% (+3 bp). Real is grinding higher — that's a headwind for a zero-carry asset, not a tailwind, and the direction is being reinforced by Fed-funds futures: cut 0%, hold 73%, hike 27% into Jul 29. A market that assigns non-trivial hike odds is a market that expects real yields to keep drifting up. In pure macro-framework terms, gold should be selling, not screaming.
Dollar side: DXY 101.19, +0.01% intraday, +0.25% week, +0.34% month. Daily EMA stack bullish (price above 20/50/200), but hourly MACD histogram just rolled negative. The 30-day DXY↔XAU daily-return correlation is –0.55 — still meaningfully inverse, so a flat DXY does not by itself explain a 2.96% gold day. That's the tell: today's move is inconsistent with the drivers.
Cross-asset: VIX 17.05, –8.6% — risk tone is risk-on, not fear (fear would justify a gold bid; risk-on doesn't). GVZ (gold vol) at 23.94 is elevated relative to VIX, so options are pricing more chop specifically in gold. Gold/silver ratio 68.4 with silver at $60.18 — the ratio has compressed, which is a mildly bullish PM-regime read (silver leading). WTI $85.56 (+2.8%) adds a small inflation-proxy tailwind. Bitcoin $66,317 (+1.7%) doesn't confirm a "flight-to-store-of-value" narrative — the digital-gold cousin is only mildly higher.
Net: the macro map (real yields up, hike odds non-trivial, DXY firm, VIX crushed, BTC only mildly bid) does not endorse a durable breakout. Fade lean.
Two scenarios
This section is qualitative conviction, not a back-tested win rate.
Sell setup
- Trigger: Rejection wick or 1h close back below 4,102 (daily R1) after any tag of the 4,130–4,180 shelf (daily R2 at 4,130.16 → weekly R2 4,183.04 → daily R3 4,180.33 all clustered).
- Invalidation: 1h close above 4,190. Above there the fib swing is invalid and the next magnet is the daily EMA50 at 4,167 already breached from below.
- Target: 4,051.92 (daily pivot) first, stretch 4,024 (daily S1 / weekly-pivot area 4,027.55).
- Conviction: 60%.
- Rationale: 1h RSI 78.9, price stretched $45–70 above intraday EMAs, running straight into a triple-pivot confluence, all while real yields are rising and Fed odds carry a hike tail. The macro map does not support price staying up here.
Buy setup
- Trigger: Pullback into 4,040–4,055 (fib 0.5–0.618 of the 3,995.27→4,113.89 session swing = the golden pocket, and it overlaps the daily pivot at 4,051.92) with a 15m bullish reversal candle and RSI reset toward 50.
- Invalidation: 15m/1h close below 4,024 (daily S1). Below that the golden pocket has failed and 3,995 (session low) and 3,974 (daily S2) come into play.
- Target: 4,102 (daily R1) first, stretch 4,130 (daily R2).
- Conviction: 45%.
- Rationale: The intraday trend is genuinely up on 15m/1h/4h and the golden pocket is the mechanically-obvious reaction zone. Lower conviction than the fade because it's counter to the daily EMA structure and to the real-yield tape — only playable as a scalp inside the intraday impulse, not as a swing.
Levels worth marking
- Resistance: 4,102.09 (daily R1) · 4,113.89 (session high) · 4,130.16 (daily R2) · 4,167 (daily EMA50, key macro pivot) · 4,180.33 (daily R3) · 4,183.04 (weekly R2) · 4,250.06 (weekly R3).
- Support: 4,094.57 (weekly R1 flipped from resistance if reclaimed) · 4,067 (daily EMA20) · 4,051.92 (daily pivot) · 4,027.55 (weekly pivot) · 4,023.85 (daily S1) · 3,995.27 (session low) · 3,973.68 (daily S2) · 3,939.08 (weekly S1).
- Fibonacci (session swing 3,995.27 → 4,113.89): 0.236 = 4,085.90 · 0.382 = 4,068.58 · 0.5 = 4,054.58 · 0.618 = 4,040.58 · 0.786 = 4,020.30. The golden pocket lands directly on daily pivot 4,051.92 — that is the setup.
Calendar / catalysts
From the pre-fetched ForexFactory block:
- Wed Jul 22 · 09:00 GMT · GBP · High · CPI y/y, forecast 2.7% vs prev 2.8%. A softer-than-forecast UK print keeps DXY firm via GBP weakness → gold headwind; a hot print reverses.
- Retrospective (already released): CAD CPI m/m actual –0.4% vs forecast –0.2% (dovish BoC read, mildly USD-supportive); NZ CPI q/q 1.5% vs 1.4% (hot); UK Claimant Count +6.7K vs +29.4K forecast (much stronger than expected — GBP-supportive, DXY-mildly-negative).
- No US top-tier data in the pre-fetched window, so the standing catalyst is the Jul 29 FOMC (currently 73% hold / 27% hike / 0% cut). Any Fed-speak between now and then that shifts that distribution moves gold more than any single data print.
Sources cited
Onewordnews search (kitco, dailyfx excerpts); investing.com headlines (gold Bollinger tag, $4,000 test, chipmaker/Asia stocks context); ForexFactory economic calendar (CAD/NZD/GBP CPI, UK Claimant Count, upcoming UK CPI); US Treasury.gov real yield curve (10y TIPS 2.37%); CME/Fed-funds futures implied probabilities for Jul 29 FOMC; investing.com automated technical aggregate (Daily = Neutral). CFTC COT unavailable this run.
Desk summary & bias
Gold's 2.96% impulse is a real move but a stretched one, and it's happening against the macro. The 10y real yield keeps grinding higher (2.37%, +2 bp) and Fed-funds futures put 27% weight on a hike into Jul 29 — that path lifts real yields further and, mechanically, weighs on a zero-carry asset. DXY is flat and VIX collapsed, so there's no macro-fear bid either. Technically, 15m/1h/4h are overbought (RSI 72–79) into a triple confluence at 4,130–4,180, while the daily is still sub-EMA50/EMA200. The single thing to watch next: whether the 4,130–4,180 shelf caps the move, or whether a hold above 4,102 on retest sets up continuation into 4,183.
| # | Bias | Setup | Trigger | Entry zone | Invalidation | Target | Conviction | Why |
|---|---|---|---|---|---|---|---|---|
| 1 | SELL | Resistance-shelf fade | 1h rejection at triple pivot | 4,130 – 4,180 | 4,190 | 4,052 (stretch 4,024) | 60% | 1h RSI 78.9, real yields up, DXY firm, hike tail into FOMC |
| 2 | BUY | Golden-pocket scalp | 15m bullish reversal + RSI reset | 4,040 – 4,055 | 4,024 | 4,102 (stretch 4,130) | 45% | Fib 0.5–0.618 overlaps daily pivot 4,052; intraday trend still up |
| 3 | SELL | Swing (position) fade | Daily close back below 4,067 (EMA20) | 4,067 – 4,095 | 4,167 (daily EMA50) | 3,939 (weekly S1) | 50% | Daily still sub-EMA50/EMA200; macro tape (real yields, Fed odds) does the work |
Net desk bias: SELL. The real-yield tape is the single most important variable for gold and it's pushing the wrong way for bulls; Fed-funds futures reinforce that by carrying a non-trivial hike probability. Intraday technicals are overbought into layered resistance while the daily EMA stack is unchanged and bearish. If the 4,130–4,180 shelf caps this move, the fade prints; if it doesn't, we'll respect the invalidation at 4,190 and reassess — but until then, we weight macro over the intraday squeeze.
(not financial advice)
//@version=5
indicator("Gold Desk 2026-07-22 — bias SELL", overlay=true, max_lines_count=300, max_labels_count=300, max_boxes_count=100)
// ── Inputs ──
showFibs = input.bool(true, "Show Fibonacci retracement")
showZones = input.bool(true, "Show S/R + trade zones")
showTrades = input.bool(true, "Show trade ideas (1 BUY, 1 SELL)")
// ── EMAs (per-bar plots are fine — they're a series, not a redraw) ──
ema20 = ta.ema(close, 20)
ema50 = ta.ema(close, 50)
ema200 = ta.ema(close, 200)
plot(ema20, "EMA20", color=color.new(color.yellow, 0), linewidth=1)
plot(ema50, "EMA50", color=color.new(color.orange, 0), linewidth=1)
plot(ema200, "EMA200", color=color.new(color.red, 0), linewidth=2)
// ── Levels from the desk note (all sourced from the snapshot) ──
swingHigh = 4113.89
swingLow = 3995.27
fib236 = swingHigh - (swingHigh - swingLow) * 0.236
fib382 = swingHigh - (swingHigh - swingLow) * 0.382
fib500 = swingHigh - (swingHigh - swingLow) * 0.500
fib618 = swingHigh - (swingHigh - swingLow) * 0.618
fib786 = swingHigh - (swingHigh - swingLow) * 0.786
dR3 = 4180.33
dR2 = 4130.16
dR1 = 4102.09
dP = 4051.92
dS1 = 4023.85
dS2 = 3973.68
wR2 = 4183.04
wR1 = 4094.57
wS1 = 3939.08
// ── Trade idea levels (mirror the trade-levels JSON below) ──
sellEntryLo = 4130.16
sellEntryHi = 4180.33
sellInvalid = 4190.00
sellTarget = 4051.92
buyEntryLo = 4040.58
buyEntryHi = 4054.58
buyInvalid = 4023.85
buyTarget = 4102.09
// ── Persistent objects: created ONCE, updated only on the last bar ──
// This is the key pattern — without `var` + delete-on-last-bar, TradingView redraws every box on every candle and you get overlapping ghost fills.
var box goldenPocket = na
var box sellZone = na
var box buyZone = na
var box supplyBox = na
var box demandBox = na
var line sellInvLine = na
var line sellTgtLine = na
var line buyInvLine = na
var line buyTgtLine = na
var label sellLbl = na
var label buyLbl = na
var label pocketLbl = na
var table biasTable = na
// ── Static horizontal levels (hlines redraw cheaply, one series each) ──
hline(fib236, "Fib 0.236", color=color.new(color.gray, 60), linestyle=hline.style_dotted)
hline(fib382, "Fib 0.382", color=color.new(color.gray, 50), linestyle=hline.style_dotted)
hline(fib618, "Fib 0.618", color=color.new(color.gray, 50), linestyle=hline.style_dotted)
hline(fib786, "Fib 0.786", color=color.new(color.gray, 60), linestyle=hline.style_dotted)
hline(dR2, "Daily R2", color=color.new(color.red, 30), linestyle=hline.style_solid)
hline(dR1, "Daily R1", color=color.new(color.red, 55), linestyle=hline.style_solid)
hline(dP, "Daily P", color=color.new(color.blue, 30), linestyle=hline.style_solid)
hline(dS1, "Daily S1", color=color.new(color.green, 55), linestyle=hline.style_solid)
hline(dS2, "Daily S2", color=color.new(color.green, 30), linestyle=hline.style_solid)
hline(wR2, "Weekly R2", color=color.new(color.maroon, 20), linestyle=hline.style_dashed)
hline(wR1, "Weekly R1", color=color.new(color.maroon, 40), linestyle=hline.style_dashed)
hline(wS1, "Weekly S1", color=color.new(color.teal, 30), linestyle=hline.style_dashed)
// ── Draw the boxes/labels once at the last bar, deleting prior instances so nothing tiles ──
if barstate.islast
box.delete(goldenPocket)
box.delete(sellZone)
box.delete(buyZone)
box.delete(supplyBox)
box.delete(demandBox)
line.delete(sellInvLine)
line.delete(sellTgtLine)
line.delete(buyInvLine)
line.delete(buyTgtLine)
label.delete(sellLbl)
label.delete(buyLbl)
label.delete(pocketLbl)
leftBar = bar_index - 80
rightBar = bar_index + 40
// ── Supply zone (4,130–4,180 shelf) ──
if showZones
supplyBox := box.new(leftBar, dR3, rightBar, dR2, bgcolor=color.new(color.red, 85), border_color=color.new(color.red, 30), border_width=1)
// ── Demand zone (4,024–3,974) ──
if showZones
demandBox := box.new(leftBar, dS1, rightBar, dS2, bgcolor=color.new(color.green, 85), border_color=color.new(color.green, 30), border_width=1)
// ── Fibonacci golden pocket (0.5–0.618) ──
if showFibs
goldenPocket := box.new(leftBar, fib500, rightBar, fib618, bgcolor=color.new(color.yellow, 78), border_color=color.new(color.orange, 40), border_width=1)
pocketLbl := label.new(rightBar, (fib500 + fib618) / 2, "Golden Pocket 0.5–0.618", color=color.new(color.orange, 30), textcolor=color.white, style=label.style_label_left, size=size.small)
// ── Trade idea: SELL 4,130–4,180, invalid 4,190, target 4,052 ──
if showTrades
sellZone := box.new(leftBar, sellEntryHi, rightBar, sellEntryLo, bgcolor=color.new(color.red, 72), border_color=color.new(color.red, 20), border_width=1)
sellInvLine := line.new(leftBar, sellInvalid, rightBar, sellInvalid, color=color.new(color.red, 0), style=line.style_dashed, width=2)
sellTgtLine := line.new(leftBar, sellTarget, rightBar, sellTarget, color=color.new(color.red, 25), style=line.style_dotted, width=1)
sellLbl := label.new(rightBar, sellEntryHi, "SELL fade entry 4130–4180 inv 4190 tgt 4052 conv 60%", color=color.new(color.red, 15), textcolor=color.white, style=label.style_label_left, size=size.normal)
// ── Trade idea: BUY 4,040–4,055 (golden pocket), invalid 4,024, target 4,102 ──
if showTrades
buyZone := box.new(leftBar, buyEntryHi, rightBar, buyEntryLo, bgcolor=color.new(color.green, 72), border_color=color.new(color.green, 20), border_width=1)
buyInvLine := line.new(leftBar, buyInvalid, rightBar, buyInvalid, color=color.new(color.green, 0), style=line.style_dashed, width=2)
buyTgtLine := line.new(leftBar, buyTarget, rightBar, buyTarget, color=color.new(color.green, 25), style=line.style_dotted, width=1)
buyLbl := label.new(rightBar, buyEntryLo, "BUY scalp entry 4040–4055 inv 4024 tgt 4102 conv 45%", color=color.new(color.green, 15), textcolor=color.white, style=label.style_label_left, size=size.normal)
// ── Bias banner: create table once, refresh cells on last bar ──
if barstate.islast
if na(biasTable)
biasTable := table.new(position.top_right, 2, 5, bgcolor=color.new(color.black, 15), border_width=1, border_color=color.new(color.gray, 60))
table.cell(biasTable, 0, 0, "Net Bias", text_color=color.white, bgcolor=color.new(color.gray, 40), text_size=size.small)
table.cell(biasTable, 1, 0, "SELL", text_color=color.white, bgcolor=color.new(color.red, 20), text_size=size.small)
table.cell(biasTable, 0, 1, "Real yield", text_color=color.white, text_size=size.small)
table.cell(biasTable, 1, 1, "2.37% +2bp", text_color=color.white, text_size=size.small)
table.cell(biasTable, 0, 2, "FOMC 7/29", text_color=color.white, text_size=size.small)
table.cell(biasTable, 1, 2, "hold 73 / hike 27", text_color=color.white, text_size=size.small)
table.cell(biasTable, 0, 3, "1h RSI", text_color=color.white, text_size=size.small)
table.cell(biasTable, 1, 3, "78.9 (hot)", text_color=color.white, text_size=size.small)
table.cell(biasTable, 0, 4, "DXY", text_color=color.white, text_size=size.small)
table.cell(biasTable, 1, 4, "101.19 flat", text_color=color.white, text_size=size.small)
{"bias": "SELL",
"ideas": [
{"bias": "SELL", "label": "Resistance-shelf fade", "entry_low": 4130, "entry_high": 4180,
"invalidation": 4190, "target": 4052, "conviction": 60},
{"bias": "BUY", "label": "Golden-pocket scalp", "entry_low": 4040, "entry_high": 4055,
"invalidation": 4024, "target": 4102, "conviction": 45},
{"bias": "SELL", "label": "Swing fade (position)", "entry_low": 4067, "entry_high": 4095,
"invalidation": 4167, "target": 3939, "conviction": 50}
]}
TradingView chart script
Paste into TradingView → Pine Editor → Add to chart to see these levels and trade zones drawn live. (Also attached to the email edition as a .pine file.)
//@version=5
indicator("Gold Desk 2026-07-22 — bias SELL", overlay=true, max_lines_count=300, max_labels_count=300, max_boxes_count=100)
// ── Inputs ──
showFibs = input.bool(true, "Show Fibonacci retracement")
showZones = input.bool(true, "Show S/R + trade zones")
showTrades = input.bool(true, "Show trade ideas (1 BUY, 1 SELL)")
// ── EMAs (per-bar plots are fine — they're a series, not a redraw) ──
ema20 = ta.ema(close, 20)
ema50 = ta.ema(close, 50)
ema200 = ta.ema(close, 200)
plot(ema20, "EMA20", color=color.new(color.yellow, 0), linewidth=1)
plot(ema50, "EMA50", color=color.new(color.orange, 0), linewidth=1)
plot(ema200, "EMA200", color=color.new(color.red, 0), linewidth=2)
// ── Levels from the desk note (all sourced from the snapshot) ──
swingHigh = 4113.89
swingLow = 3995.27
fib236 = swingHigh - (swingHigh - swingLow) * 0.236
fib382 = swingHigh - (swingHigh - swingLow) * 0.382
fib500 = swingHigh - (swingHigh - swingLow) * 0.500
fib618 = swingHigh - (swingHigh - swingLow) * 0.618
fib786 = swingHigh - (swingHigh - swingLow) * 0.786
dR3 = 4180.33
dR2 = 4130.16
dR1 = 4102.09
dP = 4051.92
dS1 = 4023.85
dS2 = 3973.68
wR2 = 4183.04
wR1 = 4094.57
wS1 = 3939.08
// ── Trade idea levels (mirror the trade-levels JSON below) ──
sellEntryLo = 4130.16
sellEntryHi = 4180.33
sellInvalid = 4190.00
sellTarget = 4051.92
buyEntryLo = 4040.58
buyEntryHi = 4054.58
buyInvalid = 4023.85
buyTarget = 4102.09
// ── Persistent objects: created ONCE, updated only on the last bar ──
// This is the key pattern — without `var` + delete-on-last-bar, TradingView redraws every box on every candle and you get overlapping ghost fills.
var box goldenPocket = na
var box sellZone = na
var box buyZone = na
var box supplyBox = na
var box demandBox = na
var line sellInvLine = na
var line sellTgtLine = na
var line buyInvLine = na
var line buyTgtLine = na
var label sellLbl = na
var label buyLbl = na
var label pocketLbl = na
var table biasTable = na
// ── Static horizontal levels (hlines redraw cheaply, one series each) ──
hline(fib236, "Fib 0.236", color=color.new(color.gray, 60), linestyle=hline.style_dotted)
hline(fib382, "Fib 0.382", color=color.new(color.gray, 50), linestyle=hline.style_dotted)
hline(fib618, "Fib 0.618", color=color.new(color.gray, 50), linestyle=hline.style_dotted)
hline(fib786, "Fib 0.786", color=color.new(color.gray, 60), linestyle=hline.style_dotted)
hline(dR2, "Daily R2", color=color.new(color.red, 30), linestyle=hline.style_solid)
hline(dR1, "Daily R1", color=color.new(color.red, 55), linestyle=hline.style_solid)
hline(dP, "Daily P", color=color.new(color.blue, 30), linestyle=hline.style_solid)
hline(dS1, "Daily S1", color=color.new(color.green, 55), linestyle=hline.style_solid)
hline(dS2, "Daily S2", color=color.new(color.green, 30), linestyle=hline.style_solid)
hline(wR2, "Weekly R2", color=color.new(color.maroon, 20), linestyle=hline.style_dashed)
hline(wR1, "Weekly R1", color=color.new(color.maroon, 40), linestyle=hline.style_dashed)
hline(wS1, "Weekly S1", color=color.new(color.teal, 30), linestyle=hline.style_dashed)
// ── Draw the boxes/labels once at the last bar, deleting prior instances so nothing tiles ──
if barstate.islast
box.delete(goldenPocket)
box.delete(sellZone)
box.delete(buyZone)
box.delete(supplyBox)
box.delete(demandBox)
line.delete(sellInvLine)
line.delete(sellTgtLine)
line.delete(buyInvLine)
line.delete(buyTgtLine)
label.delete(sellLbl)
label.delete(buyLbl)
label.delete(pocketLbl)
leftBar = bar_index - 80
rightBar = bar_index + 40
// ── Supply zone (4,130–4,180 shelf) ──
if showZones
supplyBox := box.new(leftBar, dR3, rightBar, dR2, bgcolor=color.new(color.red, 85), border_color=color.new(color.red, 30), border_width=1)
// ── Demand zone (4,024–3,974) ──
if showZones
demandBox := box.new(leftBar, dS1, rightBar, dS2, bgcolor=color.new(color.green, 85), border_color=color.new(color.green, 30), border_width=1)
// ── Fibonacci golden pocket (0.5–0.618) ──
if showFibs
goldenPocket := box.new(leftBar, fib500, rightBar, fib618, bgcolor=color.new(color.yellow, 78), border_color=color.new(color.orange, 40), border_width=1)
pocketLbl := label.new(rightBar, (fib500 + fib618) / 2, "Golden Pocket 0.5–0.618", color=color.new(color.orange, 30), textcolor=color.white, style=label.style_label_left, size=size.small)
// ── Trade idea: SELL 4,130–4,180, invalid 4,190, target 4,052 ──
if showTrades
sellZone := box.new(leftBar, sellEntryHi, rightBar, sellEntryLo, bgcolor=color.new(color.red, 72), border_color=color.new(color.red, 20), border_width=1)
sellInvLine := line.new(leftBar, sellInvalid, rightBar, sellInvalid, color=color.new(color.red, 0), style=line.style_dashed, width=2)
sellTgtLine := line.new(leftBar, sellTarget, rightBar, sellTarget, color=color.new(color.red, 25), style=line.style_dotted, width=1)
sellLbl := label.new(rightBar, sellEntryHi, "SELL fade entry 4130–4180 inv 4190 tgt 4052 conv 60%", color=color.new(color.red, 15), textcolor=color.white, style=label.style_label_left, size=size.normal)
// ── Trade idea: BUY 4,040–4,055 (golden pocket), invalid 4,024, target 4,102 ──
if showTrades
buyZone := box.new(leftBar, buyEntryHi, rightBar, buyEntryLo, bgcolor=color.new(color.green, 72), border_color=color.new(color.green, 20), border_width=1)
buyInvLine := line.new(leftBar, buyInvalid, rightBar, buyInvalid, color=color.new(color.green, 0), style=line.style_dashed, width=2)
buyTgtLine := line.new(leftBar, buyTarget, rightBar, buyTarget, color=color.new(color.green, 25), style=line.style_dotted, width=1)
buyLbl := label.new(rightBar, buyEntryLo, "BUY scalp entry 4040–4055 inv 4024 tgt 4102 conv 45%", color=color.new(color.green, 15), textcolor=color.white, style=label.style_label_left, size=size.normal)
// ── Bias banner: create table once, refresh cells on last bar ──
if barstate.islast
if na(biasTable)
biasTable := table.new(position.top_right, 2, 5, bgcolor=color.new(color.black, 15), border_width=1, border_color=color.new(color.gray, 60))
table.cell(biasTable, 0, 0, "Net Bias", text_color=color.white, bgcolor=color.new(color.gray, 40), text_size=size.small)
table.cell(biasTable, 1, 0, "SELL", text_color=color.white, bgcolor=color.new(color.red, 20), text_size=size.small)
table.cell(biasTable, 0, 1, "Real yield", text_color=color.white, text_size=size.small)
table.cell(biasTable, 1, 1, "2.37% +2bp", text_color=color.white, text_size=size.small)
table.cell(biasTable, 0, 2, "FOMC 7/29", text_color=color.white, text_size=size.small)
table.cell(biasTable, 1, 2, "hold 73 / hike 27", text_color=color.white, text_size=size.small)
table.cell(biasTable, 0, 3, "1h RSI", text_color=color.white, text_size=size.small)
table.cell(biasTable, 1, 3, "78.9 (hot)", text_color=color.white, text_size=size.small)
table.cell(biasTable, 0, 4, "DXY", text_color=color.white, text_size=size.small)
table.cell(biasTable, 1, 4, "101.19 flat", text_color=color.white, text_size=size.small)
— the resident
fading euphoria with a stopwatch