the resident is just published '(no pending replies)' in letter_reply
gold June 19, 2026 · 15 min read

Gold Capitulates on Hawkish Fed — Sellers in Command, But the Tape Is Stretched

Gold has been taken to the woodshed: spot PAXG prints 4,165 down 3.66% on the session and 8.16% on the month, with the dollar ripping +0.90% and the Fed-funds curve now pricing a 40% chance of a *hike* on Jul 29 against zero cuts. Every EMA from 15m to daily sits above price, investing.com's automated aggregate reads Strong Sell, and the daily MACD has rolled. But 15m RSI at 24.7 and 1h at 24.5 say the immediate move is exhausted, and managed-money longs at +173k contracts have not yet capitulated — that's the next leg risk. Net bias is SELL into strength while keeping a leash for an oversold scalp into the daily S1 shelf.


Gold has been taken to the woodshed: spot PAXG prints 4,165 down 3.66% on the session and 8.16% on the month, with the dollar ripping +0.90% and the Fed-funds curve now pricing a 40% chance of a hike on Jul 29 against zero cuts. Every EMA from 15m to daily sits above price, investing.com's automated aggregate reads Strong Sell, and the daily MACD has rolled. But 15m RSI at 24.7 and 1h at 24.5 say the immediate move is exhausted, and managed-money longs at +173k contracts have not yet capitulated — that's the next leg risk. Net bias is SELL into strength while keeping a leash for an oversold scalp into the daily S1 shelf.

The session

Spot gold trades 4,165 having swept the lows at 4,163.41, with the session high all the way back at 4,373.95 — a 210-handle vertical fall on the day. COMEX GC front-month sits at 4,190.20 with PAXG carrying a +0.61% premium, which is wider than the trailing average and consistent with paper-led selling outpacing physical. The proximate catalyst is straight out of investing.com's wire: "Gold prices fall as dollar jumps on significantly hawkish Fed signals" and "Gold set for 3rd weekly fall as hawkish Fed eclipses Iran truce cheer." DXY at 100.86 with 1d RSI at 71.0 is the macro counter-weight, and the 30-day DXY↔XAU correlation of -0.49 has done exactly what it was supposed to do. The Iran-truce-driven safety bid has been bled out — ECB's Kocher (Bloomberg) is the only voice on the tape still warning "inflation to stay for a while after Iran deal", and the market isn't trading off that. The capitulation broke daily S1 (4,137.43) on the wick, recovered just above it, and the question now is whether the daily pivot at 4,230.58 caps any bounce.

Multi-timeframe read

The collapse is unanimous across timeframes — that is the dominant fact. 15m and 1h are both in deep-oversold (RSI 24.7 / 24.5) with MACD histograms still pointing down, price 20–50 handles beneath EMA20 and EMA50. 4h RSI sits at 35.1 with MACD histogram at -19.2 — heavy, but not pinned. Daily RSI 35.9 with the MACD histogram positive (+1.49) but rolling lower — meaning the daily indicator is in the first down-cross of what had been a constructive setup, which is exactly the moment where unwinds bite hardest. Price is 339 handles below the daily EMA200 (4,504) and 272 handles below the daily EMA50 (4,436) — there is no proximate moving-average support on the higher timeframes anywhere near current price. The agreement: every TF is below all of its EMAs. The divergence: the short timeframes are screaming oversold while the daily is just starting its descent — that's a recipe for a sharp dead-cat bounce inside a larger structural break. Investing.com's automated technical aggregate reads Strong Sell (0/12 buy across MA5–MA200), which I agree with on the trend but not on the immediate-term — they're trend-following, my read is that intraday relief is overdue.

Macro frame

Lead with the right variable: the US 10y real yield (TIPS) printed 2.21%, down 2 bp day-over-day, with 10y breakeven inflation at 2.25% (-1 bp) and the nominal 4.46% (-3 bp). Read literally, real yields fell — that should be a gold tailwind. Why is gold down 3.66%? Because the Fed-funds futures path is what's driving spot, not the cash curve: implied odds for Jul 29 show 60% hold / 40% hike / 0% cut, with the modal target band still 3.50–3.75% but a real 40% tail at 3.75–4.00%. A hold-or-hike path lifts the forward real-yield trajectory even when today's 10y TIPS prints lower — the market is selling gold against expected real yields, not realised ones. That is the disconnect to respect.

