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

Gold Rides Rate-Cut Whispers Into A Resistance Wall

Spot ripped 2.57% intraday to test the 4,188 session high on softer DXY and cooling hike bets, but it did so from BELOW the daily EMA50 and EMA200 — this is a countertrend rally into a resistance cluster, not a fresh leg. Real yields ticked up a basis point, Fed-funds still price a 76% July hold with a 24% hike tail, and investing.com explicitly flags 4,232 as the stall zone. Our lean: fade the first failed test of 4,227–4,256, but keep the invalidation tight — with managed money net long 181k contracts and JPMorgan calling $4,500 Q4, this tape does not tolerate stubbornness.


Spot ripped 2.57% intraday to test the 4,188 session high on softer DXY and cooling hike bets, but it did so from BELOW the daily EMA50 and EMA200 — this is a countertrend rally into a resistance cluster, not a fresh leg. Real yields ticked up a basis point, Fed-funds still price a 76% July hold with a 24% hike tail, and investing.com explicitly flags 4,232 as the stall zone. Our lean: fade the first failed test of 4,227–4,256, but keep the invalidation tight — with managed money net long 181k contracts and JPMorgan calling $4,500 Q4, this tape does not tolerate stubbornness.

The session

Spot PAXG prints 4,169.21 as of 09:51 UTC, up 2.57% on the day and 3.87% on the week, having pushed a session range of 4,057.44 to 4,188.74. The 130-dollar rip was fed by two things visible in the brief: DXY down 0.67% to 100.80 (the -0.51 30-day correlation doing exactly what it says on the tin) and, per investing.com's own wire, "TSX futures point higher as easing Fed rate hike bets boost gold" plus a headline calling out a "positive week after soft jobs data cools rate hike bets." Kitco has the spot market closed on the US session — this is a July 4 holiday tape and liquidity is a risk factor by itself.

The push stopped almost exactly under 4,188. Investing.com's own live-levels piece for today reads "Gold stalls below $4,232 resistance cluster." That number is not from us; that's their headline. It matters because 4,232 sits between our daily R2 (4,227.08) and weekly R1 (4,256.78) — a real confluence, not a made-up line.

COMEX GC front-month is 4,188.50 versus PAXG spot 4,169.21, a +0.46% futures premium — the normal contango you'd expect, not a stress signal.

Multi-timeframe read

  • 15m: RSI 66.5, price +3.1 above EMA20, +3.5 above EMA50, MACD histogram +0.68 but rolling (↓). Bought-and-stalling.
  • 1h: RSI 60, price +5.1 above EMA20 and +27.0 above EMA50, MACD histogram negative (-2.06) but rising (↑). Momentum re-building after a pullback.
  • 4h: RSI 66.6, price +44.6 above EMA20, MACD histogram +4.95 and ticking down. Strong but overextended.
  • 1d: RSI 49.7, price +31.2 above EMA20 but -110.2 BELOW EMA50 (4,279.46) and -278.0 BELOW EMA200 (4,447.24), MACD histogram +22.02 and rising.

Agreement: intraday-through-4h all lean up. Divergence: the daily still has the broader trend rolled over — the EMA50 sits ~110 points above spot and the EMA200 ~278 above. This is a bounce inside a bigger correction, not a fresh breakout. Investing.com's automated aggregate reads "Neutral" on the day despite Strong Buy MAs (12 buy / 0 sell) and Buy on both their RSI and MACD tallies — the neutral tag is doing the same reconciliation we are. Divergence noted: their component reads are more bullish than their headline; we're closer to their headline.

Macro frame

Real yields first. US 10y TIPS sits at 2.26%, up one basis point day-over-day (July 2 print — Treasury.gov). That's a modest headwind for gold — real yields are THE primary driver — but a single basis point does not explain a 2.57% rally. Breakevens flat at 2.23%. Nominal 10y at 4.49% (+1 bp), reconciling cleanly (2.26 real + 2.23 breakeven ≈ 4.49 nominal). So today's up-move is NOT a real-yield story.

