教程 · 单套解锁 教程 · EA量化教学

EA11 Python/QMT-miniQMT 策略

使用手册 + 操作教程 共 18 章全部免费开放,一步一步把软件用起来;核心知识点 8 章,¥69 一次解锁讲透原理。

作者 枢汇安全课堂 更新 2026-10-13 阅读 85 收录 EA量化教学 · 26 章
本课程 · 单套解锁
¥69¥104
单品永久解锁 · 会员可阅 · 一次购买终身使用
✓使用手册 + 操作教程 共 18 章全文免费 ✓核心知识点 8 章,¥69 一次解锁 ✓支持电脑 / 手机 · 永久免费更新
注册后解锁核心知识点
免费学习区 使用手册 + 操作教程 共 18 章全部免费开放 · 核心知识点 8 章为付费内容 ¥69 解锁核心知识点
PART ONE

使用手册

功能在哪 · 是什么 · 怎么调出来

一、xtquant 是什么:QMT 与 miniQMT 的关系

先理清三个名字:

名字是什么
QMT券商提供的量化交易客户端(迅投研发),自带图形界面和内置 Python 环境
miniQMTQMT 的极简模式:只负责登录和转发,界面极简,专门配合外部 Python 用
xtquantPython 库,是你写的脚本和 miniQMT 客户端之间的"翻译官"

xtquant 分四个常用模块:

  • xtquant.xtdata:行情接口(订阅推送、取历史K线);
  • xtquant.xttrader:交易接口(下单、撤单、查持仓);
  • xtquant.xttype:账户和数据对象定义(StockAccount、XtPosition 等);
  • xtquant.xtconstant:常量(买卖方向、价格类型、委托状态)。
白话注解:miniQMT 就像"电视盒子",xtquant 是"遥控器"。盒子必须通电(客户端在线登录),遥控器才有用。你的 Python 脚本不发单到交易所,而是发给本机的 miniQMT,由它转发到券商柜台。

二、安装与环境准备(两条路线)

1、路线A:pip 安装(推荐,新方式)

pip install xtquant

装完直接 import xtquant 即可。前提:本机已安装并登录 QMT 客户端(miniQMT 模式)。

2、路线B:用客户端自带 Python 库(旧方式)

老版本没有发布到 pip,需要把 QMT 安装目录下的 pythonapi 加到路径:

import sys
sys.path.append(r'D:\国金QMT交易端\pythonapi')

from xtquant import xtdata, xttrader
from xtquant.xttype import StockAccount
from xtquant.xtconstant import STOCK_BUY, STOCK_SELL

3、版本注意

  • 老教程常说"只支持 Python 3.6-3.9",那是早期版本的门槛;新发布的 xtquant 轮子已适配更高版本(本地已验证 3.13 可正常 import)。
  • 不确定就用 pip show xtquant 看版本号(形如 xtquant_250807,即 2025-08-07 构建)。
关键点:不管哪条路线,QMT 客户端必须处于登录在线状态,否则连接必失败。这是 QMT 系所有报错的第一嫌疑犯。

三、历史K线:先下载,再获取

xtdata 的历史数据存在 miniQMT 客户端本地。流程固定两步:先 download 补数据,再 get 读数据。不下载直接读,大概率是空的。

1、第一步:下载

from xtquant import xtdata

# 单只下载(同步执行,下完才返回)
xtdata.download_history_data('600000.SH', period='1d',
                             start_time='20240101', end_time='20241231')

# 批量下载(带进度回调)
def on_progress(data):
    print(f"进度 {data['finished']}/{data['total']} {data['stockcode']}")

xtdata.download_history_data2(['600000.SH', '000001.SZ'],
                              period='1d', callback=on_progress)

2、第二步:获取(两种返回格式)

# get_market_data_ex:返回 {代码: DataFrame},每个代码一个表(推荐,好处理)
data = xtdata.get_market_data_ex(
    field_list=['open', 'high', 'low', 'close', 'volume'],
    stock_list=['600000.SH'],
    period='1d',
    start_time='20240101', end_time='20241231',
dividend_type='front' # 前复权
)
df = data['600000.SH']
print(df.tail())

