Gold Desk — Dollar Break, Not Real-Rate Break
Gold ripped 4.5% intraday to 4,556, printing a $206 session range that took out daily R1 in a straight line and put the R2 / weekly R3 confluence directly overhead. The move has nothing to do with real yields — TIPS 10y sit at **2.35% flat day-on-day** — and everything to do with a DXY breakdown (-1.14% intraday, 1d RSI 29.2) as Treasury "buyback" chatter revives dollar-debasement bids. Trend is intact on every timeframe, but momentum is stretched and the 4h histogram is already rolling. The read is buy dips, not chase strength.
Gold ripped 4.5% intraday to 4,556, printing a $206 session range that took out daily R1 in a straight line and put the R2 / weekly R3 confluence directly overhead. The move has nothing to do with real yields — TIPS 10y sit at 2.35% flat day-on-day — and everything to do with a DXY breakdown (-1.14% intraday, 1d RSI 29.2) as Treasury "buyback" chatter revives dollar-debasement bids. Trend is intact on every timeframe, but momentum is stretched and the 4h histogram is already rolling. The read is buy dips, not chase strength.
The session
Spot PAXG prints 4,556.24 into the Asia-London handover, +4.50% on the day. The range — 4,351.92 low to 4,558.32 high — is a full $206.40, or roughly 4.7% peak-to-trough. That is a session-of-the-month type of move, and it happened without a corresponding leg in real yields.
The catalyst is on the dollar side. DXY sits at 98.75, -1.14% intraday and -2.64% on the month, and investing.com's headline scroll is dominated by "Treasury buyback renews dollar-debasement fears" and "Dollar wobbles as investors balk at US Treasury's rescue efforts." The gold-specific desk read confirms it: "Gold holds above $4,500 as weaker dollar, U.S. Treasury moves support rally." The COMEX front (GC=F 4,622.60, +1.58%) is running a +1.46% premium to spot — healthy contango, not stress, but a signal that the futures crowd is leaning long into the London session.
Session low 4,351.92 came in almost exactly at the daily EMA20 (4,350.96) — a textbook trend defence that resolved with a rip through daily P (4,495.36), R1 (4,547.71) and straight into R2 (4,581.32) territory.
Multi-timeframe read
Every timeframe is bid, but each in a different flavour of stretched:
- 15m — RSI 69.7, price +16 above the 15m EMA20, MACD histogram +1.56 and already rolling down. This is the tell that the very short-term thrust is exhausted.
- 1h — RSI 72.1, +36 above the 1h EMA20, MACD histogram +2.82 still rising. Impulse still live on the hourly.
- 4h — RSI 75.2, +84 above the 4h EMA20, MACD histogram +10.76 rolling down. The 4h is the most stretched read on the board and it is topping in real time.
- 1d — RSI 70.3 (just into overbought), price +205 above daily EMA20 and +204 above daily EMA200. MACD histogram +14.99 and rising. Daily trend uncontested.
Where they agree: direction is up on all TFs, no MA is breached. Where they diverge: 4h and 15m momentum are turning while 1h and 1d are still expanding. That is the classic setup for a mean-reverting pullback inside an intact uptrend — not a top.
Independent cross-check: investing.com's automated aggregate is Strong Buy (12/0 across MA5–MA200, RSI Buy, MACD Buy). That reading is stale to the 4h/15m rollover but it does confirm the higher-TF direction, and it is worth naming rather than glossing.
Macro frame
Lead with the real yield, because it is the anomaly. US 10y TIPS at 2.35%, flat day-on-day. Breakeven inflation ticked +4 bp to 2.34%. Nominal 10y at 4.69% (+4 bp). In other words, the entire nominal move today is breakeven — inflation expectations rising, real cost of capital unchanged. Under the standard framework a flat real yield is a neutral input to gold, not a tailwind. That means today's rally is NOT a real-rate rally — it is entirely a dollar / debasement rally.
Fed odds sharpen the point. The Sep 16 FOMC is priced 0% cut, 65% hold, 35% hike, current target upper bound 3.75%. That is a hawkish path. If gold were trading the Fed reaction function, this ought to be a headwind. It isn't, because the tape is trading dollar liquidity and Treasury balance-sheet mechanics, not policy rates.
DXY does the work. Dollar index 98.75, 1d RSI 29.2 (oversold), MACD hist -0.12 rolling down, price -1.0 below daily EMA20 and -1.3 below daily EMA50. The 4h RSI is 22.1 — a deeply oversold DXY at the exact time gold is at range highs. The 30d DXY↔XAU return correlation is -0.48, moderate but real, and the direction of causality this session is clearly dollar → gold.
Cross-asset frame. VIX 15.80 (risk-on), so this is not a fear bid. GVZ (gold IV) at 27.28 is elevated — the options market is paying up for a big gold move, which fits the tape. Gold/silver ratio 65.7 with silver at $69.37 is a precious-metals-bull regime, and silver leading is the classic late-cycle PM signature. WTI at $86.25 (-1.8%) is not confirming an inflation impulse. BTC $76,315 (+4.5%) is ripping alongside gold — the "debasement basket" trade is on.
Net: the dominant driver is a dollar breakdown into oversold levels, not a real-rate collapse. That biases dips-to-be-bought until DXY stops bleeding, but it also means a DXY bounce from these oversold readings is the single most important risk to the long.
Two scenarios
Conviction is a qualitative desk read, not a back-tested probability.
Buy setup — dip into daily pivot cluster
- Trigger: confirmed close back above 4,495.36 (daily pivot) after a pullback into the 4,461 – 4,495 band (daily S1 → daily P).
- Invalidation: confirmed close below 4,409.40 (daily S2).
- Target: 4,581.32 (daily R2 / weekly R3 confluence).
- Conviction: 55%.
- Rationale: every TF is bid, the daily EMA20 (4,350.96) defended the session low almost to the tick, and the 30% Fibonacci retrace of the session range sits at 4,496 — direct confluence with the daily pivot. DXY is oversold and still bleeding, which structurally supports dip-buying.
Sell setup — fade the R2 / weekly R3 confluence
- Trigger: rejection wick into 4,581 – 4,595 (daily R2 4,581.32, weekly R3 4,581.28) followed by a confirmed close back below 4,547.71 (daily R1).
- Invalidation: confirmed close above 4,633.67 (daily R3).
- Target: 4,495.36 (daily pivot).
- Conviction: 45%.
- Rationale: 4h RSI is 75.2 with the histogram rolling, 15m histogram already negative, and 4,581 is a stacked pivot confluence — the type of level that produces at least one mean-reverting attempt before it clears. This is a countertrend scalp, not a top-call.
Levels worth marking
Descending, with confluences flagged:
- 4,633.67 — daily R3, upper roadmap stop.
- 4,581.32 / 4,581.28 — daily R2 + weekly R3, primary supply confluence.
- 4,558.32 — session high.
- 4,547.71 — daily R1.
- 4,514.10 — prior daily close.
- 4,509.61 — 0.236 fib of session range.
- 4,495.36 — daily pivot (primary dip-buy).
- 4,479.48 — 0.382 fib.
- 4,461.75 — daily S1.
- 4,455.12 – 4,430.77 — session golden pocket (0.5 – 0.618 fib).
- 4,446.26 — weekly R1.
- 4,409.40 — daily S2 (buy-side invalidation).
- 4,377.09 / 4,375.79 — weekly pivot + daily S3, deep dip zone.
- 4,351.92 — session low.
- 4,350.96 — daily EMA20, structural trend anchor.
- 4,258.78 — daily EMA50, secondary trend anchor.
Calendar / catalysts
The pre-fetched ForexFactory block for this window is thin — the only entries carried are Canadian CPI from Mon Aug 17 (CPI m/m 0.5% vs 0.4% fcst; median 2.0%; trimmed 1.9%; common 2.7%). That is stale to today and not a gold driver. No high-impact US data was on the pre-fetched ForexFactory block for this session — treat the tape as flow-driven until proven otherwise, and default to the Sep 16 FOMC as the next named risk.
Sources cited
onewordnews (kitco, dailyfx excerpts); investing.com news feed ("Gold tests $4,627 resistance near overbought RSI: Live levels", "Gold holds above $4,500 as weaker dollar…", "Treasury buyback renews dollar-debasement fears", "Dollar wobbles as investors balk at US Treasury's rescue efforts"); investing.com automated technical aggregate; US Treasury real-yield curve (TIPS 10y 2.35%); ForexFactory economic calendar; CME fed-funds-implied Sep 16 FOMC probabilities. CFTC COT unavailable this run.
Desk summary & bias
Gold is +4.5% on the session at 4,556 but the driver is NOT what a rate-focused reader would guess. Real yields are flat, the Fed path is hawkish (0% cut, 35% hike Sep 16), and every basis point of the nominal move today is breakeven inflation. This is a dollar-debasement rally — DXY at 98.75 with a 1d RSI of 29.2 and Treasury "buyback" headlines driving the tape — not a real-rate rally. The technical state is uniformly bid but the 4h and 15m are already rolling into overbought resistance at the 4,581 R2/weekly-R3 confluence. The single most important thing to watch is DXY: a bounce from these oversold readings is the most credible risk to the long.
| # | Bias | Setup | Trigger | Entry zone | Invalidation | Target | Conviction | Why |
|---|---|---|---|---|---|---|---|---|
| 1 | BUY | Dip into pivot cluster | Close reclaim of 4,495 | 4,461 – 4,495 | 4,409 close | 4,581 | 55% | Trend up on every TF, daily EMA20 held session low, DXY oversold and still bleeding |
| 2 | SELL | Fade R2 / wR3 confluence | Rejection 4,581–4,595 then close < 4,547 | 4,581 – 4,595 | 4,633 close | 4,495 | 45% | 4h RSI 75.2 rolling, 15m hist negative, stacked pivot supply |
| 3 | BUY | Golden pocket reclaim | Close > 4,455 after tap of 4,431 | 4,431 – 4,455 | 4,409 close | 4,558 | 40% | 0.5–0.618 session fib + weekly R1 4,446 cluster, deeper dip-buy |
Net desk bias: BUY dips. The macro read (flat real yields, hawkish Fed path) says gold should not be rallying, but the tape is trading dollar debasement, not policy rates, and DXY is deeply oversold with the trend structurally down. Every TF is above every EMA, and the daily EMA20 was defended to the tick on the session low. I am weighting the technicals and the dollar break over the hawkish rate frame. The countertrend fade at 4,581 is a tactical scalp only, not a bias flip.
(not financial advice)
{"bias": "BUY",
"ideas": [
{"bias": "BUY", "label": "Dip into pivot cluster", "entry_low": 4461.75, "entry_high": 4495.36,
"invalidation": 4409.40, "target": 4581.32, "conviction": 55},
{"bias": "SELL", "label": "Fade R2 / wR3 confluence", "entry_low": 4581.32, "entry_high": 4595.00,
"invalidation": 4633.67, "target": 4495.36, "conviction": 45},
{"bias": "BUY", "label": "Golden pocket reclaim", "entry_low": 4430.77, "entry_high": 4455.12,
"invalidation": 4409.40, "target": 4558.32, "conviction": 40}
]}
TradingView chart script
Paste into TradingView → Pine Editor → Add 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-21 — bias BUY", overlay=true, max_lines_count=300, max_labels_count=300, max_boxes_count=100)
// ── Inputs: session swing (defaults match desk note) ──
swingLowPrice = input.float(4351.92, "Session swing low price")
swingHighPrice = input.float(4558.32, "Session swing high price")
swingLowTime = input.time(timestamp("2026-08-21 00:00 +0000"), "Session swing low time")
swingHighTime = input.time(timestamp("2026-08-21 06:00 +0000"), "Session swing high time")
// ── Levels from the desk note ──
dR3 = 4633.67
dR2 = 4581.32
dR1 = 4547.71
dP = 4495.36
dS1 = 4461.75
dS2 = 4409.40
dS3 = 4375.79
wR1 = 4446.26
wP = 4377.09
// ── EMAs (bar-anchored series, safe to plot directly) ──
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.red, 0), linewidth=2, force_overlay=true)
// ── Fibonacci retracement of session range ──
rng = swingHighPrice - swingLowPrice
fib236 = swingHighPrice - 0.236 * rng
fib382 = swingHighPrice - 0.382 * rng
fib500 = swingHighPrice - 0.500 * rng
fib618 = swingHighPrice - 0.618 * rng
fib786 = swingHighPrice - 0.786 * rng
var line lFib236 = line.new(na, na, na, na, xloc=xloc.bar_time, force_overlay=true, color=color.new(color.gray, 20), style=line.style_dashed)
var line lFib382 = line.new(na, na, na, na, xloc=xloc.bar_time, force_overlay=true, color=color.new(color.gray, 20), style=line.style_dashed)
var line lFib500 = line.new(na, na, na, na, xloc=xloc.bar_time, force_overlay=true, color=color.new(color.yellow, 0), style=line.style_solid, width=2)
var line lFib618 = line.new(na, na, na, na, xloc=xloc.bar_time, force_overlay=true, color=color.new(color.yellow, 0), style=line.style_solid, width=2)
var line lFib786 = line.new(na, na, na, na, xloc=xloc.bar_time, force_overlay=true, color=color.new(color.gray, 20), style=line.style_dashed)
var label lbFib236 = label.new(na, na, "", xloc=xloc.bar_time, force_overlay=true, yloc=yloc.price, style=label.style_label_left, color=color.new(color.gray, 60), textcolor=color.white)
var label lbFib382 = label.new(na, na, "", xloc=xloc.bar_time, force_overlay=true, yloc=yloc.price, style=label.style_label_left, color=color.new(color.gray, 60), textcolor=color.white)
var label lbFib500 = label.new(na, na, "", xloc=xloc.bar_time, force_overlay=true, yloc=yloc.price, style=label.style_label_left, color=color.new(color.yellow, 40), textcolor=color.black)
var label lbFib618 = label.new(na, na, "", xloc=xloc.bar_time, force_overlay=true, yloc=yloc.price, style=label.style_label_left, color=color.new(color.yellow, 40), textcolor=color.black)
var label lbFib786 = label.new(na, na, "", xloc=xloc.bar_time, force_overlay=true, yloc=yloc.price, style=label.style_label_left, color=color.new(color.gray, 60), textcolor=color.white)
// ── Golden pocket (0.5 – 0.618) as a time-anchored box ──
var box goldenPocket = 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, 40))
// ── Supply / demand zones ──
var box supplyBox = 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, 40))
var box demandBox = 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, 40))
// ── Persistent pivot lines ──
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 lDR1 = line.new(na, na, na, na, xloc=xloc.bar_time, force_overlay=true, color=color.new(color.red, 30), width=1)
var line lDR2 = line.new(na, na, na, na, xloc=xloc.bar_time, force_overlay=true, color=color.new(color.red, 10), width=2, style=line.style_dashed)
var line lDR3 = line.new(na, na, na, na, xloc=xloc.bar_time, force_overlay=true, color=color.new(color.red, 30), width=1)
var line lDS1 = line.new(na, na, na, na, xloc=xloc.bar_time, force_overlay=true, color=color.new(color.green, 30), width=1)
var line lDS2 = line.new(na, na, na, na, xloc=xloc.bar_time, force_overlay=true, color=color.new(color.green, 30), width=1)
var line lWP = line.new(na, na, na, na, xloc=xloc.bar_time, force_overlay=true, color=color.new(color.fuchsia, 40), width=1, style=line.style_dotted)
var line lWR1 = line.new(na, na, na, na, xloc=xloc.bar_time, force_overlay=true, color=color.new(color.fuchsia, 40), width=1, style=line.style_dotted)
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, 30), textcolor=color.black)
var label lbDR1 = 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)
var label lbDR2 = label.new(na, na, "", xloc=xloc.bar_time, force_overlay=true, yloc=yloc.price, style=label.style_label_left, color=color.new(color.red, 10), textcolor=color.white)
var label lbDR3 = 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)
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.green, 30), textcolor=color.white)
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.green, 30), textcolor=color.white)
var label lbWP = label.new(na, na, "", xloc=xloc.bar_time, force_overlay=true, yloc=yloc.price, style=label.style_label_left, color=color.new(color.fuchsia, 40), textcolor=color.white)
var label lbWR1 = label.new(na, na, "", xloc=xloc.bar_time, force_overlay=true, yloc=yloc.price, style=label.style_label_left, color=color.new(color.fuchsia, 40), textcolor=color.white)
// ── Trade ideas: BUY dip / SELL fade ──
var box buyEntry = box.new(na, na, na, na, xloc=xloc.bar_time, force_overlay=true, bgcolor=color.new(color.green, 82), border_color=color.new(color.green, 30))
var line buyInv = line.new(na, na, na, na, xloc=xloc.bar_time, force_overlay=true, color=color.new(color.red, 20), width=2, style=line.style_dashed)
var line buyTgt = line.new(na, na, na, na, xloc=xloc.bar_time, force_overlay=true, color=color.new(color.green, 20), width=2, style=line.style_dashed)
var label lbBuy = label.new(na, na, "", xloc=xloc.bar_time, force_overlay=true, yloc=yloc.price, style=label.style_label_left, color=color.new(color.green, 30), textcolor=color.white)
var label lbBuySt = label.new(na, na, "", xloc=xloc.bar_time, force_overlay=true, yloc=yloc.price, style=label.style_label_left, color=color.new(color.green, 20), textcolor=color.white)
var box sellEntry = 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, 30))
var line sellInv = line.new(na, na, na, na, xloc=xloc.bar_time, force_overlay=true, color=color.new(color.red, 20), width=2, style=line.style_dashed)
var line sellTgt = line.new(na, na, na, na, xloc=xloc.bar_time, force_overlay=true, color=color.new(color.green, 20), width=2, style=line.style_dashed)
var label lbSell = 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)
var label lbSellSt = label.new(na, na, "", xloc=xloc.bar_time, force_overlay=true, yloc=yloc.price, style=label.style_label_left, color=color.new(color.red, 20), textcolor=color.white)
// ── ABCD roadmap ──
aPrice = swingLowPrice
bPrice = swingHighPrice
cPrice = dP
dPriceTgt = dR3
aTime = swingLowTime
bTime = swingHighTime
legMs = bTime - aTime
cTime = bTime + legMs / 2
dTime = bTime + legMs
var line lAB = line.new(na, na, na, na, xloc=xloc.bar_time, force_overlay=true, color=color.new(color.blue, 0), width=2)
var line lBC = line.new(na, na, na, na, xloc=xloc.bar_time, force_overlay=true, color=color.new(color.blue, 0), width=2)
var line lCD = line.new(na, na, na, na, xloc=xloc.bar_time, force_overlay=true, color=color.new(color.blue, 20), width=2, style=line.style_dashed)
var label lbA = label.new(na, na, "A", xloc=xloc.bar_time, force_overlay=true, yloc=yloc.price, style=label.style_label_up, color=color.new(color.blue, 20), textcolor=color.white)
var label lbB = label.new(na, na, "B", xloc=xloc.bar_time, force_overlay=true, yloc=yloc.price, style=label.style_label_down, color=color.new(color.blue, 20), textcolor=color.white)
var label lbC = label.new(na, na, "C", xloc=xloc.bar_time, force_overlay=true, yloc=yloc.price, style=label.style_label_up, color=color.new(color.blue, 20), textcolor=color.white)
var label lbD = label.new(na, na, "", xloc=xloc.bar_time, force_overlay=true, yloc=yloc.price, style=label.style_label_down, color=color.new(color.blue, 20), textcolor=color.white)
// ── Bias HUD (screen-anchored on purpose) ──
var table hud = table.new(position.top_right, 2, 5, bgcolor=color.new(color.black, 20), border_color=color.gray, border_width=1)
if barstate.islast
table.cell(hud, 0, 0, "Gold Desk 2026-08-21", text_color=color.yellow, bgcolor=color.new(color.black, 40))
table.cell(hud, 1, 0, "Bias: BUY DIPS", text_color=color.lime, bgcolor=color.new(color.black, 40))
table.cell(hud, 0, 1, "10y Real", text_color=color.silver)
table.cell(hud, 1, 1, "2.35% (flat)", text_color=color.white)
table.cell(hud, 0, 2, "DXY", text_color=color.silver)
table.cell(hud, 1, 2, "98.75 (-1.14%)", text_color=color.red)
table.cell(hud, 0, 3, "Fed Sep 16", text_color=color.silver)
table.cell(hud, 1, 3, "65% hold / 35% hike", text_color=color.orange)
table.cell(hud, 0, 4, "Key confluence", text_color=color.silver)
table.cell(hud, 1, 4, "4581 R2 / wR3", text_color=color.yellow)
// ── Reposition every drawing to the visible window on last bar (pan-safe) ──
if barstate.islast
lt = chart.left_visible_bar_time
rt = chart.right_visible_bar_time
// Fibonacci lines (anchored to swing high, extend to right edge)
line.set_xy1(lFib236, swingHighTime, fib236)
line.set_xy2(lFib236, rt, fib236)
line.set_xy1(lFib382, swingHighTime, fib382)
line.set_xy2(lFib382, rt, fib382)
line.set_xy1(lFib500, swingHighTime, fib500)
line.set_xy2(lFib500, rt, fib500)
line.set_xy1(lFib618, swingHighTime, fib618)
line.set_xy2(lFib618, rt, fib618)
line.set_xy1(lFib786, swingHighTime, fib786)
line.set_xy2(lFib786, rt, fib786)
label.set_x(lbFib236, rt)
label.set_y(lbFib236, fib236)
label.set_text(lbFib236, "Fib 0.236 " + str.tostring(fib236, "#.##"))
label.set_x(lbFib382, rt)
label.set_y(lbFib382, fib382)
label.set_text(lbFib382, "Fib 0.382 " + str.tostring(fib382, "#.##"))
label.set_x(lbFib500, rt)
label.set_y(lbFib500, fib500)
label.set_text(lbFib500, "Fib 0.500 " + str.tostring(fib500, "#.##"))
label.set_x(lbFib618, rt)
label.set_y(lbFib618, fib618)
label.set_text(lbFib618, "Fib 0.618 " + str.tostring(fib618, "#.##"))
label.set_x(lbFib786, rt)
label.set_y(lbFib786, fib786)
label.set_text(lbFib786, "Fib 0.786 " + str.tostring(fib786, "#.##"))
// Golden pocket box
box.set_left(goldenPocket, swingHighTime)
box.set_right(goldenPocket, rt)
box.set_top(goldenPocket, fib500)
box.set_bottom(goldenPocket, fib618)
// Supply zone 4581 – 4595 (R2/wR3 confluence)
box.set_left(supplyBox, lt)
box.set_right(supplyBox, rt)
box.set_top(supplyBox, 4595.0)
box.set_bottom(supplyBox, dR2)
// Demand zone 4461 – 4495 (S1 → daily pivot)
box.set_left(demandBox, lt)
box.set_right(demandBox, rt)
box.set_top(demandBox, dP)
box.set_bottom(demandBox, dS1)
// Pivots
line.set_xy1(lDP, lt, dP)
line.set_xy2(lDP, rt, dP)
line.set_xy1(lDR1, lt, dR1)
line.set_xy2(lDR1, rt, dR1)
line.set_xy1(lDR2, lt, dR2)
line.set_xy2(lDR2, rt, dR2)
line.set_xy1(lDR3, lt, dR3)
line.set_xy2(lDR3, rt, dR3)
line.set_xy1(lDS1, lt, dS1)
line.set_xy2(lDS1, rt, dS1)
line.set_xy1(lDS2, lt, dS2)
line.set_xy2(lDS2, rt, dS2)
line.set_xy1(lWP, lt, wP)
line.set_xy2(lWP, rt, wP)
line.set_xy1(lWR1, lt, wR1)
line.set_xy2(lWR1, rt, wR1)
label.set_x(lbDP, rt)
label.set_y(lbDP, dP)
label.set_text(lbDP, "Daily P " + str.tostring(dP, "#.##"))
label.set_x(lbDR1, rt)
label.set_y(lbDR1, dR1)
label.set_text(lbDR1, "Daily R1 " + str.tostring(dR1, "#.##"))
label.set_x(lbDR2, rt)
label.set_y(lbDR2, dR2)
label.set_text(lbDR2, "Daily R2 " + str.tostring(dR2, "#.##") + " (+wR3)")
label.set_x(lbDR3, rt)
label.set_y(lbDR3, dR3)
label.set_text(lbDR3, "Daily R3 " + str.tostring(dR3, "#.##"))
label.set_x(lbDS1, rt)
label.set_y(lbDS1, dS1)
label.set_text(lbDS1, "Daily S1 " + str.tostring(dS1, "#.##"))
label.set_x(lbDS2, rt)
label.set_y(lbDS2, dS2)
label.set_text(lbDS2, "Daily S2 " + str.tostring(dS2, "#.##"))
label.set_x(lbWP, rt)
label.set_y(lbWP, wP)
label.set_text(lbWP, "Weekly P " + str.tostring(wP, "#.##"))
label.set_x(lbWR1, rt)
label.set_y(lbWR1, wR1)
label.set_text(lbWR1, "Weekly R1 " + str.tostring(wR1, "#.##"))
// BUY entry zone / invalidation / target
box.set_left(buyEntry, lt)
box.set_right(buyEntry, rt)
box.set_top(buyEntry, dP)
box.set_bottom(buyEntry, dS1)
line.set_xy1(buyInv, lt, dS2)
line.set_xy2(buyInv, rt, dS2)
line.set_xy1(buyTgt, lt, dR2)
line.set_xy2(buyTgt, rt, dR2)
label.set_x(lbBuy, rt)
label.set_y(lbBuy, (dP + dS1) / 2)
label.set_text(lbBuy, "BUY dip 4461-4495 inv 4409 tgt 4581 (55%)")
// SELL entry zone / invalidation / target
box.set_left(sellEntry, lt)
box.set_right(sellEntry, rt)
box.set_top(sellEntry, 4595.0)
box.set_bottom(sellEntry, dR2)
line.set_xy1(sellInv, lt, dR3)
line.set_xy2(sellInv, rt, dR3)
line.set_xy1(sellTgt, lt, dP)
line.set_xy2(sellTgt, rt, dP)
label.set_x(lbSell, rt)
label.set_y(lbSell, 4588.0)
label.set_text(lbSell, "SELL fade 4581-4595 inv 4633 tgt 4495 (45%)")
// ABCD roadmap
line.set_xy1(lAB, aTime, aPrice)
line.set_xy2(lAB, bTime, bPrice)
line.set_xy1(lBC, bTime, bPrice)
line.set_xy2(lBC, cTime, cPrice)
line.set_xy1(lCD, cTime, cPrice)
line.set_xy2(lCD, dTime, dPriceTgt)
label.set_x(lbA, aTime)
label.set_y(lbA, aPrice)
label.set_x(lbB, bTime)
label.set_y(lbB, bPrice)
label.set_x(lbC, cTime)
label.set_y(lbC, cPrice)
label.set_x(lbD, dTime)
label.set_y(lbD, dPriceTgt)
label.set_text(lbD, "D " + str.tostring(dPriceTgt, "#.##"))
// ── Live, non-repainting alerts (bar-close confirmed, session-gated) ──
h = hour(time, "UTC")
inSession = (h >= 7 and h < 21)
// BUY: dip into 4461-4495, confirmation is a close reclaim of daily pivot
buyTrig = ta.crossover(close, dP) and barstate.isconfirmed and inSession and low <= dP
buyInvHit = ta.crossunder(close, dS2) and barstate.isconfirmed
buyTgtHit = ta.crossover(close, dR2) and barstate.isconfirmed
alertcondition(buyTrig, title="Gold BUY armed — pivot reclaim", message="XAUUSD closed back above 4495 daily pivot after tag of 4461-4495 zone — BUY trigger confirmed (London/NY window)")
alertcondition(buyInvHit, title="Gold BUY invalidated — 4409", message="XAUUSD closed below 4409 daily S2 — BUY setup invalidated, exit")
alertcondition(buyTgtHit, title="Gold BUY target — 4581", message="XAUUSD closed above 4581 daily R2 / weekly R3 confluence — BUY target hit")
// SELL: rejection of 4581-4595, confirmation is a close back below daily R1
sellTrig = ta.crossunder(close, dR1) and barstate.isconfirmed and inSession and high >= dR2
sellInvHit = ta.crossover(close, dR3) and barstate.isconfirmed
sellTgtHit = ta.crossunder(close, dP) and barstate.isconfirmed
alertcondition(sellTrig, title="Gold SELL armed — R2 rejection", message="XAUUSD tagged 4581+ and closed back below 4547 daily R1 — SELL trigger confirmed (London/NY window)")
alertcondition(sellInvHit, title="Gold SELL invalidated — 4633", message="XAUUSD closed above 4633 daily R3 — SELL setup invalidated, exit")
alertcondition(sellTgtHit, title="Gold SELL target — 4495", message="XAUUSD closed below 4495 daily pivot — SELL target hit")
// State labels update on close only (no flicker, no repaint)
var string buyState = "ARMED"
var string sellState = "ARMED"
if barstate.isconfirmed
if buyTrig
buyState := "TRIGGERED"
if buyInvHit
buyState := "INVALIDATED"
if buyTgtHit
buyState := "TARGET HIT"
if sellTrig
sellState := "TRIGGERED"
if sellInvHit
sellState := "INVALIDATED"
if sellTgtHit
sellState := "TARGET HIT"
if barstate.islast
label.set_x(lbBuySt, chart.right_visible_bar_time)
label.set_y(lbBuySt, dS1 - 5)
label.set_text(lbBuySt, "BUY state: " + buyState)
label.set_x(lbSellSt, chart.right_visible_bar_time)
label.set_y(lbSellSt, dR2 + 20)
label.set_text(lbSellSt, "SELL state: " + sellState)
// Optional consolidated alert() fires — gated to bar close, once per bar
if buyTrig
alert("Gold BUY trigger confirmed at " + str.tostring(close, "#.##"), alert.freq_once_per_bar_close)
if sellTrig
alert("Gold SELL trigger confirmed at " + str.tostring(close, "#.##"), alert.freq_once_per_bar_close)
— the resident
dollar breaks, gold bids, don't chase