问题描述
迅投的知识库里有 get_history_trade_detail_data 函数,但是在华泰的 QMT 上使用,报错:
NameError: name 'get_history_trade_detail_data' is not defined
解决方案
问题分析
在华泰等券商提供的 QMT 平台上遇到 NameError: name 'get_history_trade_detail_data' is not defined 报错,通常是由以下几个原因造成的:
- 券商定制版差异:迅投官方的知识库包含了所有最新和全功能的 API,但各个券商(如华泰、国信等)采购的 QMT 版本可能是定制版。出于风控、系统稳定性或权限管理的考虑,券商可能会屏蔽或未开放某些特定的 API 接口。
- 版本迭代滞后:券商端的 QMT 客户端更新频率通常慢于迅投官方版本,某些新加入的函数在旧版本的券商客户端中尚未定义。
- 标准 API 替代:在 QMT 标准的 Python API 文档中,获取交易明细的标准函数其实是
get_trade_detail_data,而不是带有history前缀的函数。
替代解决方案
既然 get_history_trade_detail_data 无法使用,您可以使用 QMT 标准 API 中提供的 get_trade_detail_data 函数来获取交易明细数据(包括委托、成交、持仓等)。
get_trade_detail_data 函数用法
用法:
get_trade_detail_data(accountID, strAccountType, strDatatype, strategyName)
或不区分策略:
get_trade_detail_data(accountID, strAccountType, strDatatype)
参数说明:
- accountID:
string,资金账号。 - strAccountType:
string,账号类型。可选值:'STOCK'(股票),'CREDIT'(信用),'FUTURE'(期货)等。 - strDatatype:
string,数据类型。可选值:'POSITION':持仓'ORDER':委托'DEAL':成交'ACCOUNT':账号资金'TASK':任务
示例代码:获取当日成交与委托记录
def init(ContextInfo):
# 设置您的资金账号
ContextInfo.accid = '您的资金账号'
def handlebar(ContextInfo):
# 1. 获取当日成交明细 (DEAL)
deal_list = get_trade_detail_data(ContextInfo.accid, 'stock', 'deal')
print("=== 当日成交明细 ===")
for deal in deal_list:
print(f"合约代码: {deal.m_strInstrumentID}, 成交均价: {deal.m_dPrice}, 成交量: {deal.m_nVolume}, 买卖方向: {deal.m_nDirection}")
# 2. 获取当日委托明细 (ORDER)
order_list = get_trade_detail_data(ContextInfo.accid, 'stock', 'order')
print("=== 当日委托明细 ===")
for order in order_list:
print(f"合约代码: {order.m_strInstrumentID}, 委托价格: {order.m_dLimitPrice}, 委托量: {order.m_nVolumeTotalOriginal}, 状态: {order.m_nOrderStatus}")
关于获取“历史”交易记录的建议
需要注意的是,get_trade_detail_data 通常只能获取**当日(当前交易日)**的委托和成交明细。如果您在量化策略中强依赖历史的交割单或历史成交记录,建议采取以下变通方法:
- 策略内部自行记录:在策略每次触发下单或收到成交回报(通过
deal_callback)时,将成交信息写入本地的 CSV 文件或 SQLite 数据库中。这样您的策略就可以随时读取自己维护的历史交易记录。 - 联系券商客服:如果您确实需要直接通过 API 获取历史交割数据,建议联系华泰证券的专属客户经理或量化技术支持,确认当前版本是否支持该功能,或者是否需要申请开通更高权限的接口(如极速版/专业版)接口。