# get_market_data:返回 {字段: DataFrame},行是代码、列是时间(适合多代码对比)
data2 = xtdata.get_market_data(['close'], ['600000.SH', '000001.SZ'],
                               period='1d', count=10)
print(data2['close']) # index=代码, columns=时间

常用参数:

  • period:'1m'/'5m'/'1d'/'tick' 等,可用 xtdata.get_period_list() 查全部;
  • count:≥0 时以 end_time 为基准向前取 count 根;缺省 -1 取本地全部;
  • dividend_type:复权方式,'none' 不复权 / 'front' 前复权 / 'back' 后复权 / 'front_ratio' / 'back_ratio' 等比复权。
新手最常见翻车:跳过 download 直接 get_market_data_ex,拿到空 DataFrame 就以为代码写错了。先下载,再读取,日K尤其如此。

四、多账户与账户类型:StockAccount 的第二参数

警告:网上旧代码的 FutureAccount('账号') 不存在。本地实测 xtquant.xttype 模块里只有 StockAccount 一个账户类。期货、信用、期权账户统统用它,靠第二个参数区分。
from xtquant.xttype import StockAccount

stock_acc = StockAccount('123456') # 股票(默认 'STOCK')
future_acc = StockAccount('888888', 'FUTURE') # 期货
credit_acc = StockAccount('123456', 'CREDIT') # 两融信用账户
fopt_acc = StockAccount('999999', 'FUTURE_OPTION') # 期权
hk_acc = StockAccount('123456', 'HUGANGTONG') # 港股通

账户类型全表(本地从源码提取,注意都是大写字符串):

account_type账户类型
'STOCK'普通证券账户
'CREDIT'信用账户(两融)
'FUTURE'期货账户
'FUTURE_OPTION'期货期权
'STOCK_OPTION'股票期权(50ETF/300ETF 期权)
'HUGANGTONG' / 'SHENGANGTONG'沪港通 / 深港通
'NEW3BOARD'新三板

类型写错会直接抛异常"不支持的账号类型"。相关查询:

# 这个交易终端里登录了哪些账号、状态如何
infos = xt_trader.query_account_infos()
status_list = xt_trader.query_account_status()
白话注解:StockAccount 是"万能门禁卡",第二参数决定开哪扇门。旧代码里的 FutureAccount 是"根本不存在的卡",别被带偏。
PART TWO

操作教程

一步一步 · 跟着做完一件事

五、第一行代码:连接交易的完整流程

连接交易固定五步,一步都不能少:

from xtquant import xttrader
from xtquant.xttype import StockAccount

# 1. 创建交易对象:路径 + 会话ID
session_id = 12345 # 随便起一个唯一数字
xt_trader = xttrader.XtQuantTrader(r'D:\QMT\userdata_mini', session_id)

# 2. 启动交易线程
xt_trader.start()

# 3. 连接:返回 0 表示成功
connect_result = xt_trader.connect()
print('连接结果:', connect_result) # 0 = 成功,非 0 = 失败

# 4. 创建资金账号对象并订阅
account = StockAccount('你的资金账号')
subscribe_result = xt_trader.subscribe(account)
print('订阅结果:', subscribe_result) # 0 = 成功,-1 = 失败

# 5.(可选)让脚本一直活着,等回调
xt_trader.run_forever() # 阻塞当前线程,直到 stop() 被调用

1、三个容易踩的坑

  • 路径必须是 userdata_mini:在你的 QMT 安装目录下找,不是 userdata。miniQMT 模式的数据目录专门叫这个名字。
  • session_id 不能撞:同一台机器同时跑多个脚本,每个脚本的 session_id 必须不同,否则互相挤掉线。
  • connect 是一次性连接:断线后不会自动重连,必须再次主动调用 connect()。稳妥的做法是配合回调 on_disconnected 做重连(见第十二章)。
白话注解:这五步就像打电话——创建话筒、开机、拨号、报身份、保持通话。少一步都是"喂喂喂"听不见。

六、查资金、持仓、委托、成交(四大查询)

