在 `user_data_stream.py` 中为 `ORDER_TRADE_UPDATE` 和 `ALGO_UPDATE` 事件添加了日志记录功能,确保在接收到相关推送时能够记录事件信息。这一改进提升了系统的可追踪性和调试能力。
102 lines
3.6 KiB
Python
102 lines
3.6 KiB
Python
#!/usr/bin/env python3
|
||
"""
|
||
查询今日落入 DB 的交易记录(按创建时间 created_at,便于与币安对账时对照)。
|
||
|
||
用法:
|
||
python scripts/query_trades_today.py # 今日,默认账号
|
||
python scripts/query_trades_today.py --account 2 # 账号 2
|
||
python scripts/query_trades_today.py --date 2026-02-21 # 指定日期
|
||
python scripts/query_trades_today.py --time-filter entry # 按入场时间
|
||
python scripts/query_trades_today.py -o today_trades.json # 导出 JSON
|
||
"""
|
||
import argparse
|
||
import json
|
||
import os
|
||
import sys
|
||
from pathlib import Path
|
||
from datetime import datetime, timezone, timedelta
|
||
|
||
# 添加 backend 到路径
|
||
backend = Path(__file__).resolve().parent.parent / "backend"
|
||
if backend.exists():
|
||
sys.path.insert(0, str(backend))
|
||
|
||
BEIJING_TZ = timezone(timedelta(hours=8))
|
||
|
||
|
||
def get_today_range(date_str: str = None):
|
||
"""返回当日 00:00 和 23:59:59 的 Unix 时间戳"""
|
||
if date_str:
|
||
try:
|
||
dt = datetime.strptime(date_str, "%Y-%m-%d").replace(tzinfo=BEIJING_TZ)
|
||
except ValueError:
|
||
dt = datetime.now(BEIJING_TZ)
|
||
else:
|
||
dt = datetime.now(BEIJING_TZ)
|
||
start = dt.replace(hour=0, minute=0, second=0, microsecond=0)
|
||
end = dt.replace(hour=23, minute=59, second=59, microsecond=999999)
|
||
return int(start.timestamp()), int(end.timestamp())
|
||
|
||
|
||
def main():
|
||
parser = argparse.ArgumentParser(description="查询今日落入 DB 的交易记录")
|
||
parser.add_argument("--account", "-a", type=int, default=None, help="账号 ID,默认从 ATS_ACCOUNT_ID 或 1")
|
||
parser.add_argument("--date", "-d", type=str, default=None, help="日期 YYYY-MM-DD,默认今天")
|
||
parser.add_argument("--time-filter", "-t", choices=["created", "entry", "exit"], default="created",
|
||
help="时间筛选:created=创建时间(落库), entry=入场时间, exit=平仓时间")
|
||
parser.add_argument("--reconciled-only", action="store_true", help="仅可对账记录")
|
||
parser.add_argument("-o", "--output", type=str, help="导出到 JSON 文件")
|
||
args = parser.parse_args()
|
||
|
||
account_id = args.account
|
||
if account_id is None:
|
||
account_id = int(os.getenv("ATS_ACCOUNT_ID") or os.getenv("ACCOUNT_ID") or "1")
|
||
|
||
start_ts, end_ts = get_today_range(args.date)
|
||
date_label = args.date or datetime.now(BEIJING_TZ).strftime("%Y-%m-%d")
|
||
|
||
try:
|
||
from database.models import Trade
|
||
except ImportError as e:
|
||
print(f"无法导入 Trade 模型: {e}")
|
||
print("请确保在项目根目录运行,且 backend 可访问")
|
||
sys.exit(1)
|
||
|
||
trades = Trade.get_all(
|
||
start_timestamp=start_ts,
|
||
end_timestamp=end_ts,
|
||
symbol=None,
|
||
status=None,
|
||
account_id=account_id,
|
||
time_filter=args.time_filter,
|
||
limit=2000,
|
||
reconciled_only=args.reconciled_only,
|
||
include_sync=True,
|
||
)
|
||
|
||
# 序列化 datetime
|
||
def _serialize(obj):
|
||
if hasattr(obj, "isoformat"):
|
||
return obj.isoformat()
|
||
return obj
|
||
|
||
out = []
|
||
for t in trades:
|
||
row = dict(t)
|
||
for k, v in row.items():
|
||
if hasattr(v, "isoformat"):
|
||
row[k] = v.isoformat()
|
||
out.append(row)
|
||
|
||
print(f"账号 {account_id} | 日期 {date_label} | 按{args.time_filter} | 共 {len(out)} 条")
|
||
if args.output:
|
||
with open(args.output, "w", encoding="utf-8") as f:
|
||
json.dump(out, f, ensure_ascii=False, indent=2)
|
||
print(f"已导出到 {args.output}")
|
||
else:
|
||
print(json.dumps(out, ensure_ascii=False, indent=2, default=str))
|
||
|
||
|
||
if __name__ == "__main__":
|
||
main()
|