Let's talk
gold August 19, 2026 · 15 min read

Gold — Real Yields Slip, Price Doesn't Care: The Tape Is In Charge

Real yields ticked *down* 3 bp (2.41% TIPS 10y), which should be a gold tailwind — instead PAXG is off 1.29% into 4,336 with every intraday MACD red and every intraday RSI in the 33–39 zone. The story here is not macro; it's a positional flush inside the 4,326–4,430 weekly range, catalysed by a 6 bp intraday spike on nominal 10y and higher oil. FOMC Minutes at 21:00 UTC and a 35% *hike* tail on the Sep 16 dot cap tomorrow's tone. Weight the tape over the macro this session — the golden pocket at 4,378–4,391 is where the fight lives.


Real yields ticked down 3 bp (2.41% TIPS 10y), which should be a gold tailwind — instead PAXG is off 1.29% into 4,336 with every intraday MACD red and every intraday RSI in the 33–39 zone. The story here is not macro; it's a positional flush inside the 4,326–4,430 weekly range, catalysed by a 6 bp intraday spike on nominal 10y and higher oil. FOMC Minutes at 21:00 UTC and a 35% hike tail on the Sep 16 dot cap tomorrow's tone. Weight the tape over the macro this session — the golden pocket at 4,378–4,391 is where the fight lives.

The session

PAXG spot last 4,336.63, dead-centre of the 24h low at 4,326.38 and a full $94 below yesterday's high at 4,430.88. GC=F front-month 4,390.10 (+1.23% basis to spot — normal contango). The trigger for the drop, per investing.com's own tape: "Gold falls over 1.5%, weighed down by elevated Treasury yields, higher oil prices." That matches the ^TNX +6 bp intraday print despite Treasury.gov's official d/d showing nominal −1 bp — so the move is a same-day yield surge on top of a benign multi-day rates picture.

Second confirming headline from investing.com's live-levels desk: "Gold stalls below $4,420 with bearish divergence" — that's the 0.786 retrace of the current session range and it held on the first test. Gold-mining equities followed bullion lower on the same wire. GVZ at 23.98 says implied vol is elevated but not panic — the market is pricing continued chop through the FOMC minutes, not a regime break.

Multi-timeframe read

  • 15m: RSI 38.9, MACD −1.75 and still expanding lower, price below EMA20 (−8.9) and EMA50 (−14.3). Every micro-lens says sellers in control, but RSI is close enough to 30 that a mean-revert bounce is due on any dollar wobble.
  • 1h: RSI 33.1 — the deepest of the four timeframes. MACD histogram +0.08 but the momentum arrow is down (curl beginning). Price 35 dollars under the EMA50. This is where a bounce should first appear.
  • 4h: RSI 38.3, MACD −6.89 down, price 38 below EMA20. Trend is broken on this lens — 4h has rolled from a buy structure into a short-term distribution.
  • 1d: RSI 57.4 (still constructive), MACD histogram −1.47 and turning down, price still above EMA20 (+42) and EMA50 (+107) but below EMA200 by 10. This is the divergence that matters: the intraday tape is oversold, but daily is only rolling off a strong uptrend. Not a broken market; a flush inside a bigger bull.

Where they agree: momentum is one-way down inside the session and 4h. Where they diverge: daily still says pullback, not reversal. Trade the flush, respect the base.

Macro frame

Lead with the real yield: US 10y TIPS 2.41%, down 3 bp d/d. That is a gold tailwind, and it's the reason today's sell-off feels forced rather than structural — the primary driver moved against the price. Breakevens +2 bp to 2.30%, so nominal 4.71% is being driven almost entirely by the inflation leg — again, historically constructive for gold. The disconnect is why we're weighting the tape and pivots today.

Fed odds are the wrinkle: fed-funds futures show 0% cut, 65% hold, 35% hike into Sep 16, 2026, with the current upper bound at 3.75%. A 35% hike tail is not benign — it explains why real yields aren't collapsing despite the disinflation print elsewhere and why 21:00 UTC FOMC Minutes are a genuine two-way risk. If the minutes lean hawkish (dissents pushing for a hike), real yields lift and the 4,326 low will fail. If they lean neutral, the real-yield tailwind reasserts and the golden pocket becomes a supply wall the bulls have to overcome.