# 资金
asset = xt_trader.query_stock_asset(account)
if asset: # 查询失败返回 None,先判空!
    print(f'总资产: {asset.total_asset}')
    print(f'可用资金: {asset.cash}')
    print(f'冻结资金: {asset.frozen_cash}')
    print(f'持仓市值: {asset.market_value}')

# 持仓列表
positions = xt_trader.query_stock_positions(account)
for pos in (positions or []):
    print(f'{pos.stock_code} 持仓 {pos.volume} 可用 {pos.can_use_volume} '
          f'成本 {pos.open_price} 昨仓 {pos.yesterday_volume}')

# 当日委托(第二个参数 True 表示只查可撤的委托)
orders = xt_trader.query_stock_orders(account, cancelable_only=False)

# 当日成交
trades = xt_trader.query_stock_trades(account)
返回 None 的陷阱:这四个查询在"失败"或"当天确实没有记录"时返回 None,不是空列表。直接 for pos in positions 会抛 TypeError。养成 positions or [] 的习惯。
白话注解:volume 是总持仓(含冻结),can_use_volume 才是此刻真正能卖的量。今天刚买入的股票 T+1,volume 有数、can_use_volume 是 0。

七、下单第一单:order_stock 八个参数逐个讲

下单接口签名(本地实测):

order_stock(account, stock_code, order_type, order_volume,
            price_type, price, strategy_name='', order_remark='')
参数含义示例
account资金账号对象StockAccount('123456')
stock_code证券代码'600000.SH'
order_type委托方向xtconstant.STOCK_BUY
order_volume数量,股票以股为单位,债券以张为单位100
price_type报价类型xtconstant.FIX_PRICE
price委托价格(市价单填 0 即可)10.50
strategy_name策略名(可空字符串),方便区分哪个策略下的单'dual_ma'
order_remark委托备注(可空字符串)'20261001金叉'
import xtquant.xtconstant as c

# 买入 100 股,限价 10.50
order_id = xt_trader.order_stock(
    account,
    '600000.SH',
c.STOCK_BUY, # 买入
100, # 100 股(A股一手 = 100 股)
c.FIX_PRICE, # 限价
    10.50,
'dual_ma', # 策略名
'' # 备注
)
print('订单编号:', order_id) # > 0 成功;-1 委托失败

# 卖出:注意用 can_use_volume 判断,不是 volume
sell_qty = 100
xt_trader.order_stock(account, '600000.SH', c.STOCK_SELL,
                      sell_qty, c.FIX_PRICE, 11.20, 'dual_ma', '')
  • 返回值是系统生成的订单编号 order_id,大于 0 成功,-1 表示委托失败(比如资金不足、代码写错)。
  • A股买入必须是 100 股的整数倍(科创板最低 200 股);卖出可以卖零股(如分红送的碎股)。
  • 代码后缀:.SH 沪市、.SZ 深市、.BJ 北交所。
白话注解:strategy_name 就像快递单上的"寄件人"字段,填了它,你查委托记录时一眼就知道这单是哪个策略干的。

八、拿最新价:get_full_tick(get_last_price 不存在)

警告:xtdata.get_last_price() 不存在。网上大量旧代码写了这个函数,本地实测 xtquant_250807 中没有此接口,直接调用会报 AttributeError。拿最新价的正确姿势是 get_full_tick:
from xtquant import xtdata

tick = xtdata.get_full_tick(['600000.SH'])
print(tick['600000.SH']['lastPrice']) # 最新价
print(tick['600000.SH']['askPrice']) # 卖一价(列表)
print(tick['600000.SH']['bidPrice']) # 买一价(列表)

要点:

  • 参数是代码列表,可以一次取多只,也支持传市场名如 ['SH', 'SZ'] 拉全市场;
  • 返回 {代码: 行情字典},字典里的 lastPrice 就是最新价;
  • 它取的是"全推快照",收盘后取到的是收盘时点的快照。
白话注解:把"取最新价"想成看路口的实时监控画面——get_full_tick 就是"啪"给你截一帧。要连续看,就得订阅(下一章)。

九、订阅实时行情:subscribe_quote / subscribe_whole_quote

警告:xtdata.register_callback() 不存在。旧教程用 xtdata.register_callback(on_data) 全局注册回调,本地实测该接口在新版 xtquant 中已不存在。正确做法是把回调函数直接作为参数传给订阅接口。

