想让 QMT 每天自动选股买入,这几步就够了
很多人会问:「我想每天开盘自动买这 10 只股票,需要怎么设置?」
这是工程记录。只谈名单、时钟、下单和对账。10 只、时刻、股数都是示例,不是操作指令。不构成投资建议,不代操盘。
手册:passorder · run_time · 委托回调 · run_time 回测不跑
你想做成什么样
到了某个时刻(常见是开盘后),程序按名单或选股结果发买入,然后看成交和持仓是否对得上。
不是:把股票名发给别人替你点。也不是回测曲线上的收益。
分几步
- 账户。 交易界面选好资金账号。
init里set_account。股票户类型常见STOCK。 - 名单从哪来。
- 固定 10 只:写在代码里,上交所
.SH。 - 每天现选:先有选股结果,再下单。通达信公式怎么接,见 通达信放到 QMT。
- 固定 10 只:写在代码里,上交所
- 时钟。 实盘挂
run_time。回测这条定时器不跑,同一套买卖逻辑还要能从handlebar走进去。 - 下单。
passorder的返回只表示函数调用了,不表示成交。 - 对账。
deal_callback或查询DEAL/POSITION。数量、均价、废单原因打日志。 - 一天一次。 用日期戳。同一分钟回调可能进好几次。
python
#coding:gbk
WATCH = ['600000.SH', '000001.SZ'] # 示例格式,不是推荐
def init(C):
try:
C.acct = account
except NameError:
C.acct = ''
C.set_account(C.acct)
C.done = ''
start = datetime.now().strftime('%Y-%m-%d 09:31:00')
C.run_time('buy_task', '60nSecond', start)
def buy_task(C):
if C.do_back_test:
return
day = datetime.now().strftime('%Y%m%d')
if C.done == day:
return
now = datetime.now()
if (now.hour, now.minute) < (9, 31):
return
for code in WATCH:
passorder(23, 1101, C.acct, code, 11, -1, 100, '日更买入', 2, '', C)
C.done = day
def deal_callback(C, dealInfo):
print('deal', getattr(dealInfo, 'm_strInstrumentID', ''),
getattr(dealInfo, 'm_nVolume', 0), getattr(dealInfo, 'm_dPrice', 0))price=-1 这类选价以你柜台和 passorder 说明为准。9:30 前连续竞价未开,限价不对会废单。PTrade 同类问题见 9:30 下单失败。
容易卡住的地方
- 回测里只写了
run_time,日志是空的。见 run_time 回测不跑。 - 没有成交回调,会以为「已经买了」。
passorder成功 ≠ 成交。 - 后缀错了:QMT 上交所是
.SH。见.SS/.SH。 - 固定名单会停牌、涨停买不进。空结果、废单要打日志,不要无限制重报。
- 本机 QMT 电脑关机或断网,定时器就停。要无人值守,看 PTrade 托管,不是再加一个本机闹钟。
搞不定时
完整脚本在 知识星球 附件。接到账户、改参、排错,公众号留言 策略代写。我们做开发和落地,不代操盘。
完整讨论和附件在 知识星球 Kimi量化研究所。
