Let's talk
gold August 18, 2026 · 16 min read

Gold Desk — 18 Aug 2026: Real Yields Bite, Daily Trend Frays at S1

Gold is trading 4,361.48 into the London close, off 0.42% on the day and pinned between daily S1 (4,382.34) and daily S2 (4,345.17) after the 10y real yield ticked up another 3bp to 2.44%. All intraday timeframes are now sub-EMA20/50 with a 1h RSI of 30.3, but the daily still holds above its EMA200 at 4,347.05 — a very thin cushion. Fed-funds futures are pricing zero cuts and a 35% hike into September 16, which is the macro anchor pulling real yields higher and gold lower. The trade is a bounce-fade rally into 4,382–4,402 unless the daily EMA200 finally gives way, in which case 4,311 (weekly S1) opens fast.


Gold is trading 4,361.48 into the London close, off 0.42% on the day and pinned between daily S1 (4,382.34) and daily S2 (4,345.17) after the 10y real yield ticked up another 3bp to 2.44%. All intraday timeframes are now sub-EMA20/50 with a 1h RSI of 30.3, but the daily still holds above its EMA200 at 4,347.05 — a very thin cushion. Fed-funds futures are pricing zero cuts and a 35% hike into September 16, which is the macro anchor pulling real yields higher and gold lower. The trade is a bounce-fade rally into 4,382–4,402 unless the daily EMA200 finally gives way, in which case 4,311 (weekly S1) opens fast.

The session

Spot PAXG opened the US session inside yesterday's upper range near 4,420 and has spent the last four hours grinding down through the daily pivot at 4,402.71 and then through daily S1 at 4,382.34. Session range 4,354.54–4,430.88, and price is sitting closer to the session low than to VWAP. The immediate catalyst is the rates leg: US 10y nominal +4bp to 4.72%, 10y real yield +3bp to 2.44%, and Investing.com's headline attribution ("Gold miners fall as bullion retreats on yield surge") lines up cleanly with the tape. DXY is actually softer on the day (-0.13% to 99.66) but the 30-day XAU↔DXY correlation is only -0.27, so the dollar is not doing the driving today — the real-rate leg is. COMEX front-month GC=F is 4,419.70 vs. PAXG 4,361.48, a 1.33% basis that says futures are still carrying trend-following length even as spot fades.

Multi-timeframe read

  • 15m: RSI 36.8, MACD histogram -0.47 but curling up; price 10.6 below EMA20 and 20.9 below EMA50. First hint of a mean-reversion bid, not a reversal.
  • 1h: RSI 30.3, MACD histogram -4.16 and still deepening. Price 25.2 below EMA20, 28.9 below EMA50. Oversold on momentum but trend structure is broken to the downside.
  • 4h: RSI 40.7, MACD histogram -3.60 falling. Below EMA20 by 25.4. The 4h is where the tape rolled over — this is the timeframe that argues for lower before higher.
  • 1d: RSI 60.0, MACD histogram +5.53 but turning down. Price still 14.4 above the daily EMA200 (4,347.05) and 68.9 above the daily EMA20 (4,292.58). The daily uptrend is intact but the daily EMA200 is now a 15-dollar cushion — the thinnest it's been in weeks.

Agreement: intraday (15m/1h/4h) is all bearish trend, all sub-EMA. Divergence: the daily is still bull-trending, and 1h RSI at 30 is oversold. Read: this is a corrective leg inside a daily uptrend that is testing whether the EMA200 cushion holds. Investing.com's automated aggregate flags Strong Buy on the daily but tags moving averages as Strong Sell (1 buy / 11 sell) — that internal contradiction in their own aggregate matches what I see: momentum oscillators pretending it's fine while trend structure quietly rolls.

Macro frame

Real yields did it. The 10y TIPS yield is 2.44%, up 3bp day-over-day, and that is the primary gold driver here. Breakeven inflation added 1bp to 2.28%, so the nominal 4.72% is being pushed by the real leg — not by inflation expectations. That is the worst possible mix for gold: higher discount rate, no offsetting inflation-hedge bid.

