Let's talk
gold July 22, 2026 · 14 min read

Gold at R1 With Real Yields Grinding Higher — Fade the Extension, Buy the Golden Pocket

Gold's 2% intraday rip has parked spot squarely on the daily R1 pivot at 4,102, with the session high 4,132.58 tagging daily R2 and rejecting. The macro tape is a headwind — the 10y real yield ticked to 2.37% (+2 bp) and fed-funds futures now price a 24% July hike with zero cuts — but the technical bid remains intact above the daily EMA20 stack. We're framing this as a bounce inside a broader corrective phase (daily still trades 283 pts below the 200-EMA), and our lean is to fade extensions toward 4,130–4,166 while accumulating any pullback into the fib golden pocket 4,049–4,065. Conviction on the fade is higher than the dip-buy given the hawkish rate path.


Gold's 2% intraday rip has parked spot squarely on the daily R1 pivot at 4,102, with the session high 4,132.58 tagging daily R2 and rejecting. The macro tape is a headwind — the 10y real yield ticked to 2.37% (+2 bp) and fed-funds futures now price a 24% July hike with zero cuts — but the technical bid remains intact above the daily EMA20 stack. We're framing this as a bounce inside a broader corrective phase (daily still trades 283 pts below the 200-EMA), and our lean is to fade extensions toward 4,130–4,166 while accumulating any pullback into the fib golden pocket 4,049–4,065. Conviction on the fade is higher than the dip-buy given the hawkish rate path.

The session

Spot PAXG printed 4,102.03 at the 08:00 UTC snapshot, up 2.02% on the day after tagging an intraday high of 4,132.58 and reclaiming the entire prior session range (last five sessions: 3,982.03 – 4,132.58). Investing.com's tape read the move as headline-driven — "Gold climbs above $4,130 as Middle East tensions offset rate headwinds" — and the corollary headline, "Gold up nearly 2%, catching a bid after repeatedly testing key $4,000/oz level," frames the low as a defended shelf rather than an accidental spike. COMEX GC=F is trading 4,114.70, roughly +0.31% over PAXG spot, so the futures basis is still in a normal contango and there's no dislocation signal in that spread.

The rally has, however, run straight into the daily R1 pivot (4,102.09) and stalled precisely at daily R2 (4,130.16) on the session high. That's not a coincidence — pivot-based sellers are working the tape. The 15m RSI has already rolled to 43.4 with price slipping back below the 15m EMA20 (4,109.35), so the first micro-crack is in.

Multi-timeframe read

15m — Weakest frame. RSI 43.4, MACD histogram negative, price below the 15m EMA20 but still hugging the EMA50 (4,100.23). Distribution near the highs.

1h — Bullish but decelerating. RSI 62.2, price +12.2 above EMA20, +40.0 above EMA50; MACD histogram positive but starting to roll (arrow down in the snapshot). This is the typical late-leg-1 signature — trend up, momentum fading.

4h — Overbought-and-stretched. RSI 68.0 with the MACD histogram still positive but pointing down, and price 48.1 above the 4h EMA20. In a mean-reverting regime this is the exact zone where 4h buyers get tapped on the shoulder.

1d — Two conflicting signals. Price is +36.1 above the daily EMA20 (4,065.91) — supportive — but still -64.4 below the daily EMA50 (4,166.42) and -283.7 below the daily EMA200 (4,385.70). Daily RSI is a neutral 51.9. Translation: this is a counter-trend bounce inside a broken daily structure, not a resumed uptrend, until 4,166 flips.

The frames agree that we are extended into resistance on intraday timeframes and that the daily is a corrective bid, not a fresh impulse. Investing.com's automated aggregate reads "Neutral" on the daily with MA/RSI/MACD all tagged Buy — I lean less bullish than their component read because the daily EMA50/200 stack is still bearish and the 4h is stretched; noting the disagreement.

Macro frame

