Commit History
-
refactor(apex-datagap): serve under /api/datagap, not /api/apex
Your Nameapex_strategy_routes.py already registers GET /api/apex/news on the deployed Space and documents it in help.html, so mounting this module at the same prefix would have shadowed a live endpoint - FastAPI serves whichever router is registered first, which makes the winner an accident of import order. The two news implementations are not mergeable behind one path. The published one answers start/end epoch ints with limit up to 10000 and returns {success, component, data, count, sourceMode, dataState, coverage{...}, timestamp} over its forward_events table. This one answers symbol/since/until ISO8601 with offset paging and returns {symbol, mode, historicalBackfill, historicalBackfillReason, total, limit, offset, events, ...collectionWindow} over its own store, with word-boundary symbol tagging and explicit publishedAtAvailability. Reconciling the shapes is a product decision, not a deploy-time one. Moving the prefix takes all eleven endpoints off the collision at once rather than renamin…e7ec9cf -
test(apex-datagap): unpin the migration-ledger assertions from a single migration
Your Nametest_migration_is_idempotent asserted the ledger equals exactly ["0001_apex_news"], which made the test fail the moment a second migration was declared (0002_apex_whale) even though idempotency itself was never broken. Both assertions now compare against store.MIGRATIONS, so the test verifies the real property -- a fresh database applies every declared migration exactly once, in declaration order, and repeat runs apply nothing -- and keeps working as further migrations are added. A membership assertion on "0001_apex_news" is retained so the news migration cannot silently disappear from the list. This strengthens the assertion rather than relaxing it: the previous version could not have detected a missing or misordered migration beyond the first.9452de2 -
feat(apex-datagap): whale flow - real Vision large-trade history + forward-only on-chain
Your NameWhale flow splits into two halves with genuinely different availability, so they are implemented and labelled separately rather than blended into one number. Exchange-side large trades: REAL HISTORY. Binance Vision publishes daily aggTrades archives for USD-M futures, so historical large-trade flow with a real aggressor side is available. Side comes from the archive's maker flag: is_buyer_maker=true means the resting order was the buy, so the aggressor SOLD - an unrecognised flag is rejected rather than defaulted, because inverting this would silently invert every flow number downstream. A bucket is emitted only when it actually held a qualifying trade; an absent bucket inside a day that was read is a measured zero. A day whose archive does not exist is reported unavailable and never zero-filled. On-chain transfers: NO FREE HISTORICAL SOURCE, so forward-only. Probed 2026-08-25 from this machine, keyless or with the keys configured here: Whale Alert paid plan; the configured key is…6f28e38 -
feat(apex-datagap): forward-only news collection for all 10 APEX symbols
Your NameThe APEX research dataset carries news tags for BTCUSDT and ETHUSDT only; the other eight symbols have none. No free archive can reconstruct that history - publisher RSS endpoints expose a rolling recent window and the archive products are paid - so collection is forward-only from first run and coverage reports historicalBackfill="unavailable" with the reason. Nothing before that point is synthesized. Ticker tagging is word-boundary aware and deliberately conservative, because a mistagged row is indistinguishable from fabricated data: * asset names ("chainlink", "solana") match case-insensitively; * decorated market forms ($LINK, LINKUSDT, LINK/USD) likewise; * a BARE ticker matches only in UPPER CASE, and is suppressed entirely in uppercase-dominant headlines where casing carries no signal. So "link", "Link", "linked", "hyperlink" and "CLICK THE LINK IN BIO" never yield a LINK tag, while "LINK", "$link" and "Chainlink" do. Guards also block ETH Zurich, ADA compliance, Ada…6ea6f8e -
feat(apex-datagap): funding-rate x mark-price exact-minute join
Your NameCloses a measured gap in the APEX research dataset: every funding row carries "mark": null for 8 of 10 symbols, and BTC/ETH are only ~41% covered. Binance Vision does publish mark prices, in a separate markPriceKlines dataset, so the two archives can be joined. Join rule: a funding event's calc_time carries millisecond jitter (1609459200002 is 2 ms past the boundary), so it is assigned to bucket floor(calc_time/60000)*60000 and matched against the mark kline whose open_time equals that bucket exactly. Matching is a dict lookup - there is deliberately no nearest-neighbour search, no interpolation and no forward-fill. An unmatched minute is emitted with markPrice=null and markAvailability="unavailable". Verified against real archives: BTCUSDT 2021-01 = 93 funding events, 93 matched, 0 unavailable (coverage 1.0000, 44640 mark bars, 0 dupes). Endpoints: GET /api/apex/funding-mark, /api/apex/funding-mark/coverage Tests: 21 passing, including negative cases asserting that a missing minute…3e1acab -
Fix provider routing and overhaul Space 4 dashboard
6ddec3a
-
Add verified historical and forward APEX data pipelines
Fix compatibility OHLCV pagination; expose real funding and OI with a public Bybit fallback plus full Fear & Greed history; add daily OI, authenticated NewsData, and public-RPC whale archives; preserve the LIVE Short Hunter contract; and ship the Data Lab and truthful help documentation.535b973
-
Fix KuCoin Futures OHLCV timestamp units and fear_greed sentiment dispatch signature
Your Name- providers/kucoin_futures.py: build the OHLCV request window in epoch milliseconds instead of seconds, matching the KuCoin Futures kline API contract. Fixes 'HTTP 400: Parameter from must be milliseconds'. - providers/alternative_me.py: fear_greed() now accepts an optional, ignored symbol argument so it matches the call signature router.py's generic sentiment/news dispatch uses for every provider. Fixes 'TypeError: fear_greed() takes 0 positional arguments but 1 was given'. - tests/test_short_hunter_gateway.py: add focused regression tests for both fixes (ms window bounds/scaling, live KuCoin smoke test, fear_greed no-arg/optional-arg/router-dispatch/failure-mode cases). CryptoCompare BTC candle gap investigated separately: root cause is the provider now requiring a paid API key (HTTP 401), not a symbol-mapping bug. No code change made there pending a decision on obtaining a key.20e4c4c
-
Preserve Short Hunter datasource gateway compatibility and fixes
Verified signatureec64180 -
Clean runtime leftovers
Verified signaturea7c0cd6 -
Upload Short Hunter datasource gateway
Verified signature99e6ac3
-
Upload 1255 files
Verified signature6f9cecc -
Upload 1040 files
Verified signature3f3745b
-
Upload 513 files
Verified signature724f9c7 -
Upload 303 files
Verified signatureb068b76
-
Upload 1460 files
Verified signature96af7c9 -
Upload 389 files
Verified signature452f691
-
Upload 301 files
Verified signaturee4e4574
-
Upload 136 files
Verified signature48ae4e0