Fed rate-move odds explain the direction: 65% hold, 35% hike, 0% cut into the Sep 16 FOMC, with the target still 3.75%. A market pricing a non-trivial hike tail and zero cut probability lifts the front end and pulls real yields with it. Until that distribution shifts back toward cuts, the real-yield tape has an upward bias and gold has a headwind.

DXY at 99.66 is soft (-0.13% intraday, -1.31% month), so the dollar leg would normally be a tailwind — but the 30-day XAU↔DXY daily-return correlation is only -0.27, which is a much weaker link than usual. Today the rate story is dominating the FX story.

Cross-asset: VIX 15.70 (+3.4%) — a small bump in equity risk aversion, not a fear event. GVZ (gold implied vol) 24.18 — the options market is not pricing an outsized directional move, so this is a positioning grind rather than an event-driven break. Gold/silver ratio 68.1 with silver at $64.02 — the ratio is neither stressed high (risk-off precious metals) nor stressed low (industrial-metals leadership), consistent with the precious complex churning while it waits on rates. WTI $84.16 keeps the inflation backdrop live but not pressing. Bitcoin $64,679 is drifting — no "digital gold" leadership either way.

Non-US colour: Canada CPI m/m came in hot at 0.5% (forecast 0.4%) and UK claimant count surprised strong at -11.0K vs +16.5K forecast — both nudge global real yields marginally higher, both incrementally bearish for gold at the margin.

Two scenarios

Note: convictions below are honest qualitative reads, not back-tested probabilities.

Sell setup — bounce fade into daily pivot / 0.618

  • Trigger: 1h close back below 4,382.34 (daily S1) after any rally into the 4,383–4,402 band. Confluence with the 0.618 fib of the session swing (~4,401.72) and daily pivot 4,402.71.
  • Invalidation: 1h close above 4,430 (session high / above 0.786 fib 4,414.55).
  • Target: 4,324.80 (daily S3), stretch 4,311.24 (weekly S1).
  • Conviction: 60%
  • Rationale: Real yields still rising, Fed odds skewed hawkish, and every intraday MACD is below zero. Momentum snapback into resistance is the highest-probability re-entry for the trend that's already in motion.

Buy setup — oversold bounce at EMA200 / daily S2 confluence

  • Trigger: 4,345–4,347 tag with a 15m/1h close BACK ABOVE 4,354 (session low reclaim). Confluence: daily S2 (4,345.17) + daily EMA200 (4,347.05).
  • Invalidation: 1h close below 4,324.80 (daily S3).
  • Target: 4,382.34 (daily S1) first, 4,402.71 (daily P) stretch.
  • Conviction: 40%
  • Rationale: Daily uptrend still technically intact and 1h RSI at 30.3 is stretched. But this is a counter-trend scalp — the macro isn't with you. Small size, quick take.

Levels worth marking

  • 4,497 / 4,460 / 4,439 — daily R3/R2/R1, upside caps if a squeeze runs.
  • 4,430.88 — session high, also near 0.786 fib (4,414.55) of session swing.
  • 4,402.71 — daily pivot P, confluence with 0.618 fib (4,401.72). Primary rejection zone for the sell.
  • 4,392.71 – 4,401.72golden pocket (0.5–0.618 of session swing). Highest-probability reaction zone on a bounce.
  • 4,382.34 — daily S1, current battle level.
  • 4,377.09 — weekly pivot P (already lost intraday).
  • 4,354.54 — session low.
  • 4,347.05 — daily EMA200. The line.
  • 4,345.17 — daily S2. Confluence with the EMA200.
  • 4,324.80 — daily S3 and invalidation for the daily-trend structure.
  • 4,311.24 — weekly S1, ABCD measured-move D-target.
  • 4,242.07 — weekly S2, only relevant if 4,311 fails.

Calendar / catalysts

