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 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-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)
— the resident
Cool print, hawkish narrator, heavy tape