提交更新
修正不稳定问题,修改预警更新周期
This commit is contained in:
68
监控个股.py
68
监控个股.py
@@ -13,24 +13,30 @@ class StockMonitor:
|
|||||||
self.master.title("股票价格监控系统")
|
self.master.title("股票价格监控系统")
|
||||||
ts.set_token('9343e641869058684afeadfcfe7fd6684160852e52e85332a7734c8d')
|
ts.set_token('9343e641869058684afeadfcfe7fd6684160852e52e85332a7734c8d')
|
||||||
self.pro = ts.pro_api()
|
self.pro = ts.pro_api()
|
||||||
|
self.time_interval = 10 # 监控间隔时间(秒)
|
||||||
|
self.auto_push_var = tk.IntVar(value=0) # 自动下单开关
|
||||||
self.create_widgets()
|
self.create_widgets()
|
||||||
self.monitor_active = True
|
self.monitor_active = True
|
||||||
self.start_monitor()
|
self.start_monitor()
|
||||||
|
|
||||||
|
|
||||||
|
# 构建界面
|
||||||
def create_widgets(self):
|
def create_widgets(self):
|
||||||
# 创建Treeview容器框架
|
# 创建Treeview容器框架
|
||||||
tree_frame = ttk.Frame(self.master)
|
tree_frame = ttk.Frame(self.master)
|
||||||
tree_frame.pack(padx=10, pady=10, fill=tk.BOTH, expand=True)
|
tree_frame.pack(padx=10, pady=10, fill=tk.BOTH, expand=True)
|
||||||
|
style = ttk.Style()
|
||||||
|
style.configure('Larger.TButton', font=('微软雅黑', 12))
|
||||||
|
|
||||||
# 创建Treeview
|
# 创建Treeview
|
||||||
self.tree = ttk.Treeview(
|
self.tree = ttk.Treeview(
|
||||||
tree_frame,
|
tree_frame,
|
||||||
columns=('code', 'name', 'price', 'target', 'status', 'alert_time'),
|
columns=('code', 'name', 'price', 'target', 'status', 'alert_time'),
|
||||||
show='headings',
|
show='headings',
|
||||||
height=15 # 设置默认显示行数
|
height=20 # 设置默认显示行数
|
||||||
)
|
)
|
||||||
# self.tree.tag_configure('triggered', background='red') # 新增样式配置
|
# 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 = [
|
columns = [
|
||||||
@@ -39,7 +45,7 @@ class StockMonitor:
|
|||||||
('price', '当前价', 80),
|
('price', '当前价', 80),
|
||||||
('target', '目标价', 80),
|
('target', '目标价', 80),
|
||||||
('status', '状态', 60),
|
('status', '状态', 60),
|
||||||
('alert_time', '预警时间', 100)
|
('alert_time', '预警时间', 180)
|
||||||
]
|
]
|
||||||
|
|
||||||
for col_id, col_text, col_width in columns:
|
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)
|
self.tree.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
|
||||||
vsb.pack(side=tk.RIGHT, fill=tk.Y)
|
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.btn_load = ttk.Button(
|
||||||
self.master,
|
control_frame,
|
||||||
text="选择监控列表文件",
|
text="选择监控文件",
|
||||||
command=self.select_file
|
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):
|
def select_file(self):
|
||||||
filepath = filedialog.askopenfilename(
|
filepath = filedialog.askopenfilename(
|
||||||
@@ -177,26 +197,30 @@ class StockMonitor:
|
|||||||
batch_size = 40
|
batch_size = 40
|
||||||
for i in range(0, len(codes), batch_size):
|
for i in range(0, len(codes), batch_size):
|
||||||
batch = codes[i:i+batch_size]
|
batch = codes[i:i+batch_size]
|
||||||
# print(f"更新批次:{batch}")
|
print(f"更新批次:{batch}")
|
||||||
df = ts.realtime_quote(ts_code=','.join(batch))
|
df = ts.realtime_quote(ts_code=','.join(batch))
|
||||||
print("所有列名:", df.columns.tolist())
|
# print("所有列名:", df.columns.tolist())
|
||||||
print(df[required_columns])
|
# print(df[required_columns])
|
||||||
for _, row in df.iterrows():
|
for _, row in df.iterrows():
|
||||||
code = row['TS_CODE']
|
code = row['TS_CODE']
|
||||||
print(code)
|
# print(code)
|
||||||
# current_price = row['close']
|
# current_price = row['close']
|
||||||
current_price = row['PRICE']
|
current_price = row['PRICE']
|
||||||
print(current_price)
|
# print(current_price)
|
||||||
item = self.find_tree_item(code)
|
item = self.find_tree_item(code)
|
||||||
if item:
|
if item:
|
||||||
self.tree.set(item, 'price', f"{current_price:.2f}")
|
self.tree.set(item, 'price', f"{current_price:.2f}")
|
||||||
target = float(self.tree.item(item)['values'][3])
|
target = float(self.tree.item(item)['values'][3])
|
||||||
print(current_price)
|
# print(current_price)
|
||||||
print(target)
|
# print(target)
|
||||||
if current_price >= target and self.tree.item(item)['values'][4] != '已触发':
|
if current_price >= target and self.tree.item(item)['values'][4] != '已触发':
|
||||||
now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
||||||
self.master.after(0, self.tree.set, item, 'alert_time', now)
|
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.set(item, 'status', '已触发')
|
||||||
self.tree.item(item, tags=('triggered',))
|
self.tree.item(item, tags=('triggered',))
|
||||||
messagebox.showwarning(
|
messagebox.showwarning(
|
||||||
@@ -216,13 +240,27 @@ class StockMonitor:
|
|||||||
def monitor_loop():
|
def monitor_loop():
|
||||||
while self.monitor_active:
|
while self.monitor_active:
|
||||||
self.update_prices()
|
self.update_prices()
|
||||||
time.sleep(10)
|
time.sleep(self.time_interval)
|
||||||
threading.Thread(target=monitor_loop, daemon=True).start()
|
threading.Thread(target=monitor_loop, daemon=True).start()
|
||||||
|
|
||||||
def on_closing(self):
|
def on_closing(self):
|
||||||
self.monitor_active = False
|
self.monitor_active = False
|
||||||
self.master.destroy()
|
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__":
|
if __name__ == "__main__":
|
||||||
|
|||||||
Reference in New Issue
Block a user