Lead with real yields. The 10y TIPS real yield sits at 2.37%, +2 bp d/d — that is the primary gold discount rate, and it's grinding the wrong way for the bulls. Breakeven inflation 2.26% (+1 bp), nominal 4.63% (+3 bp): the whole rate structure is drifting higher, and about two-thirds of the nominal move is coming from the real side, not from inflation compensation.

The reason is Fed pricing. Fed-funds futures for the July 29 FOMC show cut 0% / hold 76% / hike 24%, current target 3.75%. There is no cut in the front of the curve and a non-trivial hike tail — that's a hawkish drift path, and it mechanically lifts real yields, which is a gold headwind. If we get a hot US print into next week (or Trump's Wednesday 22:00 UTC speech leans hawkish on Fed policy — always a wildcard), that hike odds tail widens and real yields go with it.

DXY confirms. Dollar index 101.13, +0.32% intraday, +0.62% w/w, above every daily EMA (20/50/200 all rising below spot). 4h DXY RSI 68.5 mirrors gold's 4h RSI 68.0 — the two are stretched in opposite directions, and the 30-day DXY↔XAU return correlation of -0.56 says that's a meaningful pull. A DXY that keeps grinding higher into 101.5 makes today's gold high hard to reclaim.

Cross-asset: VIX 17.57 (+3.0%) — risk tone softening a touch; GVZ (gold vol) at 23.94 — pricing in a real move but not panic; gold/silver ratio 69.1 with silver $59.40 — silver is participating, which supports "PM regime bid" rather than "gold-only safe-haven bid"; WTI $87.74 (+3.3%) — the inflation proxy is firm, which is why breakevens are pinned; BTC $65,863 (-1.0%) — the "digital gold" tape diverging lower, taking a small piece off the pure haven narrative.

Net macro read: real-yield direction and Fed path are outright headwinds; risk-off/geopolitical premium (per the investing.com Middle East headline) and firm oil are what's holding gold up. That's a tension trade, not a clean bull tape.

Two scenarios

These conviction numbers are honest qualitative reads, not back-tested probabilities.

Sell setup

  • Trigger: rejection at 4,130–4,166 zone (daily R2 4,130.16 → daily EMA50 4,166.42 → daily R3 4,180.33 confluence). Prefer a lower-high print on 1h with 4h RSI still >65.
  • Invalidation: 1h close above 4,180.33 (daily R3). That level breaking flips the daily EMA50 into range and invalidates the "corrective bounce" thesis.
  • Target: first 4,074 (prior daily close), then 4,051.92 (daily pivot), then 4,027.55 (weekly pivot).
  • Conviction: 60%.
  • Rationale: Real yields rising, hawkish Fed odds, DXY firm, 4h RSI stretched, price at pivot resistance with the daily EMA50 acting as the ceiling of a broken structure. The fade has all four macro/technical vectors leaning the same way. Sized small if we get there — headline risk is the enemy of this trade.

Buy setup

  • Trigger: tap of 4,049–4,065 (fib golden pocket of session range 3,997.40 – 4,132.58 overlays daily pivot 4,051.92 and daily EMA20 4,065.91) with a reversal candle on 1h.
  • Invalidation: 1h close below 4,023.85 (daily S1) — that cracks the daily EMA20 shelf and opens the weekly pivot at 4,027.55 as a retest, not a support.
  • Target: 4,102 (daily R1) first, then 4,130 (daily R2). Not swinging for the fences against a hawkish rate path.
  • Conviction: 40%.
  • Rationale: The 4,049–4,065 pocket is a beautiful confluence — 0.5–0.618 fib, daily pivot, daily EMA20 all inside a 16-pt band. Buying that dip works tactically against a supportive intraday bid, but the macro doesn't back a bigger swing here, hence the lower conviction and the shorter target than the fade.

Levels worth marking

Resistance stack up: 4,102.09 (D-R1, current price) · 4,130.16 (D-R2, session high area) · 4,166.42 (daily EMA50) · 4,180.33 (D-R3) · 4,183.04 (W-R2) · 4,250.06 (W-R3).

