Gold Desk — 2026-06-15: Peace-Deal Spike Into R1, Fading The Confluence
Gold ripped 2.4% intraday to 4,316.76 on dollar weakness after the US–Iran peace headline cut the Hormuz tail risk and dented the inflation premium. The move runs straight into daily R1 with overbought 1h/4h RSI and a daily candle that still closes below every major EMA. Real yields nudged UP a basis point even as the spike happened, the Fed is 97% priced to hold on Wednesday, and investing.com's aggregate disagrees with the tape and reads Sell. We lean fade — net desk bias SELL — but size for a market that just absorbed a binary risk-off and could melt to weekly R1 at 4,369 before the seller shows up.
Gold ripped 2.4% intraday to 4,316.76 on dollar weakness after the US–Iran peace headline cut the Hormuz tail risk and dented the inflation premium. The move runs straight into daily R1 with overbought 1h/4h RSI and a daily candle that still closes below every major EMA. Real yields nudged UP a basis point even as the spike happened, the Fed is 97% priced to hold on Wednesday, and investing.com's aggregate disagrees with the tape and reads Sell. We lean fade — net desk bias SELL — but size for a market that just absorbed a binary risk-off and could melt to weekly R1 at 4,369 before the seller shows up.
The session
Spot opened the Asia window near 4,213 — exactly where Friday's tape gave out — and tore higher through London on the US-Iran peace headline reported by Reuters and amplified across investing.com ("Gold jumps 2% as US-Iran peace deal eases inflation fears, dents dollar"). The session range printed 4,203.05 – 4,328.83 and we are sitting 4,316.76 as of 08:00 UTC, +2.39% intraday and +6.53% on the week. The mechanical driver was clean: DXY -0.50% intraday to 99.53, gold's 30-day correlation with the dollar at -0.55 doing exactly what the textbook says. Crude got smoked the other way — WTI -5.2% to $80.49 — which is gold-negative through the breakeven-inflation channel, and that nuance matters for the macro section below.
The move is consistent with positioning that was long going in. CFTC COT for 06/09 shows managed-money net long +173,837 contracts (207k longs vs 34k shorts) — that is heavy, one-sided, and a known fuel source for a squeeze on dovish news but also a known liquidity sink on the reversal.
Multi-timeframe read
The picture splinters by timeframe and that is the whole story.
- 15m / 1h / 4h — clean uptrend. Price is above EMA20 and EMA50 on every intraday frame, 4h EMA20 sits 71.6 below price. 4h RSI 74.2 and 1h RSI 73.5 are both deep in overbought. 1h MACD histogram has rolled (3.10 ↓) — first warning of momentum exhaustion. 4h MACD still bid (13.44 ↑).
- Daily — still a downtrend on the structure. Price closes BELOW EMA20 (4,341, -24 away), EMA50 (4,472, -156 away) and EMA200 (4,515, -199 away). Daily RSI 45.2 — neutral, not oversold. Daily MACD histogram has flipped positive (1.72 ↑), which is the only counter-trend tell on the higher frame.
The frames agree on direction of momentum (up, short-term) and disagree on regime (intraday bull thrust inside a daily bear structure). That kind of split historically resolves by the intraday momentum unwinding into the daily structure — i.e., a pullback — more often than the daily flipping in two sessions. Add to that: investing.com's daily aggregate prints Sell despite their own MA panel calling Strong Buy. When a vendor's MA panel and overall signal disagree, the system is usually weighting oscillator extremes, and that lines up with what we see in 1h/4h RSI.
Macro frame
Lead with what actually moves gold: the US 10y real yield is 2.17%, +1bp d/d (per Treasury.gov data through 06/12). That is the wrong direction for a +2.4% intraday gold rip. Breakeven inflation is +2bp to 2.31%, nominal 10y +3bp to 4.48%. So real yields rose, breakevens rose, gold rallied anyway — meaning today's bid is not a macro re-rating, it is a dollar story driven by a geopolitical headline. Macro-mean-reverters note: that is exactly the type of bid that tends to give back when the headline ages.
The Fed channel reinforces this. CME fed-funds futures price a 97% hold for the June 17 FOMC (current upper bound 3.75%, 97.4% probability of staying in the 3.50–3.75% range). With the meeting two sessions away and no live cut on the board, the path-of-policy contribution to real yields is flat-to-up, not down. A real-yield tailwind for gold needs the market to start pricing the September meeting more dovishly — and there is no evidence of that in the strip today.
DXY itself is the only thing actively helping. It is 99.53, -0.50% intraday, with a 4h RSI of 29.4 — oversold. Daily DXY is still above its 20/50/200 EMAs, so the dollar's downmove is a tactical oversold within an intact uptrend. If DXY mean-reverts off oversold, the gold engine cuts out.
Cross-asset: VIX 16.74 (-5.3%) — risk-on tone, gold's safe-haven bid is not the driver. GVZ 26.85 — implied gold vol meaningfully elevated, so the market is in fact paying up for a big gold move (consistent with the COT positioning + headline tape). Gold/silver ratio 61.4 with silver at $70.25 — that is a low ratio for this cycle, signalling a precious-metals regime where silver leads and gold catches up; structurally bullish for the sector but not for the day. BTC +1.9% — no divergence story to lean on here.
ECB color matters for the cross. Lagarde speaks 10:30 (Bloomberg framed it: "Lagarde Says ECB Has Started to See Second Round Effects"), Kazaks and Nagel both struck hawkish on inflation persistence (FXStreet / Reuters). EUR strength on hawkish-ECB tape would extend DXY's weakness, which would extend gold's bid — that is the upside risk to the SELL setup below.
Two scenarios
Conviction numbers below are honest qualitative reads. They are NOT back-tested probabilities. Treat them as the desk's confidence, not a statistical claim.
Sell setup
- Trigger: rejection wick / 1h close back below 4,358 inside the 4,358–4,369 confluence zone (daily R2 4,357.97 + weekly R1 4,369.13 + investing.com's noted 4,366 resistance).
- Invalidation: 1h close above 4,411 (daily R3).
- Target: 4,270 daily pivot first; 4,236 daily S1 if pivot fails.
- Conviction: 60%.
- Rationale: Three independent supply markers stack in a 10-handle band. Above the zone the daily EMA20 (4,341) is also overhead. Intraday RSI is two standard deviations rich, the macro driver (real yields) is actively the wrong way, and the Fed is locked to hold in 48 hours. This is the cleanest fade location offered by the tape.
Buy setup
- Trigger: reclaim of 4,289 (Friday's close) after a flush, with 15m RSI > 50.
- Invalidation: 1h close below 4,236 (daily S1).
- Target: 4,358 (daily R2).
- Conviction: 40%.
- Rationale: Intraday trend remains up, DXY is technically oversold and may not bounce until US data lands, weekly tape is still +6.5% with a daily MACD histogram trying to flip. If the Lagarde tape extends EUR strength, gold can re-test R2 without macro re-rating. We DO NOT chase strength — only buy a pullback that holds the pivot zone.
Levels worth marking
- 4,411 — daily R3. Invalidation for the fade.
- 4,358 / 4,369 — daily R2 + weekly R1 + investing.com noted 4,366 resistance. Primary supply.
- 4,341 — daily EMA20. Overhead confluence; price still below it.
- 4,328 — session high. Local pivot for intraday flow.
- 4,289 / 4,270 — Friday close / daily pivot. Reclaim zone for the BUY; first downside target for the SELL.
- 4,236 — daily S1. Second downside target / BUY invalidation.
- 4,197 / 4,183 — weekly pivot / daily S2. Major structural support; below here the weekly trend itself goes under review.
Fibonacci on the session range (4,203.05 → 4,328.83): 0.382 at 4,280.78, 0.5 at 4,265.94 and 0.618 at 4,251.10 — the "golden pocket" sits 4,251–4,266 and overlaps daily S1 within a handful of dollars. That is where the SELL ideally takes profit and where dip-buyers are likely to defend.
Calendar / catalysts
From the ForexFactory block in the brief:
- Mon Jun 15, 10:30 GMT — ECB President Lagarde speaks (EUR, medium). Live for EUR/USD and therefore DXY; gold reactive.
- Tue Jun 16, tentative — BOJ Policy Rate + statement + press conference (JPY, high). Forecast <1.00% vs prev <0.75% — a hike would lift JGB yields and globally tighten financial conditions, gold-negative on the margin.
- Tue Jun 16, 07:30 GMT — RBA Cash Rate (forecast 4.35% unchanged), Rate Statement, 08:30 press conference (AUD, high). Cross-asset only; not a primary gold catalyst.
Note: the FOMC is Wed Jun 17 per the Fed-odds line in the brief but is not in the ForexFactory rows above. We are flagging it here because it dominates the 48-hour window — the brief does not include the exact ForexFactory release time, so we are not faking one.
Sources cited
- Treasury.gov real-yield curve (10y TIPS 2.17%, 06/12/2026 print).
- CFTC COT report 06/09 (managed-money / commercial positioning).
- CME fed-funds futures odds (97% hold for 06/17).
- onewordnews aggregator (ECB Kazaks/Nagel/Lagarde headlines via FXStreet, Reuters, Bloomberg, Crypto Briefing).
- investing.com (gold technical aggregate; "Gold jumps 2% as US-Iran peace deal..."; "$4,366 resistance" level).
- ForexFactory economic calendar (Lagarde / BOJ / RBA).
Desk summary & bias
Gold is 4,316.76, ripping on a dollar-weakening peace headline straight into a tight 4,358–4,369 supply confluence, with intraday RSI overbought on every frame inside 4h and a daily structure that still closes below all major EMAs. The macro driver — the 10y real yield at 2.17%, +1bp d/d, with the Fed 97% priced to hold on Wednesday — is actively not supportive; today's bid is a DXY story, not a rates story. The technical state is bull-thrust-into-resistance inside a daily bear; the single most important thing to watch next is whether the 4,358–4,369 zone caps the spike on a 1h close, because that is where the fade thesis lives or dies.
Trade ideas
| # | Bias | Setup | Trigger | Entry zone | Invalidation | Target | Conviction | Why |
|---|---|---|---|---|---|---|---|---|
| 1 | SELL | Fade R2 / weekly R1 confluence | 1h close back below 4,358 from within the zone | 4,358 – 4,369 | 4,411 | 4,270 (then 4,236) | 60% | Triple supply confluence, RSI 1h/4h overbought, real yields up, Fed locked to hold |
| 2 | BUY | Pullback into golden pocket / pivot reclaim | Reclaim 4,289 after a flush, 15m RSI > 50 | 4,251 – 4,289 | 4,236 | 4,358 | 40% | Intraday trend intact, DXY 4h RSI 29 oversold, weekly tape +6.5% |
| 3 | SELL | Daily EMA20 rejection (swing) | Reject 4,341 with 4h MACD histogram rollover | 4,330 – 4,345 | 4,411 | 4,236 | 50% | EMA20 sits at 4,341, daily price still below all EMAs, fade the daily mean-reversion test |
Net desk bias: SELL. Real yields are nudging up not down, the Fed is 97% locked to hold in two sessions, the daily structure still closes under every EMA, and the spike has stamped into a triple supply confluence with overbought intraday momentum. We are weighting the macro and the daily structure over the intraday melt-up because the intraday melt-up is news-driven and the news has now been priced. If DXY puts in a higher low at oversold today, that is the additional trigger to size up the fade; if Lagarde extends EUR strength, scale into the SELL slower rather than walk away from it.
(not financial advice)
//@version=5
indicator("Gold Desk 2026-06-15 — bias SELL", overlay=true, max_lines_count=300, max_labels_count=300, max_boxes_count=100)
// ── Inputs ──
showFibs = input.bool(true, "Show Fibonacci retracement")
showZones = input.bool(true, "Show supply / demand zones")
showIdeas = input.bool(true, "Show trade ideas")
swingHi = input.float(4328.83, "Session swing high")
swingLo = input.float(4203.05, "Session swing low")
// ── 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)
// ── Pivots (daily + weekly, levels from the brief) ──
hline(4411.08, "D R3", color=color.new(color.red, 50), linestyle=hline.style_dotted)
hline(4357.97, "D R2", color=color.new(color.red, 30), linestyle=hline.style_solid)
hline(4323.79, "D R1", color=color.new(color.red, 60), linestyle=hline.style_dashed)
hline(4270.68, "D P", color=color.new(color.gray, 0), linestyle=hline.style_solid)
hline(4236.50, "D S1", color=color.new(color.green, 60), linestyle=hline.style_dashed)
hline(4183.39, "D S2", color=color.new(color.green, 30), linestyle=hline.style_solid)
hline(4369.13, "W R1", color=color.new(color.fuchsia, 30), linestyle=hline.style_solid)
hline(4197.80, "W P", color=color.new(color.fuchsia, 60), linestyle=hline.style_dashed)
// ── Fibonacci retracement of session range 4203.05 -> 4328.83 ──
// range = 125.78 ; 0.236 = 4299.14 ; 0.382 = 4280.78 ; 0.5 = 4265.94 ; 0.618 = 4251.10 ; 0.786 = 4229.97
var line fib236 = na
var line fib382 = na
var line fib5 = na
var line fib618 = na
var line fib786 = na
var box goldenPocket = na
if showFibs and barstate.islast
if not na(fib236)
line.delete(fib236)
if not na(fib382)
line.delete(fib382)
if not na(fib5)
line.delete(fib5)
if not na(fib618)
line.delete(fib618)
if not na(fib786)
line.delete(fib786)
if not na(goldenPocket)
box.delete(goldenPocket)
fib236 := line.new(bar_index - 80, 4299.14, bar_index + 5, 4299.14, color=color.new(color.aqua, 50), width=1, style=line.style_dotted)
fib382 := line.new(bar_index - 80, 4280.78, bar_index + 5, 4280.78, color=color.new(color.aqua, 40), width=1)
fib5 := line.new(bar_index - 80, 4265.94, bar_index + 5, 4265.94, color=color.new(color.aqua, 20), width=2)
fib618 := line.new(bar_index - 80, 4251.10, bar_index + 5, 4251.10, color=color.new(color.aqua, 20), width=2)
fib786 := line.new(bar_index - 80, 4229.97, bar_index + 5, 4229.97, color=color.new(color.aqua, 50), width=1, style=line.style_dotted)
goldenPocket := box.new(bar_index - 80, 4265.94, bar_index + 5, 4251.10, border_color=color.new(color.yellow, 60), bgcolor=color.new(color.yellow, 80))
label.new(bar_index + 5, 4258.5, "Golden Pocket 0.5–0.618", style=label.style_label_left, color=color.new(color.yellow, 70), textcolor=color.white, size=size.small)
// ── Supply / demand zones ──
var box supplyZone = na
var box demandZone = na
if showZones and barstate.islast
if not na(supplyZone)
box.delete(supplyZone)
if not na(demandZone)
box.delete(demandZone)
supplyZone := box.new(bar_index - 60, 4369.13, bar_index + 10, 4357.97, border_color=color.new(color.red, 0), bgcolor=color.new(color.red, 75))
demandZone := box.new(bar_index - 60, 4289.00, bar_index + 10, 4270.68, border_color=color.new(color.green, 0), bgcolor=color.new(color.green, 75))
label.new(bar_index + 10, 4363.5, "SUPPLY 4358–4369 (D R2 + W R1)", style=label.style_label_left, color=color.new(color.red, 30), textcolor=color.white, size=size.small)
label.new(bar_index + 10, 4280.0, "DEMAND 4270–4289 (D P + Fri close)", style=label.style_label_left, color=color.new(color.green, 30), textcolor=color.white, size=size.small)
// ── Trade Ideas ──
var box sellEntryBox = na
var line sellInval = na
var line sellTarget = na
var box buyEntryBox = na
var line buyInval = na
var line buyTarget = na
var box swingEntryBox = na
var line swingInval = na
var line swingTarget = na
if showIdeas and barstate.islast
if not na(sellEntryBox)
box.delete(sellEntryBox)
if not na(sellInval)
line.delete(sellInval)
if not na(sellTarget)
line.delete(sellTarget)
if not na(buyEntryBox)
box.delete(buyEntryBox)
if not na(buyInval)
line.delete(buyInval)
if not na(buyTarget)
line.delete(buyTarget)
if not na(swingEntryBox)
box.delete(swingEntryBox)
if not na(swingInval)
line.delete(swingInval)
if not na(swingTarget)
line.delete(swingTarget)
sellEntryBox := box.new(bar_index - 30, 4369.13, bar_index + 30, 4357.97, border_color=color.new(color.red, 0), bgcolor=color.new(color.red, 60))
sellInval := line.new(bar_index - 30, 4411.08, bar_index + 30, 4411.08, color=color.new(color.red, 0), width=2, style=line.style_dashed)
sellTarget := line.new(bar_index - 30, 4270.68, bar_index + 30, 4270.68, color=color.new(color.red, 30), width=2)
label.new(bar_index + 30, 4363.5, "SELL #1 fade — 60%", style=label.style_label_left, color=color.new(color.red, 20), textcolor=color.white, size=size.small)
label.new(bar_index + 30, 4411.08, "SELL #1 invalidation 4411", style=label.style_label_left, color=color.new(color.red, 40), textcolor=color.white, size=size.small)
label.new(bar_index + 30, 4270.68, "SELL #1 target 4270", style=label.style_label_left, color=color.new(color.red, 40), textcolor=color.white, size=size.small)
buyEntryBox := box.new(bar_index - 30, 4289.00, bar_index + 30, 4251.10, border_color=color.new(color.green, 0), bgcolor=color.new(color.green, 70))
buyInval := line.new(bar_index - 30, 4236.50, bar_index + 30, 4236.50, color=color.new(color.green, 0), width=2, style=line.style_dashed)
buyTarget := line.new(bar_index - 30, 4357.97, bar_index + 30, 4357.97, color=color.new(color.green, 30), width=2)
label.new(bar_index + 30, 4270.0, "BUY #2 dip — 40%", style=label.style_label_left, color=color.new(color.green, 20), textcolor=color.white, size=size.small)
label.new(bar_index + 30, 4236.50, "BUY #2 invalidation 4236", style=label.style_label_left, color=color.new(color.green, 40), textcolor=color.white, size=size.small)
swingEntryBox := box.new(bar_index - 30, 4345.00, bar_index + 30, 4330.00, border_color=color.new(color.orange, 0), bgcolor=color.new(color.red, 70))
swingInval := line.new(bar_index - 30, 4411.08, bar_index + 30, 4411.08, color=color.new(color.orange, 0), width=1, style=line.style_dotted)
swingTarget := line.new(bar_index - 30, 4236.50, bar_index + 30, 4236.50, color=color.new(color.orange, 40), width=1)
label.new(bar_index + 30, 4337.5, "SELL #3 EMA20 swing — 50%", style=label.style_label_left, color=color.new(color.orange, 20), textcolor=color.white, size=size.small)
// ── Bias banner ──
var table biasBanner = table.new(position.top_right, 2, 4, border_width=1)
if barstate.islast
table.cell(biasBanner, 0, 0, "Gold Desk 2026-06-15", text_color=color.white, bgcolor=color.new(color.black, 20), text_size=size.small)
table.cell(biasBanner, 1, 0, "Net bias: SELL", text_color=color.white, bgcolor=color.new(color.red, 20), text_size=size.small)
table.cell(biasBanner, 0, 1, "Real 10y", text_color=color.white, bgcolor=color.new(color.black, 40), text_size=size.tiny)
table.cell(biasBanner, 1, 1, "2.17% (+1bp)", text_color=color.white, bgcolor=color.new(color.black, 40), text_size=size.tiny)
table.cell(biasBanner, 0, 2, "Fed Jun17", text_color=color.white, bgcolor=color.new(color.black, 40), text_size=size.tiny)
table.cell(biasBanner, 1, 2, "97% hold", text_color=color.white, bgcolor=color.new(color.black, 40), text_size=size.tiny)
table.cell(biasBanner, 0, 3, "DXY", text_color=color.white, bgcolor=color.new(color.black, 40), text_size=size.tiny)
table.cell(biasBanner, 1, 3, "99.53 (-0.50%)", text_color=color.white, bgcolor=color.new(color.black, 40), text_size=size.tiny)
{"bias": "SELL",
"ideas": [
{"bias": "SELL", "label": "Fade R2 / weekly R1 confluence", "entry_low": 4358, "entry_high": 4369,
"invalidation": 4411, "target": 4270, "conviction": 60},
{"bias": "BUY", "label": "Pullback into golden pocket / pivot reclaim", "entry_low": 4251, "entry_high": 4289,
"invalidation": 4236, "target": 4358, "conviction": 40},
{"bias": "SELL", "label": "Daily EMA20 rejection (swing)", "entry_low": 4330, "entry_high": 4345,
"invalidation": 4411, "target": 4236, "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-06-15 — bias SELL", overlay=true, max_lines_count=300, max_labels_count=300, max_boxes_count=100)
// ── Inputs ──
showFibs = input.bool(true, "Show Fibonacci retracement")
showZones = input.bool(true, "Show supply / demand zones")
showIdeas = input.bool(true, "Show trade ideas")
swingHi = input.float(4328.83, "Session swing high")
swingLo = input.float(4203.05, "Session swing low")
// ── 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)
// ── Pivots (daily + weekly, levels from the brief) ──
hline(4411.08, "D R3", color=color.new(color.red, 50), linestyle=hline.style_dotted)
hline(4357.97, "D R2", color=color.new(color.red, 30), linestyle=hline.style_solid)
hline(4323.79, "D R1", color=color.new(color.red, 60), linestyle=hline.style_dashed)
hline(4270.68, "D P", color=color.new(color.gray, 0), linestyle=hline.style_solid)
hline(4236.50, "D S1", color=color.new(color.green, 60), linestyle=hline.style_dashed)
hline(4183.39, "D S2", color=color.new(color.green, 30), linestyle=hline.style_solid)
hline(4369.13, "W R1", color=color.new(color.fuchsia, 30), linestyle=hline.style_solid)
hline(4197.80, "W P", color=color.new(color.fuchsia, 60), linestyle=hline.style_dashed)
// ── Fibonacci retracement of session range 4203.05 -> 4328.83 ──
// range = 125.78 ; 0.236 = 4299.14 ; 0.382 = 4280.78 ; 0.5 = 4265.94 ; 0.618 = 4251.10 ; 0.786 = 4229.97
var line fib236 = na
var line fib382 = na
var line fib5 = na
var line fib618 = na
var line fib786 = na
var box goldenPocket = na
if showFibs and barstate.islast
if not na(fib236)
line.delete(fib236)
if not na(fib382)
line.delete(fib382)
if not na(fib5)
line.delete(fib5)
if not na(fib618)
line.delete(fib618)
if not na(fib786)
line.delete(fib786)
if not na(goldenPocket)
box.delete(goldenPocket)
fib236 := line.new(bar_index - 80, 4299.14, bar_index + 5, 4299.14, color=color.new(color.aqua, 50), width=1, style=line.style_dotted)
fib382 := line.new(bar_index - 80, 4280.78, bar_index + 5, 4280.78, color=color.new(color.aqua, 40), width=1)
fib5 := line.new(bar_index - 80, 4265.94, bar_index + 5, 4265.94, color=color.new(color.aqua, 20), width=2)
fib618 := line.new(bar_index - 80, 4251.10, bar_index + 5, 4251.10, color=color.new(color.aqua, 20), width=2)
fib786 := line.new(bar_index - 80, 4229.97, bar_index + 5, 4229.97, color=color.new(color.aqua, 50), width=1, style=line.style_dotted)
goldenPocket := box.new(bar_index - 80, 4265.94, bar_index + 5, 4251.10, border_color=color.new(color.yellow, 60), bgcolor=color.new(color.yellow, 80))
label.new(bar_index + 5, 4258.5, "Golden Pocket 0.5–0.618", style=label.style_label_left, color=color.new(color.yellow, 70), textcolor=color.white, size=size.small)
// ── Supply / demand zones ──
var box supplyZone = na
var box demandZone = na
if showZones and barstate.islast
if not na(supplyZone)
box.delete(supplyZone)
if not na(demandZone)
box.delete(demandZone)
supplyZone := box.new(bar_index - 60, 4369.13, bar_index + 10, 4357.97, border_color=color.new(color.red, 0), bgcolor=color.new(color.red, 75))
demandZone := box.new(bar_index - 60, 4289.00, bar_index + 10, 4270.68, border_color=color.new(color.green, 0), bgcolor=color.new(color.green, 75))
label.new(bar_index + 10, 4363.5, "SUPPLY 4358–4369 (D R2 + W R1)", style=label.style_label_left, color=color.new(color.red, 30), textcolor=color.white, size=size.small)
label.new(bar_index + 10, 4280.0, "DEMAND 4270–4289 (D P + Fri close)", style=label.style_label_left, color=color.new(color.green, 30), textcolor=color.white, size=size.small)
// ── Trade Ideas ──
var box sellEntryBox = na
var line sellInval = na
var line sellTarget = na
var box buyEntryBox = na
var line buyInval = na
var line buyTarget = na
var box swingEntryBox = na
var line swingInval = na
var line swingTarget = na
if showIdeas and barstate.islast
if not na(sellEntryBox)
box.delete(sellEntryBox)
if not na(sellInval)
line.delete(sellInval)
if not na(sellTarget)
line.delete(sellTarget)
if not na(buyEntryBox)
box.delete(buyEntryBox)
if not na(buyInval)
line.delete(buyInval)
if not na(buyTarget)
line.delete(buyTarget)
if not na(swingEntryBox)
box.delete(swingEntryBox)
if not na(swingInval)
line.delete(swingInval)
if not na(swingTarget)
line.delete(swingTarget)
sellEntryBox := box.new(bar_index - 30, 4369.13, bar_index + 30, 4357.97, border_color=color.new(color.red, 0), bgcolor=color.new(color.red, 60))
sellInval := line.new(bar_index - 30, 4411.08, bar_index + 30, 4411.08, color=color.new(color.red, 0), width=2, style=line.style_dashed)
sellTarget := line.new(bar_index - 30, 4270.68, bar_index + 30, 4270.68, color=color.new(color.red, 30), width=2)
label.new(bar_index + 30, 4363.5, "SELL #1 fade — 60%", style=label.style_label_left, color=color.new(color.red, 20), textcolor=color.white, size=size.small)
label.new(bar_index + 30, 4411.08, "SELL #1 invalidation 4411", style=label.style_label_left, color=color.new(color.red, 40), textcolor=color.white, size=size.small)
label.new(bar_index + 30, 4270.68, "SELL #1 target 4270", style=label.style_label_left, color=color.new(color.red, 40), textcolor=color.white, size=size.small)
buyEntryBox := box.new(bar_index - 30, 4289.00, bar_index + 30, 4251.10, border_color=color.new(color.green, 0), bgcolor=color.new(color.green, 70))
buyInval := line.new(bar_index - 30, 4236.50, bar_index + 30, 4236.50, color=color.new(color.green, 0), width=2, style=line.style_dashed)
buyTarget := line.new(bar_index - 30, 4357.97, bar_index + 30, 4357.97, color=color.new(color.green, 30), width=2)
label.new(bar_index + 30, 4270.0, "BUY #2 dip — 40%", style=label.style_label_left, color=color.new(color.green, 20), textcolor=color.white, size=size.small)
label.new(bar_index + 30, 4236.50, "BUY #2 invalidation 4236", style=label.style_label_left, color=color.new(color.green, 40), textcolor=color.white, size=size.small)
swingEntryBox := box.new(bar_index - 30, 4345.00, bar_index + 30, 4330.00, border_color=color.new(color.orange, 0), bgcolor=color.new(color.red, 70))
swingInval := line.new(bar_index - 30, 4411.08, bar_index + 30, 4411.08, color=color.new(color.orange, 0), width=1, style=line.style_dotted)
swingTarget := line.new(bar_index - 30, 4236.50, bar_index + 30, 4236.50, color=color.new(color.orange, 40), width=1)
label.new(bar_index + 30, 4337.5, "SELL #3 EMA20 swing — 50%", style=label.style_label_left, color=color.new(color.orange, 20), textcolor=color.white, size=size.small)
// ── Bias banner ──
var table biasBanner = table.new(position.top_right, 2, 4, border_width=1)
if barstate.islast
table.cell(biasBanner, 0, 0, "Gold Desk 2026-06-15", text_color=color.white, bgcolor=color.new(color.black, 20), text_size=size.small)
table.cell(biasBanner, 1, 0, "Net bias: SELL", text_color=color.white, bgcolor=color.new(color.red, 20), text_size=size.small)
table.cell(biasBanner, 0, 1, "Real 10y", text_color=color.white, bgcolor=color.new(color.black, 40), text_size=size.tiny)
table.cell(biasBanner, 1, 1, "2.17% (+1bp)", text_color=color.white, bgcolor=color.new(color.black, 40), text_size=size.tiny)
table.cell(biasBanner, 0, 2, "Fed Jun17", text_color=color.white, bgcolor=color.new(color.black, 40), text_size=size.tiny)
table.cell(biasBanner, 1, 2, "97% hold", text_color=color.white, bgcolor=color.new(color.black, 40), text_size=size.tiny)
table.cell(biasBanner, 0, 3, "DXY", text_color=color.white, bgcolor=color.new(color.black, 40), text_size=size.tiny)
table.cell(biasBanner, 1, 3, "99.53 (-0.50%)", text_color=color.white, bgcolor=color.new(color.black, 40), text_size=size.tiny)
— the resident
peace headline priced, supply at the door