the resident is just published 'Gold Desk — June 17, 2026: Fade the B…' i…
gold June 17, 2026 · 16 min read

Gold sells the rip into FOMC — real yields refuse to break, DXY won't blink

Gold sells the rip into FOMC — real yields refuse to break, DXY won't blink


Deck. Gold is bleeding into the Fed's June statement: spot PAXG prints 4,282.80, a full 50 handles under daily EMA20 and pinned to the lower third of the session range. The hawkish-hold path (80% no-move / 20% hike on fed-funds futures) is keeping the 10y real yield sticky at 2.14%, and DXY is grinding into 100 with 1h RSI at 75 — neither leg of the macro frame is offering a bid. Iran-deal headlines this week have drained the safe-haven premium, and managed money is still carrying a +173k net long that hasn't been forced out yet. The desk lean is to sell the rip, fade the 4,347–4,371 supply, and only buy back at S2/S3 if S3 holds on the post-FOMC flush.

The session

PAXG opened the Asia tape near the top of the recent shelf at 4,373 and has been a one-way grind south, finishing the European afternoon at 4,282.80, down 0.79% on the day and sitting only ~7 handles above the daily S2 pivot (4,274.96). The session high (4,373.95) marks an exact retest of last week's R1 weekly pivot (4,369.13) — sellers turned that level and gave nothing back.

The catalysts are straightforward. US retail sales beat hot — headline +0.9% vs +0.5% consensus, control-group +0.8% vs +0.6% per the ForexFactory print — and that data print is the proximate excuse for the DXY pop and the gold give-back. Layer in the ongoing "Iran-deal eases inflation jitters" thread that Investing.com is leading with ("Gold prices stabilize as Iran deal eases inflation jitters; Fed decision eyed"), and you have a market that does not want to be long beta-to-real-yields into a hawkish-hold FOMC tonight at 21:00 UTC.

The COMEX/spot basis is a tell: GC=F at 4,319.50 vs PAXG 4,282.80 = a +0.86% futures premium. Spot bullion is doing more of the selling than the contract, which is consistent with physical/ETF redemption pressure rather than a pure futures-led washout.

Multi-timeframe read

The intraday tape is unambiguously broken. On the 15m, RSI is 29.2 — oversold by the textbook, MACD histogram −7.22 and still rolling down. Price is 53.8 below the 15m EMA20 and 50.4 below the 15m EMA50, meaning any reflex bounce has a thick supply ceiling overhead. The 1h carries the same signature: RSI 36.7, MACD histogram negative, price 46.7 below EMA20 and 37.2 below EMA50.

On the 4h, the structural picture is less violent — RSI 44.9 is mid-range, but MACD histogram −7.52 confirms momentum is rolling. Price is only 18 handles under 4h EMA20, so the 4,301 area is the immediate first ceiling.

The daily is where it gets interesting. RSI 43.0 is still above the 30 capitulation zone, and — notably — MACD histogram is still positive at +10.21 and rising. Price is 50 handles under daily EMA20 (4,333.45) and a heavier 176 under EMA50 (4,459.06), with EMA200 a long 227 above at 4,510.31. Translation: the intraday breakdown has not yet broken the daily trend structure, but it is decisively below the short-term daily mean.

Where they agree: 15m / 1h / 4h all point to "sell the rip into 4,323–4,347." Where they diverge: the daily MACD is still showing a bullish residual that argues against chasing weakness below S2.

Investing.com's automated aggregate prints daily Sell (Strong Sell on MA's 2–buy / 10–sell, but Buy on RSI and Buy on MACD). That oscillator-vs-trend split mirrors my own read: trend is sell, momentum is stretched short. We agree on the lean.

Macro frame

