{{ t('wl.screener') }}
{{ t('wl.empty') }} {{ t('wl.emptyHint') }} {{ t('wl.emptyHint2') }}
{{ item.symbol }} {{ item.companyName || '' }} {{ sectorLabel(item.sector) }} {{ wlDisplayPrice(item) }} {{ t('wl.auction') }} {{ item.changePct != null ? (item.changePct > 0 ? '+' : '') + Number(item.changePct).toFixed(2) + '%' : '--' }}
{{ item.changeAmt != null ? (item.changeAmt > 0 ? '+' : '') + Number(item.changeAmt).toFixed(3) : '--' }} · {{ t('wl.volume', {n: item.totalVolume ? fmt(item.totalVolume) : '--'}) }} · {{ item.date.slice(5) }}
{{ t('wl.col.symbol') }} {{ t('wl.col.name') }} {{ t('wl.col.sector') }} {{ t('wl.col.price') }} {{ t('wl.col.changePct') }} {{ t('wl.col.changeAmt') }} {{ t('wl.col.volume') }} {{ t('wl.col.date') }} {{ t('wl.col.actions') }}
{{ item.symbol }} {{ item.companyName || '--' }} {{ sectorLabel(item.sector) }} {{ wlDisplayPrice(item) }} {{ t('wl.auction') }} {{ item.changePct != null ? (item.changePct > 0 ? '+' : '') + Number(item.changePct).toFixed(2) + '%' : '--' }} {{ item.changeAmt != null ? (item.changeAmt > 0 ? '+' : '') + Number(item.changeAmt).toFixed(3) : '--' }} {{ item.totalVolume ? fmt(item.totalVolume) : '--' }} {{ item.date || '--' }}

{{ t('wl.footer.pre') }}{{ watchlist.items.length }} / {{ currentUser.watchlistLimit || 0 }} {{ t('wl.footer.suf') }}