Fed path. Fed-funds futures for the July 29 FOMC price hold at 76%, hike at 24%, cut 0%. That's a hawkish-neutral distribution — a 24% hike tail is not trivial. If incoming data (Bloomberg/Reuters flagged "soft jobs data") continues to shift the tail from hike-side to cut-side, real yields fall and gold gets the tailwind it's already trying to price. If instead a strong print re-arms the hike tail, real yields rip and gold takes a body-shot.

DXY. 100.80 intraday, -0.67% on the day and -0.55% on the week, but the daily still holds above EMA20 (+0.2), EMA50 (+0.9), and EMA200 (+1.9). 1h and 4h RSI in the high-30s to low-40s — DXY is oversold intraday but its daily trend has not broken. That means the gold tailwind may be running on a rubber band that snaps back.

Cross-asset. GVZ at 26.00 is elevated — the market is paying up for gold optionality, consistent with the JPMorgan $4,500 Q4 call making the wires. Gold/silver ratio 66.4 with silver at $62.81 is a benign PM regime — silver participating means this isn't a defensive gold bid alone. WTI $68.78 modestly supportive of inflation-hedge flow. BTC $62,428 up 1.5% — "digital gold" also bid, so this is broad reflation, not gold-specific. VIX is missing from the snapshot ("nan") — can't read equity risk tone this print; noted as a data gap.

Non-US CB colour. From Bloomberg over the last 48 hours: Nagel "stresses need for vigilance" at next rate decision; Lagarde tells Les Echos the June rate hike was "the right choice"; Moulin says the ECB is "in a good position after June hike." That's a coordinated hawkish-ECB chorus. A hawkish ECB relative to a hold-mode Fed compresses the dollar (EUR strength) — this is arguably a bigger part of today's DXY weakness than anything the Fed did.

COT. As of June 23: managed money net long +181,339 (L 217k / S 36k), commercials net short -205,404. Speculators heavy long, dealers heavy short — a familiar setup and one that says any macro disappointment brings fast liquidation risk on the spec side.

Two scenarios

Conviction figures are honest qualitative reads, not back-tested probabilities.

Buy setup

  • Trigger: 15m close above 4,197.89 (daily R1) with 1h MACD histogram flipping positive.
  • Invalidation: 4,159.56 (daily pivot).
  • Target: 4,227.08 (daily R2) first, then 4,256.78 (weekly R1) — top of the investing.com "resistance cluster."
  • Conviction: 40%.
  • Rationale: Momentum on 15m/1h/4h is up, DXY is soft, hike bets are cooling per the wire. But we're buying INTO the 4,232 cluster investing.com just called out and BELOW the daily EMA50 — the reward-to-risk on continuation is thin. Take the first target and move stops.

Sell setup

  • Trigger: 15m rejection wick into 4,227–4,256 (daily R2 through weekly R1) with 1h RSI failing at 60 and MACD histogram rolling.
  • Invalidation: 4,265.41 (daily R3) — above that, we're in breakout land, not resistance test.
  • Target: 4,130.37 (daily S1) as first take, 4,100.67 (weekly pivot) as extension.
  • Conviction: 55%.
  • Rationale: Daily trend still down (below EMA50 and EMA200), 4h RSI already at 66.6 and MACD histogram rolling, real yields ticked up, hawkish Fed distribution intact, and investing.com is explicitly flagging 4,232 as the stall. Managed-money longs at +181k are fuel if it breaks.

Levels worth marking

  • 4,265.41 — daily R3, above which the breakout is real.
  • 4,256.78 — weekly R1, top of the resistance cluster.
  • 4,227.08 / 4,232 — daily R2 and investing.com's stated stall level.
  • 4,197.89 — daily R1, session breakout trigger.
  • 4,188.74 — session high and last-5-sessions high, first wall.
  • 4,159.56 — daily pivot, session inflection.
  • 4,130.37 — daily S1.
  • 4,100.67 — weekly pivot, must-hold for the bounce structure.
  • 4,092.04 / 4,057.44 — daily S2 and session low.
  • 4,012.61 — weekly S1.
  • Fib retracement of the last-5-sessions swing (3,944.57 → 4,188.74): 0.236 = 4,131.1; 0.382 = 4,095.5; 0.5 = 4,066.7 and 0.618 = 4,037.8 define the golden pocket; 0.786 = 3,996.9.
  • Daily EMA50 at 4,279.46 and EMA200 at 4,447.24 — the trend-restoration lines.

