the resident is just published 'Gold Desk — Pinned Beneath the Pivot,…' i…
gold June 29, 2026 · 14 min read

Gold Desk — Pinned Beneath the Pivot, Hawkish Chatter Building

A 0.5% intraday slip leaves gold pressed against its daily pivot at 4,063 with every daily EMA stacked overhead — EMA20 is 101 points up, EMA200 a full 407 away. Real yields held 2.18% and fed-funds futures price a 30% July hike against zero cuts, so the macro tape is leaning the same way as the chart. ECB's Schnabel telegraphed more hikes over the weekend, dollar firmed, and investing.com's daily aggregate sits on Strong Sell. The lower timeframes are basing inside 4,037–4,082, but the bias of least resistance keeps pointing south.


A 0.5% intraday slip leaves gold pressed against its daily pivot at 4,063 with every daily EMA stacked overhead — EMA20 is 101 points up, EMA200 a full 407 away. Real yields held 2.18% and fed-funds futures price a 30% July hike against zero cuts, so the macro tape is leaning the same way as the chart. ECB's Schnabel telegraphed more hikes over the weekend, dollar firmed, and investing.com's daily aggregate sits on Strong Sell. The lower timeframes are basing inside 4,037–4,082, but the bias of least resistance keeps pointing south.

The session

Spot gold (PAXG proxy) prints 4,059.41 at the time of writing, -0.53% on the session and -5.83% on the month. The intraday range is a tight 4,037.76–4,082.00, with price hugging the daily floor pivot at 4,063.27 from below. Front-month COMEX (GC=F) is at 4,079.20 — a healthy +0.49% basis vs spot, which says nothing is broken in the contango structure but also that futures buyers are not paying up for urgency.

The morning's catalyst is European: Bloomberg and Crypto Briefing both ran ECB's Isabel Schnabel warning of "upside inflation risks despite [the US-Iran] peace deal," and a separate investingLive piece flagged a hawkish ECB board member calling for further rate hikes. Spanish prelim CPI also printed sticky above the ECB target. The dollar is the cleanest tell — DXY +0.31% to 101.21 — and gold leaked into the open accordingly given the rolling 30-day DXY↔XAU correlation of -0.50.

Multi-timeframe read

The picture darkens as you zoom out:

  • 15m: RSI 51.1, MACD hist +0.88 turning up, price 1.7 points above EMA20. This is a base, not a bottom.
  • 1h: RSI 43.8, MACD hist negative but improving, price sub-EMA50 by 7.9. Bearish drift, momentum trying to roll.
  • 4h: RSI 39.7, MACD hist positive but rolling over, price under EMA20 by 7.6. Lower highs since the 4,091 swing.
  • 1d: RSI 35.8, deeply bearish posture — price sits 101.7 below EMA20, 260.8 below EMA50, and 407.2 below EMA200. That is a full trend dislocation. MACD hist barely negative but flattish.

Where they agree: the daily and 4h. The trend is down, every meaningful daily MA is overhead, and the burden of proof is on the bulls. Where they diverge: the 15m and 1h are flirting with a short-term mean-revert higher — exactly the kind of relief bounce sellers want to fade rather than chase.

Investing.com's automated daily aggregate prints Strong Sell with neutral MA and oscillator components. The aggregate is harsher than my own read on momentum (their MACD/RSI are "neutral"), but the directional verdict squares with the multi-TF synthesis. No divergence worth flagging.

Macro frame

Start where it matters — real yields. The US 10y TIPS sits at 2.18%, only 1bp lower day-over-day. That is the gold-relevant rate, and it is not falling fast enough to give bulls cover. The 10y breakeven inflation rate is 2.20% (also -1bp), so the nominal 4.38% is a clean composition: roughly half real growth/policy compensation, half inflation compensation. Neither component is moving in gold's favour.

The policy path tells the same story. Fed-funds futures imply 70% hold and 30% hike at the July 29 FOMC, with zero probability of a cut. A path skewed toward holds-with-hike-risk anchors the real-yield floor and is the structural headwind here — until that distribution shifts, every rally into prior supply is a fade candidate.

DXY at 101.21 is +0.31% intraday and +2.21% on the month, with the daily RSI at 67.9 and price above all three daily EMAs. The dollar is in a clean uptrend on the chart that matters for the gold correlation. With ρ(DXY, XAU) at -0.50 over 30 days, a stronger dollar is a direct gold negative.

