问题描述
如题==属性不存在==
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_ 开头的各类底层属性字段,避免因属性名拼写错误或平台差异导致的报错。