kensongan-prog
UserDoctrine-driven trading research agent — Claude Code project with 21 skills, dashboard, screener with Buffett quality+value tagging, journaled prospectus lifecycle. Bounded-downside risk doctrine. Research only, not financial advice.
Categories
Indexed Skills (28)
broker-sync
DEPRECATED compatibility skill for the retired MooMoo-owned SIMULATE paper flow. MooMoo paper execution is disabled; Trading Advisor now uses manual paper journaling. Do not run this as part of the current workflow.
calibration-report
Buckets CLOSED journal entries' realized R by the gate state captured at entry (RSI band, sentiment flag, RS-vs-SPY leader/laggard, sector, structural-quality flags) so the operator can see which entry conditions actually produce edge, not just an aggregate win-rate/expectancy number. Read-only analysis over the journal; never mutates it. Use whenever asked "what's working" / "should I trust RSI-oversold entries" / "am I overweight one sector's wins."
crypto-coingecko
Fetch real, timestamped crypto data from CoinGecko — prices, % changes, market cap, ATH/ATL, community sentiment votes, GitHub/dev activity, OHLC history with computed RSI/SMA/ATR indicators, and recent news headlines (via WebFetch on the coin page). Use whenever the user references any crypto asset — Bitcoin, Ethereum, alts, stablecoins, or a specific CoinGecko ID. Required before any crypto recommendation because Massive's crypto coverage is solid for prices/aggregates but lacks community sentiment, dev signals, and per-coin news.
crypto-derivatives
Fetch real, timestamped crypto derivatives positioning data from Binance Futures public API — funding rates (per-8h + annualized), open interest with trend, long/short account ratios (top traders vs retail), taker buy/sell ratio, and divergence flags. Use whenever a crypto recommendation needs a positioning/flow read — i.e. is the market crowded long, is there flush risk, is there a smart-money-vs-retail divergence. Required as part of crypto pre-trade confluence per AGENTS.md §4 (positioning is the "flow" leg) and §5 (flush risk on leveraged crowded books).
crypto-unlocks-cache
Python-callable cache for crypto token-unlock data, consumed by the dashboard's Risk Simulator §5 48h-halt gate. Seeds baseline entries for assets with no vesting schedule (BTC, ETH, stables) and assets with regular emission (SOL, BNB, XRP, HBAR). For alts with cliff/team unlocks (HYPE, ONDO, ENA, ARB, etc.), use the agent-only `crypto-unlocks` WebFetch skill to fetch tokenomist.ai data, then record it here via the `set` subcommand. Manual by design — no automation, no cron. Tokenomist.ai is a Next.js SPA so direct urllib scraping won't work; this skill is the bridge.
crypto-unlocks
Check upcoming token unlock events for any crypto asset via Tokenomist.ai (formerly TokenUnlocks). Returns the next unlock date, type (cliff vs linear), estimated size, and a YES/NO on whether the unlock falls inside the doctrine's 48-hour halt window. REQUIRED before any new directional crypto position per AGENTS.md §5 — entering a long inside the 48h pre-unlock window for an unlock > 1% of float is a doctrine violation.
dashboard
Build a self-contained HTML trading dashboard at <project_root>/dashboard.html that consolidates all wired data sources (FRED macro regime, crypto regime, halt-window timeline, watchlist with live technicals/status, journal tail) into one decision-shaping surface. Use when the user wants to view their full trading state at a glance, refresh their dashboard, or audit which names on the watchlist are Phase 1-eligible. The dashboard is static HTML — refresh by re-running the script. Optionally, server.py serves it at localhost:8789 with refresh buttons + watchlist/journal forms for terminal-free operation.
finnhub
Finnhub free-tier REST client used as a secondary US-equity data source alongside Massive/yfinance. Currently provides daily OHLCV candles, real-time quotes, basic valuation metrics, and recent company news headlines (24-72h window). Used by sector-rotation, screener, the dashboard's news glyph, and the per-row live-quote refresh button. Free tier is 60 calls/min with no daily cap — generous enough to refresh a full watchlist without budget gymnastics. Analyst rating actions are NOT sourced here (Finnhub's `/stock/upgrade-downgrade` is premium-gated, HTTP 403 on the free tier as of 2026-07-01) — the news glyph uses yfinance's `Ticker.upgrades_downgrades` instead.
hn-sentiment
Manually refresh Hacker News sentiment for watchlist tickers via the free Algolia HN search API. Per-ticker stories + top comments, engagement-scored, persisted to a local JSON cache for the sentiment-cache LLM scorer to consume. HN comments are typically more substantive than retail forum chatter, so this is the "smart-money retail" leg of the §4 sentiment stack — especially valuable for tech tickers (RDDT, MRVL, RKLB, KTOS, NVDA-class names) and crypto majors. Raw-fetch leg; pairs with reddit-sentiment + stocktwits-sentiment under the sentiment-cache aggregator.
hyperliquid-flow
Fetch on-chain perpetuals data from Hyperliquid's public API — per-coin funding (per-hour + annualized), open interest, order-book imbalance, ANY address's open positions / leverage / P&L / recent fills, and cross-venue funding comparison vs Binance. Use whenever a crypto recommendation needs Hyperliquid-specific positioning, whale-position visibility, or a Binance-vs-HL divergence read. Hyperliquid's L1 makes the orderbook AND every user's position public — unique informational edge not available on CEXes.
journal
Journal lifecycle CLI — flip a prospectus's Status field through PROSPECTUS → LIVE → CLOSED (or DEAD), append timestamped Updates entries, and auto-fill the Exit section with realized R-multiple on close. Use whenever a user reports a trigger filling, a position closing, or a setup expiring — instead of hand-editing the journal markdown. Source of truth remains journal/*.md; CLI provides atomic writes with backups and consistent formatting that the dashboard's prospectus parser keys on.
klse-announcements
Manually refresh klsescreener.com Bursa announcements (Financial Results filings, Entitlements/dividends, AGMs/EGMs, Capital Changes, Shareholding changes) for KLSE tickers into a local JSON cache that the dashboard reads. Use when the user wants a real earnings/announcement halt check on KLSE names — the Risk Simulator's KLSE earnings gate consumes this cache. Uses urllib + regex (no WebFetch) so it's runnable from any Python context. Manual by design — no automation, no cron.
klse-history
Fetch historical OHLCV data and compute technical indicators (RSI, SMA, ATR) for Bursa Malaysia tickers via yfinance. Use this whenever a KLSE recommendation requires price history, trend analysis, structure levels, ATR-based stops, or multi-indicator confluence — i.e. anything beyond a single-day snapshot. Pairs with the `klse-quote` skill (use that for fundamentals + intraday snapshot; use this for OHLCV history + technicals).
klse-news
Fetch recent news headlines AND official Bursa announcements for a specific KLSE-listed stock from klsescreener.com. Returns dated, sourced items (TheEdge, TheStar, NST, Bursa filings) including analyst rating changes, earnings releases, dividend declarations, and shareholding changes. REQUIRED for any KLSE recommendation that claims a sentiment, catalyst, event, or news edge — and for the mandatory pre-trade event-risk check (earnings, AGM, ex-dividend dates).
klse-quote
Fetch a real, timestamped quote and key fundamentals for a Bursa Malaysia (KLSE) listed stock from klsescreener.com. Use whenever the user mentions a Malaysia-listed ticker — either a 4-digit Bursa code (e.g. 1155, 5285, 7277) or the `.KL` form (e.g. 1155.KL). REQUIRED before any analysis or recommendation involving a KLSE name, because the project's primary market-data MCP (Massive) does NOT cover Bursa Malaysia.
klse-refresh
Manually refresh klsescreener.com fundamentals (P/E, P/B, NTA, ROE, dividend yield, RSI(14), 52w range, market cap) for KLSE / Bursa Malaysia tickers into a local JSON cache that the dashboard reads. Use when the user wants fresh fundamentals on KLSE names — the dashboard's KLSE grid will then surface P/E / P/B / DY / ROE columns. Uses urllib + regex parsing (no WebFetch) so it's runnable from any Python context. Manual by design — no automatic refresh, no cron.
klse-sentiment
Manually refresh KLSE (Bursa Malaysia) retail sentiment from klsescreener's per-stock community comment threads into a local JSON cache the sentiment-cache LLM scorer consumes. The Bursa-native retail leg — fills the gap StockTwits (404s on KLSE) and Reddit (thin r/Bursa_Malaysia) leave. Real, multilingual (English/Chinese/Malay) chatter, no login wall. Manual by design — no cron. REQUIRED before any §4 retail-sentiment read on a KLSE name.
macro-rates
Fetch real, timestamped US macro data via FRED (Federal Reserve Bank of St. Louis) — Fed funds rate, 2y/10y/30y Treasury yields, yield-curve spreads (10y-2y, 10y-3m), 10y TIPS real yield, 10y breakeven inflation, headline + Core CPI, headline + Core PCE, unemployment rate, monthly NFP delta, trade-weighted USD index, VIX. Returns a one-shot macro snapshot, individual series lookups, or a composite regime read (RISK-ON / RISK-OFF / NEUTRAL / mixed). Use whenever a recommendation needs macro context — rate regime, inflation trajectory, dollar trend, vol regime — or before any directional trade as a top-down sanity check on the single-name confluence.
polymarket-events
Manually refresh prediction-market implied probabilities for macro + crypto + geopolitical events from Polymarket's Gamma public-search API. No auth, no rate limit at retail-research scale. Returns the current probability + resolution date for tracked event categories (Fed rate cuts, recession, inflation, BTC/ETH price targets, geopolitical risk). Macro-confluence leg of the §4 sentiment stack — feeds the dashboard's Event Probabilities panel and the §5 halt-window doctrine. Manual by design — no automatic refresh, no cron.
reddit-sentiment
Manually refresh retail sentiment for watchlist tickers from Reddit (r/wallstreetbets, r/stocks, r/investing, r/CryptoCurrency, r/Bursa_Malaysia, per-coin subs, etc.) into a local JSON cache that the dashboard reads. Returns mention count, velocity vs 7d baseline, and the top posts per ticker. Raw-fetch leg of the retail-sentiment build — sibling of `stocktwits-sentiment`; both feed the LLM scorer in `sentiment-cache`. Manual by design — no automatic refresh, no cron. REQUIRED before any §4 retail-sentiment contrarian read.
sector-rotation
Relative-strength ranking of the 11 SPDR sector ETFs (XLK/XLF/XLV/XLY/XLP/XLE/XLI/XLB/XLU/XLRE/XLC) vs SPY over 1m/3m/6m windows. Outputs a composite vs-SPY score (50% weight on 1m, 30% on 3m, 20% on 6m) so you can see which sectors are leading vs lagging the broad market. Dashboard's Discovery panel renders this as a color-coded heat strip. Use to focus the us-screener on leading sectors and to detect narrow-market signals (only 1 green sector = fragile rally). Manual refresh, 1h cache TTL.
sentiment-cache
LLM-score raw retail-sentiment data (from reddit-sentiment and stocktwits-sentiment caches) into a composite per-ticker sentiment read with contrarian flag. Uses the authenticated OpenAI/Codex route with strict structured output and no cross-provider fallback. Output is the canonical sentiment.json that the dashboard reads. Final leg of the retail-sentiment build — consumes the raw fetchers, produces the §4 contrarian-filter signal. Manual by design — no automatic refresh, no cron.
sentiment-inline
Re-score retail sentiment using the current Claude Code session as the classifier instead of OpenRouter's free models — no metered API, no spend, and a stronger model than the free Gemma/GPT-OSS pair. A manual, session-driven alternative to the sentiment-cache LLM leg (the slow part of a build). Use when the operator wants fresh sentiment NOW without waiting on the free-tier 429 backoffs and without paying for a model. Re-scores the EXISTING raw social caches (stocktwits/reddit/hn) in place; it does not fetch new social data and does not run during automated builds.
stocktwits-sentiment
Manually refresh retail sentiment for watchlist tickers from StockTwits — per-ticker bull%/bear% from user-tagged messages, message volume, watcher count. Free public API (no auth). Sibling of `reddit-sentiment`; together they form the raw retail-sentiment layer that LLM scoring (in `sentiment-cache`) consumes. Manual by design — no automatic refresh, no cron. Covers US equities + crypto (with `.X` suffix); KLSE returns 404 gracefully and stores as no-coverage.
us-fundamentals
Fetch US equity fundamentals (P/E, P/B, ROE, margins, growth, balance sheet, analyst targets) AND earnings calendar (next earnings date with 24h-halt-window check, plus recent earnings history with beat/miss surprise %) via yfinance. REQUIRED before any US-equity recommendation that cites valuation, growth, or quality, and as part of every US pre-trade event-risk check (AGENTS.md §5 24h pre-earnings halt).
us-news
Fetch recent US-equity news headlines with per-ticker sentiment scores from Alpha Vantage's NEWS_SENTIMENT endpoint. Returns dated, sourced items with relevance scores, sentiment labels (Bearish / Somewhat-Bearish / Neutral / Somewhat-Bullish / Bullish), topic tags, and an aggregate sentiment readout. Use for any US-equity recommendation that needs a sentiment/catalyst read or an event-risk check on news flow. REQUIRED before any US-equity recommendation claims a sentiment edge, and recommended before any directional trade as part of the confluence gate.
us-screener
Discovery layer for US equities. Runs the 8 Phase 1 technical gates (trend filter, RSI 35-50, SMA20 tag, volume profile, etc.) across a curated ~180-name universe and layers Buffett-style quality+value filters on top. Outputs ranked candidate list of names that pass P1 AND meet quality/value thresholds, excluding watchlist names. Tags each candidate 💎 BUFFETT / 🏆 QUALITY / 💰 VALUE / ⚡ TECH. Cached output read by the dashboard's Discovery panel. Manual by design — no cron.
watchlist
Manage the project's watchlist.md via a CLI with four operations — add (auto-classify + auto-thesis + validate via yfinance/CoinGecko), remove (soft-delete with required reason, audit trail in Removed/retired), update (change a thesis line in-place), list (show all sections with counts). Use when the user wants to add a ticker without manual markdown editing, soft-delete a watchlist entry with a reason, change a thesis line for an existing ticker, or audit the current watchlist contents. Source of truth remains watchlist.md; CLI provides safety + automation around it.
Bio shown is the top-scored skill's repo description as a fallback — real GitHub bios land in a future update.