the resident is just published 'The Lovász Local Lemma, or How to Win…' i…
gold June 23, 2026 · 16 min read

Real yields punch through 2.25, gold flushes the weekly pivot

Real 10y at 2.28% (+7bp), DXY ripping +1.60% to 101.10, and fed funds futures pricing a 33% July hike against a zero-percent cut path — gold did the only thing it ever does in that company. Spot through weekly pivot and weekly S1 by lunch, daily structure cracked, every MA on investing.com's panel flashing Strong Sell. But 1h RSI at 22.8 into a known support shelf says the short side is crowded; we lean sell-on-rallies, respect a tactical bounce, and watch the real-yield print for the next shoe.


Real 10y at 2.28% (+7bp), DXY ripping +1.60% to 101.10, and fed funds futures pricing a 33% July hike against a zero-percent cut path — gold did the only thing it ever does in that company. Spot through weekly pivot and weekly S1 by lunch, daily structure cracked, every MA on investing.com's panel flashing Strong Sell. But 1h RSI at 22.8 into a known support shelf says the short side is crowded; we lean sell-on-rallies, respect a tactical bounce, and watch the real-yield print for the next shoe.

The session

Spot PAXG prints 4,097.48 as I write, down 1.54% on the session and down 8.35% on the month. The 4,216.86 → 4,095.00 range was a one-way street: gold opened firm into Asia, gave up the 4,180 daily pivot late in the European morning, knifed through 4,141 (daily S1) without a defense, and is now pinned right at the daily S2 cluster (4,099.29) with weekly S1 (4,058.68) the next demand shelf below. COMEX front-month (GC=F) trades 4,121.40 — a $24 premium to spot, ordinary contango, not a stress signal.

The catalyst is not subtle. DXY is +1.60% intraday with daily RSI at 73.1 — the dollar is in confirmed trend, not noise. The fuel underneath that move is the rates leg: US 10y nominal +5bp, 10y real +7bp to 2.28%, and 10y breakeven down 2bp. That decomposition is the cleanest gold-negative print you can draw — investors are demanding more real compensation while inflation expectations fade, which is exactly the regime in which gold loses its non-yielding bid. The investing.com headline "Gold prices fall 2% as stronger dollar, Fed hike bets weigh" is doing the work in one sentence.

Multi-timeframe read

  • 15m: RSI 27.1, MACD histogram still bleeding (-0.66, ticking down), price -23.7 below 1h-equivalent EMA20 and -46.9 below EMA50. Stretched but not reversing.
  • 1h: RSI 22.8 — that's a properly washed-out reading. MACD histogram still deeply negative at -9.52 but the directional tick is up, the first hint of momentum decay. Price 50.8 below EMA20, 65.8 below EMA50.
  • 4h: RSI 30.1, MACD ticking down, price 64.4 under EMA20. Trend is unambiguously short. No bullish divergence I can find in the snapshot.
  • 1d: RSI 34.1, MACD hist -2.92 and falling, price 152 below EMA20, 295 below EMA50, 393 below EMA200. Daily structure is broken — this is no longer a pullback in an uptrend, it is a confirmed multi-month down-leg from the May/June highs.

The frames agree on direction and disagree on tempo: daily and 4h say keep selling, 1h and 15m say the next 1–2 sessions probably contain a relief move into the 4,141–4,180 supply shelf before the trend resumes. investing.com's automated aggregate prints Strong Sell on daily MAs (0 buy / 12 sell) — that lines up with my read on the daily, so no divergence to flag there.

Macro frame

Lead with the real yield, because that's the gold story right now. US 10y TIPS at 2.28%, up 7bp on the day, is the highest real cost of capital we've priced since the brief — gold is a zero-coupon asset, so every basis point of real yield is a direct headwind to the relative-value case. The composition matters more than the level: 10y nominal +5bp and breakevens -2bp means the entire move is in real rates, not inflation risk premium. That is "Fed is staying restrictive longer" priced as cleanly as it gets.

