Normalize fullwidth punctuation to ASCII across codebase.
Add scripts/normalize_ambiguous_unicode.py; fix corrupted patch_instance_theme_templates.py. Preserves curly quotes in string literals; removes Git homoglyph warnings on .env.example. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Vendored
+1
-1
@@ -1,4 +1,4 @@
|
||||
"""读写实例目录 .env(行级 upsert,原子落盘)。"""
|
||||
"""读写实例目录 .env(行级 upsert,原子落盘)."""
|
||||
from __future__ import annotations
|
||||
|
||||
import os
|
||||
|
||||
Vendored
+1
-1
@@ -1,4 +1,4 @@
|
||||
"""从 .env.example 构建 env 配置 schema(分组、敏感、重启标注)。"""
|
||||
"""从 .env.example 构建 env 配置 schema(分组,敏感,重启标注)."""
|
||||
from __future__ import annotations
|
||||
|
||||
import os
|
||||
|
||||
Vendored
+27
-27
@@ -1,4 +1,4 @@
|
||||
"""env 配置页 UI 白名单:中文标签、按交易所过滤。"""
|
||||
"""env 配置页 UI 白名单:中文标签,按交易所过滤."""
|
||||
from __future__ import annotations
|
||||
|
||||
import os
|
||||
@@ -14,32 +14,32 @@ from lib.env.env_schema import (
|
||||
parse_env_example_schema,
|
||||
)
|
||||
|
||||
# 各所「交易所与实盘」字段(顺序即页面顺序)
|
||||
# 各所「交易所与实盘」字段(顺序即页面顺序)
|
||||
_EXCHANGE_LIVE_FIELDS: dict[str, list[tuple[str, str, str]]] = {
|
||||
"okx": [
|
||||
("LIVE_TRADING_ENABLED", "开启实盘下单", "关闭时仅走本地流程,不向交易所发单"),
|
||||
("LIVE_TRADING_ENABLED", "开启实盘下单", "关闭时仅走本地流程,不向交易所发单"),
|
||||
("OKX_API_KEY", "API Key", "永续子账户"),
|
||||
("OKX_API_SECRET", "API Secret", "永续子账户"),
|
||||
("OKX_API_PASSPHRASE", "API Passphrase", "OKX 必填"),
|
||||
("OKX_TD_MODE", "保证金模式", "cross=全仓,isolated=逐仓"),
|
||||
("OKX_POS_MODE", "持仓模式", "hedge=双向,net=单向净持仓"),
|
||||
("OKX_TD_MODE", "保证金模式", "cross=全仓,isolated=逐仓"),
|
||||
("OKX_POS_MODE", "持仓模式", "hedge=双向,net=单向净持仓"),
|
||||
("OKX_POSITION_INST_TYPE", "仓位查询类型", "如 SWAP"),
|
||||
("OKX_ACCOUNT_LABEL", "账户备注", "企业微信推送中显示"),
|
||||
],
|
||||
"binance": [
|
||||
("LIVE_TRADING_ENABLED", "开启实盘下单", "关闭时仅走本地流程,不向交易所发单"),
|
||||
("LIVE_TRADING_ENABLED", "开启实盘下单", "关闭时仅走本地流程,不向交易所发单"),
|
||||
("BINANCE_API_KEY", "API Key", "永续子账户"),
|
||||
("BINANCE_API_SECRET", "API Secret", "永续子账户"),
|
||||
("BINANCE_MARGIN_MODE", "保证金模式", "cross=全仓,isolated=逐仓"),
|
||||
("BINANCE_POSITION_MODE", "持仓模式", "hedge=双向,one_way=单向"),
|
||||
("BINANCE_MARGIN_MODE", "保证金模式", "cross=全仓,isolated=逐仓"),
|
||||
("BINANCE_POSITION_MODE", "持仓模式", "hedge=双向,one_way=单向"),
|
||||
("BINANCE_ACCOUNT_LABEL", "账户备注", "企业微信推送中显示"),
|
||||
],
|
||||
"gate": [
|
||||
("LIVE_TRADING_ENABLED", "开启实盘下单", "关闭时仅走本地流程,不向交易所发单"),
|
||||
("LIVE_TRADING_ENABLED", "开启实盘下单", "关闭时仅走本地流程,不向交易所发单"),
|
||||
("GATE_API_KEY", "API Key", "永续子账户"),
|
||||
("GATE_API_SECRET", "API Secret", "永续子账户"),
|
||||
("GATE_TD_MODE", "保证金模式", "cross=全仓,isolated=逐仓"),
|
||||
("GATE_POS_MODE", "持仓模式", "hedge=双向,single=单向"),
|
||||
("GATE_TD_MODE", "保证金模式", "cross=全仓,isolated=逐仓"),
|
||||
("GATE_POS_MODE", "持仓模式", "hedge=双向,single=单向"),
|
||||
("GATE_ACCOUNT_LABEL", "账户备注", "企业微信推送中显示"),
|
||||
],
|
||||
}
|
||||
@@ -49,13 +49,13 @@ _SHARED_SECTIONS: list[dict[str, Any]] = [
|
||||
"title": "企业微信",
|
||||
"fields": [
|
||||
("WECHAT_WEBHOOK", "机器人 Webhook", "行情与风控推送地址"),
|
||||
("WECHAT_TIMEOUT_SECONDS", "推送超时(秒)", "默认 10"),
|
||||
("WECHAT_TIMEOUT_SECONDS", "推送超时(秒)", "默认 10"),
|
||||
],
|
||||
},
|
||||
{
|
||||
"title": "交易执行",
|
||||
"fields": [
|
||||
("POSITION_SIZING_MODE", "计仓模式", "risk=以损定仓,full_margin=全仓杠杆"),
|
||||
("POSITION_SIZING_MODE", "计仓模式", "risk=以损定仓,full_margin=全仓杠杆"),
|
||||
("RISK_PERCENT", "以损定仓风险%", "单笔风险占资金比例"),
|
||||
("FULL_MARGIN_BUFFER_RATIO", "全仓资金缓冲比例", "如 0.98"),
|
||||
("BTC_LEVERAGE", "BTC 默认杠杆", ""),
|
||||
@@ -63,19 +63,19 @@ _SHARED_SECTIONS: list[dict[str, Any]] = [
|
||||
("TRADE_DIRECTION_RESTRICT_ENABLED", "方向限制开关", ""),
|
||||
("TRADE_DIRECTION", "允许方向", "long_only / short_only / both"),
|
||||
("TRADE_SYMBOL_RESTRICT_ENABLED", "币种白名单开关", ""),
|
||||
("TRADE_SYMBOL_WHITELIST", "白名单币种", "逗号分隔,如 BTC,ETH"),
|
||||
("TRADING_DAY_RESET_HOUR", "交易日切点(北京时间)", "整点,默认 8"),
|
||||
("TRADE_SYMBOL_WHITELIST", "白名单币种", "逗号分隔,如 BTC,ETH"),
|
||||
("TRADING_DAY_RESET_HOUR", "交易日切点(北京时间)", "整点,默认 8"),
|
||||
("TRADING_DAY_RESET_OPEN_GUARD_ENABLED", "切点前禁止新开仓", ""),
|
||||
("MAX_ACTIVE_POSITIONS", "最大同时持仓", ""),
|
||||
("MANUAL_MIN_PLANNED_RR", "人工最低盈亏比", "如 1.4"),
|
||||
("FORCE_CLOSE_ENABLED", "强制清仓开关", ""),
|
||||
("FORCE_CLOSE_BJ_HOUR", "强制清仓整点(北京)", ""),
|
||||
("FORCE_CLOSE_BJ_HOUR", "强制清仓整点(北京)", ""),
|
||||
],
|
||||
},
|
||||
{
|
||||
"title": "交易风控",
|
||||
"fields": [
|
||||
("DAILY_OPEN_ALERT_THRESHOLD", "单日开仓提醒阈值", "达次数后 AI 提醒,不拦单"),
|
||||
("DAILY_OPEN_ALERT_THRESHOLD", "单日开仓提醒阈值", "达次数后 AI 提醒,不拦单"),
|
||||
("DAILY_OPEN_HARD_LIMIT", "单日开仓硬上限", "0=不启用"),
|
||||
],
|
||||
},
|
||||
@@ -83,8 +83,8 @@ _SHARED_SECTIONS: list[dict[str, Any]] = [
|
||||
"title": "账户冷静期",
|
||||
"fields": [
|
||||
("RISK_CONTROL_ENABLED", "冷静期总开关", ""),
|
||||
("RISK_COOLING_HOURS_MANUAL", "手动平仓冷静(小时)", ""),
|
||||
("RISK_COOLING_HOURS_MANUAL_JOURNAL", "复盘情绪冷静(小时)", ""),
|
||||
("RISK_COOLING_HOURS_MANUAL", "手动平仓冷静(小时)", ""),
|
||||
("RISK_COOLING_HOURS_MANUAL_JOURNAL", "复盘情绪冷静(小时)", ""),
|
||||
("RISK_MANUAL_CLOSE_DAILY_LIMIT", "日手动平仓次数上限", ""),
|
||||
("RISK_MOOD_ISSUES_DAILY_FREEZE", "情绪标签日冻结", ""),
|
||||
],
|
||||
@@ -93,19 +93,19 @@ _SHARED_SECTIONS: list[dict[str, Any]] = [
|
||||
"title": "自动划转",
|
||||
"fields": [
|
||||
("AUTO_TRANSFER_ENABLED", "启用自动划转", ""),
|
||||
("AUTO_TRANSFER_AMOUNT", "目标余额(U)", "交易账户目标 USDT"),
|
||||
("AUTO_TRANSFER_AMOUNT", "目标余额(U)", "交易账户目标 USDT"),
|
||||
("AUTO_TRANSFER_FROM", "划出账户", "funding 或 swap"),
|
||||
("AUTO_TRANSFER_TO", "划入账户", "swap 或 funding"),
|
||||
("AUTO_TRANSFER_BJ_HOUR", "执行整点(北京时间)", ""),
|
||||
("AUTO_TRANSFER_BJ_HOUR", "执行整点(北京时间)", ""),
|
||||
("TRANSFER_CCY", "划转币种", "默认 USDT"),
|
||||
],
|
||||
},
|
||||
{
|
||||
"title": "当日资金",
|
||||
"fields": [
|
||||
("DAILY_START_CAPITAL", "日起始基数(U)", ""),
|
||||
("DAILY_LOSS_CAPITAL", "回撤后基数(U)", ""),
|
||||
("DAILY_PROFIT_CAPITAL", "盈利后基数(U)", ""),
|
||||
("DAILY_START_CAPITAL", "日起始基数(U)", ""),
|
||||
("DAILY_LOSS_CAPITAL", "回撤后基数(U)", ""),
|
||||
("DAILY_PROFIT_CAPITAL", "盈利后基数(U)", ""),
|
||||
],
|
||||
},
|
||||
]
|
||||
@@ -115,18 +115,18 @@ _OPTIONS_SECTION: dict[str, Any] = {
|
||||
"exchanges": frozenset({"okx"}),
|
||||
"fields": [
|
||||
("OKX_OPTIONS_ENABLED", "启用期权模块", ""),
|
||||
("OKX_OPTIONS_API_KEY", "期权 API Key", "主账户,与永续子账户分离"),
|
||||
("OKX_OPTIONS_API_KEY", "期权 API Key", "主账户,与永续子账户分离"),
|
||||
("OKX_OPTIONS_API_SECRET", "期权 API Secret", ""),
|
||||
("OKX_OPTIONS_API_PASSPHRASE", "期权 API Passphrase", ""),
|
||||
("OKX_OPTIONS_ACCOUNT_LABEL", "期权账户备注", ""),
|
||||
("OKX_OPTIONS_TRADE_BUDGET_USDC", "单笔预算(USDC)", ""),
|
||||
("OKX_OPTIONS_TRADE_BUDGET_USDC", "单笔预算(USDC)", ""),
|
||||
("OKX_OPTIONS_BUDGET_BUFFER", "预算缓冲比例", "如 0.95"),
|
||||
("OKX_OPTIONS_DEFAULT_UNDERLY", "默认标的", "如 ETH"),
|
||||
],
|
||||
}
|
||||
|
||||
|
||||
# 与运行时 os.getenv 默认一致;.env 未写明时展示实际生效值(同风控说明页)
|
||||
# 与运行时 os.getenv 默认一致;.env 未写明时展示实际生效值(同风控说明页)
|
||||
_RUNTIME_ENV_DEFAULTS: dict[str, str] = {
|
||||
"RISK_CONTROL_ENABLED": "true",
|
||||
"RISK_COOLING_HOURS_MANUAL": "4",
|
||||
|
||||
Vendored
+6
-6
@@ -1,4 +1,4 @@
|
||||
"""中控统一 AI 环境变量:字段定义、读写、同步三实例。"""
|
||||
"""中控统一 AI 环境变量:字段定义,读写,同步三实例."""
|
||||
from __future__ import annotations
|
||||
|
||||
import os
|
||||
@@ -26,7 +26,7 @@ AI_ENV_FIELDS: list[tuple[str, str, str]] = [
|
||||
("OPENAI_MODEL", "云端模型", ""),
|
||||
("OLLAMA_API", "Ollama 地址", "本地服务 URL"),
|
||||
("AI_MODEL", "Ollama 模型", ""),
|
||||
("AI_TIMEOUT_SECONDS", "请求超时(秒)", "默认 120"),
|
||||
("AI_TIMEOUT_SECONDS", "请求超时(秒)", "默认 120"),
|
||||
]
|
||||
|
||||
AI_ENV_KEYS = frozenset(k for k, _l, _n in AI_ENV_FIELDS)
|
||||
@@ -108,7 +108,7 @@ def build_ai_env_payload(env_path: str | None = None, example_path: str | None =
|
||||
|
||||
|
||||
def ai_sync_status() -> dict[str, Any]:
|
||||
"""比较 hub 与三实例 AI 键是否一致(用于 UI 提示)。"""
|
||||
"""比较 hub 与三实例 AI 键是否一致(用于 UI 提示)."""
|
||||
hub_vals = env_get_all(read_env_lines(hub_env_path()))
|
||||
per_instance: dict[str, dict[str, Any]] = {}
|
||||
all_ok = True
|
||||
@@ -165,7 +165,7 @@ def validate_ai_env_updates(updates: dict[str, str], example_path: str | None =
|
||||
|
||||
|
||||
def apply_ai_env_to_all(updates: dict[str, str]) -> dict[str, Any]:
|
||||
"""写入 hub .env 并强制同步三实例相同键。"""
|
||||
"""写入 hub .env 并强制同步三实例相同键."""
|
||||
clean, errors = validate_ai_env_updates(updates)
|
||||
if errors:
|
||||
return {"ok": False, "errors": errors, "changed": {}}
|
||||
@@ -196,7 +196,7 @@ def apply_ai_env_to_all(updates: dict[str, str]) -> dict[str, Any]:
|
||||
|
||||
|
||||
def restart_instances_then_hub_pm2() -> dict[str, Any]:
|
||||
"""先重启三实例,最后重启中控(避免当前请求被中断)。"""
|
||||
"""先重启三实例,最后重启中控(避免当前请求被中断)."""
|
||||
if not sys.platform.startswith("linux"):
|
||||
return {"ok": False, "msg": "仅 Linux 服务器支持 PM2 重启", "results": []}
|
||||
from lib.instance.instance_pm2_lib import restart_instance_pm2
|
||||
@@ -212,7 +212,7 @@ def restart_instances_then_hub_pm2() -> dict[str, Any]:
|
||||
|
||||
|
||||
def restart_hub_and_instances_pm2() -> dict[str, Any]:
|
||||
"""兼容旧调用:与 restart_instances_then_hub_pm2 相同顺序。"""
|
||||
"""兼容旧调用:与 restart_instances_then_hub_pm2 相同顺序."""
|
||||
return restart_instances_then_hub_pm2()
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user