Nothing dated for later today, but from the pre-fetched ForexFactory block:

  • Mon Aug 17 15:30 — CAD CPI m/m 0.5% vs 0.4% forecast (High impact, already released, hot).
  • Mon Aug 17 — CAD Median CPI y/y 2.0% (in-line), Trimmed CPI y/y 1.9% (hot).
  • Tue Aug 18 09:00 — GBP Claimant Count Change -11.0K vs +16.5K forecast (High, released, strong beat).
  • Tue Aug 18 — GBP Average Earnings 3m/y 4.1% vs 4.0% (Medium, released, slight beat).

Net calendar read: both prints support the real-yield-up narrative. No US-tier data left today; the next Fed-relevant catalyst on the ForexFactory feed pulled for this run is not shown here, so watch the tape rather than assuming a scheduled event.

Sources cited

  • Investing.com (headline: "Gold miners fall as bullion retreats on yield surge"; "Gold wavers as rising oil prices fuel lingering inflation worries") + Investing.com automated technical aggregate.
  • US Treasury (10y TIPS real yield 2.44%).
  • CME Fed-funds futures (implied Sep 16 FOMC path).
  • Kitco (metals quote context).
  • ForexFactory economic calendar (CAD/GBP prints above).
  • CFTC COT — unavailable this run.

Desk summary & bias

Gold has broken daily S1 and weekly pivot into the US afternoon with the 10y real yield up another 3bp to 2.44% and Fed-funds futures still assigning a 35% hike probability into September 16. Intraday structure is unanimously bearish (all sub-EMA20/50, all MACD hists negative) while the daily is still constructively above its EMA200 — but the cushion is now only 14 dollars. The dominant driver is the real-yield leg, not the DXY leg (correlation only -0.27). The single most important thing to watch next is whether 4,347 (daily EMA200) / 4,345 (daily S2) holds on the close — that level is the daily-uptrend gate.

# Bias Setup Trigger Entry zone Invalidation Target Conviction Why
1 SELL Bounce-fade into daily P / 0.618 1h close back below 4,382.34 after rally 4,383 – 4,402 1h close > 4,430 4,324.80 (stretch 4,311.24) 60% Real yields +3bp, Fed odds hawkish, intraday MACDs all sub-zero
2 BUY Oversold bounce at daily EMA200 / S2 15m/1h close back above 4,354 after tag 4,345 – 4,354 1h close < 4,324.80 4,382.34 (stretch 4,402.71) 40% Daily uptrend intact, 1h RSI 30.3, EMA200 + S2 confluence
3 SELL Trend continuation on EMA200 loss Daily close below 4,347.05 4,340 – 4,347 (breakdown retest) Daily close back > 4,377.09 4,311.24 (stretch 4,242.07) 55% Daily EMA200 loss confirms macro-led leg, weekly pivot already lost

Net desk bias: SELL. The 10y real yield is rising, the Fed-funds path prices no cuts and a 35% hike tail, DXY isn't doing enough work to offset the real-rate drag, and every intraday timeframe is sub-EMA with a broken pivot. The only weight on the other side is a still-intact daily uptrend and a 1h RSI at 30 — a counter-trend bounce is likely but should be sold. I'm weighting macro over the daily trend here because the daily EMA200 cushion is 14 dollars and the driver (real yields) is actively still moving against gold.

(not financial advice)

{"bias": "SELL",
 "ideas": [
   {"bias": "SELL", "label": "Bounce-fade into daily P / 0.618", "entry_low": 4383, "entry_high": 4402, "invalidation": 4430, "target": 4324.80, "conviction": 60},
   {"bias": "BUY",  "label": "Oversold bounce at EMA200 / S2",   "entry_low": 4345, "entry_high": 4354, "invalidation": 4324.80, "target": 4382.34, "conviction": 40},
   {"bias": "SELL", "label": "Trend continuation on EMA200 loss","entry_low": 4340, "entry_high": 4347, "invalidation": 4377.09, "target": 4311.24, "conviction": 55}
 ]}

