From 3b6e7d8af3e1145ff9638d4c50c107a2ef01a4bd Mon Sep 17 00:00:00 2001 From: root Date: Mon, 2 Mar 2026 10:58:31 +0000 Subject: [PATCH] =?UTF-8?q?feat:=20live=5Fexecutor=E4=BB=8EDB=E8=AF=BB?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=EF=BC=8C=E5=89=8D=E7=AB=AF=E6=94=B9=E5=AE=8C?= =?UTF-8?q?60=E7=A7=92=E5=86=85=E7=94=9F=E6=95=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - reload_live_config()每60秒从live_config表读取 - RISK_PER_TRADE_USD和MAX_POSITIONS实时更新 - 范总在前端改1R金额→保存→下次开仓自动用新值 - 不需要重启进程 --- backend/live_executor.py | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/backend/live_executor.py b/backend/live_executor.py index 6f4f70e..a7dfb30 100644 --- a/backend/live_executor.py +++ b/backend/live_executor.py @@ -52,10 +52,30 @@ DB_CONFIG = { # 策略 ENABLED_STRATEGIES = json.loads(os.getenv("LIVE_STRATEGIES", '["v52_8signals"]')) -# 风险参数 -RISK_PER_TRADE_USD = float(os.getenv("RISK_PER_TRADE_USD", "2")) # 测试网$2=1R +# 风险参数(默认值,会被DB live_config覆盖) +RISK_PER_TRADE_USD = float(os.getenv("RISK_PER_TRADE_USD", "2")) MAX_POSITIONS = int(os.getenv("MAX_POSITIONS", "4")) FEE_RATE = 0.0005 # Taker 0.05% +_config_cache = {} +_config_cache_ts = 0 + +def reload_live_config(conn): + """从live_config表读取配置,每60秒刷新一次""" + global RISK_PER_TRADE_USD, MAX_POSITIONS, _config_cache, _config_cache_ts + now = time.time() + if now - _config_cache_ts < 60: + return + try: + cur = conn.cursor() + cur.execute("SELECT key, value FROM live_config") + for row in cur.fetchall(): + _config_cache[row[0]] = row[1] + RISK_PER_TRADE_USD = float(_config_cache.get("risk_per_trade_usd", "2")) + MAX_POSITIONS = int(_config_cache.get("max_positions", "4")) + _config_cache_ts = now + logger.info(f"📋 配置刷新: 1R=${RISK_PER_TRADE_USD} | 最大持仓={MAX_POSITIONS}") + except Exception as e: + logger.warning(f"读取live_config失败: {e}") # 币种精度(币安要求) SYMBOL_PRECISION = { @@ -282,6 +302,9 @@ async def execute_entry(session: aiohttp.ClientSession, signal: dict, db_conn): t_signal = signal_ts # 信号时间戳(ms) + # 刷新配置(每60秒从DB读一次) + reload_live_config(db_conn) + # 0. 信号新鲜度检查(超过2秒弃仓) SIGNAL_MAX_AGE_MS = 2000 signal_age_ms = time.time() * 1000 - t_signal