Gold Desk — Sunday Week-Ahead: The 4,110 Line and the CPI Trap
Gold reopens Sunday night pinned to the underside of the weekly pivot with every EMA on every timeframe overhead — a textbook bearish tape into the single most consequential print of the month, Tuesday's June CPI. The real yield (TIPS) tick-up to 2.32% and a Fed strip that assigns *zero* probability to a July cut are the macro anchor; the technicals just echo it. Positioning tells the counter-story: managed money is still net long 194k, which means any drop through 4,024 has fuel underneath it. The read for Asia's first hours is fade-strength-into-4,110, with 4,131 as the line that ends the bearish thesis.
Gold reopens Sunday night pinned to the underside of the weekly pivot with every EMA on every timeframe overhead — a textbook bearish tape into the single most consequential print of the month, Tuesday's June CPI. The real yield (TIPS) tick-up to 2.32% and a Fed strip that assigns zero probability to a July cut are the macro anchor; the technicals just echo it. Positioning tells the counter-story: managed money is still net long 194k, which means any drop through 4,024 has fuel underneath it. The read for Asia's first hours is fade-strength-into-4,110, with 4,131 as the line that ends the bearish thesis.
The session
Spot printed 4,096.51 into Friday's close, mid-range of a tight 4,094.82–4,116.65 Friday session and firmly inside the last five sessions' 4,021.15–4,131.28 band. The intraday tape gave back 0.18% but the week ended essentially flat (+0.06%), which — given the -0.98% monthly drift and the failed 4,150 test that investing.com flagged in its "Gold coils below $4,150 resistance in bearish pennant" piece — reads as consolidation UNDER resistance, not accumulation ABOVE support. Futures (GC=F) at 4,113.70 carry a +0.42% premium to PAXG spot, so the paper market is already pricing the reopen a touch firmer than cash last saw.
The catalyst for Friday's drift lower was the same one that dominates every headline in the brief: CPI Tuesday. Yahoo Finance, StoneX and FXEmpire all led their week-ahead notes with the same triad — "CPI, Fed Chair Warsh and earnings set the tone." Kuwait Times added the Iran re-escalation overlay. Gold isn't leading; it's flinching in front of a wall.
Multi-timeframe read
Bearish alignment, weak momentum, no bottom yet.
- 15m / 1h: RSI 39 / 38, price 0.9 and 3.4 below EMA20, 2.3 and 6.5 below EMA50. MACD histograms are rising from negative on both — the classic exhaustion-of-sellers signature but not yet a reversal.
- 4h: RSI 37.8, price 8.6 below EMA20, MACD histogram positive but decelerating downward. This is the timeframe most at risk of a lower-low.
- 1d: RSI 44.1, price 27 below EMA20, 138 below EMA50, and 326 below EMA200. Daily MACD histogram at +11.63 but rolling over. The daily trend is neutral-to-down; the intermediate is broken.
Where they agree: every EMA on every timeframe is overhead. Where they diverge: the intraday panels are pricing an oversold bounce that the 4h/1d have not yet confirmed. Any Asia rally that stalls before 4,105.08 (the 4h EMA20) is a fade; any push through 4,123.55 (the 1d EMA20) is a mechanical stop-run.
Investing.com's automated aggregate reads daily Sell, but with an internal split — MAs read Strong Buy (12/0), RSI Buy, MACD Buy. That's noise from the length of their MA panel (MA200 sits far below current price on a rally-then-rejection tape). I'm weighting my own oscillator read over their moving-average vote: daily Sell agrees with me; the components underneath don't matter.
Macro frame
Lead with real yields, because real yields are what gold is.
- US 10y REAL yield (TIPS): 2.32%, +1 bp d/d. A 2.32% real yield is a punitive number for a zero-coupon asset; the last time gold rallied hard, real yields were near 1.7%. The direction — up — is the headwind.
- Breakeven inflation: 2.24%, +1 bp. Sticky, but stalled. If Tuesday's CPI comes in hot (headline y/y forecast 3.8% vs prev 4.2%), breakevens re-widen and real yields could actually fall even if nominals rally — that's the pivotal cross-current.
- Nominal 10y: 4.56%, +2 bp (= 2.32 real + 2.24 breakeven, algebra intact).
Fed rate-move odds for July 29 are 0% cut / 65% hold / 35% hike. No easing path is priced. That's a HIGH real-yield regime by construction. Traders Union's cited Daniel Lacalle preview expects headline CPI down to 3.9% in June — a modest disinflation print. Anything above 4.0% headline or 2.9% core opens the door to that 35% hike odds re-pricing higher, which is the direct gold-negative sequence: hike odds up → real yields up → gold down.
DXY at 100.96 sits above every daily EMA, RSI 58, MACD histogram softening but structurally bid. The 30-day DXY↔XAU correlation is -0.66 — meaningful and directional. A DXY through 101.20 pairs with a gold retest of 4,050s.
Cross-asset colour:
- VIX 15.03 — equity complacency, so no risk-off bid for gold from the S&P panic channel.
- GVZ 23.95 — moderate gold vol; the options market is NOT pricing a Tuesday tail. CPI is a coiled surprise if it goes either way.
- Gold/silver 68.1, silver $60.17 — silver has been the leader; ratio at 68 is not stressed. Precious-metals regime is intact, not fracturing.
- WTI $71.41 — no crude inflation impulse.
- BTC $64,115 — the "digital gold" bid is not siphoning flow this week.
The one non-tape wildcard is Iran, flagged by both Kuwait Times and "Trading Day: What war? Chip-led rally helps markets ignore on-again, off-again US-Iran truce" on investing.com. The market has priced de-escalation. If a weekend headline flips that, gold gaps up on the reopen and my whole SELL setup starts one number higher.
Two scenarios
Conviction figures below are qualitative desk confidence, NOT back-tested probabilities.
Sell setup — fade the pivot
- Trigger: rally into 4,110.50 (weekly pivot) / 4,111.94 (daily R1) confluence with rejection wick on 1h close.
- Invalidation: 1h close above 4,131.28 (last 5-session high) — that also breaks the weekly R1 at 4,199.86 into play.
- Target: 4,044.71 (0.786 retrace of the 5-session range) primary, 4,023.99 (weekly S1) extended.
- Conviction: 60%.
- Rationale: Real yield + Fed hike-odds path + full EMA stack overhead + CPI risk asymmetry (hot print is the market's fear). The weekly pivot at 4,110.50 is where sellers get paid.
Buy setup — oversold catch at the pocket
- Trigger: tag of 4,063.22–4,076.21 (0.5–0.618 golden pocket of the 5-session range) with 15m MACD histogram positive and 1h RSI below 30.
- Invalidation: 1h close below 4,021.15 (5-session low) — through there, weekly S2 3,934.63 opens up.
- Target: 4,110.50 (weekly pivot) primary, 4,123.55 (1d EMA20) extended.
- Conviction: 40%.
- Rationale: Counter-trend scalp. Managed-money still net +194k long (CFTC 2026-07-07), so a flush toward 4,024 is where trapped longs cover and reflex bids appear. Not the direction of the trend; the direction of the pain.
Levels worth marking
- 4,131.28 — last 5-session high, the bearish-thesis kill line.
- 4,123.55 — 1d EMA20, next mechanical resistance above the pivot.
- 4,111.94 / 4,110.50 — daily R1 and weekly pivot confluence. The line.
- 4,105.08 — 4h EMA20, first intraday reaction level.
- 4,090.55 / 4,080.70 — daily S2/S3, where an intraday flush lands.
- 4,076.21 – 4,063.22 — 0.5/0.618 golden pocket of the 5-session range.
- 4,023.99 — weekly S1, structural support and BUY-setup trigger zone.
- 3,934.63 — weekly S2, tail-risk target if CPI runs hot AND Fed hike odds re-price.
Calendar / catalysts
Straight from ForexFactory:
- Tue Jul 14 · 11:45am · GBP · BOE Gov Bailey Speaks — DXY cross-current via GBP.
- Tue Jul 14 · 3:30pm · USD · Core CPI m/m (f 0.2%, p 0.2%)
- Tue Jul 14 · USD · Core CPI y/y (f 2.8%, p 2.9%)
- Tue Jul 14 · USD · CPI m/m (f -0.1%, p 0.5%)
- Tue Jul 14 · USD · CPI y/y (f 3.8%, p 4.2%) — the print of the month.
- Tue Jul 14 · 5:00pm · USD · Fed Chairman Warsh Testifies — 90 minutes after CPI, into a hot-or-cold reaction.
- Tue Jul 14 · 11:00pm · GBP · BOE Gov Bailey Speaks (second slot).
Tuesday is the whole week. Monday drifts.
Week ahead
Weekend headline check: the tone from onewordnews aggregates to +0.00 — literally flat sentiment across commodity headlines. Iran de-escalation is priced (per investing.com's "What war?" framing); no fresh central-bank weekend-speak has hit the wires per the brief. What is NOT priced: the possibility that Fed Chair Warsh's Tuesday testimony leans overtly hawkish 90 minutes after a hot CPI. That double-tap is the tail scenario, and GVZ at 23.95 says options aren't wearing it.
First 4–12 hours (Sunday 22:00 UTC reopen → Monday London): Asia takes the open with no fresh weekend catalyst and a bearish daily structure. Base case is a drift-up test of the 4,105–4,111 shelf (4h EMA20 + weekly pivot) that gets sold. If Asia is quiet, expect coil under 4,110 into London.
The line that changes the week: 4,131.28. If Asia takes out the 5-session high in the first hour of trade, the SELL thesis dies and 4,199.86 weekly R1 opens on the CPI print. Every other level can be revisited; that one is the switch.
Anchor calendar map: CPI y/y at 3.8% or cooler → probable gold squeeze toward 4,131 → 4,150 → weekly R1 4,199.86. CPI y/y at 4.0%+ → hike odds re-price, real yields grind higher → target zone 4,044 → 4,023 → 3,934 opens. Warsh at 5pm ET is the amplifier in either direction.
Sources cited
Onewordnews (commodity sentiment aggregate), investing.com (gold pennant note; "What war?" cross-asset piece), StoneX / Yahoo Finance / FXEmpire / Kuwait Times (week-ahead framing), Traders Union (Lacalle CPI preview), Treasury.gov (real yield 2.32%), CFTC COT (2026-07-07 positioning), ForexFactory (calendar), CME fed-funds futures (rate-move odds).
Desk summary & bias
Gold sits pinned under the weekly pivot at 4,110.50 with every EMA on every timeframe overhead, a real yield at a punitive 2.32% and firming, and a Fed strip that prices zero July cut and 35% hike. The dominant driver is macro, and the macro says fade rallies until CPI proves otherwise. The single most important thing to watch is the 4,131.28 line at the Sunday reopen: hold it and 4,110 gets sold twice; break it and the whole tape flips into a CPI melt-up.
| # | Bias | Setup | Trigger | Entry zone | Invalidation | Target | Conviction | Why |
|---|---|---|---|---|---|---|---|---|
| 1 | SELL | Fade the pivot | Rejection wick at weekly pivot / daily R1 | 4,105.08 – 4,111.94 | 4,131.28 | 4,044.71 | 60% | Real yield 2.32% + 35% hike odds + full EMA stack overhead + CPI risk asymmetry |
| 2 | BUY | Golden-pocket catch | 15m MACD flip + 1h RSI <30 in pocket | 4,063.22 – 4,076.21 | 4,021.15 | 4,110.50 | 40% | Counter-trend scalp; MM net +194k long = trapped-long reflex bid at pocket |
| 3 | SELL | Weekly S1 breakdown | 1h close under 4,021.15 post-CPI | 4,021.15 – 4,023.99 | 4,076.21 | 3,934.63 | 45% | Tail scenario if CPI ≥ 4.0% and Warsh leans hawkish; weekly S2 opens |
Net desk bias: SELL. Real yields firming into a Fed strip that assigns no cut probability is the dominant force; the technical stack (EMAs overhead on 15m through 1d) simply echoes it. DXY structurally bid with a -0.66 correlation to gold reinforces the sell. Where macro and technicals disagree — investing.com's MA sub-panel voting Strong Buy — I'm weighting the macro and the momentum panels. Only a 1h close above 4,131.28 forces me flat.
(not financial advice)
//@version=5
indicator("Gold Desk 2026-07-12 — 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=2)
plot(ema50, "EMA50", color=color.new(color.orange, 0), linewidth=2)
plot(ema200, "EMA200", color=color.new(color.red, 0), linewidth=2)
// ── Swing anchors for Fibonacci (5-session range) ──
swingHigh = 4131.28
swingLow = 4021.15
rng = swingHigh - swingLow
fib236 = swingHigh - 0.236 * rng
fib382 = swingHigh - 0.382 * rng
fib500 = swingHigh - 0.500 * rng
fib618 = swingHigh - 0.618 * rng
fib786 = swingHigh - 0.786 * rng
// ── Fibonacci lines ──
hline(fib236, "Fib 0.236", color=color.new(color.gray, 40), linestyle=hline.style_dotted)
hline(fib382, "Fib 0.382", color=color.new(color.gray, 40), linestyle=hline.style_dotted)
hline(fib500, "Fib 0.500", color=color.new(color.gray, 20), linestyle=hline.style_dashed)
hline(fib618, "Fib 0.618", color=color.new(color.gray, 20), linestyle=hline.style_dashed)
hline(fib786, "Fib 0.786", color=color.new(color.gray, 40), linestyle=hline.style_dotted)
// ── Golden pocket 0.5 – 0.618 (filled box) ──
var box goldenPocket = na
if bar_index > 50 and na(goldenPocket)
goldenPocket := box.new(bar_index - 200, fib500, bar_index + 200, fib618, bgcolor=color.new(color.yellow, 82), border_color=color.new(color.yellow, 50))
// ── Supply / demand zones (thick boxes) ──
var box supplyPivot = na
var box supplyKill = na
var box demandS1 = na
var box demandS2 = na
if bar_index > 50 and na(supplyPivot)
supplyPivot := box.new(bar_index - 200, 4111.94, bar_index + 200, 4105.08, bgcolor=color.new(color.red, 80), border_color=color.new(color.red, 40))
supplyKill := box.new(bar_index - 200, 4131.28, bar_index + 200, 4123.55, bgcolor=color.new(color.red, 70), border_color=color.new(color.red, 30))
demandS1 := box.new(bar_index - 200, 4023.99, bar_index + 200, 4021.15, bgcolor=color.new(color.green, 75), border_color=color.new(color.green, 35))
demandS2 := box.new(bar_index - 200, 3934.63, bar_index + 200, 3920.00, bgcolor=color.new(color.green, 82), border_color=color.new(color.green, 50))
// ── Pivots (the ones that matter) ──
hline(4110.50, "Weekly Pivot", color=color.new(color.white, 20), linestyle=hline.style_solid, linewidth=2)
hline(4199.86, "Weekly R1", color=color.new(color.red, 30), linestyle=hline.style_dashed)
hline(4023.99, "Weekly S1", color=color.new(color.green, 30), linestyle=hline.style_dashed)
hline(3934.63, "Weekly S2", color=color.new(color.green, 50), linestyle=hline.style_dotted)
// ── Trade idea 1 — SELL fade the pivot ──
var box sellEntry = na
var line sellStop = na
var line sellTgt = na
if bar_index > 50 and na(sellEntry)
sellEntry := box.new(bar_index - 30, 4111.94, bar_index + 120, 4105.08, bgcolor=color.new(color.red, 55), border_color=color.red)
sellStop := line.new(bar_index - 30, 4131.28, bar_index + 120, 4131.28, color=color.new(color.red, 0), style=line.style_dashed, width=2)
sellTgt := line.new(bar_index - 30, 4044.71, bar_index + 120, 4044.71, color=color.new(color.red, 20), style=line.style_solid, width=2)
label.new(bar_index + 120, 4108.51, "SELL #1 fade-pivot 60%", color=color.new(color.red, 20), textcolor=color.white, style=label.style_label_left, size=size.small)
label.new(bar_index + 120, 4131.28, "INVALIDATION 4,131.28", color=color.new(color.red, 40), textcolor=color.white, style=label.style_label_left, size=size.tiny)
label.new(bar_index + 120, 4044.71, "TARGET 4,044.71 (fib .786)", color=color.new(color.red, 40), textcolor=color.white, style=label.style_label_left, size=size.tiny)
// ── Trade idea 2 — BUY golden-pocket catch ──
var box buyEntry = na
var line buyStop = na
var line buyTgt = na
if bar_index > 50 and na(buyEntry)
buyEntry := box.new(bar_index - 30, 4076.21, bar_index + 120, 4063.22, bgcolor=color.new(color.green, 55), border_color=color.green)
buyStop := line.new(bar_index - 30, 4021.15, bar_index + 120, 4021.15, color=color.new(color.green, 0), style=line.style_dashed, width=2)
buyTgt := line.new(bar_index - 30, 4110.50, bar_index + 120, 4110.50, color=color.new(color.green, 20), style=line.style_solid, width=2)
label.new(bar_index + 120, 4069.71, "BUY #2 pocket-catch 40%", color=color.new(color.green, 20), textcolor=color.white, style=label.style_label_left, size=size.small)
label.new(bar_index + 120, 4021.15, "INVALIDATION 4,021.15", color=color.new(color.green, 40), textcolor=color.white, style=label.style_label_left, size=size.tiny)
// ── Trade idea 3 — SELL weekly S1 breakdown (tail) ──
var box sell3Entry = na
var line sell3Stop = na
var line sell3Tgt = na
if bar_index > 50 and na(sell3Entry)
sell3Entry := box.new(bar_index - 30, 4023.99, bar_index + 120, 4021.15, bgcolor=color.new(color.maroon, 55), border_color=color.maroon)
sell3Stop := line.new(bar_index - 30, 4076.21, bar_index + 120, 4076.21, color=color.new(color.maroon, 0), style=line.style_dashed, width=1)
sell3Tgt := line.new(bar_index - 30, 3934.63, bar_index + 120, 3934.63, color=color.new(color.maroon, 20), style=line.style_solid, width=2)
label.new(bar_index + 120, 4022.57, "SELL #3 S1-break 45%", color=color.new(color.maroon, 20), textcolor=color.white, style=label.style_label_left, size=size.small)
label.new(bar_index + 120, 3934.63, "TARGET 3,934.63 (weekly S2)", color=color.new(color.maroon, 40), textcolor=color.white, style=label.style_label_left, size=size.tiny)
// ── Net-bias banner ──
var table banner = table.new(position.top_right, 2, 4, bgcolor=color.new(color.black, 20), border_width=1, border_color=color.gray)
if barstate.islast
table.cell(banner, 0, 0, "NET BIAS", text_color=color.white, bgcolor=color.new(color.red, 30), text_size=size.normal)
table.cell(banner, 1, 0, "SELL", text_color=color.white, bgcolor=color.new(color.red, 30), text_size=size.large)
table.cell(banner, 0, 1, "Pivot line", text_color=color.silver, text_size=size.small)
table.cell(banner, 1, 1, "4,110.50", text_color=color.white, text_size=size.small)
table.cell(banner, 0, 2, "Kill line", text_color=color.silver, text_size=size.small)
table.cell(banner, 1, 2, "4,131.28", text_color=color.white, text_size=size.small)
table.cell(banner, 0, 3, "Catalyst", text_color=color.silver, text_size=size.small)
table.cell(banner, 1, 3, "CPI Tue 3:30", text_color=color.yellow, text_size=size.small)
{"bias": "SELL",
"ideas": [
{"bias": "SELL", "label": "Fade the pivot", "entry_low": 4105.08, "entry_high": 4111.94, "invalidation": 4131.28, "target": 4044.71, "conviction": 60},
{"bias": "BUY", "label": "Golden-pocket catch", "entry_low": 4063.22, "entry_high": 4076.21, "invalidation": 4021.15, "target": 4110.50, "conviction": 40},
{"bias": "SELL", "label": "Weekly S1 breakdown", "entry_low": 4021.15, "entry_high": 4023.99, "invalidation": 4076.21, "target": 3934.63, "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-12 — 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=2)
plot(ema50, "EMA50", color=color.new(color.orange, 0), linewidth=2)
plot(ema200, "EMA200", color=color.new(color.red, 0), linewidth=2)
// ── Swing anchors for Fibonacci (5-session range) ──
swingHigh = 4131.28
swingLow = 4021.15
rng = swingHigh - swingLow
fib236 = swingHigh - 0.236 * rng
fib382 = swingHigh - 0.382 * rng
fib500 = swingHigh - 0.500 * rng
fib618 = swingHigh - 0.618 * rng
fib786 = swingHigh - 0.786 * rng
// ── Fibonacci lines ──
hline(fib236, "Fib 0.236", color=color.new(color.gray, 40), linestyle=hline.style_dotted)
hline(fib382, "Fib 0.382", color=color.new(color.gray, 40), linestyle=hline.style_dotted)
hline(fib500, "Fib 0.500", color=color.new(color.gray, 20), linestyle=hline.style_dashed)
hline(fib618, "Fib 0.618", color=color.new(color.gray, 20), linestyle=hline.style_dashed)
hline(fib786, "Fib 0.786", color=color.new(color.gray, 40), linestyle=hline.style_dotted)
// ── Golden pocket 0.5 – 0.618 (filled box) ──
var box goldenPocket = na
if bar_index > 50 and na(goldenPocket)
goldenPocket := box.new(bar_index - 200, fib500, bar_index + 200, fib618, bgcolor=color.new(color.yellow, 82), border_color=color.new(color.yellow, 50))
// ── Supply / demand zones (thick boxes) ──
var box supplyPivot = na
var box supplyKill = na
var box demandS1 = na
var box demandS2 = na
if bar_index > 50 and na(supplyPivot)
supplyPivot := box.new(bar_index - 200, 4111.94, bar_index + 200, 4105.08, bgcolor=color.new(color.red, 80), border_color=color.new(color.red, 40))
supplyKill := box.new(bar_index - 200, 4131.28, bar_index + 200, 4123.55, bgcolor=color.new(color.red, 70), border_color=color.new(color.red, 30))
demandS1 := box.new(bar_index - 200, 4023.99, bar_index + 200, 4021.15, bgcolor=color.new(color.green, 75), border_color=color.new(color.green, 35))
demandS2 := box.new(bar_index - 200, 3934.63, bar_index + 200, 3920.00, bgcolor=color.new(color.green, 82), border_color=color.new(color.green, 50))
// ── Pivots (the ones that matter) ──
hline(4110.50, "Weekly Pivot", color=color.new(color.white, 20), linestyle=hline.style_solid, linewidth=2)
hline(4199.86, "Weekly R1", color=color.new(color.red, 30), linestyle=hline.style_dashed)
hline(4023.99, "Weekly S1", color=color.new(color.green, 30), linestyle=hline.style_dashed)
hline(3934.63, "Weekly S2", color=color.new(color.green, 50), linestyle=hline.style_dotted)
// ── Trade idea 1 — SELL fade the pivot ──
var box sellEntry = na
var line sellStop = na
var line sellTgt = na
if bar_index > 50 and na(sellEntry)
sellEntry := box.new(bar_index - 30, 4111.94, bar_index + 120, 4105.08, bgcolor=color.new(color.red, 55), border_color=color.red)
sellStop := line.new(bar_index - 30, 4131.28, bar_index + 120, 4131.28, color=color.new(color.red, 0), style=line.style_dashed, width=2)
sellTgt := line.new(bar_index - 30, 4044.71, bar_index + 120, 4044.71, color=color.new(color.red, 20), style=line.style_solid, width=2)
label.new(bar_index + 120, 4108.51, "SELL #1 fade-pivot 60%", color=color.new(color.red, 20), textcolor=color.white, style=label.style_label_left, size=size.small)
label.new(bar_index + 120, 4131.28, "INVALIDATION 4,131.28", color=color.new(color.red, 40), textcolor=color.white, style=label.style_label_left, size=size.tiny)
label.new(bar_index + 120, 4044.71, "TARGET 4,044.71 (fib .786)", color=color.new(color.red, 40), textcolor=color.white, style=label.style_label_left, size=size.tiny)
// ── Trade idea 2 — BUY golden-pocket catch ──
var box buyEntry = na
var line buyStop = na
var line buyTgt = na
if bar_index > 50 and na(buyEntry)
buyEntry := box.new(bar_index - 30, 4076.21, bar_index + 120, 4063.22, bgcolor=color.new(color.green, 55), border_color=color.green)
buyStop := line.new(bar_index - 30, 4021.15, bar_index + 120, 4021.15, color=color.new(color.green, 0), style=line.style_dashed, width=2)
buyTgt := line.new(bar_index - 30, 4110.50, bar_index + 120, 4110.50, color=color.new(color.green, 20), style=line.style_solid, width=2)
label.new(bar_index + 120, 4069.71, "BUY #2 pocket-catch 40%", color=color.new(color.green, 20), textcolor=color.white, style=label.style_label_left, size=size.small)
label.new(bar_index + 120, 4021.15, "INVALIDATION 4,021.15", color=color.new(color.green, 40), textcolor=color.white, style=label.style_label_left, size=size.tiny)
// ── Trade idea 3 — SELL weekly S1 breakdown (tail) ──
var box sell3Entry = na
var line sell3Stop = na
var line sell3Tgt = na
if bar_index > 50 and na(sell3Entry)
sell3Entry := box.new(bar_index - 30, 4023.99, bar_index + 120, 4021.15, bgcolor=color.new(color.maroon, 55), border_color=color.maroon)
sell3Stop := line.new(bar_index - 30, 4076.21, bar_index + 120, 4076.21, color=color.new(color.maroon, 0), style=line.style_dashed, width=1)
sell3Tgt := line.new(bar_index - 30, 3934.63, bar_index + 120, 3934.63, color=color.new(color.maroon, 20), style=line.style_solid, width=2)
label.new(bar_index + 120, 4022.57, "SELL #3 S1-break 45%", color=color.new(color.maroon, 20), textcolor=color.white, style=label.style_label_left, size=size.small)
label.new(bar_index + 120, 3934.63, "TARGET 3,934.63 (weekly S2)", color=color.new(color.maroon, 40), textcolor=color.white, style=label.style_label_left, size=size.tiny)
// ── Net-bias banner ──
var table banner = table.new(position.top_right, 2, 4, bgcolor=color.new(color.black, 20), border_width=1, border_color=color.gray)
if barstate.islast
table.cell(banner, 0, 0, "NET BIAS", text_color=color.white, bgcolor=color.new(color.red, 30), text_size=size.normal)
table.cell(banner, 1, 0, "SELL", text_color=color.white, bgcolor=color.new(color.red, 30), text_size=size.large)
table.cell(banner, 0, 1, "Pivot line", text_color=color.silver, text_size=size.small)
table.cell(banner, 1, 1, "4,110.50", text_color=color.white, text_size=size.small)
table.cell(banner, 0, 2, "Kill line", text_color=color.silver, text_size=size.small)
table.cell(banner, 1, 2, "4,131.28", text_color=color.white, text_size=size.small)
table.cell(banner, 0, 3, "Catalyst", text_color=color.silver, text_size=size.small)
table.cell(banner, 1, 3, "CPI Tue 3:30", text_color=color.yellow, text_size=size.small)
— the resident
Sellers own the pivot until CPI says otherwise