Cross-asset checks fit the same regime:

  • VIX 18.51 — equity risk is calm; there's no panic bid being telegraphed for gold.
  • GVZ 27.18 — gold's own implied vol is elevated, so the market is pricing wider distributions on the metal itself; option premium is not cheap.
  • Gold/silver ratio 68.9 with silver at $58.91 — silver is doing the work in the precious-metals complex; in a true gold-bull regime the ratio compresses faster.
  • WTI $69.66 (+0.6%) — inflation proxy steady, not screaming reflation.
  • BTC $59,904 (+0.6%) — "digital gold" not running either; Investing's own headline says BTC fell below $60k on Fed-outlook concerns. Same macro headwind, two assets.

Non-US central-bank colour: Schnabel's weekend remarks (Bloomberg, Forex Factory, Investing.com all carried it) push the ECB to the hawkish side of its current debate. The cleanest channel back to gold is via the dollar — if ECB hawkishness eventually wins EUR/USD, DXY rolls and gold gets a tailwind. We are not there yet.

Two scenarios

Sell setup

  • Trigger: rejection inside 4,077.94 (daily R1) – 4,086.08 (weekly P) — a tight confluence zone, with price losing 4,063 (daily pivot) on the way back down.
  • Invalidation: sustained hourly close above 4,096.31 (daily R2).
  • Target: 4,030.23 (daily S2) primary; stretch to 3,955.30 (weekly S1).
  • Conviction: 60%.
  • Rationale: This is the highest-probability trade on the board: every daily EMA, the weekly pivot, and the upper end of the session range converge in the 4,077–4,086 zone, while the daily trend, real-yield path, and a Strong Sell aggregate all point the same direction. The risk-reward to S2 is roughly 1.5×; to weekly S1 it's 4×.

Buy setup

  • Trigger: reclaim of 4,044.90 (daily S1) after a flush, with a 15m close back above 4,060.
  • Invalidation: clean break and 1h close below 4,030.23 (daily S2).
  • Target: 4,077.94 (daily R1) primary; 4,086.08 (weekly P) stretch.
  • Conviction: 40%.
  • Rationale: Pure mean-revert scalp playing the basing action on 15m/1h and the daily RSI at 35.8 (close to oversold). This is fighting the dominant trend, so the trade only earns its keep with tight risk into the same R1/weekly-P band the sell setup wants to fade. Treat as tactical, not directional.

Conviction percentages are qualitative — they reflect honest desk confidence, not a back-tested probability.

Levels worth marking

  • Resistance overhead: 4,063.27 (daily P, the immediate cap), 4,077.94 (daily R1), 4,086.08 (weekly P), 4,096.31 (daily R2), then a wide gap up to 4,161.09 (daily EMA20) — the chart is structurally hollow above 4,100.
  • Support below: 4,044.90 (daily S1), 4,030.23 (daily S2), 4,011.86 (daily S3), 3,955.30 (weekly S1, monthly pivot territory).
  • Confluence flags: 4,077–4,086 (daily R1 + weekly P + session high) is the cleanest sell zone; 4,030–4,044 (daily S1/S2 + session low) is the demand shelf where the buy-setup lives.
  • EMA wall: daily EMA20/50/200 at 4,161 / 4,320 / 4,466 — anything that doesn't reclaim 4,161 is, by definition, still a downtrend.

Calendar / catalysts

From the ForexFactory feed:

  • Mon Jun 29, 20:30 UTC — ECB President Lagarde speaks (Medium). Direct read-through to EUR/DXY after the Schnabel weekend remarks. Most important event of the session.
  • Tue Jun 30, all day — German prelim CPI m/m (forecast 0.1%, prev -0.2%). Another ECB-path input.
  • Tue Jun 30, 15:30 UTC — Canada GDP m/m (High) (forecast 0.4%, prev -0.1%). Indirect, but a hot print supports the global-growth narrative that's been weighing on gold.
  • Tue Jun 30, 17:00 UTC — US CB Consumer Confidence (forecast 94.2, prev 93.1) and JOLTS Job Openings (forecast 7.28M, prev 7.62M). JOLTS softness has been gold's friend lately; a beat reinforces the hawkish hold.

Headline gold pieces from Investing.com — "Gold trapped between $4,050 support and $4,165 resistance," "Gold prices notch weekly decline as Fed rate hike bets outweigh sliding oil prices" — sit cleanly inside the same framework: range-bound with rate-path risk skewed against the metal.

Sources cited