1、单股订阅 subscribe_quote

from xtquant import xtdata

def on_data(datas):
    # datas 格式:{ 代码: [数据, ...] }
    for code, bars in datas.items():
        for bar in bars:
            print(code, bar['lastPrice'])

# 回调通过 callback 参数传入
seq = xtdata.subscribe_quote('600000.SH', period='tick', count=0,
                             callback=on_data)
print('订阅号:', seq) # > 0 成功,-1 失败

# 不想收了就反订阅
xtdata.unsubscribe_quote(seq)

# 脚本末尾需要阻塞住,否则主线程退出回调就没了
xtdata.run() # 持续循环等待,断线会抛异常

2、全推订阅 subscribe_whole_quote

def on_tick(datas):
    # datas 格式:{ 代码: 行情字典 },注意和单股订阅不同,没有列表
    for code, tick in datas.items():
        print(code, tick['lastPrice'])

# 支持传市场名订阅全市场,或传代码列表只订几只
xtdata.subscribe_whole_quote(['SH', 'SZ'], callback=on_tick)
xtdata.run()
  • subscribe_quote:订阅一只,K线或 tick 都行(period 决定),单股订阅建议不超过 50 只;
  • subscribe_whole_quote:全推分笔快照,订阅后立刻推送一次当前最新数据,适合扫全市场或几十只以上;
  • 两者返回的都是订阅号 seq,成功大于 0,失败 -1。
白话注解:单股订阅像"点外卖",一单一单送到门口;全推像"自助餐",所有菜(全市场行情)一起端上来,你自己挑。

十、委托生命周期与回调:XtQuantTraderCallback

主动查询是"你去问",回调是"它主动报"。做实盘必须写回调,否则委托被拒了你都不知道。继承回调类、重写需要的方法:

from xtquant.xttrader import XtQuantTraderCallback

class MyCallback(XtQuantTraderCallback):
    def on_connected(self):
        print('已连接')

    def on_disconnected(self):
        print('断线了!触发重连逻辑')

    def on_stock_order(self, order):
        # 委托回报推送:每次委托状态变化都推一次
        print(f"委托回报 {order.stock_code} 状态 {order.order_status}")

    def on_stock_trade(self, trade):
        # 成交回报推送:真金白银成交了
        print(f"成交 {trade.stock_code} {trade.traded_volume}股 "
              f"@{trade.traded_price}")

    def on_order_error(self, order_error):
        # 委托失败推送:这里能看到 order_stock 返回 -1 的真正原因
        print(f"下单失败 {order_error.error_id}: {order_error.error_msg}")

    def on_cancel_error(self, cancel_error):
        print(f"撤单失败 {cancel_error.error_msg}")

    def on_order_stock_async_response(self, response):
        # 异步下单的正式回报(对应 seq)
        print(f"异步下单回报 seq={response.seq} order_id={response.order_id}")

    def on_account_status(self, status):
        print('账号状态变化', status.account_id)

# 注册回调后,再 start/connect
xt_trader.register_callback(MyCallback())
xt_trader.start()
xt_trader.connect()

本地实测回调类全部可用方法:on_connected / on_disconnected / on_stock_order / on_stock_trade / on_stock_asset / on_stock_position / on_order_error / on_cancel_error / on_order_stock_async_response / on_cancel_order_stock_async_response / on_account_status 及银行转账、约券等异步回报。重写你需要的即可。

白话注解:query 是你主动打电话问"我的单子咋样了";回调是券商主动给你发短信"您的委托已成交"。两个都用,才不漏单。

十一、数据对象字段表:XtAsset / XtPosition / XtOrder / XtTrade

四个查询返回的对象字段如下(本地从包源码逐个提取,保证无虚构):

1、XtAsset(query_stock_asset 返回)

字段含义
cash可用资金
frozen_cash冻结资金(挂单锁定的钱)
market_value持仓市值
total_asset总资产
fetch_balance可取金额

2、XtPosition(query_stock_positions 返回)