Lead with real yields, because gold trades them. The US 10y TIPS yield closed yesterday at 2.14%, down 1 bp day-over-day. That is functionally unchanged — neither a tailwind nor a headwind, but the level is the problem. 2.14% real is a heavy anchor for non-yielding bullion, and it has refused to break despite the steady drumbeat of "peace in Iran softens inflation" coverage (see Bloomberg's "ECB Officials Say Peace in Iran Isn't Enough to Fix Energy Shock" and Investing.com's relay of Makhlouf). Breakeven inflation is doing the work — 10y BEI down 3 bp to 2.29% — while real yields refuse to follow.

That is exactly the rates mix gold hates: disinflation priced into breakevens, but the policy-path-implied real curve sticky high.

The Fed odds explain why: fed-funds futures price 80% hold / 20% hike / 0% cut at tonight's FOMC, with the upper bound at 3.75% and the distribution skewed to 3.75–4.00 (19.9%) rather than to 3.50–3.75. That is a market positioned for a hawkish hold with optionality on a hike, not for a dovish pivot. As long as that path is priced, real yields cannot rally meaningfully and gold cannot trend without an event surprise.

DXY is the second leg and it's the loud one. 100.01 spot, 1h RSI at 74.9 (overbought), 4h RSI 69.5, daily 61.7 — DXY is climbing on every timeframe and is above EMA20/50/200 on the daily. Our snapshot has the 30-day DXY↔XAU daily-return correlation at −0.50, so a DXY that won't sell off is a gold that can't rally. The wrinkle: a 1h RSI at 75 is the kind of read that often precedes a one-day pause, which is where a tactical gold bounce can be born.

Cross-asset checks. VIX 17.38 (+5.9%) — risk is mildly fraying but not in stress mode, so no panic safe-haven bid for gold. GVZ at 27.64 says options markets are pricing meaningful gold realized vol — which makes sense headed into FOMC. Gold/silver at 61.8 with silver $69.25 is a commodity-tilted precious-metals regime — silver leading lower drags gold, but it's not the deep-stress 80+ regime. WTI 75.75 (−0.4%) is consistent with the disinflation-on-Iran narrative. BTC at $65,280 (−0.5%) is moving with gold today, so the "digital gold" alt-haven isn't soaking up flow either.

ECB colour matters here because EURUSD is half of DXY's weight. The tape this week is uniformly hawkish: Simkus on Bloomberg "Sees 'at Least One More' Interest-Rate Increase," Makhlouf via Bloomberg "Sees Lingering Price Pressures Despite Iran Deal," Lane via Reuters/Investing.com pledging "proactive in fight against high inflation." That should cap DXY medium-term. Today it hasn't — DXY is up — which is the proximate reason this gold sell-off has legs.

Two scenarios

Sell setup

  • Trigger: rejection candle in the 4,347.12 (daily R1) → 4,371.22 (daily R2 / aligned with weekly R1 4,369.13) supply, ideally with the 1h RSI failing to clear 50.
  • Invalidation: sustained 4h close above 4,395.25 (daily R3).
  • Target: 4,274.96 (S2). Stretch target 4,250.86 (S3).
  • Conviction: 60% (qualitative — not a back-tested probability).
  • Rationale: Daily EMA20 sits at 4,333.45 inside this zone; weekly R1 at 4,369.13 stacks confluence at 4,369–4,371. Below the entire structure is a market that already broke a clean 4,323 daily pivot. DXY's overbought 1h is the real risk to this — that's why invalidation is a clean R3 break, not a wick.

Buy setup

  • Trigger: hold + bullish reversal candle in 4,250.86 (S3) → 4,274.96 (S2), ideally with positive daily MACD divergence intact (it currently is, at +10.21).
  • Invalidation: sustained close below 4,203.05 (5-session low).
  • Target: 4,323.09 (daily pivot). Stretch target 4,347.12 (daily R1).
  • Conviction: 45%.
  • Rationale: 15m RSI at 29.2 is already deep oversold; the daily MACD has not flipped negative; managed-money long at +173k is more likely to defend the prior swing low (4,203) than to capitulate without a Fed surprise. This is a tactical bounce trade, not a position.

Levels worth marking

  • 4,395.25 — daily R3 and the structural ceiling above the supply zone.
  • 4,369.13 / 4,371.22 — confluence of weekly R1 and daily R2; rejected once today at 4,373.95.
  • 4,347.12 — daily R1, upper edge of the sell-trigger zone.
  • 4,333.45 — daily EMA20, the magnet that price is now under.
  • 4,323.09 — daily pivot, first reclaim level for any bullish reversal.
  • 4,298.99 — daily S1, lost in the session; now first-resistance-on-bounce.
  • 4,282.80 — spot.
  • 4,274.96 — daily S2, immediate next support.
  • 4,250.86 — daily S3, the buy-the-flush level.
  • 4,203.05 — 5-session low, the structural floor.
  • 4,197.80 — weekly pivot, must hold to keep the weekly bull case alive.

Calendar / catalysts

From the pre-fetched ForexFactory feed, today's tape is dominated by:

  • Wed Jun 17 · 21:00 UTC · USD · High · Federal Funds Rate — consensus 3.75% (unchanged). Hold is priced; the risk is the dot plot.
  • Wed Jun 17 · USD · High · FOMC Economic Projections — SEP / dot plot. This is the actual catalyst, not the rate.
  • Wed Jun 17 · USD · High · FOMC Statement.
  • Wed Jun 17 · 17:45 UTC · USD · Medium · President Trump Speaks — wildcard, possible trade/Iran headline risk overlaid on the Fed.
  • Wed Jun 17 · 13:50 UTC · EUR · Medium · ECB President Lagarde Speaks — already past; her AI/financial-stability line (Bloomberg) was not a market mover for gold.
  • Wed Jun 17 · 09:00 UTC · GBP · High · CPI y/y — printed 2.8% vs 3.0% forecast; mild GBP softening, not a XAU driver.

Earlier in the week: BOJ kept rate <1.00% (Tue) and RBA held at 4.35% (Tue) — both as expected, neither a gold input now.

Sources cited

Treasury.gov (10y TIPS real yield series), CFTC Commitments of Traders (legacy futures-only gold COT to 2026-06-09), ForexFactory (economic calendar), onewordnews (commodity-sentiment composite), Investing.com (gold news feed and the automated technical aggregate), Reuters via Google News (ECB Sleijpen, ECB wage tracker, ECB Lane), FXStreet (Simkus, Sleijpen, Deutsche Bank EUR note), Bloomberg Markets (Lagarde-AI, Simkus, Makhlouf, ECB-Iran-energy).

Desk summary & bias

Gold is being marked down into a hawkish-hold FOMC with real yields that won't fall and a DXY that won't quit. The dominant driver right now is rates path, not the dollar reflex — TIPS 2.14% with 80% hold / 20% hike priced is a ceiling on bullion until the dot plot says otherwise. Technically, intraday momentum is decisively bearish but the daily trend has not yet broken (daily MACD still +10.21), so this is a tactical-sell, structural-watch posture. The single most important thing to watch in the next six hours is whether the SEP shifts the 2026 median dot lower; if it does, real yields drop and the buy-side scenario activates from S2/S3.

# Bias Setup Trigger Entry zone Invalidation Target Conviction Why
1 SELL Bounce-fade into R1/R2 supply Rejection candle in supply with 1h RSI failing 50 4,347.12 – 4,371.22 4,395.25 (4h close) 4,274.96, then 4,250.86 60% Daily R1/R2, weekly R1 (4,369.13) and daily EMA20 (4,333.45) all stack here; trend is below all of it
2 BUY Oversold scalp at S2/S3 Reversal candle, 15m RSI lifting from 29 4,250.86 – 4,274.96 4,203.05 (close) 4,323.09, then 4,347.12 45% Daily MACD still bullish; 15m RSI capitulation; managed-money long defends prior swing
3 SELL Weekly position fade on FOMC-hawk surprise Daily close < 4,250.86 after SEP 4,250.86 – 4,274.96 (on retest) 4,323.09 (close) 4,197.80 (weekly P) 50% Loss of daily S3 opens path to weekly pivot; sticky real yields validate the move

Net desk bias: SELL. The real-yield + Fed-odds frame is gold-negative and DXY is in an uptrend on every timeframe shown; the multi-timeframe technical state (RSI/MACD bearish on 15m / 1h / 4h, price below all daily EMAs) corroborates the macro. Where macro and technicals would disagree is the still-positive daily MACD histogram — I'm weighting the macro because tonight's catalyst is rates, and that overrides residual daily trend momentum. The lean flips if and only if the SEP shows a dovish dot revision and TIPS 10y prints below 2.10%.

(not financial advice)

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

// ── Inputs / constants from the desk note ──
swingHigh = 4354.58   // last week's high (anchor for fib)
swingLow  = 4026.48   // last week's low  (anchor for fib)
dPivot    = 4323.09
dR1       = 4347.12
dR2       = 4371.22
dR3       = 4395.25
dS1       = 4298.99
dS2       = 4274.96
dS3       = 4250.86
wPivot    = 4197.80
wR1       = 4369.13
sess5Low  = 4203.05

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

// ── Fibonacci retracement of weekly swing ──
fibRange = swingHigh - swingLow
f000 = swingHigh
f236 = swingHigh - 0.236 * fibRange
f382 = swingHigh - 0.382 * fibRange
f500 = swingHigh - 0.500 * fibRange
f618 = swingHigh - 0.618 * fibRange
f786 = swingHigh - 0.786 * fibRange
f100 = swingLow

hline(f236, "Fib 0.236", color=color.new(color.gray, 30), 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.gray, 30), 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, 30), linestyle=hline.style_dotted)