TradingView chart script

Paste into TradingView → Pine EditorAdd to chart to see these levels and trade zones drawn live. (Also attached to the email edition as a .pine file.)

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

// ── Inputs: swing anchors for the fibonacci (session swing) ──
swingHighTime = input.time(timestamp("2026-08-18T09:00:00"), "Session swing HIGH time")
swingHighPx   = input.float(4430.88, "Session swing HIGH price")
swingLowTime  = input.time(timestamp("2026-08-18T15:00:00"), "Session swing LOW time")
swingLowPx    = input.float(4354.54, "Session swing LOW price")

// ── EMAs (bar-anchored, safe to plot) ──
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, force_overlay=true)
plot(ema50,  "EMA50",  color=color.new(color.orange, 0), linewidth=1, force_overlay=true)
plot(ema200, "EMA200", color=color.new(color.fuchsia, 0), linewidth=2, force_overlay=true)

// ── Key desk levels (from the post) ──
dailyP   = 4402.71
dailyS1  = 4382.34
dailyS2  = 4345.17
dailyS3  = 4324.80
weeklyP  = 4377.09
weeklyS1 = 4311.24
weeklyS2 = 4242.07
ema200Lv = 4347.05
sessHi   = 4430.88
sessLo   = 4354.54

// ── Fibonacci retracement of the session swing (76.34 range) ──
fibRange = swingHighPx - swingLowPx
f236 = swingLowPx + 0.236 * fibRange
f382 = swingLowPx + 0.382 * fibRange
f500 = swingLowPx + 0.500 * fibRange
f618 = swingLowPx + 0.618 * fibRange
f786 = swingLowPx + 0.786 * fibRange

// ── Persistent drawing objects (declared ONCE with var, repositioned on last bar) ──
// Horizontal desk levels
var line lDP  = line.new(na, na, na, na, xloc=xloc.bar_time, force_overlay=true, color=color.new(color.aqua, 0), width=2)
var line lDS1 = line.new(na, na, na, na, xloc=xloc.bar_time, force_overlay=true, color=color.new(color.red, 0), width=1)
var line lDS2 = 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 lDS3 = line.new(na, na, na, na, xloc=xloc.bar_time, force_overlay=true, color=color.new(color.red, 50), width=1, style=line.style_dashed)
var line lWP  = line.new(na, na, na, na, xloc=xloc.bar_time, force_overlay=true, color=color.new(color.aqua, 40), width=1, style=line.style_dotted)
var line lWS1 = line.new(na, na, na, na, xloc=xloc.bar_time, force_overlay=true, color=color.new(color.red, 40), width=1, style=line.style_dotted)
var line lE200= line.new(na, na, na, na, xloc=xloc.bar_time, force_overlay=true, color=color.new(color.fuchsia, 0), width=2, style=line.style_dashed)

// Fib lines
var line lF236 = line.new(na, na, na, na, xloc=xloc.bar_time, force_overlay=true, color=color.new(color.gray, 30), width=1)
var line lF382 = line.new(na, na, na, na, xloc=xloc.bar_time, force_overlay=true, color=color.new(color.gray, 20), width=1)
var line lF500 = line.new(na, na, na, na, xloc=xloc.bar_time, force_overlay=true, color=color.new(color.yellow, 30), width=1)
var line lF618 = line.new(na, na, na, na, xloc=xloc.bar_time, force_overlay=true, color=color.new(color.yellow, 0), width=2)
var line lF786 = line.new(na, na, na, na, xloc=xloc.bar_time, force_overlay=true, color=color.new(color.gray, 30), width=1)

// Golden pocket (0.5 – 0.618) shaded box
var box bGP = box.new(na, na, na, na, xloc=xloc.bar_time, force_overlay=true, bgcolor=color.new(color.yellow, 82), border_color=color.new(color.yellow, 55))