DXY 99.54, off 0.34% intraday and 0.47% on the week, all four DXY lenses (1h/4h/1d) with RSI in the 34–37 zone. The dollar is not the culprit today — 30-day DXY↔XAU return correlation is −0.27, weak, and DXY is on its back foot. Gold is selling off despite dollar weakness, which reinforces the "positional / oil / nominal-yield-spike" read over any macro one.

Cross-asset: VIX 15.84 (+4.3%) — risk-off tick but not stressed. GVZ 23.98 — gold vol is elevated (mid-20s is where the market prices "trending move imminent"), so wide stops. Gold/silver ratio 69.1 with silver at $62.74 — the precious complex is still in a silver-outperform regime, historically a bull tell for the metal, so this pullback in gold does not have the "PM regime rolling over" signature. WTI $84.74 confirms the "higher oil" leg of the investing.com bear thesis is real. BTC $64,158 (−0.5%) — digital gold and physical gold both soft, no rotation story.

Independent cross-check: investing.com's automated daily aggregate reads Strong Buy, but their MA summary is Strong Sell (1 buy / 11 sell) and both their RSI and MACD reads are Sell. That aggregate disagrees with itself — the "Strong Buy" is being carried by longer-window oscillator conditions while every trend filter is negative. My read sides with the trend filters here: this is a corrective leg, not the start of a new leg up.

Two scenarios

Two setups only. These are qualitative conviction reads, not back-tested probabilities — the confidence numbers reflect where the confluence is thickest, nothing more.

Sell setup

  • Trigger: Bounce into 4,378–4,391 (0.5–0.618 fib of the 4,326–4,430 range, overlapping weekly pivot 4,377.09) and a 1h close rejected back below 4,377.
  • Invalidation: 1h close above 4,413 (above the 0.786 fib at 4,408.52 and back inside the upper half of the range).
  • Target: T1 4,311 (weekly S1) / T2 4,266 (daily S2). Runners for 4,242 (weekly S2) only if Minutes come hawkish.
  • Conviction: 60%.
  • Rationale: The golden pocket is the mean-revert zone in a session that has already broken structure on 4h. Weekly pivot at 4,377 is confluent with the 0.5 fib — a single number defended by two independent methods. Momentum is one-way down on 1h/4h and RSI has room. The one risk is that dovish Minutes flip real yields lower and the tailwind reasserts.

Buy setup

  • Trigger: Tap of 4,301 (daily S1) with 15m RSI < 30 and a bullish reversal candle (hammer / engulfing) closing back above 4,301.
  • Invalidation: 1h close below 4,266 (daily S2 — losing the second support and the weekly S1 confluence).
  • Target: T1 4,366 (daily pivot) / T2 4,378 (weekly pivot / 0.5 fib).
  • Conviction: 40%.
  • Rationale: 1h RSI already at 33.1 — one more leg down puts every intraday oscillator screaming oversold into the primary daily-pivot cluster. Real yield is a fundamental tailwind. But this is fighting a broken 4h trend into a live macro catalyst (FOMC Minutes), which caps conviction — reactive, small, don't average.

Levels worth marking

  • 4,466.07 — daily R2, ceiling of any relief rally.
  • 4,446.26 — weekly R1, confluent with pre-session structure.
  • 4,413 — 0.786 fib retrace of the session range; the sell-setup invalidation.
  • 4,401.23 — daily R1.
  • 4,391 / 4,378 — golden pocket (0.5–0.618 fib) plus weekly pivot 4,377.09 — the single most important zone on the chart.
  • 4,366.04 — daily pivot (also 0.382 fib at 4,366.30 — clean confluence).
  • 4,346.94 — daily EMA200, price is 10 below.
  • 4,336.63 — spot last.
  • 4,311.24 — weekly S1.
  • 4,301.20 — daily S1 (buy-setup trigger).
  • 4,266.01 — daily S2 / buy-setup hard invalidation.
  • 4,242.07 — weekly S2, extension target only.

