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

Gold at 4,596 — Bounce Setups Into Daily Pivot, With a Weekly-Pivot Magnet Below

Gold is trading heavy at 4,595 after Wednesday's in-line Core PCE (0.2%) and 1.5% Prelim GDP reaffirmed a steady-hot-inflation, no-cut path — fed-funds futures now price a **64% hold / 36% HIKE / 0% cut** for Sep 16, real yields nudged higher to 2.34%, and DXY is bid at 99.15. The intraday tape (15m/1h below all EMAs, RSI 39–43) sits inside a bigger daily uptrend (RSI 65.5, price +260 pts above the daily EMA50), which is the exact configuration for **fade-the-bounce, buy-the-flush** two-way scalping into the 4,619 daily pivot and the 4,515 weekly pivot. Net desk bias is a tactical **SELL** into the daily pivot with an eye on a controlled rotation to the weekly pivot — but the swing bid is not broken.


Gold is trading heavy at 4,595 after Wednesday's in-line Core PCE (0.2%) and 1.5% Prelim GDP reaffirmed a steady-hot-inflation, no-cut path — fed-funds futures now price a 64% hold / 36% HIKE / 0% cut for Sep 16, real yields nudged higher to 2.34%, and DXY is bid at 99.15. The intraday tape (15m/1h below all EMAs, RSI 39–43) sits inside a bigger daily uptrend (RSI 65.5, price +260 pts above the daily EMA50), which is the exact configuration for fade-the-bounce, buy-the-flush two-way scalping into the 4,619 daily pivot and the 4,515 weekly pivot. Net desk bias is a tactical SELL into the daily pivot with an eye on a controlled rotation to the weekly pivot — but the swing bid is not broken.

The session

PAXG spot prints 4,595.56, -0.52% on the session, inside a 4,580.01 – 4,665.71 range. The tape came in offered from the Asia handover and has spent the London session grinding along the lower third of the daily range; the session low at 4,580.01 is also the 5-day range low, so it is doing double duty as the local pivot for both intraday scalpers and swing bookkeepers. COMEX GC=F front-month is at 4,651.20, a +1.21% premium to spot — a wider-than-usual basis that tells you futures players are still willing to pay up for forward exposure even as spot bleeds; the futures curve is not confirming panic.

The catalyst set is Wednesday's data cluster: Core PCE m/m 0.2% (in-line), Prelim GDP 1.5% q/q (in-line) and a GDP price index of 6.4% (hot vs. 6.2%) — the sticky-inflation, steady-growth combo the "Trading Day: Hot inflation cools sentiment" wire captured. Australia's CPI printed hot too (headline 3.5% y/y vs. 3.3%), reinforcing the global inflation-persistence read. There's no US-side scheduled top-tier print on the tape for the rest of the day in the calendar block; the desk-relevant known unknown is the Warsh Jackson Hole speech flagged by investing.com's "Gold edges higher near $4,600 as markets await Warsh's Jackson Hole speech" headline.

Multi-timeframe read

  • 15m: RSI 39, MACD hist -1.74 but curling up, price -8 below EMA20 and -11 below EMA50. Classic oversold bounce setup inside a down-leg — expect a mean-reversion attempt into 4,603 (EMA20) then 4,619 (daily P).
  • 1h: RSI 43, MACD hist still negative and rolling further down (-0.07 and lower), price -12 below EMA20, -20 below EMA50. The 1h has NOT confirmed a bottom; a lower-high failure into 4,615–4,619 is the fade zone.
  • 4h: RSI 55, MACD hist -8.28 but hooking up, price -18 below EMA20. Neutral-to-corrective inside the bigger trend; this is the timeframe that will decide whether we get a full rotation to the weekly pivot or a shallow flag.
  • 1d: RSI 65.5, price +120 above EMA20, +258 above EMA50, +227 above EMA200. Daily is unambiguously bullish and the daily MACD hist just started rolling (8.21 ↓) — that hook is your warning that the daily is ready to work off some of the +8.16% monthly run without breaking the trend.