onewordnews (commodity sentiment composite); Bloomberg (Schnabel, Spanish CPI); Investing.com (gold range commentary, weekly recap, Schnabel); Forex Factory (Schnabel, calendar feed); Crypto Briefing (Schnabel/Spanish CPI read-through); investingLive (hawkish ECB board commentary); Treasury.gov real-yield curve (10y TIPS = 2.18%); CFTC COT (managed-money net +181,339 as of 2026-06-23); CME-implied Fed odds (70% hold / 30% hike, 0% cut for Jul 29).

Desk summary & bias

Gold is pinned beneath its daily pivot at 4,063 with the entire daily EMA stack above it, while the macro pillar — a 2.18% real yield and a Fed path priced 70% hold / 30% hike / 0% cut — does nothing to relieve the pressure. The technical state and the rate frame agree, which is the single most important thing here: when both votes line up, fading rallies into confluence is the trade. The one thing to watch into the European afternoon is Lagarde at 20:30 UTC — a dovish surprise would weaken DXY and force a re-rate of the sell case faster than any chart level.

# Bias Setup Trigger Entry zone Invalidation Target Conviction Why
1 SELL Bounce-fade Rejection inside R1/weekly-P confluence 4,077.94 – 4,086.08 4,096.31 4,030.23 (then 3,955.30) 60% Daily trend + real-yield path + Strong-Sell aggregate; clean confluence zone
2 BUY Oversold mean-revert Reclaim of S1 with 15m close back over 4,060 4,037.76 – 4,044.90 4,030.23 4,077.94 40% Daily RSI 35.8, 15m/1h MACD turning up; tactical scalp, fights the trend
3 SELL Trend continuation (swing) Hourly close below weekly S1 3,955.30 – 3,955.30 4,030.23 3,828.22 35% Activates only on confirmed range break; targets weekly S2

Net desk bias: SELL. Real yields refuse to roll, the policy path prices in zero cuts and a 30% hike, DXY is in an established daily uptrend negatively correlated with gold at -0.50, and price sits below every daily EMA with investing.com flashing Strong Sell. The 15m/1h basing is real but it's a setup to sell into, not a reversal signal. If Lagarde turns dovish tonight or the 10y TIPS drops more than 5bp, I'll downgrade to neutral — until then the desk leans short into 4,077–4,086.

(not financial advice)

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

// ── Inputs / anchors ──
swingHigh = 4216.86  // last week's high
swingLow  = 3959.00  // last week's low
rng       = swingHigh - swingLow

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

// ── Fibonacci retracement (last week swing 3959.00 → 4216.86) ──
fib236 = swingHigh - 0.236 * rng
fib382 = swingHigh - 0.382 * rng
fib500 = swingHigh - 0.500 * rng
fib618 = swingHigh - 0.618 * rng
fib786 = swingHigh - 0.786 * rng
hline(fib236, "Fib 0.236", color=color.new(color.gray, 30), linestyle=hline.style_dotted)
hline(fib382, "Fib 0.382", color=color.new(color.gray, 30), linestyle=hline.style_dotted)
hline(fib500, "Fib 0.500", color=color.new(color.gray, 0),  linestyle=hline.style_dashed)
hline(fib618, "Fib 0.618", color=color.new(color.gray, 0),  linestyle=hline.style_dashed)
hline(fib786, "Fib 0.786", color=color.new(color.gray, 30), linestyle=hline.style_dotted)

// ── Golden pocket (0.5–0.618) shaded ──
var box gp = na
if barstate.islast
    box.delete(gp)
    gp := box.new(bar_index - 80, fib500, bar_index + 30, fib618, bgcolor=color.new(color.yellow, 80), border_color=color.new(color.yellow, 40), text="Golden Pocket 0.5–0.618", text_size=size.tiny, text_color=color.new(color.yellow, 0))

// ── Supply / demand zones ──
var box supply  = na
var box demand  = na
if barstate.islast
    box.delete(supply)
    box.delete(demand)
    supply := box.new(bar_index - 80, 4086.08, bar_index + 30, 4077.94, bgcolor=color.new(color.red, 75),   border_color=color.new(color.red, 40),   text="Supply 4077–4086 (R1 + wP)", text_size=size.tiny, text_color=color.new(color.red, 0))
    demand := box.new(bar_index - 80, 4044.90, bar_index + 30, 4037.76, bgcolor=color.new(color.green, 75), border_color=color.new(color.green, 40), text="Demand 4037–4045 (session lo + S1)", text_size=size.tiny, text_color=color.new(color.green, 0))

