跳转至

聚宽策略修改方案 1:显式调用 helper

这份文档适合需要在聚宽策略或聚宽研究里直接调用 bt.xxx 的用户。

第一次使用请从已有聚宽策略:从零接入大 QMT开始。教程包括 Windows 安装、端口映射、账户验证,以及同时适用于回测和模拟盘的显式分流示例。本页是接口参考。

显式接口不自动识别回测

bt.configure()bt.order() 等直接接口不读取聚宽 context.run_params.type。下文简写代码适用于已明确要访问远程账户的场景;同一策略还要回测时,必须在策略中将 simple_backtest/full_backtest 分流到聚宽原函数,仅 sim_trade 走远程,账户读取、撤单也要分流。即使安装了兼容层,另外直接调用 bt.xxx 也不会自动获得回测保护。sim_trade 不能判断 QMT 账户是仿真还是实盘。

策略修改方案 1 的核心是:聚宽继续运行策略,真实下单点显式改成 bullet_trade_jq_remote_helper 的函数。

这个方案只表示“怎么改策略代码”,不是单独的网络部署方案。只要策略运行在聚宽侧,聚宽都需要能访问 bullet-trade server 的入口地址和端口;如果 bullet-trade server 跑在 QMT 那台 Windows 机器上,通常需要公网 IP、域名、端口映射,或 FRP / VPN 等可达通道。

1. 上传 helper

把下面文件上传到聚宽研究根目录:

  • bullet_trade_jq_remote_helper.py

文件来源:

  • GitHub:helpers/bullet_trade_jq_remote_helper.py

上传后,聚宽策略里可以直接:

import bullet_trade_jq_remote_helper as bt

2. 策略里配置远程 server

推荐把服务器参数放在策略文件开头,把 bt.configure(...) 放在 process_initialize(context)

import bullet_trade_jq_remote_helper as bt


BT_REMOTE_HOST = "your.server.ip"
BT_REMOTE_PORT = 58620
BT_REMOTE_TOKEN = "secret"
BT_ACCOUNT_KEY = "main"
BT_SUB_ACCOUNT_ID = None


def process_initialize(context):
    bt.configure(
        host=BT_REMOTE_HOST,
        port=BT_REMOTE_PORT,
        token=BT_REMOTE_TOKEN,
        account_key=BT_ACCOUNT_KEY,
        sub_account_id=BT_SUB_ACCOUNT_ID,
    )


def initialize(context):
    # 原来的 initialize 逻辑继续写在这里
    set_benchmark("000300.XSHG")

process_initialize(context) 用来在聚宽模拟盘进程启动或重启后恢复 helper 配置。initialize(context) 继续放原策略初始化逻辑,例如 set_benchmarkrun_daily

3. 参数说明

参数 说明
host bullet-trade server 地址,可以是公网 IP、内网 IP 或域名。
port 聚宽实际访问的入口端口,默认 58620;有端口映射时填外部端口,可能不同于 server 本机监听端口。
token server 端配置的访问 token。
account_key 多账户配置时的账户 key;单账户可以传 None 或不传。
sub_account_id BulletTrade 虚拟子账户 ID;不用虚拟账户时传 None

4. 下单函数怎么改

把聚宽原始下单函数显式改成 bt.xxx

原聚宽写法 策略修改方案 1 写法
order(...) bt.order(...)
order_value(...) bt.order_value(...)
order_percent(...) bt.order_percent(...)
order_target(...) bt.order_target(...)
order_target_value(...) bt.order_target_value(...)
order_target_percent(...) bt.order_target_percent(...)
cancel_order(order_id) bt.cancel_order(order_id)

示例:

# 原来
order_target_value("510300.XSHG", 100000)

# 改成
bt.order_target_value("510300.XSHG", 100000)

下单默认是异步立即返回;如果希望同步等待,可以传 wait_timeout

bt.order_target_value("510300.XSHG", 100000, wait_timeout=16)

5. 账户和持仓读取

方案 A 不接管 context.portfolio。如果策略里的仓位判断要按真实账户计算,应显式读取远程账户:

acct = bt.get_account()
positions = bt.get_positions()

print("远程可用资金:", acct.available_cash)
print("远程总资产:", acct.total_value)
print("远程持仓数量:", len(positions))

如果原策略继续使用下面这些字段,它们仍然来自聚宽虚拟盘:

context.portfolio.available_cash
context.portfolio.total_value
context.portfolio.positions

所以当策略依赖现金、持仓、市值比例来决定真实下单金额时,要么把这些判断也改成 bt.get_account() / bt.get_positions(),要么改用 策略修改方案 2:接管聚宽函数

6. 聚宽研究里测试连接

在聚宽研究环境里可以先运行下面代码,只测试连接、账户读取和持仓读取;默认不下单。

import bullet_trade_jq_remote_helper as bt


bt.configure(
    host="your.server.ip",
    port=58620,
    token="secret",
    account_key="main",
    sub_account_id=None,
)

acct = bt.get_account()
positions = bt.get_positions()

print("远程可用资金:", acct.available_cash)
print("远程总资产:", acct.total_value)
print("远程持仓数量:", len(positions))

for pos in positions:
    print(pos.security, pos.amount, pos.available, pos.market_value, pos.avg_cost)

# 谨慎:取消注释后会真实远程下单
# bt.order("000001.XSHE", 100, wait_timeout=0)

7. 优缺点

优点:

  • 真实下单点很明确。
  • 不覆盖聚宽原始函数,适合研究、调试和小范围改造。
  • 对已经按 bt.xxx 改好的老策略完全兼容。

缺点:

  • 需要逐个修改下单函数。
  • 账户和持仓判断也要人工确认口径,否则可能出现“聚宽虚拟盘资金判断、远程真实账户下单”的错配。
  • 存量策略下单点很多时,改造成本高于方案 B。