// Supply zone (sell idea 1 entry: 4383 – 4402)
var box bSupply = 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, 55))
// Demand zone (buy idea 2 entry: 4345 – 4354)
var box bDemand = 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, 55))
// Continuation-sell breakdown zone (idea 3: 4340 – 4347)
var box bBreak = box.new(na, na, na, na, xloc=xloc.bar_time, force_overlay=true, bgcolor=color.new(color.maroon, 80), border_color=color.new(color.maroon, 50))

// Trade lines — SELL idea 1 (invalidation + target)
var line lSellInv = 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 lSellTgt = line.new(na, na, na, na, xloc=xloc.bar_time, force_overlay=true, color=color.new(color.red, 0), width=2, style=line.style_dotted)
// Trade lines — BUY idea 2 (invalidation + target)
var line lBuyInv  = line.new(na, na, na, na, xloc=xloc.bar_time, force_overlay=true, color=color.new(color.lime, 0), width=2, style=line.style_dashed)
var line lBuyTgt  = line.new(na, na, na, na, xloc=xloc.bar_time, force_overlay=true, color=color.new(color.lime, 0), width=2, style=line.style_dotted)

// ABCD roadmap lines
var line lAB = line.new(na, na, na, na, xloc=xloc.bar_time, force_overlay=true, color=color.new(color.aqua, 0), width=2)
var line lBC = line.new(na, na, na, na, xloc=xloc.bar_time, force_overlay=true, color=color.new(color.aqua, 0), width=2)
var line lCD = 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)

// Right-edge labels (ride the visible chart)
var label lbDP   = label.new(na, na, "", xloc=xloc.bar_time, force_overlay=true, yloc=yloc.price, style=label.style_label_left, color=color.new(color.aqua, 0), textcolor=color.white, size=size.small)
var label lbDS1  = label.new(na, na, "", xloc=xloc.bar_time, force_overlay=true, yloc=yloc.price, style=label.style_label_left, color=color.new(color.red, 0), textcolor=color.white, size=size.small)
var label lbDS2  = label.new(na, na, "", xloc=xloc.bar_time, force_overlay=true, yloc=yloc.price, style=label.style_label_left, color=color.new(color.red, 30), textcolor=color.white, size=size.small)
var label lbDS3  = label.new(na, na, "", xloc=xloc.bar_time, force_overlay=true, yloc=yloc.price, style=label.style_label_left, color=color.new(color.red, 50), textcolor=color.white, size=size.small)
var label lbWS1  = label.new(na, na, "", xloc=xloc.bar_time, force_overlay=true, yloc=yloc.price, style=label.style_label_left, color=color.new(color.red, 40), textcolor=color.white, size=size.small)
var label lbE200 = label.new(na, na, "", xloc=xloc.bar_time, force_overlay=true, yloc=yloc.price, style=label.style_label_left, color=color.new(color.fuchsia, 0), textcolor=color.white, size=size.small)
var label lbF618 = label.new(na, na, "", xloc=xloc.bar_time, force_overlay=true, yloc=yloc.price, style=label.style_label_left, color=color.new(color.yellow, 0), textcolor=color.black, size=size.small)
var label lbGP   = label.new(na, na, "", xloc=xloc.bar_time, force_overlay=true, yloc=yloc.price, style=label.style_label_left, color=color.new(color.yellow, 60), textcolor=color.white, size=size.small)
var label lbSup  = label.new(na, na, "", xloc=xloc.bar_time, force_overlay=true, yloc=yloc.price, style=label.style_label_left, color=color.new(color.red, 40), textcolor=color.white, size=size.small)
var label lbDem  = label.new(na, na, "", xloc=xloc.bar_time, force_overlay=true, yloc=yloc.price, style=label.style_label_left, color=color.new(color.lime, 40), textcolor=color.black, size=size.small)
// ABCD point labels
var label lbA = label.new(na, na, "", xloc=xloc.bar_time, force_overlay=true, yloc=yloc.price, style=label.style_label_down, color=color.new(color.aqua, 20), textcolor=color.white, size=size.small)
var label lbB = label.new(na, na, "", xloc=xloc.bar_time, force_overlay=true, yloc=yloc.price, style=label.style_label_up, color=color.new(color.aqua, 20), textcolor=color.white, size=size.small)
var label lbC = label.new(na, na, "", xloc=xloc.bar_time, force_overlay=true, yloc=yloc.price, style=label.style_label_down, color=color.new(color.aqua, 20), textcolor=color.white, size=size.small)
var label lbD = label.new(na, na, "", xloc=xloc.bar_time, force_overlay=true, yloc=yloc.price, style=label.style_label_up, color=color.new(color.aqua, 0), textcolor=color.white, size=size.normal)

