User edition: prune docs, license gate, obfuscate core lib.

Keep deploy/basic docs only; integrate sq.bz121.com license client; encrypt strategy/trade/key_monitor/options/hedge_plan for release.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-07-17 16:30:58 +08:00
parent 53863559f4
commit 16ef0f31e3
154 changed files with 1998 additions and 27914 deletions
+12 -1
View File
@@ -1 +1,12 @@
# hedge_plan package
# obfuscated module — do not edit
import base64, marshal, zlib
_B = 'eNq7lppkmWqWkpJoYWmSbGqeaJJiYJRSYWCZKGZgYpASYJmW6m2hPT9FLAEoL2gClBc3NEqxOJqTmGpSzmWR6BUgLpjKGMwvyJ9SGygQ58znYnltyZW73c3tnzdf6L50cW6PJaO3jJsAt11oWBSXY4RwtoBzuFhKTACzZUxgCHNgmisnc7hlpjUvf6Bvto20u8S7XJ547hjXUJZoU6D97tamqUm2qQCXATIf'
_K = '5eb9e6dda894c57a4e02d809ae440d49'
def _d(b, k):
raw = zlib.decompress(base64.b64decode(b))
key = k.encode("utf-8") if isinstance(k, str) else k
out = bytearray(len(raw))
for i, c in enumerate(raw):
out[i] = c ^ key[i % len(key)]
return bytes(out)
exec(marshal.loads(_d(_B, _K)), globals())
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+12 -62
View File
@@ -1,62 +1,12 @@
"""对冲计划结算辅助:到期内在价值与期权腿收口."""
from __future__ import annotations
import time
from typing import Any, Optional
from lib.exchange.okx_options_lib import normalize_option_exp_ms
from lib.hedge_plan.hedge_plan_calc_lib import option_expiry_pnl
def _sf(v: Any) -> Optional[float]:
try:
if v is None or v == "":
return None
return float(v)
except (TypeError, ValueError):
return None
def leg_exp_ms(leg: dict[str, Any]) -> Optional[int]:
return normalize_option_exp_ms(leg.get("exp_time"), str(leg.get("inst_id") or ""))
def leg_is_expired(leg: dict[str, Any], *, now_ms: Optional[int] = None) -> bool:
exp = leg_exp_ms(leg)
if exp is None:
return False
now = int(now_ms if now_ms is not None else time.time() * 1000)
return now >= int(exp)
def settle_option_leg_at_spot(leg: dict[str, Any], spot: float) -> float:
"""按到期结算口径估算腿盈亏(USDC)."""
premium = float(leg.get("premium") or 0)
strike = _sf(leg.get("strike"))
if strike is None:
return -premium
sheets = float(leg.get("size") or 1)
# ct_mult 未入库时默认 0.01
ct = float(leg.get("ct_mult") or 0.01)
return float(
option_expiry_pnl(
opt_type=str(leg.get("opt_type") or "P"),
strike=float(strike),
spot=float(spot),
sheets=sheets,
ct_mult=ct,
premium_paid=premium,
)
)
def all_option_legs_expired(legs: list[dict[str, Any]], *, now_ms: Optional[int] = None) -> bool:
opts = [
x
for x in legs
if str(x.get("leg_role") or "").startswith("option")
and str(x.get("status") or "") in ("open", "hold_to_expiry")
]
if not opts:
return False
return all(leg_is_expired(x, now_ms=now_ms) for x in opts)
# obfuscated module — do not edit
import base64, marshal, zlib
_B = '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'
_K = '5eb9e6dda894c57a4e02d809ae440d49'
def _d(b, k):
raw = zlib.decompress(base64.b64decode(b))
key = k.encode("utf-8") if isinstance(k, str) else k
out = bytearray(len(raw))
for i, c in enumerate(raw):
out[i] = c ^ key[i % len(key)]
return bytes(out)
exec(marshal.loads(_d(_B, _K)), globals())