Let's talk
gold July 24, 2026 · 12 min read

Gold — Real yields punch above 2.4%, the bid quietly walks off

The 30-handle intraday drop through 4,060 wasn't a headline event — it was a rates re-pricing. US 10y real yields ticked up to 2.43% (+4 bp) as fed-funds futures now bake in a 30% July hike alongside a 70% hold, and DXY caught a 0.56% bid on the same wire. On the chart, price sits below EMA20/50/200 on the daily, investing.com's aggregate has flipped to **Strong Sell**, and the 1h has just lost the 4,046 EMA20. This is a headwinds-stacking session; bounces into the daily pivot are the higher-quality trade. Not financial advice — conviction figures below are qualitative, not back-tested.


The 30-handle intraday drop through 4,060 wasn't a headline event — it was a rates re-pricing. US 10y real yields ticked up to 2.43% (+4 bp) as fed-funds futures now bake in a 30% July hike alongside a 70% hold, and DXY caught a 0.56% bid on the same wire. On the chart, price sits below EMA20/50/200 on the daily, investing.com's aggregate has flipped to Strong Sell, and the 1h has just lost the 4,046 EMA20. This is a headwinds-stacking session; bounces into the daily pivot are the higher-quality trade. Not financial advice — conviction figures below are qualitative, not back-tested.

The session

Spot PAXG prints 4,042.80 after a clean sweep of the 4,020–4,158 session range. The high was set in the Asia handoff; London opened by walking the bid straight through the 4,072 daily pivot and 4,046 hourly EMA20 without so much as a retest. There is no single headline behind the move — investing.com's live-levels desk flagged "volume support at $4,040" as the working shelf, and their tape read ("Gold slips 2% amid firmer dollar as Brent tops $100, stoking inflationary fears") lines up with what the DXY and rates screens showed: a coordinated hawkish repricing rather than a risk-off scramble. VIX is only 18.88 and BTC is quietly green — this isn't panic, it's positioning.

GVZ at 25.14 is worth marking: gold-implied vol has been in the low twenties for weeks, and a 25-handle print says the options market is pricing more range, not less. That matters for setup selection — wide stops, no chasing.

Multi-timeframe read

  • 15m: RSI 58, price above both EMA20 (4,036) and EMA50 (4,040). This is a countertrend bounce inside a larger sell-day — treat it as noise until 1h agrees.
  • 1h: RSI 43.9, MACD histogram trying to turn but price is 3.8 below EMA20 and 21.5 below EMA50. Structure is broken.
  • 4h: RSI 48.9, price 20 below EMA20, MACD histogram at -10.7 but pointing up. Consolidation inside a downtrend, not a reversal.
  • 1d: RSI 45.9, price is below EMA20 (4,063), EMA50 (4,157) AND EMA200 (4,379). The 336-point gap to the 200-day is the tell — this tape has done real damage to the trend.

The timeframes agree at every horizon above 1h: bearish. The 15m bounce is the only pocket of buy pressure, and it's fighting three timeframes worth of supply. My read matches investing.com's aggregate Strong Sell — no divergence to flag, though their MA summary is Neutral (6 buy / 6 sell) because short-MA slopes are still positive on the 15m. That's a mechanical artifact of the tiny counter-bounce; ignore it.

Macro frame

Lead with the real yield: US 10y TIPS at 2.43%, +4 bp d/d. That's the driver. Breakeven inflation is unchanged at 2.28%, so the entire nominal 10y move (4.71%, +4 bp) is coming from the real component — the market is not raising its inflation forecast, it is raising its expected path of policy. Fed-funds futures now price 30% for a hike at the July 29 FOMC vs 70% hold, with the entire distribution living in 3.50–4.00%. That is a hawkish tilt, not a dovish pause, and rising real yields are the mechanical response.

Gold sells off when TIPS yields rise because the opportunity cost of holding a non-yielding asset goes up in real terms — this is the cleanest textbook version of that trade you'll get all quarter.