Agreement: 15m through 4h all point to a corrective phase inside a healthy daily uptrend. Divergence to flag: investing.com's aggregate reads Strong Buy while its own MAs (3B/9S), RSI and MACD components all read Sell — their headline number is being distorted by the long-EMA stack, which agrees with our daily read but ignores the intraday deterioration. Our take: the intraday sell signal is real, the swing buy is intact, and the two coexist.

Macro frame

Lead with the real yield: 10y TIPS 2.34%, +2 bp d/d. Breakeven inflation is flat at 2.32%. Nominal 10y sits at 4.66% by Treasury par, tape-driven ^TNX shows -7 bp intraday off the PCE print but the settled real-yield number that drives gold is up — this is the "hot inflation, steady growth, no cut" macro fingerprint and it is a gold headwind.

The Fed-odds path confirms it: fed-funds futures now imply 0% cut, 64% hold, 36% hike for Sep 16, 2026, with the current upper bound at 3.75%. A meaningful hike probability is being priced — a genuinely hawkish tilt — and that keeps real yields bid, which keeps gold's opportunity-cost drag on. If Warsh's Jackson Hole speech leans hawkish, expect that 36% to migrate higher and gold to accelerate into the weekly pivot.

DXY: 99.15, +0.35% intraday, 1h RSI 61.6, 4h RSI 71 — dollar is technically bid on lower timeframes but the daily still has DXY below EMA20/50/200. Rolling 30-day daily-return DXY↔XAU correlation is -0.41 — the anti-correlation is intact and the intraday DXY strength is doing exactly what it should to gold.

Cross-asset: VIX 14.95, -1.7% — no risk-off bid for gold from equity vol; risk is being paid to sit long. GVZ 26.96 — moderate implied on gold, market is not pricing a shock either way, which favours mean-reversion setups over breakout chasing. Gold/silver 66.5 with silver at $69.11 — a low-60s/mid-60s ratio is a "PMs risk-on" regime and it argues against full-blown safe-haven bids into gold today. WTI $81.03 and BTC $79,058 are quiet — no inflation shock, no "digital gold" flow diverting away.

Two scenarios

Conviction below is qualitative desk confidence, not a back-tested probability.

Sell setup — fade the bounce into daily pivot

  • Trigger: rally into 4,619 (daily P) – 4,635 (0.5 fib of 4,689–4,580 swing) and a 15m/1h close back below 4,615.
  • Invalidation: 1h close above 4,658 (daily R1).
  • Target: first 4,577 (daily S1), then 4,538 (daily S2), stretch to 4,515 (weekly P).
  • Conviction: 60%.
  • Rationale: intraday EMAs stacked bearish, MACD 1h still leaking, daily-MACD hook down. Real yields +2 bp, DXY bid, Fed odds hawkish — the macro is pushing in the same direction. 4,619 is the daily pivot and the 0.5 fib essentially sits on it; that's your confluence.

Buy setup — flush-and-reclaim at weekly pivot

  • Trigger: flush into 4,538 (daily S2) – 4,515 (weekly P) and a 1h close back above 4,538.
  • Invalidation: 1h close below 4,495 (daily S3).
  • Target: first 4,595 (session pivot), then 4,619 (daily P), stretch to 4,658 (daily R1).
  • Conviction: 45%.
  • Rationale: the daily uptrend, daily RSI 65, +227 above EMA200 argue that this correction is a dip, not a break. A tag of the weekly pivot with a bullish rejection is where a swing bid should show up. Lower conviction because you need the flush first — no chase.