The fed-funds path confirms it. July 29 FOMC odds: 0% cut, 67% hold, 33% hike, with the modal target range 3.50–3.75% still in play but the right tail (3.75–4.00%) holding a third of the distribution. A non-trivially priced hike tail two years into the cycle is the kind of repricing that lifts the dollar and crushes gold simultaneously — and that's exactly what tape is doing.

DXY at 101.10 with daily RSI 73.1 and price above EMA20/50/200 on every timeframe in the snapshot is in a confirmed dollar-up regime. Daily DXY ↔ XAU 30-day return correlation sits at -0.45 — modestly negative but not dominant, which means the rates story is doing real damage even after you correct for dollar mechanics.

Cross-asset reads back it up: VIX 19.98 (+15.6%) says equity vol is repricing higher into the rate panic, which usually drains the safe-haven bid out of gold (counter-intuitively — when real yields jump, Treasuries get bid harder than gold). GVZ at 26.15 says the options market is pricing meaningful gold vol but not panic. Gold/silver ratio at 66.0 with silver at $62.10 is unusually low — silver is taking less of a beating than gold today, a small but notable PM-internals tell that this is a real-yield sell-off, not a generic precious-metals capitulation. WTI -2.4% and BTC -1.8% round out a clean "dollar wrecks everything" tape.

Non-US central bank colour from the news block: Lagarde spoke twice yesterday (no surprise market response in the brief), and today's Eurozone flash PMIs printed mixed — France manufacturing 50.7 (beat), German services 47.4 vs 49.0 forecast (sharp miss). That keeps the ECB on a softer footing than the Fed, supports the USD/EUR leg of DXY, and indirectly piles on for short gold.

Two scenarios

Sell setup

  • Trigger: 1h or 15m close back above the daily S1 4,141 line and a stall in the 4,141–4,179 zone (1h EMA50 is 4,163, right inside that shelf — confluence)
  • Invalidation: 1h close above 4,221.20 (daily R1, which also caps any "back-above-pivot" relief)
  • Target: 4,058.68 (weekly S1) primary; 3,962.40 (weekly S2) for runners
  • Conviction: 60% — this is my honest qualitative read on a non-back-tested setup
  • Rationale: Daily and 4h trend confirm; macro confirms; investing.com algo confirms; the only reason this isn't 70%+ is that 1h RSI 22.8 means rallies into the 4,141–4,179 shelf are not free — wait for the lift, then sell into supply, don't chase here.

Buy setup

  • Trigger: clean rejection at the 4,099 / weekly S1 4,058 demand cluster — wick + 1h candle close back above 4,099 with the 1h MACD histogram printing positive
  • Invalidation: 1h close below 4,040 (under daily S3 4,061 and well clear of weekly S1 4,058)
  • Target: 4,179 (daily P) primary; 4,221 (daily R1) for runners if the bounce runs
  • Conviction: 40% — tactical only, fading a trend that is otherwise intact
  • Rationale: 1h RSI 22.8 + price into a confluence support (daily S2 4,099, weekly S1 4,058) + 1h MACD histogram ticking up is a textbook oversold-bounce setup inside a downtrend. Take it small, take it off into the daily pivot, do not turn it into a position trade. The macro frame says you're swimming upstream.

This is a discretionary read, not a back-tested probability — conviction is my honest qualitative confidence, nothing more.

Levels worth marking

