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

Gold Desk — 15 Jul 2026: Cool CPI, Cooler Bid

The CPI print landed soft, gold rallied for an hour, and then Fed Chair Warsh walked it back — leaving XAU 100 handles below yesterday's high with every intraday timeframe rolling over. Real yields eased three basis points and the dollar is quiet, but Fed-funds futures still price a 17% hike and zero cuts into 29 July, capping the macro tailwind before it lands. Technicals disagree with the rates tape: price sits below all daily EMAs and investing.com's aggregate is a Strong Sell across all twelve MAs. Net bias is a cautious SELL — fade bounces into the 4,043–4,065 confluence, respect the oversold read into 3,935–3,988.


The CPI print landed soft, gold rallied for an hour, and then Fed Chair Warsh walked it back — leaving XAU 100 handles below yesterday's high with every intraday timeframe rolling over. Real yields eased three basis points and the dollar is quiet, but Fed-funds futures still price a 17% hike and zero cuts into 29 July, capping the macro tailwind before it lands. Technicals disagree with the rates tape: price sits below all daily EMAs and investing.com's aggregate is a Strong Sell across all twelve MAs. Net bias is a cautious SELL — fade bounces into the 4,043–4,065 confluence, respect the oversold read into 3,935–3,988.

The session

Spot PAXG is 4,018.60, down 1.32% on the day and 2.30% on the week. The 24-hour range is unusually wide (3,983.25 – 4,097.58, 114 handles from session low to high) — that's the CPI-driven pop and the Warsh-driven fade printed back-to-back. GVZ at 25.02 confirms the market is not sleep-walking; implied vol on gold is elevated relative to a VIX regime (16.31) that says equity risk is calm. What killed the rally, per Investing.com's own recap, was Warsh "tempering Fed rate cut optimism"; Bloomberg framed it as "soft CPI curbs hike bets," but the priced-in path never actually got there. COMEX front-month (GC=F) prints 4,030.20, a shallow 0.29% premium to spot — normal contango, no stress signal in the basis.

Multi-timeframe read

  • 15m — RSI 38.5, MACD histogram flipping negative, price 7.5 below the 20-EMA. Micro-bearish but not extended.
  • 1h — RSI 38.3, MACD -3.53 and widening, price 16.5 below the 20-EMA and 23.2 below the 50. Trend is broken.
  • 4h — RSI 33.4, MACD -0.70, price 27 below the 20-EMA. This is the timeframe of interest: 33 RSI is knocking on oversold and the 4h is where sellers usually get their first pause.
  • 1d — RSI 39.4, price 77.6 below the 20-EMA, 191 below the 50, and 392.6 below the 200-EMA (which sits up at 4,411). The daily 200-EMA is more than 9% overhead — the medium-term trend broke a while ago and today's tape is continuation, not reversal.

Alignment is unambiguously bearish. The only divergence worth flagging is that 4h RSI is close enough to 30 that a mean-reversion bounce is a real short-term possibility. That's the setup for the buy scalp, not for a trend reversal.

Macro frame

Lead with the real yield. US 10y TIPS eased to 2.33%, down 3 bp day-over-day — mechanically a gold tailwind. Breakevens ticked one basis point lower to 2.25%, and the 10y nominal printed 4.58% (-4 bp) even as the intraday ^TNX quote shows 4.59%, +4 bp — a small intraday reversal worth watching. On paper this is the kind of rates tape that should have kept the CPI rally intact.

It didn't, because the Fed-funds curve is not playing along. The July 29 FOMC prices 83% hold and 17% hike, with zero probability of a cut; the 3.75–4.00 target range carries 16.6% weight. That is a hawkish path. Warsh's testimony yesterday appears to have anchored it, and he speaks again at 17:00 UTC today. The Bloomberg headline "Bond Traders' Big Short Bet in Fed Funds Slammed by CPI Decline" tells you where positioning was leaning; the fact that gold couldn't hold the bid tells you where marginal flow is going now.

DXY at 100.90 is drifting (-0.19%), well-behaved on all timeframes and clinging to the 20-day EMA. With a -0.69 30-day DXY↔XAU daily-return correlation, dollar quiet ≠ gold rally — it just removes one push. Cross-asset colour: VIX at 16.31 says risk is calm, so there is no fear bid for gold. GVZ at 25.02 says gold's own vol is priced richer than that regime would suggest — the market expects a move. Gold/silver ratio at 68.7 with silver at $58.51 says the precious complex is running silver-led — a mild strike against a defensive-gold thesis. WTI at $80.27 (Iran-tension driven) reintroduces an inflation risk that would push real yields up, not down, if it holds — FXEmpire's "Softer CPI Fuels Rebound as Oil Raises Inflation Risks" is exactly the right framing.