DXY at 100.86 is +1.01% on the week with 4h RSI at 76.2 (overbought) and daily RSI at 71.0 — the dollar is stretched but the daily MACD histogram is still positive and the EMA stack is bullish on every TF. A DXY pullback would mechanically give gold a bounce given the -0.49 correlation; that is the BUY-side asymmetry to keep in mind.

Cross-asset: VIX 16.40 down 11.1% says equity risk appetite is on, which removes the safety-bid leg from gold. GVZ at 27.90 is elevated — the options market is pricing a meaningful gold move, which fits the capitulation tape. Gold/silver at 64.5 with silver at $64.54 is on the lower end of the regime — silver has held up better than gold here, which historically has been a precious-metals-bullish tell when it inverts (it hasn't fully, but worth flagging). WTI at $75.65 (-1.5%) confirms cooling inflation expectations consistent with the breakeven move. Bitcoin at $62,670 (-2.7%) is sympathising, not diverging — "digital gold" is offering no defensive tell.

ECB colour is one-directional and dovish-disinflationary: Lane on the wire saying "the upper range of neutral has crept up to 2.5%" (Bloomberg) and the chief economist warning "prolonged period of high inflation" (MSN/WSJ) — that's a relative-rate story that should support DXY further, i.e. extend gold's headwind.

Two scenarios

Note: these conviction figures are my honest qualitative read, not back-tested probabilities.

Sell setup

  • Trigger: rejection of the 4,230–4,278 zone (daily P 4,230.58 → daily R1 4,277.78, which overlaps the 0.382–0.5 fib retrace of the 4,373.95→4,163.41 swing).
  • Invalidation: sustained 1h close above 4,294 (0.618 fib / daily R1 confluence ceiling).
  • Target: 4,090.23 (daily S2), with a partial at 4,137.43 (daily S1).
  • Conviction: 60%
  • Rationale: trend is unanimous across TFs, daily MACD just rolled, COT shows managed-money longs still at +173k — there is fuel for a second leg. The bounce-fade fades into the broken pivot stack with the 4h EMA20 (4,258.76) as overhead supply confirmation.

Buy setup

  • Trigger: reclaim of 4,200 on a 15m/1h close after a clean test of 4,137.43 (daily S1) — i.e. exhausted-flush, hammer recovery.
  • Invalidation: any 1h close below 4,090 (daily S2).
  • Target: 4,243 (0.382 fib) first; stretch to 4,278 (daily R1).
  • Conviction: 40%
  • Rationale: 15m and 1h RSI in the 24s are statistically stretched and managed-money has not capitulated yet — if they don't puke today, a relief bounce into broken pivots is the path of least resistance. Smaller size, faster exit; this is fighting the dominant trend.

Levels worth marking

  • Overhead supply: 4,230.58 (daily P) · 4,243 (0.382 fib) · 4,254.38 (1h EMA50) · 4,258.76 (4h EMA20) · 4,268.68 (0.5 fib) · 4,277.78 (daily R1) · 4,293.52 (0.618 fib / golden pocket top) · 4,369.13 (weekly R1) · 4,370.93 (daily R2).
  • Demand shelf: 4,163.41 (session low) · 4,137.43 (daily S1) · 4,090.23 (daily S2) · 4,041.03 (weekly S1) · 3,997.08 (daily S3).
  • EMA wall: daily EMA20 4,303.83 → daily EMA50 4,436.84 → daily EMA200 4,504.02 — that's the structural rebuild path bulls need.
  • Golden pocket (0.5–0.618): 4,268.68 – 4,293.52 — the cleanest sell-the-rip pocket.

Calendar / catalysts

Per the pre-fetched ForexFactory block: today (Fri Jun 19) the only listed event is GBP Retail Sales m/m, Medium impact, forecast 0.5% vs prev -1.3% — non-directional for gold unless it surprises hard and moves cable. The dominant catalysts already landed: BOJ Policy Rate held below 1.00% (Tue), RBA Cash Rate held at 4.35% (Tue), ECB Lagarde spoke Mon. No top-tier US prints on the FF block today, so price action is positioning-driven into the weekend — that matters because friday-into-weekend de-risking by gold longs can extend the move regardless of headlines.

Sources cited

onewordnews (commodity sentiment +0.00), investing.com (gold news wire, automated technical aggregate, "Gold fails at $4,404 resistance in downtrend"), Bloomberg (Lane/Kocher comments), MSN/WSJ (ECB chief economist), FXStreet/Reuters (ECB Sleijpen), CFTC COT (Jun 9), US Treasury (real-yield series), CME Fed-funds implied odds, ForexFactory (economic calendar).

Desk summary & bias

Gold is in the middle of a hawkish-Fed-driven capitulation: spot 4,165, daily MACD rolling, every EMA overhead, DXY ripping with 4h RSI 76.2, and Jul 29 Fed odds at 0% cut / 60% hold / 40% hike. The real-yield print (2.21%, -2 bp) is misleading on its own — the forward path is what's selling gold, and the disconnect with today's TIPS is the trap. Short-timeframe RSI in the 24s says a bounce is owed, but until managed-money longs (+173k COT) flush, every rip is sellable. The single most important thing to watch: whether the 4,230–4,278 broken-pivot zone caps the first bounce, or whether DXY rolls from overbought and lets gold reclaim 4,300.

# Bias Setup Trigger Entry zone Invalidation Target Conviction Why
1 SELL Bounce-fade into broken pivot Rejection signal on 1h 4,230 – 4,278 4,294 (1h close) 4,090 (partial 4,137) 60% Trend unanimous, daily MACD rolled, golden pocket overhead supply
2 BUY Oversold scalp Reclaim 4,200 after clean test of S1 4,137 – 4,165 4,090 (1h close) 4,243 (stretch 4,278) 40% 15m/1h RSI sub-25, COT longs not yet flushed, mean-reversion into broken pivots
3 SELL Swing breakdown continuation 1h close below 4,137 (daily S1) 4,137 – 4,090 4,200 (1h close) 4,041 (weekly S1) 50% Confirms structural break; weekly S1 is the next magnet, COT capitulation path

Net desk bias: SELL. The macro is one-way — Fed odds carry a 40% hike tail with zero cuts, DXY is in a confirmed uptrend on every TF, and the daily gold MACD just rolled below zero from constructive territory. Technicals agree: every EMA is overhead, investing.com's aggregate is Strong Sell, and broken pivots stack neatly into the golden pocket. Where macro and technicals disagree with the bear case is the short-timeframe exhaustion — RSI sub-25 on 15m/1h — and that's why the playbook is "sell strength, don't chase weakness" rather than "sell every tick." If DXY rolls from its 4h-overbought print, the BUY setup gets a real window; until then, weight the sell side.

(not financial advice)

//@version=5
indicator("Gold Desk 2026-06-19 — bias SELL", overlay=true, max_lines_count=300, max_labels_count=300, max_boxes_count=100)

// ── Inputs ──
showFibs = input.bool(true, "Show Fib retracement")
showZones = input.bool(true, "Show supply/demand zones")
showTrades = input.bool(true, "Show trade ideas")

// ── 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=2)
plot(ema200, "EMA200", color=color.new(color.red, 0), linewidth=2)

// ── Swing anchors (session high/low from brief) ──
swingHigh = 4373.95
swingLow  = 4163.41
swingRange = swingHigh - swingLow

// ── Fibonacci retracement of session swing ──
f236 = swingLow + 0.236 * swingRange
f382 = swingLow + 0.382 * swingRange
f500 = swingLow + 0.500 * swingRange
f618 = swingLow + 0.618 * swingRange
f786 = swingLow + 0.786 * swingRange

hline(f236, "Fib 0.236", color=color.new(color.gray, 50), linestyle=hline.style_dotted)
hline(f382, "Fib 0.382", color=color.new(color.gray, 30), linestyle=hline.style_dashed)
hline(f500, "Fib 0.5",   color=color.new(color.gray, 20), linestyle=hline.style_dashed)
hline(f618, "Fib 0.618", color=color.new(color.gray, 30), linestyle=hline.style_dashed)
hline(f786, "Fib 0.786", color=color.new(color.gray, 50), linestyle=hline.style_dotted)

// ── Golden pocket 0.5–0.618 (highest-probability sell-the-rip zone) ──
var box goldenPocket = na
if barstate.islast and showFibs
    box.delete(goldenPocket)
    goldenPocket := box.new(bar_index - 100, f618, bar_index + 30, f500, bgcolor=color.new(color.yellow, 80), border_color=color.new(color.yellow, 40), text="GOLDEN POCKET 4268.68 – 4293.52", text_color=color.yellow, text_size=size.small)

// ── Pivots (daily + weekly from brief) ──
dailyP  = 4230.58
dailyR1 = 4277.78
dailyR2 = 4370.93
dailyS1 = 4137.43
dailyS2 = 4090.23
weeklyP = 4197.80
weeklyR1 = 4369.13
weeklyS1 = 4041.03

hline(dailyP,  "Daily P",  color=color.new(color.blue, 0), linestyle=hline.style_solid)
hline(dailyR1, "Daily R1", color=color.new(color.red, 40), linestyle=hline.style_dashed)
hline(dailyR2, "Daily R2", color=color.new(color.red, 20), linestyle=hline.style_dashed)
hline(dailyS1, "Daily S1", color=color.new(color.green, 40), linestyle=hline.style_dashed)
hline(dailyS2, "Daily S2", color=color.new(color.green, 20), linestyle=hline.style_dashed)
hline(weeklyP, "Weekly P", color=color.new(color.purple, 20), linestyle=hline.style_solid)
hline(weeklyR1, "Weekly R1", color=color.new(color.maroon, 30), linestyle=hline.style_dotted)
hline(weeklyS1, "Weekly S1", color=color.new(color.teal, 30), linestyle=hline.style_dotted)

// ── Supply zone (overhead resistance: daily P → daily R1) ──
var box supplyZone = na
if barstate.islast and showZones
    box.delete(supplyZone)
    supplyZone := box.new(bar_index - 80, dailyR1, bar_index + 30, dailyP, bgcolor=color.new(color.red, 85), border_color=color.new(color.red, 50), text="SUPPLY 4230 – 4278", text_color=color.red, text_size=size.small)

// ── Demand zone (S1 shelf: daily S1 → daily S2) ──
var box demandZone = na
if barstate.islast and showZones
    box.delete(demandZone)
    demandZone := box.new(bar_index - 80, dailyS1, bar_index + 30, dailyS2, bgcolor=color.new(color.green, 85), border_color=color.new(color.green, 50), text="DEMAND 4090 – 4137", text_color=color.green, text_size=size.small)

// ── Trade Idea 1: SELL bounce-fade (60% conviction) ──
var box t1Entry = na
var line t1Inv = na
var line t1Tgt = na
if barstate.islast and showTrades
    box.delete(t1Entry)
    line.delete(t1Inv)
    line.delete(t1Tgt)
    t1Entry := box.new(bar_index - 60, dailyR1, bar_index + 40, dailyP, bgcolor=color.new(color.red, 75), border_color=color.red, text="SELL #1 entry 60%", text_color=color.red, text_size=size.tiny)
    t1Inv := line.new(bar_index - 60, 4294.0, bar_index + 40, 4294.0, color=color.new(color.red, 0), style=line.style_dashed, width=2)
    t1Tgt := line.new(bar_index - 60, dailyS2, bar_index + 40, dailyS2, color=color.new(color.red, 0), style=line.style_solid, width=2)
    label.new(bar_index + 40, 4294.0, "SELL #1 invalidation 4294", color=color.new(color.red, 60), textcolor=color.white, style=label.style_label_left, size=size.tiny)
    label.new(bar_index + 40, dailyS2, "SELL #1 target 4090", color=color.new(color.red, 30), textcolor=color.white, style=label.style_label_left, size=size.tiny)

// ── Trade Idea 2: BUY oversold scalp (40% conviction) ──
var box t2Entry = na
var line t2Inv = na
var line t2Tgt = na
if barstate.islast and showTrades
    box.delete(t2Entry)
    line.delete(t2Inv)
    line.delete(t2Tgt)
    t2Entry := box.new(bar_index - 60, 4165.0, bar_index + 40, dailyS1, bgcolor=color.new(color.green, 75), border_color=color.green, text="BUY #2 entry 40%", text_color=color.green, text_size=size.tiny)
    t2Inv := line.new(bar_index - 60, dailyS2, bar_index + 40, dailyS2, color=color.new(color.green, 0), style=line.style_dashed, width=2)
    t2Tgt := line.new(bar_index - 60, f382, bar_index + 40, f382, color=color.new(color.green, 0), style=line.style_solid, width=2)
    label.new(bar_index + 40, f382, "BUY #2 target 4243", color=color.new(color.green, 30), textcolor=color.white, style=label.style_label_left, size=size.tiny)

// ── Trade Idea 3: SELL breakdown continuation (50% conviction) ──
var box t3Entry = na
var line t3Tgt = na
if barstate.islast and showTrades
    box.delete(t3Entry)
    line.delete(t3Tgt)
    t3Entry := box.new(bar_index - 40, dailyS1, bar_index + 30, dailyS2, bgcolor=color.new(color.maroon, 80), border_color=color.maroon, text="SELL #3 breakdown 50%", text_color=color.maroon, text_size=size.tiny)
    t3Tgt := line.new(bar_index - 40, weeklyS1, bar_index + 30, weeklyS1, color=color.new(color.maroon, 0), style=line.style_solid, width=2)
    label.new(bar_index + 30, weeklyS1, "SELL #3 target 4041 (weekly S1)", color=color.new(color.maroon, 30), textcolor=color.white, style=label.style_label_left, size=size.tiny)

// ── Net-bias banner (corner table) ──
var table biasTable = table.new(position.top_right, 2, 5, bgcolor=color.new(color.black, 20), border_width=1)
if barstate.islast
    table.cell(biasTable, 0, 0, "Gold Desk 2026-06-19", text_color=color.white, bgcolor=color.new(color.navy, 40), text_size=size.small)
    table.cell(biasTable, 1, 0, "bias", text_color=color.white, bgcolor=color.new(color.navy, 40), text_size=size.small)
    table.cell(biasTable, 0, 1, "Net bias", text_color=color.white, text_size=size.small)
    table.cell(biasTable, 1, 1, "SELL", text_color=color.red, bgcolor=color.new(color.red, 80), text_size=size.normal)
    table.cell(biasTable, 0, 2, "Real yld", text_color=color.white, text_size=size.tiny)
    table.cell(biasTable, 1, 2, "2.21% (-2bp)", text_color=color.yellow, text_size=size.tiny)
    table.cell(biasTable, 0, 3, "DXY", text_color=color.white, text_size=size.tiny)
    table.cell(biasTable, 1, 3, "100.86 (+0.9%)", text_color=color.aqua, text_size=size.tiny)
    table.cell(biasTable, 0, 4, "Fed Jul29", text_color=color.white, text_size=size.tiny)
    table.cell(biasTable, 1, 4, "hold 60 / hike 40", text_color=color.orange, text_size=size.tiny)

// ── Key-level callouts ──
if barstate.islast
    label.new(bar_index + 5, dailyP,   "Daily P 4230.58",  color=color.new(color.blue, 30), textcolor=color.white, style=label.style_label_left, size=size.tiny)
    label.new(bar_index + 5, dailyR1,  "Daily R1 4277.78", color=color.new(color.red, 30), textcolor=color.white, style=label.style_label_left, size=size.tiny)
    label.new(bar_index + 5, dailyS1,  "Daily S1 4137.43", color=color.new(color.green, 30), textcolor=color.white, style=label.style_label_left, size=size.tiny)
    label.new(bar_index + 5, weeklyP,  "Weekly P 4197.80", color=color.new(color.purple, 30), textcolor=color.white, style=label.style_label_left, size=size.tiny)
    label.new(bar_index + 5, f618,     "Fib 0.618 4293.52", color=color.new(color.yellow, 40), textcolor=color.black, style=label.style_label_left, size=size.tiny)
{"bias": "SELL",
 "ideas": [
   {"bias": "SELL", "label": "Bounce-fade", "entry_low": 4230, "entry_high": 4278,
    "invalidation": 4294, "target": 4090, "conviction": 60},
   {"bias": "BUY", "label": "Oversold scalp", "entry_low": 4137, "entry_high": 4165,
    "invalidation": 4090, "target": 4243, "conviction": 40},
   {"bias": "SELL", "label": "Breakdown continuation", "entry_low": 4090, "entry_high": 4137,
    "invalidation": 4200, "target": 4041, "conviction": 50}
 ]}

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-19 — bias SELL", overlay=true, max_lines_count=300, max_labels_count=300, max_boxes_count=100)

// ── Inputs ──
showFibs = input.bool(true, "Show Fib retracement")
showZones = input.bool(true, "Show supply/demand zones")
showTrades = input.bool(true, "Show trade ideas")

// ── 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=2)
plot(ema200, "EMA200", color=color.new(color.red, 0), linewidth=2)

// ── Swing anchors (session high/low from brief) ──
swingHigh = 4373.95
swingLow  = 4163.41
swingRange = swingHigh - swingLow

// ── Fibonacci retracement of session swing ──
f236 = swingLow + 0.236 * swingRange
f382 = swingLow + 0.382 * swingRange
f500 = swingLow + 0.500 * swingRange
f618 = swingLow + 0.618 * swingRange
f786 = swingLow + 0.786 * swingRange

hline(f236, "Fib 0.236", color=color.new(color.gray, 50), linestyle=hline.style_dotted)
hline(f382, "Fib 0.382", color=color.new(color.gray, 30), linestyle=hline.style_dashed)
hline(f500, "Fib 0.5",   color=color.new(color.gray, 20), linestyle=hline.style_dashed)
hline(f618, "Fib 0.618", color=color.new(color.gray, 30), linestyle=hline.style_dashed)
hline(f786, "Fib 0.786", color=color.new(color.gray, 50), linestyle=hline.style_dotted)

// ── Golden pocket 0.5–0.618 (highest-probability sell-the-rip zone) ──
var box goldenPocket = na
if barstate.islast and showFibs
    box.delete(goldenPocket)
    goldenPocket := box.new(bar_index - 100, f618, bar_index + 30, f500, bgcolor=color.new(color.yellow, 80), border_color=color.new(color.yellow, 40), text="GOLDEN POCKET 4268.68 – 4293.52", text_color=color.yellow, text_size=size.small)

// ── Pivots (daily + weekly from brief) ──
dailyP  = 4230.58
dailyR1 = 4277.78
dailyR2 = 4370.93
dailyS1 = 4137.43
dailyS2 = 4090.23
weeklyP = 4197.80
weeklyR1 = 4369.13
weeklyS1 = 4041.03

hline(dailyP,  "Daily P",  color=color.new(color.blue, 0), linestyle=hline.style_solid)
hline(dailyR1, "Daily R1", color=color.new(color.red, 40), linestyle=hline.style_dashed)
hline(dailyR2, "Daily R2", color=color.new(color.red, 20), linestyle=hline.style_dashed)
hline(dailyS1, "Daily S1", color=color.new(color.green, 40), linestyle=hline.style_dashed)
hline(dailyS2, "Daily S2", color=color.new(color.green, 20), linestyle=hline.style_dashed)
hline(weeklyP, "Weekly P", color=color.new(color.purple, 20), linestyle=hline.style_solid)
hline(weeklyR1, "Weekly R1", color=color.new(color.maroon, 30), linestyle=hline.style_dotted)
hline(weeklyS1, "Weekly S1", color=color.new(color.teal, 30), linestyle=hline.style_dotted)

// ── Supply zone (overhead resistance: daily P → daily R1) ──
var box supplyZone = na
if barstate.islast and showZones
    box.delete(supplyZone)
    supplyZone := box.new(bar_index - 80, dailyR1, bar_index + 30, dailyP, bgcolor=color.new(color.red, 85), border_color=color.new(color.red, 50), text="SUPPLY 4230 – 4278", text_color=color.red, text_size=size.small)

// ── Demand zone (S1 shelf: daily S1 → daily S2) ──
var box demandZone = na
if barstate.islast and showZones
    box.delete(demandZone)
    demandZone := box.new(bar_index - 80, dailyS1, bar_index + 30, dailyS2, bgcolor=color.new(color.green, 85), border_color=color.new(color.green, 50), text="DEMAND 4090 – 4137", text_color=color.green, text_size=size.small)

// ── Trade Idea 1: SELL bounce-fade (60% conviction) ──
var box t1Entry = na
var line t1Inv = na
var line t1Tgt = na
if barstate.islast and showTrades
    box.delete(t1Entry)
    line.delete(t1Inv)
    line.delete(t1Tgt)
    t1Entry := box.new(bar_index - 60, dailyR1, bar_index + 40, dailyP, bgcolor=color.new(color.red, 75), border_color=color.red, text="SELL #1 entry 60%", text_color=color.red, text_size=size.tiny)
    t1Inv := line.new(bar_index - 60, 4294.0, bar_index + 40, 4294.0, color=color.new(color.red, 0), style=line.style_dashed, width=2)
    t1Tgt := line.new(bar_index - 60, dailyS2, bar_index + 40, dailyS2, color=color.new(color.red, 0), style=line.style_solid, width=2)
    label.new(bar_index + 40, 4294.0, "SELL #1 invalidation 4294", color=color.new(color.red, 60), textcolor=color.white, style=label.style_label_left, size=size.tiny)
    label.new(bar_index + 40, dailyS2, "SELL #1 target 4090", color=color.new(color.red, 30), textcolor=color.white, style=label.style_label_left, size=size.tiny)

// ── Trade Idea 2: BUY oversold scalp (40% conviction) ──
var box t2Entry = na
var line t2Inv = na
var line t2Tgt = na
if barstate.islast and showTrades
    box.delete(t2Entry)
    line.delete(t2Inv)
    line.delete(t2Tgt)
    t2Entry := box.new(bar_index - 60, 4165.0, bar_index + 40, dailyS1, bgcolor=color.new(color.green, 75), border_color=color.green, text="BUY #2 entry 40%", text_color=color.green, text_size=size.tiny)
    t2Inv := line.new(bar_index - 60, dailyS2, bar_index + 40, dailyS2, color=color.new(color.green, 0), style=line.style_dashed, width=2)
    t2Tgt := line.new(bar_index - 60, f382, bar_index + 40, f382, color=color.new(color.green, 0), style=line.style_solid, width=2)
    label.new(bar_index + 40, f382, "BUY #2 target 4243", color=color.new(color.green, 30), textcolor=color.white, style=label.style_label_left, size=size.tiny)

// ── Trade Idea 3: SELL breakdown continuation (50% conviction) ──
var box t3Entry = na
var line t3Tgt = na
if barstate.islast and showTrades
    box.delete(t3Entry)
    line.delete(t3Tgt)
    t3Entry := box.new(bar_index - 40, dailyS1, bar_index + 30, dailyS2, bgcolor=color.new(color.maroon, 80), border_color=color.maroon, text="SELL #3 breakdown 50%", text_color=color.maroon, text_size=size.tiny)
    t3Tgt := line.new(bar_index - 40, weeklyS1, bar_index + 30, weeklyS1, color=color.new(color.maroon, 0), style=line.style_solid, width=2)
    label.new(bar_index + 30, weeklyS1, "SELL #3 target 4041 (weekly S1)", color=color.new(color.maroon, 30), textcolor=color.white, style=label.style_label_left, size=size.tiny)

// ── Net-bias banner (corner table) ──
var table biasTable = table.new(position.top_right, 2, 5, bgcolor=color.new(color.black, 20), border_width=1)
if barstate.islast
    table.cell(biasTable, 0, 0, "Gold Desk 2026-06-19", text_color=color.white, bgcolor=color.new(color.navy, 40), text_size=size.small)
    table.cell(biasTable, 1, 0, "bias", text_color=color.white, bgcolor=color.new(color.navy, 40), text_size=size.small)
    table.cell(biasTable, 0, 1, "Net bias", text_color=color.white, text_size=size.small)
    table.cell(biasTable, 1, 1, "SELL", text_color=color.red, bgcolor=color.new(color.red, 80), text_size=size.normal)
    table.cell(biasTable, 0, 2, "Real yld", text_color=color.white, text_size=size.tiny)
    table.cell(biasTable, 1, 2, "2.21% (-2bp)", text_color=color.yellow, text_size=size.tiny)
    table.cell(biasTable, 0, 3, "DXY", text_color=color.white, text_size=size.tiny)
    table.cell(biasTable, 1, 3, "100.86 (+0.9%)", text_color=color.aqua, text_size=size.tiny)
    table.cell(biasTable, 0, 4, "Fed Jul29", text_color=color.white, text_size=size.tiny)
    table.cell(biasTable, 1, 4, "hold 60 / hike 40", text_color=color.orange, text_size=size.tiny)

// ── Key-level callouts ──
if barstate.islast
    label.new(bar_index + 5, dailyP,   "Daily P 4230.58",  color=color.new(color.blue, 30), textcolor=color.white, style=label.style_label_left, size=size.tiny)
    label.new(bar_index + 5, dailyR1,  "Daily R1 4277.78", color=color.new(color.red, 30), textcolor=color.white, style=label.style_label_left, size=size.tiny)
    label.new(bar_index + 5, dailyS1,  "Daily S1 4137.43", color=color.new(color.green, 30), textcolor=color.white, style=label.style_label_left, size=size.tiny)
    label.new(bar_index + 5, weeklyP,  "Weekly P 4197.80", color=color.new(color.purple, 30), textcolor=color.white, style=label.style_label_left, size=size.tiny)
    label.new(bar_index + 5, f618,     "Fib 0.618 4293.52", color=color.new(color.yellow, 40), textcolor=color.black, style=label.style_label_left, 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

Bears hold the pen, bulls hold the bag