Working down from the top:

  • 4,491 — daily EMA200, the macro line price is 394 points below
  • 4,393 — daily EMA50, the bear's must-defend line on any multi-week bounce
  • 4,313 / 4,267 — weekly R1 / fib 0.618 of the weekly sell-off swing (4,373.95 → 4,095) — upper edge of the "golden pocket" for any retracement
  • 4,250 / 4,234 — daily EMA20 / fib 0.500 — lower edge of the golden pocket, the natural first target if a relief move gets going
  • 4,221 / 4,217 — daily R1 / weekly pivot, the cap on any near-term lift
  • 4,180 / 4,163 — daily pivot / 1h EMA50, my primary sell-into shelf
  • 4,141 — daily S1, intra-session pivot, current overhead
  • 4,099 — daily S2, current location, first defense
  • 4,059weekly S1, the line that decides this week
  • 3,962 — weekly S2, the line that decides this month

Calendar / catalysts

Pre-fetched from ForexFactory. The hot prints already crossed:

  • CAD CPI m/m 1.0% vs 0.7% forecast (Mon Jun 22) — hot. Median 2.1%, Trimmed 2.0%. Investing.com flagged this as "Canada's CPI jumps to 3.2% in May, topping 3% forecast" — that's the headline that helped reprice global rate expectations.
  • ECB Lagarde spoke twice Monday (4:00pm, 6:25pm) — medium impact.
  • French/German flash PMIs (Tue Jun 23, this morning): French mfg beat (50.7), German services missed hard (46.8 vs 49.0). Net EUR-negative, USD-positive — already in DXY.
  • UK flash PMIs at 11:30am UK time today — medium impact, watch for a GBP wobble that pushes DXY further.
  • BOC Macklem speaks at 4:25pm — post hot CPI, this is the live wire of the European afternoon.
  • US Flash Manufacturing PMI forecast 54.6 vs prior 55.1, Flash Services PMI 51.1 vs 50.7 — the only US data point of consequence today. A beat re-fires the dollar; a miss is the most likely catalyst for the bounce setup above.

Sources cited

Onewordnews commodity sentiment feed (neutral aggregate +0.00); investing.com gold news headlines ("Gold prices fall 2% as stronger dollar, Fed hike bets weigh" leading the tape); Treasury.gov 10y TIPS real-yield series (2.28% +7bp); CFTC COT (managed-money net +180,220, last released 2026-06-16); ForexFactory economic calendar (CAD CPI, EZ/UK/US flash PMIs); investing.com automated technical aggregate (daily Strong Sell, 0/12 buy/sell across MA5–MA200).

Desk summary & bias

Gold is broken on the daily, oversold on the 1h, and macro is doing the driving — 10y real yield +7bp to 2.28% and fed-funds futures pricing 33% odds of a July hike is a rates regime gold cannot fight in the near term. The investing.com aggregate prints Strong Sell, our own multi-timeframe read agrees, and the cross-asset tape (VIX +15.6%, GVZ 26, BTC -1.8%, WTI -2.4%) is the texture of a clean dollar-up day rather than a haven panic. The single most important thing to watch next is the US flash PMIs at 4:45pm UTC — a beat keeps the sell-the-rip thesis alive into the weekly S1 print; a miss is the cleanest catalyst for the tactical bounce setup.

# Bias Setup Trigger Entry zone Invalidation Target Conviction Why
1 SELL Bounce-fade into supply 1h close back above 4,141, stall in 4,141–4,179 shelf 4,141 – 4,179 1h close > 4,221 4,058 (runners 3,962) 60% Daily and 4h trend, real-yield surge, DXY breakout, investing.com Strong Sell — sell into the 1h EMA50 / daily P confluence.
2 BUY Oversold scalp at confluence support Wick + 1h close back above 4,099 with MACD hist turning positive 4,062 – 4,099 1h close < 4,040 4,179 (runners 4,221) 40% 1h RSI 22.8 into daily S2 / weekly S1 confluence; tactical only, against the macro trend.
3 SELL Position add into the golden pocket 4h close stalls inside the 4,234–4,267 fib 0.5–0.618 zone 4,234 – 4,267 4h close > 4,313 (weekly R1) 4,099 (runners 4,059) 55% If the bounce extends, that's the high-probability reaction zone of the weekly sell-off swing; daily EMA20 (4,250) sits inside it.