// ── Signal state (close-confirmed, non-repainting) ──
var string sellState = "ARMED"
var string buyState  = "ARMED"
var string contState = "ARMED"

// Session gate: London (07-16 UTC) + NY (12-21 UTC) → 07-21 UTC
inSession = (hour(time, "UTC") >= 7 and hour(time, "UTC") < 21)

// Sell idea 1: bounce-fade — close BACK below dailyS1 after tagging supply zone
sellTagged = ta.highest(high, 6) >= 4383 and ta.highest(high, 6) <= 4413
sellTrig   = barstate.isconfirmed and inSession and sellTagged and ta.crossunder(close, dailyS1)
sellInv    = barstate.isconfirmed and close > 4430
sellHit    = barstate.isconfirmed and close <= dailyS3

// Buy idea 2: oversold bounce — close BACK above sessLo after tagging demand
buyTagged = ta.lowest(low, 6) <= 4354 and ta.lowest(low, 6) >= 4345
buyTrig   = barstate.isconfirmed and inSession and buyTagged and ta.crossover(close, sessLo)
buyInv    = barstate.isconfirmed and close < dailyS3
buyHit    = barstate.isconfirmed and close >= dailyS1

// Continuation-sell idea 3: daily EMA200 loss
contTrig = barstate.isconfirmed and inSession and ta.crossunder(close, ema200Lv)
contInv  = barstate.isconfirmed and close > weeklyP
contHit  = barstate.isconfirmed and close <= weeklyS1

if sellTrig
    sellState := "TRIGGERED"
if sellInv
    sellState := "INVALIDATED"
if sellHit
    sellState := "TARGET HIT"
if buyTrig
    buyState := "TRIGGERED"
if buyInv
    buyState := "INVALIDATED"
if buyHit
    buyState := "TARGET HIT"
if contTrig
    contState := "TRIGGERED"
if contInv
    contState := "INVALIDATED"
if contHit
    contState := "TARGET HIT"