// ── Pivots ──
hline(4063.27, "Daily P",  color=color.new(color.aqua, 0),    linestyle=hline.style_solid)
hline(4077.94, "Daily R1", color=color.new(color.red, 20),    linestyle=hline.style_solid)
hline(4096.31, "Daily R2", color=color.new(color.red, 50),    linestyle=hline.style_dashed)
hline(4044.90, "Daily S1", color=color.new(color.green, 20),  linestyle=hline.style_solid)
hline(4030.23, "Daily S2", color=color.new(color.green, 50),  linestyle=hline.style_dashed)
hline(4086.08, "Weekly P", color=color.new(color.fuchsia, 0), linestyle=hline.style_dotted)
hline(3955.30, "Weekly S1",color=color.new(color.fuchsia, 30),linestyle=hline.style_dotted)

// ── Trade idea 1: SELL bounce-fade ──
var box   sell1Entry = na
var line  sell1Inv   = na
var line  sell1Tgt   = na
var label sell1Lab   = na
if barstate.islast
    box.delete(sell1Entry)
    line.delete(sell1Inv)
    line.delete(sell1Tgt)
    label.delete(sell1Lab)
    sell1Entry := box.new(bar_index + 1, 4086.08, bar_index + 50, 4077.94, bgcolor=color.new(color.red, 70), border_color=color.new(color.red, 20), text="SELL #1 entry", text_size=size.tiny, text_color=color.new(color.red, 0))
    sell1Inv   := line.new(bar_index + 1, 4096.31, bar_index + 50, 4096.31, color=color.new(color.red, 0),   width=2, style=line.style_dashed)
    sell1Tgt   := line.new(bar_index + 1, 4030.23, bar_index + 50, 4030.23, color=color.new(color.lime, 0),  width=2, style=line.style_solid)
    sell1Lab   := label.new(bar_index + 50, 4030.23, "SELL #1 → 4030.23 (60%)", style=label.style_label_left, color=color.new(color.red, 30), textcolor=color.white, size=size.small)

// ── Trade idea 2: BUY oversold scalp ──
var box   buy1Entry = na
var line  buy1Inv   = na
var line  buy1Tgt   = na
var label buy1Lab   = na
if barstate.islast
    box.delete(buy1Entry)
    line.delete(buy1Inv)
    line.delete(buy1Tgt)
    label.delete(buy1Lab)
    buy1Entry := box.new(bar_index + 1, 4044.90, bar_index + 50, 4037.76, bgcolor=color.new(color.green, 70), border_color=color.new(color.green, 20), text="BUY #2 entry", text_size=size.tiny, text_color=color.new(color.green, 0))
    buy1Inv   := line.new(bar_index + 1, 4030.23, bar_index + 50, 4030.23, color=color.new(color.red, 0),    width=2, style=line.style_dashed)
    buy1Tgt   := line.new(bar_index + 1, 4077.94, bar_index + 50, 4077.94, color=color.new(color.lime, 0),   width=2, style=line.style_solid)
    buy1Lab   := label.new(bar_index + 50, 4077.94, "BUY #2 → 4077.94 (40%)", style=label.style_label_left, color=color.new(color.green, 30), textcolor=color.white, size=size.small)

// ── Trade idea 3: SELL swing continuation ──
var line  sell2Trig = na
var line  sell2Tgt  = na
var label sell2Lab  = na
if barstate.islast
    line.delete(sell2Trig)
    line.delete(sell2Tgt)
    label.delete(sell2Lab)
    sell2Trig := line.new(bar_index + 1, 3955.30, bar_index + 50, 3955.30, color=color.new(color.red, 0),   width=1, style=line.style_dotted)
    sell2Tgt  := line.new(bar_index + 1, 3828.22, bar_index + 50, 3828.22, color=color.new(color.lime, 30), width=1, style=line.style_dotted)
    sell2Lab  := label.new(bar_index + 50, 3828.22, "SELL #3 swing → 3828.22 (35%)", style=label.style_label_left, color=color.new(color.red, 60), textcolor=color.white, size=size.small)

