#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ STX 模拟操作 (DRY-RUN, 绝不下真实单) - 用 OKX 实时行情驱动一套简单趋势+支撑压力策略 - 模拟开仓/止损/止盈, 输出虚拟盈亏与信号 - 默认杠杆 5x (仅模拟计算, 不影响真实账户) """ import subprocess, json, datetime, sys, os HERE = os.path.dirname(os.path.abspath(__file__)) # ===== 策略参数 (基于之前分析) ===== INST = "STX-USDT-SWAP" LEVER = 5 # 模拟杠杆 SUPPORT = 0.23 # 第一支撑(突破回踩买点) STRONG_SUPPORT = 0.19 # 强支撑(止损参考) PRESSURE = 0.2895 # 压力(前高, 止盈区) STOP_LOSS = 0.205 # 模拟止损价(跌破强支撑上方一点) TAKE_PROFIT = 0.285 # 模拟止盈价(接近前高) SIM_QTY = 1000 # 模拟持仓张数(对应约 260 USDT 保证金 @5x) _state_file = os.path.join(HERE, "stx_sim_state.json") def get_ticker(): out = subprocess.run( ["curl", "-s", "--max-time", "10", f"https://www.okx.com/api/v5/market/ticker?instId={INST}"], capture_output=True, text=True, timeout=15).stdout return json.loads(out)["data"][0] def load_state(): try: with open(_state_file) as f: return json.load(f) except Exception: return {"position": "flat", "entry": 0.0, "side": ""} def save_state(s): with open(_state_file, "w") as f: json.dump(s, f, indent=2) def pnl(entry, last, qty, lever): # 永续合约 U 本位, 多单盈亏 = (last-entry)/entry * 保证金 * lever margin = (last * qty) / lever return (last - entry) / entry * margin def main(): tk = get_ticker() last = float(tk["last"]) ts = datetime.datetime.now().strftime("%H:%M:%S") st = load_state() print(f"[{ts}] STX 现价 {last:.4f} | 状态: {st['position']}") if st["position"] == "flat": # 策略: 价格回踩第一支撑(0.23)附近且未破 -> 模拟开多 # 简化: 现价 <= 支撑*1.03 且 >= 强支撑 -> 开多 if STRONG_SUPPORT <= last <= SUPPORT * 1.03: st = {"position": "long", "entry": last, "side": "long", "time": ts, "qty": SIM_QTY, "lever": LEVER} save_state(st) print(f" >> 模拟开多 @ {last:.4f} 杠杆{LEVER}x 量{SIM_QTY} (虚拟)") else: print(f" -- 观望 (现价 {last:.4f} 未到买区 {STRONG_SUPPORT}~{SUPPORT*1.03:.4f})") elif st["position"] == "long": entry = st["entry"] # 止损 if last <= STOP_LOSS: p = pnl(entry, last, SIM_QTY, LEVER) print(f" >> 模拟止损 @ {last:.4f} 虚拟盈亏 {p:+.2f} USDT") save_state({"position": "flat", "entry": 0.0, "side": ""}) # 止盈 elif last >= TAKE_PROFIT: p = pnl(entry, last, SIM_QTY, LEVER) print(f" >> 模拟止盈 @ {last:.4f} 虚拟盈亏 {p:+.2f} USDT") save_state({"position": "flat", "entry": 0.0, "side": ""}) else: p = pnl(entry, last, SIM_QTY, LEVER) print(f" -- 持仓中 开仓{entry:.4f} 虚拟浮动 {p:+.2f} USDT") print(f" 关键位: 支撑{SUPPORT} 强支撑{STRONG_SUPPORT} 压力{PRESSURE} 止损{STOP_LOSS} 止盈{TAKE_PROFIT}") if __name__ == "__main__": main()