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

Gold Desk — Sunday Week-Ahead: The 4,110 Line and the CPI Trap

Gold reopens Sunday night pinned to the underside of the weekly pivot with every EMA on every timeframe overhead — a textbook bearish tape into the single most consequential print of the month, Tuesday's June CPI. The real yield (TIPS) tick-up to 2.32% and a Fed strip that assigns *zero* probability to a July cut are the macro anchor; the technicals just echo it. Positioning tells the counter-story: managed money is still net long 194k, which means any drop through 4,024 has fuel underneath it. The read for Asia's first hours is fade-strength-into-4,110, with 4,131 as the line that ends the bearish thesis.


Gold reopens Sunday night pinned to the underside of the weekly pivot with every EMA on every timeframe overhead — a textbook bearish tape into the single most consequential print of the month, Tuesday's June CPI. The real yield (TIPS) tick-up to 2.32% and a Fed strip that assigns zero probability to a July cut are the macro anchor; the technicals just echo it. Positioning tells the counter-story: managed money is still net long 194k, which means any drop through 4,024 has fuel underneath it. The read for Asia's first hours is fade-strength-into-4,110, with 4,131 as the line that ends the bearish thesis.

The session

Spot printed 4,096.51 into Friday's close, mid-range of a tight 4,094.82–4,116.65 Friday session and firmly inside the last five sessions' 4,021.15–4,131.28 band. The intraday tape gave back 0.18% but the week ended essentially flat (+0.06%), which — given the -0.98% monthly drift and the failed 4,150 test that investing.com flagged in its "Gold coils below $4,150 resistance in bearish pennant" piece — reads as consolidation UNDER resistance, not accumulation ABOVE support. Futures (GC=F) at 4,113.70 carry a +0.42% premium to PAXG spot, so the paper market is already pricing the reopen a touch firmer than cash last saw.

The catalyst for Friday's drift lower was the same one that dominates every headline in the brief: CPI Tuesday. Yahoo Finance, StoneX and FXEmpire all led their week-ahead notes with the same triad — "CPI, Fed Chair Warsh and earnings set the tone." Kuwait Times added the Iran re-escalation overlay. Gold isn't leading; it's flinching in front of a wall.

Multi-timeframe read

Bearish alignment, weak momentum, no bottom yet.

  • 15m / 1h: RSI 39 / 38, price 0.9 and 3.4 below EMA20, 2.3 and 6.5 below EMA50. MACD histograms are rising from negative on both — the classic exhaustion-of-sellers signature but not yet a reversal.
  • 4h: RSI 37.8, price 8.6 below EMA20, MACD histogram positive but decelerating downward. This is the timeframe most at risk of a lower-low.
  • 1d: RSI 44.1, price 27 below EMA20, 138 below EMA50, and 326 below EMA200. Daily MACD histogram at +11.63 but rolling over. The daily trend is neutral-to-down; the intermediate is broken.

Where they agree: every EMA on every timeframe is overhead. Where they diverge: the intraday panels are pricing an oversold bounce that the 4h/1d have not yet confirmed. Any Asia rally that stalls before 4,105.08 (the 4h EMA20) is a fade; any push through 4,123.55 (the 1d EMA20) is a mechanical stop-run.

Investing.com's automated aggregate reads daily Sell, but with an internal split — MAs read Strong Buy (12/0), RSI Buy, MACD Buy. That's noise from the length of their MA panel (MA200 sits far below current price on a rally-then-rejection tape). I'm weighting my own oscillator read over their moving-average vote: daily Sell agrees with me; the components underneath don't matter.

Macro frame

Lead with real yields, because real yields are what gold is.

  • US 10y REAL yield (TIPS): 2.32%, +1 bp d/d. A 2.32% real yield is a punitive number for a zero-coupon asset; the last time gold rallied hard, real yields were near 1.7%. The direction — up — is the headwind.
  • Breakeven inflation: 2.24%, +1 bp. Sticky, but stalled. If Tuesday's CPI comes in hot (headline y/y forecast 3.8% vs prev 4.2%), breakevens re-widen and real yields could actually fall even if nominals rally — that's the pivotal cross-current.
  • Nominal 10y: 4.56%, +2 bp (= 2.32 real + 2.24 breakeven, algebra intact).

