auto_trade_sys/scripts/query_trades_today.py
薇薇安 fc6c31dd5d feat(user_data_stream): 增强订单和算法更新事件的日志记录
在 `user_data_stream.py` 中为 `ORDER_TRADE_UPDATE` 和 `ALGO_UPDATE` 事件添加了日志记录功能,确保在接收到相关推送时能够记录事件信息。这一改进提升了系统的可追踪性和调试能力。
2026-02-21 17:09:41 +08:00

102 lines
3.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.

#!/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()