DXY confirms: 101.33, +0.56% intraday, above all three daily EMAs, and the DXY↔XAU 30-day daily-return correlation sits at -0.51. Half of gold's daily variance is being explained by the dollar right now. When DXY makes a directional move, gold follows the mirror.

Cross-asset:

  • VIX 18.88 — no risk-off. This is a rates story, not a fear story.
  • GVZ 25.14 — gold's own vol index is elevated. The market is pricing continued range.
  • Gold/silver ratio 69.1, silver $58.53 — precious-metals complex is holding together; silver isn't leading gold lower, which would be the tell for a full liquidation.
  • WTI $90.32 (-2.0%) and Brent >$100 per investing.com — oil is up on the week even if intraday is red, feeding into the breakeven story indirectly. Not enough to push breakevens today.
  • BTC $65,433 (+0.6%) — the "digital gold" cohort is not selling. Divergence noted but not weighted heavily; BTC and XAU decouple often.

No fresh non-US central-bank colour in the pre-fetched feed.

Two scenarios

Sell setup

  • Trigger: Rejection candle (1h close) inside 4,072–4,094 (daily pivot to weekly R1).
  • Invalidation: 1h close above 4,106 (daily R1); above there structure repairs.
  • Target: 4,011 (daily S1), stretch 3,976 (daily S2 / weekly S1 zone 3,939).
  • Conviction: 62%
  • Rationale: Every timeframe above 1h is below its EMAs, real yields are rising, DXY is bid, and investing.com's aggregate is Strong Sell. A retest of the failed pivot is the textbook re-entry for the trend-follower.

Buy setup

  • Trigger: Reclaim of 4,072 daily pivot on a 1h close, with 1h RSI back above 50.
  • Invalidation: Loss of 4,011 daily S1 on a 4h close.
  • Target: 4,106 (daily R1), then 4,158 (session high / EMA50 daily).
  • Conviction: 32%
  • Rationale: Counter-trend. Only works if DXY rolls over from 101.3 and real yields fade the +4 bp move. GVZ at 25 says a squeeze is possible even into resistance. Trade small — the 15m EMA cluster is the only thing supporting the bull case.

Levels worth marking

Resistance stack (above):

  • 4,063.84 — daily EMA20 (immediate cap)
  • 4,072.52 — daily pivot P
  • 4,094.57 — weekly R1
  • 4,106.64 — daily R1 (bull-case gate)
  • 4,157.89 — daily EMA50, coincident with session high 4,157.63 (heavy confluence)
  • 4,168.15 — daily R2
  • 4,183.04 — weekly R2
  • 4,379.16 — daily EMA200 (macro cap, well away)

Support stack (below):

  • 4,027.55 — weekly pivot P
  • 4,020.76 — session low
  • 4,011.01 — daily S1
  • 3,976.89 — daily S2
  • 3,960.53 — prior week low
  • 3,939.08 — weekly S1

The 4,157 confluence (session high + EMA50 + weekly high area) is the single most important level on the chart. Any sell setup that survives a poke into 4,094–4,106 has a very hard ceiling right above it.

Calendar / catalysts

From ForexFactory (real, pre-fetched):

  • Fri Jul 24GBP Retail Sales m/m came in 1.0% vs -0.3% forecast (hot). French Flash Manufacturing PMI 50.0 vs 51.0 (miss, at the line). French Services 49.8 (beat vs 47.5). German Manufacturing 52.2 (beat vs 50.4) — the eurozone data mix is mildly EUR-supportive, which caps DXY upside at the margin.
  • UK Flash Manufacturing/Services PMI 11:30am — still pending as of this note; a soft print would push GBP down and DXY up, adding to the gold headwind.
  • No US Tier-1 print on the calendar in the fetched window.
  • FOMC Jul 29 — five sessions away. That is the event risk of the week for gold; a hike delivery re-rates real yields another leg higher, a dovish hold snaps XAU back to 4,100+.

Sources cited

