提交更新
增加显示合格的个股数量,新增数据列,流通盘,和 开盘涨幅。
This commit is contained in:
60
监控个股.py
60
监控个股.py
@@ -18,6 +18,8 @@ class StockMonitor:
|
|||||||
self.create_widgets()
|
self.create_widgets()
|
||||||
self.monitor_active = True
|
self.monitor_active = True
|
||||||
self.start_monitor()
|
self.start_monitor()
|
||||||
|
self.trigger_count = 0
|
||||||
|
#self.trigger_count_label = None # 新增Label变量
|
||||||
|
|
||||||
|
|
||||||
# 构建界面
|
# 构建界面
|
||||||
@@ -31,21 +33,23 @@ class StockMonitor:
|
|||||||
# 创建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', 'open_zf', 'lt_pan', 'price', 'target', 'status', 'alert_time'),
|
||||||
show='headings',
|
show='headings',
|
||||||
height=20 # 设置默认显示行数
|
height=20 # 设置默认显示行数
|
||||||
)
|
)
|
||||||
# self.tree.tag_configure('triggered', background='red') # 新增样式配置
|
# 新增样式配置
|
||||||
self.tree.tag_configure('triggered', foreground='red', font=('Verdana', 12, 'bold')) # 修改样式配置
|
self.tree.tag_configure('triggered', foreground='red', font=('Verdana', 11, 'bold')) # 修改样式配置
|
||||||
|
|
||||||
# 配置列属性
|
# 配置列属性
|
||||||
columns = [
|
columns = [
|
||||||
('code', '代码', 80),
|
('code', '代码', 80),
|
||||||
('name', '名称', 80),
|
('name', '名称', 80),
|
||||||
|
('open_zf', '开盘涨幅', 80),
|
||||||
|
('lt_pan', '流通盘', 80),
|
||||||
('price', '当前价', 80),
|
('price', '当前价', 80),
|
||||||
('target', '目标价', 80),
|
('target', '目标价', 80),
|
||||||
('status', '状态', 60),
|
('status', '状态', 60),
|
||||||
('alert_time', '预警时间', 180)
|
('alert_time', '预警时间', 200)
|
||||||
]
|
]
|
||||||
|
|
||||||
for col_id, col_text, col_width in columns:
|
for col_id, col_text, col_width in columns:
|
||||||
@@ -68,6 +72,7 @@ class StockMonitor:
|
|||||||
control_frame = ttk.Frame(self.master)
|
control_frame = ttk.Frame(self.master)
|
||||||
control_frame.pack(pady=10)
|
control_frame.pack(pady=10)
|
||||||
|
|
||||||
|
|
||||||
# 文件选择按钮(原有代码保持不变)
|
# 文件选择按钮(原有代码保持不变)
|
||||||
self.btn_load = ttk.Button(
|
self.btn_load = ttk.Button(
|
||||||
control_frame,
|
control_frame,
|
||||||
@@ -86,6 +91,17 @@ class StockMonitor:
|
|||||||
)
|
)
|
||||||
self.auto_push_cb.pack(side=tk.LEFT, padx=5)
|
self.auto_push_cb.pack(side=tk.LEFT, padx=5)
|
||||||
|
|
||||||
|
status_frame = ttk.Frame(self.master)
|
||||||
|
status_frame.pack(pady=5, fill=tk.X)
|
||||||
|
# 创建数量显示Label
|
||||||
|
self.trigger_count_label = ttk.Label(
|
||||||
|
status_frame,
|
||||||
|
text="已触发股票数量:0",
|
||||||
|
font=('微软雅黑', 14),
|
||||||
|
foreground='red'
|
||||||
|
)
|
||||||
|
self.trigger_count_label.pack(padx=10, pady=5, anchor=tk.W)
|
||||||
|
|
||||||
def select_file(self):
|
def select_file(self):
|
||||||
filepath = filedialog.askopenfilename(
|
filepath = filedialog.askopenfilename(
|
||||||
title="选择监控列表文件",
|
title="选择监控列表文件",
|
||||||
@@ -176,8 +192,9 @@ class StockMonitor:
|
|||||||
def add_stock(self, code, name, target):
|
def add_stock(self, code, name, target):
|
||||||
"""添加股票到监控列表"""
|
"""添加股票到监控列表"""
|
||||||
codes = self.format_code(str(code))
|
codes = self.format_code(str(code))
|
||||||
self.tree.insert('', 'end', values=(codes, name, '-', target, '监控中', ''))
|
self.tree.insert('', 'end', values=(codes, name, '-', '-', '-', target, '监控中', ''))
|
||||||
|
|
||||||
|
# 格式化代码
|
||||||
def format_code(self, code):
|
def format_code(self, code):
|
||||||
# 为股票代码添加后缀
|
# 为股票代码添加后缀
|
||||||
code = f"{code:0>6}" # 确保代码是6位,不足前面补零
|
code = f"{code:0>6}" # 确保代码是6位,不足前面补零
|
||||||
@@ -199,21 +216,27 @@ class StockMonitor:
|
|||||||
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[required_columns])
|
|
||||||
for _, row in df.iterrows():
|
for _, row in df.iterrows():
|
||||||
code = row['TS_CODE']
|
code = row['TS_CODE']
|
||||||
# print(code)
|
|
||||||
# current_price = row['close']
|
|
||||||
current_price = row['PRICE']
|
current_price = row['PRICE']
|
||||||
# print(current_price)
|
# 计算开盘涨幅 / (OPEN-PRE_CLOSE)/PRE_CLOSE*100
|
||||||
|
open_price = row['OPEN']
|
||||||
|
pre_close = row['PRE_CLOSE']
|
||||||
|
open_zf = round((float(open_price) - float(pre_close)) / float(pre_close) * 100, 2)
|
||||||
|
|
||||||
|
# 计算流通盘
|
||||||
|
lt_pan = row['VOLUME'] / 100000000 # 转换为亿
|
||||||
|
|
||||||
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'][5])
|
||||||
|
# 设置开盘涨幅/ (OPEN-PRE_CLOSE)*
|
||||||
|
self.tree.set(item, 'open_zf', f"{open_zf:.2f}%")
|
||||||
|
self.tree.set(item, 'lt_pan', f"{lt_pan:.2f}亿")
|
||||||
# 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'][6] != '已触发':
|
||||||
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)
|
||||||
|
|
||||||
@@ -227,8 +250,19 @@ class StockMonitor:
|
|||||||
"价格提醒",
|
"价格提醒",
|
||||||
f"{code} 已达到目标价!当前价:{current_price}"
|
f"{code} 已达到目标价!当前价:{current_price}"
|
||||||
)
|
)
|
||||||
|
# 使用系统命令播放音频(Windows)
|
||||||
|
#os.system('start example.mp3') # 替换为你的音频文件路径
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"更新失败:{str(e)}")
|
print(f"更新失败:{str(e)}")
|
||||||
|
# 在遍历完所有股票后统计数量
|
||||||
|
triggered_count = 0
|
||||||
|
for item in self.tree.get_children():
|
||||||
|
if self.tree.item(item)['values'][6] == '已触发':
|
||||||
|
triggered_count += 1
|
||||||
|
# 更新Label显示(确保在主线程更新)
|
||||||
|
#self.master.after(0, self.trigger_count_label.config, "text", f"已触发股票数量:{triggered_count}")
|
||||||
|
# 正确写法:
|
||||||
|
self.master.after(0, lambda: self.trigger_count_label.config(text=f"已触发股票数量:{triggered_count}"))
|
||||||
|
|
||||||
def find_tree_item(self, code):
|
def find_tree_item(self, code):
|
||||||
for item in self.tree.get_children():
|
for item in self.tree.get_children():
|
||||||
@@ -247,7 +281,7 @@ class StockMonitor:
|
|||||||
self.monitor_active = False
|
self.monitor_active = False
|
||||||
self.master.destroy()
|
self.master.destroy()
|
||||||
|
|
||||||
# 扩展自动下单:
|
# 扩展自动下单----------------------------------------------------------
|
||||||
def autopush(self, item):
|
def autopush(self, item):
|
||||||
code = self.tree.item(item)['values'][0]
|
code = self.tree.item(item)['values'][0]
|
||||||
current_price = float(self.tree.item(item)['values'][2])
|
current_price = float(self.tree.item(item)['values'][2])
|
||||||
|
|||||||
Reference in New Issue
Block a user