初始
This commit is contained in:
+92
@@ -0,0 +1,92 @@
|
||||
#!/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()
|
||||
Reference in New Issue
Block a user