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"
|
COLOR_ACCENT = "#4cc2ff"
|
||||||
BE_MIN_MOVE_USD = 3.0 # 价格向有利方向走出该美金距离才可保本(非账户浮盈)
|
BE_MIN_MOVE_USD = 3.0 # 价格向有利方向走出该美金距离才可保本(非账户浮盈)
|
||||||
BE_OFFSET_USD = 1.0 # 保本止损 = 开仓价 ± 1$
|
BE_OFFSET_USD = 1.0 # 保本止损 = 开仓价 ± 1$
|
||||||
|
SPREAD_WARN_USD = 0.50 # 点差超过该美金时,买卖按钮区提示(不禁开)
|
||||||
|
|
||||||
|
|
||||||
def simpledialog_ask_server(parent: tk.Misc) -> str:
|
def simpledialog_ask_server(parent: tk.Misc) -> str:
|
||||||
@@ -715,6 +716,7 @@ class OrderApp(tk.Tk):
|
|||||||
self._pos_sig = None
|
self._pos_sig = None
|
||||||
self._pos_profit_labels: dict = {}
|
self._pos_profit_labels: dict = {}
|
||||||
self._metric_values: dict = {}
|
self._metric_values: dict = {}
|
||||||
|
self._last_spread: float = 0.0
|
||||||
self._build_ui()
|
self._build_ui()
|
||||||
self.after(200, self._try_connect_and_refresh)
|
self.after(200, self._try_connect_and_refresh)
|
||||||
self.after(3000, self._hub_heartbeat)
|
self.after(3000, self._hub_heartbeat)
|
||||||
@@ -987,6 +989,7 @@ class OrderApp(tk.Tk):
|
|||||||
root,
|
root,
|
||||||
text=(
|
text=(
|
||||||
f"最多同时 {MAX_OPEN_POSITIONS} 笔 · 同向≤{MAX_SIDE_LOTS:.2f} 手 · "
|
f"最多同时 {MAX_OPEN_POSITIONS} 笔 · 同向≤{MAX_SIDE_LOTS:.2f} 手 · "
|
||||||
|
f"点差>{SPREAD_WARN_USD:.2f} 买卖提示 · "
|
||||||
"亏≥5%或盈≥10%禁止开仓 · 保本:有利方向>3$ 后止损到开仓价±1$"
|
"亏≥5%或盈≥10%禁止开仓 · 保本:有利方向>3$ 后止损到开仓价±1$"
|
||||||
),
|
),
|
||||||
bg=COLOR_BG,
|
bg=COLOR_BG,
|
||||||
@@ -1110,7 +1113,7 @@ class OrderApp(tk.Tk):
|
|||||||
)
|
)
|
||||||
|
|
||||||
def _sync_open_buttons(self, symbol: str) -> None:
|
def _sync_open_buttons(self, symbol: str) -> None:
|
||||||
"""满仓 / 同向上限 / 日内达标 → 买卖置灰,并显示禁止开仓标识。"""
|
"""满仓 / 同向上限 / 日内达标 → 买卖置灰;点差过大时买卖区提示(不禁开)。"""
|
||||||
if not hasattr(self, "btn_buy"):
|
if not hasattr(self, "btn_buy"):
|
||||||
return
|
return
|
||||||
try:
|
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_buy, can_buy, COLOR_BUY)
|
||||||
self._set_trade_btn(self.btn_sell, can_sell, COLOR_SELL)
|
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
|
pct = rate * 100.0
|
||||||
if lock_kind == "loss":
|
if lock_kind == "loss":
|
||||||
badge = f"亏损达标 {pct:.2f}% · 禁止开仓"
|
badge = f"亏损达标 {pct:.2f}% · 禁止开仓"
|
||||||
@@ -1151,14 +1155,32 @@ class OrderApp(tk.Tk):
|
|||||||
banner = f"持仓已满 {MAX_OPEN_POSITIONS} 笔,平仓后再开"
|
banner = f"持仓已满 {MAX_OPEN_POSITIONS} 笔,平仓后再开"
|
||||||
color = COLOR_WARN
|
color = COLOR_WARN
|
||||||
bg = "#3a3220"
|
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:
|
else:
|
||||||
badge = ""
|
badge = ""
|
||||||
banner = ""
|
banner = ""
|
||||||
color = COLOR_NEUTRAL
|
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:
|
def _toggle_ticket_select(self, ticket: int) -> None:
|
||||||
if ticket in self._selected_tickets_set:
|
if ticket in self._selected_tickets_set:
|
||||||
@@ -1405,6 +1427,7 @@ class OrderApp(tk.Tk):
|
|||||||
market_open = False
|
market_open = False
|
||||||
|
|
||||||
spread = ask - bid if ask and bid else 0.0
|
spread = ask - bid if ask and bid else 0.0
|
||||||
|
self._last_spread = spread
|
||||||
try:
|
try:
|
||||||
buy, sell, profit = self.bridge.exposure(symbol)
|
buy, sell, profit = self.bridge.exposure(symbol)
|
||||||
except TradeError:
|
except TradeError:
|
||||||
@@ -1445,11 +1468,14 @@ class OrderApp(tk.Tk):
|
|||||||
self.lbl_quote.configure(text=f"Bid {bid:.{digits}f} Ask {ask:.{digits}f}")
|
self.lbl_quote.configure(text=f"Bid {bid:.{digits}f} Ask {ask:.{digits}f}")
|
||||||
else:
|
else:
|
||||||
self.lbl_quote.configure(text="Bid -- Ask --")
|
self.lbl_quote.configure(text="Bid -- Ask --")
|
||||||
|
spread_wide = spread > SPREAD_WARN_USD + 1e-9
|
||||||
self.lbl_info.configure(
|
self.lbl_info.configure(
|
||||||
text=(
|
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}"
|
f"SL${sl_txt} TP${tp_txt} 持仓 {pos} 浮盈 {profit:.2f}"
|
||||||
)
|
),
|
||||||
|
fg=COLOR_WARN if spread_wide else COLOR_MUTED,
|
||||||
)
|
)
|
||||||
try:
|
try:
|
||||||
day = self.bridge.day_ohlc(symbol)
|
day = self.bridge.day_ohlc(symbol)
|
||||||
|
|||||||
Binary file not shown.
Reference in New Issue
Block a user