3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
欢迎来到 QMT 量化平台!从云端平台(如聚宽)迁移到本地端平台(如 QMT),最容易遇到的坑通常集中在本地数据补充和回测/实盘接口差异上。针对你遇到的问题,以下是详细的排查指南和解答:
1. 为什么 get_trade_detail_data 返回空?
在 QMT 中,get_trade_detail_data 是专门用于实盘和模拟盘获取真实账户柜台数据的接口。在回测模式下,该函数无效且返回空。回测时,交易函数调用的是虚拟账号,记录保存在内存中。
👉 正确做法:在回测模式下,必须使用 get_result_records(recordtype, index, ContextInfo) 函数来获取回测面板中的虚拟成交和持仓记录。例如:
# 获取当前K线的买入记录
buys = get_result_records('buys', C.barpos, C)
# 获取当前持仓
holdings = get_result_records('holdings', C.barpos, C)
2. 为什么回测报告窗口是空白的?
prType=11),其他下单选价类型均以当期 K 线收盘价结算。如果你的资金不足或价格超出涨跌停,也会导致废单。passorder() 到底是 8 个参数还是 11 个参数?
两者都对! passorder 的基础必填参数是 8 个,另外 3 个是可选参数。
passorder(opType, orderType, accountID, orderCode, prType, price, volume, ContextInfo)volume 和 ContextInfo 之间,可以插入三个可选参数 [strategyName, quickTrade, userOrderId]。passorder(23, 1101, C.accountid, code, 5, -1, 100, C) 语法是完全正确的。1. order_target_value() 在回测中是否能用?
完全可以。官方文档中明确提供了 order_lots、order_value、order_target_value 等封装好的股票快捷下单函数。它们在底层也是调用 passorder,在回测和实盘中均受支持,推荐新手优先使用这些快捷函数,比手写 passorder 更不容易出错。
2. get_bar_timetag(barpos) 在回测中返回 0 正常吗?
不正常! 返回 0 100% 是因为本地缺少该品种的历史数据。请立即前往【数据管理】补充数据。只要数据补充完整,该函数会正确返回毫秒级时间戳。
3. 代码其他注意事项
init 中使用 C.set_account("testS") 显式绑定账号。init 中使用 C.set_slippage() 和 C.set_commission() 设置回测费率,否则默认费率可能与你的预期不符。你的代码逻辑基本没问题,核心症结在于未补充本地数据以及误用了实盘查询接口。请按照以下步骤操作:
get_trade_detail_data 替换为 get_result_records。