Levels worth marking

  • 4,700.68 (R2) and 4,703.87 (weekly R1) — the confluence ceiling; would take a hawkish surprise reversal to threaten.
  • 4,658.60 (daily R1) — session upper rejection zone; sell-setup invalidation.
  • 4,634.51 (0.5 fib) and 4,619.30 (daily P + 0.618 fib 4,621.65)the golden pocket / daily-pivot confluence; the entire day pivots (literally) on how price behaves here.
  • 4,603 (15m EMA20) / 4,595 (session mid) — battleground.
  • 4,580.01 (session low, 5-day low) — the pivot for a genuine break lower.
  • 4,577.22 (daily S1) — first sell target.
  • 4,537.92 (daily S2) / 4,515.13 (weekly P) — the primary magnet if 4,580 gives way; also the buy-setup zone.
  • 4,495.84 (daily S3) — buy invalidation; a close below sinks the swing thesis.

Calendar / catalysts

From the pre-fetched ForexFactory block:

  • Wed Aug 26 · USD · High · Core PCE m/m 0.2% actual vs 0.2% forecast — released; in-line, mildly hawkish given sticky nominal.
  • Wed Aug 26 · USD · High · Prelim GDP q/q 1.5% actual vs 1.5% forecast — released; steady growth.
  • Wed Aug 26 · USD · Medium · Prelim GDP Price Index q/q 6.4% vs 6.2% forecast — released; hot, and this is what's keeping real yields bid.
  • Wed Aug 26 · AUD · High · CPI y/y 3.5% vs 3.3% forecast — released; adds to the global-inflation-persistence read.
  • Mon Aug 24 · USD · Medium · Treasury Sec Bessent Speaks — past.
  • Tue Aug 25 · USD · Medium · CB Consumer Confidence 89.4 vs 90.3 — past; softer.

The rest of today's US session is calendar-light in the block; the known unscheduled risk is the Warsh Jackson Hole speech flagged by the investing.com wire.

Sources cited

onewordnews (kitco, dailyfx excerpts), investing.com (gold news + technical aggregate + "Gold trapped at $4,656 mid-range standoff" + "Gold edges higher near $4,600 as markets await Warsh's Jackson Hole speech" + "Trading Day: Hot inflation cools sentiment" + "Morning Bid: Jensen to market: We're so back"), U.S. Treasury real-yield curve (TIPS), fed-funds-futures implied odds, ForexFactory economic calendar, COMEX (GC=F front-month). CFTC COT was unavailable this run and no positioning inference was made.

Desk summary & bias

Gold is corrective inside a bull trend, and the macro (real yields +2 bp, 36% Fed hike odds, DXY +0.35%) is doing the pushing on the sell side while the daily technicals (RSI 65, +227 above EMA200) are the only thing propping the swing bid. The dominant driver right now is the real-yield + hawkish-Fed-path combo — that argues sell-the-bounce into 4,619, not buy the dip yet. The single most important level to watch is 4,619 (daily P + 0.618 fib): a rejection there is the day's short trigger; a 1h close above 4,658 flips the intraday tape back to buyers. Warsh at Jackson Hole is the wildcard.

Trade ideas

