QMT内置账户查询示例代码

QMT内置账户查询示例代码

本页面展示如何在QMT内置Python环境中通过 get_trade_detail_data 接口查询账户资产、持仓、委托和成交信息,实现账户状态的实时监控与管理。

QMT内置账户查询

功能说明

该示例代码运行于QMT内置Python环境(策略编辑器)中,实现以下功能:

  • init 初始化函数中设置账户并执行查询
  • 查询账户资产:总资产、市值、可用资金、持仓盈亏
  • 查询委托订单:代码、委托量、价格、委托号、状态等
  • 查询成交记录:代码、成交量、均价、成交额、成交编号等
  • 查询持仓信息:代码、持仓量、可用量、冻结量、成本、市值、浮动盈亏等
  • 使用pandas DataFrame格式化输出查询结果

使用方法

  1. 登录QMT软件,进入「模型研究」
  2. 新建Python策略文件
  3. 点击下方「复制代码」按钮复制完整代码
  4. 将代码粘贴到QMT策略编辑器中
  5. 修改 ACCOUNT_ID 为您的资金账号
  6. 点击「编译」保存策略
  7. 在「模型交易」中运行策略,查看日志输出

示例代码

account_query_internal.py
#coding:gbk
import pandas as pd
import logging

logging.basicConfig(level=logging.INFO, format="%(asctime)s [%(levelname)s] %(message)s")
logger = logging.getLogger(__name__)

ACCOUNT_ID = "55011888"
ACCOUNT_TYPE = "STOCK"

def init(ContextInfo):
    logger.info("===== QMT 账户查询启动 =====")
    ContextInfo.set_account(ACCOUNT_ID)

    # 定义查询函数
    def fetch(data_type):
        return get_trade_detail_data(ACCOUNT_ID, ACCOUNT_TYPE, data_type) or []

    # 查询资金
    accs = fetch("ACCOUNT")
    if accs:
        a = accs[0]
        logger.info(f"总资产:{a.m_dBalance} 市值:{a.m_dInstrumentValue} 可用:{a.m_dAvailable} 持仓盈亏:{a.m_dPositionProfit}")

    # 查询委托
    orders = fetch("ORDER")
    df_orders = pd.DataFrame([(
        o.m_strInstrumentID, o.m_nVolumeTotalOriginal, o.m_dLimitPrice,
        o.m_strOrderSysID, o.m_nOrderStatus, o.m_nVolumeTraded, o.m_nVolumeTotal
    ) for o in orders]) if orders else pd.DataFrame()
    if not df_orders.empty:
        df_orders.columns = ["代码","委托量","价格","委托号","状态","已成交","剩余"]
        logger.info("\n【委托】\n" + df_orders.to_string(index=False))

    # 查询成交
    deals = fetch("DEAL")
    df_deals = pd.DataFrame([(
        d.m_strInstrumentID, d.m_nVolume, d.m_dPrice, d.m_dTradeAmount,
        d.m_strOrderSysID, d.m_strTradeID, d.m_strTradeTime
    ) for d in deals]) if deals else pd.DataFrame()
    if not df_deals.empty:
        df_deals.columns = ["代码","成交量","均价","成交额","委托号","成交编号","时间"]
        logger.info("\n【成交】\n" + df_deals.to_string(index=False))

    # 查询持仓
    positions = fetch("POSITION")
    df_pos = pd.DataFrame([(
        p.m_strInstrumentID, p.m_nVolume, p.m_nCanUseVolume, p.m_nFrozenVolume,
        p.m_dOpenPrice, p.m_dMarketValue, p.m_dFloatProfit, p.m_dProfitRate
    ) for p in positions]) if positions else pd.DataFrame()
    if not df_pos.empty:
        df_pos.columns = ["代码","持仓","可用","冻结","成本","市值","浮动盈亏","盈亏率"]
        logger.info("\n【持仓】\n" + df_pos.to_string(index=False))

    logger.info(f"委托:{len(orders)} 成交:{len(deals)} 持仓:{len(positions)}")
    logger.info("查询完成")

def handlebar(ContextInfo):
    pass

def stop(ContextInfo):
    logger.info("策略已停止")
                    

代码说明

该示例代码主要包含以下功能模块:

  • 初始化配置:设置资金账号和账户类型,定义通用查询函数 fetch
  • 资金查询:通过 ACCOUNT 类型查询总资产、市值、可用资金和持仓盈亏
  • 委托查询:通过 ORDER 类型查询委托订单明细,含委托量、价格、状态等
  • 成交查询:通过 DEAL 类型查询成交记录,含成交量、均价、成交额等
  • 持仓查询:通过 POSITION 类型查询持仓明细,含持仓量、成本、市值、盈亏等
  • 数据格式化:使用pandas DataFrame将原始数据转换为表格形式,便于阅读

注意事项

  • 该代码运行于QMT内置Python环境,需在QMT策略编辑器中运行
  • 请确保已在QMT中登录并开通交易权限
  • 修改 ACCOUNT_ID 为您的实际资金账号
  • 查询结果仅在策略日志中输出,不会触发任何交易
  • 如查询返回空列表,可能是当前无对应数据或账号配置有误