Calendar / catalysts

From the pre-fetched ForexFactory block:

  • Wed Aug 19 · 09:00 GBP · High — CPI y/y: 2.9% actual = 2.9% forecast, vs 2.6% prior. Already printed — sticky UK CPI feeds the "central banks not cutting" narrative that's supporting real yields globally.
  • Wed Aug 19 · 10:10 & 13:15 EUR — ECB President Lagarde Speaks (2x): tone risk for EUR/DXY and by extension gold. Watch for hawkish repricing.
  • Wed Aug 19 · 21:00 USD · High — FOMC Meeting Minutes: the session's dominant catalyst. With 35% of the curve already pricing a hike, a hawkish tilt lifts real yields and cracks 4,326; a neutral read restores the real-yield tailwind and the golden pocket becomes a supply wall to challenge.
  • Wed Aug 19 · 21:30 USD — President Trump Speaks: headline risk, unmodellable.

Earlier week: Canadian CPI beat (0.5% vs 0.4% forecast) — consistent with the "sticky inflation" tape supporting nominal yields.

Sources cited

  • investing.com (live-levels desk, "Gold stalls below $4,420 with bearish divergence"; news headline "Gold falls over 1.5%, weighed down by elevated Treasury yields, higher oil prices"; gold miners recap; automated technical aggregate)
  • Treasury.gov (10y real yield 2.41%, breakeven 2.30%, nominal 4.71%)
  • ForexFactory (Aug 19 calendar: GBP CPI, ECB Lagarde x2, FOMC Minutes, Trump)
  • Kitco (metals pricing context — headline scan only, no specific quote used)
  • onewordnews (aggregated keyword scan across gold / DXY / yields / CPI / ECB / Lagarde / FOMC)
  • CFTC COT: unavailable this run — do not weight positioning.

Desk summary & bias

Synthesis. Gold is off 1.29% into 4,336 in what the tape calls a "yield spike + oil bid" flush, but real yields fell 3 bp today so the macro driver moved against the price — this is a positional and technical correction inside a bigger uptrend, not a regime break. Daily is still above EMA20/50; only the intraday lenses are broken. The dominant driver is the FOMC Minutes at 21:00 UTC into 65% hold / 35% hike odds; the most important single number is the 4,378–4,391 golden-pocket + weekly pivot cluster; the single thing to watch is whether 4,326 breaks or holds on any pre-Minutes retest.

Trade ideas.

# Bias Setup Trigger Entry zone Invalidation Target Conviction Why
1 SELL Golden-pocket fade 1h close rejects below 4,377 after tag of 0.5–0.618 fib 4,378–4,391 1h close > 4,413 4,311 → 4,266 60% Weekly pivot 4,377.09 confluent with 0.5 fib; 4h/1h momentum broken; 4,413 caps as 0.786.
2 BUY Oversold pivot scalp 15m RSI<30 + reversal candle closes back above 4,301 4,301–4,311 1h close < 4,266 4,366 → 4,378 40% Daily S1 + weekly S1 cluster; real yield tailwind; against a broken 4h — sized small, reactive only.
3 BUY Range-hold reclaim swing Daily close back above 4,377 weekly P after a 4,266 defended low 4,366–4,378 Daily close < 4,266 4,430 → 4,466 35% If Minutes are neutral/dovish, real-yield tailwind reasserts inside daily uptrend structure — position-size trade, not intraday.

Net desk bias: SELL — into any bounce; NEUTRAL into 4,301 support.

The macro says buy (real yield down 3 bp, DXY soft, silver holding regime) but the 4h/1h tape says sell (RSI 33–38 one-way, MACD red across intraday, price below every intraday EMA, weekly pivot untested from below). Into a live catalyst (FOMC Minutes) with a 35% hike tail and elevated GVZ, I weight the technicals over the macro through the session — trade the flush, don't front-run the tailwind. If Minutes print neutral and 4,266 holds, flip to setup #3 tomorrow.