Calendar / catalysts

The pre-fetched ForexFactory block covers the week that just ended (Jun 28 – Jun 30). Notable prints already baked in:

  • Jun 30 · USD CB Consumer Confidence 91.2 vs 94.4 forecast (soft miss — gold-supportive).
  • Jun 30 · USD JOLTS Job Openings 7.59M vs 7.28M forecast (upside beat — mildly gold-negative).
  • Jun 30 · CAD GDP m/m 0.5% vs 0.4% forecast (positive Canada surprise).
  • Jun 30 · EUR German Prelim CPI m/m -0.3% vs 0.0% forecast (disinflation).
  • Jun 29 · EUR ECB President Lagarde speaks (medium impact).
  • Jun 28 · AUD RBA Bullock speaks (medium impact).

The calendar block does NOT include events for the coming week — that data is not in the brief and I won't invent dates. The known marquee event on the horizon is the Jul 29, 2026 FOMC, per the Fed-odds line. US cash markets are closed today for Independence Day.

Sources cited

Onewordnews commodity-sentiment scan (aggregate +0.00, keywords gold/DXY/yields/ECB/Lagarde/CPI/GDP). Bloomberg Markets (Nagel vigilance, Lagarde/Les Echos, Moulin, Fed/ECB divergence). Investing.com gold live-levels ("Gold stalls below $4,232 resistance cluster"), investing.com wire (JPMorgan $4,500 Q4 call; TSX/Fed-rate-hike-bets story; positive week after soft jobs data). Treasury.gov TIPS (10y real yield 2.26%, 07/02 print). CFTC COT (2026-06-23 report). ForexFactory economic calendar. Kitco (holiday-close confirmation).

Desk summary & bias

Gold has rallied 2.57% into a resistance cluster that investing.com explicitly flags at 4,232, from a daily chart still trading 110 points below its EMA50 and 278 points below its EMA200. The primary driver — 10y real yields — moved just +1 bp, so today's move is DXY-and-narrative-driven (soft jobs cooling hike bets, hawkish ECB pushing EUR up), not a real-yield re-rate. Fed-funds still price a 24% hike tail for July 29, which is the fat risk this tape is under-appreciating. Watch 4,227–4,256: the shape of the first test tells you whether this bounce becomes a leg or a lower high.

# Bias Setup Trigger Entry zone Invalidation Target Conviction Why
1 SELL Cluster fade Rejection wick 4,227–4,256 with 1h RSI failing 60 4,227 – 4,256 4,265.41 4,130.37 → 4,100.67 55% Daily trend down, investing.com flags 4,232 stall, 4h overbought, spec longs heavy
2 BUY Breakout continuation 15m close above 4,197.89, 1h MACD hist flips + 4,197 – 4,210 4,159.56 4,227.08 → 4,256.78 40% Multi-TF momentum up, DXY soft, cooling hike bets
3 BUY Golden-pocket reload Tag of fib 0.5–0.618 with 4h RSI < 40 4,037 – 4,067 4,012.61 4,100.67 → 4,159.56 45% Weekly pivot 4,100 shelf, MM COT +181k, JPM $4,500 Q4 call, fib confluence

Net desk bias: NEUTRAL with a fade-the-rip lean.

Weighting: 4h/1h/15m say buy, but the DAILY structure and the macro (real yields +1 bp, Fed 24% hike tail, DXY still above all daily EMAs) do not confirm a new leg — this is a bounce inside a broader corrective phase. The intraday tape is bullish; the desk timeframe is not. We take the fade at the resistance cluster because that's where the two frames disagree most cleanly, but we respect the JPMorgan $4,500 call and the +181k COT long — a deeper flush into the golden pocket at 4,037–4,067 is a BUY, not a sell.

(not financial advice)

//@version=5
indicator("Gold Desk 2026-07-04 — bias NEUTRAL", 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=2)
plot(ema200, "EMA200", color=color.new(color.red, 0), linewidth=2)

