Skip to content

已经在用 QMT,持仓和异常怎么盯

已经开了 QMT,策略也在跑,下一步常常是:「持仓变了谁通知我?废单了怎么知道?」

这是工程记录。只谈怎么把持仓打出来、异常打日志、提醒往哪接。不是代盯盘,也不是保证你盘中一定看得到。不构成投资建议,不代操盘。

手册:查持仓和资金 · get-trade-detail-data · 委托回调

先分清两件事

  1. 对账: 策略进程里打印资金、持仓、委托、成交。这是 QMT 里就能做的。
  2. 提醒: 发到微信 / 企业微信。QMT 编辑器不负责「自动推到你手机」,要另接通道。PTrade 托管里有 send_qywx,QMT 常见是自己写 HTTP 或邮件,令牌不要写进正文。

电脑关机、断网,本机 QMT 上的策略会停。要人不在家也跑,看券商 PTrade 托管,不是再买一台永远开机的承诺。

分几步(本机对账)

  1. initset_account
  2. 定时或 handlebar 最后一根,取 ACCOUNT / POSITION / ORDER / DEAL
  3. 字段用 m_ 前缀。版本不同名字可能略差,空了就 dir(obj)
  4. 可用数量、废单状态打到日志。不要把打印出来的数字直接当买卖指令。
python
#coding:gbk
def init(C):
    try:
        C.acc = account
        C.acct_type = accountType
    except NameError:
        C.acc = ''
        C.acct_type = 'STOCK'
    C.set_account(C.acc)

def handlebar(C):
    if not C.is_last_bar():
        return
    accts = get_trade_detail_data(C.acc, C.acct_type, 'ACCOUNT') or []
    poss = get_trade_detail_data(C.acc, C.acct_type, 'POSITION') or []
    if accts:
        a = accts[0]
        print('available', getattr(a, 'm_dAvailable', None))
    for p in poss:
        print(getattr(p, 'm_strInstrumentID', ''),
              'vol', getattr(p, 'm_nVolume', None),
              'can', getattr(p, 'm_nCanUseVolume', None))

def order_callback(C, orderInfo):
    print('order', getattr(orderInfo, 'm_strInstrumentID', ''),
          getattr(orderInfo, 'm_nOrderStatus', ''),
          getattr(orderInfo, 'm_nVolumeTraded', 0))

废单、部成、全成,以柜台状态为准。回调怎么写见 委托回调

提醒怎么接

  • PTrade: 托管机在券商机房,适合做无人值守。企业微信用 send_qywx,企业可信 IP 等限制以官方说明为准。
  • QMT: 跑在你家电脑。提醒要另写接口,只监听本机,不要把下单接口暴露到公网。miniQMT 停了以后的本机桥见 本机 HTTP 桥
  • 令牌、企业微信 secret 放文件,不要贴到策略正文和截图里。

容易卡住的地方

  1. 只看策略日志里的「已下单」,没对持仓,账会偏。
  2. 编辑器里点运行,常常没有真实委托,回调也不会来。
  3. 本机断网后,微信再及时也收不到新成交。
  4. 我们不代盯盘、不代操盘。提醒通道接好了,仍要你自己看账户。

搞不定时

对账字段对照见 查持仓和资金。需要接到微信或改策略,公众号留言 策略代写。问答走 知识星球

相关:每天自动选股买入 · 热门问题 · 关注

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