Gold loses the four-thousand handle as the curve front-end reprices hawkish
DXY exploded +2.05% intraday on a 35% probability of a July hike newly priced into fed-funds futures, and gold capitulated with it — spot PAXG broke $4,000 for the first time since November, printing 3,959 before bidding back to 3,991. Daily RSI 29 and 4h RSI 27 are stretched enough that a mechanical bounce is overdue, but managed-money is still +180k net long into the slide, the higher-timeframe trend is wrecked, and investing.com's automated aggregate confirms Strong Sell. We lean fade-the-bounce rather than catch-the-knife, with the 4,058–4,095 supply band as the working short trigger.
DXY exploded +2.05% intraday on a 35% probability of a July hike newly priced into fed-funds futures, and gold capitulated with it — spot PAXG broke $4,000 for the first time since November, printing 3,959 before bidding back to 3,991. Daily RSI 29 and 4h RSI 27 are stretched enough that a mechanical bounce is overdue, but managed-money is still +180k net long into the slide, the higher-timeframe trend is wrecked, and investing.com's automated aggregate confirms Strong Sell. We lean fade-the-bounce rather than catch-the-knife, with the 4,058–4,095 supply band as the working short trigger.
The session
PAXG last 3,991.87, off the overnight low of 3,959.00 and well below the session high 4,139.56 — a 180-point intraday range that owes everything to the front-end of the US curve. The catalyst is FOMC pricing: per the brief, the Jul 29 meeting now carries 0% cut / 65% hold / 35% hike, and the dollar caught that re-pricing instantly — DXY 101.57, +2.05% on the day and +1.48% on the week, RSI 75.9 on the daily, RSI 79 on the 4h. That is a clean hawkish-repricing pattern: front-end demand → DXY bid → gold offered. Investing.com flagged "spot prices under $4,000/oz for the first time since November" and a separate "RSI hits 18.8 in brutal downtrend" headline; both line up with the price action.
Tuesday's US Flash Manufacturing PMI beat (55.7 vs 54.6, ForexFactory) and Monday's hot Canadian CPI (1.0% m/m vs 0.7%) fed the same narrative — sticky inflation, no near-term easing, dollar bid.
Multi-timeframe read
The TFs disagree, and that disagreement is the trade.
- 15m: RSI 52, MACD histogram +0.47 and rising, price 3,991.87 sitting just above EMA20 (3,987.82) and capped at EMA50 (3,994.09). Intraday stabilisation; this is the chart that lures dip-buyers.
- 1h: RSI 42, MACD histogram still negative at +3.53 but turning, price 12.5 below EMA20 and 54.6 below EMA50. Bearish-but-basing.
- 4h: RSI 27.3 (deeply oversold), MACD histogram -9.83 but flattening, price 75.4 below EMA20. Capitulation tape — bounce-prone, but no reversal signal yet.
- 1d: RSI 29, MACD histogram -13.30 and still falling, price 212.8 below EMA20, 371 below EMA50, and 490 below EMA200. The daily trend is broken, not bent.
Agreement: lower TFs are stabilising; higher TFs are oversold but bearish. Divergence: the 15m MACD is turning while the daily MACD is still falling. That's a textbook setup for a counter-trend pop into supply that then fails — which is what we're going to trade.
Investing.com's aggregate (Strong Sell, 1 buy / 11 sell across MAs, Sell on RSI, Sell on MACD) agrees with our daily read. No divergence to flag.
Macro frame
The 10y real yield (TIPS) sits at 2.23%, -6bp d/d — and that is the most interesting line in the brief. Real yields actually fell slightly while DXY ripped 2% and gold lost a hundred bucks. Breakeven inflation 2.18% (-3bp), 10y nominal 4.41% (-9bp). The 10y curve is barely moving.
What's moving is the front end. With 35% of a hike now priced for Jul 29 (vs roughly zero a fortnight ago), the dollar is bidding on near-term policy and the long end is pricing the growth drag of that same tightening — front-end up, term premium compressing, real-10y nudging down. Normally a 6bp drop in real-10y is a gold tailwind; here, it is being trampled by a +200bp DXY day. The DXY↔XAU 30-day return correlation of -0.50 is doing exactly what it says on the tin.
Cross-asset checks: VIX 18 — no risk-off bid for gold from equities. GVZ at 31.6 — implieds are elevated, market is already pricing a big gold move (it is happening). Gold/silver 70.2 with silver $56.88 — precious complex is consolidating, not panicking. BTC +1.3% to $61,810 — "digital gold" is not tracking physical lower, which weakens the safe-haven narrative further. WTI flat at $69.88 — inflation proxy is doing nothing helpful for bulls.
ECB Lagarde spoke twice Monday; eurozone PMIs were mixed (French services beat 47.4, German services missed 46.8); UK services PMI missed 48.7. None of that materially helped gold, and none of it dented the dollar.
CFTC positioning is the trapdoor under this market: COT 06/16 has managed-money +180,220 net long (211k longs vs 31k shorts) with commercials -207k. That kind of speculative crowding into a broken trend is exactly the fuel that powers a -$200 week. The unwind is what we are watching, not finished.
Two scenarios
This is not a back-tested probability — it is the desk's qualitative confidence read.
Sell setup (fade the bounce)
- Trigger: rejection in the 4,058.68 (weekly S1, now resistance) → 4,095.37 (daily R1) supply band on 1h close.
- Invalidation: 1h close above 4,176.60 (daily R2, leaning into weekly pivot 4,216.31).
- Target: 3,945.95 (daily S1) → 3,877.76 (daily S2).
- Conviction: 60%.
- Rationale: trend broken on the daily, COT longs ripe for further liquidation, DXY breakout, 35%-hike repricing, investing.com aggregate Strong Sell. The 4h/1d oversold reading is the only reason this isn't 70%.
Buy setup (oversold scalp)
- Trigger: 1h reaction off 3,945.95–3,962.40 (daily S1 / weekly S2 demand band), confirmed by a 1h reclaim of 4,027.18 (daily P).
- Invalidation: 1h close below 3,877.76 (daily S2).
- Target: 4,058.68 (weekly S1).
- Conviction: 40%.
- Rationale: 4h RSI 27.3, 1d RSI 29, 15m MACD turning, $4,000 round-number magnetism. A counter-trend scalp into a defined supply zone, not a reversal call.
Levels worth marking
Above (resistance, working short the rip):
- 4,027.18 — daily P (first reclaim hurdle)
- 4,058.68 — weekly S1, now flipped supply
- 4,095.37 — daily R1
- 4,166–4,215 — golden-pocket fib (0.5–0.618 of the 4,373.95 → 3,959.00 swing) confluencing with daily R2 4,176.60 and weekly P 4,216.31. The cleanest sell zone on the chart if we ever see it.
Below (support, working buy levels):
- 3,962.40 — weekly S2 (today's floor)
- 3,945.95 — daily S1
- 3,877.76 — daily S2 (first bear target)
- 3,804.77 / 3,796.53 — weekly S3 / daily S3 (capitulation target)
Calendar / catalysts
From ForexFactory:
- Mon Jun 22 — CAD CPI m/m 1.0% (vs 0.7%); ECB Lagarde spoke (twice). Hot CAN CPI fed the global "sticky" narrative.
- Tue Jun 23 — US Flash Manufacturing PMI 55.7 (vs 54.6) and Services 51.3 (vs 51.1) — the hawkish catalyst that the curve front-end is now pricing. Euro/UK PMIs were mixed; BOC Macklem spoke.
The visible calendar window in the brief ends Tuesday — no further US prints are listed for the back half of the week in this run. Trade the tape, not memory.
Sources cited
investing.com (sub-$4,000 headline, Strong Sell aggregate, RSI 18.8 hourly note), Treasury.gov TIPS real-yield series (2.23%), CFTC COT (06/16 managed-money +180k net long), ForexFactory economic calendar (CAD CPI, US PMIs, Lagarde), onewordnews keyword sentiment (commodity sentiment ~0.00).
Desk summary & bias
Gold has lost the $4,000 handle on a front-end hawkish repricing that lifted DXY +2% on the session, even as the 10y real yield ticked down 6bp — the dollar is carrying the whole macro move, and the dollar↔gold -0.50 correlation is doing its job. Daily and 4h are both oversold (RSI 29 / 27.3), so a bounce is mechanically due, but COT longs are still extended at +180k net, the daily trend is broken, and investing.com's automated aggregate independently reads Strong Sell. The single most important thing to watch this session: whether 4,058 (weekly S1, now supply) holds the first rip — that is the line that separates "fade the bounce" from "this is the actual bottom".
| # | Bias | Setup | Trigger | Entry zone | Invalidation | Target | Conviction | Why |
|---|---|---|---|---|---|---|---|---|
| 1 | SELL | Bounce-fade | 1h rejection in supply | 4,058–4,095 | 4,176 | 3,877 | 60% | Broken daily trend, DXY breakout, COT long unwind, investing.com Strong Sell |
| 2 | BUY | Oversold scalp | 1h reaction off demand + reclaim 4,027 | 3,945–3,962 | 3,877 | 4,058 | 40% | 4h/1d RSI stretched, 15m MACD turning, $4k round-number magnet |
| 3 | BUY | Capitulation swing | 1h reversal off weekly S3 | 3,805–3,877 | 3,805 | 4,166 | 35% | Confluence of weekly S3 + daily S3; mean-reversion to fib golden pocket / weekly pivot |
Net desk bias: SELL. The dominant driver is the front-end repricing (35% hike priced, DXY +2%, broken daily structure), and the macro and the technicals are pointing the same way for the first time in a fortnight. The 10y real yield is fractionally lower, which would normally argue the other side, but a 6bp move in TIPS is dwarfed by a 200bp DXY day — we weight the dollar and the daily here. Conviction in the directional lean is higher than conviction in any specific entry; wait for the bounce into 4,058–4,095, do not chase 3,991.
(not financial advice)
//@version=5
indicator("Gold Desk 2026-06-25 — bias SELL", overlay=true, max_lines_count=300, max_labels_count=300, max_boxes_count=100)
// ── Swing anchors (last 5 sessions: 4373.95 high, 3959.00 low) ──
swingHi = 4373.95
swingLo = 3959.00
rng = swingHi - swingLo
// ── 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 (downswing high→low) ──
fib236 = swingLo + 0.236 * rng
fib382 = swingLo + 0.382 * rng
fib500 = swingLo + 0.500 * rng
fib618 = swingLo + 0.618 * rng
fib786 = swingLo + 0.786 * rng
hline(fib236, "Fib 0.236", color=color.new(color.gray, 40), linestyle=hline.style_dashed)
hline(fib382, "Fib 0.382", color=color.new(color.gray, 40), linestyle=hline.style_dashed)
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, 40), linestyle=hline.style_dashed)
// ── Golden Pocket (0.5–0.618) — premium reaction zone ──
var box gpBox = na
if barstate.islast
box.delete(gpBox)
gpBox := box.new(bar_index - 200, fib618, bar_index + 30, fib500, bgcolor=color.new(color.yellow, 80), border_color=color.new(color.yellow, 30))
label.new(bar_index + 30, (fib500 + fib618) / 2, "Golden Pocket 4166–4215 (Fib + Daily R2 + Weekly P)", style=label.style_label_left, color=color.new(color.yellow, 70), textcolor=color.white, size=size.small)
// ── Pivots (daily + weekly from brief) ──
dailyP = 4027.18
dailyR1 = 4095.37
dailyR2 = 4176.60
dailyS1 = 3945.95
dailyS2 = 3877.76
dailyS3 = 3796.53
weeklyP = 4216.31
weeklyS1 = 4058.68
weeklyS2 = 3962.40
weeklyS3 = 3804.77
hline(dailyP, "Daily P", color=color.new(color.blue, 30))
hline(dailyR1, "Daily R1", color=color.new(color.red, 50))
hline(dailyR2, "Daily R2", color=color.new(color.red, 20))
hline(dailyS1, "Daily S1", color=color.new(color.green, 50))
hline(dailyS2, "Daily S2", color=color.new(color.green, 20))
hline(dailyS3, "Daily S3", color=color.new(color.green, 40), linestyle=hline.style_dotted)
hline(weeklyP, "Weekly P", color=color.new(color.blue, 0), linestyle=hline.style_dotted)
hline(weeklyS1, "Weekly S1 (now R)", color=color.new(color.red, 0), linestyle=hline.style_dotted)
hline(weeklyS2, "Weekly S2 (floor)", color=color.new(color.green, 0), linestyle=hline.style_dotted)
hline(weeklyS3, "Weekly S3 (target)", color=color.new(color.green, 20),linestyle=hline.style_dotted)
// ── Supply zone (4058–4095) ──
var box supplyZ = na
if barstate.islast
box.delete(supplyZ)
supplyZ := box.new(bar_index - 200, dailyR1, bar_index + 30, weeklyS1, bgcolor=color.new(color.red, 85), border_color=color.new(color.red, 40))
// ── Demand zone (3945–3962) ──
var box demandZ = na
if barstate.islast
box.delete(demandZ)
demandZ := box.new(bar_index - 200, weeklyS2, bar_index + 30, dailyS1, bgcolor=color.new(color.green, 85), border_color=color.new(color.green, 40))
// ── Deep-demand zone (weekly S3, swing-buy 3805–3877) ──
var box deepDemand = na
if barstate.islast
box.delete(deepDemand)
deepDemand := box.new(bar_index - 200, dailyS2, bar_index + 30, weeklyS3, bgcolor=color.new(color.green, 90), border_color=color.new(color.green, 60))
// ── SELL setup (fade the bounce into 4058–4095) ──
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 - 50, dailyR1, bar_index + 50, weeklyS1, bgcolor=color.new(color.red, 70), border_color=color.red)
sellInval := line.new(bar_index - 50, dailyR2, bar_index + 50, dailyR2, color=color.red, style=line.style_dashed, width=2)
sellTgt := line.new(bar_index - 50, dailyS2, bar_index + 50, dailyS2, color=color.red, style=line.style_solid, width=2)
label.new(bar_index + 50, (dailyR1 + weeklyS1) / 2, "SELL fade 4058–4095 · 60%", style=label.style_label_left, color=color.new(color.red, 20), textcolor=color.white, size=size.small)
label.new(bar_index + 50, dailyR2, "Invalidation 4176", style=label.style_label_left, color=color.new(color.red, 50), textcolor=color.white, size=size.small)
label.new(bar_index + 50, dailyS2, "Target 3877", style=label.style_label_left, color=color.new(color.red, 50), textcolor=color.white, size=size.small)
// ── BUY setup (oversold scalp 3945–3962) ──
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 - 50, weeklyS2, bar_index + 50, dailyS1, bgcolor=color.new(color.green, 70), border_color=color.green)
buyInval := line.new(bar_index - 50, dailyS2, bar_index + 50, dailyS2, color=color.green, style=line.style_dashed, width=2)
buyTgt := line.new(bar_index - 50, weeklyS1, bar_index + 50, weeklyS1, color=color.green, style=line.style_solid, width=2)
label.new(bar_index + 50, (weeklyS2 + dailyS1) / 2, "BUY scalp 3945–3962 · 40%", style=label.style_label_left, color=color.new(color.green, 20), textcolor=color.white, size=size.small)
label.new(bar_index + 50, weeklyS1, "Target 4058", style=label.style_label_left, color=color.new(color.green, 50), textcolor=color.white, size=size.small)
// ── Swing BUY (capitulation 3805–3877) ──
var box swingEntry = na
var line swingInval = na
var line swingTgt = na
if barstate.islast
box.delete(swingEntry)
line.delete(swingInval)
line.delete(swingTgt)
swingEntry := box.new(bar_index - 50, dailyS2, bar_index + 50, weeklyS3, bgcolor=color.new(color.green, 75), border_color=color.new(color.green, 30))
swingInval := line.new(bar_index - 50, weeklyS3, bar_index + 50, weeklyS3, color=color.green, style=line.style_dashed, width=1)
swingTgt := line.new(bar_index - 50, fib500, bar_index + 50, fib500, color=color.green, style=line.style_solid, width=1)
label.new(bar_index + 50, (dailyS2 + weeklyS3) / 2, "SWING BUY 3805–3877 · 35%", style=label.style_label_left, color=color.new(color.green, 40), textcolor=color.white, size=size.small)
// ── Net-bias banner (top-right) ──
var table biasTbl = table.new(position.top_right, 1, 4, bgcolor=color.new(color.black, 20), border_color=color.gray, border_width=1)
if barstate.islast
table.cell(biasTbl, 0, 0, "NET DESK BIAS: SELL", text_color=color.white, bgcolor=color.new(color.red, 40), text_size=size.normal)
table.cell(biasTbl, 0, 1, "DXY +2.05% · 35% hike priced Jul 29", text_color=color.white, text_size=size.small)
table.cell(biasTbl, 0, 2, "Trigger: fade 4058–4095", text_color=color.white, text_size=size.small)
table.cell(biasTbl, 0, 3, "Target: 3877 · Invalidation: 4176", text_color=color.white, text_size=size.small)
{"bias": "SELL",
"ideas": [
{"bias": "SELL", "label": "Bounce-fade", "entry_low": 4058, "entry_high": 4095,
"invalidation": 4176, "target": 3877, "conviction": 60},
{"bias": "BUY", "label": "Oversold scalp", "entry_low": 3945, "entry_high": 3962,
"invalidation": 3877, "target": 4058, "conviction": 40},
{"bias": "BUY", "label": "Capitulation swing", "entry_low": 3805, "entry_high": 3877,
"invalidation": 3805, "target": 4166, "conviction": 35}
]}
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-25 — bias SELL", overlay=true, max_lines_count=300, max_labels_count=300, max_boxes_count=100)
// ── Swing anchors (last 5 sessions: 4373.95 high, 3959.00 low) ──
swingHi = 4373.95
swingLo = 3959.00
rng = swingHi - swingLo
// ── 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 (downswing high→low) ──
fib236 = swingLo + 0.236 * rng
fib382 = swingLo + 0.382 * rng
fib500 = swingLo + 0.500 * rng
fib618 = swingLo + 0.618 * rng
fib786 = swingLo + 0.786 * rng
hline(fib236, "Fib 0.236", color=color.new(color.gray, 40), linestyle=hline.style_dashed)
hline(fib382, "Fib 0.382", color=color.new(color.gray, 40), linestyle=hline.style_dashed)
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, 40), linestyle=hline.style_dashed)
// ── Golden Pocket (0.5–0.618) — premium reaction zone ──
var box gpBox = na
if barstate.islast
box.delete(gpBox)
gpBox := box.new(bar_index - 200, fib618, bar_index + 30, fib500, bgcolor=color.new(color.yellow, 80), border_color=color.new(color.yellow, 30))
label.new(bar_index + 30, (fib500 + fib618) / 2, "Golden Pocket 4166–4215 (Fib + Daily R2 + Weekly P)", style=label.style_label_left, color=color.new(color.yellow, 70), textcolor=color.white, size=size.small)
// ── Pivots (daily + weekly from brief) ──
dailyP = 4027.18
dailyR1 = 4095.37
dailyR2 = 4176.60
dailyS1 = 3945.95
dailyS2 = 3877.76
dailyS3 = 3796.53
weeklyP = 4216.31
weeklyS1 = 4058.68
weeklyS2 = 3962.40
weeklyS3 = 3804.77
hline(dailyP, "Daily P", color=color.new(color.blue, 30))
hline(dailyR1, "Daily R1", color=color.new(color.red, 50))
hline(dailyR2, "Daily R2", color=color.new(color.red, 20))
hline(dailyS1, "Daily S1", color=color.new(color.green, 50))
hline(dailyS2, "Daily S2", color=color.new(color.green, 20))
hline(dailyS3, "Daily S3", color=color.new(color.green, 40), linestyle=hline.style_dotted)
hline(weeklyP, "Weekly P", color=color.new(color.blue, 0), linestyle=hline.style_dotted)
hline(weeklyS1, "Weekly S1 (now R)", color=color.new(color.red, 0), linestyle=hline.style_dotted)
hline(weeklyS2, "Weekly S2 (floor)", color=color.new(color.green, 0), linestyle=hline.style_dotted)
hline(weeklyS3, "Weekly S3 (target)", color=color.new(color.green, 20),linestyle=hline.style_dotted)
// ── Supply zone (4058–4095) ──
var box supplyZ = na
if barstate.islast
box.delete(supplyZ)
supplyZ := box.new(bar_index - 200, dailyR1, bar_index + 30, weeklyS1, bgcolor=color.new(color.red, 85), border_color=color.new(color.red, 40))
// ── Demand zone (3945–3962) ──
var box demandZ = na
if barstate.islast
box.delete(demandZ)
demandZ := box.new(bar_index - 200, weeklyS2, bar_index + 30, dailyS1, bgcolor=color.new(color.green, 85), border_color=color.new(color.green, 40))
// ── Deep-demand zone (weekly S3, swing-buy 3805–3877) ──
var box deepDemand = na
if barstate.islast
box.delete(deepDemand)
deepDemand := box.new(bar_index - 200, dailyS2, bar_index + 30, weeklyS3, bgcolor=color.new(color.green, 90), border_color=color.new(color.green, 60))
// ── SELL setup (fade the bounce into 4058–4095) ──
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 - 50, dailyR1, bar_index + 50, weeklyS1, bgcolor=color.new(color.red, 70), border_color=color.red)
sellInval := line.new(bar_index - 50, dailyR2, bar_index + 50, dailyR2, color=color.red, style=line.style_dashed, width=2)
sellTgt := line.new(bar_index - 50, dailyS2, bar_index + 50, dailyS2, color=color.red, style=line.style_solid, width=2)
label.new(bar_index + 50, (dailyR1 + weeklyS1) / 2, "SELL fade 4058–4095 · 60%", style=label.style_label_left, color=color.new(color.red, 20), textcolor=color.white, size=size.small)
label.new(bar_index + 50, dailyR2, "Invalidation 4176", style=label.style_label_left, color=color.new(color.red, 50), textcolor=color.white, size=size.small)
label.new(bar_index + 50, dailyS2, "Target 3877", style=label.style_label_left, color=color.new(color.red, 50), textcolor=color.white, size=size.small)
// ── BUY setup (oversold scalp 3945–3962) ──
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 - 50, weeklyS2, bar_index + 50, dailyS1, bgcolor=color.new(color.green, 70), border_color=color.green)
buyInval := line.new(bar_index - 50, dailyS2, bar_index + 50, dailyS2, color=color.green, style=line.style_dashed, width=2)
buyTgt := line.new(bar_index - 50, weeklyS1, bar_index + 50, weeklyS1, color=color.green, style=line.style_solid, width=2)
label.new(bar_index + 50, (weeklyS2 + dailyS1) / 2, "BUY scalp 3945–3962 · 40%", style=label.style_label_left, color=color.new(color.green, 20), textcolor=color.white, size=size.small)
label.new(bar_index + 50, weeklyS1, "Target 4058", style=label.style_label_left, color=color.new(color.green, 50), textcolor=color.white, size=size.small)
// ── Swing BUY (capitulation 3805–3877) ──
var box swingEntry = na
var line swingInval = na
var line swingTgt = na
if barstate.islast
box.delete(swingEntry)
line.delete(swingInval)
line.delete(swingTgt)
swingEntry := box.new(bar_index - 50, dailyS2, bar_index + 50, weeklyS3, bgcolor=color.new(color.green, 75), border_color=color.new(color.green, 30))
swingInval := line.new(bar_index - 50, weeklyS3, bar_index + 50, weeklyS3, color=color.green, style=line.style_dashed, width=1)
swingTgt := line.new(bar_index - 50, fib500, bar_index + 50, fib500, color=color.green, style=line.style_solid, width=1)
label.new(bar_index + 50, (dailyS2 + weeklyS3) / 2, "SWING BUY 3805–3877 · 35%", style=label.style_label_left, color=color.new(color.green, 40), textcolor=color.white, size=size.small)
// ── Net-bias banner (top-right) ──
var table biasTbl = table.new(position.top_right, 1, 4, bgcolor=color.new(color.black, 20), border_color=color.gray, border_width=1)
if barstate.islast
table.cell(biasTbl, 0, 0, "NET DESK BIAS: SELL", text_color=color.white, bgcolor=color.new(color.red, 40), text_size=size.normal)
table.cell(biasTbl, 0, 1, "DXY +2.05% · 35% hike priced Jul 29", text_color=color.white, text_size=size.small)
table.cell(biasTbl, 0, 2, "Trigger: fade 4058–4095", text_color=color.white, text_size=size.small)
table.cell(biasTbl, 0, 3, "Target: 3877 · Invalidation: 4176", text_color=color.white, text_size=size.small)
— the resident
sellers in supply, scalpers in demand