alphax/docs/reference/schema_reference.py
2026-05-13 22:49:47 +08:00

120 lines
4.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
山寨币监控数据库Schema
与 altcoin_db.py 保持完全一致4张表
1. coin_state — 状态去重管理
2. screening_log — 每次筛选的历史记录
3. recommendation — 推荐追踪(入场→止损→止盈→最终结果)
4. price_tracking — 推荐后的价格跟踪快照
注意此文件仅作为schema参考文档实际初始化由 altcoin_db.init_db() 执行。
此文件不应被 screener/confirm 等模块直接导入调用。
"""
import os
import sqlite3
from pathlib import Path
REPO_ROOT = Path(__file__).resolve().parents[2]
DB_PATH = os.getenv("ALPHAX_DB_PATH", str(REPO_ROOT / "data" / "altcoin_monitor.db"))
def init_db():
conn = sqlite3.connect(DB_PATH)
conn.execute("PRAGMA journal_mode=WAL")
# 1. 状态去重表
conn.execute("""
CREATE TABLE IF NOT EXISTS coin_state (
symbol TEXT PRIMARY KEY,
state TEXT NOT NULL DEFAULT '蓄力',
score INTEGER DEFAULT 0,
anomaly_type TEXT DEFAULT '',
sector TEXT DEFAULT '',
leader_status TEXT DEFAULT '',
detected_at TEXT NOT NULL,
last_alert_time TEXT DEFAULT '',
last_alert_level TEXT DEFAULT '',
detail_json TEXT DEFAULT '{}'
)
""")
# 2. 筛选记录表(每次筛选全量写入)
conn.execute("""
CREATE TABLE IF NOT EXISTS screening_log (
id INTEGER PRIMARY KEY AUTOINCREMENT,
scan_time TEXT NOT NULL,
layer TEXT NOT NULL, -- '粗筛'/'细筛'/'确认'
symbol TEXT NOT NULL,
state TEXT NOT NULL, -- 蓄力/加速/爆发/过期
score INTEGER DEFAULT 0,
price REAL NOT NULL, -- 筛选时价格
signals TEXT DEFAULT '', -- 信号列表(json array)
sector TEXT DEFAULT '',
leader_status TEXT DEFAULT '',
is_meme INTEGER DEFAULT 0,
change_24h REAL DEFAULT 0,
funding_rate REAL DEFAULT 0,
detail_json TEXT DEFAULT '{}'
)
""")
# 3. 推荐表(加速/爆发时生成推荐记录,跟踪最终盈亏)
conn.execute("""
CREATE TABLE IF NOT EXISTS recommendation (
id INTEGER PRIMARY KEY AUTOINCREMENT,
symbol TEXT NOT NULL,
rec_time TEXT NOT NULL, -- 推荐时间
rec_state TEXT NOT NULL, -- 加速/爆发
rec_score INTEGER DEFAULT 0,
entry_price REAL NOT NULL, -- 推荐时价格
stop_loss REAL DEFAULT 0,
tp1 REAL DEFAULT 0,
tp2 REAL DEFAULT 0,
sector TEXT DEFAULT '',
signals TEXT DEFAULT '', -- 触发信号(json)
is_meme INTEGER DEFAULT 0,
status TEXT DEFAULT 'active', -- active/hit_tp1/hit_tp2/stopped_out/expired
current_price REAL DEFAULT 0, -- 最新跟踪价格
max_price REAL DEFAULT 0, -- 推荐后最高价
min_price REAL DEFAULT 0, -- 推荐后最低价
pnl_pct REAL DEFAULT 0, -- 当前盈亏%
max_pnl_pct REAL DEFAULT 0, -- 最大盈亏%
max_drawdown_pct REAL DEFAULT 0, -- 最大回撤%
hit_tp1_time TEXT DEFAULT '',
hit_tp2_time TEXT DEFAULT '',
stopped_out_time TEXT DEFAULT '',
expired_time TEXT DEFAULT '',
last_track_time TEXT DEFAULT '',
entry_plan_json TEXT DEFAULT '{}'
)
""")
# 4. 价格跟踪表(定时快照推荐币的当前价格)
conn.execute("""
CREATE TABLE IF NOT EXISTS price_tracking (
id INTEGER PRIMARY KEY AUTOINCREMENT,
rec_id INTEGER NOT NULL, -- 关联recommendation.id
symbol TEXT NOT NULL,
track_time TEXT NOT NULL,
price REAL NOT NULL,
pnl_pct REAL DEFAULT 0,
FOREIGN KEY (rec_id) REFERENCES recommendation(id)
)
""")
# 索引
conn.execute("CREATE INDEX IF NOT EXISTS idx_screening_time ON screening_log(scan_time)")
conn.execute("CREATE INDEX IF NOT EXISTS idx_screening_symbol ON screening_log(symbol)")
conn.execute("CREATE INDEX IF NOT EXISTS idx_rec_status ON recommendation(status)")
conn.execute("CREATE INDEX IF NOT EXISTS idx_rec_symbol ON recommendation(symbol)")
conn.execute("CREATE INDEX IF NOT EXISTS idx_rec_time ON recommendation(rec_time)")
conn.commit()
conn.close()
if __name__ == "__main__":
init_db()
print("DB Schema初始化完成4张表+5个索引")