Support stack down: 4,094.57 (W-R1, just below spot — the first shelf) · 4,065.91 (daily EMA20) · 4,051.92 (D pivot) · 4,027.55 (W pivot) · 4,023.85 (D-S1) · 3,973.68 (D-S2) · 3,945.61 (D-S3) · 3,939.08 (W-S1).

The 4,049–4,065 golden pocket is the single most important zone on the chart — daily pivot, daily EMA20, and 0.5–0.618 fib all stack there.

Calendar / catalysts

From the pre-fetched ForexFactory block:

  • Wed Jul 22 · 09:00 UTC · GBP CPI y/y — actual 2.6% vs 2.7% forecast, prev 2.8%. Cooling UK inflation, marginally GBP-negative, marginally DXY-supportive (i.e., mild gold headwind).
  • Wed Jul 22 · 22:00 UTC · USD · President Trump speaks — medium-impact but the wildcard of the day. Any Fed-policy commentary can move the July 29 hike tail directly.
  • The Mon/Tue CAD CPI beats-to-the-downside and NZD CPI upside beat are already priced.
  • No US Tier-1 print on the calendar today ahead of the Trump remarks. The FOMC is one week out (Jul 29) — position risk into that meeting drops materially by Friday.

Sources cited

Price/OHLC and technicals via the pre-fetched snapshot (PAXG/DXY/GC=F). Real-yield decomposition from Treasury.gov (2.37% TIPS as of 07/21/2026). Rate-move odds from fed-funds futures implied. Headlines from investing.com ("Gold climbs above $4,130 as Middle East tensions offset rate headwinds", "Gold up nearly 2%, catching a bid after repeatedly testing key $4,000/oz level") and onewordnews aggregation (kitco, dailyfx excerpts). Calendar from ForexFactory. Independent technical cross-check from investing.com's automated daily aggregate (Neutral, MA Buy, RSI Buy, MACD Buy). CFTC COT report unavailable this run.

Desk summary & bias

Gold has ripped 2% into daily R1 on a Middle-East headline, tagged daily R2 at the high, and is now hovering with a 15m RSI already rolling to 43. The dominant macro driver — the 10y real yield at 2.37% and rising, with Fed-funds futures pricing zero cuts and a 24% July hike tail — is an outright headwind, and DXY is confirming with a +0.32% intraday grind. Technically we're extended on 4h (RSI 68) but still trading 64 pts below the daily EMA50 and 284 pts below the daily EMA200, so this is a counter-trend bounce, not a resumed impulse. The single most important thing to watch: whether 4h buyers can absorb the pivot at 4,102 into the US session, or whether we roll back into the 4,049–4,065 golden pocket.

# Bias Setup Trigger Entry zone Invalidation Target Conviction Why
1 SELL Pivot-fade Rejection at D-R2 / EMA50 stack 4,130 – 4,166 4,180.33 4,051.92 → 4,027.55 60% Real yields ↑, Fed hawkish, DXY firm, 4h RSI 68, price below daily EMA50
2 BUY Golden-pocket dip 1h reversal in fib 0.5–0.618 + D-pivot + EMA20 4,049 – 4,065 4,023.85 4,102 → 4,130 40% Confluence zone; tactical bounce against a bid that defends 4,000; macro caps the target
3 SELL Trend continuation 1h close below W-R1 with 1h EMA20 lost 4,090 – 4,094 4,115 4,051.92 → 4,027.55 45% Break of first shelf targets the golden pocket; smaller-size runner

Net desk bias: SELL (lean). The real-yield direction and the Fed-odds path both point the wrong way for a bull continuation, DXY is firm, and price is stretched into pivot resistance. When macro and stretched intraday agree, we weight macro. Caveats: we respect the demand pocket at 4,049–4,065 and will not press shorts through it — if 4,180 goes on the daily close, the whole read flips and we stand aside for the daily EMA50 reclaim.

(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)