Fed rate-move odds for July 29 are 0% cut / 65% hold / 35% hike. No easing path is priced. That's a HIGH real-yield regime by construction. Traders Union's cited Daniel Lacalle preview expects headline CPI down to 3.9% in June — a modest disinflation print. Anything above 4.0% headline or 2.9% core opens the door to that 35% hike odds re-pricing higher, which is the direct gold-negative sequence: hike odds up → real yields up → gold down.

DXY at 100.96 sits above every daily EMA, RSI 58, MACD histogram softening but structurally bid. The 30-day DXY↔XAU correlation is -0.66 — meaningful and directional. A DXY through 101.20 pairs with a gold retest of 4,050s.

Cross-asset colour:

  • VIX 15.03 — equity complacency, so no risk-off bid for gold from the S&P panic channel.
  • GVZ 23.95 — moderate gold vol; the options market is NOT pricing a Tuesday tail. CPI is a coiled surprise if it goes either way.
  • Gold/silver 68.1, silver $60.17 — silver has been the leader; ratio at 68 is not stressed. Precious-metals regime is intact, not fracturing.
  • WTI $71.41 — no crude inflation impulse.
  • BTC $64,115 — the "digital gold" bid is not siphoning flow this week.

The one non-tape wildcard is Iran, flagged by both Kuwait Times and "Trading Day: What war? Chip-led rally helps markets ignore on-again, off-again US-Iran truce" on investing.com. The market has priced de-escalation. If a weekend headline flips that, gold gaps up on the reopen and my whole SELL setup starts one number higher.

Two scenarios

Conviction figures below are qualitative desk confidence, NOT back-tested probabilities.

