
vnpy WebTrader 模块实战指南基于 FastAPI 与 RPC 的 B/S 架构 Web 交易服务【免费下载链接】vnpy基于Python的开源量化交易平台开发框架项目地址: https://gitcode.com/vnpy/vnpyWebTrader 是 vnpyVeighNa量化交易平台中的 Web 服务器模块面向 B/SBrowser/Server架构需求设计用户无需启动 PyQt 桌面端直接通过浏览器即可对运行中的 VeighNa Trader 进行行情订阅、数据查询、委托下单与撤单等交易管理操作。本文以 web_trader.md 官方文档为主体结合仓库内 RPC 底层源码完整讲解其双进程架构、加载启动流程、REST/WebSocket 接口调用方法以及配置要点与能力边界读完即可在本地跑通从令牌获取到委托撤单的完整 Web 交易链路。模块定位与核心特性WebTrader 在 vnpy 官方文档中的定位是用于Web 应用后端服务的功能模块让用户通过浏览器而非 PyQt 桌面端来运行和管理 VeighNa 量化策略交易。在 README.md 中其描述为Web 服务模块针对 B-S 架构需求设计实现了提供主动函数调用REST和被动数据推送Websocket的 Web 服务器。核心特性可归纳为两点REST 主动请求调用浏览器通过访问 HTTP URL 发起订阅行情、挂撤单、查询数据等操作WebSocket 被动数据推送行情推送、委托推送等事件数据以 JSON 格式实时推送到浏览器端。从 CHANGELOG 记录CHANGELOG.md可以看出该模块的演进细节支持了加密鉴权自定义监听地址和端口并修复过html 静态文件缺失问题说明其鉴权机制与监听配置经过了持续完善。系统架构双进程协作设计WebTrader 采用 FastAPI 作为后端服务器框架运行时整体分为两个相互独立的进程进程承载内容关键组件策略交易进程运行 VeighNa Trader负责所有策略交易功能启动RpcServer向 Web 服务进程提供功能调用Web 服务进程运行 FastAPI负责对外提供 Web 访问服务启动RpcClient调用策略交易进程的相关功能两个进程之间通过 ZeroMQ 实现 RPC 通讯形成浏览器 → Web 服务进程 → 策略交易进程的三层链路。主动请求调用Req-Rep 模式主动请求如订阅行情、挂撤单、查询数据的完整调用链为浏览器发起 REST API 调用访问某个 URL 地址提交数据到 Web 服务进程Web 服务进程收到请求后转换为 RPC 请求发送给策略交易进程策略交易进程执行请求处理后将结果返回给 Web 服务进程Web 服务进程把数据返回给浏览器。被动数据推送Pub-Sub 模式被动推送如行情推送、委托推送的完整链路为浏览器发起 WebSocket 连接到 Web 服务进程策略交易进程通过 RPC 推送将数据推送给 Web 服务进程Web 服务进程收到后将数据通过 WebSocket API 以 JSON 格式实时推送给浏览器。RPC 底层实现原理双进程通信的底层依赖就位于当前仓库的vnpy/rpc目录中可直接阅读源码印证vnpy/rpc/server.pyRpcServer同时创建zmq.REP应答与zmq.PUB发布两个 Socket——REP 套接字接收客户端请求、执行注册函数并回传结果PUB 套接字用于主动向订阅端广播数据。服务端通过register(func)注册可被远程调用的函数publish(topic, data)实现事件广播vnpy/rpc/client.pyRpcClient持有zmq.REQ请求与zmq.SUB订阅两个 Socket并通过__getattr__动态代理实现以调用本地方法的方式发起远程调用调用默认超时时间为 30000 毫秒超时或远端执行异常时抛出RemoteExceptionvnpy/rpc/common.py定义了心跳机制参数——心跳主题heartbeat、心跳间隔HEARTBEAT_INTERVAL 10秒、容错阈值HEARTBEAT_TOLERANCE 30秒。客户端在超过 30 秒未收到服务端心跳时会通过on_disconnected打印连接异常提示用于检测 Web 服务进程与策略交易进程之间的链路健康状态。这正好对应了 rpc_service.md 中介绍的 RPC 通讯地址体系请求响应地址与事件广播地址均采用 ZeroMQ 地址格式如tcp://127.0.0.1:2014推荐使用 TCP 协议追求更低通讯延时的 Linux 用户可选用 IPC 协议。加载启动 WebTrader通过 VeighNa Station 加载启动并登录 VeighNa Station 后点击【交易】按钮在弹出的配置对话框的【应用模块】栏中勾选【WebTrader】即可。通过启动脚本加载在启动脚本中添加如下代码# 写在顶部 from vnpy_webtrader import WebTraderApp # 写在创建main_engine对象后 main_engine.add_app(WebTraderApp)参照仓库中的标准启动脚本 examples/veighna_trader/run.py 可以看到WebTraderApp与CtaStrategyApp、DataManagerApp等同属于应用模块App统一通过main_engine.add_app(...)注册到主引擎中在官方示例脚本中WebTraderApp默认以注释形式保留取消注释即可启用。启动前置条件与操作入口启动模块之前务必先连接并登录交易接口如 CTP 等待 VeighNa Trader 主界面【日志】栏输出合约信息查询成功后再启动模块确保合约等初始化数据已就绪。成功连接交易接口后通过两种方式进入模块界面点击菜单栏【功能】→【Web 服务】点击左侧按钮栏中的 WebTrader 图标。此时系统中仅运行策略交易进程界面上方区域为服务器配置选项。服务器配置项详解进入 WebTrader 界面后左上角区域的服务器配置选项包括用户名和密码从网页端登录 Web 应用时使用的账号口令。使用时请修改为自己想用的用户名和密码通过启动目录下.vntrader中的web_trader_setting.json文件修改。注意这里的用户名和密码与底层交易接口的账户密码完全无关仅用于 Web 应用的鉴权登录CHANGELOG 中加密鉴权的优化即与此相关请求和订阅地址架构图中 Web 服务进程与策略交易进程之间进行 RPC 通讯的地址注意端口不要与其他程序冲突即可。点击【启动】按钮后模块会根据用户输入的配置信息在系统后台启动 Web 服务进程同时右侧区域会输出 FastAPI 运行过程中的相关日志信息便于观察服务启动状态与请求处理情况。接口演示从令牌到撤单的完整调用链启动 Web 服务后在浏览器打开http://127.0.0.1:8000/docs即可看到 FastAPI 自动生成的交互式接口文档页面其中包含当前 WebTrader 支持的全部接口信息。下文结合 HTTP 客户端与 WebSocket 客户端演示各接口的实际用法示例中的请求地址、账号密码等请按实际部署情况替换。1. 获取令牌TokenWebTrader 的所有业务接口都需要携带令牌进行鉴权。通过POST /token接口换取access_tokenimport requests import json url http://127.0.0.1:8000/ username vnpy password vnpy r requests.post( url token, data{username: username, password: password}, headers{accept: application/json} ) token r.json()[access_token]首先导入requests和json模块定义url、用户名和密码通过requests.post方法传入相应参数即可获得令牌token后续访问各类接口时直接传入该 token 即可无需重复登录。2. 行情订阅通过POST /tick/{symbol}接口实现对指定合约的行情订阅订阅成功后图形界面即可收到该合约的行情数据推送r requests.post(url tick/ cu2112.SHFE, headers{Authorization:Bearer token})注意这里合约代码与交易所代码的组合格式为合约代码.交易所代码如上例的cu2112.SHFE并需在请求头中以Authorization: Bearer token形式携带令牌。3. 批量查询通过主动请求可查询各类交易数据包括 tick 数据、合约数据、账户数据、持仓数据、委托数据以及成交数据# 查询函数 def query_test(name): 查询对应类型的数据 r requests.get( url name, headers{Authorization: Bearer token} ) return r.json() # 批量查询 for name in [tick, contract, account, position, order, trade]: data query_test(name) print(name - * 20) if data: print(data[0])批量遍历tick / contract / account / position / order / trade六个数据类别逐一发起GET请求并打印首条数据可用于快速验证各数据通道是否正常。4. 委托测试下单通过POST /order接口提交委托请求请求体为 JSON 格式的字典# 委托测试 req { symbol: cu2112, exchange: SHFE, direction: 多, type: 限价, volume: 1, price: 71030, offset: 开, reference: WebTrader } r requests.post( url order, jsonreq, headers{Authorization: Bearer token} ) vt_orderid r.json() print(vt_orderid)委托字段说明字段含义示例值symbol合约代码cu2112exchange交易所SHFEdirection买卖方向多/空type委托类型限价也支持市价等volume委托数量1price委托价格71030offset开平方向开/平/平今等reference委托引用标识WebTrader下单接口返回vt_orderidVeighNa 内部委托号该 ID 是后续撤单操作所需的唯一标识。下单成功后同样能在图形化界面看到对应的委托信息。5. 撤单测试如需撤销之前提交的委托通过DELETE /order/{vt_orderid}接口发送主动请求# 撤单测试 r requests.delete( url order/ vt_orderid, headers{Authorization: Bearer token} )撤单结果同样会在图形化界面实时更新。6. WebSocket 被动接收推送通过 WebSocket 可以被动接收策略交易进程推送过来的行情数据和委托数据等。使用websocket-client库建立连接# WebSocket测试 from websocket import create_connection ws create_connection(ws://127.0.0.1:8000/ws/?token token) while True: result ws.recv() print(Received %s % result) ws.close()连接地址为ws://127.0.0.1:8000/ws/令牌通过 URL 查询参数?token传递。建立连接后循环调用recv()即可持续接收服务端推送的 JSON 数据如行情、委托状态等这与 RPC 的 Pub-Sub 事件广播机制一一对应。配置与安全要点综合官方文档与仓库变更记录实际部署时还需注意以下几点鉴权安全WebTrader 已支持加密鉴权见 CHANGELOG.md但所有接口调用仍需通过 Bearer Token 认证务必修改web_trader_setting.json中的默认用户名和密码避免使用文档示例中的弱口令监听地址与端口模块支持自定义监听地址和端口。RPC 通讯地址的端口需避免与其他程序冲突Web 服务的默认监听端口为8000/docs接口文档即在该端口下访问连接时序必须先连接交易接口并等待合约信息查询成功后再启动 WebTrader否则行情订阅、委托等操作可能因底层数据未就绪而失败。能力边界与后续计划WebTrader 目前的定位是Web 应用的后端服务它提供了浏览器访问数据的接口而前端页面即浏览器中看到的网页按照官方规划交由社区用户来实现。因此当前模块只支持基础的手动交易功能后续计划逐渐加入策略交易应用相关的管理功能比如 CtaStrategy 的相关调用。对于想要基于 WebTrader 构建完整 B/S 交易系统的开发者建议以本文的接口调用链为基础自行实现前端页面并持续关注该模块后续对策略管理能力的扩展。延伸阅读官方模块文档docs/community/app/web_trader.mdRPC 服务模块文档docs/community/app/rpc_service.mdRPC 服务端实现vnpy/rpc/server.pyRPC 客户端实现vnpy/rpc/client.py心跳与通讯常量定义vnpy/rpc/common.py标准启动脚本示例examples/veighna_trader/run.py平台功能清单与模块说明README.md【免费下载链接】vnpy基于Python的开源量化交易平台开发框架项目地址: https://gitcode.com/vnpy/vnpy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考