# Bias Setup Trigger Entry zone Invalidation Target Conviction Why
1 SELL Bounce-fade into daily P + golden pocket 15m/1h close back below 4,615 after tag 4,619 – 4,635 1h close > 4,658 4,577 → 4,538 → 4,515 60% 1h EMAs bearish, real yields +2 bp, DXY +0.35%, 36% Fed-hike odds, fib+pivot confluence at entry
2 BUY Weekly-pivot flush-and-reclaim 1h close back above 4,538 after flush 4,538 – 4,515 1h close < 4,495 4,595 → 4,619 → 4,658 45% Daily RSI 65, +227 above EMA200, weekly pivot magnet; swing dip-buy but wait for the flush
3 SELL Trend-break continuation (only if #1 works) 1h close < 4,538 (S2) after Idea 1 hits target 1 4,538 – 4,545 1h close > 4,577 4,515 → 4,495 40% Extension play only; needs Idea 1 to have already worked, otherwise skip

Net desk bias: SELL (tactical, intraday). Real yields moved the wrong way for gold, DXY is bid, Fed-odds path has 36% hike weight, and the intraday MTF stack is uniformly bearish — the macro and the intraday technicals agree. We're weighting them over the daily-trend swing bid because the catalyst set (post-PCE inflation stickiness + Warsh) points in the sell direction and because the golden-pocket/daily-pivot confluence at 4,619–4,635 gives us an unusually clean fade level. The swing bid remains respected — hence Idea 2 exists — but it does not get bought before the flush.

(not financial advice)

{"bias": "SELL",
 "ideas": [
   {"bias": "SELL", "label": "Bounce-fade into daily P + golden pocket", "entry_low": 4619, "entry_high": 4635,
    "invalidation": 4658, "target": 4538, "conviction": 60},
   {"bias": "BUY", "label": "Weekly-pivot flush-and-reclaim", "entry_low": 4515, "entry_high": 4538,
    "invalidation": 4495, "target": 4619, "conviction": 45},
   {"bias": "SELL", "label": "Trend-break continuation", "entry_low": 4538, "entry_high": 4545,
    "invalidation": 4577, "target": 4515, "conviction": 40}
 ]}

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

// ── Inputs: swing anchors for the fib (4,689 high / 4,580 low from the brief) ──
swingHighTime  = input.time(timestamp("25 Aug 2026 13:00 UTC"), title="Swing High Time (A)")
swingHighPrice = input.float(4689.00, title="Swing High Price (A)")
swingLowTime   = input.time(timestamp("27 Aug 2026 06:00 UTC"), title="Swing Low Time (B)")
swingLowPrice  = input.float(4580.01, title="Swing Low Price (B)")

// ── EMAs (bar-anchored, safe to plot as series) ──
ema20  = ta.ema(close, 20)
ema50  = ta.ema(close, 50)
ema200 = ta.ema(close, 200)
plot(ema20,  title="EMA20",  color=color.aqua,   linewidth=1, force_overlay=true)
plot(ema50,  title="EMA50",  color=color.orange, linewidth=1, force_overlay=true)
plot(ema200, title="EMA200", color=color.silver, linewidth=2, force_overlay=true)

// ── Named levels from the post (pivots + fib + trade levels) ──
lvlDR1   = 4658.60
lvlDP    = 4619.30
lvlFib05 = swingHighPrice - (swingHighPrice - swingLowPrice) * 0.5
lvlFib06 = swingHighPrice - (swingHighPrice - swingLowPrice) * 0.618
lvlFib02 = swingHighPrice - (swingHighPrice - swingLowPrice) * 0.236
lvlFib03 = swingHighPrice - (swingHighPrice - swingLowPrice) * 0.382
lvlFib07 = swingHighPrice - (swingHighPrice - swingLowPrice) * 0.786
lvlDS1   = 4577.22
lvlDS2   = 4537.92
lvlWP    = 4515.13
lvlDS3   = 4495.84
lvlSess  = 4595.56

// ── Persistent time-anchored lines (var + set_xy on last bar so they PAN with candles) ──
var line lDR1  = line.new(na, na, na, na, xloc=xloc.bar_time, force_overlay=true, color=color.red,    width=2, style=line.style_solid)
var line lDP   = line.new(na, na, na, na, xloc=xloc.bar_time, force_overlay=true, color=color.yellow, width=2, style=line.style_solid)
var line lDS1  = line.new(na, na, na, na, xloc=xloc.bar_time, force_overlay=true, color=color.lime,   width=2, style=line.style_solid)
var line lDS2  = line.new(na, na, na, na, xloc=xloc.bar_time, force_overlay=true, color=color.lime,   width=2, style=line.style_dashed)
var line lWP   = line.new(na, na, na, na, xloc=xloc.bar_time, force_overlay=true, color=color.green,  width=3, style=line.style_solid)
var line lDS3  = line.new(na, na, na, na, xloc=xloc.bar_time, force_overlay=true, color=color.maroon, width=1, style=line.style_dashed)

// ── Fib lines (time-anchored to the actual swing candles) ──
var line lFib02 = line.new(na, na, na, na, xloc=xloc.bar_time, force_overlay=true, color=color.gray,   width=1, style=line.style_dotted)
var line lFib03 = line.new(na, na, na, na, xloc=xloc.bar_time, force_overlay=true, color=color.gray,   width=1, style=line.style_dotted)
var line lFib05 = line.new(na, na, na, na, xloc=xloc.bar_time, force_overlay=true, color=color.yellow, width=1, style=line.style_dashed)
var line lFib06 = line.new(na, na, na, na, xloc=xloc.bar_time, force_overlay=true, color=color.yellow, width=1, style=line.style_dashed)
var line lFib07 = line.new(na, na, na, na, xloc=xloc.bar_time, force_overlay=true, color=color.gray,   width=1, style=line.style_dotted)

// ── Golden pocket box (0.5 – 0.618 shaded) ──
var box gPocket = box.new(na, na, na, na, xloc=xloc.bar_time, force_overlay=true, bgcolor=color.new(color.yellow, 80), border_color=color.new(color.yellow, 40))

// ── Supply zone (fade entry 4,619 – 4,635) and Demand zone (buy entry 4,515 – 4,538) ──
var box supplyZ = box.new(na, na, na, na, xloc=xloc.bar_time, force_overlay=true, bgcolor=color.new(color.red,  85), border_color=color.new(color.red,  50))
var box demandZ = box.new(na, na, na, na, xloc=xloc.bar_time, force_overlay=true, bgcolor=color.new(color.lime, 85), border_color=color.new(color.lime, 50))

// ── Trade-idea SELL: invalidation + targets ──
var line sellInvL = line.new(na, na, na, na, xloc=xloc.bar_time, force_overlay=true, color=color.red,    width=2, style=line.style_dashed)
var line sellT1L  = line.new(na, na, na, na, xloc=xloc.bar_time, force_overlay=true, color=color.red,    width=1, style=line.style_dotted)
var line sellT2L  = line.new(na, na, na, na, xloc=xloc.bar_time, force_overlay=true, color=color.red,    width=1, style=line.style_dotted)

// ── Trade-idea BUY: invalidation + targets ──
var line buyInvL  = line.new(na, na, na, na, xloc=xloc.bar_time, force_overlay=true, color=color.lime,   width=2, style=line.style_dashed)
var line buyT1L   = line.new(na, na, na, na, xloc=xloc.bar_time, force_overlay=true, color=color.lime,   width=1, style=line.style_dotted)
var line buyT2L   = line.new(na, na, na, na, xloc=xloc.bar_time, force_overlay=true, color=color.lime,   width=1, style=line.style_dotted)

// ── ABCD roadmap (A=4,689 swing high, B=4,580 swing low, C=4,619 daily P retest, D=4,510 measured move ≈ weekly P) ──
aPrice = swingHighPrice
bPrice = swingLowPrice
cPrice = lvlDP
dPrice = cPrice - (aPrice - bPrice)  // AB=CD symmetry → ~4,510
var line abLine = line.new(na, na, na, na, xloc=xloc.bar_time, force_overlay=true, color=color.fuchsia, width=2, style=line.style_solid)
var line bcLine = line.new(na, na, na, na, xloc=xloc.bar_time, force_overlay=true, color=color.fuchsia, width=2, style=line.style_solid)
var line cdLine = line.new(na, na, na, na, xloc=xloc.bar_time, force_overlay=true, color=color.fuchsia, width=2, style=line.style_dashed)
var label labA = label.new(na, na, "", xloc=xloc.bar_time, force_overlay=true, style=label.style_label_down,  color=color.fuchsia, textcolor=color.white, size=size.small)
var label labB = label.new(na, na, "", xloc=xloc.bar_time, force_overlay=true, style=label.style_label_up,    color=color.fuchsia, textcolor=color.white, size=size.small)
var label labC = label.new(na, na, "", xloc=xloc.bar_time, force_overlay=true, style=label.style_label_down,  color=color.fuchsia, textcolor=color.white, size=size.small)
var label labD = label.new(na, na, "", xloc=xloc.bar_time, force_overlay=true, style=label.style_label_up,    color=color.fuchsia, textcolor=color.white, size=size.small)

// ── Right-edge labels for every level so the reader always sees what each line is ──
var label lbDR1  = label.new(na, na, "", xloc=xloc.bar_time, force_overlay=true, style=label.style_label_left, color=color.new(color.red,    40), 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.yellow, 30), textcolor=color.black, size=size.small)
var label lbDS1  = label.new(na, na, "", xloc=xloc.bar_time, force_overlay=true, style=label.style_label_left, color=color.new(color.lime,   40), textcolor=color.black, size=size.small)
var label lbDS2  = label.new(na, na, "", xloc=xloc.bar_time, force_overlay=true, style=label.style_label_left, color=color.new(color.lime,   40), 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.green,  20), textcolor=color.white, size=size.small)
var label lbDS3  = label.new(na, na, "", xloc=xloc.bar_time, force_overlay=true, style=label.style_label_left, color=color.new(color.maroon, 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,    20), 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,   20), textcolor=color.black, size=size.small)
var label lbSt   = label.new(na, na, "", xloc=xloc.bar_time, force_overlay=true, style=label.style_label_left, color=color.new(color.gray,   30), textcolor=color.white, size=size.small)
var label lbBt   = label.new(na, na, "", xloc=xloc.bar_time, force_overlay=true, style=label.style_label_left, color=color.new(color.gray,   30), textcolor=color.white, size=size.small)