Onewordnews (kitco, dailyfx excerpts), investing.com (news headlines, live-levels desk note, automated technical aggregate), Treasury.gov 10y TIPS real yield, CME/fed-funds futures implied path, ForexFactory economic calendar. CFTC COT was unavailable this run — positioning colour omitted rather than guessed.

Desk summary & bias

Gold is trading heavy below every daily EMA with the 10y real yield leading the move at +4 bp on the day, DXY confirming at +0.56%, and Fed-funds futures now assigning 30% odds to a July hike. The technical state is unambiguously bearish on the 1h/4h/1d, and only the 15m bounce (a countertrend artifact) is supporting any long argument. The single most important thing to watch next is the 4,072 daily pivot on hourly closes — reclaimed, and the bears lose the setup; rejected, and the daily S1/S2 zone at 4,011/3,977 is in play.

# Bias Setup Trigger Entry zone Invalidation Target Conviction Why
1 SELL Pivot-fade 1h rejection candle 4,072–4,094 4,106 (1h close above) 4,011 → 3,977 62% Below all daily EMAs; real yields +4 bp; DXY bid; investing.com Strong Sell
2 BUY Oversold scalp 1h close back above 4,072 with RSI>50 4,011–4,028 4,011 (4h close below) 4,106 → 4,158 32% Counter-trend; needs DXY roll + real-yield fade; GVZ 25 says squeeze possible
3 SELL Trend-continuation swing Daily close below 4,011 4,000–4,011 4,072 (daily close above) 3,939 (weekly S1) 55% Trend + macro + technical alignment; sized smaller for FOMC risk five sessions out

Net desk bias: SELL. Real yields at 2.43% and a Fed-funds path skewed to hikes are structurally hostile to a non-yielding asset; DXY at 101.33 with -0.51 correlation to XAU is the transmission mechanism. The technical state agrees on every timeframe above 15m, and investing.com's aggregate confirms Strong Sell. The macro and the technicals point the same way — no need to weight one over the other. The only reason this isn't a higher-conviction lean is the FOMC five sessions out: a dovish delivery could snap the whole thesis, so sizing stays disciplined and the swing idea is deliberately half-sized.

(not financial advice)

