Gold Desk — 04 Jul 2026: Bounce Runs Into A Wall Of Rising Real Yields
Gold has ripped +2.6% off Wednesday's 4,057 low into the 4,169 handle, but the recovery is climbing straight into a real-yield tape that ticked *up* another basis point (TIPS 10y at 2.26%) and a fed-funds curve that is now pricing zero cuts and a 24% chance of a *hike* at the 29 July FOMC. The daily is still below both the 50 and 200 EMA. This is a tactical bounce, not a regime change, and the reaction at the 4,188–4,227 shelf is the trade of the week.
Gold has ripped +2.6% off Wednesday's 4,057 low into the 4,169 handle, but the recovery is climbing straight into a real-yield tape that ticked up another basis point (TIPS 10y at 2.26%) and a fed-funds curve that is now pricing zero cuts and a 24% chance of a hike at the 29 July FOMC. The daily is still below both the 50 and 200 EMA. This is a tactical bounce, not a regime change, and the reaction at the 4,188–4,227 shelf is the trade of the week.
The session
Spot XAU printed 4,169.22 at 09:51 UTC, up +2.57% on the session and +3.87% week-on-week, after tagging an intraday high of 4,188.74 — one tick shy of the weekly high. Prior 5-session range 3,944.57 – 4,188.74. The move is being carried by two things: DXY breaking down another 0.67% intraday to 100.80 (correlation to XAU 30-day rolling is -0.51, so a soft dollar has been mechanically supportive), and, per Investing.com's wire, "TSX futures point higher as easing Fed rate hike bets boost gold" and "Gold prices on track for positive week after soft jobs data cools rate hike bets." That framing is worth flagging — the fed-funds strip in this snapshot still has 24% hike probability and 0% cut, so the "easing hike bets" narrative is thinner than the wires make it sound. COMEX front-month GC is at 4,188.50, a +46 bp premium over PAX-tracked spot, consistent with buying pressure being routed through futures.
Multi-timeframe read
The lower-timeframe tape is unambiguously long: 15m RSI 66.5, 1h RSI 60, 4h RSI 66.6, all riding above their EMA20 and EMA50. The 4h price is +44.6 above the EMA20 — the stretch that ordinarily precedes a snap-back. MACD histograms are mixed: 4h and 15m already rolling (↓), 1h and 1d still improving (↑). That's the profile of a first push that's near-term extended.
The daily is where the read stops being clean. RSI 49.7, price +31 over the daily EMA20 (4,137.98) but -110 below the EMA50 (4,279.46) and -278 below the EMA200 (4,447.24). So structurally, the medium- and long-term trend is still bearish, and today's rip is a countertrend leg inside a broken tape. The lower TFs and the daily disagree, and the daily is the one that gets to overrule when they conflict at resistance.
Investing.com's automated aggregate is stamped "Neutral" on the daily with a Strong Buy on the moving-average sub-panel (12 buy / 0 sell across MA5–200). That MA-driven Strong Buy is worth pushing back on — it's the trailing MA cluster reacting to the bounce, not evidence that structure has repaired. I'm siding with the "Neutral" aggregate.
Macro frame
Lead the read where the read belongs: 10y real yield 2.26%, +1 bp d/d (Treasury.gov constant-maturity TIPS as of 07/02/2026). That is a gold headwind, not a tailwind, and it is what has kept the daily structurally below its 50/200 EMA all month. Breakeven inflation is flat at 2.23%, so the nominal 10y (4.49%, +1 bp) is being driven entirely by the real leg — this is a real-rate tape, not a reflation tape.
The fed-funds futures strip is the corroborating datapoint: next FOMC (29 July) prices 0% cut / 76% hold / 24% hike, current upper bound 3.75%. There is no cut in the front end. A market that assigns almost a quarter of its probability mass to another hike, and zero to a cut, is not the market that funds a durable gold breakout. Every basis point that stays in the "hike" column is a basis point of real-yield pressure.
DXY 100.80, -0.67% intraday, -0.55% week — the offsetting variable, and the reason gold is up on the day at all. But note: DXY daily is still above its 20/50/200 EMA (RSI 58), so this is a pullback in an uptrend, not a trend break. If DXY holds 100.60 and turns, the -0.51 correlation says gold gives back.
Cross-asset: GVZ (gold implied vol) 26.00 — elevated but not extreme, consistent with a market pricing "big range, not a directional break." Gold/silver ratio at 66.4 with silver at $62.81 says the precious complex is in risk-on mode with silver leading — historically that pattern shows up inside rallies, but it also tends to blow off first. VIX printed NaN in this snapshot (data gap; do not read into it). WTI $68.78 is unremarkable. BTC at $62,422 (+1.5%) diverges only mildly from gold.
Central-bank colour is skewed hawkish on the European side: Bloomberg carries "ECB's Nagel Stresses Need for Vigilance at Next Rate Decision", "ECB Made Right Choice in June Rate Hike, Lagarde Tells Les Echos", and "Fed and ECB Seen Diverging" — a hawkish ECB narrows the US-EU rate differential and mechanically weighs on DXY, which is the transmission channel keeping this bounce alive. It is not, however, a real-yield story.
JPMorgan (via Investing.com) reiterated a $4,500 Q4 gold target with risks skewed to the downside — a useful anchor for how the sell-side is thinking about the tape: bullish structurally, cautious tactically. That is roughly my read.
Two scenarios
Conviction figures below are qualitative desk confidence, not back-tested probabilities.
Sell setup
- Trigger: rejection wick into the 4,197.89 (daily R1) – 4,227.08 (daily R2) shelf, ideally with 4h RSI printing above 70 or MACD histogram already rolling
- Invalidation: sustained 1h closes above 4,256.78 (weekly R1) — that flips structure and puts 4,344.84 (weekly R2) on the table
- Target: first take at daily pivot 4,159.56, primary at daily S1 4,130.37, extended at daily S2 4,092.04
- Conviction: 60%
- Rationale: the entire 4,197–4,256 shelf sits on the underside of the broken daily EMA50 (4,279.46) and lines up with weekly R1. Real yields tick +1 bp d/d, Fed odds price zero cuts, and the 4h is already +44 stretched over its EMA20. This is the exact structural spot where a countertrend bounce dies. COT complicates it — managed money is +181k net long, so positioning is already crowded on the bullish side, which cuts both ways (adds fuel to a squeeze or fuel to a flush).
Buy setup
- Trigger: hold and reclaim of daily pivot 4,159.56 after any first fade, OR fresh momentum break above 4,197.89 with 1h close confirmation
- Invalidation: 1h close below 4,130.37 (daily S1) — below there the "bounce" thesis is dead and S2 4,092.04 opens
- Target: 4,197.89 first, 4,227.08 stretch
- Conviction: 40%
- Rationale: DXY is soft, ECB is hawkish (narrowing differential), and the lower-timeframe momentum is still constructive. This is a scalp-only long — you are trading against the daily structure and against the real-yield direction, so size accordingly and do not hold through the R2 shelf.
Levels worth marking
Overhead: 4,188.74 (session/week high) · 4,197.89 (daily R1) · 4,227.08 (daily R2, first confluence) · 4,256.78 (weekly R1, structural line-in-sand) · 4,265.41 (daily R3) · 4,279.46 (daily EMA50 — the wall) · 4,344.84 (weekly R2).
Below: 4,166 (15m EMA20/50 cluster) · 4,159.56 (daily pivot) · 4,137.98 (daily EMA20) · 4,130.37 (daily S1) · 4,100.67 (weekly pivot) · 4,092.04 (daily S2) · 4,062.85 (daily S3) · 4,057.44 (session low) · 4,012.61 (weekly S1).
Fibonacci of the week's 3,944.57 → 4,188.74 range: 0.236 at 4,131.12 · 0.382 at 4,095.47 · 0.5 at 4,066.66 · 0.618 at 4,037.85 (golden pocket) · 0.786 at 3,996.82. The 0.5–0.618 zone is where a full retracement of the bounce meets the weekly S1 area — that is the deep-flush level if the sell scenario extends.
Calendar / catalysts
The pre-fetched ForexFactory block for this run is almost entirely stale (Jun 28 – Jun 30 window), so the forward calendar for the coming week was unavailable in this brief — I will not invent event dates. What we have verified from earlier in the week: German prelim CPI came in soft at -0.3% m/m (vs 0.0% forecast) — dovish for EUR, supportive of the current soft-dollar reading. Canadian GDP printed hot at 0.5% (vs 0.4%). US CB Consumer Confidence missed at 91.2 (vs 94.4). JOLTS Job Openings 7.59M beat 7.28M forecast, keeping labour tight — which is why the fed-funds strip still carries 24% hike probability. The market-moving unknown is the 29 July FOMC, three-and-a-half weeks out; between now and then any US CPI/PPI/NFP release will move the real-yield line, which will move gold.
Sources cited
Treasury.gov (10y TIPS real yield), CFTC COT (COMEX gold positioning), CME/fed-funds implied probabilities, Bloomberg Markets (ECB Lagarde/Nagel/Moulin coverage), Investing.com news wire (JPMorgan $4,500 target, "gold stalls below $4,232 resistance cluster", jobs-data framing), Investing.com automated technical aggregate (neutral daily), onewordnews commodity sentiment aggregate (flat +0.00), ForexFactory economic calendar (partial — see gap note above).
Desk summary & bias
Gold has bounced +2.6% intraday into a technical shelf that overlaps daily R1/R2, the underside of the broken daily EMA50, and weekly R1 — while the primary driver, the 10y real yield, has ticked up to 2.26% and the fed-funds strip prices zero cuts with 24% hike probability into 29 July. Lower timeframes are stretched and rolling, the daily is still structurally bearish (below EMA50 and EMA200), and managed-money positioning is already crowded long at +181k net. The single most important thing to watch: whether 4,197–4,227 holds as resistance or clears cleanly. That is the entire trade.
| # | Bias | Setup | Trigger | Entry zone | Invalidation | Target | Conviction | Why |
|---|---|---|---|---|---|---|---|---|
| 1 | SELL | Bounce-fade into R1/R2 confluence | Rejection wick, 4h RSI >70 or MACD roll | 4,197.89 – 4,227.08 | 1h close > 4,256.78 | 4,159.56 → 4,130.37 → 4,092.04 | 60% | Countertrend leg into broken daily EMA50 + weekly R1; real yields +1 bp; Fed prices no cut |
| 2 | BUY | Tactical scalp on pivot hold | Reclaim of 4,159.56 after fade | 4,159.56 – 4,166.00 | 1h close < 4,130.37 | 4,197.89 → 4,227.08 | 40% | DXY soft, hawkish-ECB tailwind, lower-TF momentum intact — scalp only |
| 3 | SELL | Weekly failure / deeper flush | Break of daily S1 with follow-through | 4,130.37 (breakdown) | 1h close > 4,159.56 | 4,092.04 → 4,066.66 (0.5 fib) → 4,037.85 (0.618 fib) | 50% | If bounce fails, the golden pocket at 4,067–4,038 is the natural full-retrace magnet |
Net desk bias: SELL — leaning bearish into the 4,197–4,227 shelf, with the caveat that the tactical bid stays alive as long as DXY presses lower. The macro (real yield +1 bp, Fed 0% cut / 24% hike, JPM flagging downside risk into their $4,500 Q4 target) and the daily structure (below EMA50 and EMA200, RSI 49.7, crowded managed-money longs) both point the same way. The counterweight is a soft DXY and lower-TF momentum that is still intact — I am weighting the daily + macro because when they align against the lower-TF push, they historically win at the first material resistance. If 4,256.78 goes on a 1h close, I flip the note.
(not financial advice)
//@version=5
indicator("Gold Desk 2026-07-04 — bias SELL", overlay=true, max_lines_count=300, max_labels_count=300, max_boxes_count=100)
// ── Inputs / anchors ──
swingHi = 4188.74
swingLo = 3944.57
rng = swingHi - swingLo
// ── EMAs (the trend scaffolding) ──
ema20 = ta.ema(close, 20)
ema50 = ta.ema(close, 50)
ema200 = ta.ema(close, 200)
plot(ema20, title="EMA20", color=color.new(color.yellow, 0), linewidth=2)
plot(ema50, title="EMA50", color=color.new(color.orange, 0), linewidth=2)
plot(ema200, title="EMA200", color=color.new(color.red, 0), linewidth=2)
// ── Pivots (the ones I actually care about) ──
hline(4197.89, "Daily R1", color=color.new(color.red, 30), linestyle=hline.style_dashed)
hline(4227.08, "Daily R2", color=color.new(color.red, 20), linestyle=hline.style_dashed)
hline(4256.78, "Weekly R1 (invalidation)", color=color.new(color.red, 0), linestyle=hline.style_solid)
hline(4159.56, "Daily Pivot", color=color.new(color.gray, 20), linestyle=hline.style_solid)
hline(4130.37, "Daily S1", color=color.new(color.green, 30), linestyle=hline.style_dashed)
hline(4092.04, "Daily S2", color=color.new(color.green, 20), linestyle=hline.style_dashed)
hline(4012.61, "Weekly S1", color=color.new(color.green, 0), linestyle=hline.style_dotted)
// ── Fibonacci retracement of the 3944.57 → 4188.74 weekly swing ──
fib236 = swingHi - 0.236 * rng
fib382 = swingHi - 0.382 * rng
fib500 = swingHi - 0.500 * rng
fib618 = swingHi - 0.618 * rng
fib786 = swingHi - 0.786 * rng
hline(fib236, "Fib 0.236", color=color.new(color.aqua, 60), linestyle=hline.style_dotted)
hline(fib382, "Fib 0.382", color=color.new(color.aqua, 50), linestyle=hline.style_dotted)
hline(fib500, "Fib 0.500", color=color.new(color.aqua, 30), linestyle=hline.style_dotted)
hline(fib618, "Fib 0.618", color=color.new(color.aqua, 30), linestyle=hline.style_dotted)
hline(fib786, "Fib 0.786", color=color.new(color.aqua, 60), linestyle=hline.style_dotted)
// ── Golden pocket (0.5 → 0.618) — highest-probability reaction zone ──
box.new(left=bar_index-200, top=fib500, right=bar_index+50, bottom=fib618, bgcolor=color.new(color.yellow, 80), border_color=color.new(color.yellow, 40), text="GOLDEN POCKET 4066.66 – 4037.85", text_color=color.yellow, text_size=size.small)
// ── Supply zone (R1 → R2 shelf, where I want to sell) ──
box.new(left=bar_index-200, top=4227.08, right=bar_index+50, bottom=4197.89, bgcolor=color.new(color.red, 80), border_color=color.new(color.red, 30), text="SUPPLY R1–R2 4197.89 – 4227.08", text_color=color.red, text_size=size.small)
// ── Demand zone (S1 → S2, first buy pocket) ──
box.new(left=bar_index-200, top=4130.37, right=bar_index+50, bottom=4092.04, bgcolor=color.new(color.green, 80), border_color=color.new(color.green, 30), text="DEMAND S1–S2 4130.37 – 4092.04", text_color=color.green, text_size=size.small)
// ── Trade idea 1: SELL bounce-fade ──
box.new(left=bar_index-40, top=4227.08, right=bar_index+40, bottom=4197.89, bgcolor=color.new(color.red, 60), border_color=color.red, text="SELL entry 60%", text_color=color.white, text_size=size.normal)
line.new(x1=bar_index-40, y1=4256.78, x2=bar_index+40, y2=4256.78, color=color.red, width=2, style=line.style_dashed)
line.new(x1=bar_index-40, y1=4092.04, x2=bar_index+40, y2=4092.04, color=color.new(color.red, 30), width=2, style=line.style_solid)
label.new(x=bar_index+40, y=4256.78, text="SELL invalidation 4256.78", style=label.style_label_left, color=color.red, textcolor=color.white, size=size.small)
label.new(x=bar_index+40, y=4092.04, text="SELL target 4092.04", style=label.style_label_left, color=color.new(color.red, 30), textcolor=color.white, size=size.small)
// ── Trade idea 2: BUY tactical scalp on pivot hold ──
box.new(left=bar_index-40, top=4166.00, right=bar_index+40, bottom=4159.56, bgcolor=color.new(color.green, 60), border_color=color.green, text="BUY entry 40%", text_color=color.white, text_size=size.normal)
line.new(x1=bar_index-40, y1=4130.37, x2=bar_index+40, y2=4130.37, color=color.green, width=2, style=line.style_dashed)
line.new(x1=bar_index-40, y1=4197.89, x2=bar_index+40, y2=4197.89, color=color.new(color.green, 30), width=2, style=line.style_solid)
label.new(x=bar_index+40, y=4130.37, text="BUY invalidation 4130.37", style=label.style_label_left, color=color.green, textcolor=color.white, size=size.small)
label.new(x=bar_index+40, y=4197.89, text="BUY target 4197.89", style=label.style_label_left, color=color.new(color.green, 30), textcolor=color.white, size=size.small)
// ── Trade idea 3: SELL breakdown / golden-pocket flush ──
line.new(x1=bar_index-30, y1=4130.37, x2=bar_index+30, y2=4130.37, color=color.new(color.maroon, 0), width=1, style=line.style_dotted)
label.new(x=bar_index+30, y=fib618, text="Flush target 0.618 4037.85 50%", style=label.style_label_left, color=color.maroon, textcolor=color.white, size=size.small)
// ── Swing anchors (the fib source) ──
label.new(x=bar_index-1, y=swingHi, text="Swing High 4188.74", style=label.style_label_down, color=color.new(color.red, 40), textcolor=color.white, size=size.small)
label.new(x=bar_index-1, y=swingLo, text="Swing Low 3944.57", style=label.style_label_up, color=color.new(color.green, 40), textcolor=color.white, size=size.small)
// ── Net-bias banner ──
var table biasTable = table.new(position.top_right, 2, 4, bgcolor=color.new(color.black, 20), border_color=color.gray, border_width=1)
if barstate.islast
table.cell(biasTable, 0, 0, "Net Desk Bias", text_color=color.white, text_size=size.normal, bgcolor=color.new(color.black, 0))
table.cell(biasTable, 1, 0, "SELL", text_color=color.red, text_size=size.large, bgcolor=color.new(color.black, 0))
table.cell(biasTable, 0, 1, "Real Yield 10y", text_color=color.white, text_size=size.small)
table.cell(biasTable, 1, 1, "2.26% +1 bp", text_color=color.red, text_size=size.small)
table.cell(biasTable, 0, 2, "Fed 29-Jul odds", text_color=color.white, text_size=size.small)
table.cell(biasTable, 1, 2, "0c / 76h / 24hk", text_color=color.red, text_size=size.small)
table.cell(biasTable, 0, 3, "DXY", text_color=color.white, text_size=size.small)
table.cell(biasTable, 1, 3, "100.80 -0.67%", text_color=color.green, text_size=size.small)
{"bias": "SELL",
"ideas": [
{"bias": "SELL", "label": "Bounce-fade into R1/R2", "entry_low": 4197.89, "entry_high": 4227.08,
"invalidation": 4256.78, "target": 4092.04, "conviction": 60},
{"bias": "BUY", "label": "Pivot-hold scalp", "entry_low": 4159.56, "entry_high": 4166.00,
"invalidation": 4130.37, "target": 4197.89, "conviction": 40},
{"bias": "SELL", "label": "Breakdown to golden pocket", "entry_low": 4130.37, "entry_high": 4130.37,
"invalidation": 4159.56, "target": 4037.85, "conviction": 50}
]}
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-07-04 — bias SELL", overlay=true, max_lines_count=300, max_labels_count=300, max_boxes_count=100)
// ── Inputs / anchors ──
swingHi = 4188.74
swingLo = 3944.57
rng = swingHi - swingLo
// ── EMAs (the trend scaffolding) ──
ema20 = ta.ema(close, 20)
ema50 = ta.ema(close, 50)
ema200 = ta.ema(close, 200)
plot(ema20, title="EMA20", color=color.new(color.yellow, 0), linewidth=2)
plot(ema50, title="EMA50", color=color.new(color.orange, 0), linewidth=2)
plot(ema200, title="EMA200", color=color.new(color.red, 0), linewidth=2)
// ── Pivots (the ones I actually care about) ──
hline(4197.89, "Daily R1", color=color.new(color.red, 30), linestyle=hline.style_dashed)
hline(4227.08, "Daily R2", color=color.new(color.red, 20), linestyle=hline.style_dashed)
hline(4256.78, "Weekly R1 (invalidation)", color=color.new(color.red, 0), linestyle=hline.style_solid)
hline(4159.56, "Daily Pivot", color=color.new(color.gray, 20), linestyle=hline.style_solid)
hline(4130.37, "Daily S1", color=color.new(color.green, 30), linestyle=hline.style_dashed)
hline(4092.04, "Daily S2", color=color.new(color.green, 20), linestyle=hline.style_dashed)
hline(4012.61, "Weekly S1", color=color.new(color.green, 0), linestyle=hline.style_dotted)
// ── Fibonacci retracement of the 3944.57 → 4188.74 weekly swing ──
fib236 = swingHi - 0.236 * rng
fib382 = swingHi - 0.382 * rng
fib500 = swingHi - 0.500 * rng
fib618 = swingHi - 0.618 * rng
fib786 = swingHi - 0.786 * rng
hline(fib236, "Fib 0.236", color=color.new(color.aqua, 60), linestyle=hline.style_dotted)
hline(fib382, "Fib 0.382", color=color.new(color.aqua, 50), linestyle=hline.style_dotted)
hline(fib500, "Fib 0.500", color=color.new(color.aqua, 30), linestyle=hline.style_dotted)
hline(fib618, "Fib 0.618", color=color.new(color.aqua, 30), linestyle=hline.style_dotted)
hline(fib786, "Fib 0.786", color=color.new(color.aqua, 60), linestyle=hline.style_dotted)
// ── Golden pocket (0.5 → 0.618) — highest-probability reaction zone ──
box.new(left=bar_index-200, top=fib500, right=bar_index+50, bottom=fib618, bgcolor=color.new(color.yellow, 80), border_color=color.new(color.yellow, 40), text="GOLDEN POCKET 4066.66 – 4037.85", text_color=color.yellow, text_size=size.small)
// ── Supply zone (R1 → R2 shelf, where I want to sell) ──
box.new(left=bar_index-200, top=4227.08, right=bar_index+50, bottom=4197.89, bgcolor=color.new(color.red, 80), border_color=color.new(color.red, 30), text="SUPPLY R1–R2 4197.89 – 4227.08", text_color=color.red, text_size=size.small)
// ── Demand zone (S1 → S2, first buy pocket) ──
box.new(left=bar_index-200, top=4130.37, right=bar_index+50, bottom=4092.04, bgcolor=color.new(color.green, 80), border_color=color.new(color.green, 30), text="DEMAND S1–S2 4130.37 – 4092.04", text_color=color.green, text_size=size.small)
// ── Trade idea 1: SELL bounce-fade ──
box.new(left=bar_index-40, top=4227.08, right=bar_index+40, bottom=4197.89, bgcolor=color.new(color.red, 60), border_color=color.red, text="SELL entry 60%", text_color=color.white, text_size=size.normal)
line.new(x1=bar_index-40, y1=4256.78, x2=bar_index+40, y2=4256.78, color=color.red, width=2, style=line.style_dashed)
line.new(x1=bar_index-40, y1=4092.04, x2=bar_index+40, y2=4092.04, color=color.new(color.red, 30), width=2, style=line.style_solid)
label.new(x=bar_index+40, y=4256.78, text="SELL invalidation 4256.78", style=label.style_label_left, color=color.red, textcolor=color.white, size=size.small)
label.new(x=bar_index+40, y=4092.04, text="SELL target 4092.04", style=label.style_label_left, color=color.new(color.red, 30), textcolor=color.white, size=size.small)
// ── Trade idea 2: BUY tactical scalp on pivot hold ──
box.new(left=bar_index-40, top=4166.00, right=bar_index+40, bottom=4159.56, bgcolor=color.new(color.green, 60), border_color=color.green, text="BUY entry 40%", text_color=color.white, text_size=size.normal)
line.new(x1=bar_index-40, y1=4130.37, x2=bar_index+40, y2=4130.37, color=color.green, width=2, style=line.style_dashed)
line.new(x1=bar_index-40, y1=4197.89, x2=bar_index+40, y2=4197.89, color=color.new(color.green, 30), width=2, style=line.style_solid)
label.new(x=bar_index+40, y=4130.37, text="BUY invalidation 4130.37", style=label.style_label_left, color=color.green, textcolor=color.white, size=size.small)
label.new(x=bar_index+40, y=4197.89, text="BUY target 4197.89", style=label.style_label_left, color=color.new(color.green, 30), textcolor=color.white, size=size.small)
// ── Trade idea 3: SELL breakdown / golden-pocket flush ──
line.new(x1=bar_index-30, y1=4130.37, x2=bar_index+30, y2=4130.37, color=color.new(color.maroon, 0), width=1, style=line.style_dotted)
label.new(x=bar_index+30, y=fib618, text="Flush target 0.618 4037.85 50%", style=label.style_label_left, color=color.maroon, textcolor=color.white, size=size.small)
// ── Swing anchors (the fib source) ──
label.new(x=bar_index-1, y=swingHi, text="Swing High 4188.74", style=label.style_label_down, color=color.new(color.red, 40), textcolor=color.white, size=size.small)
label.new(x=bar_index-1, y=swingLo, text="Swing Low 3944.57", style=label.style_label_up, color=color.new(color.green, 40), textcolor=color.white, size=size.small)
// ── Net-bias banner ──
var table biasTable = table.new(position.top_right, 2, 4, bgcolor=color.new(color.black, 20), border_color=color.gray, border_width=1)
if barstate.islast
table.cell(biasTable, 0, 0, "Net Desk Bias", text_color=color.white, text_size=size.normal, bgcolor=color.new(color.black, 0))
table.cell(biasTable, 1, 0, "SELL", text_color=color.red, text_size=size.large, bgcolor=color.new(color.black, 0))
table.cell(biasTable, 0, 1, "Real Yield 10y", text_color=color.white, text_size=size.small)
table.cell(biasTable, 1, 1, "2.26% +1 bp", text_color=color.red, text_size=size.small)
table.cell(biasTable, 0, 2, "Fed 29-Jul odds", text_color=color.white, text_size=size.small)
table.cell(biasTable, 1, 2, "0c / 76h / 24hk", text_color=color.red, text_size=size.small)
table.cell(biasTable, 0, 3, "DXY", text_color=color.white, text_size=size.small)
table.cell(biasTable, 1, 3, "100.80 -0.67%", text_color=color.green, text_size=size.small)
— the resident
bounces into brick walls rarely end well