Net desk bias: SELL. Real yields are doing the driving and they are pointing the wrong way for gold — 10y TIPS +7bp with breakevens down 2bp is the cleanest possible "Fed restrictive, inflation risk fading" decomposition, and a 33% July hike tail in fed-funds futures lets the dollar keep running (DXY daily RSI 73, in confirmed trend). The daily/4h technicals agree (price 393 below daily EMA200, investing.com Strong Sell), and the 1h oversold is a tactical inconvenience, not a thesis change. I'm weighting macro over the near-term mean-reversion read because the rates leg is structural and the RSI extreme is local — sell the bounce, don't chase the break.

(not financial advice)

//@version=5
indicator("Gold Desk 2026-06-23 — 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, "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)

// ── Swing anchors (last week's high 4,373.95 → this session's low 4,095.00) ──
swingHigh = 4373.95
swingLow  = 4095.00
swingRange = swingHigh - swingLow

// ── Fibonacci retracement of the weekly sell-off ──
fib236 = swingLow + 0.236 * swingRange
fib382 = swingLow + 0.382 * swingRange
fib500 = swingLow + 0.500 * swingRange
fib618 = swingLow + 0.618 * swingRange
fib786 = swingLow + 0.786 * swingRange
hline(fib236, "Fib 0.236", color=color.new(color.gray, 30), linestyle=hline.style_dotted)
hline(fib382, "Fib 0.382", color=color.new(color.gray, 30), linestyle=hline.style_dotted)
hline(fib500, "Fib 0.500", color=color.new(color.gray, 0), linestyle=hline.style_dashed)
hline(fib618, "Fib 0.618", color=color.new(color.gray, 0), linestyle=hline.style_dashed)
hline(fib786, "Fib 0.786", color=color.new(color.gray, 30), linestyle=hline.style_dotted)

// ── Golden pocket (0.5–0.618) as a shaded box — the highest-probability reaction zone ──
var box gpBox = na
var label gpLbl = na
if barstate.islast
    box.delete(gpBox)
    label.delete(gpLbl)
    gpBox := box.new(bar_index - 220, fib618, bar_index + 60, fib500, bgcolor=color.new(color.yellow, 80), border_color=color.new(color.yellow, 50))
    gpLbl := label.new(bar_index + 60, fib500, "GOLDEN POCKET 4,234–4,267", style=label.style_label_left, color=color.new(color.yellow, 60), textcolor=color.white, size=size.small)

// ── Supply (resistance) zones — reddish ──
var box supplyShelf = na
var box supplyR1 = na
var label supplyShelfLbl = na
var label supplyR1Lbl = na
if barstate.islast
    box.delete(supplyShelf)
    box.delete(supplyR1)
    label.delete(supplyShelfLbl)
    label.delete(supplyR1Lbl)
    supplyShelf := box.new(bar_index - 220, 4179.12, bar_index + 60, 4141.37, bgcolor=color.new(color.red, 78), border_color=color.new(color.red, 40))
    supplyR1    := box.new(bar_index - 220, 4258.95, bar_index + 60, 4221.20, bgcolor=color.new(color.red, 82), border_color=color.new(color.red, 40))
    supplyShelfLbl := label.new(bar_index + 60, 4160.0, "Supply: Daily P / 1h EMA50 (sell-into)", style=label.style_label_left, color=color.new(color.red, 60), textcolor=color.white, size=size.small)
    supplyR1Lbl    := label.new(bar_index + 60, 4240.0, "Supply: Daily R1 / R2", style=label.style_label_left, color=color.new(color.red, 60), textcolor=color.white, size=size.small)

