问题描述
日志里面有成交,但模拟账户没有变动,K 线也出不来,可能是什么原因?谢谢
解决方案
在 QMT 平台中遇到“日志有成交,但模拟账户无变动,K线不显示”的情况,通常是由运行模式混淆、账号未绑定、数据未补充或绘图代码缺失这几个原因导致的。以下是详细的排查和解决指南:
1. 检查是否混淆了“回测模式”与“运行模式”
QMT 平台分为回测和运行两种模式:
- 回测模式:策略以历史行情为依据进行运算,交易函数(如
passorder)调用的是虚拟账号,在历史 K 线上记录买卖点,用于计算策略净值和回测指标。此时日志里打印的成交是虚拟的,不会影响你的实际模拟账户。 - 运行模式:策略根据实时行情信号进行运算。如果要在模拟账户中产生实际委托,必须将策略加入到“模型交易”中,并确保绑定了正确的模拟资金账号。
解决办法:确认你点击的是“回测”还是“运行”。如果想让模拟账户有变动,请在实盘/模拟运行模式下启动策略,并在代码中正确设置账号。
2. 检查是否正确绑定了模拟交易账号
在实盘或模拟运行模式下,如果没有在 init 函数中绑定正确的资金账号,或者 passorder 下单时传入的账号错误,委托将无法发送到模拟柜台。
解决办法:
在 init 函数中使用 ContextInfo.set_account() 绑定你的模拟账号,并在下单时传入该账号。
def init(ContextInfo):
# 设定你的模拟交易账号
ContextInfo.accID = '你的模拟账号'
ContextInfo.set_account(ContextInfo.accID)
def handlebar(ContextInfo):
# 下单时传入正确的账号
passorder(23, 1101, ContextInfo.accID, '000001.SZ', 5, -1, 100, ContextInfo)
3. 检查是否补充了历史数据(导致 K 线出不来)
QMT 平台是基于本地数据驱动的。如果主图 K 线出不来,或者策略在历史 K 线上没有执行,大概率是因为本地没有下载对应品种和周期的历史数据。
解决办法:
- 打开 QMT 客户端的**【数据管理】**功能。
- 选择你的策略运行所需的市场、品种以及对应周期的历史数据进行补充下载。
- 确保策略编辑器中【基本信息】的“默认品种”和“默认周期”设置正确。
4. 检查是否调用了绘图函数(导致主图无指标输出)
如果你希望在 K 线图上看到策略计算的指标线或买卖点图标,必须在代码中显式调用绘图函数。QMT 不会自动将内部变量画在图上。
解决办法:
使用 ContextInfo.paint() 或 ContextInfo.draw_icon() 等函数将结果输出到界面。
def handlebar(ContextInfo):
# 获取收盘价
close_price = ContextInfo.get_market_data(['close'], count=1)['close'][0]
# 在界面上画出收盘价曲线
ContextInfo.paint('CloseLine', close_price, -1, 0, 'red', 'noaxis')
# 如果有买入信号,画一个图标
if buy_condition:
ContextInfo.draw_icon(True, close_price, 1) # 1表示椭圆图标
总结排查步骤:
- 看数据:去【数据管理】下载对应品种的 K 线数据。
- 看模式:确认是在做历史回测还是实时模拟运行。
- 看账号:检查
set_account和passorder里的账号字符串是否与你的模拟账号完全一致。 - 看代码:检查是否有
paint绘图代码,以及handlebar是否因为条件不满足而直接return了。