Warn on buy/sell when spread exceeds 0.50 USD.
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user