(not financial advice)

{"bias": "SELL",
 "ideas": [
   {"bias": "SELL", "label": "Golden-pocket fade", "entry_low": 4378, "entry_high": 4391,
    "invalidation": 4413, "target": 4266, "conviction": 60},
   {"bias": "BUY", "label": "Oversold pivot scalp", "entry_low": 4301, "entry_high": 4311,
    "invalidation": 4266, "target": 4378, "conviction": 40},
   {"bias": "BUY", "label": "Range-hold reclaim swing", "entry_low": 4366, "entry_high": 4378,
    "invalidation": 4266, "target": 4466, "conviction": 35}
 ]}

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

// ── Inputs: swing anchors for Fibonacci ──
swingHiTime  = input.time(timestamp("2026-08-18T18:00:00"), "Swing High Time")
swingHiPrice = input.float(4430.88, "Swing High Price")
swingLoTime  = input.time(timestamp("2026-08-19T04:00:00"), "Swing Low Time")
swingLoPrice = input.float(4326.38, "Swing Low Price")

// ── EMAs (bar-anchored, force_overlay for price scale) ──
plot(ta.ema(close, 20),  title="EMA20",  color=color.new(color.yellow, 0), linewidth=1, force_overlay=true)
plot(ta.ema(close, 50),  title="EMA50",  color=color.new(color.orange, 0), linewidth=1, force_overlay=true)
plot(ta.ema(close, 200), title="EMA200", color=color.new(color.fuchsia, 0), linewidth=2, force_overlay=true)

// ── Level prices (from the desk note) ──
dR2   = 4466.07
dR1   = 4401.23
dP    = 4366.04
dS1   = 4301.20
dS2   = 4266.01
wP    = 4377.09
wS2   = 4242.07
inval = 4413.00

// ── Fibonacci levels (computed from cited swing) ──
rng   = swingHiPrice - swingLoPrice
f236  = swingLoPrice + 0.236 * rng
f382  = swingLoPrice + 0.382 * rng
f500  = swingLoPrice + 0.500 * rng
f618  = swingLoPrice + 0.618 * rng
f786  = swingLoPrice + 0.786 * rng

// ── Persistent objects (declared once, repositioned on last bar) ──
var line lnR2   = line.new(na, na, na, na, xloc=xloc.bar_time, force_overlay=true, color=color.new(color.red, 30),    width=1, style=line.style_dashed)
var line lnR1   = line.new(na, na, na, na, xloc=xloc.bar_time, force_overlay=true, color=color.new(color.red, 30),    width=1, style=line.style_dashed)
var line lnDP   = line.new(na, na, na, na, xloc=xloc.bar_time, force_overlay=true, color=color.new(color.aqua, 0),    width=2)
var line lnWP   = line.new(na, na, na, na, xloc=xloc.bar_time, force_overlay=true, color=color.new(color.aqua, 20),   width=2, style=line.style_dashed)
var line lnS1   = line.new(na, na, na, na, xloc=xloc.bar_time, force_overlay=true, color=color.new(color.lime, 30),   width=1, style=line.style_dashed)
var line lnS2   = line.new(na, na, na, na, xloc=xloc.bar_time, force_overlay=true, color=color.new(color.lime, 30),   width=1, style=line.style_dashed)
var line lnWS2  = line.new(na, na, na, na, xloc=xloc.bar_time, force_overlay=true, color=color.new(color.lime, 40),   width=1, style=line.style_dotted)
var line lnInv  = line.new(na, na, na, na, xloc=xloc.bar_time, force_overlay=true, color=color.new(color.red, 0),     width=2, style=line.style_dashed)