// ── Golden pocket (0.5–0.618) ──
var box gpBox = na
if barstate.islast
    box.delete(gpBox)
    gpBox := box.new(bar_index - 200, f500, bar_index + 50, f618, bgcolor=color.new(color.yellow, 80), border_color=color.new(color.yellow, 40), text="GOLDEN POCKET 4151.81–4190.53", text_color=color.yellow, text_size=size.small)

// ── Supply zones (red) ──
var box supR1R2 = na
var box supR3   = na
if barstate.islast
    box.delete(supR1R2)
    box.delete(supR3)
    supR1R2 := box.new(bar_index - 200, dR2, bar_index + 50, dR1, bgcolor=color.new(color.red, 80), border_color=color.new(color.red, 50), text="SUPPLY 4347–4371 (D R1/R2 + W R1)", text_color=color.red, text_size=size.small)
    supR3   := box.new(bar_index - 200, dR3 + 5, bar_index + 50, dR3 - 5, bgcolor=color.new(color.red, 90), border_color=color.new(color.red, 60))

// ── Demand zones (green) ──
var box demS2S3 = na
var box demFloor = na
if barstate.islast
    box.delete(demS2S3)
    box.delete(demFloor)
    demS2S3  := box.new(bar_index - 200, dS2, bar_index + 50, dS3, bgcolor=color.new(color.green, 80), border_color=color.new(color.green, 50), text="DEMAND 4250–4275 (D S2/S3)", text_color=color.green, text_size=size.small)
    demFloor := box.new(bar_index - 200, sess5Low + 3, bar_index + 50, sess5Low - 3, bgcolor=color.new(color.green, 90), border_color=color.new(color.green, 60))