//@version=5
indicator("Gold Desk 2026-07-24 — 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.orange, 0), linewidth=1)
plot(ema50,  "EMA50",  color=color.new(color.blue,   0), linewidth=1)
plot(ema200, "EMA200", color=color.new(color.purple, 0), linewidth=2)

// ── Fibonacci retracement of 5-session swing 3982.03 → 4157.63 ──
swingHi = 4157.63
swingLo = 3982.03
rng     = swingHi - swingLo
fib236  = swingHi - rng * 0.236
fib382  = swingHi - rng * 0.382
fib50   = swingHi - rng * 0.500
fib618  = swingHi - rng * 0.618
fib786  = swingHi - rng * 0.786

hline(swingHi, "Swing High 4157.63", color=color.new(color.gray, 30), linestyle=hline.style_dashed)
hline(fib236,  "Fib 0.236 4116.19", color=color.new(color.gray, 40), linestyle=hline.style_dotted)
hline(fib382,  "Fib 0.382 4090.55", color=color.new(color.gray, 40), linestyle=hline.style_dotted)
hline(fib50,   "Fib 0.500 4069.83", color=color.new(color.yellow, 30), linestyle=hline.style_dotted)
hline(fib618,  "Fib 0.618 4049.11", color=color.new(color.yellow, 30), linestyle=hline.style_dotted)
hline(fib786,  "Fib 0.786 4019.61", color=color.new(color.gray, 40), linestyle=hline.style_dotted)
hline(swingLo, "Swing Low 3982.03", color=color.new(color.gray, 30), linestyle=hline.style_dashed)

// ── Golden pocket 0.5–0.618 (shaded) ──
if barstate.islast
    box.new(bar_index - 200, fib50, bar_index + 30, fib618, bgcolor=color.new(color.yellow, 82), border_color=color.new(color.yellow, 40), text="Golden pocket 4049–4070", text_color=color.yellow, text_size=size.small)

// ── Pivot levels (daily) ──
hline(4072.52, "Daily P",  color=color.new(color.white,  20), linestyle=hline.style_solid)
hline(4106.64, "Daily R1", color=color.new(color.red,    30), linestyle=hline.style_solid)
hline(4168.15, "Daily R2", color=color.new(color.red,    50), linestyle=hline.style_dashed)
hline(4011.01, "Daily S1", color=color.new(color.green,  30), linestyle=hline.style_solid)
hline(3976.89, "Daily S2", color=color.new(color.green,  50), linestyle=hline.style_dashed)

// ── Weekly pivots (key only) ──
hline(4027.55, "Weekly P",  color=color.new(color.aqua, 40), linestyle=hline.style_dotted)
hline(4094.57, "Weekly R1", color=color.new(color.aqua, 40), linestyle=hline.style_dotted)
hline(3939.08, "Weekly S1", color=color.new(color.aqua, 40), linestyle=hline.style_dotted)

// ── Supply zone (resistance) 4072–4094 ──
if barstate.islast
    box.new(bar_index - 200, 4094.57, bar_index + 30, 4072.52, bgcolor=color.new(color.red, 80), border_color=color.new(color.red, 40), text="SUPPLY 4072–4094", text_color=color.red, text_size=size.small)

// ── Demand zone (support) 4011–4028 ──
if barstate.islast
    box.new(bar_index - 200, 4027.55, bar_index + 30, 4011.01, bgcolor=color.new(color.green, 80), border_color=color.new(color.green, 40), text="DEMAND 4011–4028", text_color=color.green, text_size=size.small)

// ── Trade idea #1: SELL pivot-fade ──
if barstate.islast
    box.new(bar_index - 40, 4094.57, bar_index + 40, 4072.52, bgcolor=color.new(color.red, 70), border_color=color.new(color.red, 20), text="SELL entry 4072–4094 (62%)", text_color=color.white, text_size=size.small)
    line.new(bar_index - 40, 4106.64, bar_index + 40, 4106.64, color=color.new(color.red, 0), width=2, style=line.style_dashed)
    label.new(bar_index + 40, 4106.64, "Invalidation 4106", style=label.style_label_left, color=color.new(color.red, 20), textcolor=color.white, size=size.small)
    line.new(bar_index - 40, 4011.01, bar_index + 40, 4011.01, color=color.new(color.red, 0), width=2)
    label.new(bar_index + 40, 4011.01, "Target 4011 → 3977", style=label.style_label_left, color=color.new(color.red, 40), textcolor=color.white, size=size.small)

// ── Trade idea #2: BUY oversold scalp ──
if barstate.islast
    box.new(bar_index - 40, 4027.55, bar_index + 40, 4011.01, bgcolor=color.new(color.green, 70), border_color=color.new(color.green, 20), text="BUY entry 4011–4028 (32%)", text_color=color.white, text_size=size.small)
    line.new(bar_index - 40, 4011.01, bar_index + 40, 4011.01, color=color.new(color.green, 0), width=1, style=line.style_dashed)
    line.new(bar_index - 40, 4158.00, bar_index + 40, 4158.00, color=color.new(color.green, 0), width=2)
    label.new(bar_index + 40, 4158.00, "Target 4106 → 4158", style=label.style_label_left, color=color.new(color.green, 40), textcolor=color.white, size=size.small)

// ── Trade idea #3: SELL trend-continuation swing (below 4011) ──
if barstate.islast
    line.new(bar_index - 40, 3939.08, bar_index + 40, 3939.08, color=color.new(color.maroon, 0), width=2, style=line.style_dotted)
    label.new(bar_index + 40, 3939.08, "Swing tgt 3939 (55%)", style=label.style_label_left, color=color.new(color.maroon, 30), textcolor=color.white, size=size.small)

// ── Net-bias banner ──
var table biasTable = table.new(position.top_right, 2, 4, bgcolor=color.new(color.black, 20), border_width=1)
if barstate.islast
    table.cell(biasTable, 0, 0, "NET BIAS", text_color=color.white, bgcolor=color.new(color.gray, 30))
    table.cell(biasTable, 1, 0, "SELL", text_color=color.white, bgcolor=color.new(color.red, 20))
    table.cell(biasTable, 0, 1, "Real 10y", text_color=color.white)
    table.cell(biasTable, 1, 1, "2.43% (+4bp)", text_color=color.red)
    table.cell(biasTable, 0, 2, "DXY", text_color=color.white)
    table.cell(biasTable, 1, 2, "101.33 (+0.56%)", text_color=color.red)
    table.cell(biasTable, 0, 3, "FOMC Jul 29", text_color=color.white)
    table.cell(biasTable, 1, 3, "70% hold / 30% hike", text_color=color.yellow)
{"bias": "SELL",
 "ideas": [
   {"bias": "SELL", "label": "Pivot-fade", "entry_low": 4072, "entry_high": 4094,
    "invalidation": 4106, "target": 4011, "conviction": 62},
   {"bias": "BUY", "label": "Oversold scalp", "entry_low": 4011, "entry_high": 4028,
    "invalidation": 4011, "target": 4106, "conviction": 32},
   {"bias": "SELL", "label": "Trend-continuation swing", "entry_low": 4000, "entry_high": 4011,
    "invalidation": 4072, "target": 3939, "conviction": 55}
 ]}

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-24 — 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.orange, 0), linewidth=1)
plot(ema50,  "EMA50",  color=color.new(color.blue,   0), linewidth=1)
plot(ema200, "EMA200", color=color.new(color.purple, 0), linewidth=2)