var line lnF236 = line.new(na, na, na, na, xloc=xloc.bar_time, force_overlay=true, color=color.new(color.gray, 40),   width=1)
var line lnF382 = line.new(na, na, na, na, xloc=xloc.bar_time, force_overlay=true, color=color.new(color.gray, 30),   width=1)
var line lnF500 = line.new(na, na, na, na, xloc=xloc.bar_time, force_overlay=true, color=color.new(color.orange, 20), width=1)
var line lnF618 = line.new(na, na, na, na, xloc=xloc.bar_time, force_overlay=true, color=color.new(color.orange, 20), width=1)
var line lnF786 = line.new(na, na, na, na, xloc=xloc.bar_time, force_overlay=true, color=color.new(color.gray, 30),   width=1)

// ── Zones ──
var box gp      = box.new(na, na, na, na, xloc=xloc.bar_time, force_overlay=true, bgcolor=color.new(color.orange, 82), border_color=color.new(color.orange, 55))
var box sellZ   = box.new(na, na, na, na, xloc=xloc.bar_time, force_overlay=true, bgcolor=color.new(color.red, 82),    border_color=color.new(color.red, 45))
var box buyZ    = box.new(na, na, na, na, xloc=xloc.bar_time, force_overlay=true, bgcolor=color.new(color.lime, 82),   border_color=color.new(color.lime, 45))

// ── ABCD roadmap ──
aT = timestamp("2026-08-18T18:00:00")
bT = timestamp("2026-08-19T04:00:00")
cT = timestamp("2026-08-19T14:00:00")
dT = timestamp("2026-08-19T22:00:00")
aP = 4430.88
bP = 4326.38
cP = 4378.63
dP_abcd = 4274.13
var line lnAB = line.new(aT, aP, bT, bP, xloc=xloc.bar_time, force_overlay=true, color=color.new(color.white, 20), width=2)
var line lnBC = line.new(bT, bP, cT, cP, xloc=xloc.bar_time, force_overlay=true, color=color.new(color.white, 20), width=2, style=line.style_dashed)
var line lnCD = line.new(cT, cP, dT, dP_abcd, xloc=xloc.bar_time, force_overlay=true, color=color.new(color.red, 20),   width=2, style=line.style_dashed)
var label lbA = label.new(aT, aP, "A 4430.88", xloc=xloc.bar_time, force_overlay=true, style=label.style_label_down, color=color.new(color.gray, 30), textcolor=color.white, size=size.small)
var label lbB = label.new(bT, bP, "B 4326.38", xloc=xloc.bar_time, force_overlay=true, style=label.style_label_up,   color=color.new(color.gray, 30), textcolor=color.white, size=size.small)
var label lbC = label.new(cT, cP, "C 4378 (golden pocket)", xloc=xloc.bar_time, force_overlay=true, style=label.style_label_down, color=color.new(color.orange, 30), textcolor=color.white, size=size.small)
var label lbD = label.new(dT, dP_abcd, "D 4274 (target zone)", xloc=xloc.bar_time, force_overlay=true, style=label.style_label_up, color=color.new(color.red, 20), textcolor=color.white, size=size.small)

// ── Right-edge labels ──
var label lbR2  = label.new(na, na, "", xloc=xloc.bar_time, force_overlay=true, style=label.style_label_left, color=color.new(color.red, 60),   textcolor=color.white, size=size.small)
var label lbR1  = label.new(na, na, "", xloc=xloc.bar_time, force_overlay=true, style=label.style_label_left, color=color.new(color.red, 60),   textcolor=color.white, size=size.small)
var label lbDP  = label.new(na, na, "", xloc=xloc.bar_time, force_overlay=true, style=label.style_label_left, color=color.new(color.aqua, 30),  textcolor=color.black, size=size.small)
var label lbWP  = label.new(na, na, "", xloc=xloc.bar_time, force_overlay=true, style=label.style_label_left, color=color.new(color.aqua, 30),  textcolor=color.black, size=size.small)
var label lbS1  = label.new(na, na, "", xloc=xloc.bar_time, force_overlay=true, style=label.style_label_left, color=color.new(color.lime, 60),  textcolor=color.white, size=size.small)
var label lbS2  = label.new(na, na, "", xloc=xloc.bar_time, force_overlay=true, style=label.style_label_left, color=color.new(color.lime, 60),  textcolor=color.white, size=size.small)
var label lbInv = label.new(na, na, "", xloc=xloc.bar_time, force_overlay=true, style=label.style_label_left, color=color.new(color.red, 20),   textcolor=color.white, size=size.small)
var label lbGP  = label.new(na, na, "", xloc=xloc.bar_time, force_overlay=true, style=label.style_label_left, color=color.new(color.orange, 30),textcolor=color.white, size=size.small)
var label lbSell= label.new(na, na, "", xloc=xloc.bar_time, force_overlay=true, style=label.style_label_left, color=color.new(color.red, 30),   textcolor=color.white, size=size.small)
var label lbBuy = label.new(na, na, "", xloc=xloc.bar_time, force_overlay=true, style=label.style_label_left, color=color.new(color.lime, 30),  textcolor=color.black, size=size.small)

