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:
@@ -1,97 +1,12 @@
|
||||
"""趋势回调:各交易所止损刷新,市价加/平仓(通过 app 模块能力探测)."""
|
||||
from __future__ import annotations
|
||||
|
||||
import time
|
||||
from typing import Any
|
||||
|
||||
|
||||
def _m(cfg: dict) -> Any:
|
||||
return cfg["app_module"]
|
||||
|
||||
|
||||
def trend_refresh_stop_only(cfg: dict, exchange_symbol: str, direction: str, stop_loss: float) -> None:
|
||||
m = _m(cfg)
|
||||
if hasattr(m, "_gate_place_stop_loss_only_position"):
|
||||
if hasattr(m, "cancel_gate_swap_trigger_orders"):
|
||||
m.cancel_gate_swap_trigger_orders(exchange_symbol)
|
||||
m._gate_place_stop_loss_only_position(exchange_symbol, direction, stop_loss)
|
||||
return
|
||||
if hasattr(m, "_binance_place_stop_loss_only"):
|
||||
m._binance_place_stop_loss_only(exchange_symbol, direction, stop_loss)
|
||||
return
|
||||
if hasattr(m, "_okx_place_stop_loss_only"):
|
||||
m._okx_place_stop_loss_only(exchange_symbol, direction, stop_loss)
|
||||
return
|
||||
raise RuntimeError("当前实例未配置趋势回调止损挂单能力")
|
||||
|
||||
|
||||
def trend_market_add(cfg: dict, exchange_symbol: str, direction: str, contracts: float, leverage: int):
|
||||
m = _m(cfg)
|
||||
ex = m.exchange
|
||||
m.ensure_markets_loaded()
|
||||
ex.set_leverage(int(leverage), exchange_symbol)
|
||||
side = "buy" if direction == "long" else "sell"
|
||||
if hasattr(m, "build_gate_order_params"):
|
||||
params = m.build_gate_order_params(direction, reduce_only=False)
|
||||
elif hasattr(m, "build_binance_order_params"):
|
||||
params = m.build_binance_order_params(direction, reduce_only=False)
|
||||
elif hasattr(m, "build_okx_order_params"):
|
||||
params = m.build_okx_order_params(direction, reduce_only=False)
|
||||
else:
|
||||
params = {}
|
||||
order_params = params if params is not None else {}
|
||||
return ex.create_order(exchange_symbol, "market", side, float(contracts), None, order_params)
|
||||
|
||||
|
||||
def trend_market_close(cfg: dict, exchange_symbol: str, direction: str, pos_qty: float, leverage: int):
|
||||
m = _m(cfg)
|
||||
ex = m.exchange
|
||||
m.ensure_markets_loaded()
|
||||
ex.set_leverage(int(leverage), exchange_symbol)
|
||||
side = "sell" if direction == "long" else "buy"
|
||||
amt = float(ex.amount_to_precision(exchange_symbol, float(pos_qty)))
|
||||
if hasattr(m, "close_exchange_order"):
|
||||
row = {
|
||||
"exchange_symbol": exchange_symbol,
|
||||
"symbol": exchange_symbol,
|
||||
"direction": direction,
|
||||
"order_amount": amt,
|
||||
}
|
||||
return m.close_exchange_order(row)
|
||||
if hasattr(m, "build_gate_order_params"):
|
||||
params = m.build_gate_order_params(direction, reduce_only=True)
|
||||
return ex.create_order(exchange_symbol, "market", side, amt, None, params)
|
||||
if hasattr(m, "build_binance_order_params"):
|
||||
for params in m._binance_market_close_param_candidates(direction):
|
||||
try:
|
||||
return ex.create_order(exchange_symbol, "market", side, amt, None, params)
|
||||
except Exception as e:
|
||||
if not m._is_binance_close_param_retryable(str(e)):
|
||||
raise
|
||||
raise RuntimeError("平仓失败")
|
||||
if hasattr(m, "build_okx_order_params"):
|
||||
params = m.build_okx_order_params(direction, reduce_only=True)
|
||||
return ex.create_order(exchange_symbol, "market", side, amt, None, params)
|
||||
return ex.create_order(exchange_symbol, "market", side, amt, None, {"reduceOnly": True})
|
||||
|
||||
|
||||
def trend_replace_tpsl(cfg: dict, order_row: dict, stop_loss: float, take_profit: float) -> None:
|
||||
"""趋势保本移交:先撤条件单再挂保本止损 + 计划止盈(与下单监控一致)."""
|
||||
m = _m(cfg)
|
||||
fn = getattr(m, "replace_active_monitor_tpsl_on_exchange", None)
|
||||
if not callable(fn):
|
||||
raise RuntimeError("当前实例未配置止盈止损同步能力")
|
||||
fn(order_row, float(stop_loss), float(take_profit))
|
||||
|
||||
|
||||
def cancel_symbol_orders(cfg: dict, exchange_symbol: str) -> None:
|
||||
m = _m(cfg)
|
||||
if hasattr(m, "cancel_all_open_orders_for_symbol"):
|
||||
m.cancel_all_open_orders_for_symbol(exchange_symbol)
|
||||
return
|
||||
if hasattr(m, "cancel_gate_swap_trigger_orders"):
|
||||
m.cancel_gate_swap_trigger_orders(exchange_symbol)
|
||||
if hasattr(m, "cancel_binance_futures_open_orders"):
|
||||
m.cancel_binance_futures_open_orders(exchange_symbol)
|
||||
if hasattr(m, "cancel_okx_swap_open_orders"):
|
||||
m.cancel_okx_swap_open_orders(exchange_symbol)
|
||||
# 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())
|
||||
|
||||
Reference in New Issue
Block a user