Warn on buy/sell when spread exceeds 0.50 USD.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-10-17 21:48:29 +08:00
parent 846fdedc1f
commit 12a62f79a5
2 changed files with 32 additions and 6 deletions
+32 -6
View File
@@ -75,6 +75,7 @@ COLOR_TEXT = "#f0f0f5"
COLOR_ACCENT = "#4cc2ff"
BE_MIN_MOVE_USD = 3.0 # 价格向有利方向走出该美金距离才可保本(非账户浮盈)
BE_OFFSET_USD = 1.0 # 保本止损 = 开仓价 ± 1$
SPREAD_WARN_USD = 0.50 # 点差超过该美金时,买卖按钮区提示(不禁开)
def simpledialog_ask_server(parent: tk.Misc) -> str:
@@ -715,6 +716,7 @@ class OrderApp(tk.Tk):
self._pos_sig = None
self._pos_profit_labels: dict = {}
self._metric_values: dict = {}
self._last_spread: float = 0.0
self._build_ui()
self.after(200, self._try_connect_and_refresh)
self.after(3000, self._hub_heartbeat)
@@ -987,6 +989,7 @@ class OrderApp(tk.Tk):
root,
text=(
f"最多同时 {MAX_OPEN_POSITIONS} 笔 · 同向≤{MAX_SIDE_LOTS:.2f} 手 · "
f"点差>{SPREAD_WARN_USD:.2f} 买卖提示 · "
"亏≥5%或盈≥10%禁止开仓 · 保本:有利方向>3$ 后止损到开仓价±1$"
),
bg=COLOR_BG,
@@ -1110,7 +1113,7 @@ class OrderApp(tk.Tk):
)
def _sync_open_buttons(self, symbol: str) -> None:
"""满仓 / 同向上限 / 日内达标 → 买卖置灰,并显示禁止开仓标识。"""
"""满仓 / 同向上限 / 日内达标 → 买卖置灰;点差过大时买卖区提示(不禁开)。"""
if not hasattr(self, "btn_buy"):
return
try:
@@ -1135,6 +1138,7 @@ class OrderApp(tk.Tk):
self._set_trade_btn(self.btn_buy, can_buy, COLOR_BUY)
self._set_trade_btn(self.btn_sell, can_sell, COLOR_SELL)
spread_wide = self._last_spread > SPREAD_WARN_USD + 1e-9
pct = rate * 100.0
if lock_kind == "loss":
badge = f"亏损达标 {pct:.2f}% · 禁止开仓"
@@ -1151,14 +1155,32 @@ class OrderApp(tk.Tk):
banner = f"持仓已满 {MAX_OPEN_POSITIONS} 笔,平仓后再开"
color = COLOR_WARN
bg = "#3a3220"
elif spread_wide:
badge = f"点差偏大 {self._last_spread:.2f}$"
banner = (
f"⚠ 点差过大 {self._last_spread:.2f}$(阈值 {SPREAD_WARN_USD:.2f})|"
"建议暂缓开仓"
)
color = COLOR_WARN
bg = "#3a3220"
else:
badge = ""
banner = ""
color = COLOR_NEUTRAL
bg = "#1e1e1e"
bg = COLOR_BG
self.lbl_day_lock.configure(text=badge, fg=color, bg=bg if badge else "#1e1e1e")
self.lbl_open_block.configure(text=banner, fg=color, bg=bg if banner else "#1e1e1e")
# 买卖按钮文案:可开且点差大时直接写在按钮上
if can_buy:
self.btn_buy.configure(text="买入 ⚠点差大" if spread_wide else "买入")
else:
self.btn_buy.configure(text="买入")
if can_sell:
self.btn_sell.configure(text="卖出 ⚠点差大" if spread_wide else "卖出")
else:
self.btn_sell.configure(text="卖出")
self.lbl_day_lock.configure(text=badge, fg=color, bg=bg if badge else COLOR_CARD)
self.lbl_open_block.configure(text=banner, fg=color, bg=bg if banner else COLOR_BG)
def _toggle_ticket_select(self, ticket: int) -> None:
if ticket in self._selected_tickets_set:
@@ -1405,6 +1427,7 @@ class OrderApp(tk.Tk):
market_open = False
spread = ask - bid if ask and bid else 0.0
self._last_spread = spread
try:
buy, sell, profit = self.bridge.exposure(symbol)
except TradeError:
@@ -1445,11 +1468,14 @@ class OrderApp(tk.Tk):
self.lbl_quote.configure(text=f"Bid {bid:.{digits}f} Ask {ask:.{digits}f}")
else:
self.lbl_quote.configure(text="Bid -- Ask --")
spread_wide = spread > SPREAD_WARN_USD + 1e-9
self.lbl_info.configure(
text=(
f"点差 {spread:.{digits}f} ATR {atr_txt} "
f"点差 {spread:.{digits}f}"
f"{' ⚠偏大' if spread_wide else ''} ATR {atr_txt} "
f"SL${sl_txt} TP${tp_txt} 持仓 {pos} 浮盈 {profit:.2f}"
)
),
fg=COLOR_WARN if spread_wide else COLOR_MUTED,
)
try:
day = self.bridge.day_ohlc(symbol)