// ── Swing anchors (last 5 sessions: 3,944.57 → 4,188.74) ──
swingHigh = 4188.74
swingLow  = 3944.57
swingRange = swingHigh - swingLow
fib236 = swingHigh - 0.236 * swingRange
fib382 = swingHigh - 0.382 * swingRange
fib500 = swingHigh - 0.500 * swingRange
fib618 = swingHigh - 0.618 * swingRange
fib786 = swingHigh - 0.786 * swingRange

// ── Fibonacci retracement lines ──
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_dashed)
hline(fib618, "Fib 0.618", color=color.new(color.gray, 20), linestyle=hline.style_dashed)
hline(fib786, "Fib 0.786", color=color.new(color.gray, 40), linestyle=hline.style_dotted)

// ── Golden pocket (0.5 – 0.618) shaded box ──
if bar_index == last_bar_index
    box.new(bar_index - 120, fib500, bar_index + 30, fib618, bgcolor=color.new(color.yellow, 80), border_color=color.new(color.yellow, 40), text="Golden pocket 4,038–4,067", text_color=color.new(color.yellow, 0), text_size=size.small)

// ── Pivots (daily) ──
hline(4265.41, "Daily R3", color=color.new(color.red, 30))
hline(4227.08, "Daily R2", color=color.new(color.red, 40))
hline(4197.89, "Daily R1", color=color.new(color.red, 60))
hline(4159.56, "Daily P",  color=color.new(color.white, 30))
hline(4130.37, "Daily S1", color=color.new(color.green, 60))
hline(4092.04, "Daily S2", color=color.new(color.green, 40))

// ── Pivots (weekly, dashed) ──
hline(4256.78, "Weekly R1", color=color.new(color.fuchsia, 30), linestyle=hline.style_dashed)
hline(4100.67, "Weekly P",  color=color.new(color.aqua, 30),    linestyle=hline.style_dashed)
hline(4012.61, "Weekly S1", color=color.new(color.fuchsia, 30), linestyle=hline.style_dashed)

// ── Supply zone (resistance cluster 4,227–4,256) ──
if bar_index == last_bar_index
    box.new(bar_index - 120, 4256.78, bar_index + 30, 4227.08, bgcolor=color.new(color.red, 75), border_color=color.new(color.red, 30), text="Supply 4,227–4,256 (investing.com stall)", text_color=color.new(color.red, 0), text_size=size.small)

// ── Demand zone (weekly pivot shelf 4,092–4,101) ──
if bar_index == last_bar_index
    box.new(bar_index - 120, 4100.67, bar_index + 30, 4092.04, bgcolor=color.new(color.green, 75), border_color=color.new(color.green, 30), text="Demand 4,092–4,101 (weekly P shelf)", text_color=color.new(color.green, 0), text_size=size.small)

// ── Trade idea 1: SELL cluster fade (55%) ──
if bar_index == last_bar_index
    box.new(bar_index - 70, 4256.78, bar_index + 50, 4227.08, bgcolor=color.new(color.red, 55), border_color=color.red, text="SELL #1 fade — 55%", text_color=color.white, text_size=size.small)
    line.new(bar_index - 70, 4265.41, bar_index + 50, 4265.41, color=color.red, style=line.style_dashed, width=2)
    line.new(bar_index - 70, 4130.37, bar_index + 50, 4130.37, color=color.new(color.red, 20), style=line.style_dotted, width=2)
    label.new(bar_index + 50, 4265.41, "Inv 4,265.41", color=color.red, textcolor=color.white, style=label.style_label_left, size=size.small)
    label.new(bar_index + 50, 4130.37, "Tgt 4,130.37", color=color.new(color.red, 30), textcolor=color.white, style=label.style_label_left, size=size.small)

// ── Trade idea 2: BUY breakout continuation (40%) ──
if bar_index == last_bar_index
    box.new(bar_index - 70, 4210.00, bar_index + 50, 4197.89, bgcolor=color.new(color.green, 55), border_color=color.green, text="BUY #2 breakout — 40%", text_color=color.white, text_size=size.small)
    line.new(bar_index - 70, 4159.56, bar_index + 50, 4159.56, color=color.green, style=line.style_dashed, width=2)
    line.new(bar_index - 70, 4256.78, bar_index + 50, 4256.78, color=color.new(color.green, 20), style=line.style_dotted, width=2)
    label.new(bar_index + 50, 4159.56, "Inv 4,159.56", color=color.green, textcolor=color.white, style=label.style_label_left, size=size.small)