Sell setup — fade the pivot

  • Trigger: rally into 4,110.50 (weekly pivot) / 4,111.94 (daily R1) confluence with rejection wick on 1h close.
  • Invalidation: 1h close above 4,131.28 (last 5-session high) — that also breaks the weekly R1 at 4,199.86 into play.
  • Target: 4,044.71 (0.786 retrace of the 5-session range) primary, 4,023.99 (weekly S1) extended.
  • Conviction: 60%.
  • Rationale: Real yield + Fed hike-odds path + full EMA stack overhead + CPI risk asymmetry (hot print is the market's fear). The weekly pivot at 4,110.50 is where sellers get paid.

Buy setup — oversold catch at the pocket

  • Trigger: tag of 4,063.22–4,076.21 (0.5–0.618 golden pocket of the 5-session range) with 15m MACD histogram positive and 1h RSI below 30.
  • Invalidation: 1h close below 4,021.15 (5-session low) — through there, weekly S2 3,934.63 opens up.
  • Target: 4,110.50 (weekly pivot) primary, 4,123.55 (1d EMA20) extended.
  • Conviction: 40%.
  • Rationale: Counter-trend scalp. Managed-money still net +194k long (CFTC 2026-07-07), so a flush toward 4,024 is where trapped longs cover and reflex bids appear. Not the direction of the trend; the direction of the pain.

Levels worth marking

  • 4,131.28 — last 5-session high, the bearish-thesis kill line.
  • 4,123.55 — 1d EMA20, next mechanical resistance above the pivot.
  • 4,111.94 / 4,110.50 — daily R1 and weekly pivot confluence. The line.
  • 4,105.08 — 4h EMA20, first intraday reaction level.
  • 4,090.55 / 4,080.70 — daily S2/S3, where an intraday flush lands.
  • 4,076.21 – 4,063.22 — 0.5/0.618 golden pocket of the 5-session range.
  • 4,023.99 — weekly S1, structural support and BUY-setup trigger zone.
  • 3,934.63 — weekly S2, tail-risk target if CPI runs hot AND Fed hike odds re-price.

Calendar / catalysts

Straight from ForexFactory:

  • Tue Jul 14 · 11:45am · GBP · BOE Gov Bailey Speaks — DXY cross-current via GBP.
  • Tue Jul 14 · 3:30pm · USD · Core CPI m/m (f 0.2%, p 0.2%)
  • Tue Jul 14 · USD · Core CPI y/y (f 2.8%, p 2.9%)
  • Tue Jul 14 · USD · CPI m/m (f -0.1%, p 0.5%)
  • Tue Jul 14 · USD · CPI y/y (f 3.8%, p 4.2%)the print of the month.
  • Tue Jul 14 · 5:00pm · USD · Fed Chairman Warsh Testifies — 90 minutes after CPI, into a hot-or-cold reaction.
  • Tue Jul 14 · 11:00pm · GBP · BOE Gov Bailey Speaks (second slot).

Tuesday is the whole week. Monday drifts.

Week ahead

Weekend headline check: the tone from onewordnews aggregates to +0.00 — literally flat sentiment across commodity headlines. Iran de-escalation is priced (per investing.com's "What war?" framing); no fresh central-bank weekend-speak has hit the wires per the brief. What is NOT priced: the possibility that Fed Chair Warsh's Tuesday testimony leans overtly hawkish 90 minutes after a hot CPI. That double-tap is the tail scenario, and GVZ at 23.95 says options aren't wearing it.

First 4–12 hours (Sunday 22:00 UTC reopen → Monday London): Asia takes the open with no fresh weekend catalyst and a bearish daily structure. Base case is a drift-up test of the 4,105–4,111 shelf (4h EMA20 + weekly pivot) that gets sold. If Asia is quiet, expect coil under 4,110 into London.

The line that changes the week: 4,131.28. If Asia takes out the 5-session high in the first hour of trade, the SELL thesis dies and 4,199.86 weekly R1 opens on the CPI print. Every other level can be revisited; that one is the switch.

Anchor calendar map: CPI y/y at 3.8% or cooler → probable gold squeeze toward 4,131 → 4,150 → weekly R1 4,199.86. CPI y/y at 4.0%+ → hike odds re-price, real yields grind higher → target zone 4,044 → 4,023 → 3,934 opens. Warsh at 5pm ET is the amplifier in either direction.

Sources cited

Onewordnews (commodity sentiment aggregate), investing.com (gold pennant note; "What war?" cross-asset piece), StoneX / Yahoo Finance / FXEmpire / Kuwait Times (week-ahead framing), Traders Union (Lacalle CPI preview), Treasury.gov (real yield 2.32%), CFTC COT (2026-07-07 positioning), ForexFactory (calendar), CME fed-funds futures (rate-move odds).

Desk summary & bias

Gold sits pinned under the weekly pivot at 4,110.50 with every EMA on every timeframe overhead, a real yield at a punitive 2.32% and firming, and a Fed strip that prices zero July cut and 35% hike. The dominant driver is macro, and the macro says fade rallies until CPI proves otherwise. The single most important thing to watch is the 4,131.28 line at the Sunday reopen: hold it and 4,110 gets sold twice; break it and the whole tape flips into a CPI melt-up.

# Bias Setup Trigger Entry zone Invalidation Target Conviction Why
1 SELL Fade the pivot Rejection wick at weekly pivot / daily R1 4,105.08 – 4,111.94 4,131.28 4,044.71 60% Real yield 2.32% + 35% hike odds + full EMA stack overhead + CPI risk asymmetry
2 BUY Golden-pocket catch 15m MACD flip + 1h RSI <30 in pocket 4,063.22 – 4,076.21 4,021.15 4,110.50 40% Counter-trend scalp; MM net +194k long = trapped-long reflex bid at pocket
3 SELL Weekly S1 breakdown 1h close under 4,021.15 post-CPI 4,021.15 – 4,023.99 4,076.21 3,934.63 45% Tail scenario if CPI ≥ 4.0% and Warsh leans hawkish; weekly S2 opens

Net desk bias: SELL. Real yields firming into a Fed strip that assigns no cut probability is the dominant force; the technical stack (EMAs overhead on 15m through 1d) simply echoes it. DXY structurally bid with a -0.66 correlation to gold reinforces the sell. Where macro and technicals disagree — investing.com's MA sub-panel voting Strong Buy — I'm weighting the macro and the momentum panels. Only a 1h close above 4,131.28 forces me flat.

(not financial advice)

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

// ── EMAs ──
ema20  = ta.ema(close, 20)
ema50  = ta.ema(close, 50)
ema200 = ta.ema(close, 200)
plot(ema20,  "EMA20",  color=color.new(color.yellow, 0), linewidth=2)
plot(ema50,  "EMA50",  color=color.new(color.orange, 0), linewidth=2)
plot(ema200, "EMA200", color=color.new(color.red, 0),    linewidth=2)

// ── Swing anchors for Fibonacci (5-session range) ──
swingHigh = 4131.28
swingLow  = 4021.15
rng       = swingHigh - swingLow

fib236 = swingHigh - 0.236 * rng
fib382 = swingHigh - 0.382 * rng
fib500 = swingHigh - 0.500 * rng
fib618 = swingHigh - 0.618 * rng
fib786 = swingHigh - 0.786 * rng

// ── Fibonacci 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 (filled box) ──
var box goldenPocket = na
if bar_index > 50 and na(goldenPocket)
    goldenPocket := box.new(bar_index - 200, fib500, bar_index + 200, fib618, bgcolor=color.new(color.yellow, 82), border_color=color.new(color.yellow, 50))

// ── Supply / demand zones (thick boxes) ──
var box supplyPivot = na
var box supplyKill  = na
var box demandS1    = na
var box demandS2    = na
if bar_index > 50 and na(supplyPivot)
    supplyPivot := box.new(bar_index - 200, 4111.94, bar_index + 200, 4105.08, bgcolor=color.new(color.red, 80), border_color=color.new(color.red, 40))
    supplyKill  := box.new(bar_index - 200, 4131.28, bar_index + 200, 4123.55, bgcolor=color.new(color.red, 70), border_color=color.new(color.red, 30))
    demandS1    := box.new(bar_index - 200, 4023.99, bar_index + 200, 4021.15, bgcolor=color.new(color.green, 75), border_color=color.new(color.green, 35))
    demandS2    := box.new(bar_index - 200, 3934.63, bar_index + 200, 3920.00, bgcolor=color.new(color.green, 82), border_color=color.new(color.green, 50))

// ── Pivots (the ones that matter) ──
hline(4110.50, "Weekly Pivot", color=color.new(color.white, 20), linestyle=hline.style_solid, linewidth=2)
hline(4199.86, "Weekly R1",    color=color.new(color.red, 30),   linestyle=hline.style_dashed)
hline(4023.99, "Weekly S1",    color=color.new(color.green, 30), linestyle=hline.style_dashed)
hline(3934.63, "Weekly S2",    color=color.new(color.green, 50), linestyle=hline.style_dotted)

// ── Trade idea 1 — SELL fade the pivot ──
var box sellEntry = na
var line sellStop = na
var line sellTgt  = na
if bar_index > 50 and na(sellEntry)
    sellEntry := box.new(bar_index - 30, 4111.94, bar_index + 120, 4105.08, bgcolor=color.new(color.red, 55), border_color=color.red)
    sellStop  := line.new(bar_index - 30, 4131.28, bar_index + 120, 4131.28, color=color.new(color.red, 0), style=line.style_dashed, width=2)
    sellTgt   := line.new(bar_index - 30, 4044.71, bar_index + 120, 4044.71, color=color.new(color.red, 20), style=line.style_solid, width=2)
    label.new(bar_index + 120, 4108.51, "SELL #1 fade-pivot 60%", color=color.new(color.red, 20), textcolor=color.white, style=label.style_label_left, size=size.small)
    label.new(bar_index + 120, 4131.28, "INVALIDATION 4,131.28", color=color.new(color.red, 40), textcolor=color.white, style=label.style_label_left, size=size.tiny)
    label.new(bar_index + 120, 4044.71, "TARGET 4,044.71 (fib .786)", color=color.new(color.red, 40), textcolor=color.white, style=label.style_label_left, size=size.tiny)

// ── Trade idea 2 — BUY golden-pocket catch ──
var box buyEntry = na
var line buyStop = na
var line buyTgt  = na
if bar_index > 50 and na(buyEntry)
    buyEntry := box.new(bar_index - 30, 4076.21, bar_index + 120, 4063.22, bgcolor=color.new(color.green, 55), border_color=color.green)
    buyStop  := line.new(bar_index - 30, 4021.15, bar_index + 120, 4021.15, color=color.new(color.green, 0), style=line.style_dashed, width=2)
    buyTgt   := line.new(bar_index - 30, 4110.50, bar_index + 120, 4110.50, color=color.new(color.green, 20), style=line.style_solid, width=2)
    label.new(bar_index + 120, 4069.71, "BUY #2 pocket-catch 40%", color=color.new(color.green, 20), textcolor=color.white, style=label.style_label_left, size=size.small)
    label.new(bar_index + 120, 4021.15, "INVALIDATION 4,021.15", color=color.new(color.green, 40), textcolor=color.white, style=label.style_label_left, size=size.tiny)

// ── Trade idea 3 — SELL weekly S1 breakdown (tail) ──
var box sell3Entry = na
var line sell3Stop = na
var line sell3Tgt  = na
if bar_index > 50 and na(sell3Entry)
    sell3Entry := box.new(bar_index - 30, 4023.99, bar_index + 120, 4021.15, bgcolor=color.new(color.maroon, 55), border_color=color.maroon)
    sell3Stop  := line.new(bar_index - 30, 4076.21, bar_index + 120, 4076.21, color=color.new(color.maroon, 0), style=line.style_dashed, width=1)
    sell3Tgt   := line.new(bar_index - 30, 3934.63, bar_index + 120, 3934.63, color=color.new(color.maroon, 20), style=line.style_solid, width=2)
    label.new(bar_index + 120, 4022.57, "SELL #3 S1-break 45%", color=color.new(color.maroon, 20), textcolor=color.white, style=label.style_label_left, size=size.small)
    label.new(bar_index + 120, 3934.63, "TARGET 3,934.63 (weekly S2)", color=color.new(color.maroon, 40), textcolor=color.white, style=label.style_label_left, size=size.tiny)

// ── Net-bias banner ──
var table banner = table.new(position.top_right, 2, 4, bgcolor=color.new(color.black, 20), border_width=1, border_color=color.gray)
if barstate.islast
    table.cell(banner, 0, 0, "NET BIAS",     text_color=color.white, bgcolor=color.new(color.red, 30), text_size=size.normal)
    table.cell(banner, 1, 0, "SELL",         text_color=color.white, bgcolor=color.new(color.red, 30), text_size=size.large)
    table.cell(banner, 0, 1, "Pivot line",   text_color=color.silver, text_size=size.small)
    table.cell(banner, 1, 1, "4,110.50",     text_color=color.white,  text_size=size.small)
    table.cell(banner, 0, 2, "Kill line",    text_color=color.silver, text_size=size.small)
    table.cell(banner, 1, 2, "4,131.28",     text_color=color.white,  text_size=size.small)
    table.cell(banner, 0, 3, "Catalyst",     text_color=color.silver, text_size=size.small)
    table.cell(banner, 1, 3, "CPI Tue 3:30", text_color=color.yellow, text_size=size.small)
{"bias": "SELL",
 "ideas": [
   {"bias": "SELL", "label": "Fade the pivot", "entry_low": 4105.08, "entry_high": 4111.94, "invalidation": 4131.28, "target": 4044.71, "conviction": 60},
   {"bias": "BUY", "label": "Golden-pocket catch", "entry_low": 4063.22, "entry_high": 4076.21, "invalidation": 4021.15, "target": 4110.50, "conviction": 40},
   {"bias": "SELL", "label": "Weekly S1 breakdown", "entry_low": 4021.15, "entry_high": 4023.99, "invalidation": 4076.21, "target": 3934.63, "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-12 — bias SELL", overlay=true, max_lines_count=300, max_labels_count=300, max_boxes_count=100)

// ── EMAs ──
ema20  = ta.ema(close, 20)
ema50  = ta.ema(close, 50)
ema200 = ta.ema(close, 200)
plot(ema20,  "EMA20",  color=color.new(color.yellow, 0), linewidth=2)
plot(ema50,  "EMA50",  color=color.new(color.orange, 0), linewidth=2)
plot(ema200, "EMA200", color=color.new(color.red, 0),    linewidth=2)

// ── Swing anchors for Fibonacci (5-session range) ──
swingHigh = 4131.28
swingLow  = 4021.15
rng       = swingHigh - swingLow

fib236 = swingHigh - 0.236 * rng
fib382 = swingHigh - 0.382 * rng
fib500 = swingHigh - 0.500 * rng
fib618 = swingHigh - 0.618 * rng
fib786 = swingHigh - 0.786 * rng

// ── Fibonacci 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 (filled box) ──
var box goldenPocket = na
if bar_index > 50 and na(goldenPocket)
    goldenPocket := box.new(bar_index - 200, fib500, bar_index + 200, fib618, bgcolor=color.new(color.yellow, 82), border_color=color.new(color.yellow, 50))

// ── Supply / demand zones (thick boxes) ──
var box supplyPivot = na
var box supplyKill  = na
var box demandS1    = na
var box demandS2    = na
if bar_index > 50 and na(supplyPivot)
    supplyPivot := box.new(bar_index - 200, 4111.94, bar_index + 200, 4105.08, bgcolor=color.new(color.red, 80), border_color=color.new(color.red, 40))
    supplyKill  := box.new(bar_index - 200, 4131.28, bar_index + 200, 4123.55, bgcolor=color.new(color.red, 70), border_color=color.new(color.red, 30))
    demandS1    := box.new(bar_index - 200, 4023.99, bar_index + 200, 4021.15, bgcolor=color.new(color.green, 75), border_color=color.new(color.green, 35))
    demandS2    := box.new(bar_index - 200, 3934.63, bar_index + 200, 3920.00, bgcolor=color.new(color.green, 82), border_color=color.new(color.green, 50))

// ── Pivots (the ones that matter) ──
hline(4110.50, "Weekly Pivot", color=color.new(color.white, 20), linestyle=hline.style_solid, linewidth=2)
hline(4199.86, "Weekly R1",    color=color.new(color.red, 30),   linestyle=hline.style_dashed)
hline(4023.99, "Weekly S1",    color=color.new(color.green, 30), linestyle=hline.style_dashed)
hline(3934.63, "Weekly S2",    color=color.new(color.green, 50), linestyle=hline.style_dotted)

// ── Trade idea 1 — SELL fade the pivot ──
var box sellEntry = na
var line sellStop = na
var line sellTgt  = na
if bar_index > 50 and na(sellEntry)
    sellEntry := box.new(bar_index - 30, 4111.94, bar_index + 120, 4105.08, bgcolor=color.new(color.red, 55), border_color=color.red)
    sellStop  := line.new(bar_index - 30, 4131.28, bar_index + 120, 4131.28, color=color.new(color.red, 0), style=line.style_dashed, width=2)
    sellTgt   := line.new(bar_index - 30, 4044.71, bar_index + 120, 4044.71, color=color.new(color.red, 20), style=line.style_solid, width=2)
    label.new(bar_index + 120, 4108.51, "SELL #1 fade-pivot 60%", color=color.new(color.red, 20), textcolor=color.white, style=label.style_label_left, size=size.small)
    label.new(bar_index + 120, 4131.28, "INVALIDATION 4,131.28", color=color.new(color.red, 40), textcolor=color.white, style=label.style_label_left, size=size.tiny)
    label.new(bar_index + 120, 4044.71, "TARGET 4,044.71 (fib .786)", color=color.new(color.red, 40), textcolor=color.white, style=label.style_label_left, size=size.tiny)

// ── Trade idea 2 — BUY golden-pocket catch ──
var box buyEntry = na
var line buyStop = na
var line buyTgt  = na
if bar_index > 50 and na(buyEntry)
    buyEntry := box.new(bar_index - 30, 4076.21, bar_index + 120, 4063.22, bgcolor=color.new(color.green, 55), border_color=color.green)
    buyStop  := line.new(bar_index - 30, 4021.15, bar_index + 120, 4021.15, color=color.new(color.green, 0), style=line.style_dashed, width=2)
    buyTgt   := line.new(bar_index - 30, 4110.50, bar_index + 120, 4110.50, color=color.new(color.green, 20), style=line.style_solid, width=2)
    label.new(bar_index + 120, 4069.71, "BUY #2 pocket-catch 40%", color=color.new(color.green, 20), textcolor=color.white, style=label.style_label_left, size=size.small)
    label.new(bar_index + 120, 4021.15, "INVALIDATION 4,021.15", color=color.new(color.green, 40), textcolor=color.white, style=label.style_label_left, size=size.tiny)

// ── Trade idea 3 — SELL weekly S1 breakdown (tail) ──
var box sell3Entry = na
var line sell3Stop = na
var line sell3Tgt  = na
if bar_index > 50 and na(sell3Entry)
    sell3Entry := box.new(bar_index - 30, 4023.99, bar_index + 120, 4021.15, bgcolor=color.new(color.maroon, 55), border_color=color.maroon)
    sell3Stop  := line.new(bar_index - 30, 4076.21, bar_index + 120, 4076.21, color=color.new(color.maroon, 0), style=line.style_dashed, width=1)
    sell3Tgt   := line.new(bar_index - 30, 3934.63, bar_index + 120, 3934.63, color=color.new(color.maroon, 20), style=line.style_solid, width=2)
    label.new(bar_index + 120, 4022.57, "SELL #3 S1-break 45%", color=color.new(color.maroon, 20), textcolor=color.white, style=label.style_label_left, size=size.small)
    label.new(bar_index + 120, 3934.63, "TARGET 3,934.63 (weekly S2)", color=color.new(color.maroon, 40), textcolor=color.white, style=label.style_label_left, size=size.tiny)

// ── Net-bias banner ──
var table banner = table.new(position.top_right, 2, 4, bgcolor=color.new(color.black, 20), border_width=1, border_color=color.gray)
if barstate.islast
    table.cell(banner, 0, 0, "NET BIAS",     text_color=color.white, bgcolor=color.new(color.red, 30), text_size=size.normal)
    table.cell(banner, 1, 0, "SELL",         text_color=color.white, bgcolor=color.new(color.red, 30), text_size=size.large)
    table.cell(banner, 0, 1, "Pivot line",   text_color=color.silver, text_size=size.small)
    table.cell(banner, 1, 1, "4,110.50",     text_color=color.white,  text_size=size.small)
    table.cell(banner, 0, 2, "Kill line",    text_color=color.silver, text_size=size.small)
    table.cell(banner, 1, 2, "4,131.28",     text_color=color.white,  text_size=size.small)
    table.cell(banner, 0, 3, "Catalyst",     text_color=color.silver, text_size=size.small)
    table.cell(banner, 1, 3, "CPI Tue 3:30", text_color=color.yellow, 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

Sellers own the pivot until CPI says otherwise