Gold Desk — June 8, 2026: A 5% Air Pocket and the Real-Yield Vise
Gold has dropped through the floor — XAU is printing 4,313 after a 5.14% intraday flush from session high 4,571, with daily RSI at 33 and the 4h at 27. Every EMA on every timeframe sits above price. The trigger is not mysterious: the 10y real yield jumped 8bp to 2.19% and DXY broke 100 with a 73.9 4h RSI, while fed-funds futures price a 96% hold next week. The setup now is a textbook oversold-bounce-into-supply, and the structural bias remains sell-the-rip until real yields blink.
Gold has dropped through the floor — XAU is printing 4,313 after a 5.14% intraday flush from session high 4,571, with daily RSI at 33 and the 4h at 27. Every EMA on every timeframe sits above price. The trigger is not mysterious: the 10y real yield jumped 8bp to 2.19% and DXY broke 100 with a 73.9 4h RSI, while fed-funds futures price a 96% hold next week. The setup now is a textbook oversold-bounce-into-supply, and the structural bias remains sell-the-rip until real yields blink.
The session
Price opened the Asia/London handoff bid near 4,540 and has lost roughly $258 in the session — a -5.14% intraday move that takes gold to an 11-week low (per investing.com's headline "Gold prices hit 11-wk low on Fed rate concerns, higher oil prices"). The 4,293 print on this morning's flush is the bottom of the 5-session range and sits a few dollars under daily S1 (4,280.03), where we've since reclaimed.
Two things lit the fuse. First, a real-yield acceleration: TIPS 10y closed 06/05 at 2.19%, +8bp on the day, with the breakeven flat at 2.36% — meaning the entire move in the 4.55% nominal was real-rate driven. That is the worst possible composition for gold. Second, DXY is on a tear: +1.05% intraday, +0.92% week, +1.90% month, with the 4h RSI at 73.9 — overheated but not yet rolling. The 30-day daily-return correlation between DXY and XAU is -0.74, and the relationship is paying out in spades right now.
Reinforcing it from the policy side, the headline "Strong jobs market prompts Goldman Sachs to push Fed cuts into 2027" is exactly the kind of repricing that lifts real yields and crushes long-duration zero-coupon assets like gold. Fed-funds futures now print a 96% hold for June 17, with a 96.3% probability the target range stays 3.50–3.75% — the dovish path that supported gold through the spring has been priced out.
Multi-timeframe read
15m — RSI 42.3, MACD histogram ticking positive (+0.41 ↑). This is the first sign of a counter-trend bounce attempt. Price sits $7.7 below EMA20 and $97 below EMA200. A genuine relief leg would need to reclaim EMA20 (4,320) and EMA50 (4,337).
1h — RSI 30.6, MACD hist +0.86 ↑ — momentum oversold but the histogram is curling. EMA20 (4,352) is now resistance, EMA50 (4,406) is a wall. Until 4,353 prints as support, every push higher is just unwinding stretch.
4h — RSI 27.4, MACD inconclusive (snapshot doesn't print a 4h histogram direction). EMA20 sits at 4,420, $107 overhead. This is the timeframe screaming "oversold" loudest, and historically gold at 4h RSI <28 produces tradeable mean-reverts — but into supply, not into trend reversals.
1d — RSI 33.0, MACD histogram -15.42 ↓ and falling. Price is $189 below daily EMA20 and $290 below EMA50. The 200-day EMA at 4,399 has been violated decisively from above — that's the structural break. The daily is unambiguously bearish.
The disagreement is between intraday (oversold, mean-reversion setup forming) and daily/structural (trend break, MACD widening). When intraday and daily disagree like this, the market typically resolves with a sharp counter-trend bounce into resistance followed by another leg down — and that's the trade.
investing.com's automated aggregate prints Strong Sell on the daily, with 11 of 12 MAs short and both their RSI and MACD reads flagged Sell. I agree with the direction; I'd add that the magnitude of the intraday oversold suggests their model is reading the broken structure, not the snap-back risk in the next 24–48h. Tactically we're not as one-way as their aggregate suggests.
Macro frame
Real yields first. The 10y TIPS at 2.19% (+8bp d/d) is the headline number. Gold is a zero-yield long-duration asset; every basis point of positive real rate is a direct opportunity-cost tax. With breakevens flat at 2.36%, the entire bond move is real — meaning markets aren't fearing inflation, they're repricing growth/policy. That's the worst possible flavour of rates move for bullion.
Fed path corroborates: 96% hold June 17, with the dominant scenario being the target range pinned at 3.50–3.75%. UBS's headline ("Gold faces short-term headwinds but structural drivers point to new highs") captures the bind: structurally the central-bank bid is real — investing.com confirms "China's central bank extends gold-buying streak to 19 months" — but tactically the rates path is hostile.
DXY at 100.11 broke a psychological round number with conviction; daily RSI 66.5, 4h 73.9 says it's stretched but the daily MACD hist is still positive. With XAU↔DXY at -0.74, every fresh DXY high is a fresh gold low until the dollar exhausts.
Cross-asset is mixed. VIX 19.59 is down 8.9% — equity risk is fine, so gold isn't being sold for safe-haven rotation, it's being sold for the rates trade specifically. GVZ at 28.89 says options are pricing meaningful continued gold vol — that's elevated but not panic. Gold/silver at 64.3 with silver at $67 is a precious-metals regime that still favours silver beta on any bounce; the ratio compressing here would normally be a constructive precious-metals signal, but the absolute price is broken. WTI +4.7% to $94.79 lifts inflation expectations modestly but not enough to drag breakevens up — that's why real yields ran. Bitcoin flat at $63k — the "digital gold" hasn't taken share today; this is a rates story, not a flight from store-of-value.
Two scenarios
Note: convictions below are honest qualitative reads, not back-tested probabilities.
Sell setup
- Trigger: rejection at the 4,376 daily pivot / 4,399 weekly pivot / 4,399 daily EMA200 confluence (this is also the Fib 0.382–0.5 zone from the 4,541.40 week-high / 4,293.00 session-low swing)
- Invalidation: sustained 1h close above 4,433 (daily R1)
- Target: 4,257 (weekly S1), stretch to 4,222 (daily S2)
- Conviction: 60%
- Rationale: Daily structure is broken, real yields are accelerating, DXY is bid, Fed odds favour hold. The 4,376–4,399 band carries triple confluence (daily P, weekly P, daily 200EMA) — sellers will defend it hard. This is the trade with the trend.
Buy setup
- Trigger: reclaim and hold of 4,320 (15m EMA20) after a test of 4,280–4,257 zone (daily S1 / weekly S1)
- Invalidation: sustained 15m close below 4,257
- Target: 4,376 daily pivot first, stretch 4,399
- Conviction: 40%
- Rationale: 4h RSI 27.4 and 1h MACD hist curling positive say a counter-trend bounce is coming. The PAXG -0.54% discount to spot suggests crypto-side is already braced for downside; a relief snap is the easier near-term path. But this is a trade against the structural read — keep it tight.
Levels worth marking
- 4,571 — session high, also lower edge of last week's high band
- 4,529 — daily R2, prior session resistance
- 4,479 — weekly R1
- 4,433 — daily R1; sell-side invalidation
- 4,399 / 4,376 — daily P / weekly P / daily 200EMA confluence — primary supply
- 4,313 — current price
- 4,280 — daily S1, today's reclaimed level
- 4,257 — weekly S1, first target on sell, buy-side accumulation zone
- 4,222 — daily S2, sell stretch target
- 4,177 — weekly S2
Fibonacci from the swing high 4,541.40 (last week) to swing low 4,293.00 (today): 0.236 = 4,351 · 0.382 = 4,388 · 0.5 = 4,417 · 0.618 = 4,447 · 0.786 = 4,488. The 0.5–0.618 golden pocket (4,417–4,447) overlaps with daily R1 4,433 — that's where any meaningful bounce should die.
Calendar / catalysts
ForexFactory pre-fetch only returned OPEC-JMMC and OPEC Meetings on Sun Jun 7 (Medium impact) — both already in the rearview. The brief did not surface the week's US data calendar; treat the next two sessions as headline-driven until the next official print rolls in. The dominant scheduled known unknown is the Fed FOMC on June 17 (per the rate-odds block); positioning into that meeting will dictate the back half of June.
Sources cited
onewordnews (commodity sentiment), investing.com (gold news headlines + automated technical aggregate), US Treasury TIPS curve (10y real yield), CFTC COMEX COT (positioning), ForexFactory (calendar), kitco and dailyfx (excerpts), with named outlets in the news block: Goldman Sachs (cut path push), UBS (short-term headwinds note), BofA (silver call), reporting on China PBoC's 19-month gold-buying streak.
Desk summary & bias
Gold is at 4,313, down 5% intraday, with a structurally broken daily chart and an intraday oversold condition ripe for a counter-trend bounce. The dominant driver is the 10y real yield, which jumped 8bp to 2.19% with breakevens flat — meaning this is a pure rates repricing, reinforced by a 96% Fed hold and Goldman pushing cuts to 2027. The single most important thing to watch is the 4,376–4,399 supply band (daily P / weekly P / daily 200EMA); a clean rejection there is the trade, a clean reclaim flips the short-term tactical bias.
| # | Bias | Setup | Trigger | Entry zone | Invalidation | Target | Conviction | Why |
|---|---|---|---|---|---|---|---|---|
| 1 | SELL | Rip-fade | Rejection at daily/weekly P + 200EMA + Fib golden pocket | 4,376 – 4,433 | 1h close > 4,433 | 4,257, stretch 4,222 | 60% | Real yields +8bp, DXY ripping, daily MACD widening lower, triple-confluence supply |
| 2 | BUY | Oversold scalp | Hold of S1 zone + 15m EMA20 reclaim | 4,257 – 4,280 | 15m close < 4,257 | 4,376 | 40% | 4h RSI 27, 1h MACD curling, counter-trend mean-revert in play |
| 3 | SELL | Trend continuation | Daily close < 4,257 (weekly S1) | 4,250 – 4,260 retest | Daily close > 4,376 | 4,177 (weekly S2), stretch 4,127 | 50% | Loss of weekly S1 opens the weekly S2 / daily S3 stack; managed-money net +176k is fuel if longs capitulate |
Net desk bias: SELL. Real yields are accelerating with flat breakevens — that's the cleanest possible bearish-gold composition. DXY broke 100 with daily MACD positive, the Fed-funds path has been repriced toward hold, and every EMA on every timeframe sits above price. The 4h RSI 27 will produce a tradeable bounce, but that bounce is a gift to sellers, not a reversal signal. I'm weighting the macro and the daily structure over the intraday oversold; the burden of proof for a real low is a 1d close back above 4,399 — until then, sell rips into supply.
(not financial advice)
//@version=5
indicator("Gold Desk 2026-06-08 — 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, color=color.new(color.yellow, 0), title="EMA20", linewidth=1)
plot(ema50, color=color.new(color.orange, 0), title="EMA50", linewidth=1)
plot(ema200, color=color.new(color.fuchsia, 0), title="EMA200", linewidth=2)
// ── Pivots (daily) ──
p_daily_R2 = 4529.37
p_daily_R1 = 4433.23
p_daily_P = 4376.17
p_daily_S1 = 4280.03
p_daily_S2 = 4222.97
p_daily_S3 = 4126.83
hline(p_daily_R2, "Daily R2", color=color.new(color.red, 30), linestyle=hline.style_dotted)
hline(p_daily_R1, "Daily R1", color=color.new(color.red, 20), linestyle=hline.style_dashed)
hline(p_daily_P, "Daily P", color=color.new(color.gray, 0), linestyle=hline.style_solid)
hline(p_daily_S1, "Daily S1", color=color.new(color.green, 20), linestyle=hline.style_dashed)
hline(p_daily_S2, "Daily S2", color=color.new(color.green, 30), linestyle=hline.style_dotted)
hline(p_daily_S3, "Daily S3", color=color.new(color.green, 40), linestyle=hline.style_dotted)
// ── Pivots (weekly key) ──
p_weekly_P = 4399.20
p_weekly_S1 = 4257.00
p_weekly_S2 = 4176.90
hline(p_weekly_P, "Weekly P", color=color.new(color.aqua, 0), linestyle=hline.style_solid)
hline(p_weekly_S1, "Weekly S1", color=color.new(color.aqua, 20), linestyle=hline.style_dashed)
hline(p_weekly_S2, "Weekly S2", color=color.new(color.aqua, 40), linestyle=hline.style_dotted)
// ── Fibonacci retracement (swing high 4541.40 -> swing low 4293.00) ──
swing_hi = 4541.40
swing_lo = 4293.00
fib_236 = swing_lo + 0.236 * (swing_hi - swing_lo)
fib_382 = swing_lo + 0.382 * (swing_hi - swing_lo)
fib_500 = swing_lo + 0.500 * (swing_hi - swing_lo)
fib_618 = swing_lo + 0.618 * (swing_hi - swing_lo)
fib_786 = swing_lo + 0.786 * (swing_hi - swing_lo)
hline(fib_236, "Fib 0.236", color=color.new(color.silver, 40), linestyle=hline.style_dotted)
hline(fib_382, "Fib 0.382", color=color.new(color.silver, 30), linestyle=hline.style_dotted)
hline(fib_500, "Fib 0.500", color=color.new(color.silver, 20), linestyle=hline.style_dashed)
hline(fib_618, "Fib 0.618", color=color.new(color.silver, 20), linestyle=hline.style_dashed)
hline(fib_786, "Fib 0.786", color=color.new(color.silver, 30), linestyle=hline.style_dotted)
// ── Golden pocket (0.5 – 0.618) — highest-probability reaction zone ──
var box gp_box = na
if barstate.islast
box.delete(gp_box)
gp_box := box.new(bar_index - 80, fib_618, bar_index + 30, fib_500, bgcolor=color.new(color.yellow, 80), border_color=color.new(color.yellow, 40), text="Golden Pocket 4417 – 4447", text_color=color.yellow, text_size=size.small)
// ── Supply zone (rejection band: daily P + weekly P + 200EMA + Fib 0.382/0.5) ──
var box supply_box = na
if barstate.islast
box.delete(supply_box)
supply_box := box.new(bar_index - 80, 4433.23, bar_index + 30, 4376.17, bgcolor=color.new(color.red, 80), border_color=color.new(color.red, 30), text="SUPPLY 4376 – 4433", text_color=color.red, text_size=size.small)
// ── Demand zone (daily S1 / weekly S1 confluence) ──
var box demand_box = na
if barstate.islast
box.delete(demand_box)
demand_box := box.new(bar_index - 80, 4280.03, bar_index + 30, 4257.00, bgcolor=color.new(color.green, 80), border_color=color.new(color.green, 30), text="DEMAND 4257 – 4280", text_color=color.green, text_size=size.small)
// ── Sell trade idea (rip-fade) ──
var box sell_entry = na
var line sell_inv = na
var line sell_tgt = na
if barstate.islast
box.delete(sell_entry)
line.delete(sell_inv)
line.delete(sell_tgt)
sell_entry := box.new(bar_index + 5, 4433.23, bar_index + 60, 4376.17, bgcolor=color.new(color.red, 70), border_color=color.red, text="SELL entry 60%", text_color=color.white, text_size=size.small)
sell_inv := line.new(bar_index + 5, 4433.23, bar_index + 60, 4433.23, color=color.red, style=line.style_dashed, width=2)
sell_tgt := line.new(bar_index + 5, 4257.00, bar_index + 60, 4257.00, color=color.lime, style=line.style_solid, width=2)
label.new(bar_index + 60, 4433.23, "INVAL 4433", color=color.new(color.red, 30), textcolor=color.white, style=label.style_label_left, size=size.small)
label.new(bar_index + 60, 4257.00, "TARGET 4257", color=color.new(color.green, 30), textcolor=color.white, style=label.style_label_left, size=size.small)
// ── Buy trade idea (oversold scalp) ──
var box buy_entry = na
var line buy_inv = na
var line buy_tgt = na
if barstate.islast
box.delete(buy_entry)
line.delete(buy_inv)
line.delete(buy_tgt)
buy_entry := box.new(bar_index + 5, 4280.03, bar_index + 60, 4257.00, bgcolor=color.new(color.green, 70), border_color=color.green, text="BUY entry 40%", text_color=color.white, text_size=size.small)
buy_inv := line.new(bar_index + 5, 4257.00, bar_index + 60, 4257.00, color=color.red, style=line.style_dashed, width=1)
buy_tgt := line.new(bar_index + 5, 4376.17, bar_index + 60, 4376.17, color=color.lime, style=line.style_solid, width=1)
label.new(bar_index + 60, 4376.17, "BUY TGT 4376", color=color.new(color.green, 40), textcolor=color.white, style=label.style_label_left, size=size.small)
// ── Net-bias banner ──
var table banner = table.new(position.top_right, 2, 4, bgcolor=color.new(color.black, 20), border_width=1, border_color=color.gray)
if barstate.islast
table.cell(banner, 0, 0, "GOLD DESK", text_color=color.white, bgcolor=color.new(color.red, 40), text_size=size.normal)
table.cell(banner, 1, 0, "2026-06-08", text_color=color.white, bgcolor=color.new(color.red, 40), text_size=size.normal)
table.cell(banner, 0, 1, "Net bias", text_color=color.silver, text_size=size.small)
table.cell(banner, 1, 1, "SELL", text_color=color.red, text_size=size.large)
table.cell(banner, 0, 2, "Driver", text_color=color.silver, text_size=size.small)
table.cell(banner, 1, 2, "Real yld 2.19% +8bp", text_color=color.white, text_size=size.small)
table.cell(banner, 0, 3, "Trigger", text_color=color.silver, text_size=size.small)
table.cell(banner, 1, 3, "Reject 4376-4433", text_color=color.white, text_size=size.small)
{"bias": "SELL",
"ideas": [
{"bias": "SELL", "label": "Rip-fade", "entry_low": 4376, "entry_high": 4433, "invalidation": 4433, "target": 4257, "conviction": 60},
{"bias": "BUY", "label": "Oversold scalp", "entry_low": 4257, "entry_high": 4280, "invalidation": 4257, "target": 4376, "conviction": 40},
{"bias": "SELL", "label": "Trend continuation", "entry_low": 4250, "entry_high": 4260, "invalidation": 4376, "target": 4177, "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-06-08 — 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, color=color.new(color.yellow, 0), title="EMA20", linewidth=1)
plot(ema50, color=color.new(color.orange, 0), title="EMA50", linewidth=1)
plot(ema200, color=color.new(color.fuchsia, 0), title="EMA200", linewidth=2)
// ── Pivots (daily) ──
p_daily_R2 = 4529.37
p_daily_R1 = 4433.23
p_daily_P = 4376.17
p_daily_S1 = 4280.03
p_daily_S2 = 4222.97
p_daily_S3 = 4126.83
hline(p_daily_R2, "Daily R2", color=color.new(color.red, 30), linestyle=hline.style_dotted)
hline(p_daily_R1, "Daily R1", color=color.new(color.red, 20), linestyle=hline.style_dashed)
hline(p_daily_P, "Daily P", color=color.new(color.gray, 0), linestyle=hline.style_solid)
hline(p_daily_S1, "Daily S1", color=color.new(color.green, 20), linestyle=hline.style_dashed)
hline(p_daily_S2, "Daily S2", color=color.new(color.green, 30), linestyle=hline.style_dotted)
hline(p_daily_S3, "Daily S3", color=color.new(color.green, 40), linestyle=hline.style_dotted)
// ── Pivots (weekly key) ──
p_weekly_P = 4399.20
p_weekly_S1 = 4257.00
p_weekly_S2 = 4176.90
hline(p_weekly_P, "Weekly P", color=color.new(color.aqua, 0), linestyle=hline.style_solid)
hline(p_weekly_S1, "Weekly S1", color=color.new(color.aqua, 20), linestyle=hline.style_dashed)
hline(p_weekly_S2, "Weekly S2", color=color.new(color.aqua, 40), linestyle=hline.style_dotted)
// ── Fibonacci retracement (swing high 4541.40 -> swing low 4293.00) ──
swing_hi = 4541.40
swing_lo = 4293.00
fib_236 = swing_lo + 0.236 * (swing_hi - swing_lo)
fib_382 = swing_lo + 0.382 * (swing_hi - swing_lo)
fib_500 = swing_lo + 0.500 * (swing_hi - swing_lo)
fib_618 = swing_lo + 0.618 * (swing_hi - swing_lo)
fib_786 = swing_lo + 0.786 * (swing_hi - swing_lo)
hline(fib_236, "Fib 0.236", color=color.new(color.silver, 40), linestyle=hline.style_dotted)
hline(fib_382, "Fib 0.382", color=color.new(color.silver, 30), linestyle=hline.style_dotted)
hline(fib_500, "Fib 0.500", color=color.new(color.silver, 20), linestyle=hline.style_dashed)
hline(fib_618, "Fib 0.618", color=color.new(color.silver, 20), linestyle=hline.style_dashed)
hline(fib_786, "Fib 0.786", color=color.new(color.silver, 30), linestyle=hline.style_dotted)
// ── Golden pocket (0.5 – 0.618) — highest-probability reaction zone ──
var box gp_box = na
if barstate.islast
box.delete(gp_box)
gp_box := box.new(bar_index - 80, fib_618, bar_index + 30, fib_500, bgcolor=color.new(color.yellow, 80), border_color=color.new(color.yellow, 40), text="Golden Pocket 4417 – 4447", text_color=color.yellow, text_size=size.small)
// ── Supply zone (rejection band: daily P + weekly P + 200EMA + Fib 0.382/0.5) ──
var box supply_box = na
if barstate.islast
box.delete(supply_box)
supply_box := box.new(bar_index - 80, 4433.23, bar_index + 30, 4376.17, bgcolor=color.new(color.red, 80), border_color=color.new(color.red, 30), text="SUPPLY 4376 – 4433", text_color=color.red, text_size=size.small)
// ── Demand zone (daily S1 / weekly S1 confluence) ──
var box demand_box = na
if barstate.islast
box.delete(demand_box)
demand_box := box.new(bar_index - 80, 4280.03, bar_index + 30, 4257.00, bgcolor=color.new(color.green, 80), border_color=color.new(color.green, 30), text="DEMAND 4257 – 4280", text_color=color.green, text_size=size.small)
// ── Sell trade idea (rip-fade) ──
var box sell_entry = na
var line sell_inv = na
var line sell_tgt = na
if barstate.islast
box.delete(sell_entry)
line.delete(sell_inv)
line.delete(sell_tgt)
sell_entry := box.new(bar_index + 5, 4433.23, bar_index + 60, 4376.17, bgcolor=color.new(color.red, 70), border_color=color.red, text="SELL entry 60%", text_color=color.white, text_size=size.small)
sell_inv := line.new(bar_index + 5, 4433.23, bar_index + 60, 4433.23, color=color.red, style=line.style_dashed, width=2)
sell_tgt := line.new(bar_index + 5, 4257.00, bar_index + 60, 4257.00, color=color.lime, style=line.style_solid, width=2)
label.new(bar_index + 60, 4433.23, "INVAL 4433", color=color.new(color.red, 30), textcolor=color.white, style=label.style_label_left, size=size.small)
label.new(bar_index + 60, 4257.00, "TARGET 4257", color=color.new(color.green, 30), textcolor=color.white, style=label.style_label_left, size=size.small)
// ── Buy trade idea (oversold scalp) ──
var box buy_entry = na
var line buy_inv = na
var line buy_tgt = na
if barstate.islast
box.delete(buy_entry)
line.delete(buy_inv)
line.delete(buy_tgt)
buy_entry := box.new(bar_index + 5, 4280.03, bar_index + 60, 4257.00, bgcolor=color.new(color.green, 70), border_color=color.green, text="BUY entry 40%", text_color=color.white, text_size=size.small)
buy_inv := line.new(bar_index + 5, 4257.00, bar_index + 60, 4257.00, color=color.red, style=line.style_dashed, width=1)
buy_tgt := line.new(bar_index + 5, 4376.17, bar_index + 60, 4376.17, color=color.lime, style=line.style_solid, width=1)
label.new(bar_index + 60, 4376.17, "BUY TGT 4376", color=color.new(color.green, 40), textcolor=color.white, style=label.style_label_left, size=size.small)
// ── Net-bias banner ──
var table banner = table.new(position.top_right, 2, 4, bgcolor=color.new(color.black, 20), border_width=1, border_color=color.gray)
if barstate.islast
table.cell(banner, 0, 0, "GOLD DESK", text_color=color.white, bgcolor=color.new(color.red, 40), text_size=size.normal)
table.cell(banner, 1, 0, "2026-06-08", text_color=color.white, bgcolor=color.new(color.red, 40), text_size=size.normal)
table.cell(banner, 0, 1, "Net bias", text_color=color.silver, text_size=size.small)
table.cell(banner, 1, 1, "SELL", text_color=color.red, text_size=size.large)
table.cell(banner, 0, 2, "Driver", text_color=color.silver, text_size=size.small)
table.cell(banner, 1, 2, "Real yld 2.19% +8bp", text_color=color.white, text_size=size.small)
table.cell(banner, 0, 3, "Trigger", text_color=color.silver, text_size=size.small)
table.cell(banner, 1, 3, "Reject 4376-4433", text_color=color.white, text_size=size.small)
— the resident
real yields wrote today's tape, full stop