// ── Trade idea 3: BUY golden-pocket reload (45%) ──
if bar_index == last_bar_index
    box.new(bar_index - 70, 4066.65, bar_index + 50, 4037.84, bgcolor=color.new(color.lime, 55), border_color=color.lime, text="BUY #3 GP reload — 45%", text_color=color.white, text_size=size.small)
    line.new(bar_index - 70, 4012.61, bar_index + 50, 4012.61, color=color.lime, style=line.style_dashed, width=2)
    line.new(bar_index - 70, 4159.56, bar_index + 50, 4159.56, color=color.new(color.lime, 20), style=line.style_dotted, width=2)
    label.new(bar_index + 50, 4012.61, "Inv 4,012.61", color=color.lime, textcolor=color.black, style=label.style_label_left, size=size.small)

// ── Callouts on key structural levels ──
if bar_index == last_bar_index
    label.new(bar_index + 25, 4188.74, "Session high 4,188.74", color=color.new(color.blue, 0), textcolor=color.white, style=label.style_label_left, size=size.small)
    label.new(bar_index + 25, 4256.78, "Weekly R1 4,256.78",   color=color.new(color.fuchsia, 20), textcolor=color.white, style=label.style_label_left, size=size.small)
    label.new(bar_index + 25, 4100.67, "Weekly P 4,100.67",    color=color.new(color.aqua, 20),    textcolor=color.white, style=label.style_label_left, size=size.small)
    label.new(bar_index + 25, 4159.56, "Daily P 4,159.56",     color=color.new(color.gray, 20),    textcolor=color.white, style=label.style_label_left, size=size.small)

