feat: live_executor从DB读配置,前端改完60秒内生效

- reload_live_config()每60秒从live_config表读取
- RISK_PER_TRADE_USD和MAX_POSITIONS实时更新
- 范总在前端改1R金额→保存→下次开仓自动用新值
- 不需要重启进程
This commit is contained in:
root 2026-03-02 10:58:31 +00:00
parent b0a463a22c
commit 3b6e7d8af3

View File

@ -52,10 +52,30 @@ DB_CONFIG = {
# 策略 # 策略
ENABLED_STRATEGIES = json.loads(os.getenv("LIVE_STRATEGIES", '["v52_8signals"]')) ENABLED_STRATEGIES = json.loads(os.getenv("LIVE_STRATEGIES", '["v52_8signals"]'))
# 风险参数 # 风险参数默认值会被DB live_config覆盖
RISK_PER_TRADE_USD = float(os.getenv("RISK_PER_TRADE_USD", "2")) # 测试网$2=1R RISK_PER_TRADE_USD = float(os.getenv("RISK_PER_TRADE_USD", "2"))
MAX_POSITIONS = int(os.getenv("MAX_POSITIONS", "4")) MAX_POSITIONS = int(os.getenv("MAX_POSITIONS", "4"))
FEE_RATE = 0.0005 # Taker 0.05% 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 = { SYMBOL_PRECISION = {
@ -282,6 +302,9 @@ async def execute_entry(session: aiohttp.ClientSession, signal: dict, db_conn):
t_signal = signal_ts # 信号时间戳(ms) t_signal = signal_ts # 信号时间戳(ms)
# 刷新配置每60秒从DB读一次
reload_live_config(db_conn)
# 0. 信号新鲜度检查超过2秒弃仓 # 0. 信号新鲜度检查超过2秒弃仓
SIGNAL_MAX_AGE_MS = 2000 SIGNAL_MAX_AGE_MS = 2000
signal_age_ms = time.time() * 1000 - t_signal signal_age_ms = time.time() * 1000 - t_signal