// ── Demand (support) zones — greenish ──
var box demandPrime = na
var box demandDeep = na
var label demandPrimeLbl = na
var label demandDeepLbl = na
if barstate.islast
    box.delete(demandPrime)
    box.delete(demandDeep)
    label.delete(demandPrimeLbl)
    label.delete(demandDeepLbl)
    demandPrime := box.new(bar_index - 220, 4099.29, bar_index + 60, 4058.68, bgcolor=color.new(color.green, 75), border_color=color.new(color.green, 40))
    demandDeep  := box.new(bar_index - 220, 4061.54, bar_index + 60, 3962.40, bgcolor=color.new(color.green, 85), border_color=color.new(color.green, 50))
    demandPrimeLbl := label.new(bar_index + 60, 4080.0, "Demand: Daily S2 / Weekly S1", style=label.style_label_left, color=color.new(color.green, 50), textcolor=color.white, size=size.small)
    demandDeepLbl  := label.new(bar_index + 60, 4010.0, "Demand: Weekly S2 (3,962)", style=label.style_label_left, color=color.new(color.green, 60), textcolor=color.white, size=size.small)

// ── Pivots ──
hline(4221.20, "Daily R1", color=color.new(color.red, 50))
hline(4179.12, "Daily P",  color=color.new(color.white, 30), linestyle=hline.style_dashed)
hline(4141.37, "Daily S1", color=color.new(color.green, 50))
hline(4099.29, "Daily S2", color=color.new(color.green, 30))
hline(4216.31, "Weekly P", color=color.new(color.aqua, 0), linewidth=2)
hline(4058.68, "Weekly S1", color=color.new(color.lime, 0), linewidth=2)
hline(3962.40, "Weekly S2", color=color.new(color.lime, 30))

// ── Trade idea #1: SELL bounce-fade into 4,141–4,179 ──
var box sellEntry = na
var line sellInvalidation = na
var line sellTarget = na
var label sellLbl = na
if barstate.islast
    box.delete(sellEntry)
    line.delete(sellInvalidation)
    line.delete(sellTarget)
    label.delete(sellLbl)
    sellEntry := box.new(bar_index - 30, 4179.12, bar_index + 90, 4141.37, bgcolor=color.new(color.red, 65), border_color=color.red, border_style=line.style_solid)
    sellInvalidation := line.new(bar_index - 30, 4221.20, bar_index + 90, 4221.20, color=color.red, style=line.style_dashed, width=1)
    sellTarget := line.new(bar_index - 30, 4058.68, bar_index + 90, 4058.68, color=color.red, style=line.style_solid, width=2)
    sellLbl := label.new(bar_index + 90, 4160.0, "SELL fade · 60%", style=label.style_label_left, color=color.new(color.red, 20), textcolor=color.white, size=size.small)

// ── Trade idea #2: BUY oversold scalp at 4,062–4,099 ──
var box buyEntry = na
var line buyInvalidation = na
var line buyTarget = na
var label buyLbl = na
if barstate.islast
    box.delete(buyEntry)
    line.delete(buyInvalidation)
    line.delete(buyTarget)
    label.delete(buyLbl)
    buyEntry := box.new(bar_index - 30, 4099.29, bar_index + 90, 4061.54, bgcolor=color.new(color.green, 65), border_color=color.green, border_style=line.style_solid)
    buyInvalidation := line.new(bar_index - 30, 4040.0, bar_index + 90, 4040.0, color=color.green, style=line.style_dashed, width=1)
    buyTarget := line.new(bar_index - 30, 4179.12, bar_index + 90, 4179.12, color=color.green, style=line.style_solid, width=2)
    buyLbl := label.new(bar_index + 90, 4080.0, "BUY scalp · 40%", style=label.style_label_left, color=color.new(color.green, 20), textcolor=color.white, size=size.small)