// ── Pivots ──
hline(dPivot, "Daily P",  color=color.new(color.blue, 20), linestyle=hline.style_solid)
hline(dS1,    "Daily S1", color=color.new(color.green, 40), linestyle=hline.style_dashed)
hline(dR3,    "Daily R3", color=color.new(color.red, 40),   linestyle=hline.style_dashed)
hline(wPivot, "Weekly P", color=color.new(color.purple, 20), linestyle=hline.style_solid)

// ── Trade idea 1: SELL bounce-fade ──
var line sellInv = na
var line sellTgt = na
var box  sellEntry = na
if barstate.islast
    line.delete(sellInv)
    line.delete(sellTgt)
    box.delete(sellEntry)
    sellEntry := box.new(bar_index, dR1, bar_index + 60, dR2, bgcolor=color.new(color.red, 70), border_color=color.red, text="SELL #1  4347–4371  conv 60%", text_color=color.white, text_size=size.small)
    sellInv := line.new(bar_index, dR3, bar_index + 60, dR3, color=color.red, style=line.style_dashed, width=2)
    sellTgt := line.new(bar_index, dS2, bar_index + 60, dS2, color=color.lime, style=line.style_dashed, width=2)
    label.new(bar_index + 60, dR3, "SELL invalid 4395.25", style=label.style_label_left, color=color.new(color.red, 20), textcolor=color.white, size=size.small)
    label.new(bar_index + 60, dS2, "SELL target 4274.96", style=label.style_label_left, color=color.new(color.green, 20), textcolor=color.white, size=size.small)