// ── Reposition every drawing to the current visible window on the last bar ──
if barstate.islast
    lt = chart.left_visible_bar_time
    rt = chart.right_visible_bar_time

    // Horizontal levels
    line.set_xy1(lDR1,  lt, lvlDR1),   line.set_xy2(lDR1,  rt, lvlDR1)
    line.set_xy1(lDP,   lt, lvlDP),    line.set_xy2(lDP,   rt, lvlDP)
    line.set_xy1(lDS1,  lt, lvlDS1),   line.set_xy2(lDS1,  rt, lvlDS1)
    line.set_xy1(lDS2,  lt, lvlDS2),   line.set_xy2(lDS2,  rt, lvlDS2)
    line.set_xy1(lWP,   lt, lvlWP),    line.set_xy2(lWP,   rt, lvlWP)
    line.set_xy1(lDS3,  lt, lvlDS3),   line.set_xy2(lDS3,  rt, lvlDS3)

    // Fib lines anchored to actual swing candles
    line.set_xy1(lFib02, swingHighTime, lvlFib02), line.set_xy2(lFib02, rt, lvlFib02)
    line.set_xy1(lFib03, swingHighTime, lvlFib03), line.set_xy2(lFib03, rt, lvlFib03)
    line.set_xy1(lFib05, swingHighTime, lvlFib05), line.set_xy2(lFib05, rt, lvlFib05)
    line.set_xy1(lFib06, swingHighTime, lvlFib06), line.set_xy2(lFib06, rt, lvlFib06)
    line.set_xy1(lFib07, swingHighTime, lvlFib07), line.set_xy2(lFib07, rt, lvlFib07)

    // Golden pocket box
    box.set_left(gPocket, swingHighTime), box.set_right(gPocket, rt)
    box.set_top(gPocket, lvlFib05),       box.set_bottom(gPocket, lvlFib06)

    // Supply & demand entry zones
    box.set_left(supplyZ, lt), box.set_right(supplyZ, rt)
    box.set_top(supplyZ, 4635.00), box.set_bottom(supplyZ, lvlDP)
    box.set_left(demandZ, lt), box.set_right(demandZ, rt)
    box.set_top(demandZ, lvlDS2), box.set_bottom(demandZ, lvlWP)

    // Sell trade (invalidation R1, targets S1 / S2)
    line.set_xy1(sellInvL, lt, lvlDR1), line.set_xy2(sellInvL, rt, lvlDR1)
    line.set_xy1(sellT1L,  lt, lvlDS1), line.set_xy2(sellT1L,  rt, lvlDS1)
    line.set_xy1(sellT2L,  lt, lvlDS2), line.set_xy2(sellT2L,  rt, lvlDS2)

    // Buy trade (invalidation S3, targets P / R1)
    line.set_xy1(buyInvL, lt, lvlDS3), line.set_xy2(buyInvL, rt, lvlDS3)
    line.set_xy1(buyT1L,  lt, lvlDP),  line.set_xy2(buyT1L,  rt, lvlDP)
    line.set_xy1(buyT2L,  lt, lvlDR1), line.set_xy2(buyT2L,  rt, lvlDR1)

    // ABCD roadmap — connect A(swing high) → B(swing low) → C(4,619 retest) → D(measured move)
    barMs   = timeframe.in_seconds(timeframe.period) * 1000
    cTime   = swingLowTime + barMs * 12
    dTime   = cTime        + barMs * 24
    line.set_xy1(abLine, swingHighTime, aPrice), line.set_xy2(abLine, swingLowTime,  bPrice)
    line.set_xy1(bcLine, swingLowTime,  bPrice), line.set_xy2(bcLine, cTime,         cPrice)
    line.set_xy1(cdLine, cTime,         cPrice), line.set_xy2(cdLine, dTime,         dPrice)
    label.set_xy(labA, swingHighTime, aPrice), label.set_text(labA, "A " + str.tostring(aPrice, "#.##"))
    label.set_xy(labB, swingLowTime,  bPrice), label.set_text(labB, "B " + str.tostring(bPrice, "#.##"))
    label.set_xy(labC, cTime,         cPrice), label.set_text(labC, "C " + str.tostring(cPrice, "#.##"))
    label.set_xy(labD, dTime,         dPrice), label.set_text(labD, "D " + str.tostring(dPrice, "#.##") + " (watch)")

    // Right-edge level labels
    label.set_xy(lbDR1,  rt, lvlDR1),   label.set_text(lbDR1,  "Daily R1  " + str.tostring(lvlDR1, "#.##"))
    label.set_xy(lbDP,   rt, lvlDP),    label.set_text(lbDP,   "Daily P / 0.618  " + str.tostring(lvlDP, "#.##"))
    label.set_xy(lbDS1,  rt, lvlDS1),   label.set_text(lbDS1,  "Daily S1  " + str.tostring(lvlDS1, "#.##"))
    label.set_xy(lbDS2,  rt, lvlDS2),   label.set_text(lbDS2,  "Daily S2  " + str.tostring(lvlDS2, "#.##"))
    label.set_xy(lbWP,   rt, lvlWP),    label.set_text(lbWP,   "Weekly P  " + str.tostring(lvlWP, "#.##"))
    label.set_xy(lbDS3,  rt, lvlDS3),   label.set_text(lbDS3,  "Daily S3  " + str.tostring(lvlDS3, "#.##"))
    label.set_xy(lbSell, rt, 4635.00),  label.set_text(lbSell, "SELL entry 4619-4635 (60%)")
    label.set_xy(lbBuy,  rt, 4526.50),  label.set_text(lbBuy,  "BUY entry 4515-4538 (45%)")