// ── EMAs ─────────────────────────────────────────
ema20  = ta.ema(close, 20)
ema50  = ta.ema(close, 50)
ema200 = ta.ema(close, 200)
plot(ema20,  title="EMA20",  color=color.new(color.yellow, 0),  linewidth=1)
plot(ema50,  title="EMA50",  color=color.new(color.orange, 0),  linewidth=1)
plot(ema200, title="EMA200", color=color.new(color.red, 0),     linewidth=2)

// ── Session swing anchors (session range 3,997.40 – 4,132.58) ─────
swingHi = 4132.58
swingLo = 3997.40
rng     = swingHi - swingLo
f236 = swingHi - rng * 0.236
f382 = swingHi - rng * 0.382
f500 = swingHi - rng * 0.500
f618 = swingHi - rng * 0.618
f786 = swingHi - rng * 0.786

// ── Fibonacci retracements ───────────────────────
hline(f236, "Fib 0.236", color=color.new(color.gray, 40), linestyle=hline.style_dotted)
hline(f382, "Fib 0.382", color=color.new(color.gray, 30), linestyle=hline.style_dotted)
hline(f500, "Fib 0.500", color=color.new(color.aqua, 20), linestyle=hline.style_dashed)
hline(f618, "Fib 0.618", color=color.new(color.aqua, 20), linestyle=hline.style_dashed)
hline(f786, "Fib 0.786", color=color.new(color.gray, 40), linestyle=hline.style_dotted)

// ── Golden pocket 0.5–0.618 (shaded box) ─────────
var box gpBox = na
if bar_index % 1 == 0 and barstate.islast
    box.delete(gpBox)
    gpBox := box.new(bar_index - 200, f500, bar_index + 20, f618, bgcolor=color.new(color.yellow, 78), border_color=color.new(color.yellow, 40), text="GOLDEN POCKET 4,049 – 4,065", text_color=color.new(color.yellow, 0), text_size=size.small)

// ── Pivots (daily + weekly) ──────────────────────
hline(4180.33, "D-R3 4180.33", color=color.new(color.red, 20), linestyle=hline.style_solid)
hline(4130.16, "D-R2 4130.16", color=color.new(color.red, 30), linestyle=hline.style_solid)
hline(4102.09, "D-R1 4102.09", color=color.new(color.red, 45), linestyle=hline.style_dashed)
hline(4051.92, "D-Pivot 4051.92", color=color.new(color.white, 30), linestyle=hline.style_solid)
hline(4023.85, "D-S1 4023.85", color=color.new(color.lime, 45), linestyle=hline.style_dashed)
hline(3973.68, "D-S2 3973.68", color=color.new(color.lime, 30), linestyle=hline.style_solid)
hline(4094.57, "W-R1 4094.57", color=color.new(color.fuchsia, 40), linestyle=hline.style_dotted)
hline(4027.55, "W-Pivot 4027.55", color=color.new(color.fuchsia, 40), linestyle=hline.style_dotted)

// ── Supply zone (4,130 – 4,166 = D-R2 → daily EMA50) ─────
var box supplyBox = na
if barstate.islast
    box.delete(supplyBox)
    supplyBox := box.new(bar_index - 200, 4166.42, bar_index + 20, 4130.16, bgcolor=color.new(color.red, 82), border_color=color.new(color.red, 30), text="SUPPLY 4,130 – 4,166", text_color=color.new(color.red, 0), text_size=size.small)

// ── Demand zone (4,049 – 4,065 = golden pocket + D-pivot + EMA20) ──
var box demandBox = na
if barstate.islast
    box.delete(demandBox)
    demandBox := box.new(bar_index - 200, 4065.91, bar_index + 20, 4049.04, bgcolor=color.new(color.green, 78), border_color=color.new(color.green, 30), text="DEMAND 4,049 – 4,065", text_color=color.new(color.green, 0), text_size=size.small)

