ca6ef59a14
Force refresh wipes the series in hub_kline.db before pulling from the exchange; add a Linux clear script and rename the UI button to 清库重拉. Co-authored-by: Cursor <cursoragent@cursor.com>
94 lines
3.2 KiB
Python
94 lines
3.2 KiB
Python
#!/usr/bin/env python3
|
|
"""清空中控 K 线 SQLite 缓存(hub_kline.db),便于清库后全量重拉。
|
|
|
|
用法(Linux 云服务器,在仓库根目录):
|
|
python3 scripts/clear_hub_kline_db.py --dry-run
|
|
python3 scripts/clear_hub_kline_db.py --apply
|
|
python3 scripts/clear_hub_kline_db.py --apply --exchange binance --symbol BTC/USDT --timeframe 15m
|
|
|
|
默认库路径:环境变量 HUB_KLINE_DB_PATH,或 manual_trading_hub/data/hub_kline.db
|
|
"""
|
|
from __future__ import annotations
|
|
|
|
import argparse
|
|
import os
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
ROOT = Path(__file__).resolve().parents[1]
|
|
sys.path.insert(0, str(ROOT))
|
|
|
|
from hub_kline_store import ( # noqa: E402
|
|
clear_all_bars,
|
|
clear_series_bars,
|
|
default_db_path,
|
|
init_db,
|
|
)
|
|
|
|
|
|
def main() -> int:
|
|
parser = argparse.ArgumentParser(description="Clear manual-trading-hub K-line SQLite cache.")
|
|
parser.add_argument(
|
|
"--db",
|
|
default=os.getenv("HUB_KLINE_DB_PATH", "").strip() or str(default_db_path()),
|
|
help="hub_kline.db path",
|
|
)
|
|
parser.add_argument("--exchange", default="", help="exchange_key, e.g. binance")
|
|
parser.add_argument("--symbol", default="", help="symbol, e.g. BTC/USDT")
|
|
parser.add_argument("--timeframe", default="", help="optional timeframe, e.g. 15m")
|
|
parser.add_argument("--dry-run", action="store_true", help="count only")
|
|
parser.add_argument("--apply", action="store_true", help="execute delete")
|
|
args = parser.parse_args()
|
|
|
|
db_path = Path(args.db)
|
|
if not db_path.is_file():
|
|
print(f"DB not found: {db_path}", file=sys.stderr)
|
|
return 1
|
|
|
|
init_db(db_path)
|
|
ex = (args.exchange or "").strip().lower()
|
|
sym = (args.symbol or "").strip().upper()
|
|
tf = (args.timeframe or "").strip().lower() or None
|
|
|
|
if args.dry_run and not args.apply:
|
|
import sqlite3
|
|
|
|
conn = sqlite3.connect(str(db_path))
|
|
try:
|
|
if ex and sym:
|
|
if tf:
|
|
n = conn.execute(
|
|
"SELECT COUNT(*) FROM ohlcv_bars WHERE exchange_key=? AND symbol=? AND timeframe=?",
|
|
(ex, sym, tf),
|
|
).fetchone()[0]
|
|
print(f"would delete series rows: {n} ({ex} {sym} {tf})")
|
|
else:
|
|
n = conn.execute(
|
|
"SELECT COUNT(*) FROM ohlcv_bars WHERE exchange_key=? AND symbol=?",
|
|
(ex, sym),
|
|
).fetchone()[0]
|
|
print(f"would delete symbol rows: {n} ({ex} {sym} all tf)")
|
|
else:
|
|
n = conn.execute("SELECT COUNT(*) FROM ohlcv_bars").fetchone()[0]
|
|
print(f"would delete all ohlcv_bars rows: {n}")
|
|
finally:
|
|
conn.close()
|
|
return 0
|
|
|
|
if not args.apply:
|
|
print("Specify --apply to delete (or --dry-run to preview).", file=sys.stderr)
|
|
return 1
|
|
|
|
if ex and sym:
|
|
removed = clear_series_bars(ex, sym, tf, db_path)
|
|
scope = f"{ex} {sym}" + (f" {tf}" if tf else " (all timeframes)")
|
|
print(f"cleared {removed} rows for {scope}")
|
|
else:
|
|
removed = clear_all_bars(db_path)
|
|
print(f"cleared all {removed} ohlcv_bars rows from {db_path}")
|
|
return 0
|
|
|
|
|
|
if __name__ == "__main__":
|
|
raise SystemExit(main())
|