字段含义
stock_code证券代码
volume总持仓
can_use_volume可用持仓(T+1 的关键)
open_price开仓价(成本)
avg_price摊薄成本
market_value市值
yesterday_volume昨仓
frozen_volume冻结数量(挂单锁定)
on_road_volume在途股份(如已申报未到账的划转)
last_price最新价
profit_rate盈亏比例

3、XtOrder(query_stock_orders 返回)

字段含义
order_id系统订单编号(order_stock 返回的那个)
order_sysid柜台合同编号(撤单 sysid 版本用)
stock_code证券代码
order_type / price_type / price方向 / 报价类型 / 委托价
order_volume / traded_volume委托量 / 已成交量
traded_price成交均价
order_status / status_msg状态码 / 状态说明文字
order_time报单时间
strategy_name / order_remark策略名 / 备注(下单时填的)

4、XtTrade(query_stock_trades 返回)

字段含义
traded_id / traded_time成交编号 / 成交时间戳
stock_code证券代码
traded_price / traded_volume成交价 / 成交量
traded_amount成交金额
commission本笔佣金
order_id / order_sysid对应委托编号

十二、同步 vs 异步下单:order_stock_async 与撤单

1、同步下单 order_stock

  • 调用后阻塞等柜台回执,返回订单编号 order_id(>0 成功 / -1 失败);
  • 简单可靠,但等待期间你的脚本干不了别的;扫几十只股票轮询下单时会很慢。

2、异步下单 order_stock_async

  • 参数完全一样(本地实测签名一致),立刻返回一个请求序号 seq(>0 提交成功 / -1 提交失败);
  • seq ≠ order_id!真正的订单编号通过 on_order_stock_async_response 回调送达(response.seq 和 response.order_id 对得上号);
  • 失败信息从 on_order_error 回调来。
# 异步下单
seq = xt_trader.order_stock_async(account, '600000.SH',
                                  c.STOCK_BUY, 100, c.FIX_PRICE,
                                  10.50, 'dual_ma', '')
print('请求序号:', seq) # 等回调拿真正的 order_id

3、撤单

# 同步撤单:0 = 成功发出,-1 = 失败
xt_trader.cancel_order_stock(account, order_id)

# 异步撤单:返回请求序号,结果走 on_cancel_order_stock_async_response
xt_trader.cancel_order_stock_async(account, order_id)

# 只查还能撤的委托
cancelable = xt_trader.query_stock_orders(account, cancelable_only=True)
for od in (cancelable or []):
    xt_trader.cancel_order_stock(account, od.order_id)
白话注解:同步像窗口排队,办完才走;异步像取号机,号(seq)到手就走,叫号(回调)再回来处理。批量下单用异步,单笔下单用同步。

十三、期货交易专题:开平仓方向与平今平昨

期货下单也是 order_stock,但方向常量换成 FUTURE_*,数量单位是手:

import xtquant.xtconstant as c
from xtquant.xttype import StockAccount

future_acc = StockAccount('你的期货账号', 'FUTURE') # 关键:第二参数

# 开多 1 手,最新价(价格参数填 0)
oid = xt_trader.order_stock(
    future_acc,
'rb2605.SHFE', # 期货代码:品种+月份.交易所
c.FUTURE_OPEN_LONG, # 开多
1, # 1 手
c.LATEST_PRICE, # 最新价
    0,
    'dual_ma', ''
)

# 平今多(上海/能源中心区分平今平昨,平错方向会被拒单)
xt_trader.order_stock(future_acc, 'rb2605.SHFE',
                      c.FUTURE_CLOSE_LONG_TODAY, 1,
                      c.LATEST_PRICE, 0, 'dual_ma', '')

# 平昨多
xt_trader.order_stock(future_acc, 'rb2605.SHFE',
                      c.FUTURE_CLOSE_LONG_HISTORY, 1,
                      c.LATEST_PRICE, 0, 'dual_ma', '')

期货代码后缀(本地实测 xtconstant 市场常量):.SHFE 上期所、.DCE 大商所、.CZCE 郑商所、.INE 能源中心、.CFFEX 中金所、.GFEX 广期所。