// ── Reposition every drawing on the last bar so they pan / zoom with the chart ──
if barstate.islast
    lt = chart.left_visible_bar_time
    rt = chart.right_visible_bar_time

    // Horizontal desk levels
    line.set_xy1(lDP, lt, dailyP)
    line.set_xy2(lDP, rt, dailyP)
    line.set_xy1(lDS1, lt, dailyS1)
    line.set_xy2(lDS1, rt, dailyS1)
    line.set_xy1(lDS2, lt, dailyS2)
    line.set_xy2(lDS2, rt, dailyS2)
    line.set_xy1(lDS3, lt, dailyS3)
    line.set_xy2(lDS3, rt, dailyS3)
    line.set_xy1(lWP, lt, weeklyP)
    line.set_xy2(lWP, rt, weeklyP)
    line.set_xy1(lWS1, lt, weeklyS1)
    line.set_xy2(lWS1, rt, weeklyS1)
    line.set_xy1(lE200, lt, ema200Lv)
    line.set_xy2(lE200, rt, ema200Lv)

    // Fib lines anchored to the swing HIGH time, extending to visible right edge
    line.set_xy1(lF236, swingHighTime, f236)
    line.set_xy2(lF236, rt, f236)
    line.set_xy1(lF382, swingHighTime, f382)
    line.set_xy2(lF382, rt, f382)
    line.set_xy1(lF500, swingHighTime, f500)
    line.set_xy2(lF500, rt, f500)
    line.set_xy1(lF618, swingHighTime, f618)
    line.set_xy2(lF618, rt, f618)
    line.set_xy1(lF786, swingHighTime, f786)
    line.set_xy2(lF786, rt, f786)

    // Golden pocket 0.5 – 0.618 (anchored to swing high, extend right)
    box.set_left(bGP, swingHighTime)
    box.set_right(bGP, rt)
    box.set_top(bGP, f618)
    box.set_bottom(bGP, f500)

    // Supply / demand / breakdown zones (span the visible chart)
    box.set_left(bSupply, lt)
    box.set_right(bSupply, rt)
    box.set_top(bSupply, 4402.71)
    box.set_bottom(bSupply, 4383.00)
    box.set_left(bDemand, lt)
    box.set_right(bDemand, rt)
    box.set_top(bDemand, 4354.54)
    box.set_bottom(bDemand, 4345.17)
    box.set_left(bBreak, lt)
    box.set_right(bBreak, rt)
    box.set_top(bBreak, 4347.05)
    box.set_bottom(bBreak, 4340.00)

    // Trade lines
    line.set_xy1(lSellInv, lt, 4430.00)
    line.set_xy2(lSellInv, rt, 4430.00)
    line.set_xy1(lSellTgt, lt, dailyS3)
    line.set_xy2(lSellTgt, rt, dailyS3)
    line.set_xy1(lBuyInv, lt, dailyS3)
    line.set_xy2(lBuyInv, rt, dailyS3)
    line.set_xy1(lBuyTgt, lt, dailyS1)
    line.set_xy2(lBuyTgt, rt, dailyS1)

    // ABCD roadmap (A session high → B session low → C bounce to daily S1 → D projected weekly S1)
    aT = swingHighTime
    bT = swingLowTime
    cT = swingLowTime + 4 * 60 * 60 * 1000
    dT = swingLowTime + 12 * 60 * 60 * 1000
    aPx = sessHi
    bPx = sessLo
    cPx = dailyS1
    dPx = weeklyS1
    line.set_xy1(lAB, aT, aPx)
    line.set_xy2(lAB, bT, bPx)
    line.set_xy1(lBC, bT, bPx)
    line.set_xy2(lBC, cT, cPx)
    line.set_xy1(lCD, cT, cPx)
    line.set_xy2(lCD, dT, dPx)

    // Right-edge level labels
    label.set_xy(lbDP, rt, dailyP)
    label.set_text(lbDP, "Daily P  " + str.tostring(dailyP))
    label.set_xy(lbDS1, rt, dailyS1)
    label.set_text(lbDS1, "Daily S1  " + str.tostring(dailyS1))
    label.set_xy(lbDS2, rt, dailyS2)
    label.set_text(lbDS2, "Daily S2  " + str.tostring(dailyS2))
    label.set_xy(lbDS3, rt, dailyS3)
    label.set_text(lbDS3, "Daily S3 / SELL TGT  " + str.tostring(dailyS3))
    label.set_xy(lbWS1, rt, weeklyS1)
    label.set_text(lbWS1, "Weekly S1 / D  " + str.tostring(weeklyS1))
    label.set_xy(lbE200, rt, ema200Lv)
    label.set_text(lbE200, "Daily EMA200  " + str.tostring(ema200Lv))
    label.set_xy(lbF618, rt, f618)
    label.set_text(lbF618, "0.618 fib  " + str.tostring(f618, "#.##"))
    label.set_xy(lbGP, rt, (f500 + f618) / 2)
    label.set_text(lbGP, "GOLDEN POCKET 0.5-0.618")
    label.set_xy(lbSup, rt, 4402.71)
    label.set_text(lbSup, "SELL zone 4383-4402  60%")
    label.set_xy(lbDem, rt, 4345.17)
    label.set_text(lbDem, "BUY zone 4345-4354  40%")

    // ABCD point labels
    label.set_xy(lbA, aT, aPx)
    label.set_text(lbA, "A  " + str.tostring(aPx))
    label.set_xy(lbB, bT, bPx)
    label.set_text(lbB, "B  " + str.tostring(bPx))
    label.set_xy(lbC, cT, cPx)
    label.set_text(lbC, "C  " + str.tostring(cPx))
    label.set_xy(lbD, dT, dPx)
    label.set_text(lbD, "D  " + str.tostring(dPx) + "  (AB=CD)")

