Files
crypto_okx/lib/instance/instance_data_stats_register.py
T

50 lines
1.6 KiB
Python

"""实例数据统计:复盘 KPI + 资金曲线 API,以及后台现金采样."""
from __future__ import annotations
from typing import Any, Callable
from flask import Flask, jsonify, request
def install_instance_data_stats(app: Flask, app_module: Any) -> None:
get_db: Callable = app_module.get_db
login_required = app_module.login_required
def _fetch_balances() -> dict[str, Any]:
ex = getattr(app_module, "exchange_options", None)
if ex is None:
return {}
from lib.exchange.okx_options_lib import fetch_options_balances
return fetch_options_balances(ex, force=False) or {}
@app.route("/api/instance/cash_curve")
@login_required
def api_instance_cash_curve():
from lib.instance.instance_cash_sample_lib import (
query_cash_series_with_db,
sample_once,
)
# 打开页面时尽量补一笔最新点(失败忽略)
try:
sample_once(get_db, _fetch_balances)
except Exception:
pass
range_key = (request.args.get("range") or "7d").strip()
conn = get_db()
try:
return jsonify(query_cash_series_with_db(conn, range_key=range_key))
except Exception as e:
return jsonify({"ok": False, "msg": f"加载资金曲线失败: {e}"}), 500
finally:
conn.close()
# 后台采样(daemon);无密钥时会空转跳过
try:
from lib.instance.instance_cash_sample_lib import start_cash_sample_loop
start_cash_sample_loop(get_db, _fetch_balances)
except Exception as e:
print(f"[instance_cash_sample] start skipped: {e}", flush=True)