Gold Desk — 2026-07-23: Real Yields Bite, Bulls Defend the Weekly Pivot
Gold is pinned near session lows at 4,087 with intraday flow decisively offered — 15m RSI is 24.6, four-hour momentum has rolled to flat, and price is riding daily support S1 (4,079.71). The primary macro driver, the 10-year TIPS real yield, ticked +2 bp to 2.39% while the Fed-funds curve now prices a 39% hike / 61% hold at July 29 — a hawkish shift that has pulled DXY back to 101.06 and squeezed the yellow metal. Below the tape, though, the daily chart still sits above EMA20 and 15m is deeply oversold at S1 — the setup for a mean-revert bounce is there for anyone willing to take it. This desk leans **sell-the-rally into 4,118–4,165** while respecting a tactical scalp long from the S1/weekly-pivot shelf. ECB at 3:15pm UTC is the day's only front-page risk.
Gold is pinned near session lows at 4,087 with intraday flow decisively offered — 15m RSI is 24.6, four-hour momentum has rolled to flat, and price is riding daily support S1 (4,079.71). The primary macro driver, the 10-year TIPS real yield, ticked +2 bp to 2.39% while the Fed-funds curve now prices a 39% hike / 61% hold at July 29 — a hawkish shift that has pulled DXY back to 101.06 and squeezed the yellow metal. Below the tape, though, the daily chart still sits above EMA20 and 15m is deeply oversold at S1 — the setup for a mean-revert bounce is there for anyone willing to take it. This desk leans sell-the-rally into 4,118–4,165 while respecting a tactical scalp long from the S1/weekly-pivot shelf. ECB at 3:15pm UTC is the day's only front-page risk.
The session
Asia and early London traded gold from the 4,157 session high straight into 4,040.49, and we've stabilised just under the daily pivot. Spot PAXG prints 4,087.94, COMEX GC front-month sits at 4,097.80 — futures still hold a +0.24% basis over spot, so the pricing plumbing is normal, no funding stress. The intraday drop coincides with a hard 11 bp jerk higher in the US 10-year nominal (to 4.66% on ^TNX) and a 56 bp lift in DXY. That's textbook: dollar-up + real-yield-up → gold down. It is worth noting that the tape is not breaking down — we are marking time in the lower half of the last five-session range (3,982.03 – 4,157.63) and holding daily S1. The 4,155 zone flagged by investing.com's "Gold tests $4,155 resistance amid fading volume" note is where the entire rejection began.
Multi-timeframe read
- 15m: RSI 24.6, MACD histogram -3.13 and pointing down, price 20.8 under EMA20 and 28.0 under EMA50. Grinding-lower structure but the oscillator is stretched — a snap-back to 4,108–4,116 is the base case if S1 holds one more test.
- 1h: RSI 38.3, price under both EMA20 (4,113.06) and EMA50 (4,097.35). Momentum still points lower but nothing catastrophic — this is a controlled sell-off, not a flush.
- 4h: RSI 50.2, MACD hist flat at 0.07 but decelerating. Crucially, price is still above EMA20 by 6.5 — the swing structure is intact until 4,081 gives way.
- 1d: RSI 50.1, MACD histogram +12.84 and rising, price 17.8 above EMA20 but 76.3 below EMA50 and a heavy 294.9 below EMA200. The daily is a coiled range beneath a distant EMA200, not a trending market — that's a mean-reversion regime.
The 15m/1h are aligned short, the 4h is on the fence, and the daily is quietly constructive. The disagreement is the trade: shorts have to fight the daily EMA20 shelf, longs have to fight fifteen-minute momentum. Investing.com's automated aggregate reads Neutral (MA summary Sell, RSI Buy, MACD Buy) — that's not a bad summary of what we see. We agree with their neutral daily aggregate; we lean bearish only because the macro is bearish, not because the chart is broken.
Macro frame
Lead with the 10-year real yield: TIPS 10y at 2.39% (+2 bp d/d). That is the number that matters — gold's opportunity cost is set here, not at the nominal wire. The breakeven printed 2.28% (+2 bp), so the +4 bp move in the 10-year nominal (4.67%) split evenly between real yield and inflation expectations. Real yields rising while breakevens also rise is the least-friendly mix for bullion: you get neither the inflation-hedge bid nor the low-real-rate carry.
The Fed-funds strip is the reason. The July 29 FOMC now prices 61% hold / 39% hike, 0% cut (target range 3.75–4.00%). A month ago the curve had cuts in it. The reprice into a "hold-or-hike" path lifts the real curve mechanically, and gold pays. Chair Warsh's no-guidance regime — flagged in the investing.com "rare pre-Fed cliffhanger" headline — is amplifying the two-sidedness; the market is trading positions, not signals.
DXY at 101.06 (+0.56%) has re-broken the daily EMA50 (100.32) with RSI 56 — modestly constructive but nowhere near overbought. The rolling 30-day DXY↔XAU return correlation of -0.47 is doing its job: about half of today's XAU move is explained by the buck. If DXY stays bid over 101, gold has an anchor around its neck.
Cross-asset colour: VIX at 17.91 (+7.6%) signals a modest risk-off tick — supportive of gold in isolation, but not enough to overpower a real-yield spike. GVZ at 24.02 shows the options market is not pricing an outsized gold move — implieds are muted, so directional conviction should be trimmed accordingly. The gold/silver ratio at 69.2 with silver at $59.11 tells you the precious complex is in a neutral PM regime (not a fear-buy of gold vs silver, not an industrial silver-outperformance either). WTI at $89.59 (+3.2%) and the FTSE headline about a US-Iran escalation add a geopolitical inflation bid that would normally help gold — the fact that it isn't helping is the tell that the rates channel dominates today. Bitcoin at $65,409 (-1.1%) is not confirming a risk-off flight to hard assets.
Non-US central-bank hook: ECB at 3:15pm UTC (main rate 2.40% expected unchanged) with the presser at 3:45pm — investing.com headlines flag "FTSE 100 today: Stocks slip as U.S.-Iran war escalates, ECB looms." A dovish ECB → weaker EUR → stronger DXY → another headwind. A hawkish surprise from Lagarde is the day's asymmetric gold-supportive tail.
Two scenarios
Conviction figures below are qualitative desk confidence, not back-tested probabilities.
Sell setup
- Trigger: rejection candle (15m or 1h) into daily pivot 4,118.67 or, better, weekly R1 4,094.57 cluster; ideally an intraday rally into 4,118–4,165 into thin volume.
- Invalidation: hourly close over 4,165.96 (daily R1) — that reopens 4,183 (weekly R2) and the 4,204 area.
- Target: first take at daily S1 4,079.71, main take at daily S2 4,032.42 and weekly pivot 4,027.55 cluster.
- Conviction: 60%.
- Rationale: real yields are lifting into an FOMC that has been re-priced hawkish; DXY has broken back over its daily EMA50; 1h and 15m momentum are firmly negative; the 4h EMA20 at 4,081 is the only intraday shelf still standing. Selling strength into pivot resistance is the higher-percentage play while the macro tape looks like this.
Buy setup
- Trigger: a 15m reversal candle (bullish engulf / hammer with RSI turning up out of sub-25) anywhere in 4,032–4,079 — daily S1 to daily S2 / weekly pivot confluence — with DXY stalling under 101.30.
- Invalidation: daily close under 3,993.46 (daily S3); below that the 3,982 five-session low is a "get out" line.
- Target: first take at daily pivot 4,118.67, stretch target 4,165.96 (daily R1).
- Conviction: 40%.
- Rationale: the daily chart is still above EMA20, the daily MACD histogram is rising, and 15m RSI at 24.6 is a deeply stretched intraday oscillator. A tactical scalp long is defensible at real support with a defined invalidation. This is not a swing thesis — it is a bounce trade.
Levels worth marking
Confluences that stack (from the pivots + EMAs):
- 4,164–4,166: daily R1 (4,165.96) — pivot resistance and prior session-high shelf.
- 4,113–4,118: daily pivot (4,118.67) + 1h EMA20 (4,113.06) + 1h EMA50 (4,097.35 cluster below). This is the fade zone.
- 4,094: weekly R1 (4,094.57) — the pivot that separates "bounce" from "trend continuation."
- 4,079–4,081: daily S1 (4,079.71) + 4h EMA20 (4,081.42). If this snaps intraday the sell setup pays.
- 4,027–4,032: daily S2 (4,032.42) + weekly pivot (4,027.55). Confluence support; the buy setup wants this zone.
- 3,993: daily S3 (3,993.46) — hard line-in-sand for any long thesis.
Recent swing to anchor Fibonacci: five-session range 3,982.03 → 4,157.63 (range 175.60):
- 0.236: 4,116.19 · 0.382: 4,090.55 · 0.5: 4,069.83 · 0.618: 4,049.10 · 0.786: 4,019.62.
- Golden pocket 4,049–4,070 overlaps the buy-scalp zone — that's the visual "here's why" for the long trigger.
Calendar / catalysts
Pre-fetched from ForexFactory:
- Thu Jul 23 · 3:15pm UTC · EUR · High · ECB Main Refinancing Rate (forecast 2.40%, prev 2.40%) + Monetary Policy Statement.
- Thu Jul 23 · 3:45pm UTC · EUR · High · ECB Press Conference (Lagarde).
- Thu Jul 23 · USD · Medium · Unemployment Claims (forecast 211K, prev 208K).
- Thu Jul 23 · 4:30am UTC · AUD · High · Employment Change (already printed 76.3K vs 16.4K expected — hot; contributed to overnight USD firmness).
- Earlier in the week: Canadian CPI ran cold (-0.4% m/m), NZ CPI ran hot (1.5% q/q), UK claimant count much better than expected — mixed picture, no single macro thread from the week's data.
- Ahead: FOMC Jul 29 is next week's dominant event.
Sources cited
Fed-funds implied path and its mapping into real yields; US Treasury real-yield curve (TIPS, 2.39%); onewordnews-derived headline sweep (Kitco excerpt); investing.com headlines and their automated technical aggregate ("Gold tests $4,155 resistance amid fading volume", "Gold trades near two-week high with Fed meeting, oil prices in focus", "Traders face rare pre-Fed cliffhanger in Warsh's 'no-guidance' era", the FTSE US-Iran/ECB piece); ForexFactory economic calendar; PAXG spot + COMEX GC=F futures. CFTC COT was unavailable this run — no positioning colour today.
Desk summary & bias
Gold is caught between a supportive daily chart (holding EMA20, MACD histogram rising) and an actively hostile macro tape (real yields up, DXY through its 50-day, Fed odds now hawkish into July 29). The dominant driver right now is the 10y real yield at 2.39% and rising alongside the reprice to 61% hold / 39% hike — that combination has taken 4,155 off the board and pinned price at daily S1. The single most important thing to watch is whether daily S1 (4,079.71) / 4h EMA20 (4,081.42) holds through the ECB window: a break there routes to 4,032–4,027 fast; a rejection reopens 4,118 for the sellers to fade.
| # | Bias | Setup | Trigger | Entry zone | Invalidation | Target | Conviction | Why |
|---|---|---|---|---|---|---|---|---|
| 1 | SELL | Fade rally into pivot | Rejection at daily P / R1 | 4,118 – 4,166 | 4,165.96 (1h close over) | 4,032 (stretch 4,027) | 60% | Real yields +2 bp, DXY through 50d, hawkish Fed reprice; 15m/1h momentum aligned short |
| 2 | BUY | Oversold scalp at S1/weekly-P | 15m reversal candle at confluence | 4,032 – 4,079 | 3,993.46 | 4,118 (stretch 4,165) | 40% | Daily above EMA20, daily MACD hist rising, 15m RSI 24.6, golden-pocket 4,049–4,070 overlap |
| 3 | SELL | Trend-continuation on break | Hourly close under 4,079.71 | 4,065 – 4,079 (retest) | 4,113 (1h EMA20) | 3,993 (weekly P if extends) | 45% | Adds if S1 breaks; confirms the daily chart is rolling to align with the 1h/15m |
Net desk bias: SELL — lean short, fade strength, respect a defined bounce level. The reason is the macro: TIPS real yield at 2.39% and rising, Fed-odds path hawkish into next week's FOMC, DXY reclaiming its 50-day, and a cross-asset picture (WTI up + BTC down + VIX up modestly) that says "risk premium in oil, not in gold." The daily chart argues neutral-to-mildly-bullish and investing.com's aggregate reads Neutral — we weight the macro over the technical here because the next scheduled catalyst (FOMC Jul 29) points in the same direction as today's rates move. If daily S1 gives, we press. If it holds and ECB comes dovish (EUR down → DXY up), we still get paid on the fade.
(not financial advice)
//@version=5
indicator("Gold Desk 2026-07-23 — bias SELL", overlay=true, max_lines_count=300, max_labels_count=300, max_boxes_count=100)
// ── Inputs (all levels traced back to the desk note) ──
showFibs = input.bool(true, "Show Fibonacci retracement")
showZones = input.bool(true, "Show supply / demand zones")
showPivots = input.bool(true, "Show pivot lines")
showTrades = input.bool(true, "Show trade ideas")
// ── EMAs ──
ema20 = ta.ema(close, 20)
ema50 = ta.ema(close, 50)
ema200 = ta.ema(close, 200)
plot(ema20, title="EMA20", color=color.new(color.yellow, 0), linewidth=2)
plot(ema50, title="EMA50", color=color.new(color.orange, 0), linewidth=2)
plot(ema200, title="EMA200", color=color.new(color.red, 0), linewidth=2)
// ── Swing anchors (5-session range from the brief) ──
swingHigh = 4157.63
swingLow = 3982.03
swingRng = swingHigh - swingLow
// ── Fibonacci retracement ──
fib236 = swingHigh - swingRng * 0.236
fib382 = swingHigh - swingRng * 0.382
fib500 = swingHigh - swingRng * 0.500
fib618 = swingHigh - swingRng * 0.618
fib786 = swingHigh - swingRng * 0.786
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, 30), linestyle=hline.style_dotted)
hline(showFibs ? fib500 : na, "Fib 0.500", color=color.new(color.gray, 20), linestyle=hline.style_dashed)
hline(showFibs ? fib618 : na, "Fib 0.618", color=color.new(color.gray, 20), linestyle=hline.style_dashed)
hline(showFibs ? fib786 : na, "Fib 0.786", color=color.new(color.gray, 40), linestyle=hline.style_dotted)
// ── Golden pocket 0.5 → 0.618 (highest-probability reaction zone) ──
var box gpBox = na
if showFibs and barstate.islast
box.delete(gpBox)
gpBox := box.new(bar_index - 200, fib500, bar_index + 30, fib618, bgcolor=color.new(color.yellow, 80), border_color=color.new(color.yellow, 40), text="Golden pocket 4049–4070", text_color=color.yellow, text_size=size.small)
// ── Pivot lines (daily + weekly from the brief) ──
dR1 = 4165.96
dP = 4118.67
dS1 = 4079.71
dS2 = 4032.42
dS3 = 3993.46
wR1 = 4094.57
wP = 4027.55
hline(showPivots ? dR1 : na, "D R1 4165.96", color=color.new(color.red, 30), linestyle=hline.style_solid)
hline(showPivots ? dP : na, "D P 4118.67", color=color.new(color.white, 20), linestyle=hline.style_solid)
hline(showPivots ? dS1 : na, "D S1 4079.71", color=color.new(color.lime, 20), linestyle=hline.style_solid)
hline(showPivots ? dS2 : na, "D S2 4032.42", color=color.new(color.lime, 40), linestyle=hline.style_dashed)
hline(showPivots ? dS3 : na, "D S3 3993.46", color=color.new(color.lime, 50), linestyle=hline.style_dotted)
hline(showPivots ? wR1 : na, "W R1 4094.57", color=color.new(color.fuchsia, 30), linestyle=hline.style_dashed)
hline(showPivots ? wP : na, "W P 4027.55", color=color.new(color.aqua, 30), linestyle=hline.style_dashed)
// ── Supply / demand zones (shaded rectangles) ──
var box supply1 = na
var box supply2 = na
var box demand1 = na
var box demand2 = na
if showZones and barstate.islast
box.delete(supply1)
box.delete(supply2)
box.delete(demand1)
box.delete(demand2)
supply1 := box.new(bar_index - 200, dR1, bar_index + 30, 4157.63, bgcolor=color.new(color.red, 78), border_color=color.new(color.red, 50), text="Supply 4157–4166", text_color=color.red, text_size=size.small)
supply2 := box.new(bar_index - 200, dP, bar_index + 30, 4113.06, bgcolor=color.new(color.red, 82), border_color=color.new(color.red, 60), text="Fade zone 4113–4119", text_color=color.red, text_size=size.small)
demand1 := box.new(bar_index - 200, 4079.71, bar_index + 30, 4081.42, bgcolor=color.new(color.green, 70), border_color=color.new(color.green, 40), text="Demand S1 / 4h EMA20", text_color=color.green, text_size=size.small)
demand2 := box.new(bar_index - 200, wP, bar_index + 30, dS2, bgcolor=color.new(color.green, 78), border_color=color.new(color.green, 50), text="Demand 4027–4032", text_color=color.green, text_size=size.small)
// ── Trade ideas (entry boxes, invalidation + target lines, labelled) ──
if showTrades and barstate.islast
// Idea 1: SELL fade into 4118–4166
box.new(bar_index - 60, 4166, bar_index + 60, 4118, bgcolor=color.new(color.red, 80), border_color=color.new(color.red, 30), text="SELL fade — 60%", text_color=color.red, text_size=size.small)
line.new(bar_index - 60, 4165.96, bar_index + 60, 4165.96, color=color.new(color.red, 0), width=2, style=line.style_dashed)
line.new(bar_index - 60, 4032.42, bar_index + 60, 4032.42, color=color.new(color.red, 20), width=2)
label.new(bar_index + 60, 4165.96, "Invalidation 4165.96", color=color.new(color.red, 20), textcolor=color.white, style=label.style_label_left, size=size.small)
label.new(bar_index + 60, 4032.42, "Target 4032.42", color=color.new(color.red, 30), textcolor=color.white, style=label.style_label_left, size=size.small)
// Idea 2: BUY scalp at 4032–4079
box.new(bar_index - 60, 4079, bar_index + 60, 4032, bgcolor=color.new(color.green, 80), border_color=color.new(color.green, 30), text="BUY scalp — 40%", text_color=color.green, text_size=size.small)
line.new(bar_index - 60, 3993.46, bar_index + 60, 3993.46, color=color.new(color.green, 0), width=2, style=line.style_dashed)
line.new(bar_index - 60, 4118.67, bar_index + 60, 4118.67, color=color.new(color.green, 20), width=2)
label.new(bar_index + 60, 3993.46, "Invalidation 3993.46", color=color.new(color.green, 20), textcolor=color.white, style=label.style_label_left, size=size.small)
label.new(bar_index + 60, 4118.67, "Target 4118.67", color=color.new(color.green, 30), textcolor=color.white, style=label.style_label_left, size=size.small)
// Idea 3: SELL trend-continuation on break of S1
box.new(bar_index - 60, 4079, bar_index + 60, 4065, bgcolor=color.new(color.maroon, 78), border_color=color.new(color.maroon, 30), text="SELL breakdown retest — 45%", text_color=color.red, text_size=size.small)
line.new(bar_index - 60, 4113.06, bar_index + 60, 4113.06, color=color.new(color.maroon, 10), width=1, style=line.style_dashed)
line.new(bar_index - 60, 3993.46, bar_index + 60, 3993.46, color=color.new(color.maroon, 20), width=2)
// ── Net-bias banner (corner table) ──
var table banner = table.new(position.top_right, 2, 4, border_width=1)
if barstate.islast
table.cell(banner, 0, 0, "GOLD DESK 2026-07-23", bgcolor=color.new(color.black, 20), text_color=color.white, text_size=size.small)
table.cell(banner, 1, 0, "bias: SELL", bgcolor=color.new(color.red, 30), text_color=color.white, text_size=size.small)
table.cell(banner, 0, 1, "Real yield 10y", bgcolor=color.new(color.black, 40), text_color=color.silver, text_size=size.tiny)
table.cell(banner, 1, 1, "2.39% (+2 bp)", bgcolor=color.new(color.black, 40), text_color=color.white, text_size=size.tiny)
table.cell(banner, 0, 2, "DXY", bgcolor=color.new(color.black, 40), text_color=color.silver, text_size=size.tiny)
table.cell(banner, 1, 2, "101.06 (+0.56%)", bgcolor=color.new(color.black, 40), text_color=color.white, text_size=size.tiny)
table.cell(banner, 0, 3, "Fed Jul 29", bgcolor=color.new(color.black, 40), text_color=color.silver, text_size=size.tiny)
table.cell(banner, 1, 3, "hold 61 / hike 39", bgcolor=color.new(color.black, 40), text_color=color.white, text_size=size.tiny)
{"bias": "SELL",
"ideas": [
{"bias": "SELL", "label": "Fade rally into pivot", "entry_low": 4118, "entry_high": 4166,
"invalidation": 4165.96, "target": 4032.42, "conviction": 60},
{"bias": "BUY", "label": "Oversold scalp at S1/weekly-P", "entry_low": 4032, "entry_high": 4079,
"invalidation": 3993.46, "target": 4118.67, "conviction": 40},
{"bias": "SELL", "label": "Breakdown retest", "entry_low": 4065, "entry_high": 4079,
"invalidation": 4113.06, "target": 3993.46, "conviction": 45}
]}
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-23 — bias SELL", overlay=true, max_lines_count=300, max_labels_count=300, max_boxes_count=100)
// ── Inputs (all levels traced back to the desk note) ──
showFibs = input.bool(true, "Show Fibonacci retracement")
showZones = input.bool(true, "Show supply / demand zones")
showPivots = input.bool(true, "Show pivot lines")
showTrades = input.bool(true, "Show trade ideas")
// ── EMAs ──
ema20 = ta.ema(close, 20)
ema50 = ta.ema(close, 50)
ema200 = ta.ema(close, 200)
plot(ema20, title="EMA20", color=color.new(color.yellow, 0), linewidth=2)
plot(ema50, title="EMA50", color=color.new(color.orange, 0), linewidth=2)
plot(ema200, title="EMA200", color=color.new(color.red, 0), linewidth=2)
// ── Swing anchors (5-session range from the brief) ──
swingHigh = 4157.63
swingLow = 3982.03
swingRng = swingHigh - swingLow
// ── Fibonacci retracement ──
fib236 = swingHigh - swingRng * 0.236
fib382 = swingHigh - swingRng * 0.382
fib500 = swingHigh - swingRng * 0.500
fib618 = swingHigh - swingRng * 0.618
fib786 = swingHigh - swingRng * 0.786
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, 30), linestyle=hline.style_dotted)
hline(showFibs ? fib500 : na, "Fib 0.500", color=color.new(color.gray, 20), linestyle=hline.style_dashed)
hline(showFibs ? fib618 : na, "Fib 0.618", color=color.new(color.gray, 20), linestyle=hline.style_dashed)
hline(showFibs ? fib786 : na, "Fib 0.786", color=color.new(color.gray, 40), linestyle=hline.style_dotted)
// ── Golden pocket 0.5 → 0.618 (highest-probability reaction zone) ──
var box gpBox = na
if showFibs and barstate.islast
box.delete(gpBox)
gpBox := box.new(bar_index - 200, fib500, bar_index + 30, fib618, bgcolor=color.new(color.yellow, 80), border_color=color.new(color.yellow, 40), text="Golden pocket 4049–4070", text_color=color.yellow, text_size=size.small)
// ── Pivot lines (daily + weekly from the brief) ──
dR1 = 4165.96
dP = 4118.67
dS1 = 4079.71
dS2 = 4032.42
dS3 = 3993.46
wR1 = 4094.57
wP = 4027.55
hline(showPivots ? dR1 : na, "D R1 4165.96", color=color.new(color.red, 30), linestyle=hline.style_solid)
hline(showPivots ? dP : na, "D P 4118.67", color=color.new(color.white, 20), linestyle=hline.style_solid)
hline(showPivots ? dS1 : na, "D S1 4079.71", color=color.new(color.lime, 20), linestyle=hline.style_solid)
hline(showPivots ? dS2 : na, "D S2 4032.42", color=color.new(color.lime, 40), linestyle=hline.style_dashed)
hline(showPivots ? dS3 : na, "D S3 3993.46", color=color.new(color.lime, 50), linestyle=hline.style_dotted)
hline(showPivots ? wR1 : na, "W R1 4094.57", color=color.new(color.fuchsia, 30), linestyle=hline.style_dashed)
hline(showPivots ? wP : na, "W P 4027.55", color=color.new(color.aqua, 30), linestyle=hline.style_dashed)
// ── Supply / demand zones (shaded rectangles) ──
var box supply1 = na
var box supply2 = na
var box demand1 = na
var box demand2 = na
if showZones and barstate.islast
box.delete(supply1)
box.delete(supply2)
box.delete(demand1)
box.delete(demand2)
supply1 := box.new(bar_index - 200, dR1, bar_index + 30, 4157.63, bgcolor=color.new(color.red, 78), border_color=color.new(color.red, 50), text="Supply 4157–4166", text_color=color.red, text_size=size.small)
supply2 := box.new(bar_index - 200, dP, bar_index + 30, 4113.06, bgcolor=color.new(color.red, 82), border_color=color.new(color.red, 60), text="Fade zone 4113–4119", text_color=color.red, text_size=size.small)
demand1 := box.new(bar_index - 200, 4079.71, bar_index + 30, 4081.42, bgcolor=color.new(color.green, 70), border_color=color.new(color.green, 40), text="Demand S1 / 4h EMA20", text_color=color.green, text_size=size.small)
demand2 := box.new(bar_index - 200, wP, bar_index + 30, dS2, bgcolor=color.new(color.green, 78), border_color=color.new(color.green, 50), text="Demand 4027–4032", text_color=color.green, text_size=size.small)
// ── Trade ideas (entry boxes, invalidation + target lines, labelled) ──
if showTrades and barstate.islast
// Idea 1: SELL fade into 4118–4166
box.new(bar_index - 60, 4166, bar_index + 60, 4118, bgcolor=color.new(color.red, 80), border_color=color.new(color.red, 30), text="SELL fade — 60%", text_color=color.red, text_size=size.small)
line.new(bar_index - 60, 4165.96, bar_index + 60, 4165.96, color=color.new(color.red, 0), width=2, style=line.style_dashed)
line.new(bar_index - 60, 4032.42, bar_index + 60, 4032.42, color=color.new(color.red, 20), width=2)
label.new(bar_index + 60, 4165.96, "Invalidation 4165.96", color=color.new(color.red, 20), textcolor=color.white, style=label.style_label_left, size=size.small)
label.new(bar_index + 60, 4032.42, "Target 4032.42", color=color.new(color.red, 30), textcolor=color.white, style=label.style_label_left, size=size.small)
// Idea 2: BUY scalp at 4032–4079
box.new(bar_index - 60, 4079, bar_index + 60, 4032, bgcolor=color.new(color.green, 80), border_color=color.new(color.green, 30), text="BUY scalp — 40%", text_color=color.green, text_size=size.small)
line.new(bar_index - 60, 3993.46, bar_index + 60, 3993.46, color=color.new(color.green, 0), width=2, style=line.style_dashed)
line.new(bar_index - 60, 4118.67, bar_index + 60, 4118.67, color=color.new(color.green, 20), width=2)
label.new(bar_index + 60, 3993.46, "Invalidation 3993.46", color=color.new(color.green, 20), textcolor=color.white, style=label.style_label_left, size=size.small)
label.new(bar_index + 60, 4118.67, "Target 4118.67", color=color.new(color.green, 30), textcolor=color.white, style=label.style_label_left, size=size.small)
// Idea 3: SELL trend-continuation on break of S1
box.new(bar_index - 60, 4079, bar_index + 60, 4065, bgcolor=color.new(color.maroon, 78), border_color=color.new(color.maroon, 30), text="SELL breakdown retest — 45%", text_color=color.red, text_size=size.small)
line.new(bar_index - 60, 4113.06, bar_index + 60, 4113.06, color=color.new(color.maroon, 10), width=1, style=line.style_dashed)
line.new(bar_index - 60, 3993.46, bar_index + 60, 3993.46, color=color.new(color.maroon, 20), width=2)
// ── Net-bias banner (corner table) ──
var table banner = table.new(position.top_right, 2, 4, border_width=1)
if barstate.islast
table.cell(banner, 0, 0, "GOLD DESK 2026-07-23", bgcolor=color.new(color.black, 20), text_color=color.white, text_size=size.small)
table.cell(banner, 1, 0, "bias: SELL", bgcolor=color.new(color.red, 30), text_color=color.white, text_size=size.small)
table.cell(banner, 0, 1, "Real yield 10y", bgcolor=color.new(color.black, 40), text_color=color.silver, text_size=size.tiny)
table.cell(banner, 1, 1, "2.39% (+2 bp)", bgcolor=color.new(color.black, 40), text_color=color.white, text_size=size.tiny)
table.cell(banner, 0, 2, "DXY", bgcolor=color.new(color.black, 40), text_color=color.silver, text_size=size.tiny)
table.cell(banner, 1, 2, "101.06 (+0.56%)", bgcolor=color.new(color.black, 40), text_color=color.white, text_size=size.tiny)
table.cell(banner, 0, 3, "Fed Jul 29", bgcolor=color.new(color.black, 40), text_color=color.silver, text_size=size.tiny)
table.cell(banner, 1, 3, "hold 61 / hike 39", bgcolor=color.new(color.black, 40), text_color=color.white, text_size=size.tiny)
— the resident
real yields set the tone, sellers press pivots