COT (as of 07-07): managed money still holds a heavy +194,246 net long. That is not a washed-out position — it is a positioning overhang that argues rallies get sold before they get bought.

Two scenarios

Conviction below is a qualitative confidence read, not a back-tested probability.

Sell setup

  • Trigger: rejection at 4,043 (daily pivot) or an extension into the 4,049–4,065 golden pocket, with 1h RSI failing at 50 and the 15m 20-EMA capping.
  • Invalidation: 15m close above 4,110 (weekly pivot / prior swing shelf).
  • Target: 3,988 (daily S1) first, 3,935 (weekly S2 / daily S2 cluster) second.
  • Conviction: 60%.
  • Rationale: Every daily EMA is above price, MACD histogram is negative on all intraday TFs, and investing.com's aggregate agrees (Strong Sell, 12/12 MAs). Warsh's second testimony is a live catalyst for another hawkish repricing. Managed-money long overhang means bounces meet supply. The fade is the trend trade.

Buy setup

  • Trigger: wick and reclaim of 3,988 (daily S1), or a clean tag of 3,935 with 4h RSI printing sub-30.
  • Invalidation: 4h close below 3,928 (daily S2).
  • Target: 4,043 (daily pivot) as the first take, 4,097 (session high) as the runner.
  • Conviction: 40%.
  • Rationale: Countertrend, but 4h RSI at 33 is close enough to oversold and the weekly S1/S2 cluster (4,024 / 3,935) is a magnet. This is a scalp, not a swing — cover into the pivot and let the trend re-assert.

Levels worth marking

  • 4,110 — weekly pivot; the line above which the bearish thesis has to be reconsidered.
  • 4,065 — 0.618 fib of the 3,983.25 → 4,116.02 range; upper edge of the golden pocket.
  • 4,050 / 4,043 — 0.5 fib sitting a hair above the daily pivot at 4,042.97. Highest-quality supply zone.
  • 4,024 — weekly S1; also where price coiled overnight.
  • 3,988 — daily S1; immediate downside pivot and current session floor.
  • 3,935 / 3,928 — weekly S2 / daily S2 cluster; primary demand zone.
  • 3,874 — daily S3; the "trend actually broken" line beneath support.

Calendar / catalysts

Live today (from ForexFactory, all times UTC):

  • USD PPI m/m (forecast 0.0%, prev 1.1%) and Core PPI m/m (0.3% f, 0.4% p) — high impact, morning US session. A hot PPI after a cool CPI is the tail-risk that validates Warsh's hawkishness.
  • CAD BOC Rate Statement / Overnight Rate 16:45 UTC (forecast 2.25% hold). Not a gold driver directly, but moves CAD/USD → DXY.
  • USD Fed Chairman Warsh Testifies 17:00 UTC — this is the one. Yesterday's session did the damage; a repeat tone reinforces the sell setup.
  • CAD BOC Press Conference 17:45 UTC.

Sources cited

Onewordnews commodity sentiment (aggregate ~0.00, mixed); investing.com news wire (bear-flag setup call at $3,990, Warsh tempering rate-cut optimism); Bloomberg via Google News (CPI curbs hike bets; bond short slammed); KITCO PM report (CPI-fuelled rally); FXEmpire (oil-inflation risk on softer CPI); Seeking Alpha (CPI relief "temporary"); US Treasury real-yield curve (TIPS 2.33%); CFTC COT report 2026-07-07; ForexFactory calendar; investing.com automated technical aggregate (Strong Sell, 12/12 MAs).

Desk summary & bias

Gold is oversold on the 4h and structurally broken on the 1d, sitting a hair above the daily S1 with every intraday EMA capping. The rates tape is quietly supportive — TIPS real yields ticked lower and the dollar is drifting — but Fed-funds futures still price zero cuts and a 17% hike into 29 July, and Warsh's second testimony today is the live risk. The technical picture agrees with investing.com's Strong Sell aggregate; the one honest divergence is that a 4h RSI in the low-30s makes a scalp bounce into 4,043 plausible before the trend reasserts. Single thing to watch: Warsh's 17:00 UTC tone in the context of a fresh PPI print — a hot PPI or hawkish Warsh unlocks the S2 target; a genuinely dovish walk-back is the only path back above the weekly pivot at 4,110.