// ── Trade idea 2: BUY oversold scalp ──
var line buyInv = na
var line buyTgt = na
var box  buyEntry = na
if barstate.islast
    line.delete(buyInv)
    line.delete(buyTgt)
    box.delete(buyEntry)
    buyEntry := box.new(bar_index, dS3, bar_index + 60, dS2, bgcolor=color.new(color.green, 70), border_color=color.green, text="BUY #2  4250–4275  conv 45%", text_color=color.white, text_size=size.small)
    buyInv := line.new(bar_index, sess5Low, bar_index + 60, sess5Low, color=color.red, style=line.style_dashed, width=2)
    buyTgt := line.new(bar_index, dR1, bar_index + 60, dR1, color=color.lime, style=line.style_dashed, width=2)
    label.new(bar_index + 60, sess5Low, "BUY invalid 4203.05", style=label.style_label_left, color=color.new(color.red, 20), textcolor=color.white, size=size.small)
    label.new(bar_index + 60, dR1, "BUY target 4347.12", style=label.style_label_left, color=color.new(color.green, 20), textcolor=color.white, size=size.small)

// ── Trade idea 3: weekly position fade ──
var line wTgt = na
if barstate.islast
    line.delete(wTgt)
    wTgt := line.new(bar_index, wPivot, bar_index + 60, wPivot, color=color.new(color.purple, 0), style=line.style_solid, width=2)
    label.new(bar_index + 60, wPivot, "SWING SELL #3 target Wpivot 4197.80", style=label.style_label_left, color=color.new(color.purple, 20), textcolor=color.white, size=size.small)

// ── Net bias banner ──
var table bias = na
if barstate.islast
    table.delete(bias)
    bias := table.new(position.top_right, 1, 3, bgcolor=color.new(color.black, 20), border_width=1)
    table.cell(bias, 0, 0, "GOLD DESK 2026-06-17", text_color=color.white, bgcolor=color.new(color.red, 40), text_size=size.normal)
    table.cell(bias, 0, 1, "NET BIAS: SELL", text_color=color.white, bgcolor=color.new(color.red, 20), text_size=size.large)
    table.cell(bias, 0, 2, "Real 2.14% · DXY 100.0 · FOMC tonight", text_color=color.white, bgcolor=color.new(color.black, 40), text_size=size.small)

