World Time
BEIJINGUTC+8
LONDONUTC±0/+1
NEW YORKUTC-5/-4
✦ Investment Wisdom
正在加载地球仪...
Scroll / +- to zoom · Drag / ↑↓←→ to move · C → China · Double-click to fullscreen
☀️ 计算中...
继续放大进入地图视图
📚 我的书架
🎼 Music Player
🔉 60
国家
城市
国家
城市
🌐 新闻资讯 Loading...
Fetching latest news...
点击卡牌 · 聆听利弗莫尔
🃏
LIVERMORE
trading wisdom
🛢️ -- --
JESSE LIVERMORE · 1877 — 1940 ·
— Jesse Livermore
Strait of Hormuz
Hormuz
Strait of Hormuz · 霍尔木兹海峡
Strait of Hormuz STRAIT OF HORMUZ 日均通过 ~2100万桶原油 · 全球1/3海运石油
// Index Panel Logic var currentIdxGroup = 'market'; var idxPanelOpen = false; window.toggleIndexPanel = function() { var p = document.getElementById('index-overlay'); if(p.style.display === 'flex') { p.style.display='none'; idxPanelOpen=false; } else { p.style.display='flex'; idxPanelOpen=true; renderIdxContent(currentIdxGroup); } }; window.switchIdxTab = function(tabEl) { document.querySelectorAll('.idx-tab').forEach(function(t){t.classList.remove('active');}); tabEl.classList.add('active'); currentIdxGroup = tabEl.dataset.g; renderIdxContent(currentIdxGroup); }; window.refreshAllIndices = function() { renderIdxContent(currentIdxGroup, true); }; async function renderIdxContent(group, forceRefresh) { var bodyEl = document.getElementById('index-content'), loadEl = document.getElementById('index-loading'); bodyEl.style.display='none'; loadEl.style.display='flex'; bodyEl.innerHTML=''; try { var data; if(group==='market') data = await fetchMarketData(); else if(group==='true_mkt') data = await getTrueMarketData(); else if(group==='economic') data = getEconomicData(); else if(group==='sentiment') data = getSentimentData(); else if(group==='sector') data = getSectorData(); loadEl.style.display='none'; bodyEl.style.display='block'; document.getElementById('idx-update-time').textContent = 'Updated ' + new Date().toLocaleTimeString(); if(group==='market') renderMarket(data); else if(group==='true_mkt') renderTrueMkt(data); else if(group==='economic') renderEconomic(data); else if(group==='sentiment') renderSentiment(data); else if(group==='sector') renderSector(data); } catch(e) { loadEl.style.display='none'; bodyEl.style.display='block'; bodyEl.innerHTML = '
Error: ' + e.message + '
'; } } async function fetchMarketData() { try { var resp = await fetch('https://hq.sinajs.cn/list=sh000001,sz399001,sz399006,sh000016,sh000905,hsteck36,sh000300', {mode:'no-cors'}); var text = await resp.text(); return parseSinaData(text); } catch(e) { return getMockMarketData(); } } function parseSinaData(text) { var items=text.split(';'), result=[], names=['Shanghai','Shenzhen','ChiNext','SSE50','HS300','HangSeng','KSTAR50']; for(var i=0;i=4) { var p=parseFloat(vals[3])||0, pc=parseFloat(vals[2])||p; result.push({name:names[i]||'Index'+i, value:p, change:(p-pc), pct:(pc>0?(p-pc)/pc*100:0)}); } } return result.length>=4 ? result : getMockMarketData().concat(result); } function getMockMarketData() { return [ {name:'SSE Composite', value:3385.23, change:+12.56, pct:+0.37, volume:4200}, {name:'SZSE Component', value:10842.67, change:-23.45, pct:-0.22, volume:3100}, {name:'ChiNext', value:2245.89, change:+8.76, pct:+0.39, volume:2800}, {name:'STAR 50', value:987.34, change:+3.21, pct:+0.33, volume:1200}, {name:'Hang Seng', value:3956.78, change:+15.23, pct:+0.39, volume:8500}, {name:'CSI 500', value:5432.12, change:-8.90, pct:-0.16, volume:2100}, {name:'HS Tech', value:22567.89, change:+123.45, pct:+0.55, volume:1800}, {name:'Nasdaq 100', value:21543.21, change:+87.65, pct:+0.41, volume:null}, {name:'S&P 500', value:5876.54, change:+23.12, pct:+0.39, volume:null} ]; } async function getTrueMarketData() { try { var resp = await fetch('data/market_truth.json?t=' + Date.now()); if(!resp.ok) throw new Error('HTTP ' + resp.status); var json = await resp.json(); window._marketTruthCache = json; return json; } catch(e) { console.warn('market_truth.json load failed:', e); return null; } } function getEconomicData() { return [ {name:'M2 Supply', val:'+8.3%', trend:'up', pct:72, desc:'Money supply growth'}, {name:'CPI', val:'+0.2%', trend:'stable', pct:45, desc:'Consumer prices'}, {name:'PMI', val:'49.3', trend:'down', pct:48, desc:'Manufacturing index'}, {name:'GDP', val:'+5.0%', trend:'stable', pct:55, desc:'Economic growth'}, {name:'Bond Yield', val:'2.15%', trend:'down', pct:28, desc:'10-year treasury'}, {name:'USD/CNY', val:7.24, change:+0.02, pct:+0.28, valType:'number', desc:'Exchange rate'}, {name:'Copper', val:9845.0, change:+125.0, pct:+1.29, valType:'number', desc:'Industrial metal'} ]; } function getSentimentData() { return [ {name:'Fear & Greed', val:62, level:'Greed', pct:62, desc:'Market sentiment'}, {name:'VIX', val:14.5, level:'Low', pct:28, desc:'Volatility index'}, {name:'Put/Call', val:0.82, level:'Neutral', pct:36, desc:'Options ratio'}, {name:'Northbound', val:'+45.6', trend:'inflow', pct:70, desc:'Foreign buying'}, {name:'A/D Ratio', val:'42/18', level:'Bullish', pct:65, desc:'Advancers/Decliners'}, {name:'PB<1 Ratio', val:'23.4%', level:'Low', pct:23, desc:'Undervalued stocks'}, {name:'PE Median', val:'28.5x', level:'Fair', pct:52, desc:'Valuation metric'} ]; } function getSectorData() { return [ {name:'Technology', chg:+45.2, pct:+2.34, leader:'NVDA', lChg:+5.6, desc:'Tech sector'}, {name:'Finance', chg:+23.1, pct:+1.12, leader:'JPM', lChg:+2.3, desc:'Financial sector'}, {name:'Healthcare', chg:-12.3, pct:-0.56, leader:'PFE', lChg:-1.2, desc:'Healthcare'}, {name:'Energy', chg:+18.7, pct:+0.89, leader:'XOM', lChg:+1.5, desc:'Energy sector'}, {name:'Consumer', chg:+8.4, pct:+0.45, leader:'PG', lChg:+0.8, desc:'Consumer goods'} ]; } window.renderMarket = function(data) { var h='
Global Indices
'; (data||[]).forEach(function(d){ var cls=d.pct>=0?'up':'down'; h+='
'+d.name+'
'+ '
'+d.value.toFixed(2)+''+ ''+(d.pct>=0?'+':'')+Math.abs(d.pct).toFixed(2)+'%
'; }); h+='
'; bodyEl.innerHTML=h; }; window.renderTrueMkt = function(data) { if(!data || !data.breadth) { bodyEl.innerHTML = '
No data available
'; return; } var s = data.summary || {}; var levelColor = s.score >= 75 ? '#fc8181' : s.score >= 50 ? '#f6ad55' : s.score >= 25 ? '#63b3ed' : '#68d391'; var h = '
'; h += '
Market Thermometer
'; h += '
' + (s.score||0) + '
'; h += '
'+(s.verdict||'')+'
'; h += '
Updated ' + (data.updatedAt||'') + '
'; h += '
'; h += '
ColdOverheated
'; h += '
'; var cats = [ {key:'breadth', icon:'[M]', title:'Market Breadth', desc:'Reveals rise/fall structure'}, {key:'valuation', icon:'[V]', title:'Valuation', desc:'Real valuation excluding giants'}, {key:'liquidity', icon:'[$]', title:'Liquidity', desc:'Capital temperature and leverage'}, {key:'risk', icon:'[!]', title:'Risk Warning', desc:'Hidden dangers'}, {key:'alternative', icon:'[A]', title:'Alternative Truth', desc:'Real economy mapping'}, {key:'ecoReality', icon:'[E]', title:'Economic Fundamentals', desc:'Corporate profit divergence'} ]; cats.forEach(function(cat) { var items = data[cat.key]; if(!items || items.length===0) return; h += '
'; h += '
' + cat.icon + ' ' + cat.title + '' + cat.desc + '
'; h += '
'; items.forEach(function(d){ var lvl = d.level || 'normal'; var lc = (lvl==='danger') ? '#fc8181' : (lvl==='warning') ? '#f6ad55' : (lvl==='good') ? '#68d391' : '#63b3ed'; var pctVal = d.pct || 0; var barW = Math.min(Math.abs(typeof pctVal==='number'?pctVal:parseFloat(pctVal)||0)*3, 100); h += '
'; h += '
' + d.name + '
'; h += '
'; h += '' + (d.value || '-') + ''; if(d.trend) { var tc = d.trend.indexOf('\u2191')>=0 ? (lvl==='danger'?'#fc8181':'#68d391') : d.trend.indexOf('\u2193')>=0 ? (lvl==='danger'?'#fc8181':'#68d391') : '#9f7aea'; h += '' + d.trend + ''; } h += '
'; if(d.desc) { h += '
' + d.desc + '
'; } if(d.interpret) { h += '
[i] ' + d.interpret + '
'; } if(d.pct !== undefined && d.pct !== null) { h += '
'; } h += '
'; }); h += '
'; }); bodyEl.innerHTML = h; }; window.renderEconomic = function(data) { var h='
Economic Indicators
'; (data||[]).forEach(function(d){ var vc=d.val&&String(d.val).includes('-')?"#fc8181":d.val&&String(d.val).includes('+')?"#68d391":"#63b3ed"; var tc=d.trend&&d.trend.indexOf("up")>=0?"#68d391":d.trend&&d.trend.indexOf("down")>=0?"#fc8181":"#9f7aea"; h+='
'+d.name+"
"+ '
'+d.val+"
"+ '
'+(d.trend||"")+"
"+ '
'+ '
'+d.desc+"
"; }); h+='
'; bodyEl.innerHTML=h; }; window.renderSentiment = function(data) { var h='
Market Sentiment
'; (data||[]).forEach(function(d){ var lc=(d.level&&d.level.indexOf("Greed")>=0?"#f6ad55": d.level&&d.level.indexOf("Fear")>=0?"#fc8181": d.level&&d.level.indexOf("Neutral")>=0?"#63b3ed":"#9f7aea"); var vd=typeof d.val==="number"?d.val:d.val; h+='
'+d.name+'
'; d.desc&&(h+='
'+d.desc+"
"); h+='
Value'+vd+"
"; h+='
Status'+d.level+"
"; h+='
'; }); h+='
'; bodyEl.innerHTML=h; }; window.renderSector = function(data) { data=data.slice().sort(function(a,b){return b.chg-a.chg;}); var h='
Sector Performance
'; data.forEach(function(d){ var cls=d.pct>=0?'up':'down', bw=Math.min(Math.abs(d.pct)*6,100); h+='
'+d.name+ 'Leader:'+d.leader+' '+(d.lChg>=0?'+':'')+d.lChg.toFixed(1)+'%
'+ '
'+(d.chg>=0?'+':'')+d.chg.toFixed(2)+''+ ''+d.pct.toFixed(2)+'%
'+ '
'+d.desc+'
'+ '
'; }); h+='
'; bodyEl.innerHTML=h; };