问题描述
使用 get_trade_detail_data(g.acct, g.acct_type, 'order')获取下单数据,返回值是下面内容,请问题怎么解决。
【2025-03-18 11:18:30.394】 [<COrderDetail object at 0x0000017765249530>, <COrderDetail object at 0x000001776524B520>, <COrderDetail object at 0x00000177652499C0>, <COrderDetail object at 0x000001776524B9B0>, <COrderDetail object at 0x0000017765248780>, <COrderDetail object at 0x000001774EF4E6A0>]
解决方案
问题原因
在 QMT 平台中,调用 get_trade_detail_data(accountID, strAccountType, 'order') 获取委托数据时,平台返回的是一个 Python 对象列表(List of Python Objects)。
你看到的 <COrderDetail object at 0x...> 是 Python 中对象的默认打印格式,表示这是一个 COrderDetail 类的实例以及它在内存中的地址。这并不是报错,而是说明你已经成功获取到了数据,只是需要进一步提取对象内部的属性。
解决方法
要获取具体的委托信息(如股票代码、委托价格、委托数量、委托状态等),你需要遍历这个列表,并访问每个对象的具体属性。
代码示例
你可以使用以下代码来遍历并打印出你需要的具体数据:
def handlebar(ContextInfo):
# 假设已经设置了账号信息
account_id = '你的资金账号'
account_type = 'STOCK' # 股票账号
# 获取委托数据
order_list = get_trade_detail_data(account_id, account_type, 'order')
# 遍历对象列表
for order_obj in order_list:
# 提取并打印具体属性
print(f"委托号: {order_obj.m_strOrderSysID}, "
f"证券代码: {order_obj.m_strInstrumentID}, "
f"买卖方向: {order_obj.m_nDirection}, "
f"委托价格: {order_obj.m_dLimitPrice}, "
f"委托数量: {order_obj.m_nVolumeTotalOriginal}, "
f"成交数量: {order_obj.m_nVolumeTraded}, "
f"委托状态: {order_obj.m_nOrderStatus}")
常用的委托对象(order)属性
根据 QMT API 文档,COrderDetail 对象包含以下常用属性,你可以根据需要调用:
m_strInstrumentID:证券代码(如 '000001.SZ')m_strInstrumentName:证券名称m_strOrderSysID:合同编号/委托号(用于撤单等操作)m_nDirection:买卖方向(48代表买入,49代表卖出)m_dLimitPrice:委托价格m_nVolumeTotalOriginal:最初委托量m_nVolumeTraded:已成交数量m_nVolumeTotal:委托剩余量m_nOrderStatus:委托状态(如 50:已报, 56:已成, 54:已撤 等)m_strInsertTime:委托时间m_strRemark:投资备注(对应下单时的 userOrderId)
进阶技巧:查看对象的所有属性
如果你想知道这个对象到底包含了哪些所有的属性,可以使用 Python 的内置函数 dir() 来打印对象的所有属性列表:
order_list = get_trade_detail_data(account_id, account_type, 'order')
if len(order_list) > 0:
# 打印第一个对象的所有属性和方法
print(dir(order_list[0]))
通过这种方式,你就可以轻松地将 <COrderDetail object> 转换为你策略中实际需要的数值和字符串了。