// ── Net-bias corner HUD ──
var table hud = table.new(position.top_right, 2, 6, bgcolor=color.new(color.black, 20), border_color=color.gray, border_width=1, force_overlay=true)
if barstate.islast
    table.cell(hud, 0, 0, "GOLD DESK 2026-08-18", bgcolor=color.new(color.red, 30), text_color=color.white, text_size=size.normal)
    table.cell(hud, 1, 0, "NET BIAS: SELL",       bgcolor=color.new(color.red, 30), text_color=color.white, text_size=size.normal)
    table.cell(hud, 0, 1, "10y real",     text_color=color.white)
    table.cell(hud, 1, 1, "2.44% (+3bp)", text_color=color.white)
    table.cell(hud, 0, 2, "Fed Sep16",    text_color=color.white)
    table.cell(hud, 1, 2, "65% hold / 35% hike", text_color=color.white)
    table.cell(hud, 0, 3, "SELL #1",  text_color=color.white)
    table.cell(hud, 1, 3, sellState,  text_color=color.white)
    table.cell(hud, 0, 4, "BUY #2",   text_color=color.white)
    table.cell(hud, 1, 4, buyState,   text_color=color.white)
    table.cell(hud, 0, 5, "SELL #3",  text_color=color.white)
    table.cell(hud, 1, 5, contState,  text_color=color.white)

// ── Alerts (close-confirmed, non-repainting) ──
alertcondition(sellTrig, title="Gold SELL #1 TRIGGERED — bounce-fade at daily P / 0.618", message="XAUUSD close back below 4382.34 after tagging 4383-4402 supply zone. SELL entry confirmed (London/NY session). Target 4324.80, invalid > 4430.")
alertcondition(sellInv,  title="Gold SELL #1 INVALIDATED",  message="XAUUSD close above 4430 — SELL #1 invalidated.")
alertcondition(sellHit,  title="Gold SELL #1 TARGET HIT",   message="XAUUSD close at/below 4324.80 (daily S3) — SELL #1 target hit.")
alertcondition(buyTrig,  title="Gold BUY #2 TRIGGERED — oversold bounce at EMA200 / S2", message="XAUUSD close back above 4354.54 after tagging 4345-4354 demand zone. BUY entry confirmed (London/NY session). Target 4382.34, invalid < 4324.80.")
alertcondition(buyInv,   title="Gold BUY #2 INVALIDATED",   message="XAUUSD close below 4324.80 — BUY #2 invalidated.")
alertcondition(buyHit,   title="Gold BUY #2 TARGET HIT",    message="XAUUSD close at/above 4382.34 — BUY #2 target hit.")
alertcondition(contTrig, title="Gold SELL #3 TRIGGERED — daily EMA200 lost", message="XAUUSD close below 4347.05 (daily EMA200). Continuation SELL confirmed. Target 4311.24, invalid > 4377.09.")
alertcondition(contInv,  title="Gold SELL #3 INVALIDATED",  message="XAUUSD close above 4377.09 (weekly pivot reclaimed) — SELL #3 invalidated.")
alertcondition(contHit,  title="Gold SELL #3 TARGET HIT",   message="XAUUSD close at/below 4311.24 (weekly S1) — SELL #3 target hit.")
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

real yields do the driving, again