// ── State labels for each setup (ARMED / TRIGGERED / INVALIDATED / TARGET) ──
var string sellState = "ARMED"
var string buyState  = "ARMED"

// ── Session gate: London + NY (07:00–21:00 UTC) ──
inSession = (hour(time, "UTC") >= 7) and (hour(time, "UTC") < 21)

// ── Close-confirmed signals ONLY ──
sellTapZone = (high >= lvlDP) and (high <= 4635.00)
sellTrig    = barstate.isconfirmed and inSession and sellTapZone and (close < 4615.00) and ta.crossunder(close, 4615.00)
sellInv     = barstate.isconfirmed and (close > lvlDR1)
sellT1      = barstate.isconfirmed and (close < lvlDS1)
sellT2      = barstate.isconfirmed and (close < lvlDS2)

buyTapZone  = (low <= lvlDS2) and (low >= lvlWP)
buyTrig     = barstate.isconfirmed and inSession and buyTapZone and (close > lvlDS2) and ta.crossover(close, lvlDS2)
buyInv      = barstate.isconfirmed and (close < lvlDS3)
buyT1       = barstate.isconfirmed and (close > lvlDP)
buyT2       = barstate.isconfirmed and (close > lvlDR1)

if barstate.isconfirmed
    if sellTrig
        sellState := "TRIGGERED"
    if sellInv
        sellState := "INVALIDATED"
    if sellT2
        sellState := "TARGET 2 HIT"
    if buyTrig
        buyState := "TRIGGERED"
    if buyInv
        buyState := "INVALIDATED"
    if buyT2
        buyState := "TARGET 2 HIT"

