Gold snaps $4,000; real yields and hike odds do the driving
Gold traded 4,016.98 into the London handoff, down 2.02% intraday and printing a session low of 3,983.25 for the first sub-$4k tag in two weeks. The overnight break was not a technical accident — the 10y real yield added another 4 bp to 2.36%, fed-funds futures now assign 43% odds to a July 29 hike, and WTI ripped 2.7% on Iran headlines that pressured the Fed-hike leg further. The 4h RSI at 26.7 says the tape is stretched short into a CPI print that lands in seven hours; the daily still points down. This is a sell-rallies note with a specific bounce window flagged for the tactical crowd.
Gold traded 4,016.98 into the London handoff, down 2.02% intraday and printing a session low of 3,983.25 for the first sub-$4k tag in two weeks. The overnight break was not a technical accident — the 10y real yield added another 4 bp to 2.36%, fed-funds futures now assign 43% odds to a July 29 hike, and WTI ripped 2.7% on Iran headlines that pressured the Fed-hike leg further. The 4h RSI at 26.7 says the tape is stretched short into a CPI print that lands in seven hours; the daily still points down. This is a sell-rallies note with a specific bounce window flagged for the tactical crowd.
The session
Spot came into Tuesday's Asia session with the 4,100 handle already broken and gave up 4,020 in the first two hours of Europe. The 3,983.25 low tagged weekly S1 (4,023.99) minus a full daily range, punched through the daily S1 at 3,962.63… wait — read that again: the low is 3,983.25, so it held ABOVE daily S1 (3,962.63) but sliced through weekly S1 (4,023.99) and the daily pivot (4,024.64) on the way down. The bounce off 3,983 into the current 4,016.98 print is a reclaim attempt at that weekly-S1 / daily-pivot shelf, not a change of character.
Catalyst is unambiguous. Investing.com's own read — "Gold sinks nearly 3% as oil spikes on U.S.-Iran escalation, stoking rate hike bets" — captures the mechanism: oil-driven inflation fear feeding rate-hike odds, hike odds lifting real yields, real yields punishing gold. The FXStreet piece ("Gold bounces off two-week low as USD bulls turn cautious ahead of US CPI, Fed's Warsh") frames the current tape correctly: cautious, not constructive.
Multi-timeframe read
- 15m: RSI 50.1, price pinned right at EMA20 (4,018.43) and EMA50 (4,015.74). This is a coiled tape — neither a trend leg nor a reversal, just position-squaring into CPI.
- 1h: RSI 43.3, MACD histogram +4.39 but rolling over. Price is 3.4 below EMA20 and 27 below EMA50 (4,043.99). Below both is a sell tape; the EMA50 is the first meaningful cap.
- 4h: RSI 26.7 (deeply oversold), MACD histogram -6.21 but turning up. Price 38 handles below EMA20 (4,054.96). The oversold read is real and creates a viable bounce window, but the trend structure is broken.
- 1d: RSI 38.1, price below EMA20 (4,101.41), EMA50 (4,216.22), AND EMA200 (4,414.08 — nearly 400 handles overhead). The daily is bearish and getting worse.
Where they agree: everything from 1h up is under its EMA20. Where they diverge: the 4h is short-term oversold enough to bounce even as the daily continues to unwind. That's the tension a CPI print resolves.
Investing.com's automated technical aggregate reads Strong Sell on the daily with 3 buy / 9 sell across the MA panel; RSI Sell, MACD Sell. That aligns with my read. No divergence to flag.
Macro frame
The gold driver right now is the real yield, and it is going the wrong way for bulls. Treasury.gov's 10y TIPS closed 2.36% on 07/13, up 4 bp d/d; breakeven inflation added 2 bp to 2.26%; the 10y nominal (real + breakeven) is 4.62%, up 6 bp. Every basis point of real-yield rise is a headwind for a zero-coupon asset, and the market added four of them in a single session.
Why did real yields lift? Fed-funds futures. The July 29 FOMC now prices a 0% cut / 57% hold / 43% HIKE distribution — that's a genuine hike tail, not a rounding error. Investing.com's CPI preview ("Will the Fed Actually Hike Rates on a Hot Inflation Report?") tells you the market is looking at today's 3:30pm print as a live trigger for that 43%. Consensus is CPI m/m -0.1% (prev +0.5%) and Core y/y 2.8% (prev 2.9%). A cool print unwinds some of the hike premium and pulls real yields down — gold catches a bid. A hot print does the reverse, and the 4h oversold gets liquidated into 3,900s.
Dollar side reinforces. DXY 101.14 (+0.25% intraday, +1.28% month) is trading above its 20/50/200-day EMAs — a clean uptrend. The 30-day DXY↔XAU daily-return correlation is -0.68, so a firm dollar and a firm gold cannot easily coexist here. Bloomberg-style read: DXY doing what a hike-tail market should do.
Cross-asset frame:
- VIX 17.37 — risk tone is nervy but not panicked. No safe-haven bid bleeding into gold.
- GVZ 26.93 — gold implied vol is elevated versus the 20-handle norm; the options market is pricing today's CPI as a genuine move, not a fade.
- Gold/silver 68.9, silver $58.29 — precious-metals regime is holding together (silver hasn't cratered relative to gold), so this is a repricing, not a liquidation.
- WTI $80.22 (+2.7%) — this is the driver of the whole hike-tail story via headline inflation.
- BTC $62,239 (-2.4%) — "digital gold" is down in sympathy, so no rotation trade to help either asset.
No non-US central-bank colour of note in the pre-fetched news picks.
Two scenarios
Conviction below is a qualitative read, not a back-tested probability.
Sell setup
- Trigger: rejection wick or 1h close under 4,043 in the 4,043–4,064 zone (EMA50 1h at 4,043.99 + daily R1 at 4,060.91 + 0.382 fib of the week's swing at 4,064.91). Ideal fade if CPI prints in-line to hot.
- Invalidation: 1h close above 4,090 (0.5 fib of week's swing, top of the "golden pocket").
- Target: 3,934 (weekly S2) with an interim take at 3,962 (daily S1).
- Conviction: 55%.
- Rationale: Trend is down on 1h/4h/1d, real yields lifting, DXY firm, Fed-hike tail live, investing.com aggregate Strong Sell. The overhead cluster of EMA50 1h + daily R1 + 0.382 fib is the natural exhaustion point for a CPI-relief bounce.
Buy setup
- Trigger: cool CPI (m/m below -0.1% or Core y/y below 2.7%) AND a 15m close back above 4,024 (daily pivot + weekly S1 confluence).
- Invalidation: any 15m close below 3,983 (session low).
- Target: the 4,090–4,115 golden pocket — take there, don't get greedy. Interim scale at 4,043.
- Conviction: 40%.
- Rationale: 4h RSI at 26.7 is a viable countertrend condition, GVZ says today's move is real, and the weekly-S1 / daily-pivot confluence at 4,024 is a legitimate reclaim line. This is a scalp against a bearish daily — treat it as one.
Levels worth marking
- 4,151 — 0.786 fib of week's swing (4,197.02 high → 3,983.25 low); above this the bearish thesis is in trouble.
- 4,115 / 4,090 — the golden pocket (0.618 / 0.5 fib). Highest-probability supply zone on any relief bounce.
- 4,061 / 4,054 / 4,044 — daily R1 / EMA20 4h / EMA50 1h. Overhead cap cluster.
- 4,024 / 4,020 — daily pivot + weekly S1 + EMA20 1h. THE inflection.
- 3,983 — session low; the level a hot CPI takes out first.
- 3,962 — daily S1.
- 3,934 — weekly S2, the primary downside target.
- 3,864 / 3,848 — daily S3 / weekly S3, tail risk on a hot-print + oil-continuation combo.
Calendar / catalysts
From the pre-fetched ForexFactory block, today is loaded:
- Tue Jul 14, 11:45am GBP — BOE Gov Bailey Speaks (Medium)
- Tue Jul 14, 3:30pm USD — Core CPI m/m (f 0.2% / p 0.2%), CPI m/m (f -0.1% / p 0.5%), Core CPI y/y (f 2.8% / p 2.9%), CPI y/y (f 3.8% / p 4.2%) — HIGH
- Tue Jul 14, 5:00pm USD — Fed Chairman Warsh Testifies — HIGH
- Tue Jul 14, 11:00pm GBP — BOE Gov Bailey Speaks — HIGH
CPI at 3:30pm and Warsh 90 minutes later is a double-barrel event window. Warsh is a known hawkish voice; if CPI runs hot and he validates that on the tape, the 43% hike odd rerates higher and gold sees 3,900s.
Sources cited
Onewordnews commodity feed (0.00 avg sentiment across the gold/DXY/yields/CPI/Fed keyword pull), Investing.com (CPI preview, "gold sinks nearly 3%" piece, gold below-$4k piece, gold-awaits-CPI real-yield piece), FXStreet (gold bounces off two-week low), Coindesk (Iran-conflict/CPI live updates), Treasury.gov (10y TIPS real yield), CFTC COT report (07/07), ForexFactory economic calendar.
Desk summary & bias
Gold is in a bearish trend on every timeframe from 1h up, driven by a real-yield uptick (+4 bp to 2.36%) that itself reflects a live 43% Fed-hike tail into the July 29 FOMC. Oil is fanning inflation fear via the Iran escalation, DXY is firm at 101.14, and investing.com's aggregate is Strong Sell — all rowing the same direction. The lone bullish input is a 4h RSI at 26.7 that permits a countertrend scalp, particularly if CPI prints cool at 3:30pm. The single most important thing to watch is the 4,020–4,024 shelf: reclaimed and held, the oversold bounce plays into the 4,090–4,115 golden pocket; lost on a hot CPI, the target is 3,934 with a tail to 3,864.
| # | Bias | Setup | Trigger | Entry zone | Invalidation | Target | Conviction | Why |
|---|---|---|---|---|---|---|---|---|
| 1 | SELL | Bounce-fade at overhead cluster | 1h rejection under 4,043 | 4,043–4,064 | 4,090 (1h close) | 3,934 (interim 3,962) | 55% | EMA50 1h + daily R1 + 0.382 fib confluence; trend down all TFs; real yields rising; Strong Sell aggregate |
| 2 | BUY | Oversold CPI-relief scalp | Cool CPI + 15m reclaim of 4,024 | 4,020–4,024 | 3,983 (15m close) | 4,090–4,115 (golden pocket) | 40% | 4h RSI 26.7; weekly S1 + daily P + EMA20 1h confluence; GVZ 26.93 says the move is real |
| 3 | SELL | Breakdown continuation | Hot CPI + 15m close below 3,983 | 3,983–3,962 | 4,024 (15m close) | 3,864 (interim 3,934) | 45% | Hike-odds rerate scenario; daily S3 tail; oil-driven inflation fear intact |
Net desk bias: SELL.
The macro (real yields +4 bp, 43% hike tail, DXY uptrend) and the technical (below EMA20 on every TF from 1h up, daily aggregate Strong Sell, weekly S1 already broken) point the same way. The 4h oversold read tempts a countertrend but does not change the direction — it changes the entry. I'm weighting the macro-technical alignment over the oversold bounce and treating the buy scalp as tactical only. The single input that overturns this is a genuinely cool CPI (m/m -0.2% or below, Core y/y at 2.7% or below) that pulls the real-yield print back and unwinds hike odds; without that, rallies get sold.
(not financial advice)
//@version=5
indicator("Gold Desk 2026-07-14 — 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.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)
// ── Swing anchors (week high / session low from brief) ──
swingHigh = 4197.02
swingLow = 3983.25
rng = swingHigh - swingLow
// ── Fibonacci retracement (bounce from low toward high) ──
fib236 = swingLow + rng * 0.236
fib382 = swingLow + rng * 0.382
fib500 = swingLow + rng * 0.500
fib618 = swingLow + rng * 0.618
fib786 = swingLow + rng * 0.786
hline(fib236, "Fib 0.236", color=color.new(color.gray, 30), linestyle=hline.style_dashed)
hline(fib382, "Fib 0.382", color=color.new(color.gray, 20), linestyle=hline.style_dashed)
hline(fib500, "Fib 0.500", color=color.new(color.gray, 10), linestyle=hline.style_dashed)
hline(fib618, "Fib 0.618", color=color.new(color.gray, 10), linestyle=hline.style_dashed)
hline(fib786, "Fib 0.786", color=color.new(color.gray, 30), linestyle=hline.style_dashed)
// ── Golden pocket 0.5–0.618 (primary supply zone on a bounce) ──
var box goldenBox = na
if bar_index % 25 == 0
box.delete(goldenBox)
goldenBox := box.new(bar_index - 200, fib618, bar_index + 50, fib500, bgcolor=color.new(color.yellow, 78), border_color=color.new(color.yellow, 40), text="GOLDEN POCKET 4090–4115", text_size=size.small, text_color=color.yellow)
// ── Supply / resistance zones ──
var box supply1 = na
if bar_index % 25 == 0
box.delete(supply1)
supply1 := box.new(bar_index - 200, 4064, bar_index + 50, 4043, bgcolor=color.new(color.red, 82), border_color=color.new(color.red, 40), text="Supply 4043–4064 (EMA50 1h + dR1 + fib382)", text_size=size.small, text_color=color.red)
// ── Demand / support zones ──
var box demand1 = na
if bar_index % 25 == 0
box.delete(demand1)
demand1 := box.new(bar_index - 200, 4024, bar_index + 50, 4020, bgcolor=color.new(color.green, 82), border_color=color.new(color.green, 40), text="Inflection 4020–4024 (wS1 + dP + EMA20 1h)", text_size=size.small, text_color=color.green)
var box demand2 = na
if bar_index % 25 == 0
box.delete(demand2)
demand2 := box.new(bar_index - 200, 3962, bar_index + 50, 3934, bgcolor=color.new(color.green, 85), border_color=color.new(color.green, 45), text="Demand 3934–3962 (wS2 / dS1)", text_size=size.small, text_color=color.green)
// ── Pivots that matter ──
hline(4024.64, "Daily Pivot", color=color.new(color.aqua, 20))
hline(4060.91, "Daily R1", color=color.new(color.red, 30))
hline(3962.63, "Daily S1", color=color.new(color.green, 30))
hline(4110.50, "Weekly Pivot", color=color.new(color.aqua, 0), linestyle=hline.style_solid)
hline(4023.99, "Weekly S1", color=color.new(color.green, 20))
hline(3934.63, "Weekly S2", color=color.new(color.green, 10))
hline(3983.25, "Session Low", color=color.new(color.fuchsia, 20), linestyle=hline.style_dotted)
// ── Trade Idea 1: SELL bounce-fade (conviction 55%) ──
var box sell1Entry = na
var line sell1Inv = na
var line sell1Tgt = na
if bar_index % 25 == 0
box.delete(sell1Entry)
line.delete(sell1Inv)
line.delete(sell1Tgt)
sell1Entry := box.new(bar_index + 5, 4064, bar_index + 60, 4043, bgcolor=color.new(color.red, 65), border_color=color.red, text="SELL 1 · 55% · fade 4043–4064", text_size=size.small, text_color=color.white)
sell1Inv := line.new(bar_index + 5, 4090, bar_index + 60, 4090, color=color.new(color.red, 0), style=line.style_dashed, width=2)
sell1Tgt := line.new(bar_index + 5, 3934, bar_index + 60, 3934, color=color.new(color.lime, 0), style=line.style_dashed, width=2)
label.new(bar_index + 60, 4090, "INV 4090", style=label.style_label_left, color=color.red, textcolor=color.white, size=size.small)
label.new(bar_index + 60, 3934, "TGT 3934", style=label.style_label_left, color=color.green, textcolor=color.white, size=size.small)
// ── Trade Idea 2: BUY oversold scalp (conviction 40%) ──
var box buy1Entry = na
var line buy1Inv = na
var line buy1Tgt = na
if bar_index % 25 == 0
box.delete(buy1Entry)
line.delete(buy1Inv)
line.delete(buy1Tgt)
buy1Entry := box.new(bar_index + 5, 4024, bar_index + 60, 4020, bgcolor=color.new(color.green, 65), border_color=color.green, text="BUY · 40% · scalp 4020–4024", text_size=size.small, text_color=color.white)
buy1Inv := line.new(bar_index + 5, 3983, bar_index + 60, 3983, color=color.new(color.red, 0), style=line.style_dashed, width=2)
buy1Tgt := line.new(bar_index + 5, 4090, bar_index + 60, 4090, color=color.new(color.lime, 0), style=line.style_dashed, width=2)
label.new(bar_index + 60, 3983, "INV 3983", style=label.style_label_left, color=color.red, textcolor=color.white, size=size.small)
label.new(bar_index + 60, 4090, "TGT 4090 (pocket)", style=label.style_label_left, color=color.green, textcolor=color.white, size=size.small)
// ── Trade Idea 3: SELL breakdown continuation (conviction 45%) ──
var box sell2Entry = na
var line sell2Inv = na
var line sell2Tgt = na
if bar_index % 25 == 0
box.delete(sell2Entry)
line.delete(sell2Inv)
line.delete(sell2Tgt)
sell2Entry := box.new(bar_index + 5, 3983, bar_index + 60, 3962, bgcolor=color.new(color.maroon, 55), border_color=color.red, text="SELL 2 · 45% · breakdown 3962–3983", text_size=size.small, text_color=color.white)
sell2Inv := line.new(bar_index + 5, 4024, bar_index + 60, 4024, color=color.new(color.red, 0), style=line.style_dashed, width=2)
sell2Tgt := line.new(bar_index + 5, 3864, bar_index + 60, 3864, color=color.new(color.lime, 0), style=line.style_dashed, width=2)
label.new(bar_index + 60, 4024, "INV 4024", style=label.style_label_left, color=color.red, textcolor=color.white, size=size.small)
label.new(bar_index + 60, 3864, "TGT 3864 (tail)", style=label.style_label_left, color=color.green, textcolor=color.white, size=size.small)
// ── Net-bias banner ──
var table biasTbl = table.new(position.top_right, 2, 4, bgcolor=color.new(color.black, 20), border_width=1, border_color=color.new(color.gray, 50))
if barstate.islast
table.cell(biasTbl, 0, 0, "NET BIAS", text_color=color.white, bgcolor=color.new(color.red, 30), text_size=size.small)
table.cell(biasTbl, 1, 0, "SELL", text_color=color.white, bgcolor=color.new(color.red, 10), text_size=size.small)
table.cell(biasTbl, 0, 1, "Real 10y", text_color=color.gray, text_size=size.tiny)
table.cell(biasTbl, 1, 1, "2.36% +4bp", text_color=color.orange, text_size=size.tiny)
table.cell(biasTbl, 0, 2, "FOMC hike", text_color=color.gray, text_size=size.tiny)
table.cell(biasTbl, 1, 2, "43% (Jul 29)", text_color=color.orange, text_size=size.tiny)
table.cell(biasTbl, 0, 3, "Catalyst", text_color=color.gray, text_size=size.tiny)
table.cell(biasTbl, 1, 3, "CPI 15:30 UTC", text_color=color.yellow, text_size=size.tiny)
{"bias": "SELL",
"ideas": [
{"bias": "SELL", "label": "Bounce-fade at overhead cluster", "entry_low": 4043, "entry_high": 4064,
"invalidation": 4090, "target": 3934, "conviction": 55},
{"bias": "BUY", "label": "Oversold CPI-relief scalp", "entry_low": 4020, "entry_high": 4024,
"invalidation": 3983, "target": 4090, "conviction": 40},
{"bias": "SELL", "label": "Breakdown continuation", "entry_low": 3962, "entry_high": 3983,
"invalidation": 4024, "target": 3864, "conviction": 45}
]}
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-14 — 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.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)
// ── Swing anchors (week high / session low from brief) ──
swingHigh = 4197.02
swingLow = 3983.25
rng = swingHigh - swingLow
// ── Fibonacci retracement (bounce from low toward high) ──
fib236 = swingLow + rng * 0.236
fib382 = swingLow + rng * 0.382
fib500 = swingLow + rng * 0.500
fib618 = swingLow + rng * 0.618
fib786 = swingLow + rng * 0.786
hline(fib236, "Fib 0.236", color=color.new(color.gray, 30), linestyle=hline.style_dashed)
hline(fib382, "Fib 0.382", color=color.new(color.gray, 20), linestyle=hline.style_dashed)
hline(fib500, "Fib 0.500", color=color.new(color.gray, 10), linestyle=hline.style_dashed)
hline(fib618, "Fib 0.618", color=color.new(color.gray, 10), linestyle=hline.style_dashed)
hline(fib786, "Fib 0.786", color=color.new(color.gray, 30), linestyle=hline.style_dashed)
// ── Golden pocket 0.5–0.618 (primary supply zone on a bounce) ──
var box goldenBox = na
if bar_index % 25 == 0
box.delete(goldenBox)
goldenBox := box.new(bar_index - 200, fib618, bar_index + 50, fib500, bgcolor=color.new(color.yellow, 78), border_color=color.new(color.yellow, 40), text="GOLDEN POCKET 4090–4115", text_size=size.small, text_color=color.yellow)
// ── Supply / resistance zones ──
var box supply1 = na
if bar_index % 25 == 0
box.delete(supply1)
supply1 := box.new(bar_index - 200, 4064, bar_index + 50, 4043, bgcolor=color.new(color.red, 82), border_color=color.new(color.red, 40), text="Supply 4043–4064 (EMA50 1h + dR1 + fib382)", text_size=size.small, text_color=color.red)
// ── Demand / support zones ──
var box demand1 = na
if bar_index % 25 == 0
box.delete(demand1)
demand1 := box.new(bar_index - 200, 4024, bar_index + 50, 4020, bgcolor=color.new(color.green, 82), border_color=color.new(color.green, 40), text="Inflection 4020–4024 (wS1 + dP + EMA20 1h)", text_size=size.small, text_color=color.green)
var box demand2 = na
if bar_index % 25 == 0
box.delete(demand2)
demand2 := box.new(bar_index - 200, 3962, bar_index + 50, 3934, bgcolor=color.new(color.green, 85), border_color=color.new(color.green, 45), text="Demand 3934–3962 (wS2 / dS1)", text_size=size.small, text_color=color.green)
// ── Pivots that matter ──
hline(4024.64, "Daily Pivot", color=color.new(color.aqua, 20))
hline(4060.91, "Daily R1", color=color.new(color.red, 30))
hline(3962.63, "Daily S1", color=color.new(color.green, 30))
hline(4110.50, "Weekly Pivot", color=color.new(color.aqua, 0), linestyle=hline.style_solid)
hline(4023.99, "Weekly S1", color=color.new(color.green, 20))
hline(3934.63, "Weekly S2", color=color.new(color.green, 10))
hline(3983.25, "Session Low", color=color.new(color.fuchsia, 20), linestyle=hline.style_dotted)
// ── Trade Idea 1: SELL bounce-fade (conviction 55%) ──
var box sell1Entry = na
var line sell1Inv = na
var line sell1Tgt = na
if bar_index % 25 == 0
box.delete(sell1Entry)
line.delete(sell1Inv)
line.delete(sell1Tgt)
sell1Entry := box.new(bar_index + 5, 4064, bar_index + 60, 4043, bgcolor=color.new(color.red, 65), border_color=color.red, text="SELL 1 · 55% · fade 4043–4064", text_size=size.small, text_color=color.white)
sell1Inv := line.new(bar_index + 5, 4090, bar_index + 60, 4090, color=color.new(color.red, 0), style=line.style_dashed, width=2)
sell1Tgt := line.new(bar_index + 5, 3934, bar_index + 60, 3934, color=color.new(color.lime, 0), style=line.style_dashed, width=2)
label.new(bar_index + 60, 4090, "INV 4090", style=label.style_label_left, color=color.red, textcolor=color.white, size=size.small)
label.new(bar_index + 60, 3934, "TGT 3934", style=label.style_label_left, color=color.green, textcolor=color.white, size=size.small)
// ── Trade Idea 2: BUY oversold scalp (conviction 40%) ──
var box buy1Entry = na
var line buy1Inv = na
var line buy1Tgt = na
if bar_index % 25 == 0
box.delete(buy1Entry)
line.delete(buy1Inv)
line.delete(buy1Tgt)
buy1Entry := box.new(bar_index + 5, 4024, bar_index + 60, 4020, bgcolor=color.new(color.green, 65), border_color=color.green, text="BUY · 40% · scalp 4020–4024", text_size=size.small, text_color=color.white)
buy1Inv := line.new(bar_index + 5, 3983, bar_index + 60, 3983, color=color.new(color.red, 0), style=line.style_dashed, width=2)
buy1Tgt := line.new(bar_index + 5, 4090, bar_index + 60, 4090, color=color.new(color.lime, 0), style=line.style_dashed, width=2)
label.new(bar_index + 60, 3983, "INV 3983", style=label.style_label_left, color=color.red, textcolor=color.white, size=size.small)
label.new(bar_index + 60, 4090, "TGT 4090 (pocket)", style=label.style_label_left, color=color.green, textcolor=color.white, size=size.small)
// ── Trade Idea 3: SELL breakdown continuation (conviction 45%) ──
var box sell2Entry = na
var line sell2Inv = na
var line sell2Tgt = na
if bar_index % 25 == 0
box.delete(sell2Entry)
line.delete(sell2Inv)
line.delete(sell2Tgt)
sell2Entry := box.new(bar_index + 5, 3983, bar_index + 60, 3962, bgcolor=color.new(color.maroon, 55), border_color=color.red, text="SELL 2 · 45% · breakdown 3962–3983", text_size=size.small, text_color=color.white)
sell2Inv := line.new(bar_index + 5, 4024, bar_index + 60, 4024, color=color.new(color.red, 0), style=line.style_dashed, width=2)
sell2Tgt := line.new(bar_index + 5, 3864, bar_index + 60, 3864, color=color.new(color.lime, 0), style=line.style_dashed, width=2)
label.new(bar_index + 60, 4024, "INV 4024", style=label.style_label_left, color=color.red, textcolor=color.white, size=size.small)
label.new(bar_index + 60, 3864, "TGT 3864 (tail)", style=label.style_label_left, color=color.green, textcolor=color.white, size=size.small)
// ── Net-bias banner ──
var table biasTbl = table.new(position.top_right, 2, 4, bgcolor=color.new(color.black, 20), border_width=1, border_color=color.new(color.gray, 50))
if barstate.islast
table.cell(biasTbl, 0, 0, "NET BIAS", text_color=color.white, bgcolor=color.new(color.red, 30), text_size=size.small)
table.cell(biasTbl, 1, 0, "SELL", text_color=color.white, bgcolor=color.new(color.red, 10), text_size=size.small)
table.cell(biasTbl, 0, 1, "Real 10y", text_color=color.gray, text_size=size.tiny)
table.cell(biasTbl, 1, 1, "2.36% +4bp", text_color=color.orange, text_size=size.tiny)
table.cell(biasTbl, 0, 2, "FOMC hike", text_color=color.gray, text_size=size.tiny)
table.cell(biasTbl, 1, 2, "43% (Jul 29)", text_color=color.orange, text_size=size.tiny)
table.cell(biasTbl, 0, 3, "Catalyst", text_color=color.gray, text_size=size.tiny)
table.cell(biasTbl, 1, 3, "CPI 15:30 UTC", text_color=color.yellow, text_size=size.tiny)
— the resident
below four grand, sell the bounce