# Bias Setup Trigger Entry zone Invalidation Target Conviction Why
1 SELL Bounce-fade into pivot / golden pocket Rejection at 4,043 or into 4,049–4,065 4,042.97 – 4,065.30 4,110.50 (weekly P) 3,988.35 → 3,934.63 60% All daily EMAs above; MACD negative all TFs; Warsh redux today; MM long overhang
2 BUY Oversold scalp at demand cluster Wick + reclaim of 3,988 or 4h RSI sub-30 at 3,935 3,934.63 – 3,988.35 3,928.64 (4h close) 4,042.97 → 4,097.58 40% 4h RSI 33 already; weekly S1/S2 cluster is a magnet; mean-reversion only
3 SELL Breakdown continuation 1h close below 3,988 on PPI/Warsh catalyst 3,970 – 3,988.35 4,042.97 (daily P) 3,874.02 (daily S3) 50% Trend + macro alignment; needs a catalyst push

Net desk bias: SELL. Real yields ticked lower but the Fed-funds path (0% cut / 17% hike into 29 July) plus Warsh's live-mic hawkishness overwhelm that tailwind, and every technical layer — intraday, daily, third-party aggregate — is bearish. I am weighting the technicals and the futures-implied path over the small day-over-day TIPS move because Warsh testifies again in a few hours and can move the real-yield print by himself. Fade rallies until the weekly pivot at 4,110 is reclaimed.

(not financial advice)

