账户查询示例代码
本页面展示如何通过miniQMT接口查询账户资产、持仓、订单和成交信息,实现账户状态的实时监控和管理。
功能说明
该示例代码实现了以下功能:
- 连接miniQMT终端
- 订阅账户信息
- 查询账户资产信息
- 查询委托订单信息
- 查询成交记录
- 查询持仓信息
- 保存和加载配置信息
使用方法
- 点击右侧的「复制代码」按钮一键复制完整代码
- 确保已安装xtquant模块
- 确保miniQMT终端已启动并登录
- 运行代码,按照提示输入QMT安装路径和交易账号
- 代码会自动连接miniQMT终端并查询账户信息
- 查看打印的账户资产、持仓、订单和成交信息
示例代码
account-query.py
# -*- coding: utf-8 -*- """ 申请开通QMT请添加微信咨询gjquant,获取更多资料访问https://miniqmt.com/ 此代码脚本仅用于软件测试,不能用于实盘交易,以此代码进行交易本人不承担任何损失 """ import os import time import pandas as pd from xtquant.xttrader import XtQuantTrader from xtquant.xttype import StockAccount from datetime import datetime # 配置文件路径 CONFIG_FILE = "path.txt" def load_config(): """加载配置文件""" if os.path.exists(CONFIG_FILE): with open(CONFIG_FILE, 'r') as f: lines = f.readlines() if len(lines) >= 2: return lines[0].strip(), lines[1].strip() return None, None def save_config(path, acc): """保存配置文件""" with open(CONFIG_FILE, 'w') as f: f.write(f"{path}\n{acc}") def get_user_input(path=None): """获取用户输入""" print("请输入QMT配置信息(例如: D:\\QMT\\userdata_mini)") if path is None: path = input("QMT安装路径 :").strip() acc = input("交易账号: ").strip() return path, acc def initialize_trader(path, acc): """初始化交易连接""" # 创建交易对象 session_id = int(time.time()) xt_trader = XtQuantTrader(path, session_id) # 连接miniQMT终端 xt_trader.start() connect_result = xt_trader.connect() if connect_result == 0: print('【软件终端连接成功!】') else: print('【软件终端连接失败!】', '\n请运行并登录miniQMT.EXE终端。', '\n检查路径是否正确。') return None, connect_result, None # 订阅账户信息 account = StockAccount(acc, 'STOCK') subscribe_result = xt_trader.subscribe(account) if subscribe_result == 0: print('【账户信息订阅成功!】') return xt_trader, subscribe_result, account else: print('【账户信息订阅失败!】', '\n账户配置错误,检查账号是否正确。') return xt_trader, subscribe_result, account def print_account_info(xt_trader, account): """打印账户信息""" asset = xt_trader.query_stock_asset(account) print('-'*18, f'【{asset.account_id}】', '-'*18) if asset: print(f"资产总额: {asset.total_asset}\n" f"持仓市值:{asset.market_value}\n" f"可用资金:{asset.cash}\n" f"在途资金:{asset.frozen_cash}") def get_orders_df(xt_trader, account): """获取委托信息""" orders = xt_trader.query_stock_orders(account) if not orders: return pd.DataFrame() orders_data = [(order.stock_code, order.order_volume, order.price, order.order_id, order.status_msg, datetime.fromtimestamp(order.order_time).strftime('%H:%M:%S')) for order in orders] return pd.DataFrame(orders_data, columns=['证券代码', '委托数量', '委托价格', '订单编号', '委托状态', '报单时间']) def get_trades_df(xt_trader, account): """获取成交信息""" trades = xt_trader.query_stock_trades(account) if not trades: return pd.DataFrame() trades_data = [(trade.stock_code, trade.traded_volume, trade.traded_price, trade.traded_amount, trade.order_id, trade.traded_id, datetime.fromtimestamp(trade.traded_time).strftime('%H:%M:%S')) for trade in trades] return pd.DataFrame(trades_data, columns=['证券代码', '成交数量', '成交均价', '成交金额', '订单编号', '成交编号', '成交时间']) def get_positions_df(xt_trader, account): """获取持仓信息""" positions = xt_trader.query_stock_positions(account) if not positions: return pd.DataFrame() positions_data = [(position.stock_code, position.volume, position.can_use_volume, position.frozen_volume, position.open_price, position.market_value, position.on_road_volume, position.yesterday_volume) for position in positions] return pd.DataFrame(positions_data, columns=['证券代码', '持仓数量', '可用数量', '冻结数量', '开仓价格', '持仓市值', '在途股份', '昨夜持股']) def print_summary_info(orders_df, trades_df, positions_df): """打印汇总信息""" print('-'*18, '【当日汇总】', '-'*18) print(f"委托个数:{len(orders_df)} 成交个数:{len(trades_df)} 持仓数量:{len(positions_df)}") print('-'*18, "【订单信息】", '-'*18) print(orders_df if not orders_df.empty else "无委托信息") print('-'*18, "【成交信息】", '-'*18) print(trades_df if not trades_df.empty else "无成交信息") print('-'*18, "【持仓信息】", '-'*18) print(positions_df if not positions_df.empty else "无持仓信息") def main(): # 尝试加载已有配置 saved_path, saved_acc = load_config() path, acc = saved_path, saved_acc # 初始化变量 xt_trader = None account = None # 如果配置不存在或连接失败,要求用户重新输入 while True: if path and acc: print(f"使用已保存配置:\n路径: {path}\n账号: {acc}") confirm = input("请选择是否使用此配置?(Y/n): ").strip().lower() if confirm == 'y' or confirm == '': xt_trader, result, account = initialize_trader(path, acc) if result == 0: # 订阅成功 break elif result is None: # 连接失败 path, acc = None, None # 需要重新输入全部信息 else: # 仅订阅失败 path = path # 保留路径 acc = None # 仅需要重新输入账号 # 获取新配置 path, acc = get_user_input(path) # 如果path不为None,则只输入账号 save_config(path, acc) xt_trader, result, account = initialize_trader(path, acc) if result == 0: # 订阅成功 break print("配置失败,请重新输入...\n") # 打印账户信息 print_account_info(xt_trader, account) # 获取并打印交易信息 orders_df = get_orders_df(xt_trader, account) trades_df = get_trades_df(xt_trader, account) positions_df = get_positions_df(xt_trader, account) # 打印汇总信息 print_summary_info(orders_df, trades_df, positions_df) if __name__ == "__main__": main()
代码说明
该示例代码主要包含以下功能模块:
- 配置管理:通过配置文件保存和加载QMT安装路径和交易账号
- 连接管理:初始化交易连接并订阅账户信息
- 账户信息查询:查询账户资产、持仓、订单和成交信息
- 数据处理:将查询结果转换为DataFrame格式,方便查看和分析
- 信息展示:打印账户信息和交易汇总信息
注意事项
- 该代码仅用于测试和学习,不得用于实盘交易
- 使用前请确保已开通miniQMT功能
- 请确保输入正确的QMT安装路径和交易账号
- 如果连接失败,请检查miniQMT终端是否已启动并登录