问题描述
比如,我昨天有一笔交易,昨天能用 get_trade_detail_data()这个函数查到委托或成交记录,但今天就只能查到今天的交易记录,查不到昨天的交易记录了,那我今天想查询昨天的某笔交易记录,该怎么查呢?
解决方案
是的,您理解得完全正确。在 QMT 平台中,get_trade_detail_data() 函数主要用于获取**当日(当前交易日)**的账户信息、持仓、委托(ORDER)和成交(DEAL)记录。一旦跨日,系统会进行结算并清空当日的委托和成交缓存,因此第二天无法通过该函数直接获取前一天的交易记录。
如果您需要在策略中查询或使用历史的交易记录,目前 QMT API 并没有直接提供查询“历史交割单”的函数。为了解决这个问题,通常有以下几种解决方案:
方案一:策略自行记录到本地文件(最常用、最推荐)
如果您需要在未来的交易日中用到之前的交易记录,最好的方法是在策略运行期间,将每次的委托或成交信息实时保存到本地文件(如 CSV、TXT 或 SQLite 数据库)中。第二天策略启动时,再从本地文件中读取这些历史记录。
您可以结合 deal_callback(成交主推回调函数)来实现自动记录:
#encoding:gbk
import pandas as pd
import os
import time
# 定义保存历史成交的文件路径
HISTORY_TRADE_FILE = 'D:/QMT_Data/my_history_trades.csv'
def init(ContextInfo):
ContextInfo.set_account('您的资金账号')
# 初始化时,如果文件不存在则创建一个带表头的文件
if not os.path.exists(HISTORY_TRADE_FILE):
df = pd.DataFrame(columns=['TradeDate', 'TradeTime', 'InstrumentID', 'Direction', 'Price', 'Volume'])
df.to_csv(HISTORY_TRADE_FILE, index=False)
def handlebar(ContextInfo):
pass
# 当有成交时触发此回调
def deal_callback(ContextInfo, dealInfo):
# 提取成交信息
trade_data = {
'TradeDate': dealInfo.m_strTradeDate,
'TradeTime': dealInfo.m_strTradeTime,
'InstrumentID': dealInfo.m_strInstrumentID,
'Direction': dealInfo.m_nDirection, # 48买入, 49卖出
'Price': dealInfo.m_dPrice,
'Volume': dealInfo.m_nVolume
}
# 追加写入到本地 CSV 文件
df = pd.DataFrame([trade_data])
df.to_csv(HISTORY_TRADE_FILE, mode='a', header=False, index=False)
print(f"已将成交记录保存至本地: {trade_data}")
这样,您随时可以通过 Python 的 pandas.read_csv() 读取这个文件,获取所有的历史交易记录。
方案二:回测模式下的历史记录查询
如果您是在回测模式下,想要获取策略在历史某天的交易明细,可以使用 get_result_records() 函数。该函数专门用于获取回测面板中的记录结果。
def handlebar(ContextInfo):
index = ContextInfo.barpos
# 获取当前 K 线对应的交易明细
deal_details = get_result_records('dealdetails', index, ContextInfo)
if deal_details:
print(f"历史交易明细: {deal_details}")
注意:此函数仅在模型回测时有效,实盘/模拟盘无效。
方案三:通过 QMT 客户端界面手动查询
如果您只是需要人工查看昨天的交易记录,而不需要在代码中自动化处理,您可以直接在 QMT 客户端的**“交易” -> “历史成交” 或 “交割单”**界面中选择日期范围进行查询,并支持导出为 Excel 文件。
总结
对于实盘和模拟盘的自动化量化策略,强烈建议采用“方案一”。在量化交易中,维护一个属于策略自己的本地状态文件(记录历史成交、自定义持仓成本等)是非常标准且稳健的做法,这样可以避免过度依赖柜台接口,也能应对断线重启等复杂情况。