From 789c122632090c1110571eb42bbd5287e6779d74 Mon Sep 17 00:00:00 2001 From: Tvishi Agarwal Date: Thu, 9 Apr 2026 20:39:42 +0000 Subject: [PATCH] v1 --- index.html | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/index.html b/index.html index 0778763..2728096 100644 --- a/index.html +++ b/index.html @@ -52,12 +52,15 @@ function Cmdt({d}){const items=[{k:"gold",l:"Gold XAU",s:"TVC:GOLD"},{k:"wti",l: function XCry({yld}){const g=RT.filter(r=>["US","Eurozone","UK","Japan","Switzerland","Australia","New Zealand","Canada","Sweden","Norway"].includes(r.c));const gY=c=>yld[c]?.y2??null;const pairs=[];for(let i=0;iyb?a:b,sc=ya>yb?b:a;pairs.push({lc:lc.ccy,sc:sc.ccy,lf:lc.f,sf:sc.f,ly:Math.max(ya,yb),sy:Math.min(ya,yb),carry:d})}if(!pairs.length)return
Carry data requires live yield feeds (FRED / ECB)
;return r.rk<=5?C.g:C.txD},{k:"t",l:"Trade",a:"left",nm:1,rn:r=>r.lf+" Long "+r.lc+" / "+r.sf+" Short "+r.sc},{k:"ly",l:"Long Yld",rn:r=>r.ly.toFixed(2)+"%"},{k:"sy",l:"Short Yld",rn:r=>r.sy.toFixed(2)+"%"},{k:"carry",l:"Carry",rn:r=>"+"+r.carry.toFixed(2)+"%",cl:r=>r.carry>3?C.g:r.carry>1?C.tl:C.txD},{k:"bp",l:"bps",rn:r=>"+"+(r.carry*100).toFixed(0),cl:r=>r.carry>3?C.g:r.carry>1?C.tl:C.txD}]} rows={pairs.sort((a,b)=>b.carry-a.carry).map((r,i)=>({...r,rk:i+1}))} sm/>} function UCry({yld}){const uY=yld.US?.y2;if(uY==null)return
Carry data requires live US yield feed (FRED)
;const rows=RT.filter(r=>r.c!=="US").map(r=>{const ry=yld[r.c]?.y2;return {...r,carry:ry!=null?+((ry-uY).toFixed(2)):null}}).filter(r=>r.carry!=null).sort((a,b)=>b.carry-a.carry).map((r,i)=>({...r,rk:i+1}));if(!rows.length)return
No foreign yield data available yet
;return r.rk<=3?C.g:r.rk>=13?C.r:C.txD},{k:"c",l:"Currency",a:"left",nm:1,rn:r=>r.f+" "+r.ccy},{k:"y",l:"2Y Yield",rn:r=>(yld[r.c]?.y2!=null?yld[r.c].y2.toFixed(2)+"%":"—")},{k:"carry",l:"vs USD",rn:r=>fc(r.carry),cl:r=>cc(r.carry)},{k:"dir",l:"Direction",a:"left",nm:1,rn:r=>r.carry>0.3?"Long "+r.ccy:"Short "+r.ccy,cl:r=>r.carry>0.3?C.g:C.r}]} rows={rows} sm/>} function CarryP({yld}){const [t,sT]=useState("Cross G10");return
{t==="Cross G10"?:}
} -function Markets({g10,em,fxL,yld,yL}){const [t,sT]=useState("G10 FX");return
{t==="G10 FX"&&}{t==="EM FX"&&}{t==="Rates"&&}{t==="Carry"&&}
} +function EtfTbl({etfs}){const rows=Object.entries(etfs||{}).map(([name,v])=>({name,price:v?.price??null,d1:v?.d1_pct??null,w1:v?.w1_pct??null,m1:v?.m1_pct??null}));if(!rows.length)return
No ETF data available
;return C.b},{k:"price",l:"Price",rn:r=>r.price!=null?Number(r.price).toFixed(2):"—"},{k:"d1",l:"1D %",rn:r=>fc(r.d1),cl:r=>cc(r.d1)},{k:"w1",l:"1W %",rn:r=>fc(r.w1),cl:r=>cc(r.w1)},{k:"m1",l:"1M %",rn:r=>fc(r.m1),cl:r=>cc(r.m1)}]} rows={rows}/>} +function VolTbl({vol}){const rows=Object.entries(vol||{}).map(([name,v])=>({name,price:v?.price??null,prev:v?.prev_close??null,chg:v?.change_pct??null}));if(!rows.length)return
No volatility data available
;return C.b},{k:"price",l:"Level",rn:r=>r.price!=null?Number(r.price).toFixed(2):"—"},{k:"prev",l:"Prev",rn:r=>r.prev!=null?Number(r.prev).toFixed(2):"—"},{k:"chg",l:"Change",rn:r=>r.chg!=null?fc(r.chg,""):"—",cl:r=>cc(r.chg)}]} rows={rows}/>} +function BondEtfTbl({bondEtfs}){const rows=Object.entries(bondEtfs||{}).map(([name,v])=>({name,country:v?.country??"",duration:v?.duration??"",price:v?.price??null,d1:v?.d1_pct??null,w1:v?.w1_pct??null,m1:v?.m1_pct??null}));if(!rows.length)return
No bond ETF data available
;return C.b},{k:"country",l:"Country",a:"left"},{k:"duration",l:"Duration",a:"left"},{k:"price",l:"Price",rn:r=>r.price!=null?Number(r.price).toFixed(2):"—"},{k:"d1",l:"1D %",rn:r=>fc(r.d1),cl:r=>cc(r.d1)},{k:"w1",l:"1W %",rn:r=>fc(r.w1),cl:r=>cc(r.w1)},{k:"m1",l:"1M %",rn:r=>fc(r.m1),cl:r=>cc(r.m1)}]} rows={rows} sm/>} +function Markets({g10,em,fxL,yld,yL,etfs,vol,bondEtfs}){const [t,sT]=useState("G10 FX");return
{t==="G10 FX"&&}{t==="EM FX"&&}{t==="Rates"&&}{t==="Carry"&&}{t==="ETFs"&&}{t==="Volatility"&&}{t==="Bond ETFs"&&}
} function CorrMx(){return
30-Day Correlation Matrix

Correlation data not available — requires a live feed
} /* ═══ DEEP DIVE ═══════════════════════════════════════════════════ */ -function Deep({ctry,g10,em,yld,news,nL,risk}){ - const ccy=cOf[ctry],fp=[...g10,...em].find(x=>x.pair===pOf[ctry]),y=yld[ctry]||{},tpl=RT.find(x=>x.c===ctry),m=MD[ctry]||{}; +function Deep({ctry,g10,em,yld,news,nL,risk,macro,policyRates}){ + const ccy=cOf[ctry],fp=[...g10,...em].find(x=>x.pair===pOf[ctry]),y=yld[ctry]||{},tpl=RT.find(x=>x.c===ctry),m=macro?.[ctry]||{},cbRate=policyRates?.[ctry]??null; const kws=nKw[ctry]||[ccy.toLowerCase()];const cN=news.filter(n=>kws.some(kw=>(n.headline||"").toLowerCase().includes(kw)));const dN=cN.length>=2?cN:news; const ce=Object.entries(y).filter(([k,v])=>v!=null&&k.startsWith("y")).map(([k,v])=>[k.replace("y","").toUpperCase(),v]); const [ai,setAi]=useState(null); @@ -83,7 +86,7 @@ function Deep({ctry,g10,em,yld,news,nL,risk}){ yields: y, centralBank: tpl ? { country: tpl.c, - policyRate: tpl.cb + policyRate: cbRate } : null, macro: m, riskBar: risk, @@ -274,7 +277,7 @@ function Deep({ctry,g10,em,yld,news,nL,risk}){
Central Bank
-
Policy Rate{tpl?.cb!=null ? tpl.cb.toFixed(2)+"%" : "—"}
+
Policy Rate{cbRate!=null ? cbRate.toFixed(2)+"%" : "—"}
Stance{m.stance||"—"}
Last Decision{m.last||"—"}
Next Meeting{m.next||"—"}
@@ -342,11 +345,15 @@ function App(){ const [risk,sRisk]=useState({DXY:{level:null,chg:null},VIX:{level:null,chg:null},Gold:{level:null,chg:null},WTI:{level:null,chg:null},Brent:{level:null,chg:null},"US 10Y":{level:null,chg:null}}); const [rL,sRL]=useState(false);const [cal,sCal]=useState([]);const [cL,sCL]=useState(false);const [news,sNews]=useState([]);const [nL,sNL]=useState(false); const [cmd,sCmd]=useState({gold:{},wti:{},brent:{}});const [ld,sLd]=useState(false);const [lr,sLR]=useState(null); + const [etfs,setEtfs]=useState({});const [vol,setVol]=useState({});const [bondEtfs,setBondEtfs]=useState({}); + const [macro,setMacro]=useState({});const [policyRates,setPolicyRates]=useState({}); const svK=useCallback(nk=>{setKeys(nk);Object.entries(nk).forEach(([k,v])=>sk(k,v))},[]); const load=useCallback(async()=>{ sLd(true); try{ const data=await fData(); + setEtfs(data.etfs||{});setVol(data.volatility||{});setBondEtfs(data.bond_etfs||{}); + setMacro(data.macro||{});setPolicyRates(data.policy_rates||{}); const mapFx=defs=>defs.map(d=>{const x=data.fx?.[d.p];return{pair:d.p,spot:x?.price??null,d1:x?.d1_pct??null,w1:x?.w1_pct??null,m1:x?.m1_pct??null,ytd:null}}); sG10(mapFx(G10));sEM(mapFx(EMP));sFxL(true); const mappedYields={}; @@ -370,10 +377,10 @@ function App(){
{sec==="brief"&&} - {sec==="markets"&&
} + {sec==="markets"&&
} {sec==="commod"&&
Commodities
} {sec==="corr"&&
} - {sec==="deep"&&
{RT.map(c=>)}
} + {sec==="deep"&&
{RT.map(c=>)}
} {sec==="cal"&&
Economic Calendar
}
FX RADAR v4 · {fxL?"Live":"..."}