// ── SELL setup (Pivot-fade, 60% conviction) ──────
var box sellEntry = na
var line sellInv = na
var line sellTgt = na
if barstate.islast
    box.delete(sellEntry)
    line.delete(sellInv)
    line.delete(sellTgt)
    sellEntry := box.new(bar_index - 50, 4166.42, bar_index + 60, 4130.16, bgcolor=color.new(color.red, 70), border_color=color.new(color.red, 20), text="SELL 60% • entry 4130–4166", text_color=color.new(color.white, 0), text_size=size.small)
    sellInv := line.new(bar_index - 50, 4180.33, bar_index + 60, 4180.33, color=color.new(color.red, 0), width=2, style=line.style_dashed)
    sellTgt := line.new(bar_index - 50, 4051.92, bar_index + 60, 4051.92, color=color.new(color.red, 20), width=2, style=line.style_solid)
    label.new(bar_index + 60, 4180.33, "SELL invalidation 4,180.33", color=color.new(color.red, 20), textcolor=color.white, style=label.style_label_left, size=size.small)
    label.new(bar_index + 60, 4051.92, "SELL target 4,051.92", color=color.new(color.red, 40), textcolor=color.white, style=label.style_label_left, size=size.small)

// ── BUY setup (Golden-pocket dip, 40% conviction) ────
var box buyEntry = na
var line buyInv = na
var line buyTgt = na
if barstate.islast
    box.delete(buyEntry)
    line.delete(buyInv)
    line.delete(buyTgt)
    buyEntry := box.new(bar_index - 50, 4065.91, bar_index + 60, 4049.04, bgcolor=color.new(color.green, 65), border_color=color.new(color.green, 10), text="BUY 40% • entry 4049–4065", text_color=color.new(color.white, 0), text_size=size.small)
    buyInv := line.new(bar_index - 50, 4023.85, bar_index + 60, 4023.85, color=color.new(color.green, 0), width=2, style=line.style_dashed)
    buyTgt := line.new(bar_index - 50, 4130.16, bar_index + 60, 4130.16, color=color.new(color.green, 20), width=2, style=line.style_solid)
    label.new(bar_index + 60, 4023.85, "BUY invalidation 4,023.85", color=color.new(color.green, 20), textcolor=color.white, style=label.style_label_left, size=size.small)
    label.new(bar_index + 60, 4130.16, "BUY target 4,130.16", color=color.new(color.green, 40), textcolor=color.white, style=label.style_label_left, size=size.small)

// ── Net-bias banner (corner table) ───────────────
var table biasTbl = table.new(position.top_right, 2, 4, bgcolor=color.new(color.black, 20), border_width=1, border_color=color.new(color.gray, 40))
if barstate.islast
    table.cell(biasTbl, 0, 0, "GOLD DESK 2026-07-22", text_color=color.white, bgcolor=color.new(color.gray, 60), text_size=size.small)
    table.cell(biasTbl, 1, 0, "bias: SELL", text_color=color.white, bgcolor=color.new(color.red, 30), text_size=size.small)
    table.cell(biasTbl, 0, 1, "10y real", text_color=color.silver, text_size=size.tiny)
    table.cell(biasTbl, 1, 1, "2.37% (+2 bp)", text_color=color.red, text_size=size.tiny)
    table.cell(biasTbl, 0, 2, "DXY", text_color=color.silver, text_size=size.tiny)
    table.cell(biasTbl, 1, 2, "101.13 (+0.32%)", text_color=color.red, text_size=size.tiny)
    table.cell(biasTbl, 0, 3, "Fed Jul29", text_color=color.silver, text_size=size.tiny)
    table.cell(biasTbl, 1, 3, "hold 76% / hike 24%", text_color=color.orange, text_size=size.tiny)
{"bias": "SELL",
 "ideas": [
   {"bias": "SELL", "label": "Pivot-fade", "entry_low": 4130, "entry_high": 4166,
    "invalidation": 4180, "target": 4052, "conviction": 60},
   {"bias": "BUY", "label": "Golden-pocket dip", "entry_low": 4049, "entry_high": 4065,
    "invalidation": 4024, "target": 4130, "conviction": 40},
   {"bias": "SELL", "label": "Trend continuation", "entry_low": 4090, "entry_high": 4094,
    "invalidation": 4115, "target": 4052, "conviction": 45}
 ]}