// ── Alerts (close-confirmed, once per bar close) ──
alertcondition(sellTrig, title="Gold SELL trigger — daily P/golden pocket", message="XAUUSD SELL TRIGGERED — tap of 4619-4635 with close < 4615 (session-gated)")
alertcondition(sellInv,  title="Gold SELL invalidation — R1",              message="XAUUSD SELL INVALIDATED — close > 4658.60 (Daily R1)")
alertcondition(sellT1,   title="Gold SELL Target 1 — S1",                  message="XAUUSD SELL TARGET 1 hit — close < 4577.22 (Daily S1)")
alertcondition(sellT2,   title="Gold SELL Target 2 — S2",                  message="XAUUSD SELL TARGET 2 hit — close < 4537.92 (Daily S2)")
alertcondition(buyTrig,  title="Gold BUY trigger — weekly pivot reclaim",  message="XAUUSD BUY TRIGGERED — flush 4515-4538 with close > 4538 (session-gated)")
alertcondition(buyInv,   title="Gold BUY invalidation — S3",               message="XAUUSD BUY INVALIDATED — close < 4495.84 (Daily S3)")
alertcondition(buyT1,    title="Gold BUY Target 1 — Daily P",              message="XAUUSD BUY TARGET 1 hit — close > 4619.30 (Daily P)")
alertcondition(buyT2,    title="Gold BUY Target 2 — Daily R1",             message="XAUUSD BUY TARGET 2 hit — close > 4658.60 (Daily R1)")

