3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 QMT 平台中遇到“日志有成交,但模拟账户无变动,K线不显示”的情况,通常是由运行模式混淆、账号未绑定、数据未补充或绘图代码缺失这几个原因导致的。以下是详细的排查和解决指南:
QMT 平台分为回测和运行两种模式:
passorder)调用的是虚拟账号,在历史 K 线上记录买卖点,用于计算策略净值和回测指标。此时日志里打印的成交是虚拟的,不会影响你的实际模拟账户。解决办法:确认你点击的是“回测”还是“运行”。如果想让模拟账户有变动,请在实盘/模拟运行模式下启动策略,并在代码中正确设置账号。
在实盘或模拟运行模式下,如果没有在 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)
QMT 平台是基于本地数据驱动的。如果主图 K 线出不来,或者策略在历史 K 线上没有执行,大概率是因为本地没有下载对应品种和周期的历史数据。
解决办法:
如果你希望在 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表示椭圆图标
set_account 和 passorder 里的账号字符串是否与你的模拟账号完全一致。paint 绘图代码,以及 handlebar 是否因为条件不满足而直接 return 了。