1、平今平昨规则(重要)

  • 上期所(SHFE)/ 能源中心(INE):严格区分平今/平昨,平今手续费常更高(个别品种平今免费),方向用错直接拒单;
  • 郑商所 / 大商所 / 中金所:默认先平昨,不强制区分——但 xtquant 常量仍用 _TODAY/_HISTORY 传参,柜台自动处理;
  • 先查 query_stock_positions 返回的 yesterday_volume(昨仓)决定该平今还是平昨。
再强调:期货账户用 StockAccount(账号, 'FUTURE') 创建,没有 FutureAccount 类。期货自带杠杆,教学代码之外,实盘务必先在模拟环境跑通。

十四、get_market_data 三兄弟怎么选

接口返回格式适用场景
get_market_data_ex{代码: DataFrame},每代码一表单代码深度分析、逐代码算指标(最常用)
get_market_data{字段: DataFrame},行=代码 列=时间多代码同一字段对比(如全市场收盘价矩阵)
get_local_data同 get_market_data纯读本地文件、不联网请求,批量回测取数快;多一个 data_dir 参数

三者参数签名一致(本地实测):(field_list=[], stock_list=[], period='1d', start_time='', end_time='', count=-1, dividend_type='none', fill_data=True)。

1、tick 数据的特别之处

period='tick' 时返回的不是 DataFrame,而是 {代码: numpy数组}(按时间戳升序),每个元素是分笔快照字典。做逐笔回测或盘口研究时注意格式差异。

2、fill_data 参数

fill_data=True(默认)会把停牌等造成的空缺用前一交易日的数据向后填充;做严格逐笔研究时设为 False,自己处理缺失。

白话注解:ex 版是"一人一张成绩单",matrix 版是"全班一张大表"。分析一只股票拿 ex,横向对比几十只拿 matrix。

十五、板块与合约信息:查代码、涨跌停、最小变动价

1、板块成分股

from xtquant import xtdata

xtdata.download_sector_data() # 先下载板块分类信息
stocks = xtdata.get_stock_list_in_sector('沪深A股')
print(len(stocks), stocks[:5])

2、合约信息(还能验代码对不对)

info = xtdata.get_instrument_detail('600000.SH')
if info is None:
print('代码不存在!') # 查不到合约返回 None
else:
    print(info['InstrumentName']) # 浦发银行
print(info['UpStopPrice']) # 今日涨停价
print(info['DownStopPrice']) # 今日跌停价
print(info['PriceTick']) # 最小变动价位
    print(info['VolumeMultiple']) # 合约乘数(期货用)
print(info['IsTrading']) # 当前是否在交易
  • get_instrument_detail(代码, iscomplete=False):默认返回常用字段;iscomplete=True 返回手续费率、期权类型等全量字段;
  • 合约信息(涨跌停价等)需要行情连接,实盘下单前用它做限价合法性校验,避免被柜台拒单。
白话注解:get_instrument_detail 就是"查户口"——这个代码存不存在、今天能交易吗、涨停跌停多少钱,一次问清。下单前查一下,能省一半拒单烦恼。

十六、财务数据与除权:get_financial_data / get_divid_factors

1、财务数据

xtdata.download_financial_data(['600000.SH'], table_list=['Income', 'Balance'])

data = xtdata.get_financial_data(['600000.SH'],
                                 table_list=['Balance', 'Income', 'CashFlow',
                                             'Capital', 'Holdernum',
                                             'Top10holder', 'Pershareindex'])
df = data['600000.SH']['Income'] # 利润表 DataFrame

可用表:Balance 资产负债表 / Income 利润表 / CashFlow 现金流量表 / Capital 股本表 / Holdernum 股东数 / Top10holder 十大股东 / Top10flowholder 十大流通股东 / Pershareindex 每股指标。

2、除权除息

df = xtdata.get_divid_factors('600000.SH') # 除权数据 DataFrame

K线复权直接在 get_market_data 的 dividend_type 里指定(front/back),不必手动算。注意:不同复权方式下算出的均线、收益率不同,回测前后用同一种复权,别混。

3、交易日历

dates = xtdata.get_trading_dates('SH', start_time='20240101',
                                 end_time='20241231')
holidays = xtdata.get_holidays() # 当年节假日(先 download_holiday_data)