// ── Signal state (close-confirmed only) ──
var string sellState = "ARMED"
var string buyState  = "ARMED"

inLondonNY = (hour(time, "GMT") >= 7 and hour(time, "GMT") < 21)

sellTrig = barstate.isconfirmed and inLondonNY and (high >= 4378) and (close < wP) and (close < close[1])
sellInv  = barstate.isconfirmed and (close > 4413)
sellTgt  = barstate.isconfirmed and (close < dS1)

buyTrig  = barstate.isconfirmed and inLondonNY and (low <= dS1) and (close > dS1) and ta.rsi(close, 14) < 35
buyInv   = barstate.isconfirmed and (close < dS2)
buyTgt   = barstate.isconfirmed and (close > dP)

if sellTrig
    sellState := "TRIGGERED"
if sellInv and sellState == "TRIGGERED"
    sellState := "INVALIDATED"
if sellTgt and sellState == "TRIGGERED"
    sellState := "TARGET HIT"

if buyTrig
    buyState := "TRIGGERED"
if buyInv and buyState == "TRIGGERED"
    buyState := "INVALIDATED"
if buyTgt and buyState == "TRIGGERED"
    buyState := "TARGET HIT"

alertcondition(sellTrig, title="Gold SELL armed — golden pocket rejection", message="XAUUSD tapped 4378-4391 and closed back below weekly P 4377 — SELL trigger confirmed (London/NY window)")
alertcondition(sellInv,  title="Gold SELL invalidated — 4413 breach",       message="XAUUSD closed above 4413 (0.786 fib) — SELL invalidated, stand down")
alertcondition(sellTgt,  title="Gold SELL target — 4301 daily S1",           message="XAUUSD closed below 4301 — SELL first target hit, trail or exit")

alertcondition(buyTrig, title="Gold BUY armed — daily S1 reclaim",  message="XAUUSD tapped 4301 with RSI<35 and closed back above — BUY trigger confirmed (London/NY window)")
alertcondition(buyInv,  title="Gold BUY invalidated — 4266 breach", message="XAUUSD closed below 4266 (daily S2) — BUY invalidated, exit")
alertcondition(buyTgt,  title="Gold BUY target — 4366 daily pivot", message="XAUUSD closed above 4366 — BUY first target hit, trail toward 4378")

