ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

VeighNa WebTrader 模块实战指南:基于 FastAPI 与 RPC 的浏览器端量化交易后端

VeighNa WebTrader 模块实战指南:基于 FastAPI 与 RPC 的浏览器端量化交易后端 VeighNa WebTrader 模块实战指南基于 FastAPI 与 RPC 的浏览器端量化交易后端【免费下载链接】vnpy基于Python的开源量化交易平台开发框架项目地址: https://gitcode.com/gh_mirrors/vn/vnpyWebTrader 是 VeighNavnpy生态中面向 B-SBrowser-Server架构设计的 Web 服务模块它让用户无需启动 PyQt 桌面端即可通过浏览器以 REST 主动请求与 WebSocket 被动推送两种方式远程完成行情订阅、下单撤单、数据查询等量化交易操作。本文以 docs/community/app/web_trader.md 为主线结合本仓库中 vnpy/rpc 的源码实现完整讲解 WebTrader 的架构设计、加载启动、配置要点与全量接口调用方式读者学完后即可独立搭建并调用一套基于浏览器的 VeighNa 交易后端服务。一、模块定位WebTrader 在 VeighNa 生态中的角色WebTrader 是用于Web 应用后端服务的功能模块其核心目标是把 VeighNa Trader 的交易能力通过标准 Web 接口暴露给浏览器端。与传统的桌面端操作方式相比它解决了以下问题用户不再需要安装或启动 PyQt 桌面图形界面只要能访问到 Web 服务地址的浏览器甚至脚本、移动端应用即可发起交易操作提供标准化的 HTTP/WebSocket 接口方便第三方前端页面、移动 App、自动化脚本与 VeighNa 交易内核集成与 RpcService 模块 配合天然支持多进程、跨网络的分布式交易架构。从仓库 README.md 与 功能介绍文档 可以看到WebTrader 被归类为「辅助类」应用模块官方定位是“针对 B-S 架构需求设计实现了提供主动函数调用REST和被动数据推送Websocket的 Web 服务器”。需要特别说明的是WebTrader 只实现Web 应用的后端即提供浏览器访问数据的接口前端页面部分按官方计划交给社区用户实现同时它当前只支持基础的手动交易功能策略交易应用如 CtaStrategy的 Web 化管理接口仍在逐步演进中详见文档结尾的「后续计划」章节。二、架构设计双进程 双向通讯2.1 两个独立进程的分工WebTrader 采用FastAPI 作为后端服务器同时支持 REST 主动请求调用与 WebSocket 被动数据推送。运行时整体分为两个相互独立的后台进程进程运行内容承担的职责策略交易进程运行 VeighNa Trader负责所有策略交易功能的实际运行内部启动RpcServer对外提供服务Web 服务进程运行 FastAPI负责对外提供 Web 访问服务内部启动RpcClient调用策略交易进程的功能两个进程之间通过 RPC 通讯而 RPC 底层由本仓库 vnpy/rpc 模块基于ZeroMQZMQ实现。2.2 主动请求调用浏览器 → 交易进程「主动请求调用」用于订阅行情、挂撤单、查询数据等需要发起并等待结果的场景其链路为浏览器发起 REST API 调用访问某个 URL 地址提交数据到 Web 服务进程Web 服务进程收到请求后转换为 RPC 请求发送给策略交易进程策略交易进程执行请求处理后把结果返回给 Web 服务进程Web 服务进程再把数据返回给浏览器。这条链路对应 RPC 的请求-应答Req-Rep通讯模式。在 vnpy/rpc/server.py 中RpcServer使用zmq.REP套接字绑定rep_address接收请求在主循环中通过recv_pyobj()取出(name, args, kwargs)形式的调用描述从self._functions字典中取出对应函数执行再把[True, 结果]或[False, 异常堆栈]返回给调用方register()方法则负责把函数按func.__name__注册进调用表。对应的客户端侧在 vnpy/rpc/client.py 中RpcClient使用zmq.REQ套接字连接req_address并借助__getattr__动态代理机制实现“以调用本地属性的方式调用远端函数”每次调用默认超时时间为30000 毫秒可通过timeout关键字调整超时或远端执行异常时都会抛出RemoteException。2.3 被动数据推送交易进程 → 浏览器「被动数据推送」用于行情推送、委托推送等需要实时接收数据的场景其链路为浏览器发起 WebSocket 连接到 Web 服务进程策略交易进程通过 RPC 推送将数据推送给 Web 服务进程Web 服务进程收到后把数据通过 WebSocket API 实时推送给浏览器JSON 格式。这条链路对应 RPC 的发布-订阅Pub-Sub通讯模式。RpcServer使用zmq.PUB套接字绑定pub_address通过publish(topic, data)发送[topic, data]结构的数据RpcClient则使用zmq.SUB套接字连接sub_address并在工作线程中轮询接收数据非心跳主题的数据会交给callback(topic, data)处理该回调默认抛出NotImplementedError由具体子类实现。subscribe_topic()方法用于订阅指定主题。2.4 心跳保活机制为了及时发现连接异常RPC 层内置了心跳机制定义在 vnpy/rpc/common.pyHEARTBEAT_TOPIC heartbeat心跳专用主题HEARTBEAT_INTERVAL 10RpcServer每 10 秒通过publish(HEARTBEAT_TOPIC, now)发布一次心跳时间戳见check_heartbeat()HEARTBEAT_TOLERANCE 30RpcClient若超过 30 秒未收到心跳数据则判定连接断开并调用on_disconnected()输出告警提示。两个进程间的通讯地址均为 ZeroMQ 地址格式由通讯协议如tcp://和通讯地址如127.0.0.1:2014两部分组成。WebTrader 默认使用tcp://协议关于 IPC 协议ipc://仅限 Linux 本机使用等更多地址约定可参考 RpcService 模块文档 中的「配置RPC服务」章节。三、加载与启动3.1 通过 VeighNa Station 加载启动并登录 VeighNa Station 后点击【交易】按钮在配置对话框中的【应用模块】栏勾选【WebTrader】即可。3.2 通过启动脚本加载在 VeighNa Trader 启动脚本中通过main_engine.add_app()注册应用。本仓库的示例启动脚本 examples/veighna_trader/run.py 中保留了对应的注释示例# 写在顶部 from vnpy_webtrader import WebTraderApp # 写在创建main_engine对象后 main_engine.add_app(WebTraderApp)3.3 启动模块在启动 WebTrader 之前请先连接并登录交易接口如 CTP 等。看到 VeighNa Trader 主界面【日志】栏输出「合约信息查询成功」之后再启动模块以确保底层合约数据已就绪。成功连接交易接口后在菜单栏中点击【功能】-【Web 服务】或者点击左侧按钮栏的对应图标即可进入 WebTrader 的 UI 界面。此时系统中实际运行的只有策略交易进程界面左上角区域的服务器配置选项包括用户名和密码从网页端登录 Web 应用时使用的账号信息。使用时请修改为自己想用的用户名和密码可通过启动目录.vntrader下的web_trader_setting.json修改。请注意这里的用户名和密码与底层交易接口无关它只用于 Web 服务的登录鉴权请求和订阅地址架构图中 Web 服务进程与策略交易进程之间进行 RPC 通讯的地址。前者对应RpcServer的请求应答REP端口后者对应事件广播PUB端口注意端口不要与其他程序冲突即可。点击【启动】按钮后系统会根据用户输入的配置信息在后台启动 Web 服务进程同时在右侧区域输出 FastAPI 运行过程中的相关日志信息可据此判断服务是否正常就绪。四、接口演示从令牌到全量交易操作启动 Web 服务后在浏览器打开网址 http://127.0.0.1:8000/docs即可看到 FastAPI 自动生成的 Swagger 接口文档页面其中包含了目前 WebTrader 支持的全部接口信息。下面结合官方提供的 Jupyter Notebook 测试脚本按交易操作流程逐一演示各接口的调用方法。以下示例均使用requests库默认服务地址为http://127.0.0.1:8000/。4.1 获得令牌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以及用户名、密码对应 UI 中配置的登录账号。通过requests.post()方法向/token接口提交表单数据即可获得访问令牌token。后续访问各种接口时只需在请求头中携带该 token 即可格式见下文各示例。4.2 行情订阅r requests.post(url tick/ cu2112.SHFE, headers{Authorization:Bearer token})上述命令实现对合约cu2112.SHFE的行情订阅。其中cu2112.SHFE是vt_symbol格式合约代码.交易所订阅成功后可在图形界面实时收到该合约的行情数据推送。注意这里的 token 以Bearer前缀放入Authorization请求头。4.3 批量查询# 查询函数 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])通过requests.get()主动请求即可查询相关数据支持的数据类型包括查询路径数据内容/tick行情 Tick 数据/contract合约数据/account账户资金数据/position持仓数据/order委托数据/trade成交数据4.4 委托测试下单# 委托测试 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)向/order接口 POST 委托请求即可下单请求体为 JSON 格式各字段说明如下字段说明可选值symbol合约代码如cu2112不含交易所后缀exchange交易所代码如SHFE完整枚举见 vnpy/trader/constant.py 中的Exchangedirection买卖方向多/空/净对应Direction枚举type委托类型限价/市价/FAK/FOK等对应OrderType枚举volume委托数量正整数如 1price委托价格限价单必填如 71030offset开平标志开/平/平今/平昨对应Offset枚举reference委托引用自定义备注如WebTrader上述枚举的中文取值与 vnpy/trader/constant.py 中Direction、Offset、OrderType的定义完全对应。下单成功后接口返回vt_orderid本地委托号可留作后续撤单等操作使用下单后同样能在图形化界面看到委托信息。4.5 撤单测试# 撤单测试 r requests.delete( url order/ vt_orderid, headers{Authorization: Bearer token} )如需撤销之前下的委托向/order/{vt_orderid}接口发送 DELETE 请求即可其中vt_orderid为 4.4 节下单接口返回的本地委托号。撤单结果同样会在图形化界面实时更新。4.6 WebSocket 测试被动数据接收# Weboscket测试 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()通过 WebSocket 可以被动接收策略交易进程推送过来的行情数据、委托数据等。连接地址为ws://127.0.0.1:8000/ws/token 以 URL 查询参数形式传递。建立连接后服务端会把 RPC 层推送来的数据经 vnpy/rpc/client.py 中callback(topic, data)接收实时转发为 JSON 消息客户端循环recv()即可持续收到数据。五、配置与安全要点5.1 配置文件web_trader_setting.jsonWebTrader 的登录用户名、密码等配置保存在启动目录.vntrader下的web_trader_setting.json中。部署时务必把默认账号密码修改为自己的账号密码避免使用默认值暴露在公网环境中。该账号密码仅用于 Web 应用登录鉴权与底层交易接口如 CTP 的账户密码完全无关。5.2 鉴权与监听配置从本仓库 CHANGELOG.md 的历史记录可以看到 WebTrader 的两项重要演进加密鉴权模块已支持加密鉴权并且支持 Web 进程关闭重启避免重启后 token 失效导致客户端需要重新登录自定义监听地址和端口模块支持自定义监听地址和端口部署时可根据实际网络环境把 FastAPI 服务绑定到指定的 IP 与端口上。5.3 使用建议两个进程间的 RPC 端口请求地址、订阅地址属于内部通讯端口按文档建议“注意端口不要和其他程序冲突即可”若策略交易进程与 Web 服务进程不在同一台机器上请确保对应端口在防火墙中按需放行Web 服务进程对外暴露的8000端口FastAPI 默认监听端口是浏览器访问入口若需对外提供服务应结合反向代理、HTTPS 与上述鉴权机制一并规划。六、后续计划与扩展方向按官方文档规划WebTrader 目前处于“后端先行”阶段前端页面WebTrader 仅实现了 Web 应用的后端提供浏览器访问数据的接口而前端页面浏览器中看到的网页交给社区用户实现欢迎大家贡献代码策略管理功能目前 WebTrader 只支持基础的手动交易功能后续将逐渐加上策略交易应用相关的管理功能例如 CtaStrategy 的相关调用。对于希望在此基础上二次开发的读者可以重点关注以下仓库源码作为参考vnpy/rpc/server.pyRpcServer的启动、函数注册、请求应答与发布订阅实现vnpy/rpc/client.pyRpcClient的远程调用代理、主题订阅与心跳保活实现vnpy/trader/constant.py委托、方向、开平等请求字段的标准枚举定义examples/veighna_trader/run.pyVeighNa Trader 启动脚本可参考其中add_app(WebTraderApp)的注册方式。结合 RpcService 模块文档 可以进一步理解RPC 的价值在于跨进程或跨网络的服务功能调用配合单一行情与交易通道即可支持多个客户端进程同时交易。WebTrader 正是在这一分布式架构之上把 RPC 能力进一步封装为标准 Web 接口为浏览器端、移动端乃至第三方系统的接入提供了统一入口。【免费下载链接】vnpy基于Python的开源量化交易平台开发框架项目地址: https://gitcode.com/gh_mirrors/vn/vnpy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表