|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| CREATE TABLE IF NOT EXISTS rates (
|
| id INTEGER PRIMARY KEY AUTOINCREMENT,
|
| symbol VARCHAR(20) NOT NULL,
|
| pair VARCHAR(20) NOT NULL,
|
| price DECIMAL(20, 8) NOT NULL,
|
| ts TIMESTAMP NOT NULL,
|
| source VARCHAR(100) NOT NULL,
|
| stored_from VARCHAR(100),
|
| stored_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
|
| INDEX idx_rates_pair (pair),
|
| INDEX idx_rates_symbol (symbol),
|
| INDEX idx_rates_ts (ts),
|
| INDEX idx_rates_stored (stored_at)
|
| );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| CREATE TABLE IF NOT EXISTS pairs (
|
| id INTEGER PRIMARY KEY AUTOINCREMENT,
|
| pair VARCHAR(20) NOT NULL UNIQUE,
|
| base VARCHAR(10) NOT NULL,
|
| quote VARCHAR(10) NOT NULL,
|
| tick_size DECIMAL(20, 10) NOT NULL,
|
| min_qty DECIMAL(20, 10) NOT NULL,
|
| max_qty DECIMAL(20, 10),
|
| status VARCHAR(20) DEFAULT 'active',
|
| source VARCHAR(100) NOT NULL,
|
| stored_from VARCHAR(100),
|
| stored_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
| updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
|
| INDEX idx_pairs_base (base),
|
| INDEX idx_pairs_quote (quote),
|
| INDEX idx_pairs_status (status)
|
| );
|
|
|
|
|
|
|
|
|
|
|
| CREATE TABLE IF NOT EXISTS ohlc (
|
| id INTEGER PRIMARY KEY AUTOINCREMENT,
|
| symbol VARCHAR(20) NOT NULL,
|
| interval INTEGER NOT NULL,
|
| ts TIMESTAMP NOT NULL,
|
| open DECIMAL(20, 8) NOT NULL,
|
| high DECIMAL(20, 8) NOT NULL,
|
| low DECIMAL(20, 8) NOT NULL,
|
| close DECIMAL(20, 8) NOT NULL,
|
| volume DECIMAL(20, 8) NOT NULL,
|
| trades INTEGER,
|
| source VARCHAR(100) NOT NULL,
|
| stored_from VARCHAR(100),
|
| stored_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
|
| UNIQUE(symbol, interval, ts),
|
|
|
| INDEX idx_ohlc_symbol (symbol),
|
| INDEX idx_ohlc_interval (interval),
|
| INDEX idx_ohlc_ts (ts),
|
| INDEX idx_ohlc_composite (symbol, interval, ts)
|
| );
|
|
|
|
|
|
|
|
|
|
|
| CREATE TABLE IF NOT EXISTS market_snapshots (
|
| id INTEGER PRIMARY KEY AUTOINCREMENT,
|
| snapshot_ts TIMESTAMP NOT NULL,
|
| total_market_cap DECIMAL(20, 2),
|
| btc_dominance DECIMAL(5, 2),
|
| eth_dominance DECIMAL(5, 2),
|
| volume_24h DECIMAL(20, 2),
|
| active_cryptos INTEGER,
|
| fear_greed_index INTEGER,
|
| payload_json TEXT,
|
| source VARCHAR(100) NOT NULL,
|
| stored_from VARCHAR(100),
|
| stored_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
|
| INDEX idx_snapshots_ts (snapshot_ts),
|
| INDEX idx_snapshots_stored (stored_at)
|
| );
|
|
|
|
|
|
|
|
|
|
|
| CREATE TABLE IF NOT EXISTS news (
|
| id INTEGER PRIMARY KEY AUTOINCREMENT,
|
| article_id VARCHAR(100) UNIQUE,
|
| title VARCHAR(500) NOT NULL,
|
| url VARCHAR(1000),
|
| author VARCHAR(200),
|
| raw_text TEXT,
|
| summary TEXT,
|
| published_at TIMESTAMP,
|
| tags VARCHAR(500),
|
| sentiment_score DECIMAL(3, 2),
|
| relevance_score DECIMAL(3, 2),
|
| source VARCHAR(100) NOT NULL,
|
| fetched_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
| stored_from VARCHAR(100),
|
| stored_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
|
| INDEX idx_news_published (published_at),
|
| INDEX idx_news_sentiment (sentiment_score),
|
| INDEX idx_news_source (source)
|
| );
|
|
|
|
|
|
|
|
|
|
|
| CREATE TABLE IF NOT EXISTS sentiment (
|
| id INTEGER PRIMARY KEY AUTOINCREMENT,
|
| symbol VARCHAR(20),
|
| text_hash VARCHAR(64),
|
| score DECIMAL(3, 2) NOT NULL,
|
| label VARCHAR(20) NOT NULL,
|
| confidence DECIMAL(3, 2),
|
| summary TEXT,
|
| model VARCHAR(100) NOT NULL,
|
| features_used TEXT,
|
| generated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
| source VARCHAR(100) NOT NULL,
|
| stored_from VARCHAR(100),
|
| stored_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
|
| INDEX idx_sentiment_symbol (symbol),
|
| INDEX idx_sentiment_label (label),
|
| INDEX idx_sentiment_generated (generated_at)
|
| );
|
|
|
|
|
|
|
|
|
|
|
| CREATE TABLE IF NOT EXISTS whales (
|
| id INTEGER PRIMARY KEY AUTOINCREMENT,
|
| tx_hash VARCHAR(100) NOT NULL,
|
| chain VARCHAR(50) NOT NULL,
|
| from_addr VARCHAR(100) NOT NULL,
|
| to_addr VARCHAR(100) NOT NULL,
|
| token VARCHAR(20) NOT NULL,
|
| amount DECIMAL(30, 10) NOT NULL,
|
| amount_usd DECIMAL(20, 2) NOT NULL,
|
| gas_used DECIMAL(20, 0),
|
| gas_price DECIMAL(20, 10),
|
| block INTEGER NOT NULL,
|
| tx_at TIMESTAMP NOT NULL,
|
| tx_type VARCHAR(50),
|
| metadata TEXT,
|
| source VARCHAR(100) NOT NULL,
|
| stored_from VARCHAR(100),
|
| stored_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
|
| UNIQUE(chain, tx_hash),
|
|
|
| INDEX idx_whales_chain (chain),
|
| INDEX idx_whales_token (token),
|
| INDEX idx_whales_amount_usd (amount_usd),
|
| INDEX idx_whales_tx_at (tx_at),
|
| INDEX idx_whales_from (from_addr),
|
| INDEX idx_whales_to (to_addr)
|
| );
|
|
|
|
|
|
|
|
|
|
|
| CREATE TABLE IF NOT EXISTS onchain_events (
|
| id INTEGER PRIMARY KEY AUTOINCREMENT,
|
| event_id VARCHAR(100) UNIQUE,
|
| chain VARCHAR(50) NOT NULL,
|
| address VARCHAR(100) NOT NULL,
|
| event_type VARCHAR(50) NOT NULL,
|
| contract_addr VARCHAR(100),
|
| method VARCHAR(100),
|
| block_number INTEGER NOT NULL,
|
| tx_hash VARCHAR(100),
|
| log_index INTEGER,
|
| event_data TEXT,
|
| decoded_data TEXT,
|
| event_at TIMESTAMP NOT NULL,
|
| source VARCHAR(100) NOT NULL,
|
| stored_from VARCHAR(100),
|
| stored_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
|
| INDEX idx_onchain_chain (chain),
|
| INDEX idx_onchain_address (address),
|
| INDEX idx_onchain_type (event_type),
|
| INDEX idx_onchain_block (block_number),
|
| INDEX idx_onchain_at (event_at)
|
| );
|
|
|
|
|
|
|
|
|
|
|
| CREATE TABLE IF NOT EXISTS model_outputs (
|
| id INTEGER PRIMARY KEY AUTOINCREMENT,
|
| prediction_id VARCHAR(100) UNIQUE,
|
| model_key VARCHAR(100) NOT NULL,
|
| model_version VARCHAR(20),
|
| symbol VARCHAR(20),
|
| prediction_type VARCHAR(50) NOT NULL,
|
| horizon VARCHAR(20),
|
| score DECIMAL(5, 4) NOT NULL,
|
| confidence DECIMAL(3, 2),
|
| prediction_value DECIMAL(20, 8),
|
| lower_bound DECIMAL(20, 8),
|
| upper_bound DECIMAL(20, 8),
|
| features_json TEXT,
|
| data_json TEXT,
|
| explanation TEXT,
|
| meta_json TEXT,
|
| generated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
| valid_until TIMESTAMP,
|
| source VARCHAR(100) NOT NULL,
|
| stored_from VARCHAR(100),
|
| stored_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
|
| INDEX idx_models_key (model_key),
|
| INDEX idx_models_symbol (symbol),
|
| INDEX idx_models_type (prediction_type),
|
| INDEX idx_models_generated (generated_at),
|
| INDEX idx_models_score (score)
|
| );
|
|
|
|
|
|
|
|
|
|
|
| CREATE TABLE IF NOT EXISTS signals (
|
| id INTEGER PRIMARY KEY AUTOINCREMENT,
|
| signal_id VARCHAR(100) UNIQUE,
|
| symbol VARCHAR(20) NOT NULL,
|
| signal_type VARCHAR(50) NOT NULL,
|
| strength VARCHAR(20),
|
| score DECIMAL(5, 4) NOT NULL,
|
| confidence DECIMAL(3, 2),
|
| timeframe VARCHAR(20),
|
| entry_price DECIMAL(20, 8),
|
| target_price DECIMAL(20, 8),
|
| stop_loss DECIMAL(20, 8),
|
| risk_reward_ratio DECIMAL(5, 2),
|
| conditions TEXT,
|
| metadata TEXT,
|
| model_used VARCHAR(100),
|
| generated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
| expires_at TIMESTAMP,
|
| status VARCHAR(20) DEFAULT 'active',
|
| source VARCHAR(100) NOT NULL,
|
| stored_from VARCHAR(100),
|
| stored_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
|
| INDEX idx_signals_symbol (symbol),
|
| INDEX idx_signals_type (signal_type),
|
| INDEX idx_signals_status (status),
|
| INDEX idx_signals_generated (generated_at),
|
| INDEX idx_signals_score (score)
|
| );
|
|
|
|
|
|
|
|
|
|
|
| CREATE TABLE IF NOT EXISTS econ_reports (
|
| id INTEGER PRIMARY KEY AUTOINCREMENT,
|
| report_id VARCHAR(100) UNIQUE,
|
| currency VARCHAR(10) NOT NULL,
|
| period VARCHAR(20) NOT NULL,
|
| context VARCHAR(500),
|
| report_text TEXT NOT NULL,
|
| findings_json TEXT,
|
| metrics_json TEXT,
|
| score DECIMAL(3, 1),
|
| sentiment VARCHAR(20),
|
| risk_level VARCHAR(20),
|
| generated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
| valid_until TIMESTAMP,
|
| source VARCHAR(100) NOT NULL,
|
| stored_from VARCHAR(100),
|
| stored_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
|
| INDEX idx_econ_currency (currency),
|
| INDEX idx_econ_period (period),
|
| INDEX idx_econ_generated (generated_at)
|
| );
|
|
|
|
|
|
|
|
|
|
|
| CREATE TABLE IF NOT EXISTS api_logs (
|
| id INTEGER PRIMARY KEY AUTOINCREMENT,
|
| request_id VARCHAR(100) UNIQUE,
|
| endpoint VARCHAR(200) NOT NULL,
|
| method VARCHAR(10) NOT NULL,
|
| params TEXT,
|
| response_code INTEGER,
|
| response_time_ms INTEGER,
|
| source_used VARCHAR(100),
|
| fallback_attempted TEXT,
|
| error_message TEXT,
|
| client_ip VARCHAR(45),
|
| user_agent VARCHAR(500),
|
| created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
|
| INDEX idx_logs_endpoint (endpoint),
|
| INDEX idx_logs_created (created_at),
|
| INDEX idx_logs_response_code (response_code)
|
| );
|
|
|
|
|
|
|
|
|
|
|
| CREATE TABLE IF NOT EXISTS cache_entries (
|
| id INTEGER PRIMARY KEY AUTOINCREMENT,
|
| cache_key VARCHAR(200) NOT NULL UNIQUE,
|
| endpoint VARCHAR(200) NOT NULL,
|
| params_hash VARCHAR(64) NOT NULL,
|
| response_data TEXT NOT NULL,
|
| ttl_seconds INTEGER NOT NULL,
|
| hit_count INTEGER DEFAULT 0,
|
| created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
| expires_at TIMESTAMP NOT NULL,
|
| last_accessed TIMESTAMP,
|
|
|
| INDEX idx_cache_key (cache_key),
|
| INDEX idx_cache_expires (expires_at),
|
| INDEX idx_cache_endpoint (endpoint)
|
| );
|
|
|
|
|
|
|
|
|
|
|
|
|
| CREATE VIEW IF NOT EXISTS v_latest_rates AS
|
| SELECT
|
| pair,
|
| price,
|
| ts,
|
| source
|
| FROM rates
|
| WHERE (pair, stored_at) IN (
|
| SELECT pair, MAX(stored_at)
|
| FROM rates
|
| GROUP BY pair
|
| );
|
|
|
|
|
| CREATE VIEW IF NOT EXISTS v_market_summary AS
|
| SELECT
|
| (SELECT total_market_cap FROM market_snapshots ORDER BY snapshot_ts DESC LIMIT 1) as market_cap,
|
| (SELECT btc_dominance FROM market_snapshots ORDER BY snapshot_ts DESC LIMIT 1) as btc_dominance,
|
| (SELECT COUNT(DISTINCT pair) FROM rates WHERE stored_at > datetime('now', '-1 hour')) as active_pairs,
|
| (SELECT AVG(sentiment_score) FROM news WHERE fetched_at > datetime('now', '-24 hours')) as avg_news_sentiment;
|
|
|
|
|
| CREATE VIEW IF NOT EXISTS v_top_whales_24h AS
|
| SELECT
|
| chain,
|
| token,
|
| COUNT(*) as tx_count,
|
| SUM(amount_usd) as total_volume_usd,
|
| AVG(amount_usd) as avg_tx_usd,
|
| MAX(amount_usd) as max_tx_usd
|
| FROM whales
|
| WHERE tx_at > datetime('now', '-24 hours')
|
| GROUP BY chain, token
|
| ORDER BY total_volume_usd DESC;
|
|
|
|
|
| CREATE VIEW IF NOT EXISTS v_active_signals AS
|
| SELECT
|
| symbol,
|
| signal_type,
|
| strength,
|
| score,
|
| confidence,
|
| entry_price,
|
| target_price,
|
| stop_loss,
|
| generated_at,
|
| expires_at
|
| FROM signals
|
| WHERE status = 'active'
|
| AND (expires_at IS NULL OR expires_at > CURRENT_TIMESTAMP)
|
| ORDER BY score DESC, generated_at DESC;
|
|
|
|
|
|
|
|
|
|
|
|
|
| CREATE TRIGGER IF NOT EXISTS update_pairs_timestamp
|
| AFTER UPDATE ON pairs
|
| BEGIN
|
| UPDATE pairs SET updated_at = CURRENT_TIMESTAMP WHERE id = NEW.id;
|
| END;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| INSERT OR IGNORE INTO pairs (pair, base, quote, tick_size, min_qty, source)
|
| VALUES
|
| ('BTC/USDT', 'BTC', 'USDT', 0.01, 0.00001, 'hf'),
|
| ('ETH/USDT', 'ETH', 'USDT', 0.01, 0.0001, 'hf'),
|
| ('SOL/USDT', 'SOL', 'USDT', 0.001, 0.01, 'hf'),
|
| ('BNB/USDT', 'BNB', 'USDT', 0.01, 0.001, 'hf'),
|
| ('XRP/USDT', 'XRP', 'USDT', 0.0001, 1.0, 'hf');
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |