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 -1
View File
@@ -1,4 +1,4 @@
"""期权模块 SQLite 表"""
"""期权模块 SQLite 表."""
from __future__ import annotations
import sqlite3
+1 -1
View File
@@ -1,4 +1,4 @@
"""中控只读聚合OKX 期权持仓 / 资金 / 本地统计"""
"""中控只读聚合:OKX 期权持仓 / 资金 / 本地统计."""
from __future__ import annotations
+8 -8
View File
@@ -1,4 +1,4 @@
"""期权持仓监控浮盈翻倍微信提醒"""
"""期权持仓监控:浮盈翻倍微信提醒."""
from __future__ import annotations
import sqlite3
@@ -29,11 +29,11 @@ def build_profit_alert_message(
return "\n".join(
[
"【OKX期权·翻倍提醒】",
f"账户{account_label}",
f"合约{inst_id}",
f"已付权利金{premium_paid:.4f} USDC",
f"未实现盈亏{upl:+.4f} USDC{pct}",
f"当前买一{bid_txt}可考虑限价平仓锁利",
f"账户:{account_label}",
f"合约:{inst_id}",
f"已付权利金:{premium_paid:.4f} USDC",
f"未实现盈亏:{upl:+.4f} USDC({pct})",
f"当前买一:{bid_txt}(可考虑限价平仓锁利)",
]
)
@@ -48,8 +48,8 @@ def run_options_profit_alerts(
ticker_bid_fn: Callable[[str], float | None],
) -> int:
"""
对比 DB 中 open 记录与交易所持仓达到阈值发微信
返回发送条数
对比 DB 中 open 记录与交易所持仓;达到阈值发微信.
返回发送条数.
"""
sent = 0
pos_by_inst = {str(p.get("inst_id") or p.get("instId") or ""): p for p in positions}
+17 -17
View File
@@ -1,4 +1,4 @@
"""OKX USDⓈ 期权张数与权利金计算"""
"""OKX USDⓈ 期权:张数与权利金计算."""
from __future__ import annotations
import math
@@ -24,12 +24,12 @@ def min_sz_from_meta(meta: dict[str, Any] | None) -> int:
def premium_per_sheet(quote_per_unit: float, ct_mult: float = 0.01) -> float:
"""报价为每 1 ETH/BTC每张权利金 = 报价 × ctMult"""
"""报价为每 1 ETH/BTC;每张权利金 = 报价 × ctMult."""
return float(quote_per_unit) * float(ct_mult)
def format_quote_liquidity(px: float | None, sz: float | None, *, px_decimals: int = 4) -> str | None:
"""盘口展示价格/张数如 17.2/150"""
"""盘口展示:价格/张数,如 17.2/150."""
if px is None:
return None
try:
@@ -72,8 +72,8 @@ def calc_order_size(
budget_cap: float | None = None,
) -> dict[str, Any]:
"""
返回 sheets, eth_amount, total_premium
mode: budget_full / eth_amount / sheets
返回 sheets, eth_amount, total_premium.
mode: budget_full / eth_amount / sheets.
"""
if quote_per_unit <= 0:
return {"ok": False, "msg": "卖一价无效", "sheets": 0, "eth_amount": 0.0, "total_premium": 0.0}
@@ -89,13 +89,13 @@ def calc_order_size(
return {"ok": False, "msg": "无法计算单张权利金", "sheets": 0, "eth_amount": 0.0, "total_premium": 0.0}
sheets = int(math.floor(eff / per_sheet))
else:
return {"ok": False, "msg": "请指定预算币数量或张数", "sheets": 0, "eth_amount": 0.0, "total_premium": 0.0}
return {"ok": False, "msg": "请指定预算,币数量或张数", "sheets": 0, "eth_amount": 0.0, "total_premium": 0.0}
if sheets < min_sz:
per = premium_per_sheet(quote_per_unit, ct_mult)
return {
"ok": False,
"msg": f"预算不足无法买入 {min_sz}单张约 {per:.4f} USDC",
"msg": f"预算不足,无法买入 {min_sz}(单张约 {per:.4f} USDC)",
"sheets": sheets,
"eth_amount": eth_amount_from_sheets(sheets, ct_mult),
"total_premium": total_premium(quote_per_unit, eth_amount_from_sheets(sheets, ct_mult)),
@@ -134,7 +134,7 @@ def is_shallow_itm(
def option_moneyness(*, opt_type: str, strike: float, index_px: float) -> str:
"""返回 itm / otm / atm"""
"""返回 itm / otm / atm."""
o = (opt_type or "").upper()
if strike is None or index_px is None or index_px <= 0:
return "unknown"
@@ -159,7 +159,7 @@ def expiry_breakeven_from_ask(
ask_px: float | None,
mark_px: float | None = None,
) -> float | None:
"""买入前预估到期平衡权利金按卖一无卖一时回退标记价"""
"""买入前预估到期平衡:权利金按卖一;无卖一时回退标记价."""
prem = ask_px if ask_px is not None and ask_px > 0 else mark_px
return expiry_breakeven_px(opt_type=opt_type, strike=strike, avg_px=prem)
@@ -171,7 +171,7 @@ def expiry_breakeven_px(
avg_px: float | None,
be_px_api: float | None = None,
) -> float | None:
"""到期平衡点持有至到期时标的指数盈亏为 0 的价格优先 OKX bePx"""
"""到期平衡点:持有至到期时标的指数盈亏为 0 的价格.优先 OKX bePx."""
if be_px_api is not None and be_px_api > 0:
return round(float(be_px_api), 2)
if strike is None or avg_px is None:
@@ -195,8 +195,8 @@ def close_breakeven_idx(
ct_mult: float = 0.01,
) -> float | None:
"""
平掉回本标的指数达到该价位时按标记价平仓近似盈亏为 0
优先用 deltaPA 线性外推否则用时间价值近似适合短期轻度实值)。
平掉回本:标的指数达到该价位时,按标记价平仓近似盈亏为 0.
优先用 deltaPA 线性外推,否则用时间价值近似(适合短期轻度实值).
"""
if idx_px is None or mark_px is None or avg_px is None:
return None
@@ -213,7 +213,7 @@ def close_breakeven_idx(
def idx_distance_to_be(idx_px: float | None, be_px: float | None) -> float | None:
"""指数距平衡点正=指数需上涨才到平衡点)。"""
"""指数距平衡点(正=指数需上涨才到平衡点)."""
if idx_px is None or be_px is None:
return None
return round(float(be_px) - float(idx_px), 2)
@@ -225,14 +225,14 @@ def format_options_breakeven_line(
close_be_px: float | None,
idx_px: float | None = None,
) -> str:
"""持仓摘要行到期平衡 / 平掉回本"""
"""持仓摘要行:到期平衡 / 平掉回本."""
parts: list[str] = []
if expiry_be_px is not None:
parts.append(f"到期平衡{expiry_be_px:.0f}")
if close_be_px is not None:
parts.append(f"平掉回本{close_be_px:.0f}")
if idx_px is not None and parts:
return " ".join(parts) + f"指数{idx_px:.0f}"
return " ".join(parts) + f"(指数{idx_px:.0f})"
return " ".join(parts)
@@ -244,7 +244,7 @@ def estimate_expiry_profit_at_index(
entry_px: float | None,
eth_amount: float | None,
) -> float | None:
"""到期测算目标指数价下按内在价值减权利金每 1 币报价 × 币量)。"""
"""到期测算:目标指数价下按内在价值减权利金(每 1 币报价 × 币量)."""
if strike is None or target_idx is None or entry_px is None or eth_amount is None:
return None
if eth_amount <= 0:
@@ -265,7 +265,7 @@ def equivalent_contract_leverage(
eth_amount: float | None,
total_premium: float | None,
) -> float | None:
"""名义价值 / 权利金近似相当于永续合约杠杆倍数测算用)。"""
"""名义价值 / 权利金,近似相当于永续合约杠杆倍数(测算用)."""
if index_px is None or eth_amount is None or total_premium is None:
return None
if eth_amount <= 0 or total_premium <= 0:
+4 -4
View File
@@ -1,4 +1,4 @@
"""OKX 期权模块Flask 路由注册"""
"""OKX 期权模块:Flask 路由注册."""
from __future__ import annotations
import os
@@ -124,7 +124,7 @@ def _build_cfg(app_module: Any) -> dict[str, Any]:
def _require_options_ex(cfg: dict[str, Any]):
if not cfg.get("enabled"):
return None, "期权模块未启用请在 .env 设置 OKX_OPTIONS_ENABLED=true 并重启 PM2"
return None, "期权模块未启用,请在 .env 设置 OKX_OPTIONS_ENABLED=true 并重启 PM2"
ex = cfg.get("exchange_options")
ok, reason = cfg["options_api_ready"](ex)
if not ok:
@@ -227,7 +227,7 @@ def register_options_routes(app: Flask, cfg: dict[str, Any]) -> None:
return jsonify(q)
ask = q.get("ask")
if ask is None or ask <= 0:
return jsonify({"ok": False, "msg": "暂无卖一价无法买入"})
return jsonify({"ok": False, "msg": "暂无卖一价,无法买入"})
ct_mult = float(q.get("ct_mult") or 0.01)
min_sz = int(q.get("min_sz") or 1)
eth_amount = None
@@ -341,7 +341,7 @@ def register_options_routes(app: Flask, cfg: dict[str, Any]) -> None:
q = cfg["quote_option_contract"](ex, inst_id)
bid = q.get("bid")
if not use_market and (bid is None or bid <= 0):
return jsonify({"ok": False, "msg": "暂无买一价无法限价平仓"})
return jsonify({"ok": False, "msg": "暂无买一价,无法限价平仓"})
raw_positions = cfg["fetch_option_positions"](ex)
pos = next((p for p in raw_positions if str(p.get("instId")) == inst_id), None)
if not pos:
+6 -6
View File
@@ -1,13 +1,13 @@
<div class="options-page-wrap" style="grid-column:1/-1" id="options-root"
data-default-underly="{{ options_default_underly | default('ETH') }}">
{% if not options_enabled %}
<div class="flash" style="margin-bottom:12px">期权 API 未启用请在 <code>crypto_monitor_okx/.env</code> 设置 <code>OKX_OPTIONS_ENABLED=true</code> 及主账户 <code>OKX_OPTIONS_API_*</code>然后 <code>pm2 restart crypto_okx --update-env</code></div>
<div class="flash" style="margin-bottom:12px">期权 API 未启用:请在 <code>crypto_monitor_okx/.env</code> 设置 <code>OKX_OPTIONS_ENABLED=true</code> 及主账户 <code>OKX_OPTIONS_API_*</code>,然后 <code>pm2 restart crypto_okx --update-env</code>.</div>
{% endif %}
<div class="options-dual-grid">
<div class="card options-order-card">
<h2>期权下单</h2>
<p class="muted options-hint">报价单位为每 1 ETH/BTC1 张 = 0.01卖一/买一列为 <strong>价格/张数</strong>卖一无挂单时以标记价估算并标 <strong>~</strong>链展示近 <span id="opt-chain-dte">14</span> 日到期标注实值/虚值<strong>到期平衡</strong>按卖一预估无卖一按标记价)。资金划转与 USDT/USDC 兑换见「系统设置 → 期权设置」</p>
<p class="muted options-hint">报价单位为每 1 ETH/BTC;1 张 = 0.01.卖一/买一列为 <strong>价格/张数</strong>;卖一无挂单时以标记价估算并标 <strong>~</strong>.链展示近 <span id="opt-chain-dte">14</span> 日到期,标注实值/虚值;<strong>到期平衡</strong>按卖一预估(无卖一按标记价).资金划转与 USDT/USDC 兑换见「系统设置 → 期权设置」.</p>
<div class="form-row options-chain-toolbar">
<button type="button" class="btn-secondary opt-uly-btn active" data-uly="ETH">ETH</button>
<button type="button" class="btn-secondary opt-uly-btn" data-uly="BTC">BTC</button>
@@ -46,18 +46,18 @@
<div><span class="k">张数</span><span id="opt-order-sheets" class="v"></span></div>
<div><span class="k">ETH/BTC 数量</span><span id="opt-order-eth" class="v"></span></div>
<div><span class="k">预估权利金</span><span id="opt-order-premium" class="v"></span></div>
<div><span class="k">合约杠杆</span><span id="opt-order-leverage" class="v" title="名义价值÷权利金测算用"></span></div>
<div><span class="k">合约杠杆</span><span id="opt-order-leverage" class="v" title="名义价值÷权利金,测算用"></span></div>
<div><span class="k">到期平衡</span><span id="opt-order-expiry-be" class="v"></span></div>
<div><span class="k">距平衡</span><span id="opt-order-dist-be" class="v"></span></div>
</div>
<div class="options-estimate-row">
<label class="opt-est-label" for="opt-target-idx">目标位指数</label>
<label class="opt-est-label" for="opt-target-idx">目标位(指数)</label>
<input type="number" id="opt-target-idx" class="opt-target-idx" step="0.1" min="0" placeholder="到期时指数价">
<span class="k">预计盈利</span>
<span id="opt-est-profit" class="v"></span>
<span class="k">目标杠杆</span>
<span id="opt-est-leverage" class="v" title="目标位名义价值÷权利金"></span>
<span class="muted opt-est-note">到期测算仅供参考</span>
<span class="muted opt-est-note">到期测算,仅供参考</span>
</div>
<div class="form-row options-order-mode-row">
<label><input type="radio" name="opt-size-mode" value="sheets" checked> 指定张数</label>
@@ -65,7 +65,7 @@
<label><input type="radio" name="opt-size-mode" value="budget_full"> 按单笔上限打满</label>
<label><input type="radio" name="opt-size-mode" value="eth_amount"> 指定币数量</label>
<input type="number" id="opt-eth-amount" min="0.01" step="0.01" placeholder="如 0.5" style="display:none">
<input type="text" id="opt-signal-note" placeholder="备注关键位说明">
<input type="text" id="opt-signal-note" placeholder="备注(关键位说明)">
<button type="button" class="btn-primary" id="opt-open-btn">限价买入 @ 卖一</button>
</div>
<div id="opt-order-msg" class="muted"></div>
@@ -1,4 +1,4 @@
{# 期权设置脚本挂载点卡片在 settings_panel 中拆分 #}
{# 期权设置脚本挂载点(卡片在 settings_panel 中拆分) #}
<div id="options-settings-root" hidden
data-sub-account="{{ instance_settings.options_sub_account | default('', true) }}"></div>
<script src="/static/options_settings.js?v=5"></script>
@@ -1,5 +1,5 @@
<div class="options-settings-section">
<p class="options-settings-hint">主账户资金账户USDT ↔ USDC 现货市价单</p>
<p class="options-settings-hint">主账户资金账户:USDT ↔ USDC 现货市价单.</p>
<div class="form-row settings-transfer-form options-settings-row">
<select id="opt-set-swap-dir" aria-label="兑换方向">
<option value="usdt_to_usdc" selected>USDT → USDC</option>
@@ -22,7 +22,7 @@
<div class="options-settings-section">
<div class="options-settings-subtitle">
主子账户
<span class="muted">{{ instance_settings.options_sub_account or '未配置' }}</span>
<span class="muted">({{ instance_settings.options_sub_account or '未配置' }})</span>
</div>
<div class="form-row settings-transfer-form options-settings-row">
<select id="opt-set-cross-dir" aria-label="主子方向">