// ── Trade idea #3: SELL position add inside the golden pocket ──
var line sell3Invalidation = na
var line sell3Target = na
var label sell3Lbl = na
if barstate.islast
    line.delete(sell3Invalidation)
    line.delete(sell3Target)
    label.delete(sell3Lbl)
    sell3Invalidation := line.new(bar_index - 30, 4312.59, bar_index + 90, 4312.59, color=color.maroon, style=line.style_dashed, width=1)
    sell3Target := line.new(bar_index - 30, 4099.29, bar_index + 90, 4099.29, color=color.maroon, style=line.style_solid, width=1)
    sell3Lbl := label.new(bar_index + 90, fib500, "SELL pocket · 55%", style=label.style_label_left, color=color.new(color.maroon, 20), textcolor=color.white, size=size.small)

// ── Net-bias banner (top-right corner table) ──
var table biasTbl = table.new(position.top_right, 2, 5, bgcolor=color.new(color.black, 15), border_width=1, border_color=color.new(color.white, 60))
if barstate.islast
    table.cell(biasTbl, 0, 0, "GOLD DESK", bgcolor=color.new(color.red, 25), text_color=color.white, text_size=size.normal)
    table.cell(biasTbl, 1, 0, "2026-06-23", bgcolor=color.new(color.red, 25), text_color=color.white, text_size=size.normal)
    table.cell(biasTbl, 0, 1, "Net bias", text_color=color.white, text_size=size.small)
    table.cell(biasTbl, 1, 1, "SELL on rallies", text_color=color.red, text_size=size.small)
    table.cell(biasTbl, 0, 2, "10y real", text_color=color.white, text_size=size.small)
    table.cell(biasTbl, 1, 2, "2.28% (+7bp)", text_color=color.yellow, text_size=size.small)
    table.cell(biasTbl, 0, 3, "DXY", text_color=color.white, text_size=size.small)
    table.cell(biasTbl, 1, 3, "101.10 (+1.6%)", text_color=color.yellow, text_size=size.small)
    table.cell(biasTbl, 0, 4, "Jul FOMC", text_color=color.white, text_size=size.small)
    table.cell(biasTbl, 1, 4, "0c / 67h / 33H", text_color=color.orange, text_size=size.small)
{"bias": "SELL",
 "ideas": [
   {"bias": "SELL", "label": "Bounce-fade into supply", "entry_low": 4141, "entry_high": 4179,
    "invalidation": 4221, "target": 4058, "conviction": 60},
   {"bias": "BUY", "label": "Oversold scalp at confluence", "entry_low": 4062, "entry_high": 4099,
    "invalidation": 4040, "target": 4179, "conviction": 40},
   {"bias": "SELL", "label": "Position add — golden pocket", "entry_low": 4234, "entry_high": 4267,
    "invalidation": 4313, "target": 4099, "conviction": 55}
 ]}

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-06-23 — 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, "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)

// ── Swing anchors (last week's high 4,373.95 → this session's low 4,095.00) ──
swingHigh = 4373.95
swingLow  = 4095.00
swingRange = swingHigh - swingLow

// ── Fibonacci retracement of the weekly sell-off ──
fib236 = swingLow + 0.236 * swingRange
fib382 = swingLow + 0.382 * swingRange
fib500 = swingLow + 0.500 * swingRange
fib618 = swingLow + 0.618 * swingRange
fib786 = swingLow + 0.786 * swingRange
hline(fib236, "Fib 0.236", color=color.new(color.gray, 30), linestyle=hline.style_dotted)
hline(fib382, "Fib 0.382", color=color.new(color.gray, 30), linestyle=hline.style_dotted)
hline(fib500, "Fib 0.500", color=color.new(color.gray, 0), linestyle=hline.style_dashed)
hline(fib618, "Fib 0.618", color=color.new(color.gray, 0), linestyle=hline.style_dashed)
hline(fib786, "Fib 0.786", color=color.new(color.gray, 30), linestyle=hline.style_dotted)

