Skip to content

想让 QMT 每天自动选股买入,这几步就够了

很多人会问:「我想每天开盘自动买这 10 只股票,需要怎么设置?」

这是工程记录。只谈名单、时钟、下单和对账。10 只、时刻、股数都是示例,不是操作指令。不构成投资建议,不代操盘。

手册:passorder · run_time · 委托回调 · run_time 回测不跑

你想做成什么样

到了某个时刻(常见是开盘后),程序按名单或选股结果发买入,然后看成交和持仓是否对得上。

不是:把股票名发给别人替你点。也不是回测曲线上的收益。

分几步

  1. 账户。 交易界面选好资金账号。initset_account。股票户类型常见 STOCK
  2. 名单从哪来。
    • 固定 10 只:写在代码里,上交所 .SH
    • 每天现选:先有选股结果,再下单。通达信公式怎么接,见 通达信放到 QMT
  3. 时钟。 实盘挂 run_time。回测这条定时器不跑,同一套买卖逻辑还要能从 handlebar 走进去。
  4. 下单。 passorder 的返回只表示函数调用了,不表示成交。
  5. 对账。 deal_callback 或查询 DEAL / POSITION。数量、均价、废单原因打日志。
  6. 一天一次。 用日期戳。同一分钟回调可能进好几次。
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 下单失败

容易卡住的地方

  1. 回测里只写了 run_time,日志是空的。见 run_time 回测不跑
  2. 没有成交回调,会以为「已经买了」。passorder 成功 ≠ 成交。
  3. 后缀错了:QMT 上交所是 .SH。见 .SS / .SH
  4. 固定名单会停牌、涨停买不进。空结果、废单要打日志,不要无限制重报。
  5. 本机 QMT 电脑关机或断网,定时器就停。要无人值守,看 PTrade 托管,不是再加一个本机闹钟。

搞不定时

完整脚本在 知识星球 附件。接到账户、改参、排错,公众号留言 策略代写。我们做开发和落地,不代操盘。

相关:通达信放到 QMT · 持仓监控和提醒 · 关注

完整讨论和附件在 知识星球 Kimi量化研究所