找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 股票 资源 源码
查看: 202|回复: 0

刚刚,QMT一键清仓V2.2发布(含源码);5秒清仓所有股票

[复制链接]

1454

主题

96

回帖

4万

积分

管理员

积分
48834
发表于 2025-12-27 07:00:27 | 显示全部楼层 |阅读模式
账号被关一周,启用这个公众号更新工具类,指标类关注备用号简介
本工具用于在交易时段对当前账户的股票持仓执行一键清仓操作,支持按比例清仓、定时执行、并提供持仓盈亏比例的可视化展示(盈利红色,亏损绿色)。
baa1f4097ecfe8d18735089c4c4e2cea.png 环境要求
  • • 已安装并正确配置 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 显示为绿色;无法计算或数据缺失显示为黑色。 3864c68df1965e5674881105ead3a95e.png
清仓策略与撮合规则
  • 交易时段识别
    • • 早盘集合竞价、早盘连续、午盘连续、收盘集合竞价与非交易时间自动识别;
    • • 非交易时间将提示并拒绝执行清仓。
  • 委托价格策略
    • • 集合竞价:优先使用跌停价;获取失败时使用“最新价的 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的分享







您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋| 股指标网 ( 渝ICP备2024026571号-1 )

GMT+8, 2026-1-10 03:20 Powered by Discuz! X3.5