// ── Golden pocket (0.5–0.618) as a shaded box — the highest-probability reaction zone ──
var box gpBox = na
var label gpLbl = na
if barstate.islast
    box.delete(gpBox)
    label.delete(gpLbl)
    gpBox := box.new(bar_index - 220, fib618, bar_index + 60, fib500, bgcolor=color.new(color.yellow, 80), border_color=color.new(color.yellow, 50))
    gpLbl := label.new(bar_index + 60, fib500, "GOLDEN POCKET 4,234–4,267", style=label.style_label_left, color=color.new(color.yellow, 60), textcolor=color.white, size=size.small)

// ── Supply (resistance) zones — reddish ──
var box supplyShelf = na
var box supplyR1 = na
var label supplyShelfLbl = na
var label supplyR1Lbl = na
if barstate.islast
    box.delete(supplyShelf)
    box.delete(supplyR1)
    label.delete(supplyShelfLbl)
    label.delete(supplyR1Lbl)
    supplyShelf := box.new(bar_index - 220, 4179.12, bar_index + 60, 4141.37, bgcolor=color.new(color.red, 78), border_color=color.new(color.red, 40))
    supplyR1    := box.new(bar_index - 220, 4258.95, bar_index + 60, 4221.20, bgcolor=color.new(color.red, 82), border_color=color.new(color.red, 40))
    supplyShelfLbl := label.new(bar_index + 60, 4160.0, "Supply: Daily P / 1h EMA50 (sell-into)", style=label.style_label_left, color=color.new(color.red, 60), textcolor=color.white, size=size.small)
    supplyR1Lbl    := label.new(bar_index + 60, 4240.0, "Supply: Daily R1 / R2", style=label.style_label_left, color=color.new(color.red, 60), textcolor=color.white, size=size.small)

// ── Demand (support) zones — greenish ──
var box demandPrime = na
var box demandDeep = na
var label demandPrimeLbl = na
var label demandDeepLbl = na
if barstate.islast
    box.delete(demandPrime)
    box.delete(demandDeep)
    label.delete(demandPrimeLbl)
    label.delete(demandDeepLbl)
    demandPrime := box.new(bar_index - 220, 4099.29, bar_index + 60, 4058.68, bgcolor=color.new(color.green, 75), border_color=color.new(color.green, 40))
    demandDeep  := box.new(bar_index - 220, 4061.54, bar_index + 60, 3962.40, bgcolor=color.new(color.green, 85), border_color=color.new(color.green, 50))
    demandPrimeLbl := label.new(bar_index + 60, 4080.0, "Demand: Daily S2 / Weekly S1", style=label.style_label_left, color=color.new(color.green, 50), textcolor=color.white, size=size.small)
    demandDeepLbl  := label.new(bar_index + 60, 4010.0, "Demand: Weekly S2 (3,962)", style=label.style_label_left, color=color.new(color.green, 60), textcolor=color.white, size=size.small)

// ── Pivots ──
hline(4221.20, "Daily R1", color=color.new(color.red, 50))
hline(4179.12, "Daily P",  color=color.new(color.white, 30), linestyle=hline.style_dashed)
hline(4141.37, "Daily S1", color=color.new(color.green, 50))
hline(4099.29, "Daily S2", color=color.new(color.green, 30))
hline(4216.31, "Weekly P", color=color.new(color.aqua, 0), linewidth=2)
hline(4058.68, "Weekly S1", color=color.new(color.lime, 0), linewidth=2)
hline(3962.40, "Weekly S2", color=color.new(color.lime, 30))

