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:
dekun
2026-07-08 23:42:26 +08:00
parent aaa72c7961
commit b733e551a0
392 changed files with 71522 additions and 71369 deletions
@@ -1,18 +1,18 @@
#!/usr/bin/env python3
"""
一次性修复历史交易记录标签
将 trade_records 里“止损但实际盈利”的记录改为“保本止盈”
一次性修复历史交易记录标签:
将 trade_records 里“止损但实际盈利”的记录改为“保本止盈”.
默认条件可通过参数修改):
默认条件(可通过参数修改):
- monitor_type = 下单监控
- result = 止损
- pnl_amount > 0
用法示例
1) 仅预览不落库):
用法示例:
1) 仅预览(不落库):
python scripts/fix_breakeven_labels.py --db ./crypto.db --dry-run
2) 执行修复
2) 执行修复:
python scripts/fix_breakeven_labels.py --db ./crypto.db --apply
"""
@@ -115,15 +115,15 @@ def build_section(order_loop: str) -> str:
{{% endif %}}
</{t}>
<{t} class="rule-tip" id="order-rule-tip">
规则最多 {{{{ max_active_positions }}}}BTC {{{{ btc_leverage }}}}x / 山寨 {{{{ alt_leverage }}}}x
{{% if can_trade %}}可开仓{{% else %}}不可开仓持仓已满或未到北京时间 {{{{ reset_hour }}}}:00{{% endif %}}
规则:最多 {{{{ max_active_positions }}}};BTC {{{{ btc_leverage }}}}x / 山寨 {{{{ alt_leverage }}}}x;
{{% if can_trade %}}可开仓{{% else %}}不可开仓(持仓已满或未到北京时间 {{{{ reset_hour }}}}:00){{% endif %}};
人工开仓盈亏比不得低于 {{{{ manual_min_planned_rr }}}}:1
</{t}>
<{t} class="rule-tip">
以损定仓风险 {{{{ risk_percent }}}}% |移动保本下单可勾选关闭开启时 {{{{ breakeven_rr_trigger }}}}R 触发每 1R 阶梯上移),偏移 {{{{ breakeven_offset_pct }}}}%
以损定仓:风险 {{{{ risk_percent }}}}% |移动保本:下单可勾选关闭;开启时 {{{{ breakeven_rr_trigger }}}}R 触发(每 1R 阶梯上移),偏移 {{{{ breakeven_offset_pct }}}}%
</{t}>
<{t} class="rule-tip">
划转自动划转 {{{{ '开启' if auto_transfer_enabled else '关闭' }}}}每天<strong>北京时间 {{{{ auto_transfer_bj_hour }}}}:00</strong>起该整点小时内尝试账簿按 <strong>UTC 自然日</strong>去重界面时间为北京{{{{ auto_transfer_to }}}} 补足到 {{{{ auto_transfer_amount }}}}U来自 {{{{ auto_transfer_from }}}}
划转:自动划转 {{{{ '开启' if auto_transfer_enabled else '关闭' }}}}(每天<strong>北京时间 {{{{ auto_transfer_bj_hour }}}}:00</strong>起该整点小时内尝试;账簿按 <strong>UTC 自然日</strong>去重;界面时间为北京;{{{{ auto_transfer_to }}}} 补足到 {{{{ auto_transfer_amount }}}}U,来自 {{{{ auto_transfer_from }}}})
</{t}>
<form action="/manual_transfer" method="post" class="form-row">
<input name="amount" type="number" min="0.01" step="0.01" placeholder="手动划转金额U" required>
@@ -145,8 +145,8 @@ def build_section(order_loop: str) -> str:
<option value="">方向</option><option value="long">做多</option><option value="short">做空</option>
</select>
<select id="sltp-mode" name="sltp_mode">
<option value="price">止盈止损价格模式</option>
<option value="pct">止盈止损百分比模式</option>
<option value="price">止盈止损:价格模式</option>
<option value="pct">止盈止损:百分比模式</option>
</select>
<select name="trade_style" required>
<option value="trend">趋势单</option>
@@ -154,17 +154,17 @@ def build_section(order_loop: str) -> str:
</select>
<input id="order-leverage" name="leverage" type="number" min="1" step="1" placeholder="杠杆(可选)">
<label style="display:flex;align-items:center;gap:4px;font-size:.82rem;color:#cfd3ef">
<input type="checkbox" name="breakeven_enabled" value="1" checked> 启用移动保本关闭则仅保留初始止损与交易所挂单
<input type="checkbox" name="breakeven_enabled" value="1" checked> 启用移动保本(关闭则仅保留初始止损与交易所挂单)
</label>
<label style="display:flex;align-items:center;gap:4px;font-size:.82rem;color:#cfd3ef">
<input type="checkbox" name="order_chart" value="true"> 开仓后生成多周期K线图各周期100根含开平仓标记
<input type="checkbox" name="order_chart" value="true"> 开仓后生成多周期K线图(各周期100根,含开平仓标记)
</label>
<span style="display:flex;align-items:center;padding:0 10px;font-size:.8rem;color:#8fc8ff">成交价自动取交易所实时+成交回报</span>
<input id="order-sl" name="sl" step="any" placeholder="止损价格" required>
<input id="order-tp" name="tgt" step="any" placeholder="止盈价格" required>
<input id="order-sl-pct" name="sl_pct" type="number" min="0.01" step="0.01" placeholder="止损%" style="display:none">
<input id="order-tp-pct" name="tp_pct" type="number" min="0.01" step="0.01" placeholder="止盈%" style="display:none">
<button type="submit">开仓以损定仓</button>
<button type="submit">开仓(以损定仓)</button>
</form>
</{t}>
<{t} class="card">
@@ -218,7 +218,7 @@ if(addOrderForm){
const mode = (document.getElementById("sltp-mode")||{}).value || "price";
let sl, tp, entry;
if(mode === "pct"){
alert("百分比模式请确认盈亏比后再提交建议使用价格模式以便校验");
alert("百分比模式请确认盈亏比后再提交;建议使用价格模式以便校验.");
return;
}
sl = Number((document.getElementById("order-sl")||{}).value);
@@ -231,12 +231,12 @@ if(addOrderForm){
if(px) entry = Number(px);
const rr = calcClientRr(direction, entry, sl, tp);
if(rr === null || rr < MANUAL_MIN_PLANNED_RR){
alert(`计划盈亏比 ${rr === null ? '无效' : rr.toFixed(2)}:1 低于最低要求 ${MANUAL_MIN_PLANNED_RR}:1已阻止人工下单`);
alert(`计划盈亏比 ${rr === null ? '无效' : rr.toFixed(2)}:1 低于最低要求 ${MANUAL_MIN_PLANNED_RR}:1,已阻止人工下单.`);
return;
}
addOrderForm.submit();
})
.catch(()=>{ ev.preventDefault(); alert("无法校验盈亏比请稍后重试"); });
.catch(()=>{ ev.preventDefault(); alert("无法校验盈亏比,请稍后重试"); });
ev.preventDefault();
});
}
@@ -244,27 +244,27 @@ if(addOrderForm){
text = text.replace("refreshOrderDefaults();", hook + "\nrefreshOrderDefaults();")
if "max_active_positions" not in text and "order-rule-tip" in text:
text = text.replace(
"规则单仓",
"规则最多 {{ max_active_positions }} 仓",
"规则:单仓;",
"规则:最多 {{ max_active_positions }} 仓;",
)
# account snapshot tip
old_tip = '`规则单仓BTC {{ btc_leverage }}x'
old_tip = '`规则:单仓;BTC {{ btc_leverage }}x'
if old_tip in text:
text = text.replace(
old_tip,
"`规则最多 ${data.max_active_positions || {{ max_active_positions }}} 仓BTC {{ btc_leverage }}x",
"`规则:最多 ${data.max_active_positions || {{ max_active_positions }}} 仓;BTC {{ btc_leverage }}x",
)
text = text.replace(
'const canTradeText = data.can_trade ? "可开仓" : "不可开仓有持仓或未到北京时间 {{ reset_hour }}:00";',
'const canTradeText = data.can_trade ? "可开仓" : `不可开仓持仓 ${data.active_count||0}/${data.max_active_positions||{{ max_active_positions }}} 或未到北京时间 {{ reset_hour }}:00`;',
'const canTradeText = data.can_trade ? "可开仓" : "不可开仓(有持仓或未到北京时间 {{ reset_hour }}:00)";',
'const canTradeText = data.can_trade ? "可开仓" : `不可开仓(持仓 ${data.active_count||0}/${data.max_active_positions||{{ max_active_positions }}} 或未到北京时间 {{ reset_hour }}:00)`;',
)
text = text.replace(
"if(!data.in_top30){",
"const rankMax = data.rank_max || 30;\n if(!data.in_top30){",
)
text = text.replace(
"不在前30已拦截",
"不在前${rankMax}已拦截",
"不在前30,已拦截",
"不在前${rankMax},已拦截",
)
# conditional price refresh
if "data-page" in text and "refreshPriceSnapshotConditional" not in text:
@@ -68,8 +68,8 @@ if "key_monitor_page" not in g:
" can_trade = trading_day_reset_allows_new_open(now) and active_count == 0\n conn.close()\n return render_template(",
""" can_trade = trading_day_reset_allows_new_open(now) and active_count < MAX_ACTIVE_POSITIONS
key_gate_rule_text = (
f"周期 {KLINE_TIMEFRAME}|确认K突破棒偏移 {KEY_CONFIRM_BREAKOUT_BAR}确认棒偏移 {KEY_CONFIRM_BAR}"
f"量能突破量 > 前{KEY_VOLUME_MA_BARS}均量×{KEY_VOLUME_RATIO_MIN}"
f"周期 {KLINE_TIMEFRAME}|确认K:突破棒偏移 {KEY_CONFIRM_BREAKOUT_BAR},确认棒偏移 {KEY_CONFIRM_BAR}"
f"量能:突破量 > 前{KEY_VOLUME_MA_BARS}均量×{KEY_VOLUME_RATIO_MIN}"
f"自动开仓盈亏比 > {KEY_AUTO_MIN_PLANNED_RR}:1|日成交量排名前 {KEY_DAILY_VOLUME_RANK_MAX}"
)
conn.close()
@@ -2,8 +2,8 @@
"""
python scripts/verify_binance_funding.py
打印 BINANCE_API_KEY 前 8 位便于与 Binance 控制台核对不含 Secret)。用于服务器自检
对比 App资产 → 资金账户(Funding) / 现货账户(Spot) / U本位合约
打印 BINANCE_API_KEY 前 8 位便于与 Binance 控制台核对(不含 Secret).用于服务器自检.
对比 App:资产 → 资金账户(Funding) / 现货账户(Spot) / U本位合约.
"""
import os
import sys
@@ -30,9 +30,9 @@ def main():
k = (os.getenv("BINANCE_API_KEY") or "").strip()
s = (os.getenv("BINANCE_API_SECRET") or "").strip()
if not k or "REPLACE" in k.upper():
print("WARN: BINANCE_API_KEY 为空或仍像占位符请核对 .env")
print("WARN: BINANCE_API_KEY 为空或仍像占位符,请核对 .env")
if not s or "REPLACE" in s.upper():
print("WARN: BINANCE_API_SECRET 为空或仍像占位符请核对 .env")
print("WARN: BINANCE_API_SECRET 为空或仍像占位符,请核对 .env")
print("BINANCE_API_KEY prefix (8 chars):", (k[:8] + "") if len(k) > 8 else "(short)")
print("BINANCE_FUNDING_INCLUDE_SPOT:", os.getenv("BINANCE_FUNDING_INCLUDE_SPOT", "false"))