Gold digests after PPI pop — real yields drift, tape gets choppy
Gold has slipped back through $4,350 after tagging $4,442 into the CPI/PPI window, and the auction is now looking for who's still willing to pay above the daily pivot. The primary macro driver stays constructive — the 10y real yield fell another 3 bp to **2.39%**, DXY is pinned under 100, and post-PPI the Fed-funds strip carries a 67% hold into September. But the daily MACD histogram has rolled, 4h is below its EMA20, and investing.com's aggregate is at odds with its own component RSI/MACD reads. This is a market that wants higher on the macro but needs a shakeout on the tape.
Gold has slipped back through $4,350 after tagging $4,442 into the CPI/PPI window, and the auction is now looking for who's still willing to pay above the daily pivot. The primary macro driver stays constructive — the 10y real yield fell another 3 bp to 2.39%, DXY is pinned under 100, and post-PPI the Fed-funds strip carries a 67% hold into September. But the daily MACD histogram has rolled, 4h is below its EMA20, and investing.com's aggregate is at odds with its own component RSI/MACD reads. This is a market that wants higher on the macro but needs a shakeout on the tape.
The session
Spot PAXG prints 4,353.33, down 1.21% on the day and well off the session high at 4,442.95. Range for the last 24 hours is a wide $126, and price is now sitting between the daily pivot 4,381.64 and daily S1 4,320.33 — right in the middle of the session envelope, which is where the tape gets least directional. The move down was triggered by two things: profit-taking after the soft PPI print (PPI m/m 0.0% vs 0.2% forecast, Core PPI 0.2% vs 0.3%) that had propelled bullion to a fresh 2-month high, and a re-firming of the "hold path" through year-end. Investing.com puts it plainly in their headline scroll: "Gold slips below $4,350 as investors take profits, Iran tensions persist" — the fade is technical, not thematic.
The COMEX front-month is at 4,399.20, printing a 1.05% premium to spot — a mild contango that's normal for the front but not stressed.
Multi-timeframe read
- 15m: RSI 65.5, MACD hist rising, price sits +14.7 above EMA20 and +10.8 above EMA50. Short-term buyers are defending the 4,335–4,345 shelf. Constructive but stretched.
- 1h: RSI 48.1, price is at the 1h EMA20 (4,351.51) but -13.7 below the 1h EMA50 (4,366.99). This is a decision zone — the 1h EMA50 is the intraday battleground, and it's currently acting as a lid.
- 4h: RSI 49.1, price -14.8 below the 4h EMA20 (4,368.14). Bias on this timeframe has flipped to neutral-with-a-slight-bearish-tint after the reversal off 4,442.
- 1d: RSI 63.3, and the tape is a full +107.4 above the daily EMA20 (4,245.93) and +155.4 above the daily EMA50. The daily EMA200 sits at 4,345.54 — just below current price, and that is the critical daily line to watch. Daily MACD histogram is 20.20 but falling — momentum is fading, not breaking.
Where they agree: the medium-term trend is still up. Where they diverge: intraday momentum has rolled, so the daily trend is being pressure-tested from above. This is a classic "healthy pullback vs. distribution" tape — the difference will be decided at the daily EMA200 and the golden pocket.
Independent cross-check: investing.com's automated daily aggregate says Strong Buy, but their own component RSI reads Sell and their component MACD reads Sell. That's a moving-averages-driven aggregate riding the trend while the oscillators warn of exhaustion — same divergence I'm seeing.
Macro frame
Lead with the driver that matters: the US 10y real yield (TIPS) dropped 3 bp to 2.39%. That is the primary gold input, and every day it grinds lower is a mechanical tailwind. Breakevens dipped 2 bp to 2.24%, and the 10y nominal fell 5 bp to 4.63%. So we're getting real-yield relief with softening inflation expectations — a benign combination for bullion.
Why are real yields going the right way? Because the Fed-funds strip now prices the September FOMC at 0% cut / 67% hold / 33% hike, with a residual right-tail from the sticky sub-components. Post the soft CPI (3.4% y/y, down from 3.5%) and soft PPI, the market has taken the hike-path premium out and is starting to price a longer flat plateau. Any drift of that hike-tail toward zero is fuel for gold; any hawkish surprise (retail sales today, then Jackson Hole late-August colour) rebuilds it.
DXY at 99.76 is trading heavy — sub-100, 1h/4h below EMA20/EMA50, daily RSI 40.3. That's a friendly backdrop, though the 30-day XAU↔DXY correlation is only -0.30, so dollar weakness isn't doing the full lifting.
Cross-asset frame: VIX at 14.63 — no risk-off bid to lean on. GVZ at 23.87 — gold's own vol is elevated but not panicked; the options market is pricing normal-to-brisk two-way movement, not a directional break. Gold/silver ratio at 67.2 with silver at $64.81 — silver has been leading the precious complex, which historically confirms bull-regime durability. WTI at $82.71 and firm on Hormuz tension adds a small inflation-hedge bid. Bitcoin at $62,861 and soft — no competing "debasement-hedge" bid siphoning flow.
Two scenarios
(Note: conviction below is qualitative desk confidence, not a back-tested probability.)
Buy setup
- Trigger: Reclaim and 1h close above the daily pivot 4,381.64 with the 1h MACD histogram flipping positive, OR a clean sweep-and-hold of the session low 4,316.28 into the golden pocket 4,359–4,375.
- Invalidation: Daily close below the daily EMA200 at 4,345.54 and under weekly R1 at 4,464.60 context — practically, a 4h close below 4,283.83 (daily S2) kills the read.
- Target: First 4,418.14 (daily R1), stretch 4,442.95 (session high) and eventually a retest of the reported 4,509 double top flagged by investing.com.
- Conviction: 55%.
- Rationale: Macro alignment (real yields falling, DXY soft, Fed path stable-to-dovish) plus daily trend intact plus silver leadership. This is the higher-quality side of the ledger, but you have to wait for the tape to prove it — do not chase into the pivot.
Sell setup
- Trigger: Rejection at the daily pivot 4,381.64 or a failed backtest of daily R1 4,418.14 with 15m RSI rolling from >70.
- Invalidation: 1h close above 4,442.95 (session high, weekly R1 zone 4,464.60).
- Target: 4,320.33 (daily S1), stretch 4,283.83 (daily S2).
- Conviction: 45%.
- Rationale: Daily MACD is fading, 4h is below its EMA20, and there's an obvious supply shelf from 4,418 up into the 4,509 double top. This is a tactical fade, not a trend trade — take it off at S1 unless the daily EMA200 breaks.
Levels worth marking
- Supply above: 4,381.64 (daily P) · 4,418.14 (daily R1) · 4,442.95 (session/week high) · 4,464.60 (weekly R1) · 4,509 (reported double top per investing.com)
- Demand below: 4,359–4,375 (0.5–0.618 golden pocket of the 4,308→4,443 swing) · 4,345.54 (daily EMA200 — the critical daily line) · 4,320.33 (daily S1) · 4,283.83 (daily S2) · 4,242.80 (weekly pivot) · 4,222.52 (daily S3)
- Intraday EMAs of note: 1h EMA50 at 4,366.99 is the near-term ceiling; the 1h EMA20 at 4,351.51 is the pivot the tape is fighting for.
Calendar / catalysts
From the pre-fetched ForexFactory block:
- Fri Aug 14 · USD · Medium · Core Retail Sales m/m (forecast 0.2%, prev -0.2%) — today's live risk. A soft print extends the disinflation narrative and helps gold; a hot print rebuilds the hike-tail.
- Prior 48h that shaped the tape: Wed Aug 12 CPI came in on forecast (0.1% m/m, 3.4% y/y, softer than 3.5% prev) and Thu Aug 13 PPI printed cold (0.0% m/m vs 0.2%, Core 0.2% vs 0.3%). Unemployment claims ticked up to 209K vs 202K forecast — modest labour-market softening.
- Non-US colour: RBA held at 4.35% on Tue with press conference; UK GDP m/m beat at 0.3% vs 0.0%. Neither is a direct gold catalyst but both feed the "global growth without a policy shock" backdrop that's compatible with real-yield drift.
Sources cited
- Treasury.gov real yields (10y TIPS 2.39%, -3 bp d/d) — the macro anchor.
- CME Fed-funds futures / rate-move odds (Sep FOMC 0/67/33 cut/hold/hike).
- Investing.com — automated daily technical aggregate, plus their headline scroll ("Gold slips below $4,350 as investors take profits," "Gold double top at $4,509 with break brewing," "Gold takes a breather after soft PPI").
- ForexFactory — the calendar block (CPI, PPI, Retail Sales, RBA, UK GDP).
- CFTC COT — unavailable this run (data gap noted; no positioning colour).
- onewordnews aggregator (kitco / dailyfx excerpts — used for tone only, no tradeable specifics).
Desk summary & bias
Gold is doing exactly what a bull-regime tape should do after a two-month-high print into stretched daily momentum: it's giving back a chunk, testing the daily pivot from below, and letting the daily EMA200 come up to meet it. The macro is not fighting the bulls — the 10y real yield fell to 2.39%, DXY is under 100, silver is leading, and the Fed strip has zeroed the September cut but also drained hike urgency after two soft inflation prints. The single most important thing to watch next is the daily EMA200 at 4,345.54 into today's Core Retail Sales: a hold + reclaim of 4,381.64 confirms the pullback is buyable; a break with a hot retail print opens 4,283 and then the weekly pivot at 4,242.80.
| # | Bias | Setup | Trigger | Entry zone | Invalidation | Target | Conviction | Why |
|---|---|---|---|---|---|---|---|---|
| 1 | BUY | Dip-buy into daily EMA200 / golden pocket | 1h reclaim of daily pivot 4,381.64 OR sweep-and-hold of 4,316.28 | 4,320.33 – 4,359.51 | 4h close < 4,283.83 | 4,418.14 (stretch 4,442.95) | 55% | Real yields easing, DXY soft, daily trend intact, silver leading. Wait for the tape. |
| 2 | SELL | Bounce-fade into pivot / R1 supply | Rejection at 4,381.64 or failed retest of 4,418.14 with 15m RSI rollover | 4,381.64 – 4,418.14 | 1h close > 4,442.95 | 4,320.33 (stretch 4,283.83) | 45% | Daily MACD hist falling, 4h under EMA20, obvious supply shelf up to reported 4,509 double top. Tactical only. |
| 3 | BUY | Position add on weekly pivot flush | Wick into 4,242.80 with daily RSI holding > 55 | 4,242.80 – 4,283.83 | Daily close < 4,222.52 | 4,381.64 (stretch 4,464.60) | 50% | Weekly pivot is the swing-trader's line; a controlled flush there would be the cleanest add of the cycle. |
Net desk bias: BUY (on dips). The macro stack — falling real yield, sub-100 DXY, a Fed strip that just lost its hike urgency, and silver leadership — is unambiguously supportive, and the daily technical structure hasn't been broken (price still +155 above the daily EMA50). Near-term chop favours patience: I'm weighting the macro over the tactical MACD roll, but I'm not chasing into 4,381 pivot — the trade is to buy the golden pocket / daily EMA200 test, and to size up only on a wick into the weekly pivot at 4,242.80. If retail sales prints hot and DXY reclaims 100.20, the whole thesis pauses and the sell setup gets promoted.
(not financial advice)
//@version=5
indicator("Gold Desk 2026-08-14 — bias BUY", overlay=true, max_lines_count=300, max_labels_count=300, max_boxes_count=100)
// ── Inputs / palette ──────────────────────────────────────────────
cSupply = color.new(color.red, 72)
cDemand = color.new(color.green, 72)
cGolden = color.new(color.yellow, 65)
cBuy = color.new(color.lime, 60)
cSell = color.new(color.red, 60)
cPivot = color.new(color.gray, 0)
cText = color.white
// ── Trend anchors: EMAs 20 / 50 / 200 ─────────────────────────────
ema20 = ta.ema(close, 20)
ema50 = ta.ema(close, 50)
ema200 = ta.ema(close, 200)
plot(ema20, "EMA20", color=color.new(color.aqua, 0), linewidth=1)
plot(ema50, "EMA50", color=color.new(color.orange, 0), linewidth=1)
plot(ema200, "EMA200", color=color.new(color.fuchsia, 0), linewidth=2)
// ── Daily / weekly pivots ─────────────────────────────────────────
dP = 4381.64
dR1 = 4418.14
dR2 = 4479.45
dS1 = 4320.33
dS2 = 4283.83
dS3 = 4222.52
wP = 4242.80
wR1 = 4464.60
hline(dP, "Daily P", color=cPivot, linestyle=hline.style_solid)
hline(dR1, "Daily R1", color=color.new(color.red, 40), linestyle=hline.style_dashed)
hline(dS1, "Daily S1", color=color.new(color.green, 40), linestyle=hline.style_dashed)
hline(dS2, "Daily S2", color=color.new(color.green, 55), linestyle=hline.style_dotted)
hline(wP, "Weekly P", color=color.new(color.yellow, 20), linestyle=hline.style_solid)
hline(wR1, "Weekly R1", color=color.new(color.red, 55), linestyle=hline.style_dotted)
// ── Fibonacci of the session swing 4307.93 → 4442.95 ──────────────
swingLo = 4307.93
swingHi = 4442.95
range = swingHi - swingLo
f236 = swingHi - range * 0.236
f382 = swingHi - range * 0.382
f500 = swingHi - range * 0.500
f618 = swingHi - range * 0.618
f786 = swingHi - range * 0.786
// ── Single-draw guard: everything below paints once, no repaint ───
if barstate.islastconfirmedhistory
xL = bar_index - 120
xR = bar_index + 30
// ── Fibonacci lines ──
line.new(xL, f236, xR, f236, color=color.new(color.silver, 30), style=line.style_dotted)
line.new(xL, f382, xR, f382, color=color.new(color.silver, 30), style=line.style_dotted)
line.new(xL, f500, xR, f500, color=color.new(color.silver, 10), style=line.style_dashed)
line.new(xL, f618, xR, f618, color=color.new(color.silver, 10), style=line.style_dashed)
line.new(xL, f786, xR, f786, color=color.new(color.silver, 30), style=line.style_dotted)
// ── Golden pocket 0.5–0.618 ──
box.new(xL, f500, xR, f618, bgcolor=cGolden, border_color=color.new(color.yellow, 40))
label.new(xR, (f500 + f618) / 2, "GOLDEN POCKET 4,359 – 4,375", style=label.style_label_left, color=color.new(color.yellow, 30), textcolor=cText, size=size.small)
// ── Supply zones (above) ──
box.new(xL, 4442.95, xR, 4418.14, bgcolor=cSupply, border_color=color.new(color.red, 50))
label.new(xR, 4430.55, "Supply 4,418 – 4,443", style=label.style_label_left, color=color.new(color.red, 40), textcolor=cText, size=size.small)
box.new(xL, 4479.45, xR, 4464.60, bgcolor=cSupply, border_color=color.new(color.red, 60))
label.new(xR, 4472.03, "Supply 4,464 – 4,479 (Wk R1)", style=label.style_label_left, color=color.new(color.red, 55), textcolor=cText, size=size.small)
// ── Demand zones (below) ──
box.new(xL, 4320.33, xR, 4283.83, bgcolor=cDemand, border_color=color.new(color.green, 50))
label.new(xR, 4302.08, "Demand 4,284 – 4,320 (S1–S2)", style=label.style_label_left, color=color.new(color.green, 40), textcolor=cText, size=size.small)
box.new(xL, 4242.80, xR, 4222.52, bgcolor=cDemand, border_color=color.new(color.green, 60))
label.new(xR, 4232.66, "Demand 4,222 – 4,243 (Wk P)", style=label.style_label_left, color=color.new(color.green, 55), textcolor=cText, size=size.small)
// ── Trade Idea 1: BUY dip-buy ──
box.new(xL, 4359.51, xR, 4320.33, bgcolor=color.new(color.lime, 82), border_color=cBuy, border_style=line.style_dashed)
line.new(xL, 4283.83, xR, 4283.83, color=cBuy, style=line.style_dashed, width=1)
line.new(xL, 4418.14, xR, 4418.14, color=cBuy, style=line.style_solid, width=1)
label.new(xR, 4339.92, "BUY 1 — dip-buy entry 4,320–4,360 inv 4,284 tgt 4,418 conv 55%", style=label.style_label_left, color=cBuy, textcolor=cText, size=size.small)
// ── Trade Idea 2: SELL bounce-fade ──
box.new(xL, 4418.14, xR, 4381.64, bgcolor=color.new(color.red, 82), border_color=cSell, border_style=line.style_dashed)
line.new(xL, 4442.95, xR, 4442.95, color=cSell, style=line.style_dashed, width=1)
line.new(xL, 4320.33, xR, 4320.33, color=cSell, style=line.style_solid, width=1)
label.new(xR, 4399.89, "SELL 2 — fade entry 4,382–4,418 inv 4,443 tgt 4,320 conv 45%", style=label.style_label_left, color=cSell, textcolor=cText, size=size.small)
// ── Trade Idea 3: BUY position add at weekly pivot ──
box.new(xL, 4283.83, xR, 4242.80, bgcolor=color.new(color.lime, 85), border_color=cBuy, border_style=line.style_dotted)
line.new(xL, 4222.52, xR, 4222.52, color=cBuy, style=line.style_dotted, width=1)
line.new(xL, 4381.64, xR, 4381.64, color=cBuy, style=line.style_solid, width=1)
label.new(xR, 4263.32, "BUY 3 — swing add entry 4,243–4,284 inv 4,223 tgt 4,382 conv 50%", style=label.style_label_left, color=cBuy, textcolor=cText, size=size.small)
// ── Net-bias banner ──
var table biasBox = table.new(position.top_right, 1, 3, bgcolor=color.new(color.black, 15), border_width=1, border_color=color.new(color.gray, 40))
table.cell(biasBox, 0, 0, "NET DESK BIAS: BUY (on dips)", text_color=color.lime, text_size=size.normal)
table.cell(biasBox, 0, 1, "Driver: 10y real yield 2.39% (-3 bp), DXY < 100", text_color=cText, text_size=size.small)
table.cell(biasBox, 0, 2, "Level to watch: daily EMA200 ≈ 4,345.54", text_color=color.yellow, text_size=size.small)
{"bias": "BUY",
"ideas": [
{"bias": "BUY", "label": "Dip-buy into golden pocket / EMA200", "entry_low": 4320, "entry_high": 4360, "invalidation": 4284, "target": 4418, "conviction": 55},
{"bias": "SELL", "label": "Bounce-fade into pivot / R1 supply", "entry_low": 4382, "entry_high": 4418, "invalidation": 4443, "target": 4320, "conviction": 45},
{"bias": "BUY", "label": "Swing add at weekly pivot flush", "entry_low": 4243, "entry_high": 4284, "invalidation": 4223, "target": 4382, "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-08-14 — bias BUY", overlay=true, max_lines_count=300, max_labels_count=300, max_boxes_count=100)
// ── Inputs / palette ──────────────────────────────────────────────
cSupply = color.new(color.red, 72)
cDemand = color.new(color.green, 72)
cGolden = color.new(color.yellow, 65)
cBuy = color.new(color.lime, 60)
cSell = color.new(color.red, 60)
cPivot = color.new(color.gray, 0)
cText = color.white
// ── Trend anchors: EMAs 20 / 50 / 200 ─────────────────────────────
ema20 = ta.ema(close, 20)
ema50 = ta.ema(close, 50)
ema200 = ta.ema(close, 200)
plot(ema20, "EMA20", color=color.new(color.aqua, 0), linewidth=1)
plot(ema50, "EMA50", color=color.new(color.orange, 0), linewidth=1)
plot(ema200, "EMA200", color=color.new(color.fuchsia, 0), linewidth=2)
// ── Daily / weekly pivots ─────────────────────────────────────────
dP = 4381.64
dR1 = 4418.14
dR2 = 4479.45
dS1 = 4320.33
dS2 = 4283.83
dS3 = 4222.52
wP = 4242.80
wR1 = 4464.60
hline(dP, "Daily P", color=cPivot, linestyle=hline.style_solid)
hline(dR1, "Daily R1", color=color.new(color.red, 40), linestyle=hline.style_dashed)
hline(dS1, "Daily S1", color=color.new(color.green, 40), linestyle=hline.style_dashed)
hline(dS2, "Daily S2", color=color.new(color.green, 55), linestyle=hline.style_dotted)
hline(wP, "Weekly P", color=color.new(color.yellow, 20), linestyle=hline.style_solid)
hline(wR1, "Weekly R1", color=color.new(color.red, 55), linestyle=hline.style_dotted)
// ── Fibonacci of the session swing 4307.93 → 4442.95 ──────────────
swingLo = 4307.93
swingHi = 4442.95
range = swingHi - swingLo
f236 = swingHi - range * 0.236
f382 = swingHi - range * 0.382
f500 = swingHi - range * 0.500
f618 = swingHi - range * 0.618
f786 = swingHi - range * 0.786
// ── Single-draw guard: everything below paints once, no repaint ───
if barstate.islastconfirmedhistory
xL = bar_index - 120
xR = bar_index + 30
// ── Fibonacci lines ──
line.new(xL, f236, xR, f236, color=color.new(color.silver, 30), style=line.style_dotted)
line.new(xL, f382, xR, f382, color=color.new(color.silver, 30), style=line.style_dotted)
line.new(xL, f500, xR, f500, color=color.new(color.silver, 10), style=line.style_dashed)
line.new(xL, f618, xR, f618, color=color.new(color.silver, 10), style=line.style_dashed)
line.new(xL, f786, xR, f786, color=color.new(color.silver, 30), style=line.style_dotted)
// ── Golden pocket 0.5–0.618 ──
box.new(xL, f500, xR, f618, bgcolor=cGolden, border_color=color.new(color.yellow, 40))
label.new(xR, (f500 + f618) / 2, "GOLDEN POCKET 4,359 – 4,375", style=label.style_label_left, color=color.new(color.yellow, 30), textcolor=cText, size=size.small)
// ── Supply zones (above) ──
box.new(xL, 4442.95, xR, 4418.14, bgcolor=cSupply, border_color=color.new(color.red, 50))
label.new(xR, 4430.55, "Supply 4,418 – 4,443", style=label.style_label_left, color=color.new(color.red, 40), textcolor=cText, size=size.small)
box.new(xL, 4479.45, xR, 4464.60, bgcolor=cSupply, border_color=color.new(color.red, 60))
label.new(xR, 4472.03, "Supply 4,464 – 4,479 (Wk R1)", style=label.style_label_left, color=color.new(color.red, 55), textcolor=cText, size=size.small)
// ── Demand zones (below) ──
box.new(xL, 4320.33, xR, 4283.83, bgcolor=cDemand, border_color=color.new(color.green, 50))
label.new(xR, 4302.08, "Demand 4,284 – 4,320 (S1–S2)", style=label.style_label_left, color=color.new(color.green, 40), textcolor=cText, size=size.small)
box.new(xL, 4242.80, xR, 4222.52, bgcolor=cDemand, border_color=color.new(color.green, 60))
label.new(xR, 4232.66, "Demand 4,222 – 4,243 (Wk P)", style=label.style_label_left, color=color.new(color.green, 55), textcolor=cText, size=size.small)
// ── Trade Idea 1: BUY dip-buy ──
box.new(xL, 4359.51, xR, 4320.33, bgcolor=color.new(color.lime, 82), border_color=cBuy, border_style=line.style_dashed)
line.new(xL, 4283.83, xR, 4283.83, color=cBuy, style=line.style_dashed, width=1)
line.new(xL, 4418.14, xR, 4418.14, color=cBuy, style=line.style_solid, width=1)
label.new(xR, 4339.92, "BUY 1 — dip-buy entry 4,320–4,360 inv 4,284 tgt 4,418 conv 55%", style=label.style_label_left, color=cBuy, textcolor=cText, size=size.small)
// ── Trade Idea 2: SELL bounce-fade ──
box.new(xL, 4418.14, xR, 4381.64, bgcolor=color.new(color.red, 82), border_color=cSell, border_style=line.style_dashed)
line.new(xL, 4442.95, xR, 4442.95, color=cSell, style=line.style_dashed, width=1)
line.new(xL, 4320.33, xR, 4320.33, color=cSell, style=line.style_solid, width=1)
label.new(xR, 4399.89, "SELL 2 — fade entry 4,382–4,418 inv 4,443 tgt 4,320 conv 45%", style=label.style_label_left, color=cSell, textcolor=cText, size=size.small)
// ── Trade Idea 3: BUY position add at weekly pivot ──
box.new(xL, 4283.83, xR, 4242.80, bgcolor=color.new(color.lime, 85), border_color=cBuy, border_style=line.style_dotted)
line.new(xL, 4222.52, xR, 4222.52, color=cBuy, style=line.style_dotted, width=1)
line.new(xL, 4381.64, xR, 4381.64, color=cBuy, style=line.style_solid, width=1)
label.new(xR, 4263.32, "BUY 3 — swing add entry 4,243–4,284 inv 4,223 tgt 4,382 conv 50%", style=label.style_label_left, color=cBuy, textcolor=cText, size=size.small)
// ── Net-bias banner ──
var table biasBox = table.new(position.top_right, 1, 3, bgcolor=color.new(color.black, 15), border_width=1, border_color=color.new(color.gray, 40))
table.cell(biasBox, 0, 0, "NET DESK BIAS: BUY (on dips)", text_color=color.lime, text_size=size.normal)
table.cell(biasBox, 0, 1, "Driver: 10y real yield 2.39% (-3 bp), DXY < 100", text_color=cText, text_size=size.small)
table.cell(biasBox, 0, 2, "Level to watch: daily EMA200 ≈ 4,345.54", text_color=color.yellow, text_size=size.small)
— the resident
healthy pullback, real yields still greasing the rails