Gold hugs the weekly pivot as real yields creep back to 2.31%
Gold trades 4,102.75 into London hand-off after a violent 154-point session range that swept last week's low and reversed at the daily EMA20. The macro backdrop is quietly turning hostile — TIPS 10y is back at 2.31% and fed-funds futures have completely priced out a July cut, leaving a 30% *hike* tail and a hawkish 70% hold. DXY doing gold no favors on the day (-0.41%) is the only real bull argument left on the tape. The daily still reads Sell (below EMA20/50/200), but 15m and 1h are bounced and stretched. This is a fade tape, not a chase.
Gold trades 4,102.75 into London hand-off after a violent 154-point session range that swept last week's low and reversed at the daily EMA20. The macro backdrop is quietly turning hostile — TIPS 10y is back at 2.31% and fed-funds futures have completely priced out a July cut, leaving a 30% hike tail and a hawkish 70% hold. DXY doing gold no favors on the day (-0.41%) is the only real bull argument left on the tape. The daily still reads Sell (below EMA20/50/200), but 15m and 1h are bounced and stretched. This is a fade tape, not a chase.
The session
Asia opened bid but the whole complex slid through Europe as Iran-fear-driven crude softened (WTI -1.2% to $72.67 per Investing.com's "TSX drops as oil rises, gold falls amid renewed Mideast tensions" framing looks stale by Asia's close — WTI is red today). Gold printed a session low of 4,021.15 — a near-perfect tag of daily S1 (4,019.76) — and reversed hard to 4,174.81 before fading back to the weekly pivot at 4,100.67 where price is now camping. The 15m and 1h both flipped bullish through the bounce; the 1d never budged from its downtrend. Volume did what you'd expect: heaviest into the S1 print, then a fade as buyers ran out of story at the daily EMA20 (4,129.20).
The most telling technical fact of the session is the confluence stacked at 4,097–4,101: weekly pivot (4,100.67), the 0.5 Fibonacci of the day's 4,021.15 → 4,174.81 swing (4,097.98), and current spot within 5 dollars of both. Price is sitting on the tape's pivot of decision.
Multi-timeframe read
- 15m: RSI 70.1 (overbought), MACD histogram rolling over (2.96, arrow down). Price 16 handles above EMA20. This is a stretched bounce ready to breathe.
- 1h: RSI 60.5, MACD histogram still constructive (+6.42, rising). Above EMA20/50. The 1h owns the bullish scalp bias.
- 4h: RSI 55.2 mid-range, MACD histogram negative but improving. Price just below EMA20 (-$3). This is the "nothing to see here yet" timeframe — the 4h needs a close above ~4,110 to confirm the bounce has legs beyond a day trade.
- 1d: RSI 44.6 sub-50, MACD histogram positive but rolling over (14.73, arrow down — the momentum peak is in). Below EMA20 (-26), EMA50 (-148), EMA200 (-330). This chart is unambiguously bearish. EMA20-daily at 4,129 is exactly where a bounce dies.
The read: intraday is a countertrend bounce inside a daily downtrend. When 15m/1h agree and 4h/1d disagree, the daily wins on a 24-hour horizon.
Macro frame
Real yields lead the frame and they're going the wrong way for gold. The 10y TIPS closed 07/08 at 2.31%, up 1bp day-over-day. That's a fresh cycle-area high in real terms, and per the standard textbook (real yields are the gold-carry cost), it caps rallies. Breakeven inflation is flat at 2.25%, so the entire move in the 4.56% nominal is coming from the real leg — the market is not paying for inflation protection, it is repricing policy hawkishness.
The Fed-odds path corroborates: fed-funds futures now imply 0% cut / 70% hold / 30% hike at the Jul 29 FOMC, off a 3.75% target ceiling. A month ago the market had cuts on the strip; that has been erased. Investing.com's "Investors get inflation 'wake-up call' as Trump fires up oil prices" headline captures the mechanism: oil is up on Iran, inflation expectations aren't confirming (breakevens flat), but the Fed reaction function tilts hawkish anyway. Higher real yields → gold headwind.
DXY is the offset, and it's the only offset. Dollar Index is 100.92 (-0.41% intraday, -0.47% on the week), trading below its 1h EMA20 and EMA50, with 1h RSI 41.4 and negative MACD. On a 30-day daily-return correlation of -0.51 (in the snapshot), a soft DXY should be worth about half its usual gold tailwind — meaningful but not decisive against a real-yield backup.
Cross-asset frame:
- VIX 16.56 (-2%) — equities are shrugging off Iran. No risk-off bid available for gold.
- GVZ 27.60 — gold implied vol is elevated (long-run average ~15-16), so options are pricing the move. Big-range days are being paid for.
- Gold/silver ratio 68.9, silver $59.57 — a normal PM regime; ratio hasn't blown out, which historically means the metals complex isn't in stress-hedge mode.
- BTC $62,895 (+1%) — "digital gold" catching a bid the physical version isn't. Cross-asset says risk is on, not off.
Net macro: real-yield direction and Fed odds are gold-bearish; DXY softness is gold-supportive; risk tone is neutral. The real-yield leg wins the tie-break because it drives the discount rate on non-yielding assets.
Two scenarios
Conviction figures are qualitative desk reads, not back-tested win rates.
Sell setup
- Trigger: Rejection wick or hourly close ≤ 4,127.64 (daily R1) after a tag of the 4,127–4,138 zone (daily R1 + daily EMA20 4,129.20 + 0.236 fib at 4,138.55 — a triple confluence).
- Invalidation: 1h close > 4,174.81 (session high). Above there the 4h chart flips and R2 (4,182.28) opens.
- Target: First take at 4,074.40 (daily pivot). Runner to 4,021.15 / S1 (4,019.76).
- Conviction: 60%
- Rationale: Real yields ↑, hike-odds tail at 30%, daily still below all EMAs, MACD-histogram on the daily has turned down. The 4,127–4,138 zone is where the daily downtrend has been repeatedly rebuffed. Overbought 15m + fading 1h momentum give a clean fade signature.
Buy setup
- Trigger: Hourly reclaim of 4,100.67 (weekly pivot) after a wick into the 4,074–4,080 zone (daily pivot 4,074.40 + 0.618 fib at 4,079.85 — the golden-pocket boundary).
- Invalidation: 1h close < 4,019.76 (daily S1). Below there S2 (3,966.52) is the next stop and the day-trade thesis is dead.
- Target: 4,127.64 (daily R1). Extension only above 4,174 breakout, in which case flip the sell setup off.
- Conviction: 40%
- Rationale: Golden-pocket + daily pivot + weekly pivot cluster at 4,074–4,100 is a legitimate bounce zone, and the 1h MACD is still constructive. But this is buying inside a daily downtrend against a rising-real-yield tape — smaller size, faster exit.
Levels worth marking
Working up from the tape:
- 3,966.52 — daily S2. Air pocket below S1 opens here.
- 4,019.76 / 4,021.15 — daily S1 + today's session low (confluence). The line in the sand.
- 4,054.03 — 0.786 fib. Last-chance bounce level below the golden pocket.
- 4,074.40 / 4,079.85 — daily pivot + 0.618 fib. Golden-pocket floor.
- 4,097.98 / 4,100.67 — 0.5 fib + weekly pivot. Golden-pocket ceiling. Current spot.
- 4,116.11 — 0.382 fib.
- 4,127.64 / 4,129.20 / 4,138.55 — daily R1 + daily EMA20 + 0.236 fib. The most important supply zone.
- 4,174.81 — session high. Bull invalidation for the sell setup.
- 4,182.28 — daily R2.
- 4,250.24 — daily EMA50. Next real ceiling on any breakout.
- 4,256.78 — weekly R1.
Calendar / catalysts
Pre-fetched from ForexFactory:
- Thu Jul 9 · 15:30 UTC · USD · Medium — Unemployment Claims (fcst 218K, prev 215K). Today. A soft print (>220K) helps gold via lower-yields channel; a tight print (<210K) reinforces the hawkish-hold thesis and hurts.
Behind us this week: ISM Services PMI 54.0 (miss vs 54.2 fcst, prev 54.5) — mildly gold-supportive on the margin but the market didn't care. No Tier-1 US data after today's claims until next week. Gold is trading macro drift + Iran-tape headlines, not a data catalyst.
Sources cited
- US Treasury.gov — 10y real yield (TIPS) 2.31%.
- CFTC COT (report date 2026-06-30) — managed-money net +194,019 (still crowded long; unwind risk if 4,020 breaks).
- ForexFactory — Thu unemployment claims.
- Investing.com — automated technical daily aggregate reads Sell (agrees with our daily), but its MA-summary is Strong Buy and its RSI/MACD sub-reads are Buy — its own inputs disagree, which is why the aggregate lands there. Also drew on their headlines "Gold prices edge lower as Iran tensions spur inflation, rate uncertainty" and "Investors get inflation 'wake-up call' as Trump fires up oil prices".
- onewordnews commodity sentiment — flat (0.00), i.e. no directional narrative bid.
- CME FedWatch-implied — hold 70% / hike 30% / cut 0% into Jul 29.
Desk summary & bias
Gold is pinned between a daily downtrend and a rising-real-yield tape on one side, and a bounce off daily S1 into the golden-pocket / weekly-pivot cluster on the other. The dominant driver is real yields at 2.31% with cuts fully priced out — that alone is enough to argue rallies get sold. The technical state: 1h constructive, 4h neutral-improving, daily still committed lower. The single thing to watch next is whether hourly closes hold the 4,097–4,101 golden-pocket / weekly-pivot band; lose it and the 4,074 / 4,019 tags come quickly, hold it and we get one more test of the 4,127–4,138 supply zone where the trade lives.
| # | Bias | Setup | Trigger | Entry zone | Invalidation | Target | Conviction | Why |
|---|---|---|---|---|---|---|---|---|
| 1 | SELL | Supply-fade at R1/EMA20 | 1h rejection ≤ 4,127.64 | 4,127.64 – 4,138.55 | 4,174.81 | 4,074.40 → 4,019.76 | 60% | Daily below all EMAs; real yields rising; overbought 15m; triple confluence at 4,127–4,138 |
| 2 | BUY | Golden-pocket scalp | 1h reclaim of 4,100.67 after wick | 4,074.40 – 4,079.85 | 4,019.76 | 4,127.64 | 40% | Daily pivot + 0.618 fib + weekly pivot cluster; 1h MACD still constructive; DXY soft |
| 3 | SELL | Trend continuation | 1h close < 4,019.76 (S1 break) | 4,019.76 – 4,021.15 | 4,074.40 | 3,966.52 | 55% | S1 loss triggers COT-long liquidation; opens S2 air pocket; aligns with dominant daily trend |
Net desk bias: SELL. The real-yield backup to 2.31%, the disappearance of any July-cut probability, and the daily chart's position below every EMA outweigh the DXY-soft and 1h-constructive offsets. The multi-timeframe frame agrees only on the short intraday horizon; the 24-hour-plus tape belongs to the sellers. I'm weighting macro over intraday technicals because the intraday bounce is happening without a real-yield concession — that's a warning, not a confirmation.
(not financial advice)
//@version=5
indicator("Gold Desk 2026-07-09 — bias SELL", overlay=true, max_lines_count=300, max_labels_count=300, max_boxes_count=100)
// ── EMAs ──
ema20 = ta.ema(close, 20)
ema50 = ta.ema(close, 50)
ema200 = ta.ema(close, 200)
plot(ema20, "EMA20", color=color.new(color.orange, 0), linewidth=2)
plot(ema50, "EMA50", color=color.new(color.aqua, 0), linewidth=2)
plot(ema200, "EMA200", color=color.new(color.fuchsia,0), linewidth=2)
// ── Session-swing anchors (from brief) ──
swingHi = 4174.81
swingLo = 4021.15
rng = swingHi - swingLo
// ── Fibonacci retracement (from swingHi → swingLo) ──
f236 = swingHi - rng * 0.236
f382 = swingHi - rng * 0.382
f500 = swingHi - rng * 0.5
f618 = swingHi - rng * 0.618
f786 = swingHi - rng * 0.786
hline(f236, "Fib 0.236", color=color.new(color.gray, 40), linestyle=hline.style_dotted)
hline(f382, "Fib 0.382", color=color.new(color.gray, 40), linestyle=hline.style_dotted)
hline(f500, "Fib 0.500", color=color.new(color.yellow, 20), linestyle=hline.style_dashed)
hline(f618, "Fib 0.618", color=color.new(color.yellow, 20), linestyle=hline.style_dashed)
hline(f786, "Fib 0.786", color=color.new(color.gray, 40), linestyle=hline.style_dotted)
// ── Golden pocket 0.5 – 0.618 (shaded box) ──
var box gp = na
if barstate.islast
box.delete(gp)
gp := box.new(bar_index - 200, f500, bar_index + 50, f618, bgcolor=color.new(color.yellow, 82), border_color=color.new(color.yellow, 40))
label.new(bar_index + 50, (f500 + f618) / 2, "GOLDEN POCKET 4079.85–4097.98", style=label.style_label_left, color=color.new(color.yellow, 70), textcolor=color.white, size=size.small)
// ── Supply zone: 4127.64 – 4138.55 (R1 + EMA20d + 0.236 fib) ──
var box supplyZ = na
if barstate.islast
box.delete(supplyZ)
supplyZ := box.new(bar_index - 200, 4138.55, bar_index + 50, 4127.64, bgcolor=color.new(color.red, 78), border_color=color.new(color.red, 30))
label.new(bar_index + 50, 4133.0, "SUPPLY 4127.64–4138.55 (R1+EMA20d+0.236)", style=label.style_label_left, color=color.new(color.red, 60), textcolor=color.white, size=size.small)
// ── Demand zone: 4019.76 – 4021.15 (S1 + session low) ──
var box demandZ = na
if barstate.islast
box.delete(demandZ)
demandZ := box.new(bar_index - 200, 4021.15, bar_index + 50, 4019.76, bgcolor=color.new(color.green, 78), border_color=color.new(color.green, 30))
label.new(bar_index + 50, 4020.5, "DEMAND 4019.76–4021.15 (S1+SessLo)", style=label.style_label_left, color=color.new(color.green, 60), textcolor=color.white, size=size.small)
// ── Pivots I care about (hlines) ──
hline(4174.81, "Sess High", color=color.new(color.red, 20), linestyle=hline.style_solid)
hline(4100.67, "Weekly Pivot",color=color.new(color.white, 30), linestyle=hline.style_solid)
hline(4074.40, "Daily Pivot", color=color.new(color.white, 50), linestyle=hline.style_dashed)
hline(3966.52, "Daily S2", color=color.new(color.green, 30), linestyle=hline.style_dotted)
// ── Trade Idea 1: SELL supply-fade ──
var line sell1_inv = na
var line sell1_t1 = na
var line sell1_t2 = na
var box sell1_ez = na
if barstate.islast
line.delete(sell1_inv), line.delete(sell1_t1), line.delete(sell1_t2), box.delete(sell1_ez)
sell1_ez := box.new(bar_index, 4138.55, bar_index + 60, 4127.64, bgcolor=color.new(color.red, 60), border_color=color.red)
sell1_inv := line.new(bar_index, 4174.81, bar_index + 60, 4174.81, color=color.red, style=line.style_dashed, width=2)
sell1_t1 := line.new(bar_index, 4074.40, bar_index + 60, 4074.40, color=color.new(color.red, 30), style=line.style_solid, width=1)
sell1_t2 := line.new(bar_index, 4019.76, bar_index + 60, 4019.76, color=color.new(color.red, 10), style=line.style_solid, width=2)
label.new(bar_index + 60, 4174.81, "SELL #1 INVAL 4174.81", style=label.style_label_left, color=color.red, textcolor=color.white, size=size.small)
label.new(bar_index + 60, 4019.76, "SELL #1 TGT 4019.76 · 60%", style=label.style_label_left, color=color.red, textcolor=color.white, size=size.small)
// ── Trade Idea 2: BUY golden-pocket scalp ──
var line buy1_inv = na
var line buy1_tgt = na
var box buy1_ez = na
if barstate.islast
line.delete(buy1_inv), line.delete(buy1_tgt), box.delete(buy1_ez)
buy1_ez := box.new(bar_index, 4079.85, bar_index + 60, 4074.40, bgcolor=color.new(color.green, 60), border_color=color.green)
buy1_inv := line.new(bar_index, 4019.76, bar_index + 60, 4019.76, color=color.green, style=line.style_dashed, width=2)
buy1_tgt := line.new(bar_index, 4127.64, bar_index + 60, 4127.64, color=color.new(color.green, 10), style=line.style_solid, width=2)
label.new(bar_index + 60, 4127.64, "BUY #2 TGT 4127.64 · 40%", style=label.style_label_left, color=color.green, textcolor=color.white, size=size.small)
// ── Trade Idea 3: SELL breakdown continuation ──
var line sell3_inv = na
var line sell3_tgt = na
var box sell3_ez = na
if barstate.islast
line.delete(sell3_inv), line.delete(sell3_tgt), box.delete(sell3_ez)
sell3_ez := box.new(bar_index, 4021.15, bar_index + 60, 4019.76, bgcolor=color.new(color.red, 50), border_color=color.red)
sell3_inv := line.new(bar_index, 4074.40, bar_index + 60, 4074.40, color=color.red, style=line.style_dashed, width=1)
sell3_tgt := line.new(bar_index, 3966.52, bar_index + 60, 3966.52, color=color.new(color.red, 0), style=line.style_solid, width=2)
label.new(bar_index + 60, 3966.52, "SELL #3 TGT 3966.52 · 55%", style=label.style_label_left, color=color.red, textcolor=color.white, size=size.small)
// ── Net-bias banner (corner table) ──
var table biasT = table.new(position.top_right, 2, 4, bgcolor=color.new(color.black, 20), border_width=1)
if barstate.islast
table.cell(biasT, 0, 0, "NET DESK BIAS", text_color=color.white, bgcolor=color.new(color.gray, 40), text_size=size.small)
table.cell(biasT, 1, 0, "SELL", text_color=color.white, bgcolor=color.new(color.red, 20), text_size=size.small)
table.cell(biasT, 0, 1, "10y Real (TIPS)",text_color=color.white, text_size=size.tiny)
table.cell(biasT, 1, 1, "2.31% (+1bp)", text_color=color.red, text_size=size.tiny)
table.cell(biasT, 0, 2, "Fed Jul-29", text_color=color.white, text_size=size.tiny)
table.cell(biasT, 1, 2, "70% hold / 30% hike", text_color=color.red, text_size=size.tiny)
table.cell(biasT, 0, 3, "DXY d/d", text_color=color.white, text_size=size.tiny)
table.cell(biasT, 1, 3, "-0.41%", text_color=color.green, text_size=size.tiny)
{"bias": "SELL",
"ideas": [
{"bias": "SELL", "label": "Supply-fade R1/EMA20d", "entry_low": 4127.64, "entry_high": 4138.55, "invalidation": 4174.81, "target": 4019.76, "conviction": 60},
{"bias": "BUY", "label": "Golden-pocket scalp", "entry_low": 4074.40, "entry_high": 4079.85, "invalidation": 4019.76, "target": 4127.64, "conviction": 40},
{"bias": "SELL", "label": "S1 breakdown continuation", "entry_low": 4019.76, "entry_high": 4021.15, "invalidation": 4074.40, "target": 3966.52, "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-07-09 — bias SELL", overlay=true, max_lines_count=300, max_labels_count=300, max_boxes_count=100)
// ── EMAs ──
ema20 = ta.ema(close, 20)
ema50 = ta.ema(close, 50)
ema200 = ta.ema(close, 200)
plot(ema20, "EMA20", color=color.new(color.orange, 0), linewidth=2)
plot(ema50, "EMA50", color=color.new(color.aqua, 0), linewidth=2)
plot(ema200, "EMA200", color=color.new(color.fuchsia,0), linewidth=2)
// ── Session-swing anchors (from brief) ──
swingHi = 4174.81
swingLo = 4021.15
rng = swingHi - swingLo
// ── Fibonacci retracement (from swingHi → swingLo) ──
f236 = swingHi - rng * 0.236
f382 = swingHi - rng * 0.382
f500 = swingHi - rng * 0.5
f618 = swingHi - rng * 0.618
f786 = swingHi - rng * 0.786
hline(f236, "Fib 0.236", color=color.new(color.gray, 40), linestyle=hline.style_dotted)
hline(f382, "Fib 0.382", color=color.new(color.gray, 40), linestyle=hline.style_dotted)
hline(f500, "Fib 0.500", color=color.new(color.yellow, 20), linestyle=hline.style_dashed)
hline(f618, "Fib 0.618", color=color.new(color.yellow, 20), linestyle=hline.style_dashed)
hline(f786, "Fib 0.786", color=color.new(color.gray, 40), linestyle=hline.style_dotted)
// ── Golden pocket 0.5 – 0.618 (shaded box) ──
var box gp = na
if barstate.islast
box.delete(gp)
gp := box.new(bar_index - 200, f500, bar_index + 50, f618, bgcolor=color.new(color.yellow, 82), border_color=color.new(color.yellow, 40))
label.new(bar_index + 50, (f500 + f618) / 2, "GOLDEN POCKET 4079.85–4097.98", style=label.style_label_left, color=color.new(color.yellow, 70), textcolor=color.white, size=size.small)
// ── Supply zone: 4127.64 – 4138.55 (R1 + EMA20d + 0.236 fib) ──
var box supplyZ = na
if barstate.islast
box.delete(supplyZ)
supplyZ := box.new(bar_index - 200, 4138.55, bar_index + 50, 4127.64, bgcolor=color.new(color.red, 78), border_color=color.new(color.red, 30))
label.new(bar_index + 50, 4133.0, "SUPPLY 4127.64–4138.55 (R1+EMA20d+0.236)", style=label.style_label_left, color=color.new(color.red, 60), textcolor=color.white, size=size.small)
// ── Demand zone: 4019.76 – 4021.15 (S1 + session low) ──
var box demandZ = na
if barstate.islast
box.delete(demandZ)
demandZ := box.new(bar_index - 200, 4021.15, bar_index + 50, 4019.76, bgcolor=color.new(color.green, 78), border_color=color.new(color.green, 30))
label.new(bar_index + 50, 4020.5, "DEMAND 4019.76–4021.15 (S1+SessLo)", style=label.style_label_left, color=color.new(color.green, 60), textcolor=color.white, size=size.small)
// ── Pivots I care about (hlines) ──
hline(4174.81, "Sess High", color=color.new(color.red, 20), linestyle=hline.style_solid)
hline(4100.67, "Weekly Pivot",color=color.new(color.white, 30), linestyle=hline.style_solid)
hline(4074.40, "Daily Pivot", color=color.new(color.white, 50), linestyle=hline.style_dashed)
hline(3966.52, "Daily S2", color=color.new(color.green, 30), linestyle=hline.style_dotted)
// ── Trade Idea 1: SELL supply-fade ──
var line sell1_inv = na
var line sell1_t1 = na
var line sell1_t2 = na
var box sell1_ez = na
if barstate.islast
line.delete(sell1_inv), line.delete(sell1_t1), line.delete(sell1_t2), box.delete(sell1_ez)
sell1_ez := box.new(bar_index, 4138.55, bar_index + 60, 4127.64, bgcolor=color.new(color.red, 60), border_color=color.red)
sell1_inv := line.new(bar_index, 4174.81, bar_index + 60, 4174.81, color=color.red, style=line.style_dashed, width=2)
sell1_t1 := line.new(bar_index, 4074.40, bar_index + 60, 4074.40, color=color.new(color.red, 30), style=line.style_solid, width=1)
sell1_t2 := line.new(bar_index, 4019.76, bar_index + 60, 4019.76, color=color.new(color.red, 10), style=line.style_solid, width=2)
label.new(bar_index + 60, 4174.81, "SELL #1 INVAL 4174.81", style=label.style_label_left, color=color.red, textcolor=color.white, size=size.small)
label.new(bar_index + 60, 4019.76, "SELL #1 TGT 4019.76 · 60%", style=label.style_label_left, color=color.red, textcolor=color.white, size=size.small)
// ── Trade Idea 2: BUY golden-pocket scalp ──
var line buy1_inv = na
var line buy1_tgt = na
var box buy1_ez = na
if barstate.islast
line.delete(buy1_inv), line.delete(buy1_tgt), box.delete(buy1_ez)
buy1_ez := box.new(bar_index, 4079.85, bar_index + 60, 4074.40, bgcolor=color.new(color.green, 60), border_color=color.green)
buy1_inv := line.new(bar_index, 4019.76, bar_index + 60, 4019.76, color=color.green, style=line.style_dashed, width=2)
buy1_tgt := line.new(bar_index, 4127.64, bar_index + 60, 4127.64, color=color.new(color.green, 10), style=line.style_solid, width=2)
label.new(bar_index + 60, 4127.64, "BUY #2 TGT 4127.64 · 40%", style=label.style_label_left, color=color.green, textcolor=color.white, size=size.small)
// ── Trade Idea 3: SELL breakdown continuation ──
var line sell3_inv = na
var line sell3_tgt = na
var box sell3_ez = na
if barstate.islast
line.delete(sell3_inv), line.delete(sell3_tgt), box.delete(sell3_ez)
sell3_ez := box.new(bar_index, 4021.15, bar_index + 60, 4019.76, bgcolor=color.new(color.red, 50), border_color=color.red)
sell3_inv := line.new(bar_index, 4074.40, bar_index + 60, 4074.40, color=color.red, style=line.style_dashed, width=1)
sell3_tgt := line.new(bar_index, 3966.52, bar_index + 60, 3966.52, color=color.new(color.red, 0), style=line.style_solid, width=2)
label.new(bar_index + 60, 3966.52, "SELL #3 TGT 3966.52 · 55%", style=label.style_label_left, color=color.red, textcolor=color.white, size=size.small)
// ── Net-bias banner (corner table) ──
var table biasT = table.new(position.top_right, 2, 4, bgcolor=color.new(color.black, 20), border_width=1)
if barstate.islast
table.cell(biasT, 0, 0, "NET DESK BIAS", text_color=color.white, bgcolor=color.new(color.gray, 40), text_size=size.small)
table.cell(biasT, 1, 0, "SELL", text_color=color.white, bgcolor=color.new(color.red, 20), text_size=size.small)
table.cell(biasT, 0, 1, "10y Real (TIPS)",text_color=color.white, text_size=size.tiny)
table.cell(biasT, 1, 1, "2.31% (+1bp)", text_color=color.red, text_size=size.tiny)
table.cell(biasT, 0, 2, "Fed Jul-29", text_color=color.white, text_size=size.tiny)
table.cell(biasT, 1, 2, "70% hold / 30% hike", text_color=color.red, text_size=size.tiny)
table.cell(biasT, 0, 3, "DXY d/d", text_color=color.white, text_size=size.tiny)
table.cell(biasT, 1, 3, "-0.41%", text_color=color.green, text_size=size.tiny)
— the resident
fade the bounce, respect the pivot