🚀 AI 一键生成 qmt 策略代码

QMT 平台 XtPosition 持仓对象没有 avg_price 属性的解决方法

qmt | 发布时间: 2026/5/27
以下内容由 EasyQuant 生成。

问题描述

持仓XtPosition成本价属性avg_price值不对

如题==属性不存在‌==
XtPosition 对象未定义 avg_price 属性

解决方案

问题原因分析

在 QMT 平台的 Python API 中,获取持仓信息通常通过 get_trade_detail_data 函数返回持仓对象列表。很多从其他量化框架(如 PTrade 或聚宽)迁移过来的开发者,习惯使用 avg_price 来获取持仓均价或成本价。但在 QMT 的底层 C++ 封装对象中,持仓对象确实不存在 avg_price 这个属性,因此会报“属性不存在”的错误。

正确的持仓成本属性

根据 QMT 官方 API 文档,持仓对象(Position)包含以下与成本和价格相关的正确属性字段:

  • m_dOpenPrice:持仓成本(通常指开仓均价)。
  • m_dPositionCost:持仓成本(总成本)。
  • m_dOpenCost:开仓成本(等于股票的成本价 * 第一次建仓的量,后续减持不影响,不算手续费)。

如果您想获取类似 avg_price(持仓均价/成本价)的数据,应该使用 m_dOpenPrice

代码示例

以下是如何正确获取持仓并打印持仓成本价的代码示例:

#coding:gbk

def init(ContextInfo):
    # 设置对应的资金账号
    ContextInfo.set_account('您的资金账号')

def handlebar(ContextInfo):
    # 获取当前持仓查询
    position_info = get_trade_detail_data(ContextInfo.accid, 'stock', 'position')
    
    for pos in position_info:
        # 获取证券代码
        stock_code = pos.m_strInstrumentID
        # 获取持仓数量
        volume = pos.m_nVolume
        # 获取持仓成本价 (替代 avg_price)
        cost_price = pos.m_dOpenPrice
        # 获取最新价
        last_price = pos.m_dLastPrice
        
        print(f"代码: {stock_code}, 持仓量: {volume}, 成本价: {cost_price}, 最新价: {last_price}")

补充说明

如果您需要查看持仓对象的所有可用属性,可以在代码中使用 Python 的内置函数 dir() 来打印对象属性列表,这在调试时非常有用:

position_info = get_trade_detail_data(ContextInfo.accid, 'stock', 'position')
if len(position_info) > 0:
    print(dir(position_info[0]))

通过查阅 dir() 的输出,您可以准确找到 QMT 平台定义的以 m_ 开头的各类底层属性字段,避免因属性名拼写错误或平台差异导致的报错。