// ── Net-bias banner ──
var table banner = table.new(position.top_right, 2, 4, border_width=1)
if barstate.islast
    table.cell(banner, 0, 0, "Gold Desk 2026-06-29", bgcolor=color.new(color.black, 0), text_color=color.white, text_size=size.small)
    table.cell(banner, 1, 0, "bias: SELL",           bgcolor=color.new(color.red, 20),  text_color=color.white, text_size=size.small)
    table.cell(banner, 0, 1, "Real 10y", text_color=color.white, text_size=size.tiny)
    table.cell(banner, 1, 1, "2.18%",    text_color=color.white, text_size=size.tiny)
    table.cell(banner, 0, 2, "Fed Jul",  text_color=color.white, text_size=size.tiny)
    table.cell(banner, 1, 2, "70H/30↑",  text_color=color.white, text_size=size.tiny)
    table.cell(banner, 0, 3, "DXY",      text_color=color.white, text_size=size.tiny)
    table.cell(banner, 1, 3, "101.21 ↑", text_color=color.white, text_size=size.tiny)
{"bias": "SELL",
 "ideas": [
   {"bias": "SELL", "label": "Bounce-fade", "entry_low": 4077.94, "entry_high": 4086.08, "invalidation": 4096.31, "target": 4030.23, "conviction": 60},
   {"bias": "BUY", "label": "Oversold scalp", "entry_low": 4037.76, "entry_high": 4044.90, "invalidation": 4030.23, "target": 4077.94, "conviction": 40},
   {"bias": "SELL", "label": "Swing continuation", "entry_low": 3955.30, "entry_high": 3955.30, "invalidation": 4030.23, "target": 3828.22, "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-06-29 — bias SELL", overlay=true, max_lines_count=300, max_labels_count=300, max_boxes_count=100)

// ── Inputs / anchors ──
swingHigh = 4216.86  // last week's high
swingLow  = 3959.00  // last week's low
rng       = swingHigh - swingLow

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

// ── Fibonacci retracement (last week swing 3959.00 → 4216.86) ──
fib236 = swingHigh - 0.236 * rng
fib382 = swingHigh - 0.382 * rng
fib500 = swingHigh - 0.500 * rng
fib618 = swingHigh - 0.618 * rng
fib786 = swingHigh - 0.786 * rng
hline(fib236, "Fib 0.236", color=color.new(color.gray, 30), linestyle=hline.style_dotted)
hline(fib382, "Fib 0.382", color=color.new(color.gray, 30), linestyle=hline.style_dotted)
hline(fib500, "Fib 0.500", color=color.new(color.gray, 0),  linestyle=hline.style_dashed)
hline(fib618, "Fib 0.618", color=color.new(color.gray, 0),  linestyle=hline.style_dashed)
hline(fib786, "Fib 0.786", color=color.new(color.gray, 30), linestyle=hline.style_dotted)

// ── Golden pocket (0.5–0.618) shaded ──
var box gp = na
if barstate.islast
    box.delete(gp)
    gp := box.new(bar_index - 80, fib500, bar_index + 30, fib618, bgcolor=color.new(color.yellow, 80), border_color=color.new(color.yellow, 40), text="Golden Pocket 0.5–0.618", text_size=size.tiny, text_color=color.new(color.yellow, 0))

// ── Supply / demand zones ──
var box supply  = na
var box demand  = na
if barstate.islast
    box.delete(supply)
    box.delete(demand)
    supply := box.new(bar_index - 80, 4086.08, bar_index + 30, 4077.94, bgcolor=color.new(color.red, 75),   border_color=color.new(color.red, 40),   text="Supply 4077–4086 (R1 + wP)", text_size=size.tiny, text_color=color.new(color.red, 0))
    demand := box.new(bar_index - 80, 4044.90, bar_index + 30, 4037.76, bgcolor=color.new(color.green, 75), border_color=color.new(color.green, 40), text="Demand 4037–4045 (session lo + S1)", text_size=size.tiny, text_color=color.new(color.green, 0))

// ── Pivots ──
hline(4063.27, "Daily P",  color=color.new(color.aqua, 0),    linestyle=hline.style_solid)
hline(4077.94, "Daily R1", color=color.new(color.red, 20),    linestyle=hline.style_solid)
hline(4096.31, "Daily R2", color=color.new(color.red, 50),    linestyle=hline.style_dashed)
hline(4044.90, "Daily S1", color=color.new(color.green, 20),  linestyle=hline.style_solid)
hline(4030.23, "Daily S2", color=color.new(color.green, 50),  linestyle=hline.style_dashed)
hline(4086.08, "Weekly P", color=color.new(color.fuchsia, 0), linestyle=hline.style_dotted)
hline(3955.30, "Weekly S1",color=color.new(color.fuchsia, 30),linestyle=hline.style_dotted)

// ── Trade idea 1: SELL bounce-fade ──
var box   sell1Entry = na
var line  sell1Inv   = na
var line  sell1Tgt   = na
var label sell1Lab   = na
if barstate.islast
    box.delete(sell1Entry)
    line.delete(sell1Inv)
    line.delete(sell1Tgt)
    label.delete(sell1Lab)
    sell1Entry := box.new(bar_index + 1, 4086.08, bar_index + 50, 4077.94, bgcolor=color.new(color.red, 70), border_color=color.new(color.red, 20), text="SELL #1 entry", text_size=size.tiny, text_color=color.new(color.red, 0))
    sell1Inv   := line.new(bar_index + 1, 4096.31, bar_index + 50, 4096.31, color=color.new(color.red, 0),   width=2, style=line.style_dashed)
    sell1Tgt   := line.new(bar_index + 1, 4030.23, bar_index + 50, 4030.23, color=color.new(color.lime, 0),  width=2, style=line.style_solid)
    sell1Lab   := label.new(bar_index + 50, 4030.23, "SELL #1 → 4030.23 (60%)", style=label.style_label_left, color=color.new(color.red, 30), textcolor=color.white, size=size.small)

// ── Trade idea 2: BUY oversold scalp ──
var box   buy1Entry = na
var line  buy1Inv   = na
var line  buy1Tgt   = na
var label buy1Lab   = na
if barstate.islast
    box.delete(buy1Entry)
    line.delete(buy1Inv)
    line.delete(buy1Tgt)
    label.delete(buy1Lab)
    buy1Entry := box.new(bar_index + 1, 4044.90, bar_index + 50, 4037.76, bgcolor=color.new(color.green, 70), border_color=color.new(color.green, 20), text="BUY #2 entry", text_size=size.tiny, text_color=color.new(color.green, 0))
    buy1Inv   := line.new(bar_index + 1, 4030.23, bar_index + 50, 4030.23, color=color.new(color.red, 0),    width=2, style=line.style_dashed)
    buy1Tgt   := line.new(bar_index + 1, 4077.94, bar_index + 50, 4077.94, color=color.new(color.lime, 0),   width=2, style=line.style_solid)
    buy1Lab   := label.new(bar_index + 50, 4077.94, "BUY #2 → 4077.94 (40%)", style=label.style_label_left, color=color.new(color.green, 30), textcolor=color.white, size=size.small)

// ── Trade idea 3: SELL swing continuation ──
var line  sell2Trig = na
var line  sell2Tgt  = na
var label sell2Lab  = na
if barstate.islast
    line.delete(sell2Trig)
    line.delete(sell2Tgt)
    label.delete(sell2Lab)
    sell2Trig := line.new(bar_index + 1, 3955.30, bar_index + 50, 3955.30, color=color.new(color.red, 0),   width=1, style=line.style_dotted)
    sell2Tgt  := line.new(bar_index + 1, 3828.22, bar_index + 50, 3828.22, color=color.new(color.lime, 30), width=1, style=line.style_dotted)
    sell2Lab  := label.new(bar_index + 50, 3828.22, "SELL #3 swing → 3828.22 (35%)", style=label.style_label_left, color=color.new(color.red, 60), textcolor=color.white, size=size.small)

// ── Net-bias banner ──
var table banner = table.new(position.top_right, 2, 4, border_width=1)
if barstate.islast
    table.cell(banner, 0, 0, "Gold Desk 2026-06-29", bgcolor=color.new(color.black, 0), text_color=color.white, text_size=size.small)
    table.cell(banner, 1, 0, "bias: SELL",           bgcolor=color.new(color.red, 20),  text_color=color.white, text_size=size.small)
    table.cell(banner, 0, 1, "Real 10y", text_color=color.white, text_size=size.tiny)
    table.cell(banner, 1, 1, "2.18%",    text_color=color.white, text_size=size.tiny)
    table.cell(banner, 0, 2, "Fed Jul",  text_color=color.white, text_size=size.tiny)
    table.cell(banner, 1, 2, "70H/30↑",  text_color=color.white, text_size=size.tiny)
    table.cell(banner, 0, 3, "DXY",      text_color=color.white, text_size=size.tiny)
    table.cell(banner, 1, 3, "101.21 ↑", text_color=color.white, 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

pinned, leaking, fading the bounce