3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 QMT 平台中,出现回测时 Order 对象的 m_strInstrumentName(证券名称)和 m_strRemark(投资备注)为空字符串的现象,是由 QMT 的底层回测机制 决定的。
m_strInstrumentID、委托价格、委托数量、买卖方向、成交状态等)。m_strInstrumentName(中文名称)和 m_strRemark(投资备注)这类描述性、非计算性的字段,在回测的虚拟订单生成时会被省略,因此读取时返回的是空字符串。passorder 传过去的 userOrderId(即投资备注)后,会完整地生成包含名称和备注的委托回报,此时您再调用 get_trade_detail_data 就能正常读取到这些字段了。既然回测引擎不保存这些字段,我们可以通过 Python 代码在策略层面自行维护和获取这些信息:
不要依赖 Order 对象自带的名称属性,而是直接使用 QMT 提供的 API ContextInfo.get_stock_name() 动态获取:
stock_code = o.m_strInstrumentID
stock_name = ContextInfo.get_stock_name(stock_code)
如果您的策略强依赖“投资备注”来区分不同的委托逻辑,可以在 ContextInfo 中维护一个全局字典,利用委托号 (m_strOrderSysID) 或 代码+时间 作为映射的 Key,自行记录备注信息。
改进后的代码示例:
def init(C):
# 初始化一个字典,用于在回测中记录自定义备注
C.my_order_remarks = {}
def handlebar(C):
msg1 = "测试下单_100股"
msg2 = "测试下单_200股"
# 下单
passorder(23, 1101, g.account, '600000.SH', 5, -1, 100, '测试下单', 2, msg1, C)
# 获取最新委托号并记录备注
order_id_1 = get_last_order_id(g.account, 'STOCK', 'ORDER')
if order_id_1 != '-1':
C.my_order_remarks[order_id_1] = msg1
passorder(23, 1101, g.account, '600000.SH', 5, -1, 200, '测试下单', 2, msg2, C)
order_id_2 = get_last_order_id(g.account, 'STOCK', 'ORDER')
if order_id_2 != '-1':
C.my_order_remarks[order_id_2] = msg2
# 查询委托结果
orders = get_trade_detail_data(g.account, 'STOCK', 'ORDER')
print('查询委托结果:')
for o in orders:
stock_code = o.m_strInstrumentID
# 替代方案 1:动态获取股票名称
stock_name = C.get_stock_name(stock_code)
# 替代方案 2:从自定义字典中获取备注,实盘中可以直接用 o.m_strRemark
remark = C.my_order_remarks.get(o.m_strOrderSysID, o.m_strRemark)
print(f'委托号:{o.m_strOrderSysID}',
f'股票代码:{stock_code}',
f'证券名称:{stock_name}',
f'投资备注:{remark}')
m_strInstrumentName 和 m_strRemark 为空是正常现象(引擎优化所致)。ContextInfo.get_stock_name() 获取名称,并通过全局变量辅助记录回测时的订单状态。