// ── Fibonacci retracement of 5-session swing 3982.03 → 4157.63 ──
swingHi = 4157.63
swingLo = 3982.03
rng     = swingHi - swingLo
fib236  = swingHi - rng * 0.236
fib382  = swingHi - rng * 0.382
fib50   = swingHi - rng * 0.500
fib618  = swingHi - rng * 0.618
fib786  = swingHi - rng * 0.786

hline(swingHi, "Swing High 4157.63", color=color.new(color.gray, 30), linestyle=hline.style_dashed)
hline(fib236,  "Fib 0.236 4116.19", color=color.new(color.gray, 40), linestyle=hline.style_dotted)
hline(fib382,  "Fib 0.382 4090.55", color=color.new(color.gray, 40), linestyle=hline.style_dotted)
hline(fib50,   "Fib 0.500 4069.83", color=color.new(color.yellow, 30), linestyle=hline.style_dotted)
hline(fib618,  "Fib 0.618 4049.11", color=color.new(color.yellow, 30), linestyle=hline.style_dotted)
hline(fib786,  "Fib 0.786 4019.61", color=color.new(color.gray, 40), linestyle=hline.style_dotted)
hline(swingLo, "Swing Low 3982.03", color=color.new(color.gray, 30), linestyle=hline.style_dashed)

// ── Golden pocket 0.5–0.618 (shaded) ──
if barstate.islast
    box.new(bar_index - 200, fib50, bar_index + 30, fib618, bgcolor=color.new(color.yellow, 82), border_color=color.new(color.yellow, 40), text="Golden pocket 4049–4070", text_color=color.yellow, text_size=size.small)

// ── Pivot levels (daily) ──
hline(4072.52, "Daily P",  color=color.new(color.white,  20), linestyle=hline.style_solid)
hline(4106.64, "Daily R1", color=color.new(color.red,    30), linestyle=hline.style_solid)
hline(4168.15, "Daily R2", color=color.new(color.red,    50), linestyle=hline.style_dashed)
hline(4011.01, "Daily S1", color=color.new(color.green,  30), linestyle=hline.style_solid)
hline(3976.89, "Daily S2", color=color.new(color.green,  50), linestyle=hline.style_dashed)

// ── Weekly pivots (key only) ──
hline(4027.55, "Weekly P",  color=color.new(color.aqua, 40), linestyle=hline.style_dotted)
hline(4094.57, "Weekly R1", color=color.new(color.aqua, 40), linestyle=hline.style_dotted)
hline(3939.08, "Weekly S1", color=color.new(color.aqua, 40), linestyle=hline.style_dotted)