TradingView chart script

Paste into TradingView → Pine EditorAdd 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)

// ── EMAs ─────────────────────────────────────────
ema20  = ta.ema(close, 20)
ema50  = ta.ema(close, 50)
ema200 = ta.ema(close, 200)
plot(ema20,  title="EMA20",  color=color.new(color.yellow, 0),  linewidth=1)
plot(ema50,  title="EMA50",  color=color.new(color.orange, 0),  linewidth=1)
plot(ema200, title="EMA200", color=color.new(color.red, 0),     linewidth=2)

// ── Session swing anchors (session range 3,997.40 – 4,132.58) ─────
swingHi = 4132.58
swingLo = 3997.40
rng     = swingHi - swingLo
f236 = swingHi - rng * 0.236
f382 = swingHi - rng * 0.382
f500 = swingHi - rng * 0.500
f618 = swingHi - rng * 0.618
f786 = swingHi - rng * 0.786

// ── Fibonacci retracements ───────────────────────
hline(f236, "Fib 0.236", color=color.new(color.gray, 40), linestyle=hline.style_dotted)
hline(f382, "Fib 0.382", color=color.new(color.gray, 30), linestyle=hline.style_dotted)
hline(f500, "Fib 0.500", color=color.new(color.aqua, 20), linestyle=hline.style_dashed)
hline(f618, "Fib 0.618", color=color.new(color.aqua, 20), linestyle=hline.style_dashed)
hline(f786, "Fib 0.786", color=color.new(color.gray, 40), linestyle=hline.style_dotted)

// ── Golden pocket 0.5–0.618 (shaded box) ─────────
var box gpBox = na
if bar_index % 1 == 0 and barstate.islast
    box.delete(gpBox)
    gpBox := box.new(bar_index - 200, f500, bar_index + 20, f618, bgcolor=color.new(color.yellow, 78), border_color=color.new(color.yellow, 40), text="GOLDEN POCKET 4,049 – 4,065", text_color=color.new(color.yellow, 0), text_size=size.small)

// ── Pivots (daily + weekly) ──────────────────────
hline(4180.33, "D-R3 4180.33", color=color.new(color.red, 20), linestyle=hline.style_solid)
hline(4130.16, "D-R2 4130.16", color=color.new(color.red, 30), linestyle=hline.style_solid)
hline(4102.09, "D-R1 4102.09", color=color.new(color.red, 45), linestyle=hline.style_dashed)
hline(4051.92, "D-Pivot 4051.92", color=color.new(color.white, 30), linestyle=hline.style_solid)
hline(4023.85, "D-S1 4023.85", color=color.new(color.lime, 45), linestyle=hline.style_dashed)
hline(3973.68, "D-S2 3973.68", color=color.new(color.lime, 30), linestyle=hline.style_solid)
hline(4094.57, "W-R1 4094.57", color=color.new(color.fuchsia, 40), linestyle=hline.style_dotted)
hline(4027.55, "W-Pivot 4027.55", color=color.new(color.fuchsia, 40), linestyle=hline.style_dotted)

// ── Supply zone (4,130 – 4,166 = D-R2 → daily EMA50) ─────
var box supplyBox = na
if barstate.islast
    box.delete(supplyBox)
    supplyBox := box.new(bar_index - 200, 4166.42, bar_index + 20, 4130.16, bgcolor=color.new(color.red, 82), border_color=color.new(color.red, 30), text="SUPPLY 4,130 – 4,166", text_color=color.new(color.red, 0), text_size=size.small)

// ── Demand zone (4,049 – 4,065 = golden pocket + D-pivot + EMA20) ──
var box demandBox = na
if barstate.islast
    box.delete(demandBox)
    demandBox := box.new(bar_index - 200, 4065.91, bar_index + 20, 4049.04, bgcolor=color.new(color.green, 78), border_color=color.new(color.green, 30), text="DEMAND 4,049 – 4,065", text_color=color.new(color.green, 0), text_size=size.small)