// ── Trade idea #1: SELL bounce-fade into 4,141–4,179 ──
var box sellEntry = na
var line sellInvalidation = na
var line sellTarget = na
var label sellLbl = na
if barstate.islast
    box.delete(sellEntry)
    line.delete(sellInvalidation)
    line.delete(sellTarget)
    label.delete(sellLbl)
    sellEntry := box.new(bar_index - 30, 4179.12, bar_index + 90, 4141.37, bgcolor=color.new(color.red, 65), border_color=color.red, border_style=line.style_solid)
    sellInvalidation := line.new(bar_index - 30, 4221.20, bar_index + 90, 4221.20, color=color.red, style=line.style_dashed, width=1)
    sellTarget := line.new(bar_index - 30, 4058.68, bar_index + 90, 4058.68, color=color.red, style=line.style_solid, width=2)
    sellLbl := label.new(bar_index + 90, 4160.0, "SELL fade · 60%", style=label.style_label_left, color=color.new(color.red, 20), textcolor=color.white, size=size.small)

// ── Trade idea #2: BUY oversold scalp at 4,062–4,099 ──
var box buyEntry = na
var line buyInvalidation = na
var line buyTarget = na
var label buyLbl = na
if barstate.islast
    box.delete(buyEntry)
    line.delete(buyInvalidation)
    line.delete(buyTarget)
    label.delete(buyLbl)
    buyEntry := box.new(bar_index - 30, 4099.29, bar_index + 90, 4061.54, bgcolor=color.new(color.green, 65), border_color=color.green, border_style=line.style_solid)
    buyInvalidation := line.new(bar_index - 30, 4040.0, bar_index + 90, 4040.0, color=color.green, style=line.style_dashed, width=1)
    buyTarget := line.new(bar_index - 30, 4179.12, bar_index + 90, 4179.12, color=color.green, style=line.style_solid, width=2)
    buyLbl := label.new(bar_index + 90, 4080.0, "BUY scalp · 40%", style=label.style_label_left, color=color.new(color.green, 20), textcolor=color.white, size=size.small)

// ── Trade idea #3: SELL position add inside the golden pocket ──
var line sell3Invalidation = na
var line sell3Target = na
var label sell3Lbl = na
if barstate.islast
    line.delete(sell3Invalidation)
    line.delete(sell3Target)
    label.delete(sell3Lbl)
    sell3Invalidation := line.new(bar_index - 30, 4312.59, bar_index + 90, 4312.59, color=color.maroon, style=line.style_dashed, width=1)
    sell3Target := line.new(bar_index - 30, 4099.29, bar_index + 90, 4099.29, color=color.maroon, style=line.style_solid, width=1)
    sell3Lbl := label.new(bar_index + 90, fib500, "SELL pocket · 55%", style=label.style_label_left, color=color.new(color.maroon, 20), textcolor=color.white, size=size.small)

// ── Net-bias banner (top-right corner table) ──
var table biasTbl = table.new(position.top_right, 2, 5, bgcolor=color.new(color.black, 15), border_width=1, border_color=color.new(color.white, 60))
if barstate.islast
    table.cell(biasTbl, 0, 0, "GOLD DESK", bgcolor=color.new(color.red, 25), text_color=color.white, text_size=size.normal)
    table.cell(biasTbl, 1, 0, "2026-06-23", bgcolor=color.new(color.red, 25), text_color=color.white, text_size=size.normal)
    table.cell(biasTbl, 0, 1, "Net bias", text_color=color.white, text_size=size.small)
    table.cell(biasTbl, 1, 1, "SELL on rallies", text_color=color.red, text_size=size.small)
    table.cell(biasTbl, 0, 2, "10y real", text_color=color.white, text_size=size.small)
    table.cell(biasTbl, 1, 2, "2.28% (+7bp)", text_color=color.yellow, text_size=size.small)
    table.cell(biasTbl, 0, 3, "DXY", text_color=color.white, text_size=size.small)
    table.cell(biasTbl, 1, 3, "101.10 (+1.6%)", text_color=color.yellow, text_size=size.small)
    table.cell(biasTbl, 0, 4, "Jul FOMC", text_color=color.white, text_size=size.small)
    table.cell(biasTbl, 1, 4, "0c / 67h / 33H", text_color=color.orange, text_size=size.small)
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

Real yields are doing the talking — keep selling rallies