From 84d2ceca490fd19de4a1bdac953543ff71a6391e Mon Sep 17 00:00:00 2001 From: lintaogood Date: Thu, 10 Apr 2025 11:44:22 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修正不稳定问题,修改预警更新周期 --- 监控个股.py | 68 +++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 53 insertions(+), 15 deletions(-) diff --git a/监控个股.py b/监控个股.py index 7012c7a..cc226f4 100644 --- a/监控个股.py +++ b/监控个股.py @@ -13,24 +13,30 @@ class StockMonitor: self.master.title("股票价格监控系统") ts.set_token('9343e641869058684afeadfcfe7fd6684160852e52e85332a7734c8d') self.pro = ts.pro_api() + self.time_interval = 10 # 监控间隔时间(秒) + self.auto_push_var = tk.IntVar(value=0) # 自动下单开关 self.create_widgets() self.monitor_active = True self.start_monitor() + + # 构建界面 def create_widgets(self): # 创建Treeview容器框架 tree_frame = ttk.Frame(self.master) tree_frame.pack(padx=10, pady=10, fill=tk.BOTH, expand=True) + style = ttk.Style() + style.configure('Larger.TButton', font=('微软雅黑', 12)) # 创建Treeview self.tree = ttk.Treeview( tree_frame, columns=('code', 'name', 'price', 'target', 'status', 'alert_time'), show='headings', - height=15 # 设置默认显示行数 + height=20 # 设置默认显示行数 ) # self.tree.tag_configure('triggered', background='red') # 新增样式配置 - self.tree.tag_configure('triggered', foreground='red') # 修改样式配置 + self.tree.tag_configure('triggered', foreground='red', font=('Verdana', 12, 'bold')) # 修改样式配置 # 配置列属性 columns = [ @@ -39,7 +45,7 @@ class StockMonitor: ('price', '当前价', 80), ('target', '目标价', 80), ('status', '状态', 60), - ('alert_time', '预警时间', 100) + ('alert_time', '预警时间', 180) ] for col_id, col_text, col_width in columns: @@ -58,13 +64,27 @@ class StockMonitor: self.tree.pack(side=tk.LEFT, fill=tk.BOTH, expand=True) vsb.pack(side=tk.RIGHT, fill=tk.Y) + # 创建控制按钮框架 + control_frame = ttk.Frame(self.master) + control_frame.pack(pady=10) + # 文件选择按钮(原有代码保持不变) self.btn_load = ttk.Button( - self.master, - text="选择监控列表文件", - command=self.select_file + control_frame, + text="选择监控文件", + command=self.select_file, + style='Larger.TButton' # 应用样式 ) - self.btn_load.pack(pady=10) + # self.btn_load.pack(pady=10) + self.btn_load.pack(side=tk.LEFT, padx=5) # 显式指定侧边排列 + + # 添加复选框 + self.auto_push_cb = ttk.Checkbutton( + control_frame, + text="自动下单", + variable=self.auto_push_var + ) + self.auto_push_cb.pack(side=tk.LEFT, padx=5) def select_file(self): filepath = filedialog.askopenfilename( @@ -177,26 +197,30 @@ class StockMonitor: batch_size = 40 for i in range(0, len(codes), batch_size): batch = codes[i:i+batch_size] - # print(f"更新批次:{batch}") + print(f"更新批次:{batch}") df = ts.realtime_quote(ts_code=','.join(batch)) - print("所有列名:", df.columns.tolist()) - print(df[required_columns]) + # print("所有列名:", df.columns.tolist()) + # print(df[required_columns]) for _, row in df.iterrows(): code = row['TS_CODE'] - print(code) + # print(code) # current_price = row['close'] current_price = row['PRICE'] - print(current_price) + # print(current_price) item = self.find_tree_item(code) if item: self.tree.set(item, 'price', f"{current_price:.2f}") target = float(self.tree.item(item)['values'][3]) - print(current_price) - print(target) + # print(current_price) + # print(target) if current_price >= target and self.tree.item(item)['values'][4] != '已触发': now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") self.master.after(0, self.tree.set, item, 'alert_time', now) + # 自动下单 + if self.auto_push_var.get(): + self.autopush(item) + self.tree.set(item, 'status', '已触发') self.tree.item(item, tags=('triggered',)) messagebox.showwarning( @@ -216,13 +240,27 @@ class StockMonitor: def monitor_loop(): while self.monitor_active: self.update_prices() - time.sleep(10) + time.sleep(self.time_interval) threading.Thread(target=monitor_loop, daemon=True).start() def on_closing(self): self.monitor_active = False self.master.destroy() + # 扩展自动下单: + def autopush(self, item): + code = self.tree.item(item)['values'][0] + current_price = float(self.tree.item(item)['values'][2]) + print(code) + confirm = messagebox.askyesno( + "确认下单", + f"确认为 {code} 在当前价 {current_price} 自动买入吗?" + ) + if confirm: + # 调用真实交易接口示例: + # result = trade_api.sell(code, current_price) + # ... 处理下单结果 ... + messagebox.showinfo("下单成功", "已执行自动买入操作") if __name__ == "__main__":