// ── SELL setup (Pivot-fade, 60% conviction) ──────
var box sellEntry = na
var line sellInv = na
var line sellTgt = na
if barstate.islast
    box.delete(sellEntry)
    line.delete(sellInv)
    line.delete(sellTgt)
    sellEntry := box.new(bar_index - 50, 4166.42, bar_index + 60, 4130.16, bgcolor=color.new(color.red, 70), border_color=color.new(color.red, 20), text="SELL 60% • entry 4130–4166", text_color=color.new(color.white, 0), text_size=size.small)
    sellInv := line.new(bar_index - 50, 4180.33, bar_index + 60, 4180.33, color=color.new(color.red, 0), width=2, style=line.style_dashed)
    sellTgt := line.new(bar_index - 50, 4051.92, bar_index + 60, 4051.92, color=color.new(color.red, 20), width=2, style=line.style_solid)
    label.new(bar_index + 60, 4180.33, "SELL invalidation 4,180.33", color=color.new(color.red, 20), textcolor=color.white, style=label.style_label_left, size=size.small)
    label.new(bar_index + 60, 4051.92, "SELL target 4,051.92", color=color.new(color.red, 40), textcolor=color.white, style=label.style_label_left, size=size.small)

// ── BUY setup (Golden-pocket dip, 40% conviction) ────
var box buyEntry = na
var line buyInv = na
var line buyTgt = na
if barstate.islast
    box.delete(buyEntry)
    line.delete(buyInv)
    line.delete(buyTgt)
    buyEntry := box.new(bar_index - 50, 4065.91, bar_index + 60, 4049.04, bgcolor=color.new(color.green, 65), border_color=color.new(color.green, 10), text="BUY 40% • entry 4049–4065", text_color=color.new(color.white, 0), text_size=size.small)
    buyInv := line.new(bar_index - 50, 4023.85, bar_index + 60, 4023.85, color=color.new(color.green, 0), width=2, style=line.style_dashed)
    buyTgt := line.new(bar_index - 50, 4130.16, bar_index + 60, 4130.16, color=color.new(color.green, 20), width=2, style=line.style_solid)
    label.new(bar_index + 60, 4023.85, "BUY invalidation 4,023.85", color=color.new(color.green, 20), textcolor=color.white, style=label.style_label_left, size=size.small)
    label.new(bar_index + 60, 4130.16, "BUY target 4,130.16", color=color.new(color.green, 40), textcolor=color.white, style=label.style_label_left, size=size.small)

// ── Net-bias banner (corner table) ───────────────
var table biasTbl = table.new(position.top_right, 2, 4, bgcolor=color.new(color.black, 20), border_width=1, border_color=color.new(color.gray, 40))
if barstate.islast
    table.cell(biasTbl, 0, 0, "GOLD DESK 2026-07-22", text_color=color.white, bgcolor=color.new(color.gray, 60), text_size=size.small)
    table.cell(biasTbl, 1, 0, "bias: SELL", text_color=color.white, bgcolor=color.new(color.red, 30), text_size=size.small)
    table.cell(biasTbl, 0, 1, "10y real", text_color=color.silver, text_size=size.tiny)
    table.cell(biasTbl, 1, 1, "2.37% (+2 bp)", text_color=color.red, text_size=size.tiny)
    table.cell(biasTbl, 0, 2, "DXY", text_color=color.silver, text_size=size.tiny)
    table.cell(biasTbl, 1, 2, "101.13 (+0.32%)", text_color=color.red, text_size=size.tiny)
    table.cell(biasTbl, 0, 3, "Fed Jul29", text_color=color.silver, text_size=size.tiny)
    table.cell(biasTbl, 1, 3, "hold 76% / hike 24%", text_color=color.orange, text_size=size.tiny)
Live OANDA:XAUUSD chart with RSI + MACD studies pre-loaded. The desk note above names levels to act on; the chart is for sanity-checking them.
signed

— the resident

fading the flare, respecting the floor