Let's talk
gold July 21, 2026 · 18 min read

Gold Desk — 21 Jul 2026: The Haven Bid Overrides the Rate Story

Gold Desk — 21 Jul 2026: The Haven Bid Overrides the Rate Story


Deck. Gold ripped 1.4% into 4,076 overnight even as US 10-year real yields ticked another +4 bp to 2.35% — a textbook signal that safe-haven flow, not rates arithmetic, is currently driving the tape. Intraday timeframes are stretched (1h RSI 72.4, 4h RSI 72.8) directly beneath a triple confluence at 4,089–4,094 (daily R3 + weekly R1 + Fib 0.786). The daily frame is still mid-range and mixed. We fade strength into that shelf and buy dips into the weekly pivot cluster.

The session

Spot XAU is trading 4,065.99 as of 08:00 UTC, +1.40% on the day, with a session range of 3,982.03 – 4,076.33. That is a 94-dollar swing from Asia low to European morning high, and the entire move was fuelled by a haven bid rather than a rates repricing. Investing.com's live-levels headline ("Gold tests $4,086 resistance in technical standoff") frames the same shelf we see on the pivot map: the market is pressing against yesterday's rejection zone. Their sibling piece — "Gold rises above $4,000 as Middle East diplomacy tempers Fed inflation fears" — plus "Trading Day: War clouds darken" and "Gold marginally lower amid firmer dollar as U.S.-Iran tensions escalate further" tell you what the flow is: Hormuz risk premium plus European equity chop (FTSE 100 slipping on Hormuz attack headlines) plus Russia's central-bank gold reserves falling 43.5 tons in H1 2026 — one of the few structural bears in the news pile.

COMEX front-month is trading 4,076.40, a 0.26% premium to PAXG spot — a modestly firmer futures basis that tells you leveraged money is willing to pay up.

Multi-timeframe read

  • 15m: RSI 68.8, MACD histogram already rolling (-0.46, ↓). Price 10.9 above EMA20 and 28.1 above EMA50. Uptrend intact but short-term momentum decelerating into the highs.
  • 1h: RSI 72.4 — outright overbought — MACD hist positive (6.09) but ↓. Price 32.7 above EMA20, 45.6 above EMA50. Classic "extended and slowing" configuration.
  • 4h: RSI 72.8, MACD hist 6.65 and still ↑. This is the timeframe most in agreement with the move. Price 42.8 above EMA20.
  • 1d: RSI 48.0 (neutral), MACD hist 3.68 ↑, price 4.6 above EMA20 but 102.7 below EMA50 and 322.8 below EMA200. The daily is a downtrend testing its first mean-reversion ceiling.

Where they agree: intraday direction is up. Where they diverge: the 4h is still adding to its move while the 1h and 15m are decelerating — a common pre-rejection fingerprint when price is grinding into resistance. The daily says this rally is, so far, still a bear-market bounce.

Investing.com's automated aggregate reads Sell on the daily even though their MA sub-score is Strong Buy (12/0). That's not a bug — it's the same story: MAs (trailing) are turning up, but oscillators are stretched. We agree with the aggregate over the sub-score.

Macro frame

Lead with the real yield: US 10y TIPS at 2.35%, +4 bp d/d. That is a headwind. All else equal, +4 bp of real yield should have been worth roughly $10–20 lower in gold today. Instead we ripped 55 handles. Breakeven inflation crept only +1 bp to 2.25%, so the nominal 10y at 4.60% (+5 bp) is almost entirely a real-rate move — the hawkish kind of tightening. Gold is ignoring it.

Fed odds explain part of the pressure on real yields: for the Jul 29 FOMC, fed funds futures now price 0% cut / 84% hold / 16% hike. There is essentially no cut priced into the very-next meeting; the tail has migrated to the hike side. A higher-for-longer (or higher-still) policy path is the mechanical driver of the TIPS move.

Against that, the tailwinds. DXY is 100.91 (-0.27% intraday) and the 30-day DXY↔XAU daily-return correlation sits at -0.59 — a firm inverse relationship that today is doing its job cleanly (dollar down, gold up). VIX at 17.59 (-5.7%) says equity risk is not panicking, so the gold bid is not a broad flight-to-safety, it is specifically geopolitical. GVZ at 25.37 is elevated but not extreme — the options market is pricing meaningful gold vol but hasn't blown out into a full risk-event regime. Gold/silver at 68.6 with silver at $59.26 is a mid-cycle PM regime — silver is not confirming an "all-precious rally", which typically caps the gold move. WTI slipping to $82.20 despite Hormuz is odd and worth watching. Bitcoin +1.4% to $66,168 is riding along, not diverging.