十七、实盘部署:客户端在线与 session_id 规则

1、客户端在线是硬前提

miniQMT 模式下,QMT 客户端必须保持登录运行(行情连接、柜台通道都靠它转发)。客户端一关,所有接口立刻失效。

2、部署清单

  1. 选 Windows 云主机/VPS(xtquant 和 QMT 客户端是 Windows 程序),网络离券商柜台越近越好;
  2. 装 QMT 客户端,登录并切到 miniQMT 模式,设置开机自启;
  3. pip install xtquant,脚本路径写死服务器上的 userdata_mini 绝对路径;
  4. 脚本用 run_forever() 或主循环保活,注册 on_disconnected 重连;
  5. 留意客户端定期强制更新和重新登录的机制,最好配套"每天收盘前人工确认在线"的流程。

3、session_id 规则

  • 同一台机器上,每个脚本进程用不同的 session_id;
  • 重复的 session_id 会导致两个脚本互相顶掉连接;
  • 常见做法:以时间戳生成 int(time.time()) 或写配置文件固定分配。
白话注解:VPS 是"永远不关机的远程电脑"。策略放家里电脑,一停电一断网就全瞎;放 VPS 上 7×24 在线,客户端和脚本各占一个进程,各用各的 session_id。

十八、本课小结

  • xtquant = xtdata(行情)+ xttrader(交易)+ xttype(对象)+ xtconstant(常量);
  • 连接五步走:建对象 → start → connect → subscribe → run_forever;
  • order_stock 八参数下单,返回 order_id;async 版返回 seq;
  • 查询四件套返回 None 而非空列表,先判空;
  • 回调传给订阅函数(register_callback 不存在);最新价用 get_full_tick(get_last_price 不存在);
  • 期货账户 StockAccount(账号, 'FUTURE')(FutureAccount 不存在),平仓只有平今/平昨;
  • 历史数据先 download 再 get;实盘要防重复下单、查涨跌停、处理断线重连;
  • xtquant 无回测引擎:回测用 Backtrader / vn.py,xtquant 接实盘。
白话注解:QMT 就是"券商给你的 Python 遥控器"。遥控器好用,但电视(客户端)必须开着;信号(回测)再好,也要记住:实盘是另一场比赛。
本站固定免责声明:本教程仅讲解软件编程与操作方法,不构成投资建议或策略推荐。回测业绩不代表未来收益,EA自动交易风险大,请谨慎决策。
付费专享 · 核心知识点 8 章

继续阅读:核心知识点,搞懂原理

EA11 Python/QMT-miniQMT 策略 — 共 26 章,已免费阅读 18 章,剩余 8 章核心知识点讲透「为什么这样、点了会怎样」。

十九、完整策略示例:双均线(修正版)
二十、常见报错与排查
二十一、常量体系速查:xtconstant 全家桶
二十二、策略工程化:防重复下单与风控细节
二十三、常见问题 FAQ
二十四、一页纸速查
…等共 8 章核心内容
✍️ 注册后扫码购买 🔐 已有账号,去登录 单套 ¥69 永久 · 会员可阅
SERVICE & PRICING
服务收费说明 · 明码标价,无隐藏收费
全部课程统一 ¥39-69,买一套永久使用。以下为购买与使用的完整流程。
01先免费试读

每套教程的「使用手册」部分均可免费阅读,先确认内容是否适合自己再决定,不必盲买。

02扫码付款

选定课程后点「立即解锁」,页面展示收款二维码与客服微信,扫码转账即可,无需注册海外支付。

03获取卡密

付款完成后客服第一时间发送卡密号与卡密密码,站内消息与微信同步通知。

04兑换解锁

在用户中心「兑换卡密」输入卡密号与密码,系统即时解锁全部章节,无需二次付款。

一次付费,终身可用 · 解锁后课程永久留在账号里,不限次数、不限时间阅读 持续免费更新 · 平台改版、规则变化时课程同步修订
RECOMMEND
相关教程推荐 · 同栏目更多上手机会

💬 用户评价 (0)

🔒 登录并成为会员后可发表评价
还没有评价 · 成为第一个评价的人吧 🎯