{{ t('scr.symbolLabel') }}
{{s.v}}{{ t('scr.realtime') }}{{s.name}}{{sectorLabel(s.sector)}}
{{ t('scr.sectorLabel') }}
{{ t('scr.mcap') }} ~
{{ t('scr.pe') }} ~
{{ t('scr.divYield') }} ~ {{ t('scr.divYieldNote') }}
{{ t('scr.avg5dAmt') }} ~ {{ t('scr.avg5dAmtNote') }}
{{ t('scr.ma') }}
{{ t('scr.ma5up') }} {{ t('scr.ma20up') }} {{ t('scr.ma60up') }} {{ t('scr.ma250up') }} {{ t('scr.ma5dn') }} {{ t('scr.ma20dn') }} {{ t('scr.ma60dn') }} {{ t('scr.ma250dn') }}
MACD {{ t('scr.noLimit') }} {{ t('scr.golden') }} {{ t('scr.death') }}
KDJ {{ t('scr.noLimit') }} {{ t('scr.golden') }} {{ t('scr.death') }}
{{ t('scr.search') }} {{ t('scr.reset') }} {{ t('scr.count', {n: screenDlg.results.length}) }}
{{ t('scr.col.code') }} {{ t('scr.col.name') }} {{ t('scr.col.sector') }} {{ t('scr.col.price') }} {{ t('scr.col.changePct') }} {{ t('scr.col.changeAmt') }} {{ t('scr.col.mcap') }} {{ t('scr.col.pe') }} {{ t('scr.col.divYield') }} {{ t('scr.col.avg5dAmt') }} {{ t('scr.col.volume') }} {{ t('scr.col.date') }} {{ t('scr.col.actions') }}
{{ row.symbol }} {{ row.companyName || '--' }} {{ sectorLabel(row.sector) }} {{ row.currentPrice ? Number(row.currentPrice).toFixed(3) : '--' }} {{ row.changePct != null ? (row.changePct > 0 ? '+' : '') + Number(row.changePct).toFixed(2) + '%' : '--' }} {{ row.changeAmt != null ? (row.changeAmt > 0 ? '+' : '') + Number(row.changeAmt).toFixed(3) : '--' }} {{ row.marketCap != null ? row.marketCap.toFixed(1) : '--' }} {{ row.pe != null ? row.pe.toFixed(2) : '--' }} {{ row.divYield != null ? row.divYield.toFixed(2) + '%' : '--' }} {{ row.avg5dAmt != null ? fsrFmtM(row.avg5dAmt) : '--' }} {{ row.totalVolume ? fmt(row.totalVolume) : '--' }} {{ row.date || '--' }}
{{ t('scr.noResult') }}
{{ t('scr.count', {n: screenDlg.results.length}) }}
{{ row.symbol }} {{ row.companyName || '--' }} {{ row.changePct!=null?(row.changePct>0?'+':'')+Number(row.changePct).toFixed(2)+'%':'--' }}
{{ row.currentPrice?Number(row.currentPrice).toFixed(3):'--' }} {{ row.changeAmt!=null?(row.changeAmt>0?'+':'')+Number(row.changeAmt).toFixed(3):'' }}
{{ t('scr.mcapLabel', {n: row.marketCap!=null?row.marketCap.toFixed(1):'--'}) }} PE {{ row.pe!=null?row.pe.toFixed(1):'--' }} {{ t('scr.divLabel', {n: row.divYield!=null?row.divYield.toFixed(2)+'%':'--'}) }} {{ t('scr.avg5dAmtLabel', {n: row.avg5dAmt!=null?fsrFmtM(row.avg5dAmt):'--'}) }} {{ row.date?row.date.slice(5):'' }}
{{ t('ph.stockSymbol') }}
{{s.v}}{{ t('badge.realtime') }}{{s.name}}{{sectorLabel(s.sector)}}
🔒 {{ t('plan.upgradeHint') }} {{ watchedSymbols.has(dailySymbol) ? '★' : '☆' }}
{{ t('btn.fundamental') }} {{ t('btn.technical') }} {{ t('btn.capital') }}
{{ dailySymbol }}   {{ dailyQuote?.date || dailyDate }} {{ mktStatusLabel || '--' }} {{ t('msg.noDataWaitOrTrigger') }}
{{ t('col.prevClose') }}{{ fmtPrice(dailyQuote?.prevClose) }}{{ t('col.open') }}{{ fmtPrice(dailyQuote?.openPrice) }}
{{ t('col.high') }}{{ fmtPrice(dailyQuote?.highPrice) }}{{ t('col.low') }}{{ fmtPrice(dailyQuote?.lowPrice) }}
{{ t('col.avgPrice') }}{{ fmtPrice(dailyQuote?.avgPrice) }}{{ t('col.volume') }}{{ dailyQuote?.totalVolume != null ? fmt(dailyQuote.totalVolume) : '--' }}
{{ t('col.turnover') }} {{ dailyQuote?.totalValue != null ? '₱' + fmt(dailyQuote.totalValue) : '--' }} {{ t('form.initiative') }} ↑{{ dailyQuote.initiativeBuyPct }}% / ↓{{ dailyQuote.initiativeSellPct }}% --
{{ t('col.week52') }} {{ fmtPrice(dailyQuote?.week52Low) }} – {{ fmtPrice(dailyQuote?.week52High) }} {{ t('col.sector') }} {{ sectorLabel(symbols.find(s => s.v === dailySymbol)?.sector) }} --
{{ t('col.turnoverRate') }} {{ (dailyQuote.totalVolume / dailyQuote.floatShares * 100).toFixed(3) }}% -- {{ t('daily.floatNote') }} {{ fmt(dailyQuote.floatShares) }}
{{ t('tab.sim.pending') }} {{ t('col.qty') }} {{ t('col.bidPrice') }} {{ t('col.askPrice') }} {{ t('col.qty') }} {{ t('tab.sim.pending') }}
{{ dailyQuote?.['bid'+n+'Orders'] ?? '--' }} {{ dailyQuote?.['bid'+n+'Vol'] != null ? fmt(dailyQuote['bid'+n+'Vol']) : '--' }} {{ fmtPrice(dailyQuote?.['bid'+n+'Price']) }} {{ fmtPrice(dailyQuote?.['ask'+n+'Price']) }} {{ dailyQuote?.['ask'+n+'Vol'] != null ? fmt(dailyQuote['ask'+n+'Vol']) : '--' }} {{ dailyQuote?.['ask'+n+'Orders'] ?? '--' }}
{{ t('lbl.intradayChart') }}
{{ t('lbl.recentKeyTrades') }} {{ t('btn.detail') }}
🔒 {{ t('plan.majorBadgeLockedHint') }}
{{ t('col.time') }} {{ t('col.price') }} {{ t('col.shares') }} {{ t('col.initiative') }} {{ t('col.buyer') }} {{ t('col.seller') }}
{{ tr.tradeTime }} {{ fmtPrice(tr.price) }} {{ fmt(tr.volume) }} {{ tr.initiative===1 ? t('lbl.activeBuy') : tr.initiative===-1 ? t('lbl.activeSell') : t('lbl.neutral') }} {{ tr.buyer }} {{ tr.seller }}
{{ t('msg.noData') }}
{{ t('block.latest30') }} ({{ t('block.threshNote', {sym:dailySymbol, n:fmt(blockThresholds[dailySymbol])}) }}) {{ t('btn.detail') }}
🔒 {{ t('plan.majorBadgeLockedHint') }}
{{ t('col.time') }} {{ t('lbl.broker') }} {{ t('col.direction') }} {{ t('col.totalVolume') }} {{ t('col.avgPrice') }} {{ t('col.totalAmt') }}
{{ bt.tradeTime }} {{ bt.broker }} ( {{ t('badge.retail') }}{{ bt.retailPct }}%) ( {{ t('badge.inst') }}{{ bt.instPct }}%) {{ bt.direction===1?t('trade.buy'):t('trade.sell') }} {{ fmt(bt.totalVolume) }} {{ fmtPrice(bt.avgPrice) }} {{ fmt(bt.totalAmount) }}
{{ t('msg.noData') }}
{{s.v}}{{ t('badge.realtime') }}{{s.name}}{{sectorLabel(s.sector)}}
{{ t('sort.tradeTime') }} {{ t('sort.volume') }}
🔒 {{ t('plan.upgradeHint') }}
{{ t('btn.search') }} {{ t('btn.reset') }}
{{ t('summary.count') }}
{{ fmt(tradeSummary.count) }}
{{ t('summary.totalVolume') }}
{{ fmt(tradeSummary.totalVolume) }}
{{ t('summary.totalAmount') }}
{{ fmtAmt(tradeSummary.totalAmount) }}
{{ t('ba.chipDist') }}
🔒 {{ t('plan.majorBadgeLockedHint') }}
{{ t('col.tradeDate') }} {{ t('col.tradeTime') }} {{ t('col.tradePrice') }} {{ t('col.tradeVolume') }} {{ t('col.tradeAmount') }} {{ t('form.initiative') }} {{ t('col.buyBroker') }} {{ t('col.sellBroker') }}
{{ t('empty.setConditionAndSearch') }}
{{ row.date }} {{ row.trade_time }} {{ fmtPrice(row.price) }} {{ fmt(row.volume) }} {{ fmtAmt(row.amount) }} {{ t('option.initiativeBuy') }} {{ t('option.initiativeSell') }} {{ t('option.neutral') }} {{ row.buyer }} {{ row.seller }}
{{ t('empty.setConditionAndSearch') }}
{{ row.date.slice(5) }} {{ row.trade_time }} {{ t('lbl.buy') }}:{{ row.buyer }} / {{ t('lbl.sell') }}:{{ row.seller }}
{{ t('tag.activeBuyShort') }} {{ t('tag.activeSellShort') }} {{ t('val.neutral') }} {{ fmt(row.volume) }}{{ t('unit.shares') }} {{ fmtAmt(row.amount) }} ₱{{ fmtPrice(row.price) }}
{{s.v}}{{ t('badge.realtime') }}{{s.name}}{{sectorLabel(s.sector)}}
{{ t('sort.tradeTime') }} {{ t('sort.volume') }}
🔒 {{ t('plan.upgradeHint') }}
{{ t('btn.search') }} {{ t('btn.reset') }} {{ !isPaidPlan ? '🔒 ' : '' }}{{ t('btn.retailVsInst') }}
{{ t('summary.count') }}
{{ fmt(blockSummary.count) }}
{{ t('summary.netShares') }}
{{ fmt(blockSummary.totalVolume) }}
{{ t('summary.netAmount') }}
{{ fmtAmt(blockSummary.totalAmount) }}
{{ blockForm.symbol }} {{ t('block.thresholdNote', {sym: blockForm.symbol, n: fmt(blockThresholds[blockForm.symbol])}) }}
🔒 {{ t('plan.majorBadgeLockedHint') }}
{{ t('col.date') }} {{ t('col.tradeTime') }} {{ t('col.direction') }} {{ t('lbl.broker') }} {{ t('col.totalVolume') }} {{ t('col.totalAmount') }} {{ t('col.avgPrice') }}
{{ t('empty.setConditionAndSearch') }}
{{ row.date }} {{ row.trade_time }} {{ row.direction===1?t('trade.buy'):t('trade.sell') }} {{ row.broker }} {{ fmt(row.totalVolume) }} {{ fmtAmt(row.totalAmount) }} {{ row.totalVolume ? fmtPrice(Math.abs(row.totalAmount) / Math.abs(row.totalVolume)) : '-' }}
{{ t('empty.setConditionAndSearch') }}
{{ row.date.slice(5) }} {{ row.trade_time }} {{ row.broker }} {{ row.direction===1?'▲'+t('trade.buy.s'):'▼'+t('trade.sell.s') }}
{{ fmt(row.totalVolume) }}{{ t('unit.shares') }} {{ fmtAmt(row.totalAmount) }} {{ t('hd.avgPrice') }}₱{{ row.totalVolume?(Math.abs(row.totalAmount)/Math.abs(row.totalVolume)).toFixed(3):'-' }}
{{s.v}}{{ t('badge.realtime') }}{{s.name}}{{sectorLabel(s.sector)}}
🔒 {{ t('plan.upgradeHint') }}
{{ t('btn.search') }} {{ t('btn.reset') }}
🔒 {{ t('plan.majorBadgeLockedHint') }}
{{ t('block.netBuy') }} {{ netBuyList.length }} {{ t('lbl.records') }}  |  {{ fmt(netBuyList.reduce((s,r)=>s+Math.abs(r.volume),0)) }} {{ t('unit.shares') }} {{ !isPaidPlan ? '🔒 ' : '' }}{{ t('btn.retailVsInst') }}
{{ t('col.date') }} {{ t('lbl.broker') }} {{ t('col.shares') }} {{ t('col.amount') }} {{ t('col.avgPrice') }}
{{ t('empty.setConditionAndSearch') }}
{{ t('empty.noNetBuy') }}
{{ row.date.slice(5) }} {{ row.broker }} {{ fmt(row.volume) }} {{ fmtAmt(row.value) }} {{ row.volume ? fmtPrice(Math.abs(row.value)/Math.abs(row.volume)) : '-' }}
{{ t('net.subtotal', {n: netBuyList.length}) }} {{ fmt(netBuyList.reduce((s,r)=>s+Math.abs(r.volume),0)) }} {{ fmtAmt(netBuyList.reduce((s,r)=>s+Math.abs(r.value||0),0)) }}
{{ t('block.netSell') }} {{ netSellList.length }} {{ t('lbl.records') }}  |  {{ fmt(netSellList.reduce((s,r)=>s+Math.abs(r.volume),0)) }} {{ t('unit.shares') }} {{ !isPaidPlan ? '🔒 ' : '' }}{{ t('btn.retailVsInst') }}
{{ t('col.date') }} {{ t('lbl.broker') }} {{ t('col.shares') }} {{ t('col.amount') }} {{ t('col.avgPrice') }}
{{ t('empty.setConditionAndSearch') }}
{{ t('empty.noNetSell') }}
{{ row.date.slice(5) }} {{ row.broker }} {{ fmt(Math.abs(row.volume)) }} {{ fmtAmt(Math.abs(row.value)) }} {{ row.volume ? fmtPrice(Math.abs(row.value)/Math.abs(row.volume)) : '-' }}
{{ t('net.subtotal', {n: netSellList.length}) }} {{ fmt(netSellList.reduce((s,r)=>s+Math.abs(r.volume),0)) }} {{ fmtAmt(netSellList.reduce((s,r)=>s+Math.abs(r.value||0),0)) }}
{{s.v}}{{ t('badge.realtime') }}{{s.name}}{{sectorLabel(s.sector)}}
{{ t('btn.search') }} {{ t('btn.reset') }} {{ !isPaidPlan ? '🔒 ' : '' }}{{ t('btn.retailVsInst') }} {{ !isPaidPlan ? '🔒 ' : '' }}{{ t('btn.chipDist') }}
🏦
{{ t('holding.hint.enterCriteria') }}
{{ t('holding.hint.autoSearch') }}
🔒
{{ t('plan.holdingLockedHint') }}
{{ t('holding.summary.brokerCount') }}
{{ holdingSummary.count||0 }}
{{ t('holding.summary.totalShares') }}
{{ fmt(holdingSummary.sumVolume) }} {{ t('daily.floatHoldPct') }} {{ (holdingSummary.sumVolume / holdingSummary.floatShares * 100).toFixed(2) }}%
{{ t('holding.summary.earliestDate') }}
{{ holdingEarliestDate || '-' }}
{{ t('hd.recordsTitle', {n: holdingList.length}) }}
{{ t('lbl.broker') }} {{ t('col.sharesHeld') }} {{ t('col.floatPct') }} {{ t('col.avgCost') }} {{ t('col.totalValueHeld') }} {{ t('col.startDate') }} {{ t('col.updatedAt') }} {{ t('datalabel.actions') }}
{{ t('msg.noData') }}
{{ row.broker }} {{ fmt(row.totalVolume) }} {{ row.floatShares ? (Math.abs(row.totalVolume) / row.floatShares * 100).toFixed(3) + '%' : '-' }} {{ row.totalVolume && ((row.totalVolume > 0 && row.totalValue >= 0) || (row.totalVolume < 0 && row.totalValue <= 0)) ? fmtPrice(Math.abs(row.totalValue) / Math.abs(row.totalVolume)) : '-' }} {{ fmtAmt(row.totalValue) }} {{ row.startDate }} {{ row.updatedAt }}
{{ t('msg.noData') }}
{{ row.broker }} {{ t('badge.foreign') }} {{ t('badge.major') }} {{ t('badge.retail') }}{{ row.retailPct }}% {{ t('badge.inst') }}{{ row.instPct }}%
{{ fmt(row.totalVolume) }}{{ t('unit.shares') }} {{ (Math.abs(row.totalVolume)/row.floatShares*100).toFixed(2) }}% {{ fmtAmt(row.totalValue) }} {{ t('hd.avgCost') }}₱{{ row.totalVolume?(Math.abs(row.totalValue)/Math.abs(row.totalVolume)).toFixed(3):'-' }}
{{ t('hd.from') }}{{ row.startDate }} · {{ t('hd.updated') }}{{ row.updatedAt ? row.updatedAt.slice(0,10) : '-' }}
{{ t('lbl.date') }} 🔒 {{ t('plan.upgradeHint') }} {{ mktIdxPsei.time.substring(0,5) }} {{ mktStatusLabel }} {{ mktIdxQueriedDate }}
{{ t('col.indexSector') }} {{ t('col.currentPoint') }} {{ t('col.turnover.short') }} {{ t('col.changePoint') }} {{ t('col.changePct') }} {{ t('datalabel.actions') }}
{{ mktIdxSectorName(row.sector) }} {{ fmtPoint(row.currentPoint) }} {{ row.totalVolume > 0 ? (row.totalVolume >= 1e9 ? (row.totalVolume/1e9).toFixed(2)+'B' : (row.totalVolume/1e6).toFixed(0)+'M') : '--' }} {{ row.changePoint != null ? (row.changePoint > 0 ? '+' : '') + fmtPoint(row.changePoint) : '-' }} {{ row.changePct != null ? (row.changePct > 0 ? '+' : '') + row.changePct.toFixed(2) + '%' : '-' }}
{{ t('mkt.chart.allIntraday') }}
{{ t('mkt.chart.pseiIntraday') }}
{{ t('mkt.ff.sectorTitle') }} {{ mktIdxQueriedDate }} {{ t('msg.loading') }} {{ t('mkt.ff.noData') }} {{ t('mkt.ff.clickHint') }}
{{ t('mkt.ff.overallLabel') }} · {{ t('mkt.inflow') }} +{{ (mktFFAll.buyAmount/1e6).toFixed(2) }}M · {{ t('mkt.outflow') }} -{{ (mktFFAll.sellAmount/1e6).toFixed(2) }}M · {{ t('mkt.netFlow') }} {{ mktFFAll.netAmount>=0?'+':'' }}{{ (mktFFAll.netAmount/1e6).toFixed(2) }}M
{{ t('msg.loading') }}
{{ t('msg.noData') }}
{{ t('ffhist.stat.cumulNet') }}
{{ ffHistDlg.summary.net>=0?'+':'' }}{{ ffHistDlg.summary.netM }}M
{{ t('ffhist.stat.cumulBuy') }}
+{{ ffHistDlg.summary.buyM }}M
{{ t('ffhist.stat.cumulSell') }}
-{{ ffHistDlg.summary.sellM }}M
{{ t('ffhist.stat.inOutDays') }}
↑{{ ffHistDlg.summary.inDays }} / ↓{{ ffHistDlg.summary.outDays }}
{{ ffHistDlg.summary.text }}
{{ t('mkt.leaderboard.title') }} {{ mktIdxQueriedDate }} {{ t('msg.loading') }}
{{ t('col.symbolCode') }} / {{ t('col.volAmt') }} / {{ t('col.sector') }} {{ fsrTab==='gainers'||fsrTab==='losers' ? t('col.changePct') : fsrTab==='volume' ? t('col.tradingAmt') : fsrTab==='turnover' ? t('col.turnoverRate') : t('col.foreignPct') }} {{ t('col.currentPrice') }}
🥇 🥈 🥉 {{ r.rank }} {{ r.symbol }} {{ r.changePct!=null ? (r.changePct>0?'+':'') + Number(r.changePct).toFixed(2)+'%' : '—' }} {{ fsrFmtM(r.totalValue) }} {{ r.turnoverRate!=null ? Number(r.turnoverRate).toFixed(2)+'%' : '—' }} {{ fmtPrice(r.price) }}
{{ r.changePct>0?'+':'' }}{{ Number(r.changePct).toFixed(2) }}%
{{ t('msg.noData') }}
🔒 {{ t('plan.upgradeHint') }}
{{ t('btn.search') }} {{ t('btn.reset') }} {{ t('btn.foreignStockStats') }}
{{ t('col.rank') }} {{ t('col.broker') }} {{ t('col.totalAmount') }} {{ t('col.buyAmount') }} {{ t('col.sellAmount') }} {{ t('col.netAmount') }} {{ t('datalabel.actions') }}
{{ t('empty.setConditionAndSearch') }}
{{ t('msg.noData') }}
🥇 🥈 🥉 {{ row.rank }} {{ row.fullName }} {{ t('badge.foreign') }} ( {{ t('badge.retail') }}{{ row.retailPct }}%) ( {{ t('badge.inst') }}{{ row.instPct }}%) {{ fmtAmt(row.totalAmount) }} {{ fmtAmt(row.buyAmount) }} {{ fmtAmt(row.sellAmount) }} {{ (row.buyAmount - row.sellAmount) >= 0 ? '+' : '' }}{{ fmtAmt(row.buyAmount - row.sellAmount) }} {{ t('btn.detail') }} {{ t('btn.brokerStats') }}
{{ t('hd.stockInfoMgmt') }}
{{ t('btn.marketAiRecords') }} {{ t('btn.investagramsCookie') }} {{ t('btn.investagramsBackfill') }} {{ t('btn.fixNegativeFloor') }} {{ t('dlg.pseSync.title') }} {{ t('btn.addStock') }}
{{ t('btn.search') }} {{ t('btn.clearFilter') }} {{ t('lbl.total', {n: stockFiltered.length}) }}
{{ t('msg.noData') }}
{{ row.symbol }} {{ row.companyName || '-' }} {{ row.enabled?t('status.enabled'):t('status.disabled') }}
{{ sectorLabel(row.sector) }} {{ t('col.intraday') }} PSEI
{{ t('btn.aiReport') }}
{{ t('ph.stockSymbol') }} {{ t('datalabel.companyName') }} {{ t('datalabel.listingDate') }} {{ t('datalabel.issuedShares') }} {{ t('datalabel.floatShares') }} {{ t('col.sector') }} {{ t('datalabel.subSector') }} {{ t('datalabel.status') }} {{ t('col.intraday') }} {{ t('datalabel.frontendVisible') }} PSEI {{ t('datalabel.majorBrokers') }} {{ t('datalabel.blockTradeThreshold') }} {{ t('datalabel.latestPrice') }} {{ t('datalabel.marketCap') }} {{ t('datalabel.quoteData') }} {{ t('datalabel.finData') }} {{ t('col.holdingBackfill') }} {{ t('datalabel.actions') }}
{{ row.symbol }} {{ row.companyName || '-' }} {{ row.listingDate || '-' }} {{ row.issuedShares ? fmt(row.issuedShares) : '-' }} {{ row.floatShares ? fmt(row.floatShares) : '-' }} {{ sectorLabel(row.sector) }} {{ subSectorLabel(row.subSector) || '-' }} {{ row.enabled?t('status.enabled'):t('status.disabled') }} {{ row.intradayEnabled?t('status.yes'):t('status.no') }} {{ row.frontendVisible?t('status.yes'):t('status.no') }} {{ t('lbl.yes') }} - {{ row.majorBrokers || '-' }} {{ fmt(row.blockTradeThreshold) }} ₱{{ fmtPrice(row.latestPrice) }} - ₱{{ fmtAmt(row.marketCap) }} - {{ row.quoteMinDate }} ~ {{ row.quoteMaxDate }} {{ t('msg.noData') }} {{ t('msg.noData') }} {{ investagramsProgress[row.symbol] }} - {{ t('btn.aiReport') }}
{{ t('msg.noData') }}
{{ t('lbl.perPage') }}
{{ t('btn.clearFilter') }} {{ t('btn.addBroker') }}
{{ t('lbl.total', {n: brokerFiltered.length}) }}
{{ t('dlg.broker.code') }} {{ t('dlg.broker.id') }} {{ t('dlg.broker.fullName') }} {{ t('datalabel.retailPct') }} {{ t('datalabel.instPct') }} {{ t('datalabel.remark') }} {{ t('datalabel.actions') }}
{{ row.code }} {{ t('badge.foreign') }} {{ row.brokerId || '-' }} {{ row.fullName || '-' }} {{ row.retailPct != null ? row.retailPct + '%' : '-' }} {{ row.instPct != null ? row.instPct + '%' : '-' }} {{ row.remark || '-' }}
{{ t('msg.noData') }}
{{ t('msg.noData') }}
{{ row.code }} {{ t('badge.foreign') }} {{ row.fullName || row.code }}
ID: {{ row.brokerId }} {{ t('badge.retail') }} {{ row.retailPct }}% {{ t('badge.inst') }} {{ row.instPct }}%
{{ row.remark }}
{{ t('btn.loadAccount') }}
{{ t('btn.search') }} {{ t('btn.reset') }}
{{ t('col.stock') }}{{ t('col.totalVolume') }}{{ t('col.availQty') }}{{ t('col.frozenQty') }} {{ t('col.avgPrice') }}{{ t('col.currentPrice') }}{{ t('datalabel.marketCap') }}{{ t('col.unrealizedPnl') }}{{ t('col.pnlPct') }}
{{ p.symbol }} {{ p.totalQty }} {{ p.qty }} {{ p.frozenQty }} {{ fmtAmt4(p.avgCost) }} {{ fmtAmt4(p.currentPrice) }} ₱{{ fmtAmt(p.marketValue) }} {{ fmtAmt4(p.unrealizedPnl) }} {{ Number(p.unrealizedPct).toFixed(2) }}%
{{ t('empty.positions') }}
{{ t('btn.search') }} {{ t('btn.reset') }} {{ t('btn.placeOrder') }}
{{ t('col.time') }}{{ t('col.stock') }}{{ t('col.direction') }}{{ t('col.qty') }}{{ t('quant.col.limitPrice') }}{{ t('col.frozenQty') }}{{ t('col.quantStrategy') }}{{ t('datalabel.actions') }}
{{ o.createdAt }} {{ o.symbol }} {{ o.side==='BUY'?t('trade.buy'):t('trade.sell') }} {{ o.qty }} {{ fmtAmt4(o.price) }} {{ o.frozenCash ? '₱'+fmtAmt(o.frozenCash) : '-' }} {{ o.quantStrategyCode }} -
{{ t('empty.pendingOrders') }}
{{ t('btn.search') }} {{ t('btn.reset') }} {{ t('btn.placeOrder') }}
{{ t('col.time') }}{{ t('col.stock') }}{{ t('col.direction') }}{{ t('col.qty') }}{{ t('col.execPrice') }}{{ t('quant.col.fee') }}{{ t('sim.totalRealized') }}{{ t('col.quantStrategy') }}{{ t('col.quantOrderId') }}
{{ o.updatedAt }} {{ o.symbol }} {{ o.side==='BUY'?t('trade.buy'):t('trade.sell') }} {{ o.filledQty }} {{ fmtAmt4(o.execPrice) }} {{ o.fee != null ? '₱'+fmtAmt4(o.fee) : '-' }} {{ o.realizedPnl != null ? fmtAmt4(o.realizedPnl) : '-' }} {{ o.quantStrategyCode }} - {{ o.quantOrderId }} -
{{ t('empty.filledOrders') }}
{{ t('btn.search') }} {{ t('btn.reset') }} {{ t('btn.deposit') }} {{ t('btn.withdraw') }}
{{ t('col.time') }}{{ t('col.type') }}{{ t('quant.col.amount') }}{{ t('datalabel.remark') }}
{{ f.createdAt }} {{ f.type==='DEPOSIT'?t('sim.deposit'):t('sim.withdraw') }} ₱{{ fmtAmt(f.amount) }} {{ f.note }}
{{ t('empty.fundFlows') }}
{{ t('btn.search') }} {{ t('btn.reset') }}
{{ t('col.time') }}{{ t('col.type') }}{{ t('quant.col.amount') }}{{ t('col.balanceBefore') }}{{ t('col.balanceAfter') }}{{ t('datalabel.remark') }}
{{ l.createdAt }} {{ l.type }} {{ fmtAmt4(l.amount) }} {{ fmtAmt(l.balanceBefore) }} {{ fmtAmt(l.balanceAfter) }} {{ l.note }}
{{ t('empty.logs') }}
{{ t('btn.search') }} {{ t('placeholder.all') }}
{{ t('sim.totalRealized') }}
₱{{ fmtAmt4(simPnl.totalRealized) }}
{{ t('col.unrealizedPnl') }}
₱{{ fmtAmt4(simPnl.totalUnrealized) }}
{{ t('sim.totalPnl') }}
₱{{ fmtAmt4(simPnl.totalPnl) }}
{{ t('sim.holdingValue') }}
₱{{ fmtAmt(simPnl.marketValue) }}
{{ t('col.stock') }}{{ t('col.tradeCount') }}{{ t('col.realized') }}{{ t('col.unrealized') }}{{ t('col.total') }}{{ t('col.principal') }}{{ t('col.returnPct') }}
{{ r.symbol }} {{ r.tradeCount }} {{ fmtAmt4(r.realized) }} {{ fmtAmt4(r.unrealized||0) }} {{ fmtAmt4(Number(r.realized)+Number(r.unrealized||0)) }} {{ r.principal ? fmtAmt4(r.principal) : '--' }} {{ r.principal>0 ? (r.returnPct>0?'+':'') + r.returnPct + '%' : '--' }}
{{ t('msg.noData') }}
{{ t('btn.newStrategy') }}
{{ quantFilter.status === '' ? t('status.all') : quantStatusLabel(quantFilter.status) }} {{ t('btn.search') }} {{ t('btn.clearFilter') }} {{ t('lbl.total', {n: quantStrategiesFiltered.length}) }}
{{ t('col.strategyCode') }} {{ t('col.stock') }} {{ t('datalabel.status') }} {{ t('quant.col.mode') }} {{ t('quant.col.timeRange') }} {{ t('quant.col.budget') }} {{ t('col.usedHeld') }} {{ t('col.buyCondition') }} {{ t('col.sellCondition') }} {{ t('datalabel.actions') }}
{{ quantStrategies.length ? t('msg.noMatch') : t('msg.noData') }}
{{ s.code }} {{ s.symbol }} {{ quantStatusLabel(s.status) }} {{ s.tradeMode===1?t('quant.modeSim'):t('quant.modeReal') }} {{ s.startDate }} ~ {{ s.endDate }} ₱{{ fmtAmt(s.budget) }} ₱{{ fmtAmt(s.usedAmount) }}
{{ fmt(s.heldQty) }} {{ t('unit.shares') }}
{{ s.buyCondition || '-' }}
{{ t('quant.buyBatch') }}: {{ s.buyBatch }}
{{ t('quant.pendingOrder') }}: {{ s.buyPricePct > 0 ? '+' : '' }}{{ s.buyPricePct }}%
{{ s.sellCondition || '-' }}
{{ t('quant.sellBatch') }}: {{ s.sellBatch }}
{{ t('quant.pendingOrder') }}: {{ s.sellPricePct > 0 ? '+' : '' }}{{ s.sellPricePct }}%
{{s.v}}{{s.name}}
{{ t('btn.search') }}
{{ t('col.strategyCode') }} {{ t('col.stock') }} {{ t('col.direction') }} {{ t('quant.col.batch') }} {{ t('col.qty') }} {{ t('quant.col.limitPrice') }} {{ t('quant.col.amount') }} {{ t('quant.col.fee') }} {{ t('quant.col.mode') }} {{ t('col.time') }}
{{ t('empty.quantOrders') }}
{{ o.strategyCode }} {{ o.symbol }} {{ o.side==='BUY'?t('trade.buy'):t('trade.sell') }} {{ o.batchTag }} {{ fmt(o.qty) }} {{ fmtAmt4(o.price) }} ₱{{ fmtAmt(o.amount) }} ₱{{ fmtAmt(o.fee) }} {{ o.tradeMode===1?t('val.simulation'):t('val.real') }} {{ o.createdAt }}
{{ t('monitor.lbl.status') }}
{{ status.running ? t('status.running2') : t('status.idle') }}
{{ t('monitor.lbl.mktStatus') }}
{{ mktStatusLabel || '--' }}
{{ t('monitor.lbl.nextRun') }}
{{ status.nextRunTime||'--' }}
{{ t('monitor.lbl.lastRun') }}
{{ status.lastRunTime||'--' }}
{{ t('monitor.lbl.lastResult') }}
{{ t('btn.scrapeAll') }} {{ t('dlg.stock.intradayEnabled') }} {{ t('btn.scrapeMarketIndex') }} {{ t('btn.stockAlert') }} {{ status.intradayPaused ? t('monitor.resumeLive') : t('monitor.pauseLive') }} {{ t('chk.skipWeekend') }} {{ t('chk.skipFingerprint') }}
{{ t('monitor.baBackfill.label') }}
{{ t('btn.baBackfill') }} {{ t('monitor.baBackfill.hint') }}
{{ t('monitor.miVolBackfill.label') }}
{{ t('btn.miVolBackfill') }} {{ t('monitor.miVolBackfill.hint') }}
{{ t('monitor.holdingFix.label') }} {{ t('btn.holdingFix') }} {{ t('monitor.holdingFix.hint') }}
{{ t('monitor.mktIdxLogRecover.label') }} {{ t('monitor.mktIdxLogRecover.btn') }} {{ t('monitor.mktIdxLogRecover.hint') }}
{{ t('monitor.lbl.realtimeLog') }} {{ t('monitor.lbl.autoRefresh3s') }}
{{ line }}
{{ t('monitor.empty.log') }}
{{ t('btn.search') }} {{ t('btn.reset') }}
ID {{ t('col.scrapeDate') }} {{ t('col.stock') }} {{ t('col.type') }} {{ t('datalabel.status') }} {{ t('col.scrapeCount') }} {{ t('col.finishedAt') }}
{{ t('empty.scrapeLog') }}
{{ row.id }} {{ row.date }} {{ row.symbol }} {{ row.data_type===1?t('log.trades'):t('log.netFlow') }} {{ row.status===1?t('status.success'):t('status.failed') }} {{ row.record_count }} {{ row.scraped_at }}
{{ t('monitor.cronLog') }} {{ filteredCronLog.length }} / {{ cronLogData.length }} {{ t('lbl.lines') }}
{{ cronLogData.length ? t('log.noMatch') : t('log.noLogs') }}
{{ t('monitor.webLog') }} {{ filteredWebLog.length }} / {{ webLogData.length }} {{ t('lbl.lines') }}
{{ webLogData.length ? t('log.noMatch') : t('log.noLogs') }}
{{ t('col.username') }}
{{ t('form.lbl.loginIp') }}
{{ t('form.lbl.permKeyword') }}
{{ t('form.lbl.loginTime') }}
{{ t('btn.search') }} {{ t('btn.reset') }} {{ t('admin.onlineCount', {n:filteredOnlineUsers.length, t:onlineUsers.length}) }}
{{ t('col.username') }} {{ t('form.lbl.loginTime') }} {{ t('form.lbl.loginIp') }} {{ t('col.device') }} {{ t('col.browser') }} {{ t('col.permMenus') }} {{ t('col.remainDays') }} {{ t('datalabel.actions') }}
{{ s.username }} {{ (s.loginAt||'').replace('T',' ').substring(0,19) }} {{ s.loginIp || '--' }} {{ s.device||'PC' }} {{ s.browser||'--' }} {{ s.menus }} {{ Math.ceil(s.ttlSeconds / 86400) }}{{ t('unit.days') }}
{{ onlineUsers.length ? t('msg.noMatch') : t('msg.noOnlineUsers') }}
{{ t('col.username') }}
{{ t('form.lbl.logType') }}
{{ t('placeholder.startDate') }}
{{ t('placeholder.endDate') }}
{{ t('btn.search') }} {{ t('btn.reset') }}
{{ t('col.time') }} {{ t('col.user') }} {{ t('col.type') }} {{ t('col.content') }} IP {{ t('col.device') }} {{ t('col.browser') }}
{{ row.createdAt }} {{ row.username }} {{ row.logType==='page_view' ? t('log.pageView') : t('log.opRecord') }} {{ row.action }} {{ row.ip }} {{ row.deviceType||'PC' }} {{ row.browser||'--' }}
{{ t('msg.noData') }}
{{ healthCheckedAt ? t('health.checkedAt', {time: healthCheckedAt}) : '' }} {{ t('btn.recheck') }}
{{ t('health.' + item.key) }}
{{ healthDetailText(item) }}
{{ t('health.status.' + item.status) }}
{{ t('msg.noData') }}
{{ t('admin.hdr.users') }}
{{ t('btn.addUser') }}
ID {{ t('col.username') }} {{ t('col.role') }} {{ t('plan.assignedPlan') }} {{ t('plan.validPeriod') }} {{ t('col.realName') }} {{ t('col.email') }} {{ t('col.phone') }} {{ t('datalabel.status') }} {{ t('col.createdAt') }} {{ t('datalabel.actions') }}
{{ row.id }} {{ row.username }}
{{ r }}
{{ planTierName(userPlanLevel(row)) }} {{ row.planStartedAt }} ~ {{ row.planExpiresAt }} - {{ maskName(row.realName) }} {{ maskEmail(row.email) }} {{ maskPhone(row.phone) }} {{ row.enabled===1?t('status.enabled'):t('status.disabled') }} {{ row.created_at }}
{{ t('msg.noData') }}
{{ t('admin.hdr.roles') }} {{ t('btn.addRole') }}
ID {{ t('col.roleName') }} {{ t('col.description') }} {{ t('role.planLevel') }} {{ t('col.menuPerms') }} {{ t('datalabel.actions') }}
{{ row.id }} {{ row.name }} {{ row.description }} {{ ['Free','Plus','Ultra'][row.planLevel||0] }} · ₱{{ row.monthlyPrice||0 }}/mo · ₱{{ row.yearlyPrice||0 }}/yr · 🪙{{ row.aiCoinMonthly||0 }} · ⭐{{ row.watchlistLimit||0 }}
{{ menuLabel(m) }}
{{ t('msg.noData') }}
{{ t('admin.hdr.aiCoins') }}
ID {{ t('col.user') }} {{ t('plan.assignedPlan') }} {{ t('role.resetMonth') }} {{ t('col.aiCoinBalance') }} {{ t('datalabel.actions') }}
{{ row.id }} {{ row.username }} {{ row.roleNames || '-' }} {{ row.resetMonth || '-' }} 🪙{{ row.balance }} {{ t('ai.coinLogTitle') }} {{ t('ai.addCoinBtn') }}
{{ t('msg.noData') }}
{{ t('col.configKey') }} {{ t('col.currentValue') }} {{ t('col.description') }} {{ t('datalabel.actions') }}
{{ item.configKey }} {{ item.displayValue }} {{ item.description }}
{{ t('admin.hdr.campaigns') }} {{ t('btn.newMessage') }}
{{ t('placeholder.titleKeyword') }}
{{ t('form.msgCategory') }}
{{ t('datalabel.status') }}
{{ t('form.lbl.sendDateFrom') }}
{{ t('form.lbl.sendDateTo') }}
{{ t('btn.search') }} {{ t('btn.reset') }}
ID {{ t('form.title') }} {{ t('form.lbl.category') }} {{ t('form.targetAudience') }} {{ t('col.channel') }} {{ t('datalabel.status') }} {{ t('col.sentBy') }} {{ t('col.sentAt') }}
{{ c.id }} {{ c.title }} {{ categoryLabel(c.category) }} {{ {all:t('val.targetType.all'),user_ids:t('val.targetType.specificUsers'),symbol:t('val.targetType.symbol'),sector:t('val.targetType.sector'),role:t('val.targetType.role')}[c.target_type]||c.target_type }} {{ t('val.channel.inapp') }} {{ t('val.channel.email') }} {{ t('val.channel.sms') }} {{ {draft:t('val.campaignStatus.draft'),sending:t('val.campaignStatus.sending'),done:t('val.campaignStatus.done'),failed:t('val.campaignStatus.failed')}[c.status]||c.status }} {{ c.sent_by||'-' }} {{ c.sent_at ? fmtInboxTime(c.sent_at) : '-' }}
{{ t('empty.noCampaigns') }}
{{ t('label.manualFetch') }} {{ t('news.pseTrigger') }} {{ t('news.rssTrigger') }} Yahoo Finance {{ t('news.fetchAll') }} {{ t('btn.backfillHistory') }}
{{ t('btn.kwMgr') }} {{ t('btn.addArticle') }}
{{ t('form.stockSymbol') }}
{{ t('col.sector') }}
{{ t('form.lbl.category') }}
{{ t('form.lbl.source') }}
{{ t('form.lbl.keyword') }}
{{ t('placeholder.startDate') }}
{{ t('placeholder.endDate') }}
{{ t('btn.search') }} {{ t('btn.reset') }}
{{ item.category }} {{ item.symbol }} {{ item.sector }} {{ item.title }}
{{ item.source_label }} {{ item.published_at ? item.published_at.slice(0,16) : '' }} {{ t('title.edit') }} {{ t('title.delete') }}
{{ item.summary }}
{{ t('empty.noNewsData') }}
{{ t('btn.search') }} {{ t('btn.reset') }}
{{ t('tab.stats') }} {{ t('btn.addRecord') }}
{{ t('col.date') }} {{ t('val.isForecast.yes') }} {{ t('dlg.plusRevenue.lineAGgr') }} {{ t('dlg.plusRevenue.lineBGgr') }} {{ t('col.totalGgr') }} {{ t('dlg.plusRevenue.totalOrders') }} {{ t('dlg.plusRevenue.jpAmount') }} {{ t('datalabel.remark') }} {{ t('col.updatedAt') }} {{ t('datalabel.actions') }}
{{ row.date }} {{ t('val.isForecast.yes') }} {{ t('lbl.no') }} {{ row.lineAGgr != null ? Number(row.lineAGgr).toFixed(4) : '-' }} {{ row.lineBGgr != null ? Number(row.lineBGgr).toFixed(4) : '-' }} {{ (row.lineAGgr != null || row.lineBGgr != null) ? (Number(row.lineAGgr||0) + Number(row.lineBGgr||0)).toFixed(4) : '-' }} {{ row.totalOrders != null ? Number(row.totalOrders).toFixed(4) : '-' }} {{ row.jpAmount != null ? Number(row.jpAmount).toFixed(4) : '-' }} {{ row.remark || '-' }} {{ row.updatedAt || '-' }}
{{ t('empty.noRevenue') }}
{{ t('admin.revenueTotal', {n:plusRevenueTotal}) }} {{ plusRevenueSummary.sumLineAGgr != null ? Number(plusRevenueSummary.sumLineAGgr).toFixed(4) : '-' }} {{ plusRevenueSummary.sumLineBGgr != null ? Number(plusRevenueSummary.sumLineBGgr).toFixed(4) : '-' }} {{ (plusRevenueSummary.sumLineAGgr != null || plusRevenueSummary.sumLineBGgr != null) ? (Number(plusRevenueSummary.sumLineAGgr||0) + Number(plusRevenueSummary.sumLineBGgr||0)).toFixed(4) : '-' }} {{ plusRevenueSummary.sumTotalOrders != null ? Number(plusRevenueSummary.sumTotalOrders).toFixed(4) : '-' }} {{ plusRevenueSummary.sumJpAmount != null ? Number(plusRevenueSummary.sumJpAmount).toFixed(4) : '-' }}
{{ t('revenue.avg', {n: plusRevenueTotal}) }} {{ plusRevenueSummary.sumLineAGgr != null ? (Number(plusRevenueSummary.sumLineAGgr) / plusRevenueTotal).toFixed(4) : '-' }} {{ plusRevenueSummary.sumLineBGgr != null ? (Number(plusRevenueSummary.sumLineBGgr) / plusRevenueTotal).toFixed(4) : '-' }} {{ (plusRevenueSummary.sumLineAGgr != null || plusRevenueSummary.sumLineBGgr != null) ? ((Number(plusRevenueSummary.sumLineAGgr||0) + Number(plusRevenueSummary.sumLineBGgr||0)) / plusRevenueTotal).toFixed(4) : '-' }} {{ plusRevenueSummary.sumTotalOrders != null ? (Number(plusRevenueSummary.sumTotalOrders) / plusRevenueTotal).toFixed(4) : '-' }} {{ plusRevenueSummary.sumJpAmount != null ? (Number(plusRevenueSummary.sumJpAmount) / plusRevenueTotal).toFixed(4) : '-' }}
{{ t('mode.paper') }} Philstocks ({{ t('quant.notAvail') }}) COL ({{ t('quant.notAvail') }}) DBO ({{ t('quant.notAvail') }}) {{ t('quant.dlg.initHoldingNote') }}
{{ t('btn.validate') }}
{{ quantDlg.buyCondErr }}
✓ {{ t('quant.exprValid') }}
{{ t('btn.validate') }}
{{ quantDlg.buyBatchErr }}
✓ {{ t('quant.batchValid') }}
%
{{ t('btn.validate') }}
{{ quantDlg.sellCondErr }}
✓ {{ t('quant.exprValid') }}
{{ t('btn.validate') }}
{{ quantDlg.sellBatchErr }}
✓ {{ t('quant.batchValid') }}
%
{{ locale==='en' ? 'Condition expressions determine when to trigger buy/sell. Supports MA crossovers, MACD, KDJ, price, volume, and can be freely combined with ' : '条件表达式用于判断何时触发买入或卖出。支持均线交叉、MACD、KDJ、价格、成交量等多种指标,可用 ' }}AND / OR{{ locale==='en' ? '.' : ' 任意组合。' }}
{{ locale==='en' ? '① MA Position (state-based)' : '① 均线位置(状态型)' }}
{{ locale==='en' ? 'Satisfied as long as MAs are in the specified relationship on that day; no crossover required.' : '只要当天均线处于该位置关系即满足,不要求当天发生交叉。' }}
{{ locale==='en'?'Expression':'写法' }}{{ locale==='en'?'Meaning':'含义' }}
MA5MA20=G{{ locale==='en' ? 'MA5 above MA20 (bullish alignment)' : '5日均线高于20日均线(多头排列)' }}
MA5MA20=D{{ locale==='en' ? 'MA5 below MA20 (bearish alignment)' : '5日均线低于20日均线(空头排列)' }}
MA20MA60=G / MA20MA60=D{{ locale==='en' ? 'MA20 above/below MA60' : '20日均线高于/低于60日均线' }}
MA60MA250=G / MA60MA250=D{{ locale==='en' ? 'MA60 above/below MA250' : '60日均线高于/低于250日均线' }}
{{ locale==='en' ? '② MACD / KDJ (state-based)' : '② MACD / KDJ(状态型)' }}
{{ locale==='en' ? 'Triggers whenever the state is met on that day; good for filtering in combination with MA conditions (AND usage).' : '只要当天满足状态即触发,适合配合均线条件作过滤(AND 用法)。' }}
{{ locale==='en'?'Expression':'写法' }}{{ locale==='en'?'Meaning':'含义' }}
MACD=G{{ locale==='en' ? 'MACD line above signal line (bullish)' : 'MACD线高于信号线(多头状态)' }}
MACD=D{{ locale==='en' ? 'MACD line below signal line (bearish)' : 'MACD线低于信号线(空头状态)' }}
KDJ=G{{ locale==='en' ? 'K line above D line' : 'K线高于D线' }}
KDJ=D{{ locale==='en' ? 'K line below D line' : 'K线低于D线' }}
{{ locale==='en' ? '③ Price Condition (PRC)' : '③ 价格条件(PRC)' }}
{{ locale==='en'?'Expression':'写法' }}{{ locale==='en'?'Meaning':'含义' }}
PRC > 5.00{{ locale==='en' ? 'Close above ₱5.00 (supports > >= < <=)' : '收盘价高于₱5.00(支持 > >= < <=)' }}
PRC >= MA20{{ locale==='en' ? 'Close at or above MA20 (supports MA5/10/20/60/250)' : '收盘价不低于20日均线(支持 MA5/10/20/60/250)' }}
PRC->PD1 >= 3%{{ locale==='en' ? 'Up ≥ 3% vs previous close (PD1 = prev day)' : '较前一日收盘涨幅 ≥ 3%(PD1 = 前一日)' }}
PRC->NLOW >= 10%{{ locale==='en' ? 'Up ≥ 10% from 30-day low (NLOW = recent low)' : '较近30日最低点涨幅 ≥ 10%(NLOW = 近期低点)' }}
PRC->NHIGH <= -10%{{ locale==='en' ? 'Down ≥ 10% from 30-day high (negative = drop)' : '较近30日最高点下跌 ≥ 10%(负号表示跌幅,支持负数)' }}
PRC->PD1 <= -3%{{ locale==='en' ? 'Down ≥ 3% vs previous close' : '较前一日下跌 ≥ 3%' }}
{{ locale==='en' ? '④ Volume Condition (VOL)' : '④ 成交量条件(VOL)' }}
{{ locale==='en'?'Expression':'写法' }}{{ locale==='en'?'Meaning':'含义' }}
VOL > 500000{{ locale==='en' ? 'Volume exceeds 500,000 shares' : '成交量超过50万股' }}
VOL->PD1 >= 50%{{ locale==='en' ? 'Volume up ≥ 50% vs previous day' : '成交量较前一日放大 ≥ 50%' }}
VOL->PD1 <= -20%{{ locale==='en' ? 'Volume down ≥ 20% vs previous day (negative = shrink)' : '成交量较前一日萎缩 ≥ 20%(负号表示缩量)' }}
{{ locale==='en' ? '⑤ Combined Examples' : '⑤ 组合示例' }}
{{ locale==='en'?'Example':'示例' }}{{ locale==='en'?'Meaning':'含义' }}
MA5MA20=G AND MACD=G{{ locale==='en' ? 'MA golden cross AND MACD bullish' : '均线金叉,且MACD处于多头状态' }}
MA5MA20=D OR MACD=D{{ locale==='en' ? 'MA death cross OR MACD bearish — stop loss on either' : '均线死叉,或MACD转空,任一即止损' }}
PRC >= MA20 AND VOL->PD1 >= 30%{{ locale==='en' ? 'Price above MA20 with volume expansion confirmation' : '价格站上均线,且放量确认' }}
(MA5MA20=G OR KDJ=G) AND MACD=G{{ locale==='en' ? 'Parentheses change priority' : '括号可改变优先级' }}
{{ locale==='en' ? 'Batches determine how many times to buy/sell. Format: ' : '批次决定了资金分几次买入或卖出。格式为 ' }}{{ locale==='en'?'DDay=Qty':'D天数=数量' }}{{ locale==='en' ? ', multiple batches separated by ' : ',多个批次用英文分号 ' }};{{ locale==='en' ? '.' : ' 分隔。' }}
{{ locale==='en' ? '① Day Number (after D)' : '① 天数(D后面的数字)' }}
{{ locale==='en' ? 'Trading day after trigger; D0 = trigger day itself.' : '条件触发后第几个交易日执行,D0 = 触发当天。' }}
{{ locale==='en'?'Expression':'写法' }}{{ locale==='en'?'Meaning':'含义' }}
D0{{ locale==='en' ? 'Same day as trigger' : '条件触发当天' }}
D1{{ locale==='en' ? '1st trading day after trigger' : '触发后第1个交易日' }}
D2{{ locale==='en' ? '2nd trading day after trigger, and so on' : '触发后第2个交易日,以此类推' }}
{{ locale==='en' ? '② Quantity Type' : '② 数量类型' }}
{{ locale==='en'?'Expression':'写法' }}{{ locale==='en'?'Meaning':'含义' }}
ALL{{ locale==='en' ? 'Use all available capital (full position at once)' : '使用全部可用资金(一次性全仓)' }}
50%{{ locale==='en' ? '50% of total budget (buy) or current holding (sell)' : '占总预算(买入)或持仓量(卖出)的50%' }}
REST{{ locale==='en' ? 'Remaining capital / holding — typically for final batch' : '使用剩余资金 / 剩余持仓,常用于最后一批清仓' }}
{{ locale==='en' ? '③ Common Examples' : '③ 常用示例' }}
{{ locale==='en'?'Expression':'写法' }}{{ locale==='en'?'Meaning':'含义' }}
D0=ALL{{ locale==='en' ? 'Full position on trigger day (simplest, recommended for beginners)' : '触发当天全仓买入(最简单,推荐新手使用)' }}
D0=50%;D1=50%{{ locale==='en' ? 'Half position today, fill next day' : '当天半仓建仓,次日再补满' }}
D0=30%;D1=40%;D2=REST{{ locale==='en' ? 'Build over 3 days, clear remaining on last batch' : '三天分批建仓,最后一批清完剩余资金' }}
D0=100%{{ locale==='en' ? 'Same as D0=ALL, full position (works for buy and sell)' : '同 D0=ALL,全仓(买入/卖出均适用)' }}
📌 {{ locale==='en' ? 'Notes' : '注意事项' }}
{{ locale==='en' ? '• Buy batch % = % of total budget; Sell batch % = % of holding at trigger time' : '• 买入批次的百分比 = 占总预算的比例;卖出批次的百分比 = 占触发时持仓量的比例' }}
{{ locale==='en' ? '• Batch day numbers must not repeat; recommend starting from D0 consecutively' : '• 批次天数不能重复,建议从 D0 开始连续填写' }}
{{ locale==='en' ? '• Configure complete batches for both buy and sell to ensure full entry and exit' : '• 买入和卖出请各配一套完整批次,确保能完整建仓和清仓' }}
{{ locale==='en' ? 'The limit price is automatically calculated when the condition triggers, using the closing price as reference offset by the configured percentage. Formula: ' : '挂单价是条件触发时系统自动下单的限价,以触发时刻收盘价为基准,按填写的百分比偏移计算。公式:' }}{{ locale==='en' ? 'Limit = Trigger Price × (1 + N%)' : '挂单价 = 触发时股价 × (1 + N%)' }}
{{ locale==='en' ? '① Buy Limit Price' : '① 买入挂单价' }}
{{ locale==='en' ? 'Usually a ' : '通常填' }}{{ locale==='en' ? 'positive number' : '正数' }}{{ locale==='en' ? ', bidding above market price so the seller fills immediately.' : ',出价高于当前市价,卖方立刻接单,确保买入立即成交。' }}
{{ locale==='en'?'Value':'填写值' }}{{ locale==='en'?'Trigger Price':'触发时股价' }}{{ t('quant.col.limitPrice') }}
+5%₱20.0020 × 1.05 = ₱21.00
+2%₱10.0010 × 1.02 = ₱10.20
0%₱20.00{{ locale==='en' ? 'Order at trigger price = ' : '按触发时股价直接挂单 = ' }}₱20.00
{{ locale==='en' ? '② Sell Limit Price' : '② 卖出挂单价' }}
{{ locale==='en' ? 'Usually a ' : '通常填' }}{{ locale==='en' ? 'negative number' : '负数' }}{{ locale==='en' ? ', asking below market price so the buyer fills immediately.' : ',要价低于当前市价,买方立刻接单,确保卖出立即成交。' }}
{{ locale==='en'?'Value':'填写值' }}{{ locale==='en'?'Trigger Price':'触发时股价' }}{{ t('quant.col.limitPrice') }}
-5%₱20.0020 × 0.95 = ₱19.00
-2%₱10.0010 × 0.98 = ₱9.80
0%₱20.00{{ locale==='en' ? 'Order at trigger price = ' : '按触发时股价直接挂单 = ' }}₱20.00
📌 {{ locale==='en' ? 'Notes' : '注意事项' }}
{{ locale==='en' ? '• Limit price is calculated based on the closing price on the trigger day' : '• 挂单价以条件触发当天收盘价为基准计算' }}
{{ locale==='en' ? '• 0% means order at the closing price directly' : '• 填 0% 表示按收盘价原价挂单' }}
{{ locale==='en' ? '• Larger offset = more certain fill, but slightly higher buy cost / lower sell proceeds' : '• 偏移越大成交越确定,但买入成本略高、卖出所得略低' }}
{{ t('bt.startBacktest') }}
{{ t('bt.cumPnl') }} ₱{{ fmtAmt(backtestDlg.summary.finalPnl) }} {{ backtestDlg.summary.finalRet.toFixed(2) }}%
{{ t('bt.maxGain') }} ₱{{ fmtAmt(backtestDlg.summary.maxPnl) }} {{ backtestDlg.summary.maxRet.toFixed(2) }}%
{{ t('bt.maxDrawdown') }} (?) {{ backtestDlg.summary.maxDrawdown.toFixed(2) }}% {{ t('bt.maxLossPct') }} {{ backtestDlg.summary.maxLossPct.toFixed(2) }}%
{{ t('bt.tradeCount') }} {{ t('bt.buy') }} {{ backtestDlg.summary.buyCount }} / {{ t('bt.sell') }} {{ backtestDlg.summary.sellCount }} {{ t('bt.fee') }} ₱{{ fmtAmt(backtestDlg.summary.totalFee) }}
{{ t('bt.capitalDays') }} ₱{{ fmtAmt(backtestDlg.summary.budget) }} {{ backtestDlg.summary.days }} {{ t('unit.days') }} · {{ t('bt.initHeld') }} {{ backtestDlg.summary.initialHeldQty }} {{ t('unit.shares2') }}
{{ t('lbl.buy') }} {{ t('lbl.sell') }}
{{ fmt(simDlgPosition.qty + (simDlgPosition.frozenQty||0)) }} {{ t('unit.shares2') }} ({{ t('sim.avail') }} {{ fmt(simDlgPosition.qty) }} {{ t('unit.shares2') }} 0 {{ t('unit.shares2') }} ₱{{ fmtAmt4(simQuote.currentPrice || simQuote.projectedPrice || 0) }} {{ t('sim.auction') }} {{ simQuote.changePct>0?'+':'' }}{{ Number(simQuote.changePct||0).toFixed(2) }}% {{ simQuote.date }}
{{ t('sim.ask') }}{{ n }} {{ simQuote['ask'+n+'Price'] ? fmtPrice(simQuote['ask'+n+'Price']) : '-' }} {{ simQuote['ask'+n+'Vol'] ? Number(simQuote['ask'+n+'Vol']).toLocaleString() : '-' }}
{{ t('sim.bid') }}{{ n }} {{ simQuote['bid'+n+'Price'] ? fmtPrice(simQuote['bid'+n+'Price']) : '-' }} {{ simQuote['bid'+n+'Vol'] ? Number(simQuote['bid'+n+'Vol']).toLocaleString() : '-' }}
{{ t('sim.clickPriceHint') }}
{{ t('lbl.buy') }} {{ t('lbl.sell') }}
{{ t('sim.lotSize', {n:fmt(simBoardLot)}) }}
{{ t('sim.sellExceedsWarn') }}
{{ t('sim.notHeld') }}
₱{{ fmtAmt4(simFeeEst.total) }}
{{ t('sim.principal') }} ₱{{ fmtAmt4(simFeeEst.principal) }}  + {{ t('sim.feeLbl') }} ₱{{ fmtAmt4(simFeeEst.fee) }} ({{ simOrderDlg.side==='BUY'?'0.305%':'0.905%' }})
-
{{ t('sim.fundNote') }}
{{ sysConfigDlg.key }} {{ sysConfigDlg.desc }}
{{ fmtInboxTime(inboxDetailDlg.msg.created_at) }}
{{ t('login.pwdHint') }}
{{ profileDlg.usernameError }}
{{ profileDlg.email || t('lbl.notSet') }} {{ t('btn.edit') }}
{{ profileDlg.phoneError }}
🪙{{ currentUser.aiCoinBalance ?? 0 }} {{ planTierName(currentUser.planLevel||0) }} ℹ️ {{ t('ai.coinLogTitle') }}
{{ t('plan.currentPlan') }} {{ planTierName(currentUser.planLevel||0) }}
  • {{ isPaidPlan ? t('plan.feature.historyPaid') : t('plan.feature.historyFree') }}
  • {{ t('plan.feature.aiCoin', { n: currentUser.aiCoinMonthly }) }}
  • {{ isPaidPlan ? t('plan.feature.majorBrokerPaid') : t('plan.feature.majorBrokerFree') }}
  • {{ isUltraPlan ? t('plan.feature.quantYes') : t('plan.feature.quantNo') }}
{{ t('plan.myExpiresAt') }}: {{ currentUser.planExpiresAt }} · {{ planDaysRemaining<0 ? t('plan.expiredHint') : t('plan.expiresIn',{n:planDaysRemaining}) }}
{{ t('plan.recommendUpgrade', { tier: planTierName(nextPlanTier.planLevel), monthly: nextPlanTier.monthlyPrice, yearly: nextPlanTier.yearlyPrice }) }} {{ t('plan.upgradeBtn') }}
{{ t('dlg.emailChange.newEmail') }}
{{ emailChangeDlg.emailError }}
{{ emailChangeDlg.countdown > 0 ? emailChangeDlg.countdown + t('email.countdownSuffix') : t('btn.sendCode') }}
{{ t('email.codeSentNote', {email:emailChangeDlg.newEmail}) }}
{{ t('dlg.emailChange.code') }}

{{ t('sub.note') }}

{{ t('warn.noEmail') }} {{ t('warn.noEmailDesc') }} {{ t('btn.goBind') }}
{{ t('warn.noPhone') }} {{ t('warn.noPhoneDesc') }} {{ t('btn.goBind') }}
{{ {news:t('sub.cat.news'),stock_alert:t('sub.cat.stockAlert'),system:t('sub.cat.system'),promo:t('sub.cat.promo'),trade_alert:t('sub.cat.tradeAlert'),ai_analysis:t('sub.cat.aiAnalysis')}[row.category]||row.category }} {{ {news:t('sub.desc.news'),stock_alert:t('sub.desc.stockAlert'),system:t('sub.desc.system'),promo:t('sub.desc.promo'),trade_alert:t('sub.desc.tradeAlert'),ai_analysis:t('sub.desc.aiAnalysis')}[row.category] }}
{{ t('inbox.selectAll') }}
{{ t('inbox.batchMarkRead') }} {{ t('inbox.batchDelete') }}
{{ t('nav.noMessages') }}
{{ msg.title }}
{{ fmtInboxTime(msg.created_at) }}
{{ t('idx.pseiCore') }} {{ t('idx.allComposite') }} {{ t('idx.financial') }} {{ t('idx.industrial') }} {{ t('idx.holding') }} {{ t('idx.property') }} {{ t('idx.services') }} {{ t('idx.miningOil') }}
{{ t('idx.importedDays', {n:idxHistDlg.result.totalDays}) }}
{{ sym }}: {{ days }} {{ t('unit.days') }}
{{ idxHistDlg.error }}
{{ t('admin.bulkDivNote') }}
{{ l }}
{{ t('admin.pseSyncNote') }}
{{ t('btn.selectAll') }} {{ t('btn.clearFilter') }} {{ t('admin.selectedCount', {n:pseSyncDlg.selected.length, t:stockList.filter(s=>s.enabled).length}) }}
{{ s.symbol }}
{{ t('dlg.stock.intradayHint') }} {{ t('dlg.stock.frontendVisibleHint') }} {{ t('dlg.stock.isPseiHint') }}
{{ item.broker }}{{ t('label.auto') }} {{ t('label.notConfigured') }}
{{ t('btn.add') }}
{{ t('unit.shares') }}
{{ t('dlg.investagramsCookie.hint') }}
{{ t('btn.cancel') }} {{ t('btn.save') }}
{{ t('dlg.fixNegativeFloor.hint') }}
{{ t('btn.selectAll') }} {{ t('btn.clearFilter') }} {{ t('admin.selectedCount', {n:fixNegativeFloorDlg.symbols.length, t:Object.keys(investagramsProgress).length}) }}
{{ sym }}
{{ t('btn.cancel') }} {{ t('btn.confirm') }}
{{ t('msg.investagramsRunning') }}
{{ investagramsBackfillDlg.lastRunSummary }}
{{ t('btn.selectAll') }} {{ t('btn.clearFilter') }} {{ t('admin.selectedCount', {n:investagramsBackfillDlg.symbols.length, t:stockList.filter(s=>s.enabled).length}) }}
{{ s.symbol }}
~
% %
{{ t('btn.addRecord') }}
{{ t('fin.unitHint') }}
{{ t('col.period') }} {{ t('col.revenue') }}{{ t('dlg.fin.grossProfit') }} {{ t('col.netIncome') }}EPS {{ t('col.totalAssets') }}{{ t('col.totalLiabilities') }} {{ t('col.equity') }}{{ t('col.operatingCf') }} {{ t('fin.col.netMargin') }}ROE {{ t('datalabel.actions') }}
{{ t('fin.noAnnual') }}
{{ row.period }} {{ row.revenue != null ? fmtM(row.revenue, 2) : '-' }} {{ row.grossProfit != null ? fmtM(row.grossProfit, 2) : '-' }} {{ row.netIncome != null ? fmtM(row.netIncome, 2) : '-' }} {{ row.eps != null ? Number(row.eps).toFixed(4) : '-' }} {{ row.totalAssets != null ? fmtM(row.totalAssets, 2) : '-' }} {{ row.totalLiabilities != null ? fmtM(row.totalLiabilities, 2) : '-' }} {{ row.equity != null ? fmtM(row.equity, 2) : '-' }} {{ row.operatingCf != null ? fmtM(row.operatingCf, 2) : '-' }} {{ row.revenue && row.netIncome != null ? (Number(row.netIncome)/Number(row.revenue)*100).toFixed(1)+'%' : '-' }} {{ row.equity && row.netIncome != null ? (Number(row.netIncome)/Number(row.equity)*100).toFixed(1)+'%' : '-' }}
{{ t('fin.noAnnual') }}
{{ row.period }} {{ t('fin.annualTag') }}
{{ t('fin.netIncome') }} {{ row.netIncome!=null?fmtM(row.netIncome,2):'-' }}
{{ t('fin.revenue') }} {{ row.revenue!=null?fmtM(row.revenue,2):'-' }}
{{ t('fin.grossProfit') }} {{ row.grossProfit!=null?fmtM(row.grossProfit,2):'-' }}
EPS {{ row.eps!=null?Number(row.eps).toFixed(4):'-' }}
{{ t('fin.col.netMargin') }} {{ row.revenue&&row.netIncome!=null?(Number(row.netIncome)/Number(row.revenue)*100).toFixed(1)+'%':'-' }}
ROE {{ row.equity&&row.netIncome!=null?(Number(row.netIncome)/Number(row.equity)*100).toFixed(1)+'%':'-' }}
{{ t('fin.totalAssets') }} {{ row.totalAssets!=null?fmtM(row.totalAssets,2):'-' }}
{{ t('fin.totalLiabilities') }} {{ row.totalLiabilities!=null?fmtM(row.totalLiabilities,2):'-' }}
{{ t('fin.equity') }} {{ row.equity!=null?fmtM(row.equity,2):'-' }}
{{ t('fin.operatingCf') }} {{ row.operatingCf!=null?fmtM(row.operatingCf,2):'-' }}
{{ t('fin.unitHint') }}
{{ t('col.period') }} {{ t('col.revenue') }}{{ t('dlg.fin.grossProfit') }} {{ t('col.netIncome') }}EPS {{ t('col.totalAssets') }}{{ t('col.totalLiabilities') }} {{ t('col.equity') }}{{ t('col.operatingCf') }} {{ t('fin.col.netMargin') }}ROE {{ t('datalabel.actions') }}
{{ t('fin.noQuarter') }}
{{ row.period }} {{ row.revenue != null ? fmtM(row.revenue, 2) : '-' }} {{ row.grossProfit != null ? fmtM(row.grossProfit, 2) : '-' }} {{ row.netIncome != null ? fmtM(row.netIncome, 2) : '-' }} {{ row.eps != null ? Number(row.eps).toFixed(4) : '-' }} {{ row.totalAssets != null ? fmtM(row.totalAssets, 2) : '-' }} {{ row.totalLiabilities != null ? fmtM(row.totalLiabilities, 2) : '-' }} {{ row.equity != null ? fmtM(row.equity, 2) : '-' }} {{ row.operatingCf != null ? fmtM(row.operatingCf, 2) : '-' }} {{ row.revenue && row.netIncome != null ? (Number(row.netIncome)/Number(row.revenue)*100).toFixed(1)+'%' : '-' }} {{ row.equity && row.netIncome != null ? (Number(row.netIncome)/Number(row.equity)*100).toFixed(1)+'%' : '-' }}
{{ t('fin.noQuarter') }}
{{ row.period }} {{ t('fin.quarterTag') }}
{{ t('fin.netIncome') }} {{ row.netIncome!=null?fmtM(row.netIncome,2):'-' }}
{{ t('fin.revenue') }} {{ row.revenue!=null?fmtM(row.revenue,2):'-' }}
{{ t('fin.grossProfit') }} {{ row.grossProfit!=null?fmtM(row.grossProfit,2):'-' }}
EPS {{ row.eps!=null?Number(row.eps).toFixed(4):'-' }}
{{ t('fin.col.netMargin') }} {{ row.revenue&&row.netIncome!=null?(Number(row.netIncome)/Number(row.revenue)*100).toFixed(1)+'%':'-' }}
ROE {{ row.equity&&row.netIncome!=null?(Number(row.netIncome)/Number(row.equity)*100).toFixed(1)+'%':'-' }}
{{ t('fin.totalAssets') }} {{ row.totalAssets!=null?fmtM(row.totalAssets,2):'-' }}
{{ t('fin.totalLiabilities') }} {{ row.totalLiabilities!=null?fmtM(row.totalLiabilities,2):'-' }}
{{ t('fin.equity') }} {{ row.equity!=null?fmtM(row.equity,2):'-' }}
{{ t('fin.operatingCf') }} {{ row.operatingCf!=null?fmtM(row.operatingCf,2):'-' }}
{{ t('tab.quarter') }} {{ t('tab.annual') }} {{ t('fin.chart.income') }} {{ t('fin.chart.balance') }} {{ t('fin.chart.ratio') }} EPS/CF
{{ t('label.skipKeepOriginal') }} {{ t('label.overwriteReplace') }}
{{ t('btn.startScrape') }}
{{ row.date }} {{ t('label.inserted') }} {{ t('label.updated') }} {{ t('label.skipped') }}
{{ t('histScrape.setupNote') }}
{{ t('label.skipKeepOriginal') }} {{ t('label.overwriteReplace') }}
{{ t('btn.selectAll') }} {{ t('btn.clearFilter') }} {{ t('admin.selectedCount', {n:bulkHistDlg.selected.length, t:stockList.length}) }}
{{ s.symbol }}
{{ t('btn.startScrape') }} {{ t('admin.processing', {cur:bulkHistDlg.currentIdx+1, total:bulkHistDlg.selected.length}) }} {{ t('label.allDone') }}
{{ t('col.stock') }} {{ t('datalabel.status') }} {{ t('label.inserted') }} {{ t('label.updated') }} {{ t('label.skipped') }} {{ t('col.description') }}
{{ item.symbol }} {{ t('status.pending') }} {{ t('status.running') }} {{ t('status.done') }} {{ t('val.campaignStatus.failed') }} {{ item.status==='done' ? item.inserted : '-' }} {{ item.status==='done' ? item.updated : '-' }} {{ item.status==='done' ? item.skipped : '-' }} {{ item.msg }}
{{ t('empty.selectStocksThenScrape') }}
{{ t('label.to') }}
{{ t('btn.selectAll') }} {{ t('btn.clearFilter') }} {{ t('admin.selectedCount', {n:bulkFinDlg.selected.length, t:stockList.length}) }}
{{ s.symbol }}
{{ t('btn.startScrape') }} {{ t('admin.processing', {cur:bulkFinDlg.currentIdx+1, total:bulkFinDlg.selected.length}) }} {{ t('label.allDone') }}
{{ t('col.stock') }} {{ t('datalabel.status') }} {{ t('btn.save') }} {{ t('label.skipped') }} {{ t('val.campaignStatus.failed') }} {{ t('col.description') }}
{{ item.symbol }} {{ t('status.pending') }} {{ t('status.running') }} {{ t('status.done') }} {{ t('val.campaignStatus.failed') }} {{ item.status==='done' ? item.saved : '-' }} {{ item.status==='done' ? item.skipped : '-' }} {{ item.status==='done' ? item.errors : '-' }} {{ item.msg }}
{{ t('empty.selectStocksYearThenScrape') }}
{{ t('finScrape.note') }}
{{ t('label.yearRange') }} {{ t('label.to') }} {{ t('btn.startScrape') }}
{{ t('btn.save') }} {{ t('label.skipped') }} {{ t('val.campaignStatus.failed') }} {{ row.period || '—' }} {{ row.msg }}
{{ t('finScrape.startNote') }}
{{ t('dlg.fin.periodHint') }} {{ t('tab.quarter') }} {{ t('tab.annual') }}
{{ t('fin.chart.income') }} {{ t('fin.chart.balance') }} {{ t('fin.chart.ratio') }} EPS / CF
{{ t('lbl.buyIcon') }} {{ baBuyListDisplay.length }} {{ t('lbl.records') }}
{{ t('col.date') }} {{ t('col.stock') }} {{ t('col.avgPrice') }} {{ t('col.shares') }} {{ t('col.amount') }} {{ t('col.volumePct') }} {{ t('col.amountPct') }}
{{ t('msg.noBuyData') }}
{{ row.date?.slice(5) }} {{ row.symbol }} {{ row.avgPrice != null ? fmtPrice(row.avgPrice) : '-' }} {{ fmt(row.totalVolume) }} {{ row.totalAmount != null ? fmtAmt(row.totalAmount) : '-' }} {{ row.volumePct != null ? Number(row.volumePct).toFixed(1) + '%' : '-' }} {{ row.amountPct != null ? Number(row.amountPct).toFixed(1) + '%' : '-' }}
{{ t('lbl.sellIcon') }} {{ baSellListDisplay.length }} {{ t('lbl.records') }}
{{ t('col.date') }} {{ t('col.stock') }} {{ t('col.avgPrice') }} {{ t('col.shares') }} {{ t('col.amount') }} {{ t('col.volumePct') }} {{ t('col.amountPct') }}
{{ t('msg.noSellData') }}
{{ row.date?.slice(5) }} {{ row.symbol }} {{ row.avgPrice != null ? fmtPrice(row.avgPrice) : '-' }} {{ fmt(row.totalVolume) }} {{ row.totalAmount != null ? fmtAmt(row.totalAmount) : '-' }} {{ row.volumePct != null ? Number(row.volumePct).toFixed(1) + '%' : '-' }} {{ row.amountPct != null ? Number(row.amountPct).toFixed(1) + '%' : '-' }}
{{ t('col.aiCoinBalance') }}: 🪙{{ currentUser.aiCoinBalance }} {{ planTierName(currentUser.planLevel||0) }} {{ t('ai.rechargeBtn') }}
{{ t('ai.coinLog.empty') }}
{{ row.createdAt }} {{ row.action }}· {{ row.symbol }} {{ row.cost>0?'-':'+' }}{{ Math.abs(row.cost) }} {{ t('ai.coinLog.balanceAfter') }} {{ row.balanceAfter }}
{{ addAiCoinDlg.username }}
{{ t('foreign.noData') }}
{{ t('label.dimension') }} {{ t('dim.day') }} {{ t('dim.week') }} {{ t('dim.month') }} {{ t('label.timeRange') }}
{{ t('datalabel.companyName') }}
{{ fundDlg.info.companyName || '--' }}
{{ t('col.sector') }}
{{ sectorLabel(fundDlg.info.sector) }} {{ subSectorLabel(fundDlg.info.subSector) }} --
{{ t('col.totalVolume') }}{{ t('fin.issuedSharesHint') }}
{{ fundDlg.info.issuedShares ? fmt(fundDlg.info.issuedShares) : '--' }}
{{ t('datalabel.floatShares') }}{{ t('fin.floatSharesHint') }}
{{ fundDlg.info.floatShares ? fmt(fundDlg.info.floatShares) : '--' }}
{{ t('fin.marketCap') }}{{ t('fin.marketCapHint') }}
{{ fundDlg.info.currentPrice && +fundDlg.info.currentPrice > 0 && fundDlg.info.issuedShares ? fmtAmt(fundDlg.info.currentPrice * fundDlg.info.issuedShares) + ' ₱' : '--' }}
{{ t('fin.staticPE') }}{{ t('fin.staticPEHint') }}
{{ fundPE ? fundPE.toFixed(2) + 'x' : '--' }} {{ t('fund.basedOn') }} {{ fundDlg.info.latestQuarter }}
{{ t('fin.dynPE') }}{{ t('fin.dynPEHint') }}
{{ fundDynPE != null ? fundDynPE + 'x' : '--' }} {{ t('fin.dynPEInsufficient') }}
PB{{ t('fin.pbHint') }}
{{ fundPB != null ? fundPB + 'x' : '--' }} {{ t('fund.netAsset') }} {{ fmtPrice(Number(fundDlg.info.equity)*1000000/Number(fundDlg.info.issuedShares)) }} ₱/{{ t('unit.share') }}
{{ t('fin.totalAssets') }}{{ t('fin.unitMillionHint') }}
{{ fundDlg.info.totalAssets != null ? fmtM(fundDlg.info.totalAssets, 2) + ' M' : '--' }}
{{ t('fin.totalLiabilities') }}{{ t('fin.unitMillionHint') }}
{{ fundDlg.info.totalLiabilities != null ? fmtM(fundDlg.info.totalLiabilities, 2) + ' M' : '--' }}
{{ t('fund.dataNote') }}
{{ t('fin.unitHint') }}
{{ t('col.period') }} {{ t('col.revenue') }}{{ t('col.netIncome') }} EPS{{ t('col.totalAssets') }} {{ t('col.totalLiabilities') }}{{ t('col.equity') }} {{ t('col.operatingCf') }} {{ t('fin.col.netMargin') }}ROE
{{ t('fin.noAnnual') }}
{{ row.period }} {{ row.revenue != null ? fmtM(row.revenue, 2) : '-' }} {{ row.netIncome != null ? fmtM(row.netIncome, 2) : '-' }} {{ row.eps != null ? Number(row.eps).toFixed(4) : '-' }} {{ row.totalAssets != null ? fmtM(row.totalAssets, 2) : '-' }} {{ row.totalLiabilities != null ? fmtM(row.totalLiabilities, 2) : '-' }} {{ row.equity != null ? fmtM(row.equity, 2) : '-' }} {{ row.operatingCf != null ? fmtM(row.operatingCf, 2) : '-' }} {{ row.revenue && row.netIncome != null ? (Number(row.netIncome)/Number(row.revenue)*100).toFixed(1)+'%' : '-' }} {{ row.equity && row.netIncome != null ? (Number(row.netIncome)/Number(row.equity)*100).toFixed(1)+'%' : '-' }}
{{ t('fin.noAnnual') }}
{{ row.period }} {{ t('fin.annualTag') }}
{{ t('fin.netIncome') }} {{ row.netIncome!=null?fmtM(row.netIncome,2):'-' }}
{{ t('fin.revenue') }} {{ row.revenue!=null?fmtM(row.revenue,2):'-' }}
EPS {{ row.eps!=null?Number(row.eps).toFixed(4):'-' }}
ROE {{ row.equity&&row.netIncome!=null?(Number(row.netIncome)/Number(row.equity)*100).toFixed(1)+'%':'-' }}
{{ t('fin.col.netMargin') }} {{ row.revenue&&row.netIncome!=null?(Number(row.netIncome)/Number(row.revenue)*100).toFixed(1)+'%':'-' }}
{{ t('fin.operatingCf') }} {{ row.operatingCf!=null?fmtM(row.operatingCf,2):'-' }}
{{ t('fin.totalAssets') }} {{ row.totalAssets!=null?fmtM(row.totalAssets,2):'-' }}
{{ t('fin.totalLiabilities') }} {{ row.totalLiabilities!=null?fmtM(row.totalLiabilities,2):'-' }}
{{ t('fin.equity') }} {{ row.equity!=null?fmtM(row.equity,2):'-' }}
{{ t('fin.unitHint') }}
{{ t('col.period') }} {{ t('col.revenue') }}{{ t('col.netIncome') }} EPS{{ t('col.totalAssets') }} {{ t('col.totalLiabilities') }}{{ t('col.equity') }} {{ t('col.operatingCf') }} {{ t('fin.col.netMargin') }}ROE
{{ t('fin.noQuarter') }}
{{ row.period }} {{ row.revenue != null ? fmtM(row.revenue, 2) : '-' }} {{ row.netIncome != null ? fmtM(row.netIncome, 2) : '-' }} {{ row.eps != null ? Number(row.eps).toFixed(4) : '-' }} {{ row.totalAssets != null ? fmtM(row.totalAssets, 2) : '-' }} {{ row.totalLiabilities != null ? fmtM(row.totalLiabilities, 2) : '-' }} {{ row.equity != null ? fmtM(row.equity, 2) : '-' }} {{ row.operatingCf != null ? fmtM(row.operatingCf, 2) : '-' }} {{ row.revenue && row.netIncome != null ? (Number(row.netIncome)/Number(row.revenue)*100).toFixed(1)+'%' : '-' }} {{ row.equity && row.netIncome != null ? (Number(row.netIncome)/Number(row.equity)*100).toFixed(1)+'%' : '-' }}
{{ t('fin.noQuarter') }}
{{ row.period }} {{ t('fin.quarterTag') }}
{{ t('fin.netIncome') }} {{ row.netIncome!=null?fmtM(row.netIncome,2):'-' }}
{{ t('fin.revenue') }} {{ row.revenue!=null?fmtM(row.revenue,2):'-' }}
EPS {{ row.eps!=null?Number(row.eps).toFixed(4):'-' }}
ROE {{ row.equity&&row.netIncome!=null?(Number(row.netIncome)/Number(row.equity)*100).toFixed(1)+'%':'-' }}
{{ t('fin.col.netMargin') }} {{ row.revenue&&row.netIncome!=null?(Number(row.netIncome)/Number(row.revenue)*100).toFixed(1)+'%':'-' }}
{{ t('fin.operatingCf') }} {{ row.operatingCf!=null?fmtM(row.operatingCf,2):'-' }}
{{ t('fin.totalAssets') }} {{ row.totalAssets!=null?fmtM(row.totalAssets,2):'-' }}
{{ t('fin.totalLiabilities') }} {{ row.totalLiabilities!=null?fmtM(row.totalLiabilities,2):'-' }}
{{ t('fin.equity') }} {{ row.equity!=null?fmtM(row.equity,2):'-' }}
{{ t('tab.quarter') }} {{ t('tab.annual') }} {{ t('fin.chart.income') }} {{ t('fin.chart.balance') }} {{ t('fin.chart.ratio') }} EPS/CF
{{ t('div.noRecord') }}
{{ t('col.type') }} {{ t('div.col.amount') }} {{ t('div.col.exDate') }} {{ t('div.col.recordDate') }} {{ t('div.col.payDate') }} {{ t('div.col.period') }} {{ t('datalabel.remark') }}
{{ d.dividendType }} {{ d.rateAmount }} {{ d.exDate }} {{ d.recordDate }} {{ d.paymentDate }} {{ d.ratePeriod }} {{ d.remarks }}
{{ t('block.totalCount', {n:recentBlockDlg.list.length}) }} {{ t('block.netShares') }}{{ fmt(recentBlockDlg.summary.totalVolume) }} {{ t('block.netAmount') }}{{ fmtAmt(recentBlockDlg.summary.totalAmount) }}
{{ t('col.date') }}{{ t('col.time') }} {{ t('col.direction') }} {{ t('col.shares') }} {{ t('col.amount') }} {{ t('col.avgPrice') }}
{{ t('block.noRecord') }}
{{ r.date }} {{ r.trade_time }} {{ r.direction===1 ? '▲'+t('lbl.buy') : '▼'+t('lbl.sell') }} {{ fmt(r.totalVolume) }} {{ fmtAmt(r.totalAmount) }} {{ r.totalVolume ? fmtPrice(Math.abs(r.totalAmount) / Math.abs(r.totalVolume)) : '-' }}
{{ t('block.noRecord') }}
{{ r.date.slice(5) }} {{ r.trade_time }} {{ r.direction===1 ? '▲'+t('lbl.buy') : '▼'+t('lbl.sell') }}
{{ fmt(r.totalVolume) }}{{ t('unit.shares') }} {{ fmtAmt(r.totalAmount) }} {{ t('col.avg') }}₱{{ r.totalVolume ? (Math.abs(r.totalAmount)/Math.abs(r.totalVolume)).toFixed(3) : '-' }}
{{ t('div.noData') }}
{{ t('col.type') }} {{ t('div.col.amount') }} {{ t('div.col.exDate') }} {{ t('div.col.recordDate') }} {{ t('div.col.payDate') }} {{ t('div.col.period') }} {{ t('datalabel.remark') }} {{ t('datalabel.actions') }}
{{ d.dividendType }} {{ d.rateAmount }} {{ d.exDate }} {{ d.recordDate }} {{ d.paymentDate }} {{ d.ratePeriod }} {{ d.remarks }}
{{ t('cap.sourceLabel') }}
{{ t('cap.lastMonthHint') }}
{{ t('cap.block.noData') }}
{{ t('cap.lastMonthHint') }}
{{ t('cap.initiative.noData') }}
🔒
{{ t('plan.capitalFlowLockedHint') }}
🔒
{{ t('plan.capitalFlowLockedHint') }}
# {{ t('ph.stockSymbol') }} {{ t('datalabel.companyName') }} {{ t('col.price') }} {{ t('col.changePct') }} {{ t('col.turnover') }} {{ t('datalabel.actions') }}
{{ i===0?'🥇':i===1?'🥈':i===2?'🥉':i+1 }} {{ row.symbol }} {{ row.companyName }} {{ fmtPrice(row.currentPrice) }} {{ row.changePct != null ? (row.changePct > 0 ? '+' : '') + Number(row.changePct).toFixed(2) + '%' : '-' }} {{ row.totalValue != null ? fmt(row.totalValue) : '-' }}
{{ t('alertCheck.hint') }}
{{ t('form.msgCategoryHint') }}
{{ t('form.emailBodyHint') }}
{{ t('val.targetType.all') }} {{ t('target.role') }} {{ t('val.targetType.symbol') }} {{ r.name }} {{ r.description }} {{ t('channel.inapp') }} {{ t('channel.email') }} {{ t('channel.sms') }}
{{ t('form.weight') }}
{{ t('kw.helpText1') }}
{{ t('kw.helpText2') }}
{{ t('col.type') }}
{{ t('placeholder.all') }} {{ t('kw.typeStock') }} {{ t('col.sector') }}
{{ t('form.targetLabel') }}
ID {{ t('col.type') }} {{ t('col.target') }} {{ t('form.lbl.keyword') }} {{ t('col.weight') }} {{ t('datalabel.actions') }}
{{ k.id }} {{ k.target_type==='sector' ? t('kw.typeSector') : t('kw.typeStock') }} {{ k.target }} {{ k.keyword }} {{ k.weight }} {{ t('title.edit') }} {{ t('title.delete') }}
{{ t('kw.noData') }}
{{ t('msg.noRecentHoldingData') }}
{{ t('login.pwdHint') }}
{{ t('login.pwdHint') }}
{{ planSubDlg.roleName || '-' }} {{ t('plan.roleFollowsUserHint') }} {{ t('plan.billingMonthly') }} {{ t('plan.billingYearly') }}
{{ t('plan.currentSubHint', { role: planSubDlg.existing.roleName, expiresAt: planSubDlg.existing.expiresAt }) }}
{{ aiDlg.error }}
{{ sec.title }}
{{ aiDlg.fromCache ? t('ai.fromCache') : t('ai.liveGenerated') }} · {{ aiDlg.generatedAt ? aiDlg.generatedAt.slice(0,16) : '' }} · {{ t('ai.poweredBy') }} {{ t('ai.validity') }}
{{ t('ai.chatHistory') }}
{{ msg.content }}
{{ t('ai.thinking') }}
🪙 {{ t('ai.chatCostHint', { n: currentUser.aiChatBatchSize, cost: currentUser.aiChatBatchCost }) }}
{{ t('btn.send') }}
{{ t('empty.logs') }}
{{ t('col.tradeDate') }} {{ t('col.type') }} {{ t('col.generatedAt') }} {{ t('col.forced') }} {{ t('datalabel.actions') }}
{{ r.tradeDate }} {{ r.analysisType==='intraday' ? t('ai.type.intraday') : r.analysisType==='postmarket' ? t('ai.type.postmarket') : t('ai.type.market') }} {{ r.generatedAt ? r.generatedAt.slice(0,16) : '-' }} {{ t('lbl.yes') }} - {{ t('btn.view') }} {{ t('title.delete') }}
{{ marketReviewDlg.error }}
{{ sec.title }}
🤖 {{ t('ai.generatedAt') }} {{ marketReviewDlg.generatedAt ? marketReviewDlg.generatedAt.slice(0,16) : '' }} · {{ t('ai.poweredBy') }}
{{ t('ai.chatHistory') }}
{{ msg.content }}
{{ t('ai.thinking') }}
🪙 {{ t('ai.chatCostHint', { n: currentUser.aiChatBatchSize, cost: currentUser.aiChatBatchCost }) }}
{{ t('btn.send') }}