// ── Corner banner (HUD — intentionally screen-anchored) ──
var table hud = table.new(position.top_right, 2, 6, bgcolor=color.new(color.black, 20), border_width=1, force_overlay=true)
if barstate.islast
    table.cell(hud, 0, 0, "GOLD DESK",           text_color=color.yellow, bgcolor=color.new(color.black, 10), text_size=size.normal)
    table.cell(hud, 1, 0, "2026-08-27",          text_color=color.white,  bgcolor=color.new(color.black, 10), text_size=size.small)
    table.cell(hud, 0, 1, "Net bias",            text_color=color.silver, text_size=size.small)
    table.cell(hud, 1, 1, "SELL (tactical)",     text_color=color.red,    text_size=size.normal)
    table.cell(hud, 0, 2, "Real 10y",            text_color=color.silver, text_size=size.small)
    table.cell(hud, 1, 2, "2.34% (+2 bp)",       text_color=color.red,    text_size=size.small)
    table.cell(hud, 0, 3, "Fed odds",            text_color=color.silver, text_size=size.small)
    table.cell(hud, 1, 3, "64% hold / 36% HIKE", text_color=color.orange, text_size=size.small)
    table.cell(hud, 0, 4, "SELL state",          text_color=color.silver, text_size=size.small)
    table.cell(hud, 1, 4, sellState,             text_color=color.red,    text_size=size.small)
    table.cell(hud, 0, 5, "BUY state",           text_color=color.silver, text_size=size.small)
    table.cell(hud, 1, 5, buyState,              text_color=color.lime,   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

Fade the pivot, buy the flush, respect the trend