// ── Net-bias banner (top-right) ──
var table biasTable = table.new(position.top_right, 2, 5, border_width=1)
if bar_index == last_bar_index
    table.cell(biasTable, 0, 0, "Gold Desk 2026-07-04", bgcolor=color.new(color.black, 0),  text_color=color.yellow, text_size=size.normal)
    table.cell(biasTable, 1, 0, "NEUTRAL / fade rip",   bgcolor=color.new(color.orange, 20), text_color=color.white,  text_size=size.normal)
    table.cell(biasTable, 0, 1, "10y real yield",       bgcolor=color.new(color.gray, 60),   text_color=color.white,  text_size=size.small)
    table.cell(biasTable, 1, 1, "2.26% (+1 bp)",        bgcolor=color.new(color.gray, 60),   text_color=color.white,  text_size=size.small)
    table.cell(biasTable, 0, 2, "Fed Jul 29",           bgcolor=color.new(color.gray, 60),   text_color=color.white,  text_size=size.small)
    table.cell(biasTable, 1, 2, "Hold 76% / Hike 24%",  bgcolor=color.new(color.gray, 60),   text_color=color.white,  text_size=size.small)
    table.cell(biasTable, 0, 3, "DXY",                  bgcolor=color.new(color.gray, 60),   text_color=color.white,  text_size=size.small)
    table.cell(biasTable, 1, 3, "100.80 (-0.67%)",      bgcolor=color.new(color.gray, 60),   text_color=color.white,  text_size=size.small)
    table.cell(biasTable, 0, 4, "Key cluster",          bgcolor=color.new(color.red, 40),    text_color=color.white,  text_size=size.small)
    table.cell(biasTable, 1, 4, "4,227 – 4,256",        bgcolor=color.new(color.red, 40),    text_color=color.white,  text_size=size.small)
{"bias": "NEUTRAL",
 "ideas": [
   {"bias": "SELL", "label": "Cluster fade", "entry_low": 4227.08, "entry_high": 4256.78,
    "invalidation": 4265.41, "target": 4130.37, "conviction": 55},
   {"bias": "BUY", "label": "Breakout continuation", "entry_low": 4197.89, "entry_high": 4210.00,
    "invalidation": 4159.56, "target": 4256.78, "conviction": 40},
   {"bias": "BUY", "label": "Golden-pocket reload", "entry_low": 4037.84, "entry_high": 4066.65,
    "invalidation": 4012.61, "target": 4159.56, "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-04 — bias NEUTRAL", 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=2)
plot(ema200, "EMA200", color=color.new(color.red, 0), linewidth=2)

// ── Swing anchors (last 5 sessions: 3,944.57 → 4,188.74) ──
swingHigh = 4188.74
swingLow  = 3944.57
swingRange = swingHigh - swingLow
fib236 = swingHigh - 0.236 * swingRange
fib382 = swingHigh - 0.382 * swingRange
fib500 = swingHigh - 0.500 * swingRange
fib618 = swingHigh - 0.618 * swingRange
fib786 = swingHigh - 0.786 * swingRange

// ── Fibonacci retracement lines ──
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_dashed)
hline(fib618, "Fib 0.618", color=color.new(color.gray, 20), linestyle=hline.style_dashed)
hline(fib786, "Fib 0.786", color=color.new(color.gray, 40), linestyle=hline.style_dotted)

// ── Golden pocket (0.5 – 0.618) shaded box ──
if bar_index == last_bar_index
    box.new(bar_index - 120, fib500, bar_index + 30, fib618, bgcolor=color.new(color.yellow, 80), border_color=color.new(color.yellow, 40), text="Golden pocket 4,038–4,067", text_color=color.new(color.yellow, 0), text_size=size.small)

// ── Pivots (daily) ──
hline(4265.41, "Daily R3", color=color.new(color.red, 30))
hline(4227.08, "Daily R2", color=color.new(color.red, 40))
hline(4197.89, "Daily R1", color=color.new(color.red, 60))
hline(4159.56, "Daily P",  color=color.new(color.white, 30))
hline(4130.37, "Daily S1", color=color.new(color.green, 60))
hline(4092.04, "Daily S2", color=color.new(color.green, 40))

// ── Pivots (weekly, dashed) ──
hline(4256.78, "Weekly R1", color=color.new(color.fuchsia, 30), linestyle=hline.style_dashed)
hline(4100.67, "Weekly P",  color=color.new(color.aqua, 30),    linestyle=hline.style_dashed)
hline(4012.61, "Weekly S1", color=color.new(color.fuchsia, 30), linestyle=hline.style_dashed)

// ── Supply zone (resistance cluster 4,227–4,256) ──
if bar_index == last_bar_index
    box.new(bar_index - 120, 4256.78, bar_index + 30, 4227.08, bgcolor=color.new(color.red, 75), border_color=color.new(color.red, 30), text="Supply 4,227–4,256 (investing.com stall)", text_color=color.new(color.red, 0), text_size=size.small)

// ── Demand zone (weekly pivot shelf 4,092–4,101) ──
if bar_index == last_bar_index
    box.new(bar_index - 120, 4100.67, bar_index + 30, 4092.04, bgcolor=color.new(color.green, 75), border_color=color.new(color.green, 30), text="Demand 4,092–4,101 (weekly P shelf)", text_color=color.new(color.green, 0), text_size=size.small)

// ── Trade idea 1: SELL cluster fade (55%) ──
if bar_index == last_bar_index
    box.new(bar_index - 70, 4256.78, bar_index + 50, 4227.08, bgcolor=color.new(color.red, 55), border_color=color.red, text="SELL #1 fade — 55%", text_color=color.white, text_size=size.small)
    line.new(bar_index - 70, 4265.41, bar_index + 50, 4265.41, color=color.red, style=line.style_dashed, width=2)
    line.new(bar_index - 70, 4130.37, bar_index + 50, 4130.37, color=color.new(color.red, 20), style=line.style_dotted, width=2)
    label.new(bar_index + 50, 4265.41, "Inv 4,265.41", color=color.red, textcolor=color.white, style=label.style_label_left, size=size.small)
    label.new(bar_index + 50, 4130.37, "Tgt 4,130.37", color=color.new(color.red, 30), textcolor=color.white, style=label.style_label_left, size=size.small)

// ── Trade idea 2: BUY breakout continuation (40%) ──
if bar_index == last_bar_index
    box.new(bar_index - 70, 4210.00, bar_index + 50, 4197.89, bgcolor=color.new(color.green, 55), border_color=color.green, text="BUY #2 breakout — 40%", text_color=color.white, text_size=size.small)
    line.new(bar_index - 70, 4159.56, bar_index + 50, 4159.56, color=color.green, style=line.style_dashed, width=2)
    line.new(bar_index - 70, 4256.78, bar_index + 50, 4256.78, color=color.new(color.green, 20), style=line.style_dotted, width=2)
    label.new(bar_index + 50, 4159.56, "Inv 4,159.56", color=color.green, textcolor=color.white, style=label.style_label_left, size=size.small)

// ── Trade idea 3: BUY golden-pocket reload (45%) ──
if bar_index == last_bar_index
    box.new(bar_index - 70, 4066.65, bar_index + 50, 4037.84, bgcolor=color.new(color.lime, 55), border_color=color.lime, text="BUY #3 GP reload — 45%", text_color=color.white, text_size=size.small)
    line.new(bar_index - 70, 4012.61, bar_index + 50, 4012.61, color=color.lime, style=line.style_dashed, width=2)
    line.new(bar_index - 70, 4159.56, bar_index + 50, 4159.56, color=color.new(color.lime, 20), style=line.style_dotted, width=2)
    label.new(bar_index + 50, 4012.61, "Inv 4,012.61", color=color.lime, textcolor=color.black, style=label.style_label_left, size=size.small)

// ── Callouts on key structural levels ──
if bar_index == last_bar_index
    label.new(bar_index + 25, 4188.74, "Session high 4,188.74", color=color.new(color.blue, 0), textcolor=color.white, style=label.style_label_left, size=size.small)
    label.new(bar_index + 25, 4256.78, "Weekly R1 4,256.78",   color=color.new(color.fuchsia, 20), textcolor=color.white, style=label.style_label_left, size=size.small)
    label.new(bar_index + 25, 4100.67, "Weekly P 4,100.67",    color=color.new(color.aqua, 20),    textcolor=color.white, style=label.style_label_left, size=size.small)
    label.new(bar_index + 25, 4159.56, "Daily P 4,159.56",     color=color.new(color.gray, 20),    textcolor=color.white, style=label.style_label_left, size=size.small)

// ── Net-bias banner (top-right) ──
var table biasTable = table.new(position.top_right, 2, 5, border_width=1)
if bar_index == last_bar_index
    table.cell(biasTable, 0, 0, "Gold Desk 2026-07-04", bgcolor=color.new(color.black, 0),  text_color=color.yellow, text_size=size.normal)
    table.cell(biasTable, 1, 0, "NEUTRAL / fade rip",   bgcolor=color.new(color.orange, 20), text_color=color.white,  text_size=size.normal)
    table.cell(biasTable, 0, 1, "10y real yield",       bgcolor=color.new(color.gray, 60),   text_color=color.white,  text_size=size.small)
    table.cell(biasTable, 1, 1, "2.26% (+1 bp)",        bgcolor=color.new(color.gray, 60),   text_color=color.white,  text_size=size.small)
    table.cell(biasTable, 0, 2, "Fed Jul 29",           bgcolor=color.new(color.gray, 60),   text_color=color.white,  text_size=size.small)
    table.cell(biasTable, 1, 2, "Hold 76% / Hike 24%",  bgcolor=color.new(color.gray, 60),   text_color=color.white,  text_size=size.small)
    table.cell(biasTable, 0, 3, "DXY",                  bgcolor=color.new(color.gray, 60),   text_color=color.white,  text_size=size.small)
    table.cell(biasTable, 1, 3, "100.80 (-0.67%)",      bgcolor=color.new(color.gray, 60),   text_color=color.white,  text_size=size.small)
    table.cell(biasTable, 0, 4, "Key cluster",          bgcolor=color.new(color.red, 40),    text_color=color.white,  text_size=size.small)
    table.cell(biasTable, 1, 4, "4,227 – 4,256",        bgcolor=color.new(color.red, 40),    text_color=color.white,  text_size=size.small)
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

bounce respected, cluster not yet believed