What's New
International Currency Support
- Portfolio now supports non-USD tickers (LSE, Frankfurt, and other exchanges) — configure
defaultCurrencyinconfig.jsonand holdings are automatically converted - FX rates fetched live from Yahoo Finance (
GBPUSD=Xconvention) in a single batch per run — no extra API key needed - Sub-unit fix for exchanges quoting in fractional units: GBp/GBX (LSE pence → GBP), ILA (TASE agorot), ZAc (JSE cents) automatically divided by 100
- All prices, limit orders, dividends, suggested buy values, and portfolio stats displayed in your default currency
- Multi-currency caveat shown in emails and Telegram when the portfolio spans currencies
totalPortfolioValueUSDdeprecated in favour oftotalPortfolioValue+defaultCurrencyin config
Ticker Name Tooltips
- Company full names shown as hover tooltips on ticker symbols in all emails (daily, intraday, weekly, refresh)
- Names sourced from Yahoo Finance
longNamefield
CI & Code Quality
- GitHub Actions CI now runs on all pull requests — catches type errors and formatting drift before merge
- Prettier formatting enforced across
src/andtest/ - Unit tests (63 tests via
node:test, zero dependencies) coveringformatMoney,applyFxRate, andSUB_UNIT_FIX npm test— unit tests;npm run smoke— live API smoke tests (manual)
Bug Fixes & Improvements
- Two-stage AI analysis (Observe → Decide) improves STRONG BUY consistency by separating data parsing from decision-making
- Earnings calendar guard: hard HOLD if earnings ≤3 days, cap at BUY if ≤7 days
- Guard pipeline (
guards.ts) programmatically enforces STRONG BUY criteria as a post-AI safety net - ATR (Average True Range), Stochastic %K/%D, and OBV trend added to technical indicators
- News sentiment scoring: each headline rated bullish/bearish/neutral + impact with overall per-ticker sentiment fed to AI
- Reasoning persistence: 7-day rolling history of AI conviction trends shown to Gemini each run
- Fixed STRONG BUY over-strictness and bond ETF confidence constant
Full Changelog: v1.4.0...v1.5.0