//@version=5
indicator("Gold Desk 2026-07-15 — 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 (5-session range referenced in the note) ──
swingHi = 4116.02
swingLo = 3983.25
rangeSz = swingHi - swingLo

// ── Fibonacci retracement of 3,983.25 → 4,116.02 ──
fib236 = swingLo + rangeSz * 0.236
fib382 = swingLo + rangeSz * 0.382
fib500 = swingLo + rangeSz * 0.500
fib618 = swingLo + rangeSz * 0.618
fib786 = swingLo + rangeSz * 0.786
hline(fib236, "Fib 0.236", color=color.new(color.gray, 40), linestyle=hline.style_dotted)
hline(fib382, "Fib 0.382", color=color.new(color.gray, 40), linestyle=hline.style_dotted)
hline(fib500, "Fib 0.500", color=color.new(color.gray, 20), linestyle=hline.style_dotted)
hline(fib618, "Fib 0.618", color=color.new(color.gray, 20), linestyle=hline.style_dotted)
hline(fib786, "Fib 0.786", color=color.new(color.gray, 40), linestyle=hline.style_dotted)

// ── Golden pocket (0.5 – 0.618) — highest-probability supply reaction ──
var box gp = na
if barstate.islast
    box.delete(gp)
    gp := box.new(bar_index - 200, fib618, bar_index + 20, fib500, bgcolor=color.new(color.yellow, 80), border_color=color.new(color.yellow, 40))
    label.new(bar_index + 20, fib618, "Golden pocket  4,049.64 – 4,065.30", style=label.style_label_left, color=color.new(color.yellow, 60), textcolor=color.white, size=size.small)

// ── Pivots ──
hline(4110.50, "Weekly P", color=color.new(color.fuchsia, 20), linewidth=2)
hline(4102.68, "Daily R1", color=color.new(color.red, 40))
hline(4042.97, "Daily P",  color=color.new(color.white, 20), linewidth=2)
hline(4023.99, "Weekly S1", color=color.new(color.aqua, 40))
hline(3988.35, "Daily S1", color=color.new(color.green, 30))
hline(3934.63, "Weekly S2", color=color.new(color.green, 20), linewidth=2)
hline(3928.64, "Daily S2", color=color.new(color.green, 30))
hline(3874.02, "Daily S3", color=color.new(color.green, 40), linestyle=hline.style_dashed)

// ── Supply zone (fade zone) 4,043 – 4,065 ──
var box supply = na
if barstate.islast
    box.delete(supply)
    supply := box.new(bar_index - 200, 4065.30, bar_index + 20, 4042.97, bgcolor=color.new(color.red, 82), border_color=color.new(color.red, 40))
    label.new(bar_index + 20, 4065.30, "SUPPLY  4,043 – 4,065", style=label.style_label_left, color=color.new(color.red, 50), textcolor=color.white, size=size.small)

// ── Demand zone 3,935 – 3,988 ──
var box demand = na
if barstate.islast
    box.delete(demand)
    demand := box.new(bar_index - 200, 3988.35, bar_index + 20, 3934.63, bgcolor=color.new(color.green, 82), border_color=color.new(color.green, 40))
    label.new(bar_index + 20, 3988.35, "DEMAND  3,935 – 3,988", style=label.style_label_left, color=color.new(color.green, 50), textcolor=color.white, size=size.small)

// ── Trade 1: SELL bounce-fade (60%) ──
var box sellEntry = na
var line sellInval = na
var line sellTgt = na
if barstate.islast
    box.delete(sellEntry)
    line.delete(sellInval)
    line.delete(sellTgt)
    sellEntry := box.new(bar_index - 50, 4065.30, bar_index + 50, 4042.97, bgcolor=color.new(color.red, 70), border_color=color.new(color.red, 20))
    sellInval := line.new(bar_index - 50, 4110.50, bar_index + 50, 4110.50, color=color.new(color.red, 0), style=line.style_dashed, width=2)
    sellTgt := line.new(bar_index - 50, 3934.63, bar_index + 50, 3934.63, color=color.new(color.red, 0), style=line.style_solid, width=2)
    label.new(bar_index + 50, 4054.13, "SELL fade  60%", style=label.style_label_left, color=color.red, textcolor=color.white, size=size.small)
    label.new(bar_index + 50, 4110.50, "Invalidation 4,110.50", style=label.style_label_left, color=color.new(color.red, 40), textcolor=color.white, size=size.tiny)
    label.new(bar_index + 50, 3934.63, "Target 3,934.63", style=label.style_label_left, color=color.new(color.red, 40), textcolor=color.white, size=size.tiny)

// ── Trade 2: BUY oversold scalp (40%) ──
var box buyEntry = na
var line buyInval = na
var line buyTgt = na
if barstate.islast
    box.delete(buyEntry)
    line.delete(buyInval)
    line.delete(buyTgt)
    buyEntry := box.new(bar_index - 50, 3988.35, bar_index + 50, 3934.63, bgcolor=color.new(color.green, 70), border_color=color.new(color.green, 20))
    buyInval := line.new(bar_index - 50, 3928.64, bar_index + 50, 3928.64, color=color.new(color.green, 0), style=line.style_dashed, width=2)
    buyTgt := line.new(bar_index - 50, 4042.97, bar_index + 50, 4042.97, color=color.new(color.green, 0), style=line.style_solid, width=2)
    label.new(bar_index + 50, 3961.49, "BUY scalp  40%", style=label.style_label_left, color=color.green, textcolor=color.white, size=size.small)
    label.new(bar_index + 50, 3928.64, "Invalidation 3,928.64", style=label.style_label_left, color=color.new(color.green, 40), textcolor=color.white, size=size.tiny)
    label.new(bar_index + 50, 4042.97, "Target 4,042.97", style=label.style_label_left, color=color.new(color.green, 40), textcolor=color.white, size=size.tiny)

// ── Trade 3: SELL breakdown continuation (50%) ──
var line brkTrig = na
var line brkTgt = na
if barstate.islast
    line.delete(brkTrig)
    line.delete(brkTgt)
    brkTrig := line.new(bar_index - 50, 3988.35, bar_index + 50, 3988.35, color=color.new(color.orange, 0), style=line.style_dotted, width=1)
    brkTgt := line.new(bar_index - 50, 3874.02, bar_index + 50, 3874.02, color=color.new(color.red, 0), style=line.style_solid, width=2)
    label.new(bar_index + 50, 3874.02, "Breakdown tgt 3,874.02  (50%)", style=label.style_label_left, color=color.new(color.red, 30), textcolor=color.white, size=size.tiny)

// ── Net-bias banner ──
var table banner = table.new(position.top_right, 2, 4, bgcolor=color.new(color.black, 20), border_width=1)
if barstate.islast
    table.cell(banner, 0, 0, "GOLD DESK", text_color=color.white, bgcolor=color.new(color.gray, 40))
    table.cell(banner, 1, 0, "2026-07-15", text_color=color.white, bgcolor=color.new(color.gray, 40))
    table.cell(banner, 0, 1, "Net bias", text_color=color.white)
    table.cell(banner, 1, 1, "SELL", text_color=color.white, bgcolor=color.new(color.red, 30))
    table.cell(banner, 0, 2, "Real yield", text_color=color.white)
    table.cell(banner, 1, 2, "2.33%  (-3bp)", text_color=color.white)
    table.cell(banner, 0, 3, "Fed 7/29", text_color=color.white)
    table.cell(banner, 1, 3, "83% hold / 17% hike", text_color=color.white)
{"bias": "SELL",
 "ideas": [
   {"bias": "SELL", "label": "Bounce-fade at pivot / golden pocket", "entry_low": 4042.97, "entry_high": 4065.30, "invalidation": 4110.50, "target": 3934.63, "conviction": 60},
   {"bias": "BUY",  "label": "Oversold scalp at demand cluster",     "entry_low": 3934.63, "entry_high": 3988.35, "invalidation": 3928.64, "target": 4042.97, "conviction": 40},
   {"bias": "SELL", "label": "Breakdown continuation",               "entry_low": 3970.00, "entry_high": 3988.35, "invalidation": 4042.97, "target": 3874.02, "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-07-15 — 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 (5-session range referenced in the note) ──
swingHi = 4116.02
swingLo = 3983.25
rangeSz = swingHi - swingLo

// ── Fibonacci retracement of 3,983.25 → 4,116.02 ──
fib236 = swingLo + rangeSz * 0.236
fib382 = swingLo + rangeSz * 0.382
fib500 = swingLo + rangeSz * 0.500
fib618 = swingLo + rangeSz * 0.618
fib786 = swingLo + rangeSz * 0.786
hline(fib236, "Fib 0.236", color=color.new(color.gray, 40), linestyle=hline.style_dotted)
hline(fib382, "Fib 0.382", color=color.new(color.gray, 40), linestyle=hline.style_dotted)
hline(fib500, "Fib 0.500", color=color.new(color.gray, 20), linestyle=hline.style_dotted)
hline(fib618, "Fib 0.618", color=color.new(color.gray, 20), linestyle=hline.style_dotted)
hline(fib786, "Fib 0.786", color=color.new(color.gray, 40), linestyle=hline.style_dotted)

// ── Golden pocket (0.5 – 0.618) — highest-probability supply reaction ──
var box gp = na
if barstate.islast
    box.delete(gp)
    gp := box.new(bar_index - 200, fib618, bar_index + 20, fib500, bgcolor=color.new(color.yellow, 80), border_color=color.new(color.yellow, 40))
    label.new(bar_index + 20, fib618, "Golden pocket  4,049.64 – 4,065.30", style=label.style_label_left, color=color.new(color.yellow, 60), textcolor=color.white, size=size.small)

// ── Pivots ──
hline(4110.50, "Weekly P", color=color.new(color.fuchsia, 20), linewidth=2)
hline(4102.68, "Daily R1", color=color.new(color.red, 40))
hline(4042.97, "Daily P",  color=color.new(color.white, 20), linewidth=2)
hline(4023.99, "Weekly S1", color=color.new(color.aqua, 40))
hline(3988.35, "Daily S1", color=color.new(color.green, 30))
hline(3934.63, "Weekly S2", color=color.new(color.green, 20), linewidth=2)
hline(3928.64, "Daily S2", color=color.new(color.green, 30))
hline(3874.02, "Daily S3", color=color.new(color.green, 40), linestyle=hline.style_dashed)

// ── Supply zone (fade zone) 4,043 – 4,065 ──
var box supply = na
if barstate.islast
    box.delete(supply)
    supply := box.new(bar_index - 200, 4065.30, bar_index + 20, 4042.97, bgcolor=color.new(color.red, 82), border_color=color.new(color.red, 40))
    label.new(bar_index + 20, 4065.30, "SUPPLY  4,043 – 4,065", style=label.style_label_left, color=color.new(color.red, 50), textcolor=color.white, size=size.small)

// ── Demand zone 3,935 – 3,988 ──
var box demand = na
if barstate.islast
    box.delete(demand)
    demand := box.new(bar_index - 200, 3988.35, bar_index + 20, 3934.63, bgcolor=color.new(color.green, 82), border_color=color.new(color.green, 40))
    label.new(bar_index + 20, 3988.35, "DEMAND  3,935 – 3,988", style=label.style_label_left, color=color.new(color.green, 50), textcolor=color.white, size=size.small)

// ── Trade 1: SELL bounce-fade (60%) ──
var box sellEntry = na
var line sellInval = na
var line sellTgt = na
if barstate.islast
    box.delete(sellEntry)
    line.delete(sellInval)
    line.delete(sellTgt)
    sellEntry := box.new(bar_index - 50, 4065.30, bar_index + 50, 4042.97, bgcolor=color.new(color.red, 70), border_color=color.new(color.red, 20))
    sellInval := line.new(bar_index - 50, 4110.50, bar_index + 50, 4110.50, color=color.new(color.red, 0), style=line.style_dashed, width=2)
    sellTgt := line.new(bar_index - 50, 3934.63, bar_index + 50, 3934.63, color=color.new(color.red, 0), style=line.style_solid, width=2)
    label.new(bar_index + 50, 4054.13, "SELL fade  60%", style=label.style_label_left, color=color.red, textcolor=color.white, size=size.small)
    label.new(bar_index + 50, 4110.50, "Invalidation 4,110.50", style=label.style_label_left, color=color.new(color.red, 40), textcolor=color.white, size=size.tiny)
    label.new(bar_index + 50, 3934.63, "Target 3,934.63", style=label.style_label_left, color=color.new(color.red, 40), textcolor=color.white, size=size.tiny)

// ── Trade 2: BUY oversold scalp (40%) ──
var box buyEntry = na
var line buyInval = na
var line buyTgt = na
if barstate.islast
    box.delete(buyEntry)
    line.delete(buyInval)
    line.delete(buyTgt)
    buyEntry := box.new(bar_index - 50, 3988.35, bar_index + 50, 3934.63, bgcolor=color.new(color.green, 70), border_color=color.new(color.green, 20))
    buyInval := line.new(bar_index - 50, 3928.64, bar_index + 50, 3928.64, color=color.new(color.green, 0), style=line.style_dashed, width=2)
    buyTgt := line.new(bar_index - 50, 4042.97, bar_index + 50, 4042.97, color=color.new(color.green, 0), style=line.style_solid, width=2)
    label.new(bar_index + 50, 3961.49, "BUY scalp  40%", style=label.style_label_left, color=color.green, textcolor=color.white, size=size.small)
    label.new(bar_index + 50, 3928.64, "Invalidation 3,928.64", style=label.style_label_left, color=color.new(color.green, 40), textcolor=color.white, size=size.tiny)
    label.new(bar_index + 50, 4042.97, "Target 4,042.97", style=label.style_label_left, color=color.new(color.green, 40), textcolor=color.white, size=size.tiny)

// ── Trade 3: SELL breakdown continuation (50%) ──
var line brkTrig = na
var line brkTgt = na
if barstate.islast
    line.delete(brkTrig)
    line.delete(brkTgt)
    brkTrig := line.new(bar_index - 50, 3988.35, bar_index + 50, 3988.35, color=color.new(color.orange, 0), style=line.style_dotted, width=1)
    brkTgt := line.new(bar_index - 50, 3874.02, bar_index + 50, 3874.02, color=color.new(color.red, 0), style=line.style_solid, width=2)
    label.new(bar_index + 50, 3874.02, "Breakdown tgt 3,874.02  (50%)", style=label.style_label_left, color=color.new(color.red, 30), textcolor=color.white, size=size.tiny)

// ── Net-bias banner ──
var table banner = table.new(position.top_right, 2, 4, bgcolor=color.new(color.black, 20), border_width=1)
if barstate.islast
    table.cell(banner, 0, 0, "GOLD DESK", text_color=color.white, bgcolor=color.new(color.gray, 40))
    table.cell(banner, 1, 0, "2026-07-15", text_color=color.white, bgcolor=color.new(color.gray, 40))
    table.cell(banner, 0, 1, "Net bias", text_color=color.white)
    table.cell(banner, 1, 1, "SELL", text_color=color.white, bgcolor=color.new(color.red, 30))
    table.cell(banner, 0, 2, "Real yield", text_color=color.white)
    table.cell(banner, 1, 2, "2.33%  (-3bp)", text_color=color.white)
    table.cell(banner, 0, 3, "Fed 7/29", text_color=color.white)
    table.cell(banner, 1, 3, "83% hold / 17% hike", text_color=color.white)
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

Cool print, hawkish narrator, heavy tape