Gold gaps to 4,026 then crawls back — fade the bounce into ECB
Gold spent the European morning trying to convince itself the worst is over: PAXG printed 4,026.48 in the Asian session, the lowest tick since the cycle peak, then rallied back to 4,109 as RSI screamed oversold on every timeframe past 1h. But the daily structure is broken, real yields ticked up another basis point, the Fed is 97% pegged on hold next week, and Strong Sell prints on investing.com's aggregate. The bounce is real, it is short-term, and it is exactly the kind of rip you sell unless the ECB turns the dollar story on its head this afternoon. Net desk bias: SELL the rip into 4,175–4,200.
Gold spent the European morning trying to convince itself the worst is over: PAXG printed 4,026.48 in the Asian session, the lowest tick since the cycle peak, then rallied back to 4,109 as RSI screamed oversold on every timeframe past 1h. But the daily structure is broken, real yields ticked up another basis point, the Fed is 97% pegged on hold next week, and Strong Sell prints on investing.com's aggregate. The bounce is real, it is short-term, and it is exactly the kind of rip you sell unless the ECB turns the dollar story on its head this afternoon. Net desk bias: SELL the rip into 4,175–4,200.
The session
Spot gold (PAXG/USDT proxy) is 4,109.50 at the 08:00 UTC mark, down 4.92% on the day, down 9.28% on the month. The session traded a 328-point range — 4,026.48 low to 4,354.58 high — and the entire move is reactive: investing.com's wire ran "Gold slides more than 4% as Trump threatens more Iran attacks" overnight, followed by "Gold hits extreme RSI 15 oversold: Hourly levels," which captures the structure of the day in two headlines. The down-leg was a textbook risk-off-but-real-yields-up combo: VIX +5.1% to 20.88 (risk fear), DXY +0.53% to 99.99 (dollar bid), real yields +1bp to 2.21% (the bid wasn't for gold). The bounce off 4,026 reclaimed the daily pivot at 4,100.82 and that's exactly where price now sits.
Front-month COMEX is 4,121.50 — basis +0.29% to spot, normal contango, no dislocation signal there.
Multi-timeframe read
- 15m: RSI 59.8, MACD histogram positive but rolling, price +13.3 above EMA20/50 (both clustered at 4,095/4,096). This is the bounce timeframe — momentum is up, exhausted intraday sellers are covering, and the move has carried price back to its short-term mean.
- 1h: RSI 45.9, MACD histogram positive and rising, price kissing the EMA20 at 4,109 from below, EMA50 still 55 points overhead at 4,165. Hourly is in the messy reclaim-or-reject window. A push above 4,165 puts daily R1 (4,175) in play; rejection at the EMA20 takes us back toward the session low.
- 4h: RSI 27.9, MACD histogram still negative but rising, price 83 points below EMA20 at 4,193. This is the timeframe where the oversold-bounce trade lives — but it also tells you the dominant 4h trend is broken to the downside, and the EMA20 is now a ceiling, not a floor.
- 1d: RSI 27.0, MACD histogram negative and still falling (-34.71), price 259 points under daily EMA20 (4,368), 395 below EMA50 (4,504), 416 below EMA200 (4,526). Every daily moving average is overhead in stacked-bear order. Until 4,368 is reclaimed on a daily close, this is a sell-rips tape.
Synthesis: the bounce is a 15m/1h phenomenon, the trend is 4h/1d. Where they agree is direction of dominant flow — down. Where they diverge is the next 24 hours — short-term mean reversion is live, longer-term gravity is intact.
Macro frame
Lead with the real yield because it leads gold. US 10y TIPS real yield is 2.21%, up another basis point on the day. It is small in absolute terms but it is the wrong direction for a gold bull case, and it is the third up-tick in a sequence — that's the headwind. The 10y breakeven (inflation expectation) is 2.34%, also +1bp, and the nominal 10y is 4.55%, +2bp. So the day's curve move was led by real yields, not by inflation expectations being repriced higher. That is unambiguously bearish for gold.
The Fed-funds-implied path corroborates: 97% hold at the June 17 FOMC, only 3% pricing a cut. The market is not flirting with easing. Until that probability flips meaningfully, real yields have an upward bias — and gold has the inverse.
DXY at 99.99, +0.53% intraday, +2.10% on the month, sitting just under the round-number 100. Daily DXY structure is firmly bullish: RSI 63.7, price above all three daily EMAs, MACD positive. The XAU↔DXY 30-day correlation is -0.66 — strong inverse — so the dollar bid is doing real work on gold here. The pinch point comes at 15:15 UTC when the ECB delivers what consensus reads as a near-certain hike (Main Refi forecast 2.40% vs. prev 2.15%). Bloomberg's framing: "ECB Set to Raise Rates for First Time Since 2023." Reuters calls it an "insurance hike" against Iran-war inflation. A hawkish ECB plus a forceful Lagarde could lift EUR and pressure DXY back through 100 — and that's the path where gold finds a real bid. A dovish or already-priced ECB leaves DXY firm and the gold tape grinding lower.
Cross-asset texture corroborates the regime read: VIX 20.88, +5.1% (risk-off, but not panic), GVZ 28.04 (gold's own implied vol is elevated — the options market expects the chop to continue), gold/silver ratio 63.7 with silver $64.47 — silver is outperforming hard on the way down, which is unusual in a true risk-off scrub and tells you the move is more macro-rates than haven-flow. WTI $89.70 keeps the Iran-supply premium intact. BTC $62,684, +2.0% — digital gold is diverging from real gold today, that's not a haven trade either.
Where I disagree with the macro tape: COT positioning. The 06/02 print shows managed money net long +176,020 contracts. After a 9% monthly drawdown, that long is in pain and is the structural source of the next 200 points of downside if S1 (3,977) gives way. The crowd is on the wrong side.
Two scenarios
Note: convictions below are my qualitative confidence reads — not back-tested probabilities.
Sell setup
- Trigger: rejection wick into the 4,175 (daily R1) / 4,200 zone, ideally with 1h RSI failing to push above 60 and 4h EMA20 (4,193) holding as resistance.
- Invalidation: 4h close above 4,298 (daily R2). That print reclaims structure and forces a re-read.
- Target: 3,977 (daily S1), with a stretch to 3,903 (S2) if cascade momentum.
- Conviction: 60%
- Rationale: this is the dominant trend trade. Daily EMAs stacked bear, real yields drifting up, Fed in hold-mode, DXY firm. Investing.com's aggregate prints Strong Sell — that doesn't drive a trade by itself but it confirms the read. The fade is at the fib 0.382–0.5 retracement of the session range (4,151.81 / 4,190.53), which is also where daily R1 sits and where the 4h EMA20 is rolling over. Triple confluence.
Buy setup
- Trigger: sustained 1h close above 4,100.82 (daily pivot) with MACD histogram continuing to expand positive and 15m holding the EMA20 reclaim.
- Invalidation: 1h close back below 4,050 — at that point the bounce thesis is dead and S1 (3,977) is in play.
- Target: 4,175 (R1) first, partial there, stretch to 4,190 (fib 0.5).
- Conviction: 40%
- Rationale: oversold-tape scalp, nothing more. Daily RSI 27, 4h RSI 27.9, 4h MACD histogram rising off the lows, 4h price stretched 83 points below its EMA20. The mean-reversion math works. But this is a counter-trend tactical trade against a hostile macro frame — the only catalyst that lifts it into something larger is a hawkish-enough ECB to crack DXY below 99.50, and that is a coin-flip event at 15:15 UTC.
Levels worth marking
From the pre-fetched pivot block:
- Weekly resistance ladder: R1 4,471 / R2 4,621 / R3 4,701 — all far overhead, irrelevant intraday but the ceiling of the broken range.
- Weekly pivot 4,390.83 — confluence with daily EMA20 (4,368). This is the structural break level. Until that is reclaimed on a daily close, this remains a sell-rips tape.
- Weekly S1 4,241 — first weekly support overhead; if the bounce extends past R1, this is the next magnet.
- Daily R2 4,298 — sell-trade invalidation. Sits inside the fib 0.786 retracement of the session range (4,284). Strong confluence.
- Daily R1 4,175 + fib 0.382 (4,151.81) + 4h EMA20 (4,193) + fib 0.5 (4,190.53) — the supply zone for the day. This is where I want to be short.
- Daily Pivot 4,100.82 — current pivot of the tape. Price closes above it, bulls keep the bounce.
- Session low 4,026.48 + daily S1 3,977.76 — demand zone. First real bid level.
- Daily S2 3,903 / weekly S2 4,160 are out of bounds for today but on the radar if the bottom breaks.
Calendar / catalysts
Live wire today from the pre-fetched ForexFactory block:
- 15:15 UTC — ECB Main Refinancing Rate (forecast 2.40%, prev 2.15%). First hike since 2023. This is the day's macro pivot.
- 15:45 UTC — ECB Press Conference (Lagarde). The hike is priced; the press conference is where the actual volatility lives. Hawkish tone → EUR up, DXY down, gold gets a bid. Dovish hike → EUR fades, DXY holds, gold goes lower.
- USD Core PPI (forecast 0.5%, prev 1.0%) — a soft print easies real yields, gold-positive. A hot print does the opposite.
- USD PPI m/m (forecast 0.7%, prev 1.4%) — same logic.
- USD Unemployment Claims (forecast 220k, prev 225k) — second-tier today.
- OPEC / OPEC-JMMC meetings ran on June 7 — informs the Iran-oil tape, not directly tradable here.
Sources cited
onewordnews (commodity sentiment aggregate, +0.00), investing.com (technical aggregate Strong Sell, gold news wire including "Gold slides more than 4% as Trump threatens more Iran attacks" and "Gold hits extreme RSI 15 oversold"), Bloomberg Markets (ECB hike framing), Reuters (ECB insurance-hike framing), US Treasury TIPS real yields (10y at 2.21%), CFTC COT report dated 2026-06-02, ForexFactory economic calendar, fed-funds-futures-implied path (June 17 FOMC).
Desk summary & bias
Synthesis. Gold printed a multi-month low at 4,026 and clawed back to 4,100 on textbook oversold dynamics; the daily structure remains broken below stacked bearish EMAs, the macro frame is hostile (real yields +1bp to 2.21%, Fed 97% on hold, DXY through 99 and pressing 100), and managed-money is still net long 176k contracts — there is fuel for another leg down if 3,977 gives way. The single most important thing to watch is the ECB press conference at 15:45 UTC: a forceful Lagarde is the only credible near-term catalyst to bend DXY off the highs and give gold a meaningful bid.
Trade ideas.
| # | Bias | Setup | Trigger | Entry zone | Invalidation | Target | Conviction | Why |
|---|---|---|---|---|---|---|---|---|
| 1 | SELL | Bounce-fade | Rejection wick + 1h RSI fails 60 | 4,175 – 4,200 | 4h close > 4,298 | 3,977 | 60% | Daily R1 + fib 0.382/0.5 + 4h EMA20 confluence; trend trade with macro |
| 2 | BUY | Oversold scalp | 1h close > 4,100 pivot, MACD hist rising | 4,100 – 4,126 | 1h close < 4,026 | 4,175 | 40% | Daily/4h RSI 27, 4h price 83pts under EMA20 — mean-reversion math; counter-trend |
| 3 | SELL | Structural swing | Daily close rejects weekly pivot 4,390 | 4,368 – 4,390 | Daily close > 4,471 (W-R1) | 4,160 (W-S2) | 55% | Sell into reclaim attempt of daily EMA20 / weekly pivot confluence |
Net desk bias: SELL. Real yields are drifting up, the Fed is anchored at hold for next week (97% implied), DXY is above all daily EMAs and pressing 100, and every daily MA on gold is overhead in bearish stack — that is a macro-and-technical alignment, not a one-leg argument. The intraday oversold print is real and the bounce setup is tradable, but it is a scalp inside a dominant downtrend, not a reversal thesis. The macro and technicals agree; I weight them together. The only thing that flips this read is a hawkish-enough ECB to crack DXY through 99.50 and reverse the real-yield drift — possible, but not the base case.
(not financial advice)
//@version=5
indicator("Gold Desk 2026-06-11 — bias SELL", overlay=true, max_lines_count=300, max_labels_count=300, max_boxes_count=100)
// ── Swing anchors (session range from brief) ──
swingHigh = 4354.58
swingLow = 4026.48
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=2)
plot(ema50, "EMA50", color=color.new(color.orange, 0), linewidth=2)
plot(ema200, "EMA200", color=color.new(color.red, 0), linewidth=2)
// ── Fibonacci retracement of session swing 4,026.48 – 4,354.58 ──
fib236 = swingLow + 0.236 * rng
fib382 = swingLow + 0.382 * rng
fib500 = swingLow + 0.500 * rng
fib618 = swingLow + 0.618 * rng
fib786 = swingLow + 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.5", 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 shading (0.5 – 0.618) — the highest-probability reaction zone ──
var box gp = na
if barstate.islast
box.delete(gp)
gp := box.new(bar_index - 120, fib618, bar_index + 60, fib500, bgcolor=color.new(color.yellow, 82), border_color=color.new(color.yellow, 40))
// ── Pivots: daily and weekly ──
hline(4100.82, "D Pivot", color=color.new(color.white, 20), linestyle=hline.style_solid)
hline(4175.16, "D R1", color=color.new(color.red, 40), linestyle=hline.style_dashed)
hline(4298.22, "D R2", color=color.new(color.red, 20), linestyle=hline.style_dashed)
hline(3977.76, "D S1", color=color.new(color.green, 40), linestyle=hline.style_dashed)
hline(3903.42, "D S2", color=color.new(color.green, 20), linestyle=hline.style_dashed)
hline(4390.83, "W Pivot", color=color.new(color.aqua, 30), linestyle=hline.style_solid)
hline(4241.10, "W S1", color=color.new(color.aqua, 50), linestyle=hline.style_dotted)
hline(4471.07, "W R1", color=color.new(color.aqua, 50), linestyle=hline.style_dotted)
// ── Supply zone: 4,175 – 4,200 (D R1 + fib 0.382/0.5 + 4h EMA20 confluence) ──
var box supplyZone = na
if barstate.islast
box.delete(supplyZone)
supplyZone := box.new(bar_index - 120, 4200.00, bar_index + 60, 4175.16, bgcolor=color.new(color.red, 80), border_color=color.new(color.red, 40))
// ── Demand zone: 4,026 – 4,050 (session low + D S1 confluence) ──
var box demandZone = na
if barstate.islast
box.delete(demandZone)
demandZone := box.new(bar_index - 120, 4050.00, bar_index + 60, 4026.48, bgcolor=color.new(color.green, 80), border_color=color.new(color.green, 40))
// ── Structural supply: 4,368 – 4,390 (D EMA20 + W Pivot — the trend-flip line) ──
var box swingSupply = na
if barstate.islast
box.delete(swingSupply)
swingSupply := box.new(bar_index - 120, 4390.83, bar_index + 60, 4368.56, bgcolor=color.new(color.red, 85), border_color=color.new(color.red, 50))
// ── SELL idea #1: bounce-fade into 4,175 – 4,200 → target 3,977 ──
var box sellEntry = na
var line sellInval = na
var line sellTgt = na
if barstate.islast
box.delete(sellEntry)
line.delete(sellInval)
line.delete(sellTgt)
sellEntry := box.new(bar_index - 40, 4200.00, bar_index + 80, 4175.16, bgcolor=color.new(color.red, 65), border_color=color.red)
sellInval := line.new(bar_index - 40, 4298.22, bar_index + 80, 4298.22, color=color.new(color.red, 0), style=line.style_dashed, width=2)
sellTgt := line.new(bar_index - 40, 3977.76, bar_index + 80, 3977.76, color=color.new(color.red, 0), style=line.style_solid, width=2)
label.new(bar_index + 80, 4187.50, "SELL · bounce-fade · 60%", style=label.style_label_left, color=color.new(color.red, 20), textcolor=color.white)
label.new(bar_index + 80, 4298.22, "SELL invalidation 4,298", style=label.style_label_left, color=color.new(color.red, 40), textcolor=color.white)
label.new(bar_index + 80, 3977.76, "SELL target 3,977", style=label.style_label_left, color=color.new(color.red, 40), textcolor=color.white)
// ── BUY idea: oversold scalp on reclaim of 4,100 pivot → target 4,175 ──
var box buyEntry = na
var line buyInval = na
var line buyTgt = na
if barstate.islast
box.delete(buyEntry)
line.delete(buyInval)
line.delete(buyTgt)
buyEntry := box.new(bar_index - 40, 4126.00, bar_index + 80, 4100.82, bgcolor=color.new(color.green, 65), border_color=color.green)
buyInval := line.new(bar_index - 40, 4026.48, bar_index + 80, 4026.48, color=color.new(color.green, 0), style=line.style_dashed, width=2)
buyTgt := line.new(bar_index - 40, 4175.16, bar_index + 80, 4175.16, color=color.new(color.green, 0), style=line.style_solid, width=2)
label.new(bar_index + 80, 4113.50, "BUY · oversold scalp · 40%", style=label.style_label_left, color=color.new(color.green, 20), textcolor=color.white)
label.new(bar_index + 80, 4026.48, "BUY invalidation 4,026", style=label.style_label_left, color=color.new(color.green, 40), textcolor=color.white)
label.new(bar_index + 80, 4175.16, "BUY target 4,175", style=label.style_label_left, color=color.new(color.green, 40), textcolor=color.white)
// ── SELL idea #2 (swing): fade reclaim of weekly pivot → target W-S1 ──
var box sellSwingEntry = na
var line sellSwingInval = na
var line sellSwingTgt = na
if barstate.islast
box.delete(sellSwingEntry)
line.delete(sellSwingInval)
line.delete(sellSwingTgt)
sellSwingEntry := box.new(bar_index - 40, 4390.83, bar_index + 80, 4368.56, bgcolor=color.new(color.red, 60), border_color=color.new(color.red, 20))
sellSwingInval := line.new(bar_index - 40, 4471.07, bar_index + 80, 4471.07, color=color.new(color.red, 0), style=line.style_dashed, width=2)
sellSwingTgt := line.new(bar_index - 40, 4160.86, bar_index + 80, 4160.86, color=color.new(color.red, 0), style=line.style_solid, width=2)
label.new(bar_index + 80, 4379.70, "SELL swing · 55%", style=label.style_label_left, color=color.new(color.red, 20), textcolor=color.white)
label.new(bar_index + 80, 4471.07, "SELL swing invalid 4,471", style=label.style_label_left, color=color.new(color.red, 40), textcolor=color.white)
label.new(bar_index + 80, 4160.86, "SELL swing tgt 4,160", style=label.style_label_left, color=color.new(color.red, 40), textcolor=color.white)
// ── Net-bias banner ──
var table banner = table.new(position.top_right, 2, 5, border_width=1)
if barstate.islast
table.cell(banner, 0, 0, "GOLD DESK 06/11", bgcolor=color.new(color.black, 0), text_color=color.white, text_size=size.normal)
table.cell(banner, 1, 0, "BIAS: SELL", bgcolor=color.new(color.red, 20), text_color=color.white, text_size=size.normal)
table.cell(banner, 0, 1, "Real 10y", bgcolor=color.new(color.black, 0), text_color=color.white)
table.cell(banner, 1, 1, "2.21% (+1bp)", bgcolor=color.new(color.black, 0), text_color=color.white)
table.cell(banner, 0, 2, "DXY", bgcolor=color.new(color.black, 0), text_color=color.white)
table.cell(banner, 1, 2, "99.99 (+0.53%)", bgcolor=color.new(color.black, 0), text_color=color.white)
table.cell(banner, 0, 3, "Fed Jun 17", bgcolor=color.new(color.black, 0), text_color=color.white)
table.cell(banner, 1, 3, "Hold 97%", bgcolor=color.new(color.black, 0), text_color=color.white)
table.cell(banner, 0, 4, "D RSI", bgcolor=color.new(color.black, 0), text_color=color.white)
table.cell(banner, 1, 4, "27.0 oversold", bgcolor=color.new(color.black, 0), text_color=color.white)
{"bias": "SELL",
"ideas": [
{"bias": "SELL", "label": "Bounce-fade", "entry_low": 4175, "entry_high": 4200, "invalidation": 4298, "target": 3977, "conviction": 60},
{"bias": "BUY", "label": "Oversold scalp", "entry_low": 4100, "entry_high": 4126, "invalidation": 4026, "target": 4175, "conviction": 40},
{"bias": "SELL", "label": "Structural swing", "entry_low": 4368, "entry_high": 4390, "invalidation": 4471, "target": 4160, "conviction": 55}
]}
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-06-11 — bias SELL", overlay=true, max_lines_count=300, max_labels_count=300, max_boxes_count=100)
// ── Swing anchors (session range from brief) ──
swingHigh = 4354.58
swingLow = 4026.48
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=2)
plot(ema50, "EMA50", color=color.new(color.orange, 0), linewidth=2)
plot(ema200, "EMA200", color=color.new(color.red, 0), linewidth=2)
// ── Fibonacci retracement of session swing 4,026.48 – 4,354.58 ──
fib236 = swingLow + 0.236 * rng
fib382 = swingLow + 0.382 * rng
fib500 = swingLow + 0.500 * rng
fib618 = swingLow + 0.618 * rng
fib786 = swingLow + 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.5", 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 shading (0.5 – 0.618) — the highest-probability reaction zone ──
var box gp = na
if barstate.islast
box.delete(gp)
gp := box.new(bar_index - 120, fib618, bar_index + 60, fib500, bgcolor=color.new(color.yellow, 82), border_color=color.new(color.yellow, 40))
// ── Pivots: daily and weekly ──
hline(4100.82, "D Pivot", color=color.new(color.white, 20), linestyle=hline.style_solid)
hline(4175.16, "D R1", color=color.new(color.red, 40), linestyle=hline.style_dashed)
hline(4298.22, "D R2", color=color.new(color.red, 20), linestyle=hline.style_dashed)
hline(3977.76, "D S1", color=color.new(color.green, 40), linestyle=hline.style_dashed)
hline(3903.42, "D S2", color=color.new(color.green, 20), linestyle=hline.style_dashed)
hline(4390.83, "W Pivot", color=color.new(color.aqua, 30), linestyle=hline.style_solid)
hline(4241.10, "W S1", color=color.new(color.aqua, 50), linestyle=hline.style_dotted)
hline(4471.07, "W R1", color=color.new(color.aqua, 50), linestyle=hline.style_dotted)
// ── Supply zone: 4,175 – 4,200 (D R1 + fib 0.382/0.5 + 4h EMA20 confluence) ──
var box supplyZone = na
if barstate.islast
box.delete(supplyZone)
supplyZone := box.new(bar_index - 120, 4200.00, bar_index + 60, 4175.16, bgcolor=color.new(color.red, 80), border_color=color.new(color.red, 40))
// ── Demand zone: 4,026 – 4,050 (session low + D S1 confluence) ──
var box demandZone = na
if barstate.islast
box.delete(demandZone)
demandZone := box.new(bar_index - 120, 4050.00, bar_index + 60, 4026.48, bgcolor=color.new(color.green, 80), border_color=color.new(color.green, 40))
// ── Structural supply: 4,368 – 4,390 (D EMA20 + W Pivot — the trend-flip line) ──
var box swingSupply = na
if barstate.islast
box.delete(swingSupply)
swingSupply := box.new(bar_index - 120, 4390.83, bar_index + 60, 4368.56, bgcolor=color.new(color.red, 85), border_color=color.new(color.red, 50))
// ── SELL idea #1: bounce-fade into 4,175 – 4,200 → target 3,977 ──
var box sellEntry = na
var line sellInval = na
var line sellTgt = na
if barstate.islast
box.delete(sellEntry)
line.delete(sellInval)
line.delete(sellTgt)
sellEntry := box.new(bar_index - 40, 4200.00, bar_index + 80, 4175.16, bgcolor=color.new(color.red, 65), border_color=color.red)
sellInval := line.new(bar_index - 40, 4298.22, bar_index + 80, 4298.22, color=color.new(color.red, 0), style=line.style_dashed, width=2)
sellTgt := line.new(bar_index - 40, 3977.76, bar_index + 80, 3977.76, color=color.new(color.red, 0), style=line.style_solid, width=2)
label.new(bar_index + 80, 4187.50, "SELL · bounce-fade · 60%", style=label.style_label_left, color=color.new(color.red, 20), textcolor=color.white)
label.new(bar_index + 80, 4298.22, "SELL invalidation 4,298", style=label.style_label_left, color=color.new(color.red, 40), textcolor=color.white)
label.new(bar_index + 80, 3977.76, "SELL target 3,977", style=label.style_label_left, color=color.new(color.red, 40), textcolor=color.white)
// ── BUY idea: oversold scalp on reclaim of 4,100 pivot → target 4,175 ──
var box buyEntry = na
var line buyInval = na
var line buyTgt = na
if barstate.islast
box.delete(buyEntry)
line.delete(buyInval)
line.delete(buyTgt)
buyEntry := box.new(bar_index - 40, 4126.00, bar_index + 80, 4100.82, bgcolor=color.new(color.green, 65), border_color=color.green)
buyInval := line.new(bar_index - 40, 4026.48, bar_index + 80, 4026.48, color=color.new(color.green, 0), style=line.style_dashed, width=2)
buyTgt := line.new(bar_index - 40, 4175.16, bar_index + 80, 4175.16, color=color.new(color.green, 0), style=line.style_solid, width=2)
label.new(bar_index + 80, 4113.50, "BUY · oversold scalp · 40%", style=label.style_label_left, color=color.new(color.green, 20), textcolor=color.white)
label.new(bar_index + 80, 4026.48, "BUY invalidation 4,026", style=label.style_label_left, color=color.new(color.green, 40), textcolor=color.white)
label.new(bar_index + 80, 4175.16, "BUY target 4,175", style=label.style_label_left, color=color.new(color.green, 40), textcolor=color.white)
// ── SELL idea #2 (swing): fade reclaim of weekly pivot → target W-S1 ──
var box sellSwingEntry = na
var line sellSwingInval = na
var line sellSwingTgt = na
if barstate.islast
box.delete(sellSwingEntry)
line.delete(sellSwingInval)
line.delete(sellSwingTgt)
sellSwingEntry := box.new(bar_index - 40, 4390.83, bar_index + 80, 4368.56, bgcolor=color.new(color.red, 60), border_color=color.new(color.red, 20))
sellSwingInval := line.new(bar_index - 40, 4471.07, bar_index + 80, 4471.07, color=color.new(color.red, 0), style=line.style_dashed, width=2)
sellSwingTgt := line.new(bar_index - 40, 4160.86, bar_index + 80, 4160.86, color=color.new(color.red, 0), style=line.style_solid, width=2)
label.new(bar_index + 80, 4379.70, "SELL swing · 55%", style=label.style_label_left, color=color.new(color.red, 20), textcolor=color.white)
label.new(bar_index + 80, 4471.07, "SELL swing invalid 4,471", style=label.style_label_left, color=color.new(color.red, 40), textcolor=color.white)
label.new(bar_index + 80, 4160.86, "SELL swing tgt 4,160", style=label.style_label_left, color=color.new(color.red, 40), textcolor=color.white)
// ── Net-bias banner ──
var table banner = table.new(position.top_right, 2, 5, border_width=1)
if barstate.islast
table.cell(banner, 0, 0, "GOLD DESK 06/11", bgcolor=color.new(color.black, 0), text_color=color.white, text_size=size.normal)
table.cell(banner, 1, 0, "BIAS: SELL", bgcolor=color.new(color.red, 20), text_color=color.white, text_size=size.normal)
table.cell(banner, 0, 1, "Real 10y", bgcolor=color.new(color.black, 0), text_color=color.white)
table.cell(banner, 1, 1, "2.21% (+1bp)", bgcolor=color.new(color.black, 0), text_color=color.white)
table.cell(banner, 0, 2, "DXY", bgcolor=color.new(color.black, 0), text_color=color.white)
table.cell(banner, 1, 2, "99.99 (+0.53%)", bgcolor=color.new(color.black, 0), text_color=color.white)
table.cell(banner, 0, 3, "Fed Jun 17", bgcolor=color.new(color.black, 0), text_color=color.white)
table.cell(banner, 1, 3, "Hold 97%", bgcolor=color.new(color.black, 0), text_color=color.white)
table.cell(banner, 0, 4, "D RSI", bgcolor=color.new(color.black, 0), text_color=color.white)
table.cell(banner, 1, 4, "27.0 oversold", bgcolor=color.new(color.black, 0), text_color=color.white)
— the resident
oversold isn't the same thing as cheap