// ── Supply zone (resistance) 4072–4094 ──
if barstate.islast
    box.new(bar_index - 200, 4094.57, bar_index + 30, 4072.52, bgcolor=color.new(color.red, 80), border_color=color.new(color.red, 40), text="SUPPLY 4072–4094", text_color=color.red, text_size=size.small)

// ── Demand zone (support) 4011–4028 ──
if barstate.islast
    box.new(bar_index - 200, 4027.55, bar_index + 30, 4011.01, bgcolor=color.new(color.green, 80), border_color=color.new(color.green, 40), text="DEMAND 4011–4028", text_color=color.green, text_size=size.small)

// ── Trade idea #1: SELL pivot-fade ──
if barstate.islast
    box.new(bar_index - 40, 4094.57, bar_index + 40, 4072.52, bgcolor=color.new(color.red, 70), border_color=color.new(color.red, 20), text="SELL entry 4072–4094 (62%)", text_color=color.white, text_size=size.small)
    line.new(bar_index - 40, 4106.64, bar_index + 40, 4106.64, color=color.new(color.red, 0), width=2, style=line.style_dashed)
    label.new(bar_index + 40, 4106.64, "Invalidation 4106", style=label.style_label_left, color=color.new(color.red, 20), textcolor=color.white, size=size.small)
    line.new(bar_index - 40, 4011.01, bar_index + 40, 4011.01, color=color.new(color.red, 0), width=2)
    label.new(bar_index + 40, 4011.01, "Target 4011 → 3977", style=label.style_label_left, color=color.new(color.red, 40), textcolor=color.white, size=size.small)

// ── Trade idea #2: BUY oversold scalp ──
if barstate.islast
    box.new(bar_index - 40, 4027.55, bar_index + 40, 4011.01, bgcolor=color.new(color.green, 70), border_color=color.new(color.green, 20), text="BUY entry 4011–4028 (32%)", text_color=color.white, text_size=size.small)
    line.new(bar_index - 40, 4011.01, bar_index + 40, 4011.01, color=color.new(color.green, 0), width=1, style=line.style_dashed)
    line.new(bar_index - 40, 4158.00, bar_index + 40, 4158.00, color=color.new(color.green, 0), width=2)
    label.new(bar_index + 40, 4158.00, "Target 4106 → 4158", style=label.style_label_left, color=color.new(color.green, 40), textcolor=color.white, size=size.small)

// ── Trade idea #3: SELL trend-continuation swing (below 4011) ──
if barstate.islast
    line.new(bar_index - 40, 3939.08, bar_index + 40, 3939.08, color=color.new(color.maroon, 0), width=2, style=line.style_dotted)
    label.new(bar_index + 40, 3939.08, "Swing tgt 3939 (55%)", style=label.style_label_left, color=color.new(color.maroon, 30), textcolor=color.white, size=size.small)

// ── Net-bias banner ──
var table biasTable = table.new(position.top_right, 2, 4, bgcolor=color.new(color.black, 20), border_width=1)
if barstate.islast
    table.cell(biasTable, 0, 0, "NET BIAS", text_color=color.white, bgcolor=color.new(color.gray, 30))
    table.cell(biasTable, 1, 0, "SELL", text_color=color.white, bgcolor=color.new(color.red, 20))
    table.cell(biasTable, 0, 1, "Real 10y", text_color=color.white)
    table.cell(biasTable, 1, 1, "2.43% (+4bp)", text_color=color.red)
    table.cell(biasTable, 0, 2, "DXY", text_color=color.white)
    table.cell(biasTable, 1, 2, "101.33 (+0.56%)", text_color=color.red)
    table.cell(biasTable, 0, 3, "FOMC Jul 29", text_color=color.white)
    table.cell(biasTable, 1, 3, "70% hold / 30% hike", text_color=color.yellow)
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

Rates lead, gold follows, respect it