// ── Key level callouts ──
if barstate.islast
    label.new(bar_index, dPivot, "D Pivot 4323.09", style=label.style_label_left, color=color.new(color.blue, 30), textcolor=color.white, size=size.small)
    label.new(bar_index, wR1,    "W R1 4369.13",    style=label.style_label_left, color=color.new(color.purple, 30), textcolor=color.white, size=size.small)
    label.new(bar_index, f500,   "Fib 0.5 4190.53", style=label.style_label_left, color=color.new(color.yellow, 30), textcolor=color.black, size=size.small)
    label.new(bar_index, f618,   "Fib 0.618 4151.81", style=label.style_label_left, color=color.new(color.yellow, 30), textcolor=color.black, size=size.small)
{"bias": "SELL",
 "ideas": [
   {"bias": "SELL", "label": "Bounce-fade R1/R2", "entry_low": 4347.12, "entry_high": 4371.22,
    "invalidation": 4395.25, "target": 4274.96, "conviction": 60},
   {"bias": "BUY", "label": "Oversold scalp S2/S3", "entry_low": 4250.86, "entry_high": 4274.96,
    "invalidation": 4203.05, "target": 4347.12, "conviction": 45},
   {"bias": "SELL", "label": "Weekly position fade post-FOMC", "entry_low": 4250.86, "entry_high": 4274.96,
    "invalidation": 4323.09, "target": 4197.80, "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-17 — bias SELL", overlay=true, max_lines_count=300, max_labels_count=300, max_boxes_count=100)

// ── Inputs / constants from the desk note ──
swingHigh = 4354.58   // last week's high (anchor for fib)
swingLow  = 4026.48   // last week's low  (anchor for fib)
dPivot    = 4323.09
dR1       = 4347.12
dR2       = 4371.22
dR3       = 4395.25
dS1       = 4298.99
dS2       = 4274.96
dS3       = 4250.86
wPivot    = 4197.80
wR1       = 4369.13
sess5Low  = 4203.05

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

// ── Fibonacci retracement of weekly swing ──
fibRange = swingHigh - swingLow
f000 = swingHigh
f236 = swingHigh - 0.236 * fibRange
f382 = swingHigh - 0.382 * fibRange
f500 = swingHigh - 0.500 * fibRange
f618 = swingHigh - 0.618 * fibRange
f786 = swingHigh - 0.786 * fibRange
f100 = swingLow

hline(f236, "Fib 0.236", color=color.new(color.gray, 30), 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.gray, 30), 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, 30), linestyle=hline.style_dotted)

// ── Golden pocket (0.5–0.618) ──
var box gpBox = na
if barstate.islast
    box.delete(gpBox)
    gpBox := box.new(bar_index - 200, f500, bar_index + 50, f618, bgcolor=color.new(color.yellow, 80), border_color=color.new(color.yellow, 40), text="GOLDEN POCKET 4151.81–4190.53", text_color=color.yellow, text_size=size.small)

// ── Supply zones (red) ──
var box supR1R2 = na
var box supR3   = na
if barstate.islast
    box.delete(supR1R2)
    box.delete(supR3)
    supR1R2 := box.new(bar_index - 200, dR2, bar_index + 50, dR1, bgcolor=color.new(color.red, 80), border_color=color.new(color.red, 50), text="SUPPLY 4347–4371 (D R1/R2 + W R1)", text_color=color.red, text_size=size.small)
    supR3   := box.new(bar_index - 200, dR3 + 5, bar_index + 50, dR3 - 5, bgcolor=color.new(color.red, 90), border_color=color.new(color.red, 60))

// ── Demand zones (green) ──
var box demS2S3 = na
var box demFloor = na
if barstate.islast
    box.delete(demS2S3)
    box.delete(demFloor)
    demS2S3  := box.new(bar_index - 200, dS2, bar_index + 50, dS3, bgcolor=color.new(color.green, 80), border_color=color.new(color.green, 50), text="DEMAND 4250–4275 (D S2/S3)", text_color=color.green, text_size=size.small)
    demFloor := box.new(bar_index - 200, sess5Low + 3, bar_index + 50, sess5Low - 3, bgcolor=color.new(color.green, 90), border_color=color.new(color.green, 60))

// ── Pivots ──
hline(dPivot, "Daily P",  color=color.new(color.blue, 20), linestyle=hline.style_solid)
hline(dS1,    "Daily S1", color=color.new(color.green, 40), linestyle=hline.style_dashed)
hline(dR3,    "Daily R3", color=color.new(color.red, 40),   linestyle=hline.style_dashed)
hline(wPivot, "Weekly P", color=color.new(color.purple, 20), linestyle=hline.style_solid)