Positioning check (CFTC, week ended Jul 14): managed-money net long is +186,682 (L 227,310 / S 40,628). That is a heavy long, not a maximum long — there is room to add, but there is also plenty of fuel for a stop-run flush if the geopolitical bid fades. Commercials are net short -214,788, which is the mirror image and not new information — that is their job.

Synthesis: the rates map says sell gold, the geopolitical map says buy gold, and the technical map says stretched into resistance. When macro and technicals point the same way, size up. Today they don't, so trade the levels tightly.

Two scenarios

(Conviction below is a qualitative desk read, not a back-tested probability.)

Sell setup

  • Trigger: rejection tag into 4,089–4,094 — this is the confluence of daily R3 (4,089.13), weekly R1 (4,094.57), and Fib 0.786 of last week's 3,960.53→4,116.02 range (4,082.75). Wait for a 15m/1h bearish close back below 4,076.
  • Invalidation: 1h close above 4,116 (last week's high — clean break of the weekly range).
  • Target: 4,027.55 (weekly pivot) initial, 4,008.54 (daily pivot) stretch.
  • Conviction: 60%
  • Rationale: 1h RSI 72.4 and 4h RSI 72.8 are both overbought directly beneath the tightest resistance confluence on the board, real yields are up 4 bp, and the daily frame remains a downtrend (price 100+ below EMA50 daily). Investing.com's daily aggregate is also Sell. This is the higher-quality setup today.

Buy setup

  • Trigger: pullback into 4,020–4,028 — the weekly pivot 4,027.55 stacked with Fib 0.382 (4,019.93). Look for reclaim of 4,028 on 15m after touching the zone.
  • Invalidation: 1h close below 3,980.99 (daily S1) — that breaks the session low and negates the intraday bull structure.
  • Target: 4,062.61 (daily R2) first, 4,089 stretch if momentum reasserts.
  • Conviction: 40%
  • Rationale: the haven bid is still the dominant flow while Hormuz headlines run and DXY is soft. A shallow retrace that holds weekly P keeps the intraday uptrend alive. Lower conviction because we're fading gravity — an overbought market pulling back into a good zone often keeps going.

Levels worth marking

  • Overhead: 4,076.33 (session high) → 4,082.75 (Fib 0.786) → 4,089.13 (daily R3) → 4,094.57 (weekly R1) → 4,116.02 (last week high) → 4,168.73 (daily EMA50, big regime line) → 4,183.04 (weekly R2).
  • Below: 4,062.61 (daily R2, current pivot flip) → 4,056.62 (Fib 0.618, top of golden pocket) → 4,038.28 (Fib 0.5, bottom of golden pocket) → 4,035.06 (daily R1) → 4,027.55 (weekly P) → 4,019.93 (Fib 0.382) → 4,008.54 (daily P) → 3,980.99 (daily S1) → 3,960.53 (last week low) → 3,939.08 (weekly S1).
  • Big-picture regime lines from the daily EMAs: 4,168.73 (EMA50) and 4,388.81 (EMA200). The daily downtrend does not begin to reverse until we're back above the EMA50.

Calendar / catalysts

From the pre-fetched ForexFactory block:

  • Mon Jul 20 · CAD · High: CPI m/m -0.4% (fcst -0.2%, prev 1.0%); Median CPI y/y 1.9% (fcst 2.1%); Trimmed CPI y/y 1.8% (fcst 2.0%). Cooler-than-forecast Canadian inflation across the board — mildly USD-supportive on the cross, minor gold input.
  • Tue Jul 21 · 01:45 UTC · NZD · High: CPI q/q 1.5% (fcst 1.4%). Slightly hot.
  • Tue Jul 21 · 09:00 UTC · GBP · High: Claimant Count Change 6.7K vs 29.4K forecast — a large miss to the downside (fewer claimants = firmer UK labour). GBP-supportive, DXY-marginal.
  • Tue Jul 21 · GBP · Medium: Average Earnings Index 3m/y 4.3% (fcst 4.5%).

No top-tier US data in today's pre-fetched block. The FOMC on Jul 29 is the sitting catalyst — 8 sessions out. Iran/Hormuz headline flow is the day-to-day tape driver.

Sources cited

Onewordnews (kitco, dailyfx excerpts); investing.com (headlines on $4,086 resistance, $4,000 haven bid, US-Iran tensions, Russia reserves) + investing.com daily technical aggregate; US Treasury.gov (10y real yield 2.35%); CFTC COT (07/14 report); ForexFactory (calendar); COMEX (GC=F front-month).

Desk summary & bias

Gold is up 1.4% on Hormuz risk premium and a soft dollar, running directly into a tight 4,089–4,094 resistance shelf (daily R3 + weekly R1 + Fib 0.786) while intraday oscillators are outright overbought and US 10y real yields grind another 4 bp higher against the move. The dominant driver on the 08:00 UTC print is flow, not rates, and that kind of driver can reverse in a single headline. The technical state is stretched-into-resistance on a daily chart that is still a downtrend. The single most important thing to watch next is whether 4,076–4,094 rejects cleanly or whether we get a 1h close through 4,094 — that decides the week.

# Bias Setup Trigger Entry zone Invalidation Target Conviction Why
1 SELL Bounce-fade at confluence 15m/1h bearish close back below 4,076 after tag of 4,082.75–4,094.57 4,082–4,094 4,116 (1h close above) 4,027.55 → 4,008.54 60% Triple confluence (daily R3, weekly R1, Fib 0.786) directly beneath 1h RSI 72 / 4h RSI 73; real yields +4 bp; daily aggregate Sell
2 BUY Weekly-pivot reclaim Reclaim of 4,028 on 15m after touch of zone 4,020–4,028 3,980.99 (1h close below) 4,062.61 → 4,089 40% Haven bid + weak DXY + weekly-pivot/Fib 0.382 confluence, but fading gravity on an overbought tape
3 SELL Position swing on rate-story reassertion Only if 1h closes below 4,027.55 AND DXY reclaims 101.20 4,027–4,035 (on retest) 4,076 3,939.08 (weekly S1) 45% Real-yield+Fed-odds story would then be back in charge; managed-money net +186k is fuel for a flush

Net desk bias: SELL (with intraday-buy tactical window). The rates decomposition — real yields +4 bp, breakevens flat, Fed pricing 0% cut / 16% hike into Jul 29 — is a persistent headwind, and price is arriving into the tightest resistance confluence on the map with the two most-relevant intraday RSIs both above 72. The daily downtrend is intact. We are weighting the technicals + rates over the geopolitical flow because geopolitical premium is the most reversible input on the list; a single de-escalation headline unwinds it, whereas real yields need macro data to move. The only thing that would flip us to BUY-bias is a 1h close above 4,116, which would break last week's high and force us to respect the momentum.

(not financial advice)

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

// ── Inputs ──
showFibs   = input.bool(true,  "Show Fibonacci")
showZones  = input.bool(true,  "Show S/R zones")
showTrades = input.bool(true,  "Show trade ideas")
showPivots = input.bool(true,  "Show pivots")

// ── 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 anchor: last week's range 3,960.53 → 4,116.02 ──
swingHi = 4116.02
swingLo = 3960.53
rng     = swingHi - swingLo

// ── Fibonacci ──
fib236 = swingLo + 0.236 * rng   // 3,997.23
fib382 = swingLo + 0.382 * rng   // 4,019.93
fib500 = swingLo + 0.500 * rng   // 4,038.28
fib618 = swingLo + 0.618 * rng   // 4,056.62
fib786 = swingLo + 0.786 * rng   // 4,082.75

hline(showFibs ? fib236 : na, "Fib 0.236", color=color.new(color.gray,   40), linestyle=hline.style_dotted)
hline(showFibs ? fib382 : na, "Fib 0.382", color=color.new(color.gray,   20), linestyle=hline.style_dotted)
hline(showFibs ? fib500 : na, "Fib 0.500", color=color.new(color.yellow, 20), linestyle=hline.style_dashed)
hline(showFibs ? fib618 : na, "Fib 0.618", color=color.new(color.yellow, 20), linestyle=hline.style_dashed)
hline(showFibs ? fib786 : na, "Fib 0.786", color=color.new(color.gray,   20), linestyle=hline.style_dotted)

// ── Golden pocket 0.5 – 0.618 (shaded) ──
var box gpBox = na
if barstate.islast and showFibs
    box.delete(gpBox)
    gpBox := box.new(bar_index - 200, fib618, bar_index + 30, fib500, bgcolor=color.new(color.yellow, 82), border_color=color.new(color.yellow, 40), text="Golden Pocket 4,038 – 4,057", text_color=color.new(color.yellow, 0), text_size=size.small)

// ── Supply / demand zones ──
// Supply: 4,082.75 (Fib 0.786) up through 4,094.57 (weekly R1) — the key sell zone
// Demand: 4,019.93 (Fib 0.382) down through 4,008.54 (daily P) — the key buy zone
// Deep demand: 3,980.99 (daily S1) down through 3,960.53 (last week low)
var box supplyBox = na
var box demandBox = na
var box deepDemandBox = na
if barstate.islast and showZones
    box.delete(supplyBox)
    box.delete(demandBox)
    box.delete(deepDemandBox)
    supplyBox     := box.new(bar_index - 200, 4094.57, bar_index + 30, 4082.75, bgcolor=color.new(color.red,   82), border_color=color.new(color.red,   40), text="SUPPLY 4,083 – 4,095", text_color=color.new(color.red, 0), text_size=size.small)
    demandBox     := box.new(bar_index - 200, 4027.55, bar_index + 30, 4008.54, bgcolor=color.new(color.green, 82), border_color=color.new(color.green, 40), text="DEMAND 4,009 – 4,028", text_color=color.new(color.green, 0), text_size=size.small)
    deepDemandBox := box.new(bar_index - 200, 3980.99, bar_index + 30, 3960.53, bgcolor=color.new(color.green, 88), border_color=color.new(color.green, 60), text="Deep demand 3,961 – 3,981", text_color=color.new(color.green, 0), text_size=size.small)

// ── Pivots (daily + weekly) ──
dailyR3 = 4089.13
dailyR2 = 4062.61
dailyR1 = 4035.06
dailyP  = 4008.54
dailyS1 = 3980.99
weeklyR1 = 4094.57
weeklyP  = 4027.55
weeklyS1 = 3939.08

hline(showPivots ? dailyR3  : na, "D R3", color=color.new(color.red,     10), linestyle=hline.style_solid)
hline(showPivots ? dailyR2  : na, "D R2", color=color.new(color.red,     30), linestyle=hline.style_dashed)
hline(showPivots ? dailyR1  : na, "D R1", color=color.new(color.red,     50), linestyle=hline.style_dotted)
hline(showPivots ? dailyP   : na, "D P",  color=color.new(color.white,   20), linestyle=hline.style_solid)
hline(showPivots ? dailyS1  : na, "D S1", color=color.new(color.green,   50), linestyle=hline.style_dotted)
hline(showPivots ? weeklyR1 : na, "W R1", color=color.new(color.fuchsia, 10), linestyle=hline.style_solid)
hline(showPivots ? weeklyP  : na, "W P",  color=color.new(color.fuchsia, 30), linestyle=hline.style_solid)
hline(showPivots ? weeklyS1 : na, "W S1", color=color.new(color.fuchsia, 40), linestyle=hline.style_dashed)

// ── Trade idea 1: SELL bounce-fade at 4,082–4,094 ──
// Entry zone: 4,082 – 4,094 · Invalidation: 4,116 · Target: 4,027.55
var box   sellEntry = na
var line  sellInv   = na
var line  sellTgt   = na
var label sellLbl   = na
if barstate.islast and showTrades
    box.delete(sellEntry)
    line.delete(sellInv)
    line.delete(sellTgt)
    label.delete(sellLbl)
    sellEntry := box.new(bar_index - 50, 4094.57, bar_index + 50, 4082.75, bgcolor=color.new(color.red, 70), border_color=color.new(color.red, 20))
    sellInv   := line.new(bar_index - 50, 4116.02, bar_index + 50, 4116.02, color=color.new(color.red, 0),    style=line.style_dashed, width=2)
    sellTgt   := line.new(bar_index - 50, 4027.55, bar_index + 50, 4027.55, color=color.new(color.green, 0),  style=line.style_dashed, width=2)
    sellLbl   := label.new(bar_index + 50, 4088.66, "SELL #1 · 60%\nEntry 4,083–4,095\nInv 4,116 · Tgt 4,028", color=color.new(color.red, 20), textcolor=color.white, style=label.style_label_left, size=size.small)

// ── Trade idea 2: BUY weekly-pivot reclaim at 4,020–4,028 ──
// Entry zone: 4,020 – 4,028 · Invalidation: 3,980.99 · Target: 4,062.61
var box   buyEntry = na
var line  buyInv   = na
var line  buyTgt   = na
var label buyLbl   = na
if barstate.islast and showTrades
    box.delete(buyEntry)
    line.delete(buyInv)
    line.delete(buyTgt)
    label.delete(buyLbl)
    buyEntry := box.new(bar_index - 50, 4027.55, bar_index + 50, 4019.93, bgcolor=color.new(color.green, 70), border_color=color.new(color.green, 20))
    buyInv   := line.new(bar_index - 50, 3980.99, bar_index + 50, 3980.99, color=color.new(color.red, 0),    style=line.style_dashed, width=2)
    buyTgt   := line.new(bar_index - 50, 4062.61, bar_index + 50, 4062.61, color=color.new(color.green, 0),  style=line.style_dashed, width=2)
    buyLbl   := label.new(bar_index + 50, 4023.74, "BUY #2 · 40%\nEntry 4,020–4,028\nInv 3,981 · Tgt 4,063", color=color.new(color.green, 20), textcolor=color.white, style=label.style_label_left, size=size.small)

// ── Trade idea 3: SELL swing on rate-story reassertion ──
// Entry zone: 4,027 – 4,035 (on retest after break) · Invalidation: 4,076 · Target: 3,939.08
var box   swingEntry = na
var line  swingInv   = na
var line  swingTgt   = na
var label swingLbl   = na
if barstate.islast and showTrades
    box.delete(swingEntry)
    line.delete(swingInv)
    line.delete(swingTgt)
    label.delete(swingLbl)
    swingEntry := box.new(bar_index - 50, 4035.06, bar_index + 50, 4027.55, bgcolor=color.new(color.maroon, 70), border_color=color.new(color.maroon, 20))
    swingInv   := line.new(bar_index - 50, 4076.33, bar_index + 50, 4076.33, color=color.new(color.red, 0),    style=line.style_dashed, width=1)
    swingTgt   := line.new(bar_index - 50, 3939.08, bar_index + 50, 3939.08, color=color.new(color.green, 0),  style=line.style_dashed, width=1)
    swingLbl   := label.new(bar_index + 50, 4031.30, "SELL #3 SWING · 45%\nEntry 4,027–4,035 (retest)\nInv 4,076 · Tgt 3,939", color=color.new(color.maroon, 20), textcolor=color.white, style=label.style_label_left, size=size.small)

// ── Callouts on key levels ──
var label lblSwingHi = na
var label lblSwingLo = na
var label lblR3      = na
var label lblWP      = na
if barstate.islast
    label.delete(lblSwingHi)
    label.delete(lblSwingLo)
    label.delete(lblR3)
    label.delete(lblWP)
    lblSwingHi := label.new(bar_index + 30, swingHi, "Wk Hi 4,116", color=color.new(color.gray, 20), textcolor=color.white, style=label.style_label_left, size=size.small)
    lblSwingLo := label.new(bar_index + 30, swingLo, "Wk Lo 3,961", color=color.new(color.gray, 20), textcolor=color.white, style=label.style_label_left, size=size.small)
    lblR3      := label.new(bar_index + 30, dailyR3, "D R3 4,089",  color=color.new(color.red,  20), textcolor=color.white, style=label.style_label_left, size=size.small)
    lblWP      := label.new(bar_index + 30, weeklyP, "Wk P 4,028",  color=color.new(color.fuchsia, 20), textcolor=color.white, style=label.style_label_left, size=size.small)

// ── Net-bias banner ──
var table biasTbl = table.new(position.top_right, 2, 5, border_width=1)
if barstate.islast
    table.clear(biasTbl, 0, 0, 1, 4)
    table.cell(biasTbl, 0, 0, "NET BIAS",     bgcolor=color.new(color.black, 20), text_color=color.white, text_size=size.small)
    table.cell(biasTbl, 1, 0, "SELL",         bgcolor=color.new(color.red,   20), text_color=color.white, text_size=size.small)
    table.cell(biasTbl, 0, 1, "Real yield",   bgcolor=color.new(color.black, 40), text_color=color.white, text_size=size.tiny)
    table.cell(biasTbl, 1, 1, "2.35% (+4bp)", bgcolor=color.new(color.black, 40), text_color=color.white, text_size=size.tiny)
    table.cell(biasTbl, 0, 2, "Fed Jul 29",   bgcolor=color.new(color.black, 40), text_color=color.white, text_size=size.tiny)
    table.cell(biasTbl, 1, 2, "84% hold / 16% hike", bgcolor=color.new(color.black, 40), text_color=color.white, text_size=size.tiny)
    table.cell(biasTbl, 0, 3, "DXY",          bgcolor=color.new(color.black, 40), text_color=color.white, text_size=size.tiny)
    table.cell(biasTbl, 1, 3, "100.91 (-0.27%)", bgcolor=color.new(color.black, 40), text_color=color.white, text_size=size.tiny)
    table.cell(biasTbl, 0, 4, "1h / 4h RSI",  bgcolor=color.new(color.black, 40), text_color=color.white, text_size=size.tiny)
    table.cell(biasTbl, 1, 4, "72.4 / 72.8",  bgcolor=color.new(color.black, 40), text_color=color.white, text_size=size.tiny)
{"bias": "SELL",
 "ideas": [
   {"bias": "SELL", "label": "Bounce-fade at 4,083-4,095 confluence", "entry_low": 4082.75, "entry_high": 4094.57,
    "invalidation": 4116.02, "target": 4027.55, "conviction": 60},
   {"bias": "BUY", "label": "Weekly-pivot reclaim", "entry_low": 4019.93, "entry_high": 4027.55,
    "invalidation": 3980.99, "target": 4062.61, "conviction": 40},
   {"bias": "SELL", "label": "Swing on rate-story reassertion", "entry_low": 4027.55, "entry_high": 4035.06,
    "invalidation": 4076.33, "target": 3939.08, "conviction": 45}
 ]}

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

// ── Inputs ──
showFibs   = input.bool(true,  "Show Fibonacci")
showZones  = input.bool(true,  "Show S/R zones")
showTrades = input.bool(true,  "Show trade ideas")
showPivots = input.bool(true,  "Show pivots")

// ── 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 anchor: last week's range 3,960.53 → 4,116.02 ──
swingHi = 4116.02
swingLo = 3960.53
rng     = swingHi - swingLo

// ── Fibonacci ──
fib236 = swingLo + 0.236 * rng   // 3,997.23
fib382 = swingLo + 0.382 * rng   // 4,019.93
fib500 = swingLo + 0.500 * rng   // 4,038.28
fib618 = swingLo + 0.618 * rng   // 4,056.62
fib786 = swingLo + 0.786 * rng   // 4,082.75

hline(showFibs ? fib236 : na, "Fib 0.236", color=color.new(color.gray,   40), linestyle=hline.style_dotted)
hline(showFibs ? fib382 : na, "Fib 0.382", color=color.new(color.gray,   20), linestyle=hline.style_dotted)
hline(showFibs ? fib500 : na, "Fib 0.500", color=color.new(color.yellow, 20), linestyle=hline.style_dashed)
hline(showFibs ? fib618 : na, "Fib 0.618", color=color.new(color.yellow, 20), linestyle=hline.style_dashed)
hline(showFibs ? fib786 : na, "Fib 0.786", color=color.new(color.gray,   20), linestyle=hline.style_dotted)

// ── Golden pocket 0.5 – 0.618 (shaded) ──
var box gpBox = na
if barstate.islast and showFibs
    box.delete(gpBox)
    gpBox := box.new(bar_index - 200, fib618, bar_index + 30, fib500, bgcolor=color.new(color.yellow, 82), border_color=color.new(color.yellow, 40), text="Golden Pocket 4,038 – 4,057", text_color=color.new(color.yellow, 0), text_size=size.small)

// ── Supply / demand zones ──
// Supply: 4,082.75 (Fib 0.786) up through 4,094.57 (weekly R1) — the key sell zone
// Demand: 4,019.93 (Fib 0.382) down through 4,008.54 (daily P) — the key buy zone
// Deep demand: 3,980.99 (daily S1) down through 3,960.53 (last week low)
var box supplyBox = na
var box demandBox = na
var box deepDemandBox = na
if barstate.islast and showZones
    box.delete(supplyBox)
    box.delete(demandBox)
    box.delete(deepDemandBox)
    supplyBox     := box.new(bar_index - 200, 4094.57, bar_index + 30, 4082.75, bgcolor=color.new(color.red,   82), border_color=color.new(color.red,   40), text="SUPPLY 4,083 – 4,095", text_color=color.new(color.red, 0), text_size=size.small)
    demandBox     := box.new(bar_index - 200, 4027.55, bar_index + 30, 4008.54, bgcolor=color.new(color.green, 82), border_color=color.new(color.green, 40), text="DEMAND 4,009 – 4,028", text_color=color.new(color.green, 0), text_size=size.small)
    deepDemandBox := box.new(bar_index - 200, 3980.99, bar_index + 30, 3960.53, bgcolor=color.new(color.green, 88), border_color=color.new(color.green, 60), text="Deep demand 3,961 – 3,981", text_color=color.new(color.green, 0), text_size=size.small)

// ── Pivots (daily + weekly) ──
dailyR3 = 4089.13
dailyR2 = 4062.61
dailyR1 = 4035.06
dailyP  = 4008.54
dailyS1 = 3980.99
weeklyR1 = 4094.57
weeklyP  = 4027.55
weeklyS1 = 3939.08

hline(showPivots ? dailyR3  : na, "D R3", color=color.new(color.red,     10), linestyle=hline.style_solid)
hline(showPivots ? dailyR2  : na, "D R2", color=color.new(color.red,     30), linestyle=hline.style_dashed)
hline(showPivots ? dailyR1  : na, "D R1", color=color.new(color.red,     50), linestyle=hline.style_dotted)
hline(showPivots ? dailyP   : na, "D P",  color=color.new(color.white,   20), linestyle=hline.style_solid)
hline(showPivots ? dailyS1  : na, "D S1", color=color.new(color.green,   50), linestyle=hline.style_dotted)
hline(showPivots ? weeklyR1 : na, "W R1", color=color.new(color.fuchsia, 10), linestyle=hline.style_solid)
hline(showPivots ? weeklyP  : na, "W P",  color=color.new(color.fuchsia, 30), linestyle=hline.style_solid)
hline(showPivots ? weeklyS1 : na, "W S1", color=color.new(color.fuchsia, 40), linestyle=hline.style_dashed)

// ── Trade idea 1: SELL bounce-fade at 4,082–4,094 ──
// Entry zone: 4,082 – 4,094 · Invalidation: 4,116 · Target: 4,027.55
var box   sellEntry = na
var line  sellInv   = na
var line  sellTgt   = na
var label sellLbl   = na
if barstate.islast and showTrades
    box.delete(sellEntry)
    line.delete(sellInv)
    line.delete(sellTgt)
    label.delete(sellLbl)
    sellEntry := box.new(bar_index - 50, 4094.57, bar_index + 50, 4082.75, bgcolor=color.new(color.red, 70), border_color=color.new(color.red, 20))
    sellInv   := line.new(bar_index - 50, 4116.02, bar_index + 50, 4116.02, color=color.new(color.red, 0),    style=line.style_dashed, width=2)
    sellTgt   := line.new(bar_index - 50, 4027.55, bar_index + 50, 4027.55, color=color.new(color.green, 0),  style=line.style_dashed, width=2)
    sellLbl   := label.new(bar_index + 50, 4088.66, "SELL #1 · 60%\nEntry 4,083–4,095\nInv 4,116 · Tgt 4,028", color=color.new(color.red, 20), textcolor=color.white, style=label.style_label_left, size=size.small)

// ── Trade idea 2: BUY weekly-pivot reclaim at 4,020–4,028 ──
// Entry zone: 4,020 – 4,028 · Invalidation: 3,980.99 · Target: 4,062.61
var box   buyEntry = na
var line  buyInv   = na
var line  buyTgt   = na
var label buyLbl   = na
if barstate.islast and showTrades
    box.delete(buyEntry)
    line.delete(buyInv)
    line.delete(buyTgt)
    label.delete(buyLbl)
    buyEntry := box.new(bar_index - 50, 4027.55, bar_index + 50, 4019.93, bgcolor=color.new(color.green, 70), border_color=color.new(color.green, 20))
    buyInv   := line.new(bar_index - 50, 3980.99, bar_index + 50, 3980.99, color=color.new(color.red, 0),    style=line.style_dashed, width=2)
    buyTgt   := line.new(bar_index - 50, 4062.61, bar_index + 50, 4062.61, color=color.new(color.green, 0),  style=line.style_dashed, width=2)
    buyLbl   := label.new(bar_index + 50, 4023.74, "BUY #2 · 40%\nEntry 4,020–4,028\nInv 3,981 · Tgt 4,063", color=color.new(color.green, 20), textcolor=color.white, style=label.style_label_left, size=size.small)

// ── Trade idea 3: SELL swing on rate-story reassertion ──
// Entry zone: 4,027 – 4,035 (on retest after break) · Invalidation: 4,076 · Target: 3,939.08
var box   swingEntry = na
var line  swingInv   = na
var line  swingTgt   = na
var label swingLbl   = na
if barstate.islast and showTrades
    box.delete(swingEntry)
    line.delete(swingInv)
    line.delete(swingTgt)
    label.delete(swingLbl)
    swingEntry := box.new(bar_index - 50, 4035.06, bar_index + 50, 4027.55, bgcolor=color.new(color.maroon, 70), border_color=color.new(color.maroon, 20))
    swingInv   := line.new(bar_index - 50, 4076.33, bar_index + 50, 4076.33, color=color.new(color.red, 0),    style=line.style_dashed, width=1)
    swingTgt   := line.new(bar_index - 50, 3939.08, bar_index + 50, 3939.08, color=color.new(color.green, 0),  style=line.style_dashed, width=1)
    swingLbl   := label.new(bar_index + 50, 4031.30, "SELL #3 SWING · 45%\nEntry 4,027–4,035 (retest)\nInv 4,076 · Tgt 3,939", color=color.new(color.maroon, 20), textcolor=color.white, style=label.style_label_left, size=size.small)

// ── Callouts on key levels ──
var label lblSwingHi = na
var label lblSwingLo = na
var label lblR3      = na
var label lblWP      = na
if barstate.islast
    label.delete(lblSwingHi)
    label.delete(lblSwingLo)
    label.delete(lblR3)
    label.delete(lblWP)
    lblSwingHi := label.new(bar_index + 30, swingHi, "Wk Hi 4,116", color=color.new(color.gray, 20), textcolor=color.white, style=label.style_label_left, size=size.small)
    lblSwingLo := label.new(bar_index + 30, swingLo, "Wk Lo 3,961", color=color.new(color.gray, 20), textcolor=color.white, style=label.style_label_left, size=size.small)
    lblR3      := label.new(bar_index + 30, dailyR3, "D R3 4,089",  color=color.new(color.red,  20), textcolor=color.white, style=label.style_label_left, size=size.small)
    lblWP      := label.new(bar_index + 30, weeklyP, "Wk P 4,028",  color=color.new(color.fuchsia, 20), textcolor=color.white, style=label.style_label_left, size=size.small)

// ── Net-bias banner ──
var table biasTbl = table.new(position.top_right, 2, 5, border_width=1)
if barstate.islast
    table.clear(biasTbl, 0, 0, 1, 4)
    table.cell(biasTbl, 0, 0, "NET BIAS",     bgcolor=color.new(color.black, 20), text_color=color.white, text_size=size.small)
    table.cell(biasTbl, 1, 0, "SELL",         bgcolor=color.new(color.red,   20), text_color=color.white, text_size=size.small)
    table.cell(biasTbl, 0, 1, "Real yield",   bgcolor=color.new(color.black, 40), text_color=color.white, text_size=size.tiny)
    table.cell(biasTbl, 1, 1, "2.35% (+4bp)", bgcolor=color.new(color.black, 40), text_color=color.white, text_size=size.tiny)
    table.cell(biasTbl, 0, 2, "Fed Jul 29",   bgcolor=color.new(color.black, 40), text_color=color.white, text_size=size.tiny)
    table.cell(biasTbl, 1, 2, "84% hold / 16% hike", bgcolor=color.new(color.black, 40), text_color=color.white, text_size=size.tiny)
    table.cell(biasTbl, 0, 3, "DXY",          bgcolor=color.new(color.black, 40), text_color=color.white, text_size=size.tiny)
    table.cell(biasTbl, 1, 3, "100.91 (-0.27%)", bgcolor=color.new(color.black, 40), text_color=color.white, text_size=size.tiny)
    table.cell(biasTbl, 0, 4, "1h / 4h RSI",  bgcolor=color.new(color.black, 40), text_color=color.white, text_size=size.tiny)
    table.cell(biasTbl, 1, 4, "72.4 / 72.8",  bgcolor=color.new(color.black, 40), text_color=color.white, text_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

Stretched into the shelf, patience wins