Add roles/ACL so admin and users can issue activation codes; exe opens review login.
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -4,6 +4,7 @@
|
||||
|
||||
- 连接本机已登录 MT5,市价开平、ATR 止损止盈、保本、满仓灰显等(由原 `MT5黄金方案/Desktop` 迁入)
|
||||
- **通用包 + 首次激活**:启动时填写中控地址与激活码
|
||||
- **打开复盘**:主界面按钮用浏览器打开中控 `/login`,用网页账号直接登录复盘
|
||||
- **自动上报**:开仓/平仓成功后 `POST /api/v1/trades`,并上传 M1/M5/M15/H1 K 线供网页复盘
|
||||
|
||||
## 本地配置
|
||||
|
||||
@@ -7,9 +7,10 @@ import math
|
||||
import sys
|
||||
import threading
|
||||
import time
|
||||
import webbrowser
|
||||
import tkinter as tk
|
||||
from datetime import datetime, timedelta
|
||||
from tkinter import messagebox, ttk
|
||||
from tkinter import messagebox, simpledialog, ttk
|
||||
from typing import Any, Optional, Tuple, Union
|
||||
|
||||
# 顶层导入,避免打包 exe 漏依赖
|
||||
@@ -66,6 +67,17 @@ BE_MIN_MOVE_USD = 3.0 # 价格向有利方向走出该美金距离才可保本
|
||||
BE_OFFSET_USD = 1.0 # 保本止损 = 开仓价 ± 1$
|
||||
|
||||
|
||||
def simpledialog_ask_server(parent: tk.Misc) -> str:
|
||||
"""未激活或本地无中控地址时,让用户输入复盘服务器 URL。"""
|
||||
value = simpledialog.askstring(
|
||||
"打开复盘",
|
||||
"请输入中控地址(例如 http://192.168.1.10:5800)",
|
||||
parent=parent,
|
||||
initialvalue="http://127.0.0.1:5800",
|
||||
)
|
||||
return (value or "").strip()
|
||||
|
||||
|
||||
def enable_dpi_awareness() -> None:
|
||||
"""避免高分屏下 Tk 窗口被系统拉伸发虚。"""
|
||||
if sys.platform != "win32":
|
||||
@@ -743,6 +755,9 @@ class OrderApp(tk.Tk):
|
||||
ttk.Label(pos_bar, text="持仓记录", font=("Microsoft YaHei UI", 13, "bold")).pack(side=tk.LEFT)
|
||||
self.btn_break_even = self._mk_btn(pos_bar, "保本", COLOR_BE, self.on_break_even, h=34, w=90)
|
||||
self.btn_break_even.pack(side=tk.RIGHT, padx=4)
|
||||
self._mk_btn(pos_bar, "打开复盘", "#3a5a80", self.on_open_review, h=34, w=100).pack(
|
||||
side=tk.RIGHT, padx=4
|
||||
)
|
||||
self._set_be_button_enabled(False)
|
||||
|
||||
# 持仓列表:无竖线;列宽按权重拉满右侧;平仓红色边框按钮
|
||||
@@ -1430,6 +1445,24 @@ class OrderApp(tk.Tk):
|
||||
|
||||
self._run_async(work)
|
||||
|
||||
def on_open_review(self) -> None:
|
||||
"""打开中控复盘登录页(浏览器)。"""
|
||||
server = ""
|
||||
try:
|
||||
server = (load_device().get("server") or "").rstrip("/")
|
||||
except Exception:
|
||||
server = ""
|
||||
if not server:
|
||||
server = simpledialog_ask_server(self)
|
||||
if not server:
|
||||
return
|
||||
url = server.rstrip("/") + "/login"
|
||||
try:
|
||||
webbrowser.open(url)
|
||||
self.set_status(f"已打开复盘登录页:{url}", ok=True)
|
||||
except Exception as exc:
|
||||
self.set_status(f"无法打开浏览器:{exc}", ok=False)
|
||||
|
||||
def destroy(self) -> None:
|
||||
try:
|
||||
self.bridge.shutdown()
|
||||
|
||||
Reference in New Issue
Block a user