// ── Trade idea 1: SELL bounce-fade ──
var line sellInv = na
var line sellTgt = na
var box  sellEntry = na
if barstate.islast
    line.delete(sellInv)
    line.delete(sellTgt)
    box.delete(sellEntry)
    sellEntry := box.new(bar_index, dR1, bar_index + 60, dR2, bgcolor=color.new(color.red, 70), border_color=color.red, text="SELL #1  4347–4371  conv 60%", text_color=color.white, text_size=size.small)
    sellInv := line.new(bar_index, dR3, bar_index + 60, dR3, color=color.red, style=line.style_dashed, width=2)
    sellTgt := line.new(bar_index, dS2, bar_index + 60, dS2, color=color.lime, style=line.style_dashed, width=2)
    label.new(bar_index + 60, dR3, "SELL invalid 4395.25", style=label.style_label_left, color=color.new(color.red, 20), textcolor=color.white, size=size.small)
    label.new(bar_index + 60, dS2, "SELL target 4274.96", style=label.style_label_left, color=color.new(color.green, 20), textcolor=color.white, size=size.small)

// ── Trade idea 2: BUY oversold scalp ──
var line buyInv = na
var line buyTgt = na
var box  buyEntry = na
if barstate.islast
    line.delete(buyInv)
    line.delete(buyTgt)
    box.delete(buyEntry)
    buyEntry := box.new(bar_index, dS3, bar_index + 60, dS2, bgcolor=color.new(color.green, 70), border_color=color.green, text="BUY #2  4250–4275  conv 45%", text_color=color.white, text_size=size.small)
    buyInv := line.new(bar_index, sess5Low, bar_index + 60, sess5Low, color=color.red, style=line.style_dashed, width=2)
    buyTgt := line.new(bar_index, dR1, bar_index + 60, dR1, color=color.lime, style=line.style_dashed, width=2)
    label.new(bar_index + 60, sess5Low, "BUY invalid 4203.05", style=label.style_label_left, color=color.new(color.red, 20), textcolor=color.white, size=size.small)
    label.new(bar_index + 60, dR1, "BUY target 4347.12", style=label.style_label_left, color=color.new(color.green, 20), textcolor=color.white, size=size.small)

// ── Trade idea 3: weekly position fade ──
var line wTgt = na
if barstate.islast
    line.delete(wTgt)
    wTgt := line.new(bar_index, wPivot, bar_index + 60, wPivot, color=color.new(color.purple, 0), style=line.style_solid, width=2)
    label.new(bar_index + 60, wPivot, "SWING SELL #3 target Wpivot 4197.80", style=label.style_label_left, color=color.new(color.purple, 20), textcolor=color.white, size=size.small)

// ── Net bias banner ──
var table bias = na
if barstate.islast
    table.delete(bias)
    bias := table.new(position.top_right, 1, 3, bgcolor=color.new(color.black, 20), border_width=1)
    table.cell(bias, 0, 0, "GOLD DESK 2026-06-17", text_color=color.white, bgcolor=color.new(color.red, 40), text_size=size.normal)
    table.cell(bias, 0, 1, "NET BIAS: SELL", text_color=color.white, bgcolor=color.new(color.red, 20), text_size=size.large)
    table.cell(bias, 0, 2, "Real 2.14% · DXY 100.0 · FOMC tonight", text_color=color.white, bgcolor=color.new(color.black, 40), text_size=size.small)

// ── Key level callouts ──
if barstate.islast
    label.new(bar_index, dPivot, "D Pivot 4323.09", style=label.style_label_left, color=color.new(color.blue, 30), textcolor=color.white, size=size.small)
    label.new(bar_index, wR1,    "W R1 4369.13",    style=label.style_label_left, color=color.new(color.purple, 30), textcolor=color.white, size=size.small)
    label.new(bar_index, f500,   "Fib 0.5 4190.53", style=label.style_label_left, color=color.new(color.yellow, 30), textcolor=color.black, size=size.small)
    label.new(bar_index, f618,   "Fib 0.618 4151.81", style=label.style_label_left, color=color.new(color.yellow, 30), textcolor=color.black, 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

Knives out into the dot plot