|
账号被关一周,启用这个公众号更新工具类,指标类关注备用号简介本工具用于在交易时段对当前账户的股票持仓执行一键清仓操作,支持按比例清仓、定时执行、并提供持仓盈亏比例的可视化展示(盈利红色,亏损绿色)。
环境要求- • 已安装并正确配置 QMT 交易端(Mini 版)及交易权限;
- • 随 QMT 安装的 xtquant 环境可用;
- • 已安装 Python 3.x 并可运行脚本;
- • 网络与交易账户状态正常(能连接交易服务器并订阅账户)。
相关文件说明- • QMT一键清仓V2.2.py:主程序(图形界面)。
- • qingcang_config.json:配置文件(保存 QMT 路径、资金账号、是否二次确认)。
界面与功能说明- • 顶部参数区:
- • QMT 路径:选择 QMT 安装目录下的 userdata_mini 路径(可点击“浏览...”)。
- • 资金账号:填写股票账户的资金账号。
- • 参数设置区:
- • 清仓比例:支持 1/1、1/2、1/3、1/4 四档;清仓下单数量会按手数(100股)取整,不足一手会自动跳过。
- • 定时(HH:MM):设置当天单次定时清仓的触发时间(如 14:57)。
- • 执行前二次确认:勾选则在执行清仓前弹出确认对话框;可在确认时选择下次不再弹出。
- • 按钮区:
- • 测试连接:测试与交易服务器的连接与账户订阅是否成功。
- • 选择持仓:加载当前持仓并显示在页面(同时自动刷新展示)。
- • 全选/取消全选:单键切换,针对“当前页面已加载的持仓项”执行全选或全部取消。
- • 一键清仓:按当前勾选的持仓(若无勾选则视为全部持仓)依设定比例执行清仓。
- • 启动定时清仓:启动定时任务,到达设定时间后自动执行一次清仓。
- • 停止定时清仓:停止已启动的定时任务。
- • 保存设置:将当前 QMT 路径、资金账号及确认设置写入 qingcang_config.json。
- • 持仓选择区(列表):
- • 每条持仓显示:代码 名称 持仓 可用 成本 现价 盈亏;
- • 盈亏比例计算:
- • 优先使用“成本价 vs 最新价”计算;
- • 若成本价不可用,则使用“昨收 vs 最新价”的涨跌幅作为替代;
- • 颜色约定:盈亏≥0 显示为红色;盈亏<0 显示为绿色;无法计算或数据缺失显示为黑色。
清仓策略与撮合规则- • 交易时段识别:
- • 早盘集合竞价、早盘连续、午盘连续、收盘集合竞价与非交易时间自动识别;
- • 非交易时间将提示并拒绝执行清仓。
- • 委托价格策略:
- • 集合竞价:优先使用跌停价;获取失败时使用“最新价的 90%”作为保守替代;
- • 连续竞价:使用“对手价”(买一价略减 0.01,确保快速成交)。
- • 下单数量与节奏:
- • 按设定清仓比例计算目标数量,并按“手数(100股)”取整;
- • 循环尝试清仓最长约 15 秒,期间动态重查可用持仓与估算已卖出,直到目标基本完成或超时;
- • 完成后统计成功/失败委托,并进行一次持仓复查。
定时清仓- • 在参数区设置 HH:MM;
- • 点击 启动定时清仓 后,系统在到达该时间点时执行一次清仓;
- • 执行完毕后会自动结束定时任务,如需再次执行需重新启动定时任务。
操作指引(建议流程)- 1. 点击 测试连接,确认能连接交易服务器并订阅账户成功;
- 2. 填写或选择 QMT 路径 与 资金账号,必要时点击 保存设置;
- 3. 点击 选择持仓,自动刷新并加载当前持仓列表,查看盈亏;
- 4. 如需调整选择,点击 全选/取消全选 或手动勾选/取消各标的;
- 5. 选择清仓比例后,点击 一键清仓,并按提示确认(如开启了二次确认);
- 6. 如需在特定时间执行,设置 定时(HH:MM) 后点击 启动定时清仓。
常见问题(FAQ)- • Q:成本价缺失怎么办?
- • A:工具会自动回退为“昨收 vs 最新价”的涨跌幅显示;盈亏比例仍会按颜色区分。
- • Q:为什么部分标的显示为黑色?
- • A:行情或成本数据缺失时无法计算盈亏比例,统一以黑色显示;不影响后续清仓逻辑。
- • Q:不足一手(<100股)的数量会如何处理?
- • A:清仓数量按手数取整,不足一手会被跳过,避免报错或无法成交。
- • Q:停牌或不可交易的标的如何处理?
- • A:在清仓流程中会检查交易状态,停牌或不可交易的标的会被跳过并提示。
- • Q:是否支持自动刷新盈亏?
- • A:当前不做轮询刷新;每次点击 选择持仓 会自动刷新并生成最新展示。
风险提示- • 交易存在风险:请在充分理解规则与市场风险的前提下使用本工具;
- • 清仓逻辑以“快速成交”为目标,可能导致成交价格与理想价格存在偏差;
- • 建议在真实账户使用前先于模拟环境进行充分测试。
版本变更说明(V2.2)- • 移除了 预览持仓 按钮与入口;
- • 新增 全选/取消全选 单键切换,作用于当前页面已加载的持仓项;
- • 在 选择持仓 中展示盈亏比例(盈利红色、亏损绿色),点击即可刷新。
配置与授权说明- • qingcang_config.json 示例:{
"qmt_path": "D:\\通达信\\QMT\\国金QMT交易端模拟\\userdata_mini",
"account_id": "XXXXXX",
"confirm_before_clear": false
} - • 授权与到期:若程序提示授权到期,请按提示联系作者获取授权。
代码整体功能解释1.说明
这是一个基于QMT(迅投极速交易终端)的股票一键清仓工具,具备可视化GUI界面,核心功能是自动卖出指定股票账户的持仓,支持按比例清仓、定时清仓,还能识别交易时段并适配不同的卖出定价策略,同时包含授权过期检查、持仓查询、交易连接测试等辅助功能。 2. 导入依赖库from xtquant import xtdata # QMT的行情数据模块,用于获取股票行情、详情
from xtquant.xttrader import XtQuantTrader # QMT的交易客户端类,用于连接交易服务器、下单
from xtquant.xttype import StockAccount # QMT的股票账户类,标识交易账户
from xtquant import xtconstant # QMT的常量定义(如订单类型、价格类型)
import datetime # 日期时间处理
import time # 时间休眠、计时
import random # 生成随机数(用于会话ID)
import os # 系统路径、文件操作
import json # 配置文件读写(JSON格式)
import threading # 多线程(用于定时清仓)
import tkinter as tk # GUI界面开发
from tkinter import filedialog, messagebox # 文件选择、弹窗提示
from sys import exit # 程序退出作用:导入工具运行所需的核心库,其中xtquant是QMT的专属量化接口库,tkinter用于做可视化界面。 3. 核心清仓类 MiniQMTClearAll这是工具的核心类,封装了所有清仓相关逻辑: 3.1 初始化方法def __init__(self, qmt_path, account_id):
"""
初始化一键清仓类
:param qmt_path: QMT安装路径下的userdata_mini文件夹路径
:param account_id: 资金账号
"""
self.qmt_path = qmt_path # QMT的userdata_mini路径(必填,用于连接交易端)
self.account_id = account_id # 股票资金账号
self.session_id = random.randint(100000, 999999) # 随机会话ID(避免重复连接)
self.trader = None # 交易客户端实例
self.account = None # 股票账户实例作用:初始化清仓工具的基础参数,包括QMT路径、账号、随机会话ID。 3.2 连接交易服务器def connect_trader(self):
"""连接交易服务器"""
try:
print(f"[DEBUG] 开始连接交易服务器, qmt_path={self.qmt_path}, account_id={self.account_id}, session_id={self.session_id}")
self.trader = XtQuantTrader(self.qmt_path, self.session_id) # 创建交易客户端
self.trader.start() # 启动客户端
connect_result = self.trader.connect() # 连接交易服务器
print(f"[DEBUG] connect_result={connect_result}")
if connect_result != 0:
print("交易服务器连接失败")
returnFalse
self.account = StockAccount(self.account_id, 'STOCK') # 创建股票账户对象
subscribe_result = self.trader.subscribe(self.account) # 订阅账户(获取持仓、订单等数据)
print(f"[DEBUG] subscribe_result={subscribe_result}")
if subscribe_result != 0:
print("账户订阅失败")
returnFalse
print("交易服务器连接成功")
returnTrue
except Exception as e:
print(f"连接交易服务器时发生异常: {e}")
return False作用:创建QMT交易客户端并连接服务器,订阅指定股票账户,是所有交易操作的前提;连接失败返回False,成功返回True。 3.3 判断交易时段def get_current_time_period(self):
"""
判断当前所处的交易时段
返回: period_type - 'auction_am'(早盘竞价), 'continuous_am'(早盘连续),
'auction_pm'(午盘竞价), 'continuous_pm'(午盘连续), 'non_trading'(非交易时间)
"""
now = datetime.datetime.now()
current_time = now.time()
# 定义交易时段(A股交易时间)
morning_auction_start = datetime.time(9, 15) # 早盘集合竞价开始
morning_auction_end = datetime.time(9, 25) # 早盘集合竞价结束
morning_continuous_start = datetime.time(9, 30) # 早盘连续交易开始
noon_end = datetime.time(11, 30) # 午间休市
afternoon_start = datetime.time(13, 0) # 下午开盘
afternoon_auction_start = datetime.time(14, 57) # 收盘集合竞价开始
market_close = datetime.time(15, 0) # 收盘
# 分段判断当前时段
if morning_auction_start <= current_time <= morning_auction_end:
return'auction_am'
elif morning_continuous_start <= current_time <= noon_end:
return'continuous_am'
elif afternoon_start <= current_time < afternoon_auction_start:
return'continuous_pm'
elif afternoon_auction_start <= current_time <= market_close:
return'auction_pm'
else:
return 'non_trading'作用:识别当前时间属于A股的哪个交易时段(集合竞价/连续交易/非交易时间),为后续卖出定价策略提供依据。 3.4 股票信息获取(跌停价、最新价、名称等)def get_stock_detail(self, stock_code):
"""获取股票的详细信息,包括跌停价等"""
try:
detail = xtdata.get_instrument_detail(stock_code) # 获取股票基础信息
if detail:
lower_limit = detail.get('DownStopPrice', 0) # 跌停价
upper_limit = detail.get('UpStopPrice', 0) # 涨停价
return lower_limit, upper_limit
except Exception as e:
print(f"获取股票{stock_code}详情失败: {e}")
return0, 0
defget_stock_name(self, stock_code):
"""获取股票名称"""
try:
detail = xtdata.get_instrument_detail(stock_code)
if detail:
name = detail.get('InstrumentName', '') or detail.get('Name', '')
return name
except Exception:
pass
return''
defget_market_price(self, stock_code):
"""获取股票的最新市场价格(最新价、买一价、卖一价)"""
try:
tick_data = xtdata.get_full_tick([stock_code]) # 获取实时行情
if stock_code in tick_data:
last_price = tick_data[stock_code].get('lastPrice', 0) # 最新价
bid_prices = tick_data[stock_code].get('bidPrice', [0]) # 买一价列表
ask_prices = tick_data[stock_code].get('askPrice', [0]) # 卖一价列表
return last_price, bid_prices[0] if bid_prices else last_price, ask_prices[0] if ask_prices else last_price
except Exception as e:
print(f"获取股票{stock_code}行情失败: {e}")
return0, 0, 0作用:封装股票基础信息、实时行情的获取逻辑,为清仓定价、持仓展示提供数据。 3.5 核心清仓逻辑 clear_positions这是最核心的方法,逻辑拆解: - 1. 先连接交易服务器,获取当前持仓;
- 2. 过滤出需要清仓的股票(若指定了标的则只清这些,否则清全部);
- 3. 判断当前交易时段,非交易时间直接返回失败;
- 4. 遍历每只持仓股票,按比例计算需卖出数量(按手数取整,A股1手=100股);
- 5. 循环尝试卖出:
- • 集合竞价时段:用跌停价挂单(确保能成交);
- • 连续交易时段:用买一价-0.01挂单(略低于对手价,加速成交);
- • 每轮卖出后休眠2秒,重新查询可用持仓,直到卖完/超时(15秒)/价格无效;
- 6. 统计成功/失败数量,最后复查剩余持仓并输出结果。
4. GUI界面逻辑 run_gui该函数创建可视化界面,包含以下功能模块: - • 参数配置:QMT路径、资金账号、清仓比例、定时时间;
- • 功能按钮:测试连接、选择持仓(展示持仓并可勾选)、一键清仓、启动/停止定时清仓、保存设置;
- • 辅助功能:
- • 持仓展示:显示股票代码/名称/总持仓/可用持仓/涨跌幅(红涨绿跌);
- • 日志输出:实时显示操作过程;
- • 配置保存:将QMT路径、账号等保存到JSON文件,下次启动自动加载;
- • 定时清仓:通过多线程实现,到指定时间自动执行清仓;
- • 二次确认:清仓前弹窗提示,可选择关闭后续提示。
5. 程序入口if __name__ == '__main__':
run_gui()作用:启动程序时,直接运行GUI界面。 关键注意事项- 1. 运行前提:需安装QMT终端,且配置好userdata_mini路径,账号需已登录QMT;
- 2. 交易规则:A股卖出需按手数(100股倍数),且可用持仓才可以卖出;
- 3. 定价策略:集合竞价用跌停价、连续交易用买一价-0.01,核心是“快速成交”;
- 4. 风险提示:清仓是不可逆操作,代码中虽有二次确认,但仍需谨慎使用。
最后,我将一键清仓工具进行了打包,方便不会PY的朋友直接使用
通过网盘分享的文件:QMT一键清仓V2.2.zip链接: https://pan.baidu.com/s/1eA2FMLVRQdzTnihRk2rNLQ?pwd=pam5 提取码: pam5 --来自百度网盘超级会员v7的分享
|