export type MarketType = "perp" | "spot"; export type Period = "daily" | "weekly" | "monthly"; export type HorizonDays = 1 | 7 | 30; export type Signal = "bullish" | "bearish" | "neutral"; export type Confidence = "low" | "medium" | "high"; export interface Instrument { symbol: string; instId: string; market: MarketType; preIpo: boolean; maxLeverage: number | null; listedAt: string | null; baseCcy: string; } export interface Bar { ts: number; open: number; high: number; low: number; close: number; volume: number; confirmed: boolean; } export interface Ticker { instId: string; last: number; bid: number | null; ask: number | null; open24h: number | null; high24h: number | null; low24h: number | null; vol24hUsd: number; ts: number; } export interface IndexPrice { idxPx: number; ts: number; } export interface Funding { fundingRate: number | null; nextFundingTime: number | null; } export interface OpenInterest { oiUsd: number | null; ts: number; } export interface CalibrationBucket { n: number; up: number; pUp: number; avgFwdReturnPct: number; } export type CalibrationBucketName = | "strong_bear" | "bear" | "neutral" | "bull" | "strong_bull"; export interface Calibration { buckets: Record; samples: number; baseUpRate: number | null; directionalSamples: number; hitRate: number | null; } export interface RubikPositioning { oiHistory: [number, number, number, number][]; longShortAccountRatio: number | null; takerVolume: [number, number, number][]; } export interface BookLevel { price: number; size: number; } export interface OrderBook { bids: BookLevel[]; asks: BookLevel[]; ts: number; } export interface MarketSnapshot { perps: Instrument[]; spots: Instrument[]; tickers: Record; indices: Record; funding: Record; openInterest: Record; series: Record; calibrations: Record>; books?: Record; updatedAt: string; candlesRefreshedAt: string | null; tickersRefreshedAt: string | null; } export interface UniverseStatus { ready: boolean; perps: number; spots: number; preIpo: number; candlesRefreshedAt: string | null; tickersRefreshedAt: string | null; } export interface Positioning { fundingRate: number | null; nextFundingTime: number | null; openInterestUsd: number | null; oiHistory: [number, number, number, number][]; longShortAccountRatio: number | null; takerVolume: [number, number, number][]; } export interface UniverseProvider { snapshot(): MarketSnapshot | null; positioning(instId: string): Promise; orderBook?(instId: string): Promise; status?(): UniverseStatus; } export function horizonDays(period: Period): HorizonDays { if (period === "daily") return 1; if (period === "weekly") return 7; return 30; }