|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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');
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|