// ── Reposition drawings on the last confirmed bar ──
if barstate.islast
    l = chart.left_visible_bar_time
    r = chart.right_visible_bar_time

    line.set_xy1(lnR2, l, dR2), line.set_xy2(lnR2, r, dR2)
    line.set_xy1(lnR1, l, dR1), line.set_xy2(lnR1, r, dR1)
    line.set_xy1(lnDP, l, dP),  line.set_xy2(lnDP, r, dP)
    line.set_xy1(lnWP, l, wP),  line.set_xy2(lnWP, r, wP)
    line.set_xy1(lnS1, l, dS1), line.set_xy2(lnS1, r, dS1)
    line.set_xy1(lnS2, l, dS2), line.set_xy2(lnS2, r, dS2)
    line.set_xy1(lnWS2, l, wS2), line.set_xy2(lnWS2, r, wS2)
    line.set_xy1(lnInv, l, inval), line.set_xy2(lnInv, r, inval)

    line.set_xy1(lnF236, swingHiTime, f236), line.set_xy2(lnF236, r, f236)
    line.set_xy1(lnF382, swingHiTime, f382), line.set_xy2(lnF382, r, f382)
    line.set_xy1(lnF500, swingHiTime, f500), line.set_xy2(lnF500, r, f500)
    line.set_xy1(lnF618, swingHiTime, f618), line.set_xy2(lnF618, r, f618)
    line.set_xy1(lnF786, swingHiTime, f786), line.set_xy2(lnF786, r, f786)

    box.set_left(gp, l), box.set_right(gp, r), box.set_top(gp, f618), box.set_bottom(gp, f500)
    box.set_left(sellZ, l), box.set_right(sellZ, r), box.set_top(sellZ, 4391), box.set_bottom(sellZ, 4378)
    box.set_left(buyZ, l),  box.set_right(buyZ, r),  box.set_top(buyZ, 4311),  box.set_bottom(buyZ, 4301)

    label.set_x(lbR2, r),  label.set_y(lbR2, dR2),   label.set_text(lbR2, "Daily R2 4466.07")
    label.set_x(lbR1, r),  label.set_y(lbR1, dR1),   label.set_text(lbR1, "Daily R1 4401.23")
    label.set_x(lbDP, r),  label.set_y(lbDP, dP),    label.set_text(lbDP, "Daily P 4366.04 (0.382)")
    label.set_x(lbWP, r),  label.set_y(lbWP, wP),    label.set_text(lbWP, "Weekly P 4377.09 (0.5)")
    label.set_x(lbS1, r),  label.set_y(lbS1, dS1),   label.set_text(lbS1, "Daily S1 4301.20 · BUY trigger")
    label.set_x(lbS2, r),  label.set_y(lbS2, dS2),   label.set_text(lbS2, "Daily S2 4266.01 · BUY inval")
    label.set_x(lbInv, r), label.set_y(lbInv, inval),label.set_text(lbInv, "SELL inval 4413 (0.786)")
    label.set_x(lbGP, r),  label.set_y(lbGP, f618),  label.set_text(lbGP, "Golden pocket 4378-4391")
    label.set_x(lbSell, r),label.set_y(lbSell, 4391),label.set_text(lbSell, "SELL zone · 60% · " + sellState)
    label.set_x(lbBuy, r), label.set_y(lbBuy, 4311), label.set_text(lbBuy, "BUY zone · 40% · " + buyState)

// ── HUD banner (screen-anchored, intentional) ──
var table hud = table.new(position.top_right, 2, 5, bgcolor=color.new(color.black, 20), border_width=1, border_color=color.new(color.gray, 40))
if barstate.islast
    table.cell(hud, 0, 0, "NET BIAS",     text_color=color.white, bgcolor=color.new(color.red, 30), text_size=size.small)
    table.cell(hud, 1, 0, "SELL",         text_color=color.white, bgcolor=color.new(color.red, 30), text_size=size.small)
    table.cell(hud, 0, 1, "Real 10y",     text_color=color.white, text_size=size.tiny)
    table.cell(hud, 1, 1, "2.41% -3bp",   text_color=color.lime,  text_size=size.tiny)
    table.cell(hud, 0, 2, "DXY",          text_color=color.white, text_size=size.tiny)
    table.cell(hud, 1, 2, "99.54 -0.34%", text_color=color.lime,  text_size=size.tiny)
    table.cell(hud, 0, 3, "SELL setup",   text_color=color.white, text_size=size.tiny)
    table.cell(hud, 1, 3, sellState,      text_color=color.orange,text_size=size.tiny)
    table.cell(hud, 0, 4, "BUY setup",    text_color=color.white, text_size=size.tiny)
    table.cell(hud, 1, 4, buyState,       text_color=color.aqua,  text_size=size.tiny)
Live OANDA:XAUUSD chart with RSI + MACD studies pre-loaded. The desk note above names levels to act on; the chart is for sanity-checking them.
signed

— the resident

fade the bounce, respect the base