chore: import upstream snapshot with attribution

This commit is contained in:
wehub-resource-sync
2026-07-13 12:07:23 +08:00
commit 9c7a92f663
190 changed files with 88544 additions and 0 deletions
+1
View File
@@ -0,0 +1 @@
* @vnpy
+9
View File
@@ -0,0 +1,9 @@
# 行为准则
这是一份VeighNa项目社区的行为准则,也是项目作者自己在刚入行量化金融行业时对于理想中的社区的期望:
* 为交易员而生:作为一款从金融机构量化业务中诞生的交易系统开发框架,设计上都优先满足机构专业交易员的使用习惯,而不是其他用户(散户、爱好者、技术人员等)
* 对新用户友好,保持耐心:大部分人在接触新东西的时候都是磕磕碰碰、有很多的问题,请记住此时别人对你伸出的援助之手,并把它传递给未来需要的人
* 尊重他人,慎重言行:礼貌文明的交流方式除了能得到别人同样的回应,更能减少不必要的摩擦,保证高效的交流
+19
View File
@@ -0,0 +1,19 @@
## 环境
* 操作系统: 如Windows 11或者Ubuntu 22.04
* Python版本: 如VeighNa Studio-4.0.0
* VeighNa版本: 如v4.0.0发行版或者dev branch 20250320(下载日期)
## Issue类型
三选一:Bug/Enhancement/Question
## 预期程序行为
## 实际程序行为
## 重现步骤
针对Bug类型Issue,请提供具体重现步骤以及报错截图
+11
View File
@@ -0,0 +1,11 @@
建议每次发起的PR内容尽可能精简,复杂的修改请拆分为多次PR,便于管理合并。
## 改进内容
1.
2.
3.
## 相关的Issue号(如有)
Close #
+8
View File
@@ -0,0 +1,8 @@
# 获取帮助
在开发和使用VeighNa项目的过程中遇到问题时,获取帮助的渠道包括:
* Github Issues[Issues页面](https://github.com/vnpy/vnpy/issues)
* 官方QQ群: 262656087
* 项目论坛:[VeighNa量化社区](http://www.vnpy.com/forum)
* 项目邮箱: vn.py@foxmail.com
+34
View File
@@ -0,0 +1,34 @@
version: 2
updates:
- package-ecosystem: pip
directory: /
target-branch: dev
open-pull-requests-limit: 5
schedule:
interval: weekly
day: monday
time: "09:00"
timezone: Asia/Shanghai
commit-message:
prefix: "chore(deps)"
include: scope
groups:
python:
update-types: [minor, patch]
- package-ecosystem: github-actions
directory: /
target-branch: dev
open-pull-requests-limit: 5
schedule:
interval: weekly
day: monday
time: "09:00"
timezone: Asia/Shanghai
commit-message:
prefix: "chore(deps)"
include: scope
groups:
actions:
patterns: ["*"]
+41
View File
@@ -0,0 +1,41 @@
name: Python application
on:
push:
branches: [master, dev]
pull_request:
branches: [master, dev]
permissions:
contents: read
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
build:
runs-on: windows-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.13"
cache: pip
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install ruff mypy uv types-tqdm
uv pip install ta-lib==0.6.4 --index=https://pypi.vnpy.com --system
uv pip install -e .[alpha,dev] --system
- name: Lint
run: ruff check .
- name: Type check
run: mypy vnpy
- name: Build
run: uv build
+43
View File
@@ -0,0 +1,43 @@
# Python
*.pyc
*.pyo
*.pyd
*.egg-info/
# Jupyter
.ipynb_checkpoints
# IDE
.vscode
.idea
*.wpr
*.wpu
.vs
x64
# Temp
build
dist
*.local
# VeighNa
.vntrader
# Visual Studio intermediate files
*.exp
*.iobj
*.ipdb
*.pdb
# Documents
_build
_static
_templates
# Misc
.DS_Store
*.mo
# Alpha
lab/
/.mypy_cache
+825
View File
@@ -0,0 +1,825 @@
# 4.4.0版本
## 新增
1. 新增微信通知功能,支持基于微信iLink协议的扫码绑定、消息推送、推送间隔配置和会话过期提示
2. MainEngine新增send_notification函数,支持统一通过邮件和微信渠道发送通知
3. vnpy.alpha增加自定义表达式函数注册机制register_functions
4. vnpy.alpha增加数据处理函数:process_replace_inf、process_ts_norm、process_drop_feature、process_cs_fill_na
5. DataProxy增加更多运算符支持:反向加减乘除、整除、取模、幂运算、负号和不等于比较
6. 新增用于对接QuestDB高性能时序数据库的vnpy_questdb模块
7. vnpy_esunny重构调整为基于易盛启明星V9 API接口开发,支持期货和黄金TD交易
## 调整
1. vnpy.alpha改进数据集、处理器、模型和回测相关实现,优化类型提示和数据处理流程
2. DataProxy的比较运算结果统一返回pl.Int32,并补充相关单元测试
3. 微信通知增加推送间隔控制,间隔内的新消息会暂存并合并发送
4. 替换send_email为新的send_notification消息发送函数:vnpy_ctastrategy / vnpy_portfoliostrategy / vnpy_spreadtrading / vnpy_scripttrader
5. vnpy_tora更新升级:行情API至v1.0.9_20250825、股票API至v4.1.6_20251121、期权API至v1.3.4_20230908
6. vnpy_ctp中对于因为报单提交被拒绝导致的撤单状态,调整映射为拒单状态
7. vnpy_ctp调整特殊情况撤单(非交易时段、资金不足等)的日志输出
8. vnpy_rohon更新升级至6.7.2版本的底层API
9. vnpy_tts更新升级至6.7.11版本的底层API,并增加Mac OS支持
## 修复
1. 修复loguru日志格式化错误
2. vnpy.alpha修复AlphaLab查询信号文件路径错误的问题
3. vnpy_rqdata修复下载数据时,由于end没有时区信息下载报错的问题
4. vnpy_rqdata修复由于没有成交,导致实时行情中字段缺失的问题
5. vnpy_tora修复Fens服务器登录的问题
6. vnpy_spreadtrading修复算法成交判断中的四舍五入误差问题
# 4.3.0版本
## 新增
1. vnpy.alpha增加WorldQuant的Alpha 101因子特征数据集
## 调整
1. vnpy_sec/vnpy_esunny升级适配4.0版本
2. vnpy_ctabacktester的策略代码编辑功能支持cursor和pycharm编辑器
3. vnpy_ctastrategy的回测引擎,增加RGR绩效统计指标(感谢上弦之月贡献)
4. ArrayManager增加对于指标计算函数重载(Function Overload)的类型提示声明
5. vnpy_ctp增加特殊情况撤单(非交易时段、资金不足等)的日志输出
6. DataProxy的所有比较运算,直接返回pl.Int32(而不是Bool
7. 重构ts_slope / ts_rsquare / ts_resi算子函数
## 修复
1. vnpy_ib修复查询历史数据问题(query_history函数增加查询锁解决多线程冲突问题)
2. vnpy_optionmaster修复深度虚值期权的隐含波动率计算收敛问题
# 4.2.0版本
## 新增
1. vnpy_riskmanager模块重构
a. 采用插件式设计,提供标准化风控规则开发模板
b. 支持中国期货程序化交易系统监管要求中的风控规则
c. 输出拦截日志后播放提示声音,目前仅支持Windows系统
d. 使用系统托盘栏图标,弹出交易风控拦截日志气泡框
e. 提供Cython版本的风控规则开发模板以及具体规则实现
f. 支持自动扫描加载用户自定义风控规则(放置于Trader目录下的rules文件夹中)
2. vnpy_polygon数据服务接口,支持海外股票、期货、期权等资产品种的历史数据获取
## 调整
1. vnpy_ctp更新底层API到6.7.11(生产和测试统一版本)
2. vnpy_dolphindb升级适配4.0版本
3. vnpy_tqsdk简化时间戳的格式化方法,提高效率
4. vnpy_sqlite支持使用配置文件中声明的数据文件
5. vnpy_taos优化get_bar_overview和get_tick_overview函数性能(直接访问超级表的tags)
6. vnpy_spreadtrading / vnpy_portfoliostrategy / vnpy_scripttrader 注册模块日志输出到日志引擎
7. vnpy_optionmaster优化定价模型中期权最小价值边界判断的逻辑
8. 全局配置中的log.level改为INFO(10),默认启用详细日志记录输出
9. MainEngine增加交易功能函数的调用日志输出
10. vnpy.alpha中的Dataset增加process_data函数,便于测试不同数据处理器的效果
11. vnpy_ib更新支持ibapi至10.40.1版本
## 修复
1. vnpy_gm修复中金所和大商所合约代码转换的问题
2. vnpy_rqdata修复RqdataGateway中的行情订阅函数错误问题
3. vnpy_optionmaster修复关闭窗口时的异常报错
4. vnpy_portfoliostrategy修复遗传算法参数优化中的调用传参问题
5. 修复Linux系统上的sdist安装问题:vnpy_mini / vnpy_sopt / vnpy_rohon / vnpy_tap / vnpy_tts
6. vnpy_xt修复XtGateway断线重连时的传参错误
7. vnpy_optionmaster修复black-76模型中theta计算公式的问题
8. vnpy_postgresql修复写入主键冲突时数据不会更新的问题
# 4.1.0版本
# 新增
1. vnpy_mcdata新增对于Tick数据查询的支持
2. OrderType枚举值增加ETF类型,支持ETF申购和赎回业务
3. 增加遗传算法优化函数run_ga_optimization的入参,允许用户控制优化过程中所使用的全部超参
4. CTA策略回测引擎,增加对于遗传算法优化函数新入参的支持
## 调整
1. 升级扩展模块适配4.0版本:
* 交易接口:
* 期货类:vnpy_uft/vnpy_mini/vnpy_femas/vnpy_ctptest
* 股票类:vnpy_xtp/vnpy_tora
* 期权类:vnpy_hts/vnpy_sopt/vnpy_sopttest
* 资管类:vnpy_rohon/vnpy_lstar/vnpy_jees
* 其他类:vnpy_ksgold/vnpy_tts/vnpy_tap/vnpy_da/vnpy_ib
* 策略应用:
* 策略类:vnpy_portfoliostrategy/vnpy_ctabacktester/vnpy_spreadtrading/vnpy_scripttrader
* 交易类:vnpy_algotrading/vnpy_optionmaster/vnpy_portfoliomanager/vnpy_paperaccount
* 数据类:vnpy_datarecorder/vnpy_excelrtd/vnpy_datamanager
* 辅助类:vnpy_chartwizard/vnpy_webtrader/vnpy_rpcservice/vnpy_riskmanager
* 数据库:vnpy_mysql/vnpy_postgresql/vnpy_mongodb/vnpy_taos
* 数据服务:vnpy_gm/vnpy_xt/vnpy_tqsdk/vnpy_ifind/vnpy_tushare/vnpy_wind
2. 使用close函数替代unbind,来实现vnpy.rpc模块中zmq.Socket的安全关闭
3. 修改PySide6依赖版本为6.8.2.1,解决部分底层warning输出问题
4. 修改ta-lib依赖版本为0.6.4,解决Linux和Mac系统的安装问题
5. 调整Qt层捕捉到全局异常时的日志输出级别为Critical
6. vnpy_datarecorder移除不必要的行情录制异常抛出,改为记录日志
7. vnpy_rqdata下载股票数据时,除权方式有pre改为pre_volume
8. 数据库模块录制行情数据时,默认跳过extra字段
9. vnpy_ib支持10.30.1版本的ibapi,增加对于新版本撤单函数的传参支持
## 修复
1. 修复新版本ta-lib中,MA_Type类不再是枚举值导致的部分指标计算问题
2. 修复补全MainEngine缺失的get_tick函数
3. 修复邮件发送引擎在使用QQ邮箱时出现的发送后报错问题
4. 修复日志模块由于缺失默认gateway_name参数,在Qt层捕捉到全局异常时输出错误的问题
5. vnpy_rohon新增Linux安装脚本,解决动态库找不到的问题
6. vnpy_rqdata修复品种代码为小写合约的次主力88A2历史数据查询问题
# 4.0.0版本
## 新增
1. 新增面向机器学习多因子策略的vnpy.alpha模块
2. MultiCharts数据服务模块vnpy_mcdata
## 调整
1. 核心支持版本升级到Python 3.13
2. 使用pyproject.toml统一项目配置
3. 日志功能使用loguru替代logging
4. 使用mypy优化静态类型声明
5. 使用ruff优化代码细节质量
6. 使用uv作为开发环境管理工具
7. 升级扩展模块适配4.0版本:vnpy_ctp/vnpy_ctastrategy/vnpy_sqlite/vnpy_rqdata
## 修复
1. 修复PySide6中单元格排序可能出现的乱序问题
# 3.9.4版本
## 新增
1. vnpy_tora增加登录时终端动态密钥支持
2. vnpy_taos升级支持TDengine的3.0版本
## 调整
1. vnpy_xt行情接口增加实时行情中的涨跌停价字段
2. vnpy_taos移除不必要的时区转换提高性能
3. vnpy_dolphindb优化写入大量数据时候的内存占用
4. vnpy_portfoliostrategy简化回测引擎的calculate_pnl每日盈亏计算函数
5. vnpy_tap/vnpy_tts升级pybind11封装工具库的版本,支持Python 3.12编译
6. EmailEngine发送邮件失败后,捕捉异常并输出日志
## 修复
1. vnpy_optionmaster移除不必要的价格缓存代码
2. vnpy_dolphindb修复保存overview的时区不正确问题
# 3.9.3版本
## 新增
1. 利星资管交易接口vnpy_lstar
2. 咏春大师数据服务vnpy_voltrader
3. vnpy_rpcservice增加数据服务代理工具RpcDatafeed
## 调整
1. 适配6.3.0版本以上的PySide6模块:vnpy/vnpy_ctastrategy/vnpy_ctabacktester/vnpy_portfoliostrategy/vnpy_spreadtrading/vnpy_datamanager/vnpy_algotrading/vnpy_portfoliomananger/vnpy_optionmaster
2. vnpy_uft升级3.7.4.1004版本API
3. vnpy_ib的execDetails成交回报使用本地缓存的委托记录填充交易所,解决SMART交易所字段可能发生变化的问题
4. vnpy_ib的openOrder委托回报优先使用本地缓存的委托记录,解决交易所字段可能发生变化的问题
5. vnpy_ib的查询历史数据时,使用UTC时间戳传参
6. vnpy_ib的查询历史数据时,异步返回最长等待时间延长为600秒
7. vnpy_ib的增加期权链合约数据更新结束回报
8. vnpy_ib的合约乘数支持浮点数
9. 合约信息ContractData数据类,增加单笔最大委托数量max_volume
## 修复
1. 修复vnpy_spreadtrading回测引擎clear_data时,没有清空价差仓位的问题
2. 修复vnpy_ib查询历史数据失败时的日志输出错误
# 3.9.2版本
## 新增
1. vnpy_xt增加实时行情接口XtGateway
2. vnpy_xt增加基于文件锁实现的xtdc单例运行
3. vnpy_ib增加行情退订功能
4. vnpy_ib的合约乘数支持浮点数
5. vnpy_ib增加期权链合约数据更新结束回报
6. vnpy_ctabacktester、vnpy_ctastrategy、vnpy_portfoliostrategy增加i18n国际化支持
## 调整
1. vnpy_algotrading增加委托/成交推送时,对于算法状态的过滤
2. vnpy_tushare模块的to_ts_asset函数增加ETF基金支持
3. vnpy_xt更新适配xtquant的240613.1.1版本
4. vnpy_xt开启使用期货真实夜盘时间,增加期货历史数据集合竞价K线合成支持
5. vnpy_tts更新API版本到6.7.2
6. vnpy_rohon更新API版本:行情1.4.1.3,交易30.4.1.24
7. vnpy_tap完善API日志输出功能
8. vnpy_rest发送REST请求时,增加对于json参数的支持
9. vnpy_excelrtd优化PyXLL启动时加载模块的方式
10. vnpy_spreadtrading使用线程池实现策略初始化的异步执行
11. vnpy_ib移除期权合约的自动查询功能
12. vnpy_ib缓存查询返回的IB合约数据,简化行情切片查询函数
13. vnpy_ib查询历史数据时,使用UTC时间戳传参,并将最长等待时间延长为600秒
14. vnpy_ctastrategy的绩效统计值增加基于指数移动平均计算的EWM Sharpe比率
15. vnpy_ctastrategy回测引擎的show_chart函数直接返回图表对象
## 修复
1. 修复vnpy_rhon行情登录失败时的判断逻辑问题
2. 修复vnpy_datarecorder记录价差数据时缺失的localtime字段
3. 修复vnpy_spreadtraidng从datafeed加载数据时,时间戳传参缺失时区信息的问题
4. 修复vnpy_paperaccount委托数量为0撮合之后导致的ZeroDivisionError问题
5. 修复vnpy_portoliostrategy停止策略时,没有自动撤销策略委托的功能
# 3.9.1版本
## 新增
1. 增加i18n国际化支持,以及对应的英文翻译
2. 增加CFD和SWAP品种类型枚举值
3. vnpy_ib增加COMEX、Eurex交易所支持
4. vnpy_ib增加CFD品种支持
## 调整
1. vnpy_rqdata完善对于周五夜盘数据查询的支持
2. vnpy_ib订阅行情和委托下单时,检查代码字符串是否包含空格
3. vnpy_ib解析合约对象时,增加对于ConId是否包含非数字字符的检查
4. vnpy_ib查询历史K线数据,支持更长时间段跨度(不再限制半年)
5. vnpy_da更新API版本到1.18.2.0
6. vnpy_da移除历史数据查询功能
7. vnpy_tora调整期权接口的委托号生成规则,支持上限10万数量委托
8. vnpy_xtp调整账户冻结资金的计算逻辑
9. vnpy_optionmaster增加对IB的股票期权品种支持
10. vnpy_optionmaster定价模型改为计算理论希腊值
11. vnpy_optionmaster调整对象希腊值为理论模式
12. vnpy_optionmaster调整中值隐波动的计算方法
13. vnpy_spreadtrading使用线程池实现策略初始化的异步执行
14. vnpy_postgresql支持自动重用已经打开的数据库连接
15. vnpy_ctptest更新API版本至6.7.2
16. 接口封装升级更新pybind11到2.11.1版本:vnpy_ctptest、vnpy_sopttest
17. vnpy_ctp更新API版本到6.7.2
18. 调整extract_vt_symbol函数,兼容代码中带有"."的情况,如HHI.HK-HKD-FUT.HKFE
19. 更新vnpy框架的核心依赖模块到2024年较新的版本
## 修复
1. 修复vnpy_portfoliostrategy调用stop_strategy没有撤销活动委托的问题
2. 修复vnpy_xtp的API封装中queryTickersPriceInfo底层调用错误
3. 修复RpcClient中_last_received_ping变量的类型问题
# 3.9.0版本
## 新增
1. 迅投研数据服务vnpy_xt,支持股票、期货、期权、债券、基金历史数据获取
2. vnpy_ib增加对CBOE和CBOT交易所的支持、对指数期权的支持
3. vnpy_rqdata增加对于88A2连续次主力合约的支持
4. vnpy_wind增加广期所和上期能源交易所的数据支持
## 调整
1. vnpy_sopt升级3.7.0版本API
2. vnpy_portfoliostrategy回测引擎支持交易日参数annual_days
3. K线合成器(BarGenerator)移除对于Tick时间戳的检查过滤逻辑,交由用户层负责控制过滤
4. vnpy_ib收到期权合约数据后,自动查询其切片行情数据
5. vnpy_paperaccount实现对于IB接口合约的特殊路由处理
6. 接口封装升级更新pybind11到2.11.1版本:vnpy_ctp、vnpy_sopt、vnpy_tora
7. vnpy_ctp过滤不支持的委托状态推送
8. vnpy_mysql兼容无数据库写入权限情况下的数据表初始化
9. vnpy_chartwizard支持关闭单个图表标签页
10. vnpy_portfoliostrategy移除策略后同时清除对应的策略状态缓存数据
11. vnpy_portfoliostrategy调整每日盈亏清算对象开盘持仓数据的初始化方式
12. 策略模块遗传优化函数增加ngen_size和max_workers参数
## 修复
1. 修复vnpy_tora接口中的委托部分撤单状态映射缺失
2. 修复vnpy_wind查询日线历史数据时数值存在NaN的问题
3. 修复vnpy_mongodb的Tick汇总数据的条数统计错误
4. 修复vnpy_chartwizard对于升级后的vnpy_spreadtrading价差行情显示问题
5. 修复vnpy_ctastrategy回测成交记录为空时的报错
6. 修复vnpy_ctastrategy策略初始化时,历史数据重复推送调用on_bar的问题
# 3.8.0版本
## 新增
1. K线合成器(BarGenerator)增加对日K线的合成支持
2. 基于华鑫奇点柜台的C++ API重构vnpy_tora,实现VeighNa Station加载支持
3. 新增vnpy_ib对于期权合约查询、波动率和希腊值等扩展行情数据的支持
## 调整
1. vnpy_rest/vnpy_websocket限制在Windows上改为必须使用Selector事件循环
2. vnpy_rest/vnpy_websocket客户端关闭时确保所有会话结束,并等待有异步任务完成后安全退出
3. vnpy_ctp升级6.6.9版本API
4. vnpy_ctp支持大商所的1毫秒级别行情时间戳
5. vnpy_tqsdk过滤不支持的K线频率查询并输出日志
6. vnpy_datamanager增加数据频率下按交易所显示支持,优化数据加载显示速度
7. vnpy_ctabacktester如果加载的历史数据为空,则不执行后续回测
8. vnpy_spreadtrading采用轻量级数据结构,优化图形界面更新机制
9. vnpy_spreadtrading价差子引擎之间的事件推送,不再经过事件引擎,降低延迟水平
10. vnpy_rpcservice增加对下单返回委托号的gateway_name替换处理
11. vnpy_portfoliostrategy策略模板增加引擎类型查询函数get_engine_type
12. vnpy_sec更新行情API至1.6.45.0版本,更新交易API版本至1.6.88.18版本
13. vnpy_ib更新10.19.1版本的API,恢复对于数字格式代码(ConId)的支持
14. 没有配置数据服务或者加载模块失败的情况下,使用BaseDatafeed作为数据服务
15. 遗传优化算法运行时,子进程指定使用spawn方式启动,避免数据库连接对象异常
16. 合约管理控件,增加对于期权合约的特有数据字段显示
## 修复
1. 修复vnpy_datarecorder对于新版本vnpy_spreadtrading价差数据的录制支持
2. 修复vnpy_algotrading条件委托算法StopAlgo全部成交后状态更新可能缺失的问题
3. 修复vnpy_ctastrategy策略初始化时,历史数据重复推送调用on_bar的问题
4. 修复vnpy_wind查询日线历史数据时,数值存在NaN的问题
# 3.7.0版本
## 新增
1. 新增沪股通和深股通交易所枚举值
2. 增加vnpy_tap对于Linux系统的支持
3. 增加vnpy_rqdata对于新型主力合约数据支持(切换前一日收盘价比例复权)
## 调整
1. vnpy_ctastrategy/vnpy_ctabacktester加载策略类时,过滤TargetPosTemplate模板
2. vnpy_ctp连接登录过程中,只有在授权码错误的情况下,才禁止再次发起认证
3. vnpy_uft增加对广期所GFEX的支持
4. vnpy_tqsdk增加对于output日志输出功能的支持
5. vnpy_dolphindb允许指定用户自行配置具体的数据库实例
6. vnpy_rqdata优化对于郑商所期货和期权合约的查询代码转换规则
7. vnpy_rqdata增加对广期所GFEX的支持
8. vnpy_portfoliostrategy增加回测爆仓检查
9. vnpy_portfoliostrategy策略模板增加合约乘数查询函数get_size
10. vnpy_portfoliostrategy回测加载日线和小时线数据时,不使用分段加载
## 修复
1. 修复vnpy_rpcservice中,RPC接口对于推送数据的vt前缀相关字段错误问题
2. 修复vnpy_mini中,对于INE交易所今昨仓位的特殊处理
3. 修复vnpy_datamanager中,批量数据更新时缺失output函数的问题
4. 修复vnpy_spreadtrading中,回测加载数据时优先从数据服务获取历史数据的问题,改为优先从本地数据库加载
# 3.6.0版本
## 新增
1. 新增vnpy_ctp的Mac系统支持(M1/M2
## 调整
1. BaseDatafeed的相关功能函数增加output入参用于输出日志
2. 修改相关数据服务模块适配output参数:vnpy_rqdata/vnpy_ifind/vnpy_wind/vnpy_tushare
3. 修改相关策略应用模块适配output参数:vnpy_ctastrategy/vnpy_ctabacktester/vnpy_portfoliostrategy/vnpy_spreadtrading/vnpy_datamanager
3. OffsetConverter增加对于SHFE/INE合约的锁仓模式支持
4. 在OmsEngine中添加全局的OffsetConverter功能,不再需要各AppEngine自行维护
5. 添加CTA策略模块在执行参数优化时的最大进程数量限制参数:vnpy_ctastrategy/vnpy_ctabacktester
6. 增加穷举优化算法运行过程中基于tqdm的进度条输出
7. 增加遗传优化算法运行过程中的迭代次数进度输出
8. 增加vnpy_optionmaster模块的期权产品对应标的合约的匹配函数,不再限制产品范围
9. 升级vnpy_tts的dll链接库,解决openctp升级导致的资金不显示的问题
10. 修改vnpy_ctastrategy使用vnpy.trader.database中统一定义的时区来加载数据
11. 增加vnpy_ctastrategy策略模板的合约乘数查询函数get_size
12. 增加vnpy_spreadtrading回测中统计绩效时对于爆仓情况的检查
13. 增加vnpy_scripttrader基于vt_symbol和direction查询持仓数据的函数
14. 修改vt_positionid的字符串内容,增加gateway_name前缀标识
## 修复
1. 修复异常捕捉钩子threading_excepthook的参数错误问题
2. 修复vnpy_ib获取历史数据时的异常失败问题
3. 修复vnpy_rest/vnpy_websocket中aiohttp的代理参数proxy传空时必须为None的问题
4. 修复vnpy_optionmaster模块的Greeks监控表行数设置不足的问题
5. 修复vnpy_rqdata查询股票期权数据报错的问题
6. 修复vnpy_rqdata中RqdataGateway获取期货指数和连续合约信息时错误的问题
7. 修复vnpy_portfoliostrategy中,从缓存文件恢复数据,导致defaultdict变成dict的问题
# 3.5.0版本
## 新增
1. 新增基于米筐RQData的跨市场行情数据接口RqdataGateway
2. 新增东方财富证券EMT柜台交易接口vnpy_emt
## 调整
1. 调整vnpy_algotrading模块设计(模板、引擎),只支持单合约算法执行交易
2. 优化vnpy_algotrading的算法状态控制,增加状态枚举值,算法支持暂停和恢复运行
3. 升级vnpy_hft接口支持HFT国君统一交易网关的2.0版本API
4. 优化vnpy_portfoliostrategy的策略模板,支持持仓目标调仓交易模式
## 修复
1. 修复后台线程异常捕捉钩子函数,对于Python 3.7的语法兼容性问题
2. 修复vnpy_mysql加载历史数据时存在时段重复的问题
3. 修复vnpy_ib由于TWS客户端升级导致的委托失败问题
4. 修复vnpy_rest/vnpy_websocket对Python 3.10后asyncio的支持
5. 修复vnpy_sopt由于流控导致的委托失败时,返回【提交中】状态委托的问题
# 3.4.0版本
## 新增
1. 新增杰宜斯资管系统交易接口vnpy_jees
## 调整
1. 开启vnpy.rpc的pyzmq连接keepalive机制,避免在复杂网络环境下闲置连接的断开
2. 移除vnpy_rpcservice中服务端的EVENT_TIMER定时事件推送
3. 调整vnpy_postgresql采用批量方式写入数据,提高效率
4. 添加VeighNa Trader中的子线程异常捕捉(需要Python>=3.8
5. 调整vnpy_ib接口查询历史K线数据时,对外汇和贵金属均采用中间价(而非成交价)
6. 增加vnpy_ctastrategy对于回测过程中资金爆仓(小于等于0)情况的检查
7. 优化vnpy_webtrader模块的加密鉴权,支持web进程关闭重启
## 修复
1. 修复vnpy.rpc模块对于23.0以上版本pyzmq的NOBLOCK兼容性问题
2. 修复vnpy_taos由于TDengine版本升级,出现d的一系列兼容问题
3. 修复vnpy_datamanager刷新数据汇总信息显示时,老数据点移除失败的问题
# 3.3.0版本
## 新增
1. 新增数据库组件vnpy.trader.database中的TickOverview对象
2. 新增掘金仿真环境交易接口vnpy_gm
3. BaseData基础数据类型增加extra字段(字典类型),用于传送任意相关数据
## 调整
1. 使用Python内置的zoneinfo库替换三方的pytz库
2. 调整相关交易接口、数据服务接口、数据库适配器、应用模块,使用新的ZoneInfo对象来标识时区信息
3. 数据库适配器接口vnpy.trader.database写入数据时,新增流式写入参数stream,提高行情录制性能
# 3.2.0版本
## 新增
1. 添加广州期货交易所枚举值字段GFEX
2. 新增CTP期权(ETF)穿透式测试接口vnpy_sopttest
3. 新增Currency.CAD(加元)枚举值
4. 新增Exchange.TSE(多伦多交易所)和Exchange.AMEX(美洲交易所)枚举值
5. 新增vnpy_taos,涛思数据TDengine时序数据库适配器
5. 新增vnpy_timescaledbTimescaleDB时序数据库适配器
## 调整
1. 更新vnpy_ctp/vnpy_ctptest支持广州期货交易所
2. 更新vnpy_tora的现货API接口到最新版本:API_Python3.7_交易_v4.0.3_20220222
3. 更新vnpy_tora的期权API接口到最新版本:API_Python3.7_v1.3.2_20211201
4. 更新vnpy_esunny/vnpy_tap添加关闭接口时对于API退出函数的调用
5. 移除vnpy_ctastrategy/vnpy_ctabacktester/vnpy_optionmaster的反向合约支持
6. 增加vnpy_ib对于沪股通、深股通、多伦多交易所、美洲交易所的支持
7. 增加vnpy_ib对于指数行情数据的支持
8. 添加vnpy_ctastrategy策略交易管理界面的策略实例查找功能
## 修复
1. 修复vnpy_mongodb中K线数据量统计的问题(使用新的count_documents函数)
2. 修复由于PySide6对象销毁先于__del__调用,导致的BaseMonitor衍生组件无法自动保存界面状态的问题
# 3.1.0版本
## 新增
1. 新增恒生云UF2.0证券仿真环境交易接口vnpy_uf
2. 新增火象投教仿真环境交易接口vnpy_hx
## 调整
1. 升级tzlocal库的版本到4.2,消除get_localzone()函数的warning
2. 完善代码中函数和变量类型提示
3. 使用QtCore.Signal代替老的QtCore.pyqtSignal
4. 优化vnpy_rohon接口的委托成交相关细节功能
5. 更新vnpy_xtp到2.2.32.2.0版本XTP API,支持上交所新债系统
6. 优化vnpy_mongodb的数据写入速度,基于pymongo 4.0版本的批量写入功能
7. 增加vnpy_ctp对于委托函数返回值为非0(请求发送失败)状态的处理
8. 对vnpy_ctastrategy和vnpy_ctabacktester的策略模板下拉框中内容,改为基于首字母排序
## 修复
1. 修复vnpy_optionmaster模块希腊值监控组件的数据刷新问题
2. 修复vnpy_mongodb由于时间戳的时区信息确实,导致的数据加载范围问题
3. 修复vnpy_tts的sdist源代码打包缺失lib文件的问题
4. 修复vnpy_rqdata由于查询返回数据为NaN导致的解析问题
# 3.0.0版本
## 调整
1. 移除api、gateway、app子模块的目录
2. 移除requirements.txt对于插件的默认依赖
3. 简化重构rpc子模块,定位于可靠环境下跨进程通讯(本机、局域网)
4. 移除rpc子模块对于鉴权的支持
5. 调整rpc子模块中的心跳机制的实现方式
6. 移除基于QScintilla开发的代码编辑器,改用VSCode打开代码
7. 优化MainWindow主窗口中,对于QAction按钮图标的加载逻辑
8. MainEngine添加交易接口时,支持自定义接口名称
## 修复
1. 使用非原生窗口菜单栏,修复Linux/Mac下【配置】按钮不显示的问题
# 2.9.0版本
## 新增
1. 新增顶点HTS柜台交易接口vnpy_hts
## 调整
1. 移除恒生期权hsoption接口
2. vnpy_webtrader增加对于自定义监听地址和端口的支持
3. vnpy_mongodb锁定pymongo的依赖版本为3.12.3
4. vnpy_udata安装脚本中添加hs_udata库的依赖
5. vnpy_uft升级使用3.7.2.4版本的恒生API接口
## 剥离
2. 将国泰君安证券统一接入网关交易接口剥离到vnpy_hft项目中
3. 将顶点飞创交易接口剥离到vnpy_sec项目中
4. 将RPC服务和接口剥离到vnpy_rpcservice项目中
## 修复
1. 修复vnpy_tora撤单时,由于撤单编号和委托编号冲突导致的撤单失败问题
2. 修复vnpy_tora股票委托状态中【未成交】状态的错误映射问题
3. 修复vnpy_ctabacktester中,回测开始日期编辑框的数据缓存问题
4. 修复vnpy_udata中,分段下载数据时,可能进入死循环的问题
5. 修复vnpy_udata中,修复下载的数据量为空时,出现的异常报错问题
6. 修复vnpy_dolphindb中,合约名带有符号时数据无法读取问题
# 2.8.0版本
## 新增
1. 新增东证OST柜台交易接口vnpy_ost
2. 增加投资组合策略模块的策略参数优化功能
## 修复
1. 修复部分C++接口模块剥离后,遗留的安装脚本编译代码导致的报错问题
2. 修复vnpy_xtp订阅深交所行情后,可能出现的闪退问题
3. 修复vnpy_tushare部分数据字段为None时,导致的数据错误
4. 修复vnpy_mini,在夜盘换日时上期所行情时间戳的日期字段误差问题
5. 修复vnpy_uft的ETF期权合约信息解析缺失的问题
6. 修复vnpy_wind下载数据存在缺失时的N/A解析问题
7. 修复vnpy_webtrader的html静态文件缺失的问题
8. 修复vnpy_dolphindb存储Tick数据时的数据类型问题
9. 修复vnpy_dolphindb读取数据为空时的BUG
10. 修复vnpy_esunny查询黄金TD合约的合约乘数为0的问题
11. 修复vnpy_ctastrategy策略初始化读取布尔值false失败的问题
12. 修复vnpy_rohon的期权合约字段赋值错误的问题
13. 修复vnpy_leveldb的Linux安装依赖库问题
## 调整
1. 移除老版本基于requests库的RestClient客户端
2. 移除老版本基于websocket-client库的WebsocketClient客户端
3. vnpy_tts增加对上交所和深交所股票模拟交易的支持
4. 移除vnpy_ctp的期权询价指令支持
5. 增加vnpy_ctp的授权码验证失败后,避免重复操作的功能
6. 优化vnpy_uft的断线重连行情订阅逻辑
7. 增加vnpy_arctic对于用户名和密码的鉴权功能
8. 增加vnpy_mini对于股指期权的支持
## 剥离
1. 将华鑫奇点交易接口剥离到vnpy_tora项目中,并升级到4.0版本
2. 将飞马交易接口剥离到vnpy_femas项目中
3. 将金仕达黄金接口剥离到vnpy_ksgold项目中
4. 将投资组合策略模块剥离到vnpy_portfoliostrategy项目中
5. 将Excel RTD模块剥离到vnpy_excelrtd项目中
6. 将本地仿真模拟交易模块剥离到vnpy_paperaccount项目中
# 2.7.0版本
## 新增
1. 新增天软数据服务项目vnpy_tinysoft
2. 新增同花顺iFinD数据服务项目vnpy_ifind
3. 新增dYdx交易接口vnpy_dydx
4. 新增万得Wind数据服务项目vnpy_wind
5. 新增PortfolioStrategy专用的PortfolioBarGenerator
## 调整
1. 移除KasiaGateway
4. 移除MarketRadarApp
5. 算法交易模块中移除套利和网格两个非执行类算法
6. vnpy_tushare数据服务,增加持仓量和成交额字段
8. vnpy_datamanager数据管理器,查询的K线信息按合约代码排序显示
13. vnpy_dolphindb优化数据的加载解析速度
14. vnpy_influxdb采用pandas解析CSV数据,提高整体速度
## 修复
1. 修复vnpy_ctp的CtpGateway,在夜盘换日时上期所行情时间戳的日期字段误差问题
2. 修复vnpy_arctic的数据重复写入时出现的错误覆盖问题
## 剥离
1. 将InteractiveBrokers交易接口剥离到vnpy_ib项目中
2. 将飞鼠交易接口剥离到vnpy_sgit项目中
3. 将易盛外盘交易接口剥离到vnpy_tap项目中
4. 将直达期货交易接口剥离到vnpy_da项目中
5. 将算法交易模块剥离到vnpy_algotrading项目中
6. 将脚本交易模块剥离到vnpy_scripttrader项目中
7. 将交易组合管理模块剥离到vnpy_portfoliomanager项目中
# 2.6.0版本
## 新增
1. 增加双边报价业务的发送和撤销函数功能
2. 增加双边报价监控UI组件
3. 增加用于对接数据库的抽象接口vnpy.trader.database
4. 新增基于Arctic的MongoDB数据库接口项目vnpy_arctic
5. 新增LevelDB数据库接口项目vnpy_leveldb
6. 新增DolphinDB数据库接口项目vnpy_dolphindb
7. 增加用于对接数据服务的抽象接口vnpy.trader.datafeed
8. 新增TuShare数据服务项目vnpy_tushare
8. 新增恒生UData数据服务项目vnpy_udata
8. 新增天勤TQSDK数据服务项目vnpy_tqsdk
8. 新增CoinAPI数据服务项目vnpy_coinapi
## 调整
1. 移除批量委托和批量撤单相关的函数功能
2. 移除老虎证券交易接口TigerGateway
3. 移除鑫管家交易接口XgjGateway
4. 移除AlgoTrading算法交易模块对于金纳算法服务的支持
5. RestClient增加对操作系统代理配置的支持
6. RestClient和WebsocketClient的默认异常处理逻辑由抛出异常修改为打印输出
7. 价差交易模块移除对反向合约、线性价差、开平字段的支持
8. 价差交易模块优化对灵活价差的支持,优化价差行情推送过滤判断
9. 价差交易算法停止时,等待全部委托结束、各条腿平衡后,再结束算法
## 修复
1. 修复在Linux/Mac系统上,运行多进程优化时的进程启动错误
2. 修复WebsocketClient由于心跳机制不完善,导致的频繁断线问题
## 剥离
1. 将米筐数据接口剥离到vnpy_rqdata项目中,并升级到2.9.38版本
2. 将行情录制模块剥离到vnpy_datarecorder项目中
3. 将K线图表模块剥离到vnpy_chartwizard项目中
4. 将SQLite数据库接口剥离到vnpy_sqlite项目中
5. 将MySQL数据库接口剥离到vnpy_mysql项目中
6. 将PostgreSQL数据库接口剥离到vnpy_postgresql项目中
7. 将MongoDB数据库接口剥离到vnpy_mongodb项目中
8. 将InfluxDB数据库接口剥离到vnpy_influxdb项目中
13. 将期权波动率交易模块剥离到vnpy_optionmaster项目中
# 2.5.0版本
## 新增
1. 新增TTS交易系统(兼容CTP的仿真交易环境)的接口vnpy_tts6.5.1
2. 新增易盛启明星/北斗星兼容交易API的接口vnpy_esunny1.0.2.2
3. 新增BarData和TickData的成交额turnover字段
## 调整
1. 将SpreadTrading模块策略初始化时的K线价差数据加载,改为优先通过RQData查询数据
2. 在MainWindow的AboutDialog中,基于importlib_metadata模块来获取版本信息
3. 隐藏所有对话框右上角的【?】按钮
4. 将易盛外盘TapGateway的合约信息,从行情接口获取改为交易接口获取(避免外盘合约size为0的问题)
5. 改进VeighNa Trader的异常捕捉对话框弹出方式,避免多次重复报错情况下的程序卡死崩溃
## 修复
1. 修复Linux下安装时,对于已经剥离的XTP API的自动编译操作
2. 修复PortfolioManager的UI组件,对于成交事件监听类型错误的BUG
3. 修复vnpy_rest下的Response对象缺乏text字段导致的BUG
4. 修复RestClient,代理端口信息传空时,导致底层连接出错的BUG
6. 修复ArrayManager的Aroon指标计算输出结果顺序错误的BUG
7. 修复数据库管理器读写TickData时,由于缺少对localtime字段处理导致的BUG
## 剥离
1. 将融航接口剥离到vnpy_rohon项目中,并升级到6.5.1版本
2. 将CTP MINI接口剥离到vnpy_mini项目中,并升级到1.5.6版本
3. 将CTP期权接口剥离到vnpy_sopt项目中
4. 将恒生UFT柜台极速API接口剥离到vnpy_uft项目中
# 2.4.0版本
## 新增
1. 新增TickData的本地时间戳字段local_time(不带时区信息)
2. 新增基于asyncio和aiohttp实现的协程异步REST API客户端vnpy_rest项目
3. 新增基于asyncio和aiohttp实现的协程异步Websocket API客户端vnpy_websocket项目
4. 新增基于多进程模式的遗传算法优化功能
5. 新增XTP的API封装中,行情登录函数对于本地网卡地址的参数支持
## 调整
2. 剥离CTA策略模块下的穷举和遗传优化算法到vnpy.trader.optimize模块下
3. 遗传算法优化完成后,输出所有回测过的参数对应结果(而不只是最优结果)
4. CTA策略引擎加载策略文件时,增加模块重载的操作,使得任何策略文件修改可以立即生效
5. CTA策略引擎扫描特定目录下的策略文件时,使用glob函数(替换原有的os.walk),避免对子目录中文件的错误加载
6. 将CTA策略模块剥离到vnpy_ctastrategy项目中
7. 将CTA回测模块剥离到vnpy_ctabacktester项目中
8. 将XTP接口剥离到vnpy_xtp项目中,并升级到2.2.27.4版本
9. 将事前风控模块剥离到vnpy_riskmanager项目中
10. 将数据管理模块剥离到vnpy_datamanager项目中
## 修复
2. 修复MySQL和PostgreSQL数据库管理器删除K线数据时出错的问题
3. 修复基于aiohttp的RestClient和WebsocketClient,事件循环停止后重新启动失败的问题
7. 修复CtaBacktester基于Tick级别数据进行参数优化时,启动优化失败的问题
8. 修复ToraStockGateway和ToraOptionGateway,调用下单函数时没有返回委托号的问题
9. 修复InfluxDB数据管理器,导入数据时时间字段解析错误的问题
# 2.3.0版本
## 修复
1. 修复IbGateway断线重连后,没有自动订阅之前已订阅的合约行情问题
2. 修复CTA模块的净仓交易模式中,部分平仓部分开仓时,开仓部分下单错误的问题
6. 修复CtpGateway对于FAK和FOK委托指令的处理错误问题
10. 修复IbGateway,查询历史数据由于传参错误导致的查询失败问题
11. 修复IbGateway,当要查询的合约历史数据不存在时卡死的问题
12. 修复IbGateway,查询返回的合约乘数(字符串)未作转换导致的上层应用问题
14. 修复BarGenerator,在合成小时K线时部分情况下遗漏分钟K线收盘价更新的问题
15. 修复UftGateway,在连接ETF期权服务器时无法订阅行情的问题
16. 修复UftGateway,在连接ETF期权服务器时,对于包含毫秒的委托时间戳处理错误的问题
## 调整
1. 修改CTA模块的净仓交易模式,支持上期所和能交所的今昨仓拆分下单
2. 调整组合策略模块的回测引擎K线回放逻辑,当某个时间点K线数据缺失时,推送给策略的K线字典中不对其进行向前补齐
3. 将CTP接口和API封装,剥离到vnpy_ctp项目中
4. 将CTP穿透式测试接口和API封装,剥离到vnpy_ctptest项目中
## 新增
1. 新增DataManager在导入CSV文件时,对于时间戳时区的选择功能
2. 新增CtaStrategy模块的策略移仓助手功能,实现一键式期货换月移仓支持
# 2.2.0版本
## 修复
1. 修复DataManager查询数据库中K线数据范围时,开始和结束日期相反的问题
6. 修复PostgreSQL数据库对接层中,save_tick_data函数由于访问interval导致保存出错的问题
7. 修复DataRecorder模块中add_bar_recording下保存录制用合约配置错误的问题
8. 修复PostgreSQL数据库对接层中,由于事务执行失败导致的后续报错问题,创建数据库对象时设置自动回滚模式(autorollback=True
9. 修复DataManager自动更新数据时,查询数据范围由于调用老版本函数导致的错误
10. 修复RQData下载获取的历史数据浮点数精度问题
11. 修复BarGenerator在合成N小时K线时,收盘价、成交量、持仓量字段缺失的问题
12. 修复K线图表底层组件ChartWidget当绘制数据较少时,坐标轴时间点显示重复的问题
13. 修复SpreadTrading模块生成的价差盘口数据的时区信息缺失问题
14. 修复IbGateway的现货贵金属行情数据缺失最新价和时间戳的问题
15. 修复BarGenerator在合成小时级别K线时,成交量字段部分缺失的问题
16. 修复vnpy.rpc模块启用非对称加密后无法正常退出的问题
## 调整
1. 修改vnpy.chart下ChartItem为按需绘制,大幅缩短图表第一次显示出来的耗时
2. 修改IbGateway的历史数据查询功能,包括所有可用时间(即欧美晚上的电子交易时段)
3. 修改DataRecorder的数据入库为定时批量写入,提高录制大量合约数据时的写入性能
## 新增
1. 新增IbGateway连接断开后的自动重连功能(每10秒检查)
2. 新增双边报价业务相关的底层数据结构和功能函数
3. 新增开平转换器OffsetConverter的净仓交易模式
4. 新增CtaStrategy模块策略模板的委托时的净仓交易可选参数
5. 新增CtaStrategy模块回测引擎中的全年交易日可选参数
6. 新增ChartWizard模块对于价差行情图表的显示支持
7. 新增MarketRadar模块的雷达信号条件提醒功能
# 2.1.9.1版本
## 修复
1. 修复RestClient中,因为pyopenssl.extract_from_urllib3引起的兼容性问题
## 调整
1. 调整OptionMaster模块中,期权链数据结构搜索平值行权价的算法,不再依赖标的物合约
## 新增
1. 新增OptionMaster模块使用合成期货作为定价标的合约的功能
# 2.1.9版本
## 修复
1. 修复BarGenerator的小时线合成时,出现同一个小时的K线重复推送两次的问题
2. 修复遗传算法优化时,因为lru_cache缓存导致的新一轮优化结果不变的问题
3. 修复RestClient发起请求时,由于requests库底层使用OpenSSL导致的WinError 10054 WSAECONNRESET的问题
5. 修复程序中频繁捕捉到异常时,异常捕捉对话框反复执行导致卡死的问题
7. 修复活动委托监控组件ActiveOrderMonitor,保存CSV时会将所有委托数据一起保存的问题
8. 修复XtpGateway重复发起登录操作时,出现的系统崩溃问题
9. 修复XtpGateway的股票市价委托类型映射错误问题
## 调整
1. 对XTP接口的行情价格数据基于合约最小价格跳动进行取整,资金保留2位小数
2. BaseMonitor保存CSV文件时,表头改为图形界面显示的中文(之前是数据的字段名英文)
3. 初始化TWAP算法时,对每轮委托数量取整到合约最小交易数量
4. 将原vnpy.trader.database中的数据库客户端拆分到独立的vnpy.database模块下
5. 对SQLite/MySQL/PostgreSQL/MongoDB/InfluxDB客户端进行代码重构优化,增加K线数据整体情况BarOverview查询功能
## 新增
1. 新增BaseMonitor数据监控UI组件(以及其子类),自动保存列宽的功能
2. 增加华鑫奇点ToraGateway对于FENS服务器连接和资金账户登录的支持,之前只支持前置机连接和用户代码登录
4. 增加InfluxDB数据库客户端vnpy.database.influx对于Tick数据储存和加载的支持
+21
View File
@@ -0,0 +1,21 @@
The MIT License (MIT)
Copyright (c) 2015-present, Xiaoyou Chen
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
+342
View File
@@ -0,0 +1,342 @@
# VeighNa - By Traders, For Traders, AI-Powered.
<p align="center">
<img src ="https://vnpy.oss-cn-shanghai.aliyuncs.com/veighna-logo.png"/>
</p>
💬 Want to read this in **english** ? Go [**here**](README_ENG.md)
<p align="center">
<img src ="https://img.shields.io/badge/version-4.4.0-blueviolet.svg"/>
<img src ="https://img.shields.io/badge/platform-windows|linux|macos-yellow.svg"/>
<img src ="https://img.shields.io/badge/python-3.10|3.11|3.12|3.13-blue.svg" />
<img src ="https://img.shields.io/github/actions/workflow/status/vnpy/vnpy/pythonapp.yml?branch=master"/>
<img src ="https://img.shields.io/github/license/vnpy/vnpy.svg?color=orange"/>
</p>
VeighNa是一套基于Python的开源量化交易系统开发框架,在开源社区持续不断的贡献下一步步成长为多功能量化交易平台,自发布以来已经积累了众多来自金融机构或相关领域的用户,包括私募基金、证券公司、期货公司等。
在使用VeighNa进行二次开发(策略、模块等)的过程中有任何疑问,请查看[**VeighNa项目文档**](https://www.vnpy.com/docs/cn/index.html),如果无法解决请前往[**官方社区论坛**](https://www.vnpy.com/forum/)的【提问求助】板块寻求帮助,也欢迎在【经验分享】板块分享你的使用心得!
**想要获取更多关于VeighNa的资讯信息?** 请扫描下方二维码添加小助手加入【VeighNa社区交流微信群】:
<p align="center">
<img src ="https://vnpy.oss-cn-shanghai.aliyuncs.com/github_wx.png"/, width=250>
</p>
## AI-Powered
VeighNa发布十周年之际正式推出4.0版本,重磅新增面向AI量化策略的[vnpy.alpha](./vnpy/alpha)模块,为专业量化交易员提供**一站式多因子机器学习(ML)策略开发、投研和实盘交易解决方案**:
<p align="center">
<img src ="https://vnpy.oss-cn-shanghai.aliyuncs.com/alpha_demo.jpg"/, width=500>
</p>
* :bar_chart: **[dataset](./vnpy/alpha/dataset)**:因子特征工程
* 专为ML算法训练优化设计,支持高效批量特征计算与处理
* 内置丰富的因子特征表达式计算引擎,实现快速一键生成训练数据
* 支持自定义表达式函数注册,并提供缺失值填充、无穷值替换、时序标准化、特征删除等常用数据处理函数
* [Alpha 158](./vnpy/alpha/dataset/datasets/alpha_158.py):源于微软Qlib项目的股票市场特征集合,涵盖K线形态、价格趋势、时序波动等多维度量化因子
* :bulb: **[model](./vnpy/alpha/model)**:预测模型训练
* 提供标准化的ML模型开发模板,大幅简化模型构建与训练流程
* 统一API接口设计,支持无缝切换不同算法进行性能对比测试
* 集成多种主流机器学习算法:
* [Lasso](./vnpy/alpha/model/models/lasso_model.py):经典Lasso回归模型,通过L1正则化实现特征选择
* [LightGBM](./vnpy/alpha/model/models/lgb_model.py):高效梯度提升决策树,针对大规模数据集优化的训练引擎
* [MLP](./vnpy/alpha/model/models/mlp_model.py):多层感知机神经网络,适用于复杂非线性关系建模
* :robot: **[strategy](./vnpy/alpha/strategy)**:策略投研开发
* 基于ML信号预测模型快速构建量化交易策略
* 支持截面多标的和时序单标的两种策略类型
* :microscope: **[lab](./vnpy/alpha/lab.py)**:投研流程管理
* 集成数据管理、模型训练、信号生成和策略回测等完整工作流程
* 简洁API设计,内置可视化分析工具,直观评估策略表现和模型效果
* :book: **[notebook](./examples/alpha_research)**:量化投研Demo
* [download_data_rq](./examples/alpha_research/download_data_rq.ipynb):基于RQData下载A股指数成分股数据,包含指数成分变化跟踪及历史行情获取
* [download_data_xt](./examples/alpha_research/download_data_xt.ipynb):基于迅投研数据服务,下载获取A股指数成分历史变化和股票K线数据
* [research_workflow_lasso](./examples/alpha_research/research_workflow_lasso.ipynb):基于Lasso回归模型的量化投研工作流,展示线性模型特征选择与预测能力
* [research_workflow_lgb](./examples/alpha_research/research_workflow_lgb.ipynb):基于LightGBM梯度提升树的量化投研工作流,利用高效集成学习方法进行预测
* [research_workflow_mlp](./examples/alpha_research/research_workflow_mlp.ipynb):基于多层感知机神经网络的量化投研工作流,展示深度学习在量化交易中的应用
vnpy.alpha模块的设计理念受到[Qlib](https://github.com/microsoft/qlib)项目的启发,在保持易用性的同时提供强大的AI量化能力,特此向Qlib开发团队致以诚挚感谢!
## 功能特点
带有 :arrow_up: 的模块代表已经完成4.0版本的升级适配测试,同时4.0核心框架采用了优先保证兼容性的升级方式,因此大多数模块也都可以直接使用(涉及到C++ API封装的接口必须升级后才能使用)。
1. :arrow_up: 多功能量化交易平台(trader),整合了多种交易接口,并针对具体策略算法和功能开发提供了简洁易用的API,用于快速构建交易员所需的量化交易应用。
2. 覆盖国内外所拥有的下述交易品种的交易接口(gateway):
* 国内市场
* :arrow_up: CTP[ctp](https://www.github.com/vnpy/vnpy_ctp)):国内期货、期权
* :arrow_up: CTP Mini[mini](https://www.github.com/vnpy/vnpy_mini)):国内期货、期权
* :arrow_up: CTP证券([sopt](https://www.github.com/vnpy/vnpy_sopt)):ETF期权
* :arrow_up: 飞马([femas](https://www.github.com/vnpy/vnpy_femas)):国内期货
* :arrow_up: 易盛([esunny](https://www.github.com/vnpy/vnpy_esunny)):国内期货、黄金TD
* :arrow_up: 顶点HTS[hts](https://www.github.com/vnpy/vnpy_hts)):ETF期权
* :arrow_up: 顶点飞创([sec](https://www.github.com/vnpy/vnpy_sec)):ETF期权
* :arrow_up: 中泰XTP[xtp](https://www.github.com/vnpy/vnpy_xtp)):国内证券(A股)、ETF期权
* :arrow_up: 华鑫奇点([tora](https://www.github.com/vnpy/vnpy_tora)):国内证券(A股)、ETF期权
* 东证OST[ost](https://www.github.com/vnpy/vnpy_ost)):国内证券(A股)
* 东方财富EMT[emt](https://www.github.com/vnpy/vnpy_emt)):国内证券(A股)
* 飞鼠([sgit](https://www.github.com/vnpy/vnpy_sgit)):黄金TD、国内期货
* :arrow_up: 金仕达黄金([ksgold](https://www.github.com/vnpy/vnpy_ksgold)):黄金TD
* :arrow_up: 利星资管([lstar](https://www.github.com/vnpy/vnpy_lstar)):期货资管
* :arrow_up: 融航([rohon](https://www.github.com/vnpy/vnpy_rohon)):期货资管
* :arrow_up: 杰宜斯([jees](https://www.github.com/vnpy/vnpy_jees)):期货资管
* 中汇亿达([comstar](https://www.github.com/vnpy/vnpy_comstar)):银行间市场
* :arrow_up: TTS[tts](https://www.github.com/vnpy/vnpy_tts)):国内期货(仿真)
* 海外市场
* :arrow_up: Interactive Brokers[ib](https://www.github.com/vnpy/vnpy_ib)):海外证券、期货、期权、贵金属等
* :arrow_up: 易盛9.0外盘([tap](https://www.github.com/vnpy/vnpy_tap)):海外期货
* :arrow_up: 直达期货([da](https://www.github.com/vnpy/vnpy_da)):海外期货
* 特殊应用
* :arrow_up: RQData行情([rqdata](https://www.github.com/vnpy/vnpy_rqdata)):跨市场(股票、指数、ETF、期货)实时行情
* :arrow_up: 迅投研行情([xt](https://www.github.com/vnpy/vnpy_xt)):跨市场(股票、指数、可转债、ETF、期货、期权)实时行情
* :arrow_up: RPC服务([rpc](https://www.github.com/vnpy/vnpy_rpcservice)):跨进程通讯接口,用于分布式架构
3. 覆盖下述各类量化策略的交易应用(app):
* :arrow_up: [cta_strategy](https://www.github.com/vnpy/vnpy_ctastrategy):CTA策略引擎模块,在保持易用性的同时,允许用户针对CTA类策略运行过程中委托的报撤行为进行细粒度控制(降低交易滑点、实现高频策略)
* :arrow_up: [cta_backtester](https://www.github.com/vnpy/vnpy_ctabacktester):CTA策略回测模块,无需使用Jupyter Notebook,直接使用图形界面进行策略回测分析、参数优化等相关工作
* :arrow_up: [spread_trading](https://www.github.com/vnpy/vnpy_spreadtrading):价差交易模块,支持自定义价差,实时计算价差行情和持仓,支持价差算法交易以及自动价差策略两种模式
* :arrow_up: [option_master](https://www.github.com/vnpy/vnpy_optionmaster):期权交易模块,针对国内期权市场设计,支持多种期权定价模型、隐含波动率曲面计算、希腊值风险跟踪等功能
* :arrow_up: [portfolio_strategy](https://www.github.com/vnpy/vnpy_portfoliostrategy):组合策略模块,面向同时交易多合约的量化策略(Alpha、期权套利等),提供历史数据回测和实盘自动交易功能
* :arrow_up: [algo_trading](https://www.github.com/vnpy/vnpy_algotrading):算法交易模块,提供多种常用的智能交易算法:TWAP、Sniper、Iceberg、BestLimit等
* :arrow_up: [script_trader](https://www.github.com/vnpy/vnpy_scripttrader):脚本策略模块,面向多标的类量化策略和计算任务设计,同时也可以在命令行中实现REPL指令形式的交易,不支持回测功能
* :arrow_up: [paper_account](https://www.github.com/vnpy/vnpy_paperaccount):本地仿真模块,纯本地化实现的仿真模拟交易功能,基于交易接口获取的实时行情进行委托撮合,提供委托成交推送以及持仓记录
* :arrow_up: [chart_wizard](https://www.github.com/vnpy/vnpy_chartwizard):K线图表模块,基于RQData数据服务(期货)或者交易接口获取历史数据,并结合Tick推送显示实时行情变化
* :arrow_up: [portfolio_manager](https://www.github.com/vnpy/vnpy_portfoliomanager):交易组合管理模块,以独立的策略交易组合(子账户)为基础,提供委托成交记录管理、交易仓位自动跟踪以及每日盈亏实时统计功能
* :arrow_up: [rpc_service](https://www.github.com/vnpy/vnpy_rpcservice):RPC服务模块,允许将某一进程启动为服务端,作为统一的行情和交易路由通道,允许多客户端同时连接,实现多进程分布式系统
* :arrow_up: [data_manager](https://www.github.com/vnpy/vnpy_datamanager):历史数据管理模块,通过树形目录查看数据库中已有的数据概况,选择任意时间段数据查看字段细节,支持CSV文件的数据导入和导出
* :arrow_up: [data_recorder](https://www.github.com/vnpy/vnpy_datarecorder):行情记录模块,基于图形界面进行配置,根据需求实时录制Tick或者K线行情到数据库中,用于策略回测或者实盘初始化
* :arrow_up: [excel_rtd](https://www.github.com/vnpy/vnpy_excelrtd)Excel RTDReal Time Data)实时数据服务,基于pyxll模块实现在Excel中获取各类数据(行情、合约、持仓等)的实时推送更新
* :arrow_up: [risk_manager](https://www.github.com/vnpy/vnpy_riskmanager):风险管理模块,提供包括交易流控、下单数量、活动委托、撤单总数等规则的统计和限制,有效实现前端风控功能
* :arrow_up: [web_trader](https://www.github.com/vnpy/vnpy_webtrader):Web服务模块,针对B-S架构需求设计,实现了提供主动函数调用(REST)和被动数据推送(Websocket)的Web服务器
4. Python交易API接口封装(api),提供上述交易接口的底层对接实现。
* :arrow_up: REST Client[rest](https://www.github.com/vnpy/vnpy_rest)):基于协程异步IO的高性能REST API客户端,采用事件消息循环的编程模型,支持高并发实时交易请求发送
* :arrow_up: Websocket Client[websocket](https://www.github.com/vnpy/vnpy_websocket)):基于协程异步IO的高性能Websocket API客户端,支持和REST Client共用事件循环并发运行
5. :arrow_up: 简洁易用的事件驱动引擎(event),作为事件驱动型交易程序的核心。
6. 对接各类数据库的适配器接口(database):
* SQL类
* :arrow_up: SQLite[sqlite](https://www.github.com/vnpy/vnpy_sqlite)):轻量级单文件数据库,无需安装和配置数据服务程序,VeighNa的默认选项,适合入门新手用户
* :arrow_up: MySQL[mysql](https://www.github.com/vnpy/vnpy_mysql)):主流的开源关系型数据库,文档资料极为丰富,且可替换其他NewSQL兼容实现(如TiDB)
* :arrow_up: PostgreSQL[postgresql](https://www.github.com/vnpy/vnpy_postgresql)):特性更为丰富的开源关系型数据库,支持通过扩展插件来新增功能,只推荐熟手使用
* NoSQL类
* :arrow_up: QuestDB[questdb](https://www.github.com/vnpy/vnpy_questdb)):开源高性能列式时序数据库,兼容PostgreSQL协议和SQL查询,擅长高吞吐写入与低延时分析场景
* DolphinDB[dolphindb](https://www.github.com/vnpy/vnpy_dolphindb)):一款高性能分布式时序数据库,适用于对速度要求极高的低延时或实时性任务
* :arrow_up: TDengine[taos](https://www.github.com/vnpy/vnpy_taos)):分布式、高性能、支持SQL的时序数据库,带有内建的缓存、流式计算、数据订阅等系统功能,能大幅减少研发和运维的复杂度
* :arrow_up: MongoDB[mongodb](https://www.github.com/vnpy/vnpy_mongodb)):基于分布式文件储存(bson格式)的文档式数据库,内置的热数据内存缓存提供更快读写速度
7. 对接下述各类数据服务的适配器接口(datafeed):
* :arrow_up: 迅投研([xt](https://www.github.com/vnpy/vnpy_xt)):股票、期货、期权、基金、债券
* :arrow_up: 米筐RQData[rqdata](https://www.github.com/vnpy/vnpy_rqdata)):股票、期货、期权、基金、债券、黄金TD
* :arrow_up: MultiCharts[mcdata](https://www.github.com/vnpy/vnpy_mcdata)):期货、期货期权
* :arrow_up: TuShare[tushare](https://www.github.com/vnpy/vnpy_tushare)):股票、期货、期权、基金
* :arrow_up: 万得Wind[wind](https://www.github.com/vnpy/vnpy_wind)):股票、期货、基金、债券
* :arrow_up: 同花顺iFinD[ifind](https://www.github.com/vnpy/vnpy_ifind)):股票、期货、基金、债券
* :arrow_up: 天勤TQSDK[tqsdk](https://www.github.com/vnpy/vnpy_tqsdk)):期货
* :arrow_up: 掘金([gm](https://www.github.com/vnpy/vnpy_gm)):股票
* :arrow_up: polygon[polygon](https://www.github.com/vnpy/vnpy_polygon)):股票、期货、期权
8. :arrow_up: 跨进程通讯标准组件(rpc),用于实现分布式部署的复杂交易系统。
9. :arrow_up: Python高性能K线图表(chart),支持大数据量图表显示以及实时数据更新功能。
10. [社区论坛](http://www.vnpy.com/forum)和[知乎专栏](http://zhuanlan.zhihu.com/vn-py),内容包括VeighNa项目的开发教程和Python在量化交易领域的应用研究等内容。
11. 官方交流群262656087(QQ),管理严格(定期清除长期潜水的成员),入群费将捐赠给VeighNa社区基金。
注:以上关于功能特点的说明为根据说明文档发布时情况罗列,后续可能存在更新或调整。若功能描述同实际存在出入,欢迎通过Issue联系进行调整。
## 环境准备
* 推荐使用VeighNa团队为量化交易专门打造的Python发行版[VeighNa Studio-4.4.0](https://download.vnpy.com/veighna_studio-4.4.0.exe),集成内置了VeighNa框架以及VeighNa Station量化管理平台,无需手动安装
* 支持的系统版本:Windows 11以上 / Windows Server 2022以上 / Ubuntu 22.04 LTS以上
* 支持的Python版本:Python 3.10以上(64位),**推荐使用Python 3.13**
## 安装步骤
在[这里](https://github.com/vnpy/vnpy/releases)下载Release发布版本,解压后运行以下命令安装:
**Windows**
```
install.bat
```
**Ubuntu**
```
bash install.sh
```
**Macos**
```
bash install_osx.sh
```
## 使用指南
1. 在[SimNow](http://www.simnow.com.cn/)注册CTP仿真账号,并在[该页面](http://www.simnow.com.cn/product.action)获取经纪商代码以及交易行情服务器地址。
2. 在[VeighNa社区论坛](https://www.vnpy.com/forum/)注册获得VeighNa Station账号密码(论坛账号密码即是)
3. 启动VeighNa Station(安装VeighNa Studio后会在桌面自动创建快捷方式),输入上一步的账号密码登录
4. 点击底部的**VeighNa Trader**按钮,开始你的交易!!!
注意:
* 在VeighNa Trader的运行过程中请勿关闭VeighNa Station(会自动退出)
## 脚本运行
除了基于VeighNa Station的图形化启动方式外,也可以在任意目录下创建run.py,写入以下示例代码:
```Python
from vnpy.event import EventEngine
from vnpy.trader.engine import MainEngine
from vnpy.trader.ui import MainWindow, create_qapp
from vnpy_ctp import CtpGateway
from vnpy_ctastrategy import CtaStrategyApp
from vnpy_ctabacktester import CtaBacktesterApp
def main():
"""Start VeighNa Trader"""
qapp = create_qapp()
event_engine = EventEngine()
main_engine = MainEngine(event_engine)
main_engine.add_gateway(CtpGateway)
main_engine.add_app(CtaStrategyApp)
main_engine.add_app(CtaBacktesterApp)
main_window = MainWindow(main_engine, event_engine)
main_window.showMaximized()
qapp.exec()
if __name__ == "__main__":
main()
```
在该目录下打开CMD(按住Shift->点击鼠标右键->在此处打开命令窗口/PowerShell)后运行下列命令启动VeighNa Trader
python run.py
## 贡献代码
VeighNa使用Github托管其源代码,如果希望贡献代码请使用github的PRPull Request)的流程:
1. [创建 Issue](https://github.com/vnpy/vnpy/issues/new) - 对于较大的改动(如新功能,大型重构等)建议先开issue讨论一下,较小的improvement(如文档改进,bugfix等)直接发PR即可
2. Fork [VeighNa](https://github.com/vnpy/vnpy) - 点击右上角**Fork**按钮
3. Clone你自己的fork: ```git clone https://github.com/$userid/vnpy.git```
* 如果你的fork已经过时,需要手动sync:[同步方法](https://help.github.com/articles/syncing-a-fork/)
4. 从**dev**创建你自己的feature branch: ```git checkout -b $my_feature_branch dev```
5. 在$my_feature_branch上修改并将修改push到你的fork上
6. 创建从你的fork的$my_feature_branch分支到主项目的**dev**分支的[Pull Request] - [在此](https://github.com/vnpy/vnpy/compare?expand=1)点击**compare across forks**,选择需要的fork和branch创建PR
7. 等待review, 需要继续改进,或者被Merge!
在提交代码的时候,请遵守以下规则,以提高代码质量:
* 使用[ruff](https://github.com/astral-sh/ruff)检查你的代码样式,确保没有error和warning。在项目根目录下运行```ruff check .```即可。
* 使用[mypy](https://github.com/python/mypy)进行静态类型检查,确保类型注解正确。在项目根目录下运行```mypy vnpy```即可。
## 其他内容
* [获取帮助](https://github.com/vnpy/vnpy/blob/dev/.github/SUPPORT.md)
* [社区行为准则](https://github.com/vnpy/vnpy/blob/dev/.github/CODE_OF_CONDUCT.md)
* [Issue模板](https://github.com/vnpy/vnpy/blob/dev/.github/ISSUE_TEMPLATE.md)
* [PR模板](https://github.com/vnpy/vnpy/blob/dev/.github/PULL_REQUEST_TEMPLATE.md)
## 版权说明
MIT
+7
View File
@@ -0,0 +1,7 @@
# WeHub 来源说明
- 原始项目:`vnpy/vnpy`
- 原始仓库:https://github.com/vnpy/vnpy
- 导入方式:上游默认分支的最新快照
- 原作者、版权和许可证信息以原始仓库及本仓库 LICENSE 为准
- 本文件仅用于记录来源,不代表 WeHub 是原项目作者
+343
View File
@@ -0,0 +1,343 @@
# VeighNa - By Traders, For Traders, AI-Powered.
<p align="center">
<img src ="https://vnpy.oss-cn-shanghai.aliyuncs.com/veighna-logo.png"/>
</p>
💬 Want to read this in **chinese** ? Go [**here**](README.md)
<p align="center">
<img src ="https://img.shields.io/badge/version-4.4.0-blueviolet.svg"/>
<img src ="https://img.shields.io/badge/platform-windows|linux|macos-yellow.svg"/>
<img src ="https://img.shields.io/badge/python-3.10|3.11|3.12|3.13-blue.svg" />
<img src ="https://img.shields.io/github/actions/workflow/status/vnpy/vnpy/pythonapp.yml?branch=master"/>
<img src ="https://img.shields.io/github/license/vnpy/vnpy.svg?color=orange"/>
</p>
VeighNa is a Python-based open source quantitative trading system development framework that has grown step by step into a fully-featured quantitative trading platform with continuous contributions from the open source community. It currently has many users from domestic and international financial institutions, including hedge funds, investment banks, futures brokers, university research institutions, proprietary trading companies, etc.
If you have any questions about using VeighNa for secondary development (strategies, modules, etc.), please check the [**VeighNa Project Documentation**](https://www.vnpy.com/docs/cn/index.html). If you can't solve it, please go to the [Questions and Help] section of the [**Official Community Forum**](https://www.vnpy.com/forum/) for help, or share your experience in the [Experience Sharing] section!
**Want to get more information about VeighNa?** Please scan the QR code below to add the assistant and join the [VeighNa Community Exchange WeChat Group]:
<p align="center">
<img src ="https://vnpy.oss-cn-shanghai.aliyuncs.com/github_wx.png"/, width=250>
</p>
## AI-Powered
On the tenth anniversary of VeighNa's release, version 4.0 officially introduces the [vnpy.alpha](./vnpy/alpha) module targeting AI quantitative strategies, providing professional quantitative traders with **an all-in-one multi-factor machine learning (ML) strategy development, research, and live trading solution**:
<p align="center">
<img src ="https://vnpy.oss-cn-shanghai.aliyuncs.com/alpha_demo.jpg"/, width=500>
</p>
* :bar_chart: **[dataset](./vnpy/alpha/dataset)**: Factor Feature Engineering
* Designed specifically for ML algorithm training optimization, supporting efficient batch feature calculation and processing
* Built-in rich factor feature expression calculation engine, enabling rapid one-click generation of training data
* [Alpha 158](./vnpy/alpha/dataset/datasets/alpha_158.py): A collection of stock market features from Microsoft's Qlib project, covering multiple dimensions of quantitative factors including K-line patterns, price trends, and time-series volatility
* :bulb: **[model](./vnpy/alpha/model)**: Prediction Model Training
* Provides standardized ML model development templates, greatly simplifying model building and training processes
* Unified API interface design, supporting seamless switching between different algorithms for performance comparison testing
* Integrates multiple mainstream machine learning algorithms:
* [Lasso](./vnpy/alpha/model/models/lasso_model.py): Classic Lasso regression model, implementing feature selection through L1 regularization
* [LightGBM](./vnpy/alpha/model/models/lgb_model.py): Efficient gradient boosting decision tree with a training engine optimized for large-scale datasets
* [MLP](./vnpy/alpha/model/models/mlp_model.py): Multi-layer perceptron neural network, suitable for modeling complex non-linear relationships
* :robot: **[strategy](./vnpy/alpha/strategy)**: Strategy Research and Development
* Quickly build quantitative trading strategies based on ML signal prediction models
* Support for both cross-sectional multi-asset and time-series single-asset strategy types
* :microscope: **[lab](./vnpy/alpha/lab.py)**: Research Process Management
* Integrates complete workflow including data management, model training, signal generation, and strategy backtesting
* Simple API design with built-in visualization analysis tools for intuitive evaluation of strategy performance and model effectiveness
* :book: **[notebook](./examples/alpha_research)**: Quantitative Research Demo
* [download_data_rq](./examples/alpha_research/download_data_rq.ipynb): Download A-share index constituent stock data based on RQData, including index constituent tracking and historical market data retrieval
* [download_data_xt](./examples/alpha_research/download_data_xt.ipynb): Download A-share index constituent historical changes and stock K-line data based on XtQuant data service
* [research_workflow_lasso](./examples/alpha_research/research_workflow_lasso.ipynb): Quantitative research workflow based on Lasso regression model, demonstrating feature selection and prediction capability of linear models
* [research_workflow_lgb](./examples/alpha_research/research_workflow_lgb.ipynb): Quantitative research workflow based on LightGBM gradient boosting tree, utilizing efficient ensemble learning methods for prediction
* [research_workflow_mlp](./examples/alpha_research/research_workflow_mlp.ipynb): Quantitative research workflow based on multilayer perceptron neural network, demonstrating the application of deep learning in quantitative trading
The design concept of the vnpy.alpha module was inspired by the [Qlib](https://github.com/microsoft/qlib) project, providing powerful AI quantitative capabilities while maintaining ease of use. We would like to express our sincere gratitude to the Qlib development team!
## Functional Features
Modules marked with :arrow_up: have completed the upgrade compatibility testing for version 4.0. Additionally, the 4.0 core framework uses an upgrade approach that prioritizes compatibility, so most modules can also be used directly (interfaces involving C++ API encapsulation must be upgraded before use).
1. :arrow_up: Multi-functional quantitative trading platform (vnpy.trader) that integrates various trading interfaces and provides simple and easy-to-use APIs for specific strategy algorithm and function development, for quickly building quantitative trading applications required by traders.
2. Trading interfaces (vnpy.gateway) covering all domestic and international trading varieties:
* Domestic market
* :arrow_up: CTP ([ctp](https://www.github.com/vnpy/vnpy_ctp)): Domestic futures and options
* :arrow_up: CTP Mini ([mini](https://www.github.com/vnpy/vnpy_mini)): Domestic futures, options
* :arrow_up: CTP Securities ([sopt](https://www.github.com/vnpy/vnpy_sopt)): ETF options
* :arrow_up: FEMAS ([femas](https://www.github.com/vnpy/vnpy_femas)): Domestic futures
* :arrow_up: Esunny ([esunny](https://www.github.com/vnpy/vnpy_esunny)): Domestic futures, Gold TD
* :arrow_up: APEX HTS ([hts](https://www.github.com/vnpy/vnpy_hts)): ETF options
* :arrow_up: XTP ([xtp](https://www.github.com/vnpy/vnpy_xtp)): Domestic securities (A shares), ETF options
* :arrow_up: TORA ([tora](https://www.github.com/vnpy/vnpy_tora)): Domestic securities (A shares), ETF options
* OST ([ost](https://www.github.com/vnpy/vnpy_ost)): Domestic securities (A shares)
* EMT ([emt](https://www.github.com/vnpy/vnpy_emt)): Domestic securities (A shares)
* SGIT ([sgit](https://www.github.com/vnpy/vnpy_sgit)): Gold TD, domestic futures
* :arrow_up: KsGold ([ksgold](https://www.github.com/vnpy/vnpy_ksgold)): Gold TD
* :arrow_up: LStar ([lstar](https://www.github.com/vnpy/vnpy_lstar)): Futures asset management
* :arrow_up: Rohon ([rohon](https://www.github.com/vnpy/vnpy_rohon)): Futures asset management
* :arrow_up: Jees ([jees](https://www.github.com/vnpy/vnpy_jees)): Futures asset management
* ComStar ([comstar](https://www.github.com/vnpy/vnpy_comstar)): Interbank market
* :arrow_up: TTS ([tts](https://www.github.com/vnpy/vnpy_tts)): Domestic futures (simulation)
* Overseas market
* :arrow_up: Interactive Brokers ([ib](https://www.github.com/vnpy/vnpy_ib)): Global securities, futures, options, forex, etc.
* :arrow_up: Esunny 9.0 ([tap](https://www.github.com/vnpy/vnpy_tap)): Global futures
* :arrow_up: Direct Futures ([da](https://www.github.com/vnpy/vnpy_da)): Global futures
* Special Applications
* :arrow_up: RQData Market Data ([rqdata](https://www.github.com/vnpy/vnpy_rqdata)): Cross-market (stocks, indices, ETFs, futures) real-time market data
* :arrow_up: XtQuant Market Data ([xt](https://www.github.com/vnpy/vnpy_xt)): Cross-market (stocks, indices, convertible bonds, ETFs, futures, options) real-time market data
* :arrow_up: RPC service ([rpc](https://www.github.com/vnpy/vnpy_rpcservice)): Inter-process communication interface for distributed architecture
3. Out-of-the-box trading applications for various quantitative strategies (vnpy.app):
* :arrow_up: [cta_strategy](https://www.github.com/vnpy/vnpy_ctastrategy): CTA strategy engine module, which allows users to perform fine-grained control over the order management during the operation of CTA-type strategies while maintaining ease of use (reducing trading slippage, implementing high-frequency strategies)
* :arrow_up: [cta_backtester](https://www.github.com/vnpy/vnpy_ctabacktester): CTA strategy backtester module, no need to use Jupyter Notebook, directly use the graphical interface to carry out strategy backtesting analysis, parameter optimization and other related work
* :arrow_up: [spread_trading](https://www.github.com/vnpy/vnpy_spreadtrading): Spread trading module, supports custom spreads, real-time calculation of spread quotes and positions, supports semi-automatic spread algorithm trading and fully automatic spread strategy trading modes
* :arrow_up: [option_master](https://www.github.com/vnpy/vnpy_optionmaster): Option trading module, designed for the domestic options market, supports various option pricing models, implied volatility surface calculation, Greek value risk tracking and other functions
* :arrow_up: [portfolio_strategy](https://www.github.com/vnpy/vnpy_portfoliostrategy): Portfolio strategy module, designed for trading multi-contract quantitative strategies (Alpha, option arbitrage, etc.) simultaneously, providing historical data backtesting and live automatic trading functions
* :arrow_up: [algo_trading](https://www.github.com/vnpy/vnpy_algotrading): Algorithm trading module, providing various commonly used intelligent trading algorithms: TWAP, Sniper, Iceberg, BestLimit, etc.
* :arrow_up: [script_trader](https://www.github.com/vnpy/vnpy_scripttrader): Script strategy module, designed for multi-asset portfolio trading strategies and computational tasks, also can directly achieve REPL instruction trading in the command line, does not support backtesting functions
* :arrow_up: [paper_account](https://www.github.com/vnpy/vnpy_paperaccount): Simulation trading module, pure localized implementation of simulation trading functions, based on real-time quotes obtained from the trading interface for order matching, providing order execution pushing and position records
* :arrow_up: [chart_wizard](https://www.github.com/vnpy/vnpy_chartwizard): K-line chart module, based on RQData data service (futures) or trading interface to obtain historical data, and combined with Tick push to display real-time market changes
* :arrow_up: [portfolio_manager](https://www.github.com/vnpy/vnpy_portfoliomanager): Portfolio module, for various fundamental trading strategies, based on separate strategy sub-accounts, providing automatic tracking of trading positions and real-time profit and loss statistics
* :arrow_up: [rpc_service](https://www.github.com/vnpy/vnpy_rpcservice): RPC service module, allowing a VeighNa Trader process to be started as a server, serving as a unified routing channel for quotes and trades, allowing multiple clients to connect simultaneously, realizing a multi-process distributed system
* :arrow_up: [data_manager](https://www.github.com/vnpy/vnpy_datamanager): Historical data management module, view existing data in the database through a tree directory, select any time period data to view field details, supports CSV file data import and export
* :arrow_up: [data_recorder](https://www.github.com/vnpy/vnpy_datarecorder): Market data recording module, based on the graphical interface for configuration, records Tick or K-line data to the database in real-time according to demand, for strategy backtesting or live initialization
* :arrow_up: [excel_rtd](https://www.github.com/vnpy/vnpy_excelrtd): Excel RTD (Real Time Data) real-time data service, based on pyxll module to achieve real-time push updates of various data (quotes, contracts, positions, etc.) in Excel
* :arrow_up: [risk_manager](https://www.github.com/vnpy/vnpy_riskmanager): Risk management module, providing statistics and restrictions on rules including trade flow control, number of orders placed, active orders, total number of cancelled orders, etc., effectively implementing front-end risk control functions
* :arrow_up: [web_trader](https://www.github.com/vnpy/vnpy_webtrader): Web service module, designed according to the requirements of B-S architecture, implementing a web server that provides active function calls (REST) and passive data push (WebSocket)
4. Python trading API interface package (vnpy.api), providing the underlying implementation of the above trading interfaces:
* :arrow_up: REST Client ([rest](https://www.github.com/vnpy/vnpy_rest)): High-performance REST API client based on coroutine process asynchronous IO which adopts the programming model of event message cycle to support sending high concurrent real-time transaction requests
* :arrow_up: Websocket Client ([websocket](https://www.github.com/vnpy/vnpy_websocket)): High-performance Websocket API client based on coroutine process asynchronous IO, supports sharing event loops with REST Client to avoid multi-threaded performance loss caused by GIL
5. :arrow_up: Simple and easy-to-use event-driven engine (vnpy.event), which is the core of event-driven trading programs
6. Standardized management client (vnpy.database) interfacing with various databases:
* SQL class
* :arrow_up: SQLite ([sqlite](https://www.github.com/vnpy/vnpy_sqlite)): Lightweight single file database, no need to install and configure data service programs, default option of VeighNa, suitable for novice users
* :arrow_up: MySQL ([mysql](https://www.github.com/vnpy/vnpy_mysql)): The world's most popular open source relational database, extremely rich documentation, and can replace other high NewSQL compatible implementations (such as TiDB)
* :arrow_up: PostgreSQL ([postgresql](https://www.github.com/vnpy/vnpy_postgresql)): More feature-rich open source relational database, support for new features through extension plug-ins, only recommended for skilled users
* NoSQL classes
* QuestDB ([questdb](https://www.github.com/vnpy/vnpy_questdb)): Open source high-performance columnar time-series database compatible with the PostgreSQL wire protocol and SQL queries, well suited for high-throughput ingestion and low-latency analytics
* DolphinDB ([dolphindb](https://www.github.com/vnpy/vnpy_dolphindb)): A high-performance distributed temporal database especially suitable for low latency or real-time tasks with high speed requirements
* :arrow_up: TDengine ([taos](https://www.github.com/vnpy/vnpy_taos)): Distributed, high-performance, SQL-supporting time-series database with built-in caching, stream computing, data subscription and other system functions that greatly reduce development and maintenance complexity
* :arrow_up: MongoDB ([mongodb](https://www.github.com/vnpy/vnpy_mongodb)): Non-relational database based on distributed file storage (bson format), built-in memory cache of hot data provides faster read and write speeds
7. Adapter interfaces for various data services (datafeed):
* :arrow_up: XtQuant ([xt](https://www.github.com/vnpy/vnpy_xt)): Stocks, futures, options, funds, bonds
* :arrow_up: RQData ([rqdata](https://www.github.com/vnpy/vnpy_rqdata)): Stocks, futures, options, funds, bonds, Gold TD
* :arrow_up: MultiCharts ([mcdata](https://www.github.com/vnpy/vnpy_mcdata)): Futures, futures options
* :arrow_up: TuShare ([tushare](https://www.github.com/vnpy/vnpy_tushare)): Stocks, futures, options, funds
* :arrow_up: Wind ([wind](https://www.github.com/vnpy/vnpy_wind)): Stocks, futures, funds, bonds
* :arrow_up: iFinD ([ifind](https://www.github.com/vnpy/vnpy_ifind)): Stocks, futures, funds, bonds
* :arrow_up: TQSDK ([tqsdk](https://www.github.com/vnpy/vnpy_tqsdk)): Futures
* :arrow_up: GoldMiner ([gm](https://www.github.com/vnpy/vnpy_gm)): Stocks
* :arrow_up: polygon ([polygon](https://www.github.com/vnpy/vnpy_polygon)): Stocks, futures, options
8. :arrow_up: Standard component for inter-process communication (vnpy.rpc) for implementing complex trading systems in distributed deployments
9. :arrow_up: Python high-performance K-line charts (vnpy.chart), supporting large data volume chart display and real-time data update functions
10. [Community Forum](http://www.vnpy.com/forum) and [Zhihu Blog](http://zhuanlan.zhihu.com/vn-py), which include the development tutorial of VeighNa project and the research on the application of Python in the field of quantitative trading, etc.
11. The official communication group 262656087 (QQ), with strict management (regular purging of long-term inactive members), and the membership fee will be donated to the VeighNa community fund.
Note: The above description of functional features is based on the documentation at the time of publication, and subsequent updates or adjustments may exist. If there are discrepancies between the function description and the actual situation, please contact us through Issue for adjustments.
## Environment preparation
* We recommend using the Python distribution [VeighNa Studio-4.4.0](https://download.vnpy.com/veighna_studio-4.4.0.exe), which is built with the latest version of VeighNa framework and VeighNa Station quantitative management platform, specifically created by the VeighNa team for quantitative trading. No manual installation required.
* Supported system versions: Windows 11 or above / Windows Server 2022 or above / Ubuntu 22.04 LTS or above
* Supported Python version: Python 3.10 or above (64-bit), **Python 3.13 recommended**
## Installation steps
Download the latest version from [here](https://github.com/vnpy/vnpy/releases), unzip it and run the following command to install it.
**Windows**
```
install.bat
```
**Ubuntu**
```
bash install.sh
```
**Macos**
```
bash install_osx.sh
```
## User's Guide
1. Register a CTP Demo account at [SimNow](http://www.simnow.com.cn/) and get the broker code and the trading quotes server address at [this page](http://www.simnow.com.cn/product.action).
2. Register at [VeighNa community forum](https://www.vnpy.com/forum/) to get the VeighNa Station account password (the forum account password is used)
3. Launch VeighNa Station (a shortcut will be created automatically on your desktop after installing VeighNa Studio), enter the account password from the previous step and login
4. Click on the **VeighNa Trader** button at the bottom and start your trading!
Attention:
* Please do not close VeighNa Station during the running of VeighNa Trader (it will exit automatically)
## Script Run
In addition to the graphical start-up method based on VeighNa Station, you can also create run.py in any directory and write the following sample code:
```Python
from vnpy.event import EventEngine
from vnpy.trader.engine import MainEngine
from vnpy.trader.ui import MainWindow, create_qapp
from vnpy_ctp import CtpGateway
from vnpy_ctastrategy import CtaStrategyApp
from vnpy_ctabacktester import CtaBacktesterApp
def main():
"""Start VeighNa Trader"""
qapp = create_qapp()
event_engine = EventEngine()
main_engine = MainEngine(event_engine)
main_engine.add_gateway(CtpGateway)
main_engine.add_app(CtaStrategyApp)
main_engine.add_app(CtaBacktesterApp)
main_window = MainWindow(main_engine, event_engine)
main_window.showMaximized()
qapp.exec()
if __name__ == "__main__":
main()
```
Open CMD in that directory (hold Shift->click right mouse button->open command window/PowerShell here) and then run the following command to start VeighNa Trader:
python run.py
## Contributing code
VeighNa uses Github to host its source code, if you wish to contribute code please use the PR (Pull Request) process of github:
1. [Create Issue](https://github.com/vnpy/vnpy/issues/new) - For larger changes (such as new features, large refactoring, etc.) it is best to first open an issue to discuss, and smaller improvements (such as document improvements, bugfixes, etc.) can be sent directly to PR
2. Fork [VeighNa](https://github.com/vnpy/vnpy) - Click the **Fork** button in the upper right corner
3. Clone your own fork: ```git clone https://github.com/$userid/vnpy.git```
* If your fork is out of date, you need to manually sync: [Synchronization method](https://help.github.com/articles/syncing-a-fork/)
4. Create your own feature branch from **dev**: ```git checkout -b $my_feature_branch dev```
5. Make changes on $my_feature_branch and push the changes to your fork
6. Create a [Pull Request] from your fork's $my_feature_branch branch to the main project's **dev** branch - [here](https://github.com/vnpy/vnpy/compare?expand=1) Click on **compare across forks** and select the required fork and branch to create the PR
7. Waiting for review, need to continue to improve, or be Merge!
When submitting code, please observe the following rules to improve the quality of the code:
* Use [ruff](https://github.com/astral-sh/ruff) to check your code style, ensuring there are no errors and warnings. Just run ``ruff check .`` in the project root directory.
* Use [mypy](https://github.com/python/mypy) for static type checking, ensuring type annotations are correct. Just run ``mypy vnpy`` in the project root directory.
## Other content
* [Getting Help](https://github.com/vnpy/vnpy/blob/dev/.github/SUPPORT.md)
* [Community Conduct Guidelines](https://github.com/vnpy/vnpy/blob/dev/.github/CODE_OF_CONDUCT.md)
* [Issue templates](https://github.com/vnpy/vnpy/blob/dev/.github/ISSUE_TEMPLATE.md)
* [PR templates](https://github.com/vnpy/vnpy/blob/dev/.github/PULL_REQUEST_TEMPLATE.md)
## Copyright statement
MIT
+171
View File
@@ -0,0 +1,171 @@
# AlgoTrading - 算法委托执行交易模块
## 功能简介
AlgoTrading是用于**算法委托执行交易**的模块,用户可以通过其UI界面操作来便捷完成启动算法、保存配置、停止算法等任务。
算法交易负责委托订单的具体执行过程。目前,AlgoTrading提供了多种示例算法,用户可以通过把大笔订单自动拆分成合适的小单分批委托,有效降低交易成本和冲击成本(如冰山算法、狙击手算法),也可以在设定的阈值内进行高抛低吸操作(如网格算法、套利算法)。
## 加载启动
### VeighNa Station加载
启动登录VeighNa Station后,点击【交易】按钮,在配置对话框中的【应用模块】栏勾选【AlgoTrading】。
### 脚本加载
在启动脚本中添加如下代码:
```python3
# 写在顶部
from vnpy_algotrading import AlgoTradingApp
# 写在创建main_engine对象后
main_engine.add_app(AlgoTradingApp)
```
## 启动模块
对于用户搭建的算法,需要放到algo_trading.algos目录中,才能被识别加载。
在启动模块之前,请先连接交易接口(连接方法详见基本使用篇的连接接口部分)。看到VeighNa Trader主界面【日志】栏输出“合约信息查询成功”之后再启动模块,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_strategy/1.png)
请注意,IB接口因为登录时无法自动获取所有的合约信息,只有在用户手动订阅行情时才能获取。因此需要在主界面上先行手动订阅合约行情,再启动模块。
成功连接交易接口后,在菜单栏中点击【功能】-> 【算法交易】,或者点击左侧按钮栏的图标:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/algo_trading/1.png)
即可进入算法委托执行交易模块的UI界面,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/algo_trading/10.png)
## 配置算法
配置参数要求如下:
- 算法:在下拉框中选择要执行的交易算法;
- 本地代码:格式为vt_symbol(合约代码 + 交易所名称);
- 方向:多、空;
- 价格:委托下单的价格;
- 数量:委托的总数量,需要拆分成小批订单进行交易;
- 执行时间(秒):运行该算法交易的总时间,以秒为单位;
- 每轮间隔(秒):每隔多少时间进行委托下单操作,以秒为单位;
- 开平:开、平、平今、平昨。
## 启动算法
目前VeighNa一共提供了五种常用的示例算法。本文档以时间加权平均算法(TWAP)为例,介绍算法启动过程。
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/algo_trading/3.png)
参数配置完成后(已保存的算法信息,通过在【配置】栏对应的算法下点击【使用】,可切换界面左侧配置的信息内容),点击【启动算法】按钮,即可立刻执行算法交易。
若启动成功,则可在右上角【执行中】界面观测到该算法的执行状态。
图中算法执行的任务具体为:使用时间加权平均算法,买入10000手豆油2109合约(y2409),执行价格为7420元,执行时间为600秒,每轮间隔为6秒;即每隔6秒钟,当合约卖一价小于等于7420时,以7420的价格买入100手豆油2409合约,将买入操作分割成100次。
## CSV启动
当有较多算法需要启动时,可以通过CSV文件来一次性批量启动。点击图形界面左侧的【CSV启动】按钮,在弹出的对话框中找到要导入的CSV文件后打开即可快速启动算法。
请注意,CSV文件的格式应如下图所示,和左侧编辑区的各字段一致:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/algo_trading/12.png)
结合Excel的表格快速编辑功能,批量添加算法较为方便。启动成功后,CSV文件中所有算法的执行情况均会显示在【执行中】界面下。
## 停止算法
当用户需要暂停正在执行的交易算法时,可以在【执行中】界面点击【暂停】按钮,暂停某个正在执行的算法交易,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/algo_trading/6.png)
当用户需要恢复已经暂停的交易算法时,可以在【执行中】界面点击【恢复】按钮,恢复某个已经暂停的算法交易,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/algo_trading/15.png)
当用户需要停止正在执行的交易算法时,可以在【执行中】界面点击【停止】按钮,停止某个正在执行的算法交易,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/algo_trading/6.png)
用户也可以在委托交易界面点击最下方的【全部停止】按钮,一键停止所有执行中的算法交易,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/algo_trading/7.png)
## 数据监控
数据监控界面由四个部分构成:
执行中组件:显示正在执行的算法交易,包括:算法、参数、变量和状态。成功启动算法之后,切换到右上角【执行中】界面,会显示该算法的执行状态,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/algo_trading/6.png)
已结束组件:显示已完成的算法交易,同样包括:算法、参数、变量和状态。算法结束或者停止之后,切换到右上角【已结束】界面,会显示该算法的执行状态,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/algo_trading/9.png)
日志组件:显示启动、停止、完成算法的相关日志信息。在打开算法交易模块后,会进行初始化,故【日志】组件会首先输出“算法交易引擎启动”,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/algo_trading/11.png)
## 示例算法
示例算法路径位于vnpy_algotrading.algos文件夹下(请注意,个别算法是没有写开平方向的,若有需要,可基于自身需求进行个性化修改)。目前,算法交易模块提供了以下五种内置算法:
### TWAP - 时间加权平均算法
时间加权平均算法(TWAP)具体执行步骤如下:
- 将委托数量平均分布在某个时间区域内,每隔一段时间用指定的价格挂出买单(或者卖单)。
- 买入情况:卖一价低于目标价格时,发出委托,委托数量在剩余委托量与委托分割量中取最小值。
- 卖出情况:买一价高于目标价格时,发出委托,委托数量在剩余委托量与委托分割量中取最小值。
### Iceberg - 冰山算法
冰山算法(Iceberg)具体执行步骤如下:
- 在某个价位挂单,但是只挂一部分,直到全部成交。
- 买入情况:先检查撤单,最新Tick卖一价低于目标价格,执行撤单;若无活动委托,发出委托,委托数量在剩余委托量与挂出委托量中取最小值。
- 卖出情况:先检查撤单,最新Tick买一价高于目标价格,执行撤单;若无活动委托,发出委托,委托数量在剩余委托量与挂出委托量中取最小值。
### Sniper - 狙击手算法
狙击手算法(Sniper)具体执行步骤如下:
- 监控最新Tick推送的行情,发现好的价格立刻报价成交。
- 买入情况:最新Tick卖一价低于目标价格时,发出委托,委托数量在剩余委托量与卖一量中取最小值。
- 卖出情况:最新Tick买一价高于目标价格时,发出委托,委托数量在剩余委托量与买一量中取最小值。
### Stop - 条件委托算法
条件委托算法(Stop)具体执行步骤如下:
- 监控最新Tick推送的行情,发现行情突破立刻报价成交。
- 买入情况:Tick最新价高于目标价格时,发出委托,委托价为目标价格加上超价。
- 卖出情况:Tick最新价低于目标价格时,发出委托,委托价为目标价格减去超价。
### BestLimit - 最优限价算法
最优限价算法(BestLimit)具体执行步骤如下:
- 监控最新Tick推送的行情,发现好的价格立刻报价成交。
- 买入情况:先检查撤单:最新Tick买一价不等于目标价格时,执行撤单;若无活动委托,发出委托,委托价格为最新Tick买一价,委托数量为剩余委托量。
- 卖出情况:先检查撤单:最新Tick买一价不等于目标价格时,执行撤单;若无活动委托,发出委托,委托价格为最新Tick卖一价,委托数量为剩余委托量。
+70
View File
@@ -0,0 +1,70 @@
# ChartWizard - 实时K线图表模块
## 功能简介
ChartWizard是用于**实时K线图表展示**的功能模块,用户可以通过其UI界面查看实时和历史K线行情,目前只支持显示1分钟级别的K线数据,实时K线(最新的一根K线)为Tick级刷新。
## 加载启动
### VeighNa Station加载
启动登录VeighNa Station后,点击【交易】按钮,在配置对话框中的【应用模块】栏勾选【ChartWizard】。
### 脚本加载
在启动脚本中添加如下代码:
```python3
# 写在顶部
from vnpy_chartwizard import ChartWizardApp
# 写在创建main_engine对象后
main_engine.add_app(ChartWizardApp)
```
## 启动模块
在启动模块之前,请先连接交易接口(连接方法详见基本使用篇的连接接口部分)。看到VeighNa Trader主界面【日志】栏输出“合约信息查询成功”之后再启动模块,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_strategy/1.png)
请注意,IB接口因为登录时无法自动获取所有的合约信息,只有在用户手动订阅行情时才能获取。因此需要在主界面上先行手动订阅合约行情,再启动模块。
由于VeighNa本身并不提供任何数据服务,对于K线图表绘制过程中用到的历史数据,国内期货历史数据由数据服务提供,用户需要准备和配置数据服务账号(配置方法详见基本使用篇的全局配置部分)。
成功连接交易接口后,在菜单栏中点击【功能】-> 【K线图表】,或者点击左侧按钮栏的图标:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/chart_wizard/1.png)
即可进入实时K线图表模块的UI界面,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/chart_wizard/2.png)
## 新建图表
打开图表窗口后,在【本地代码】编辑框中输入合约代码(注意本地代码由代码前缀和交易所后缀两部分组成,如rb2112.SHFE)。
点击【新建图表】的按钮,即可创建对应合约的K线图表,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/chart_wizard/3.png)
用户可以新建多个合约的K线图表,通过切换窗口来实现快速切换:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/chart_wizard/4.png)
## 查看图表
每个合约的图表分为上下两块子图区域:
- 上面的子图为行情K线;
- 下面的子图为成交量数据。
图表上的十字光标可用于定位和显示特定时间点的具体数据,在X轴和Y轴上均会对应数据点的标签,同时在左上角也会显示此根K线的OHLCV等信息。
其他快捷操作:
- 可以通过鼠标左键的拖拽,左右平移K线图显示的时间范围;
- 可以通过鼠标滚轮的滚动,放大和缩小K线图显示的时间范围。
+304
View File
@@ -0,0 +1,304 @@
# CtaBacktester - CTA回测研究模块
## 功能简介
CtaBacktester是用于**CTA回测研究**的功能模块,用户可以通过其UI界面操作来便捷完成数据下载、历史回测、结果分析和参数优化等任务。
## 加载启动
### VeighNa Station加载
启动登录VeighNa Station后,点击【交易】按钮,在配置对话框中的【应用模块】栏勾选【CtaBacktester】。
### 脚本加载
在启动脚本中添加如下代码:
```python3
# 写在顶部
from vnpy_ctabacktester import CtaBacktesterApp
# 写在创建main_engine对象后
main_engine.add_app(CtaBacktesterApp)
```
## 启动模块
对于用户自行开发的策略,需要放到VeighNa Trader运行时目录下的**strategies**目录中,才能被识别加载。具体的运行时目录路径,可以在VeighNa Trader主界面顶部的标题栏查看。
对于在Windows上默认安装的用户来说,放置策略的strategies目录路径通常为:
```
C:\Users\Administrator\strategies
```
其中Administrator为当前登录Windows的系统用户名。
启动VeighNa Trader后,在菜单栏中点击【功能】-> 【CTA回测】,或者点击左侧按钮栏的图标:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_backtester/00.png)
即可打开图形化的回测界面,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_backtester/25.png)
## 下载数据
在开始策略回测之前,首先需要保证数据库内有足够的历史数据,CtaBacktester模块也提供了一键下载历史数据的功能。
下载数据需要填写本地代码、K线周期、开始日期以及结束日期四个字段信息:
<span id="jump">
- 本地代码
- 格式为合约代码 + 交易所名称
- 如IF888.CFFEX、rb2105.SHFE
- K线周期:
- 1m1分钟K线)
- 1h1小时K线)
- d(日K线)
- w(周K线)
- tick(一个Tick
- 开始和结束日期
- 格式为yyyy/mm/dd
- 如2018/2/25、2021/2/28
</span>
填写完成后,点击下方【下载数据】按钮启动下载任务,成功后如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_backtester/27.png)
注意下载完成后的历史数据会保存在本地数据库中,后续回测时可以直接使用,无需每次都重复下载。
### 数据来源:数据服务(期货、股票、期权)
以RQData为例,[RQData](https://www.ricequant.com/welcome/purchase?utm_source=vnpy)提供国内期货、股票以及期权的历史数据。在使用前需要保证数据服务已经正确配置(配置方法详见基本使用篇的全局配置部分)。打开CtaBacktester时会自动执行数据服务登录初始化,若成功则会输出“数据服务初始化成功”的日志,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_backtester/26.png)
### 数据来源:IB(外盘期货、股票、现货等)
Interactive Brokers盈透证券(IB)提供丰富的外盘市场历史数据下载(包括股票、期货、期权、现货等),注意下载前需要先启动IB TWS交易软件,并在VeighNa Trader主界面连接好IB接口,并订阅所需合约行情。下载成功如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_backtester/28.png)
## 执行回测
准备好数据后即可开始使用历史数据对策略进行回测研究,回测时需要配置好相关的参数:
- 策略品种
- 交易策略:在下拉框中选择要回测的策略名称;
- 本地代码:注意不要漏掉交易所后缀;
- 数据范围
- 格式详见本章[下载数据](#jump)部分的介绍;
- 交易成本
- 滑点:下单交易点位与实际交易点位的差别;
- 百分比手续费:填写数字即可,不要填写百分数;
- 固定比手续费:可以手续费填0,然后把手续费除以合约乘数后,加在滑点中;
- 合约属性
- 合约乘数:合约的交易单位;
- 价格跳动:合约价格的最小变动价位;
- 回测资金:账户资金;
- 合约模式:正向。
配置完成后,点击下方的【开始回测】按钮,会弹出策略参数配置对话框,用于设置策略参数,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_backtester/29.png)
点击【确定】按钮后开始执行回测任务,同时日志界面会输出相关信息,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_backtester/10.png)
回测完成后,会自动在右侧区域显示策略回测业绩的统计指标以及相关图表,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_backtester/30.png)
若数据库没有准备好所需的历史数据就点击【开始回测】,则日志界面会输出“历史数据不足,回测终止”的日志,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_backtester/15.png)
## 结果分析
### 业绩图表
右侧的业绩图表由以下四张子图构成:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_backtester/31.png)
【账户净值】图的横轴是时间,纵轴是资金,体现了账户净值在交易时段内随着交易日变化的情况。
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_backtester/32.png)
【净值回撤】图的横轴是时间,纵轴是回撤,体现了净值从最近高点回撤程度随着交易日变化的情况。
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_backtester/33.png)
【每日盈亏】图的横轴是时间,纵轴是日盈亏的金额(采用逐日盯市规则以收盘价结算),体现了整个回测周期内策略的每日盈亏变化情况。
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_backtester/34.png)
【盈亏分布】图的横轴是每日盈亏的数值,纵轴是该盈亏数值的出现概率,体现了整体每日盈亏的概率分布情况。
### 统计指标
统计指标区域用于显示策略历史回测业绩的相关统计数值,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_backtester/35.png)
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_backtester/36.png)
根据数据类型,指标可以分类为:
- 日期信息
- 首个交易日
- 最后交易日
- 总交易日
- 盈利交易日
- 亏损交易日
- 资金盈亏
- 起始资金
- 结束资金
- 总收益率
- 年化收益
- 最大回撤
- 百分比最大回撤
- 总盈亏
- 交易成本
- 总手续费
- 总滑点
- 总成交额
- 总成交笔数
- 日均数据
- 日均盈亏
- 日均手续费
- 日均滑点
- 日均成交额
- 日均成交笔数
- 日均收益率
- 收益标准差(日均)
- 绩效评价
- 夏普比率
- 收益回撤比
### 详细信息
回测完成后,可点击左侧区域的【委托记录】按钮,查看回测过程中策略逐笔委托的细节信息:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_backtester/43.png)
如果发现表格内容显示不完整,可以单击鼠标右键弹出菜单后,选择【调整列宽】按钮,即可进行自动列宽缩放:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_backtester/46.png)
表格也支持一键将表内数据保存为CSV文件,在上一步右键弹出的菜单中,点击【保存数据】按钮,即可弹出如下图所示选择保存文件名的对话框:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_backtester/42.png)
回测过程中策略发出委托的**成交价**不一定是原始下单的价格,而要由回测引擎基于当时的行情数据和下单价格进行撮合后算出,每笔委托对应的具体成交细节可以点击【成交记录】按钮后查看:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_backtester/38.png)
点击【每日盈亏】按钮后,可以看到如下图所示的策略每日盈亏细节:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_backtester/39.png)
这里每日盈亏的统计采用期货市场普遍使用的逐日盯市(Marking-to-Market)规则进行计算:
- 持仓盈亏:今日开盘持仓的部分,以昨收盘价开仓,今收盘价平仓,计算出的盈亏金额;
- 交易盈亏:今日日内成交的部分,以成交价格开仓,今收盘价平仓,计算出的盈亏金额;
- 总盈亏:汇总持仓盈亏和交易盈亏后的金额;
- 净盈亏:总盈亏扣除手续费和滑点后的金额,也是最终计算显示四张图表时用到的每日盈亏金额。
### K线图表
点击【K线图表】按钮,即可打开用于显示回测K线数据,以及策略具体买卖点位置的图表,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_backtester/44.png)
注意绘图耗时可能需要一定时间(通常在数十秒到几分钟),请耐心等待。
K线图表中的图例说明可以在窗口底部看到,整体上采用了国内市场标准的配色和风格。开平仓之间的连线采用的是逐笔配对(First-in, First-out)规则进行绘制,每一笔成交会根据其数量自动和其他成交进行匹配,即使策略有复杂的加减仓操作也能正确绘制。
## 参数优化
对于开发好的策略,可以使用CtaBacktester内置的优化算法快速进行参数寻优,目前支持穷举和遗传两种优化算法。
### 设置优化参数
点击【参数优化】按钮,会弹出“优化参数配置”的窗口:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_backtester/37.png)
点击【目标】下拉框,选择优化过程中要使用的目标函数(即以该数值最大化为目标进行优化):
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_backtester/45.png)
对于要进行优化的策略参数,需要配置:
- 【开始】和【结束】:用于给定参数优化的范围;
- 【步进】:用于给定参数每次变化的数值;
举例:如一个参数的【开始】设为10,【结束】设为20,【步进】设为2,则该参数在优化过程中的寻优空间为:10、12、14、16、18、20。
对于要设置固定数值的策略参数,请将【开始】和【结束】都同样设为该数值即可。
### 穷举算法优化
设置好需要优化的参数后,点击窗口底部的【多进程优化】按钮,此时CtaBacktester会调用Python的multiprocessing模块,根据当前电脑CPU的核心数量,启动对应数量的进程来并行执行穷举优化任务。
在优化的过程中,穷举算法会遍历参数寻优空间中的每一个组合。遍历的过程即使用该组合作为策略参数运行一次历史回测,并返回优化目标函数的数值。完成遍历后,根据所有目标函数的数值进行排序,从而选出最优的参数组合结果。
穷举算法优化的效率和CPU核心数量直接相关:若用户计算机是2核,则优化时间为单核的1/2;若计算机是10核,则优化时间会大幅降低到单核的1/10。
### 遗传算法优化
设置好需要优化的参数后,点击窗口底部的【遗传算法优化】按钮,此时CtaBacktester会调用Python的multiprocessing模块和deap模块,来执行高效智能化的多进程遗传算法优化任务。
附上遗传算法的简要工作原理:
1. 定义优化方向,如总收益率最大化;
2. 随机从全局寻优空间中,选择出部分参数组合形成初始族群;
3. 对族群内所有个体进行评估,即运行回测获取目标函数结果;
4. 基于目标函数结果进行排序,剔除表现不好的个体(参数组合);
5. 对剩下的个体进行交叉或者变异,通过评估和筛选后形成新的族群;
6. 以上3-5步为一次完整的种群迭代,在整个优化过程中需要多次重复;
7. 多次迭代后,种群内差异性减少,参数收敛向最优解,最终输出结果。
### 优化结果分析
优化完成后,会在日志区域输出信息提示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_backtester/49.png)
此时点击【优化结果】按钮即可查看相关结果:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_backtester/50.png)
上图中的参数优化结果,基于启动优化任务时所选的目标函数【总收益率】的数值,由高到低进行了排序。
最后,点击右下角的【保存】按钮即可将优化结果保存到本地CSV文件中,便于后续分析使用。
## 策略代码
### 代码编辑
如果需要对策略进行修改,在CtaBacktester界面左上角的下拉框中选择策略后,点击左下角的【代码编辑】按钮,即可自动打开Visual Studio Code进行代码编辑。若找不到Visual Studio Code,则会弹出启动代码编辑器失败对话框,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_backtester/61.png)
### 策略重载
当用户通过CtaBacktester对策略源代码进行修改后,此时的修改尚停留在硬盘上的代码文件层面,内存中依然是修改前的策略代码。
想让修改内容在内存中立即生效,需要点击左下角的【策略重载】按钮,此时CtaBacktester会自动扫描并重新加载所有策略文件中的策略代码,同时会有相关日志输出,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_backtester/59.png)
重载刷新完成后,再运行回测或者优化时,使用的就是修改后的策略代码了。
+852
View File
@@ -0,0 +1,852 @@
# CtaStrategy - CTA自动交易模块
## 功能简介
CtaStrategy是用于**CTA自动交易**的功能模块,用户可以通过其UI界面操作来便捷完成策略初始化、策略启动、策略停止、策略参数编辑以及策略移除等任务。
## 加载启动
### VeighNa Station加载
启动登录VeighNa Station后,点击【交易】按钮,在配置对话框中的【应用模块】栏勾选【CtaStrategy】。
### 脚本加载
在启动脚本中添加如下代码:
```python3
# 写在顶部
from vnpy_ctastrategy import CtaStrategyApp
# 写在创建main_engine对象后
main_engine.add_app(CtaStrategyApp)
```
## 启动模块
<span id="jump">
对于用户自行开发的策略,需要放到VeighNa Trader运行时目录下的**strategies**目录中,才能被识别加载。具体的运行时目录路径,可以在VeighNa Trader主界面顶部的标题栏查看。
对于在Windows上默认安装的用户来说,放置策略的strategies目录路径通常为:
```
C:\Users\Administrator\strategies
```
其中Administrator为当前登录Windows的系统用户名。
</span>
在启动模块之前,请先连接交易接口(连接方法详见基本使用篇的连接接口部分)。看到VeighNa Trader主界面【日志】栏输出“合约信息查询成功”之后再启动模块,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_strategy/1.png)
请注意,IB接口因为登录时无法自动获取所有的合约信息,只有在用户手动订阅行情时才能获取。因此需要在主界面上先行手动订阅合约行情,再启动模块。
成功连接交易接口后,在菜单栏中点击【功能】-> 【CTA策略】,或者点击左侧按钮栏的图标:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_strategy/00.png)
即可进入CTA策略模块的UI界面,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_strategy/2.png)
如果配置了数据服务(配置方法详见基本使用篇的全局配置部分),打开CTA策略模块时会自动执行数据服务登录初始化。若成功登录,则会输出“数据服务初始化成功”的日志,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_strategy/ctas.png)
## 添加策略
用户可以基于编写好的CTA策略模板(类)来创建不同的策略实例(对象)。策略实例的好处在于,同一个策略可以同时去交易多个品种合约,并且每个实例的参数可以是不同的。
在左上角的下拉框中选择要交易的策略名称,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_strategy/28.png)
请注意,显示的策略名称是**策略类**(驼峰式命名)的名字,而不是策略文件(下划线模式命名)的名字。
选择好策略类之后,点击【添加策略】,会弹出添加策略对话框,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_strategy/5.png)
在创建策略实例时,需要配置相关参数,各参数要求如下:
- 实例名称
- 实例名称不能重名;
- 合约品种
- 格式为vt_symbol(合约代码 + 交易所名称);
- 一定要是实盘交易系统中可以查到的合约名称;
- 一般选择该期货品种当前流动性最好的月份;
- 参数设置
- 显示的参数名是策略里写在parameters列表中的参数名;
- 默认数值为策略里的参数的默认值;
- 由上图可观察到,参数名后面<>括号中显示的是该参数的数据类型,在填写参数时应遵循相应的数据类型。其中,<class 'str'>是字符串、<class 'int'>是整数、<class 'float'>是浮点数;
- 请注意,如果某个参数可能会调整至有小数位的数值,而默认参数值是整数(比如1)。请在编写策略时,把默认参数值设为浮点数(比如1.0)。否则策略会默认该项参数为整数,在后续【编辑】策略实例参数时,会只允许填进整数。
参数配置完成后,点击【添加】按钮,则开始创建策略实例。创建成功后可在左侧的策略监控组件中看到该策略实例,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_strategy/47.png)
策略监控组件顶部显示的是策略实例名、合约品种名、策略类名以及策略作者名(在策略里定义的author)。顶部按钮用于控制和管理策略实例,第一行表格显示了策略内部的参数信息(参数名需要写在策略的parameters列表中图形界面才会显示),第二行表格则显示了策略运行过程中的变量信息(变量名需要写在策略的variables列表中图形界面才会显示)。【inited】字段表示当前策略的初始化状态(是否已经完成了历史数据回放),【trading】字段表示策略当前是否能够开始交易。
从上图可观察到,此时该策略实例的【inited】和【trading】状态都为【False】。说明该策略实例还没有初始化,也还不能发出交易信号。
策略实例创建成功后,该策略实例的配置信息会被保存到.vntrader文件夹下的cta_strategy_setting.json文件中。
### 创建失败
以下为创建策略实例失败的几种可能情况:
- 如果添加了同名的策略实例,则会创建失败,图形界面输出“创建策略失败,存在重名”的日志信息,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_strategy/48.png)
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_strategy/49.png)
- 如果合约品种没有填写交易所名称,则会创建失败,图形界面输出“创建策略失败,本地代码缺失交易所后缀”的日志信息,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_strategy/50.png)
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_strategy/51.png)
- 如果合约品种的交易所名称填错,则会创建失败,图形界面输出“创建策略失败,本地代码的交易所后缀不正确”的信息,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_strategy/52.png)
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_strategy/53.png)
## 管理策略
### 初始化
策略实例创建成功后,就可以对该实例进行初始化了。点击该策略实例下的【初始化】按钮,若初始化成功,则如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_strategy/54.png)
初始化过程中,主要按顺序完成了以下三步任务:
1. 获取历史数据
为了确保策略内指标数值的准确性,每个策略实例都需要一定的历史数据来进行策略初始化。
因此,在策略初始化时,策略实例内部的load_bar函数会先去接口获取最新历史数据。如果接口不提供历史数据,则通过配置的数据服务获取(以RQData为例,[RQData](https://www.ricequant.com/welcome/purchase?utm_source=vnpy)提供国内期货、股票以及期权的历史数据。RQData的数据服务提供盘中K线更新,即使在9点45分才启动策略,也能获取到之前从9点30开盘到9点45分之间的K线数据,提供给策略进行初始化计算,而不用担心数据缺失的问题)。如果没有配置数据服务,则通过访问本地数据库查询。这种情况下,用户需要保证数据库中的数据完整性(满足初始化需求),可以通过DataRecorder录制,或者使用DataManager从CSV文件导入。
具体载入数据的长度,取决于load_bar函数的参数控制(策略模板默认是10天)。数据载入后会以逐根K线(或者Tick)的方式推送给策略,实现内部变量的初始化计算,比如缓存K线序列、计算技术指标等。
2. 载入缓存变量
在每天实盘运行的过程中,量化策略中的有些变量只和历史行情数据相关,这类变量通过加载历史数据回放就能得到正确的数值。另一类变量则可能和交易状态相关,如策略的持仓、移动止损的最高价跟踪等,这类变量需要缓存在硬盘上(退出程序时),第二天回放完历史数据后再读取还原,才能保证和之前交易状态的一致性。
每次停止策略时,会自动将策略的variables列表对应的变量以及策略持仓缓存进.vntrader目录下的cta_strategy_data.json文件中,以便在下一次策略初始化时自动载入。
请注意,在某些情况下(比如手动平仓了),缓存的数据可能会出现偏差(因为策略持仓维护的是运行策略实例的逻辑持仓,不是特定品种的持仓),那么可以通过手动修改json文件来调整。
3. 订阅行情推送
最后基于vt_symbol参数获取该策略所交易合约的信息,并订阅该合约的实时行情推送。如果实盘交易系统找不到该合约的信息,比如没有连接登录接口或者vt_symbol填写错误,则会在日志模块中输出相应的报错信息。
以上三个步骤完成后,可观察到此时该策略实例的【inited】状态已经为【True】,且变量也都显示对应的数值(不再为0)。说明该策略实例已经调用过load_bar函数加载历史数据并完成初始化了。【trading】状态还是为【False】,说明此时该策略实例还不能开始自动交易。
### 初始化失败
以下为创建策略实例失败的几种可能情况:
- 即使交易所填的是VeighNa支持的交易所的名字,成功创建了策略实例。但是如果该合约名字输入错误(比如大小写错误,合约与交易所对不上或者已经退市),导致实盘交易系统找不到该合约,则会初始化失败。此时图形界面输出“行情订阅失败,找不到合约”的日志。如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_strategy/55.png)
- 即使合约代码填写正确,成功创建了策略实例。但是如果此时还没有连接接口,或者接口合约信息查询合约操作还没有完成,导致实盘交易系统找不到该合约,也会初始化失败。此时图形界面输出“行情订阅失败,找不到合约”的日志。如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_strategy/56.png)
如果出现了“行情订阅失败,找不到合约”这类问题,可以通过VeighNa Trader的主界面点击【帮助】-【查询合约】进行查询,找到正确的合约信息。如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_strategy/57.png)
- 如果策略内用到了K线时间序列管理模块(ArrayManager)来计算变量指标的值,那么请确保历史数据的长度足够ArrayManager进行初始化(默认的ArrayManager需要100条数据才能初始化成功)。如果历史数据的长度不够ArrayManager初始化,即使图形界面上输出了日志“初始化完成”,该策略实例的初始化也是失败的。
- 如果策略逻辑是基于示例策略中的,一但ArrayManager没有初始化成功(if not am.inited)就返回了逻辑写的话,那么由下图可观察到,图形界面左侧的策略实例中基于ArrayManager计算的策略指标的值都是0。说明此时该策略实例虽然启动之后就可以开始自动交易了,但是因为ArrayManager没有初始化成功,策略内的逻辑每次走到ArrayManager初始化状态判断时就返回了,走不到计算指标进而发出交易信号的逻辑。进而该策略实例需要一直等到推进策略实例的数据足够ArrayManager初始化之后,满足ArrayManager初始化的判断条件,才能真正发出交易信号。
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_strategy/58.png)
- 如果策略逻辑不是基于示例策略中的,一但ArrayManager没有初始化成功(if not am.inited)就返回的逻辑写的话,那么虽然图形界面左侧的策略实例中的策略指标有具体数值,而且此时启动可以发出交易信号,无需等待ArrayManager初始化完成。但是因为ArrayManager没有初始化成功,该策略实例计算出来的变量指标值是不准确的,进而可能会发出不符合策略预期的交易信号。
### 启动
策略实例初始化成功,【inited】状态为【True】时,才能启动自动交易功能。点击策略实例下的【启动】按钮,即可启动该策略实例。成功后如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_strategy/59.png)
可观察到此时该策略实例的【inited】和【trading】状态都为【True】。说明此时该策略实例已经调用过load_bar函数,完成了历史数据回放,而且此时策略内部的交易请求类函数(buy/sell/short/cover/cancel_order等),以及信息输出类函数(send_email/put_event等),才会真正执行并发出对应的请求指令到底层接口中(真正执行交易)。
在上一步策略初始化的过程中,尽管策略同样在接收(历史)数据,并调用对应的功能函数,但因为【trading】状态为【False】,所以并不会有任何真正的委托下单操作或者交易相关的日志信息输出。
如果启动之后,策略发出了限价单,可以去VeighNa Trader主界面【委托】栏查看委托订单细节。如果策略发出了本地停止单,可以在CTA策略UI界面右上方区域的停止单监控组件查看委托订单细节。
### 停止
如果启动策略之后,由于某些情况(如到了市场收盘时间,或盘中遇到紧急情况)想要停止、编辑或者移除策略,可以点击策略实例下的【停止】按钮,即可停止该策略实例的自动交易。成功后如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_strategy/60.png)
CTA策略引擎会自动将该策略之前发出的所有活动委托全部撤销,以保证在策略停止后不会有失去控制的委托存在。同时该策略实例最新的变量信息会被保存到.vntrader文件夹下的cta_strategy_data.json文件中。
此时可观察到该策略实例的【trading】状态已变为【False】,说明此时该策略实例已经停止自动交易了。
在CTA策略的实盘交易过程中,正常情况应该让策略在整个交易时段中都自动运行,尽量不要有额外的暂停重启类操作。对于国内期货市场来说,应该在交易时段开始前,启动策略的自动交易,然后直到收盘后,再关闭自动交易。因为现在CTP夜盘收盘后也会关闭系统,早上开盘前重启,所以夜盘收盘后也需要停止策略,关闭VeighNa Trader了。
### 编辑
如果创建策略实例之后,想要编辑某个策略实例的参数(若已启动策略,需要先点击策略实例下的【停止】按钮,停止策略),可以点击该策略实例下的【编辑】按钮,会弹出参数编辑对话框,以供修改策略参数。如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_strategy/61.png)
编辑完策略参数之后,点击下方的【确定】按钮,相应的修改会立即更新在参数表格中,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_strategy/62.png)
但是策略实例的交易合约代码无法修改,同时修改完后也不会重新执行初始化操作。也请注意,此时修改的只是.vntrader文件夹下cta_strategy_setting.json文件中该策略实例的参数值,并没有修改原策略文件下的参数。
修改前,json文件如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_strategy/63.png)
修改后,json文件如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_strategy/64.png)
若盘中编辑后想要再次启动策略,点击策略实例下的【启动】按钮即可再次启动该策略实例,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_strategy/65.png)
### 移除
如果创建策略实例之后,想要移除某个策略实例(若已启动策略,需要先点击策略实例下的【停止】按钮,停止策略),可以点击该策略实例下的【移除】按钮。移除成功后,图形界面左侧的策略监控组件中将不会再显示该策略实例的信息。如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_strategy/66.png)
此时.vntrader文件夹下的cta_strategy_setting.json文件也移除了该策略实例的配置信息。
### 状态跟踪
如果想要通过图形界面跟踪策略的状态,有两种方式:
1. 调用put_event函数
策略实例中所有的的变量信息,都需要把变量名写在策略的variables列表中,才能在图形界面显示。如果想跟踪变量的状态变化,则需要在策略中调用put_event函数,界面上才会进行数据刷新。
有时用户会发现自己写的策略无论跑多久,变量信息都不发生变化,这种情况请检查策略中是否漏掉了对put_event函数的调用。
2. 调用write_log函数
如果不仅想观察到变量信息的状态变化,还想根据策略的状态输出基于自己需求的个性化的日志,可以在策略中调用write_log函数,进行日志输出。
## 运行日志
### 日志内容
CTA策略模块UI界面上输出的日志有两个来源,分别是CTA策略引擎和策略实例。
**引擎日志**
CTA策略引擎一般输出的是全局信息。下图中除了以带中括号的策略实例名开头的内容之外,都是CTA策略引擎输出的日志。
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_strategy/67.png)
**策略日志**
如果在策略中调用了write_log函数,那么日志内容就会通过策略日志输出。下图红框里的内容分别是两个不同的策略实例输出的策略日志。中括号里是策略实例的名称,中括号后是write_log函数输出的内容。
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_strategy/68.png)
### 清空操作
如果想要清空CTA策略UI界面上的日志输出,可以点击右上角的【清空日志】按钮,则可一键清空该界面上已输出的日志。
点击【清空日志】前,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_strategy/66.png)
点击【清空日志】后,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_strategy/70.png)
## 停止单
图形界面右上方区域的停止单监控组件,是用来跟踪所有CTA引擎内本地停止单的状态变化的。
因为不是所有接口都支持停止单,所以VeighNa提供了本地停止单的功能。在交易接口不支持交易所停止单的前提下,用户依然可以通过策略的下单函数(buy/sell/short/cover),把stop参数设置为True,启用本地停止单功能。
VeighNa的本地停止单有三个特点:
1. 保存在本地电脑上,关机后则失效;
2. 只有交易员本人能够看到,不必担心泄露底牌;
3. 停止单触发有延时,导致一定的滑点。
**停止单信息**
在发出本地停止单后,图形界面右上方的监控组件就会显示停止单的委托细节。
本地停止单一共有【等待中】、【已触发】和【已撤销】三个状态,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_strategy/71.png)
停止单刚发出时是处于【等待中】的状态。因为停止单的信息记录在本地,没有发往交易所,所以此时主界面上【委托】栏不会有变化。
一旦该停止单的委托价格被触发,为了实现立即成交的目的,CTA策略引擎会立即以**涨跌停价**或者**盘口五档**的价格,去发出**限价**委托(所以建议本地停止单只用于流动性较好的合约)。限价委托发出后,VeighNa Trader主界面上【委托】栏将更新该订单的状态,此时停止单状态会变为【已触发】,【限价委托号】栏下也会填入该订单的限价委托号。
请注意,**停止单界面显示的价格是本地停止单的触发价格,而不是发出限价单的价格**。
如果停止单在被触发前就被策略取消了,那么该订单的状态就会变为【已撤销】。
## 批量操作
在策略经过充分测试,实盘运行较为稳定,不需要经常进行调整的情况下,如果有多个需要运行的CTA策略实例,可以使用界面右上角的【全部初始化】、【全部启动】和【全部停止】功能来执行盘前批量初始化、启动策略实例以及盘后批量停止策略实例的操作。
### 全部初始化
在所有策略实例创建成功后,点击右上角的【全部初始化】按钮,则可批量初始化策略实例。
点击【全部初始化】前,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_strategy/72.png)
点击【全部初始化】后,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_strategy/73.png)
### 全部启动
在所有策略实例初始化成功后,点击右上角的【全部启动】按钮,则可批量启动策略实例,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_strategy/74.png)
### 全部停止
在所有策略实例启动成功后,点击右上角的【全部停止】按钮,则可批量停止策略实例,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_strategy/75.png)
## 移仓助手
如需使用自动移仓助手,请在完成策略初始化之后,对要执行移仓的策略先点击【移仓助手】按钮,则会弹出移仓助手对话框,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_strategy/76.png)
首先请在在左侧区域配置要执行的移仓任务,其中:
- 移仓合约:该下拉框中,显示当前CTA策略模块下所有策略实例所交易的合约本地代码,选择要平仓掉的老合约;
- 目标合约:要将老的仓位和策略,移仓过去的的合约本地代码(vt_symbol),输入要开仓的新合约;
- 委托超价:执行移仓交易时,委托价格相对于当时盘口对价超出的pricetick。
完成配置确认无误后,点击【移仓】按钮开始执行,移仓过程中会有下图所示的日志输出,完成后该对话框会被设为锁死(变灰无法再点击):
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_strategy/77.png)
可以看到几乎1秒内就完成了移仓合约对应的全部仓位和策略的移仓操作,同时CTA策略模块界面上的策略交易代码已经变为目标合约。
移仓过程中具体执行的任务步骤如下:
- 仓位移仓:
- 对当前账户内,移仓合约的【所有仓位】进行平仓(注意这里不会区分策略持仓还是手动交易持仓),并记录对应的仓位(多空分别记录);
- 对目标合约执行开仓交易,开仓的价格为当时的盘口对价加上超价pricetick,数量为上一步中记录的原有移仓合约持仓量。
- 策略移仓:
- 记录当前CTA策略模块中,所有交易对象为移仓合约的策略的【逻辑持仓】(注意这里的逻辑持仓和账户实际持仓不一定完全对应);
- 将上述交易对象为移仓合约的老策略实例删除,并创建以目标合约为交易标的同名新策略实例;
- 初始化新策略实例,并将之前记录的老策略实例的【逻辑持仓】,更新到新策略的状态上。
回到VeighNa Trader主界面,也可以查看到详细的移仓委托和成交记录。如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_strategy/78.png)
## CTA策略模板(CtaTemplate
CTA策略模板提供了信号生成和委托管理功能,用户可以基于该模板(位于site-packages\vnpy_ctastrategy\template中)自行开发CTA策略。
用户自行开发的策略可以放在用户运行文件夹下的[strategies](#jump)文件夹内。
请注意:
1. 策略文件命名采用下划线模式,如boll_channel_strategy.py,而策略类命名采用驼峰式,如BollChannelStrategy。
2. 自建策略的类名不要与示例策略的类名重合。如果重合了,图形界面上只会显示一个策略类名。
下面通过BollChannelStrategy策略示例,来展示策略开发的具体步骤:
在基于CTA策略模板编写策略逻辑之前,需要在策略文件的顶部载入需要用到的内部组件,如下方代码所示:
```python3
from vnpy_ctastrategy import (
CtaTemplate,
StopOrder,
TickData,
BarData,
TradeData,
OrderData,
BarGenerator,
ArrayManager
)
```
其中,CtaTemplate是CTA策略模板,StopOrder、TickData、BarData、TradeData和OrderData都是储存对应信息的数据容器,BarGenerator是K线生成模块,ArrayManager是K线时间序列管理模块。
### 策略参数与变量
在策略类的下方,可以设置策略的作者(author),参数(parameters)以及变量(variables),如下方代码所示:
```python3
author = "用Python的交易员"
boll_window = 18
boll_dev = 3.4
cci_window = 10
atr_window = 30
sl_multiplier = 5.2
fixed_size = 1
boll_up = 0
boll_down = 0
cci_value = 0
atr_value = 0
intra_trade_high = 0
intra_trade_low = 0
long_stop = 0
short_stop = 0
parameters = [
"boll_window",
"boll_dev",
"cci_window",
"atr_window",
"sl_multiplier",
"fixed_size"
]
variables = [
"boll_up",
"boll_down",
"cci_value",
"atr_value",
"intra_trade_high",
"intra_trade_low",
"long_stop",
"short_stop"
]
```
虽然策略的参数和变量都从属于策略类,但策略参数是固定的(由交易员从外部指定),而策略变量则在交易的过程中随着策略的状态而变化,所以策略变量一开始只需要初始化为对应的基础类型。例如:整数设为0,浮点数设为0.0,而字符串则设为""。
如果需要CTA引擎在运行过程中,将策略参数和变量显示在UI界面上,并在数据刷新、停止策略时保存其数值,则需把参数和变量的名字(以字符串的数据类型)添加进parameters和variables列表里。
请注意,该列表只能接受参数或变量以str、int、float和bool四种数据类型传入。如果策略里需要用到其他数据类型的参数与变量,请把该参数或变量的定义放到__init__函数下。
### 类的初始化
入参:cta_engine: Any, strategy_name: str, vt_symbol: str, setting: dict
出参:无
__init__函数是策略类的构造函数,需要与继承的CtaTemplate保持一致。
在这个继承的策略类里,初始化一般分三步,如下方代码所示:
```python3
def __init__(self, cta_engine, strategy_name, vt_symbol, setting):
""""""
super().__init__(cta_engine, strategy_name, vt_symbol, setting)
self.bg = BarGenerator(self.on_bar, 15, self.on_15min_bar)
self.am = ArrayManager()
```
1 . 通过super( )的方法继承CTA策略模板,在__init__( )函数中传入CTA引擎、策略名称、vt_symbol以及参数设置。注意其中的CTA引擎,可以是实盘引擎或者回测引擎,这样可以方便地**实现同一套代码同时跑回测和实盘**(以上参数均由策略引擎在使用策略类创建策略实例时自动传入,用户无需进行设置)。
2 . 调用K线生成模块(BarGenerator):通过时间切片将Tick数据合成1分钟K线数据。如有需求,还可合成更长的时间周期数据,如15分钟K线。
如果只基于on_bar进行交易,这里代码可以写成:
```python3
self.bg = BarGenerator(self.on_bar)
```
而不用给bg实例传入需要基于on_bar周期合成的更长K线周期,以及接收更长K线周期的函数名。
请注意,合成X分钟线时,X必须设为能被60整除的数(60除外)。对于小时线的合成没有这个限制。
BarGenerator默认的基于on_bar函数合成长周期K线的数据频率是分钟级别,如果需要基于合成的小时线或者更长周期的K线交易,请在策略文件顶部导入Interval,并传入对应的数据频率给bg实例。如下方代码所示:
文件顶部导入Interval
```python3
from vnpy.trader.constant import Interval
```
__init__函数创建bg实例时传入数据频率:
```python3
self.bg = BarGenerator(self.on_bar, 2, self.on_2hour_bar, Interval.HOUR)
```
3 . 调用K线时间序列管理模块(ArrayManager):基于K线数据,如1分钟、15分钟,
将其转化为便于向量化计算的时间序列数据结构,并在内部支持使用talib库来计算相应的技术指标。
ArrayManager的默认长度为100,如需调整ArrayManager的长度,可传入size参数进行调整(size不能小于计算指标的周期长度)。
### CTA策略引擎调用的函数
CtaTemplate中的update_setting函数和该函数后面四个以get开头的函数,都是CTA策略引擎去负责调用的函数,一般在策略编写的时候是不需要调用的。
### 策略的回调函数
CtaTemplate中以on开头的函数称为回调函数,在编写策略的过程中能够用来接收数据或者接收状态更新。回调函数的作用是当某一个事件发生的时候,策略里的这类函数会被CTA策略引擎自动调用(无需在策略中主动操作)。回调函数按其功能可分为以下三类:
#### 策略实例状态控制(所有策略都需要)
**on_init**
* 入参:无
* 出参:无
初始化策略时on_init函数会被调用,默认写法是先调用write_log函数输出“策略初始化”日志,再调用load_bar函数加载历史数据,如下方代码所示:
```python3
def on_init(self):
"""
Callback when strategy is inited.
"""
self.write_log("策略初始化")
self.load_bar(10)
```
请注意,如果是基于Tick数据回测,请在此处调用load_tick函数。
策略初始化时,策略的inited和trading状态都为【False】,此时只是调用ArrayManager计算并缓存相关的计算指标,不能发出交易信号。调用完on_init函数之后,策略的inited状态才变为【True】,策略初始化才完成。
**on_start**
* 入参:无
* 出参:无
启动策略时on_start函数会被调用,默认写法是调用write_log函数输出“策略启动”日志,如下方代码所示:
```python3
def on_start(self):
"""
Callback when strategy is started.
"""
self.write_log("策略启动")
```
调用策略的on_start函数启动策略后,策略的trading状态变为【True】,此时策略才能够发出交易信号。
**on_stop**
* 入参:无
* 出参:无
停止策略时on_stop函数会被调用,默认写法是调用write_log函数输出“策略停止”日志,如下方代码所示:
```python3
def on_stop(self):
"""
Callback when strategy is stopped.
"""
self.write_log("策略停止")
```
调用策略的on_stop函数停止策略后,策略的trading状态变为【False】,此时策略就不会发出交易信号了。
#### 接收数据、计算指标、发出交易信号
**on_tick**
* 入参:tick: TickData
* 出参:无
绝大部分交易系统都只提供Tick数据的推送。即使一部分平台可以提供K线数据的推送,但是这些数据到达本地电脑的速度也会慢于Tick数据的推送,因为也需要平台合成之后才能推送过来。所以实盘的时候,VeighNa里所有的策略的K线都是由收到的Tick数据合成的。
当策略收到最新的Tick数据的行情推送时,on_tick函数会被调用。默认写法是通过BarGenerator的update_tick函数把收到的Tick数据推进前面创建的bg实例中以便合成1分钟的K线,如下方代码所示:
```python3
def on_tick(self, tick: TickData):
"""
Callback of new tick data update.
"""
self.bg.update_tick(tick)
```
**on_bar**
* 入参:bar: BarData
* 出参:无
当策略收到最新的K线数据时(实盘时默认推进来的是基于Tick合成的一分钟的K线,回测时则取决于选择参数时填入的K线数据频率),on_bar函数就会被调用。示例策略里出现过的写法有两种:
1 . 如果策略基于on_bar推进来的K线交易,那么请把交易请求类函数都写在on_bar函数下(因本次示例策略类BollChannelStrategy不是基于on_bar交易,故不作示例讲解。基于on_bar交易的示例代码可参考其他示例策略);
2 . 如果策略需要基于on_bar推进来的K线数据通过BarGenerator合成更长时间周期的K线来交易,那么请在on_bar中调用BarGenerator的update_bar函数,把收到的这个bar推进前面创建的bg实例中即可,如下方代码所示:
```python3
def on_bar(self, bar: BarData):
"""
Callback of new bar data update.
"""
self.bg.update_bar(bar)
```
示例策略类BollChannelStrategy是通过15分钟K线数据回报来生成CTA信号的。一共有三部分,如下方代码所示:
```python3
def on_15min_bar(self, bar: BarData):
""""""
self.cancel_all()
am = self.am
am.update_bar(bar)
if not am.inited:
return
self.boll_up, self.boll_down = am.boll(self.boll_window, self.boll_dev)
self.cci_value = am.cci(self.cci_window)
self.atr_value = am.atr(self.atr_window)
if self.pos == 0:
self.intra_trade_high = bar.high_price
self.intra_trade_low = bar.low_price
if self.cci_value > 0:
self.buy(self.boll_up, self.fixed_size, True)
elif self.cci_value < 0:
self.short(self.boll_down, self.fixed_size, True)
elif self.pos > 0:
self.intra_trade_high = max(self.intra_trade_high, bar.high_price)
self.intra_trade_low = bar.low_price
self.long_stop = self.intra_trade_high - self.atr_value * self.sl_multiplier
self.sell(self.long_stop, abs(self.pos), True)
elif self.pos < 0:
self.intra_trade_high = bar.high_price
self.intra_trade_low = min(self.intra_trade_low, bar.low_price)
self.short_stop = self.intra_trade_low + self.atr_value * self.sl_multiplier
self.cover(self.short_stop, abs(self.pos), True)
self.put_event()
```
- 清空未成交委托:为了防止之前下的单子在上一个15分钟没有成交,但是下一个15分钟可能已经调整了价格,就用cancel_all()方法立刻撤销之前未成交的所有委托,保证策略在当前这15分钟开始时的整个状态是清晰和唯一的;
- 调用K线时间序列管理模块:基于最新的15分钟K线数据来计算相应的技术指标,如布林带通道上下轨、CCI指标、ATR指标等。首先获取ArrayManager对象,然后将收到的K线推送进去,检查ArrayManager的初始化状态,如果还没初始化成功就直接返回,没有必要去进行后续的交易相关的逻辑判断。因为很多技术指标计算对最少K线数量有要求,如果数量不够的话计算出来的指标会出现错误或无意义。反之,如果没有return,就可以开始计算技术指标了;
- 信号计算:通过持仓的判断以及结合CCI指标、布林带通道、ATR指标在通道突破点挂出停止单委托(buy/sell),同时设置离场点(short/cover)。
请注意,如果需要在图形界面刷新指标数值,请不要忘记调用put_event()函数。
#### 委托状态更新
以下函数在策略中可以直接pass,其具体逻辑应用交给回测/实盘引擎负责。
**on_trade**
* 入参:trade: TradeData
* 出参:无
收到策略成交回报时on_trade函数会被调用。
**on_order**
* 入参:order: OrderData
* 出参:无
收到策略委托回报时on_order函数会被调用。
**on_stop_order**
* 入参:stop_order: StopOrder
* 出参:无
收到策略停止单回报时on_stop_order函数会被调用。
### 主动函数
**buy**:买入开仓(DirectionLONGOffsetOPEN
**sell**:卖出平仓(DirectionSHORTOffsetCLOSE
**short**:卖出开仓(DirectionSHORTOffsetOPEN
**cover**:买入平仓(DirectionLONGOffsetCLOSE
* 入参:price: float, volume: float, stop: bool = False, lock: bool = False, net: bool = False
* 出参:vt_orderids: List[vt_orderid] / 无
buy/sell/short/cover都是策略内部的负责发单的交易请求类函数。策略可以通过这些函数给CTA策略引擎发送交易信号来达到下单的目的。
以下方buy函数的代码为例,可以看到,价格和数量是必填的参数,停止单转换、锁仓转换和净仓转换则默认为False。也可以看到,函数内部收到传进来的参数之后就调用了CtaTemplate里的send_order函数来发单(因为是buy指令,则自动把方向填成了LONG,开平填成了OPEN)
如果stop设置为True,那么该笔订单则会自动转成停止单,如果接口支持交易所停止单则会转成交易所停止单,如果接口不支持交易所停止单则会转换成VeighNa的本地停止单。
如果lock设置为True,那么该笔订单则会进行锁仓委托转换(在有今仓的情况下,且交易的交易所不是指定平今平昨的交易所,会直接反向开仓。在有昨仓的情况下,如果想平仓,则会先平掉所有的昨仓,然后剩下的部分都进行反向开仓来代替平今仓,以避免平今的手续费惩罚)。
如果net设置为True,那么该笔订单则会进行净仓委托转换(基于整体账户的所有仓位,根据净仓持有方式来对策略下单的开平方向进行转换)。但是净仓交易模式与锁仓交易模式互斥,因此net设置为True时,lock必须设置为False。
请注意,如果向上期所发出平仓委托,因为该交易所必须指定平今、平昨,底层会对其平仓指令自动进行转换。因为上期所部分品种有平今优惠,所以默认是以平今优先的方式发出委托的(如果交易的标的在上期所平昨更优惠的话,可以自行在vnpy.trader.converter的convert_order_request_shfe函数中做适当的修改)。
```python3
def buy(self, price: float, volume: float, stop: bool = False, lock: bool = False, net: bool = False):
"""
Send buy order to open a long position.
"""
return self.send_order(Direction.LONG, Offset.OPEN, price, volume, stop, lock, net)
```
请注意,国内期货有开平仓的概念,例如买入操作要区分为买入开仓和买入平仓;但对于股票、外盘期货都是净持仓模式,没有开仓和平仓概念,所以只需使用买入(buy)和卖出(sell)这两个指令就可以了。
**send_order**
* 入参:direction: Direction, offset: Offset, price: float, volume: float, stop: bool = False, lock: bool = False, net: bool = False
* 出参:vt_orderids / 无
send_order函数是CTA策略引擎调用的发送委托的函数。一般在策略编写的时候不需要单独调用,通过buy/sell/short/cover函数发送委托即可。
实盘的时候,收到传进来的参数后,会调用round_to函数基于合约的pricetick和min_volume对委托的价格和数量进行处理。
请注意,要在策略启动之后,也就是策略的trading状态变为【True】之后,才能发出交易委托。如果策略的Trading状态为【False】时调用了该函数,只会返回[]。
**cancel_order**
* 入参:vt_orderid: str
* 出参:无
**cancel_all**
* 入参:无
* 出参:无
cancel_order和cancel_all都是负责撤单的交易请求类函数。cancel_order是撤掉策略内指定的活动委托,cancel_all是撤掉策略所有的活动委托。
请注意,要在策略启动之后,也就是策略的trading状态变为【True】之后,才能撤单。
### 功能函数
以下为策略以外的功能函数:
**write_log**
* 入参:msg: str
* 出参:无
在策略中调用write_log函数,可以进行指定内容的日志输出。
**get_engine_type**
* 入参:无
* 出参:engine_type: EngineType
如果策略对于回测和实盘时有不同的逻辑处理,可以调用get_engine_type函数获取当下使用的引擎类型来进行逻辑判断。
请注意,如果要调用该函数进行逻辑判断,请在策略文件顶部导入“EngineType”。
**get_pricetick**
* 入参:无
* 出参:pricetick: float / None
在策略中调用get_pricetick函数,可以获取交易合约的最小价格跳动。
**load_bar**
* 入参:days: int, interval: Interval = Interval.MINUTE, callback: Callable = None, use_database: bool = False
* 出参:无
在策略中调用load_bar函数,可以在策略初始化时加载K线数据。
如下方代码所示,调用load_bar函数时,默认加载的天数是10,频率是一分钟,对应也就是加载10天的1分钟K线数据。10天指的是10个自然日,建议加载的天数宁可多一些也不要太少。use_database参数默认为False,会先依次尝试通过交易接口、数据服务、数据库获取历史数据,直到获取历史数据或返回空。当use_database设置为True后,会跳过通过交易接口和数据服务获取历史数据,直接去数据库查询。
```python3
def load_bar(
self,
days: int,
interval: Interval = Interval.MINUTE,
callback: Callable = None,
use_database: bool = False
):
"""
Load historical bar data for initializing strategy.
"""
if not callback:
callback = self.on_bar
self.cta_engine.load_bar(
self.vt_symbol,
days,
interval,
callback,
use_database
)
```
**load_tick**
* 入参:days: int
* 出参:无
在策略中调用load_tick函数,可以在策略初始化时加载Tick数据。
**put_event**
* 入参:无
* 出参:无
在策略中调用put_event函数,可以通知图形界面刷新策略状态相关显示。
请注意,要策略初始化完成,inited状态变为【True】之后,才能刷新界面。
**send_email**
* 入参:msg: str
* 出参:无
配置好邮箱相关信息之后(配置方法详见基本使用篇的全局配置部分),在策略中调用send_email函数,可以发送指定内容的邮件到自己的邮箱。
请注意,要策略初始化完成,inited状态变为【True】之后,才能发送邮件。
**sync_data**
* 入参:无
* 出参:无
在策略中调用sync_data函数,可以在实盘交易的时候,每次停止或成交时都同步策略变量到对应json文件中进行本地缓存,方便第二天初始化时再进行读取还原(CTA策略引擎会去调用,在策略里无需主动调用)。
请注意,要在策略启动之后,也就是策略的trading状态变为【True】之后,才能同步策略信息。
+192
View File
@@ -0,0 +1,192 @@
# DataManager - 历史数据管理模块
## 功能简介
DataManager是用于**历史数据管理**的功能模块,用户可以通过其UI界面操作来便捷完成数据下载、数据查看、数据导入和数据导出等任务。
## 加载启动
### VeighNa Station加载
启动登录VeighNa Station后,点击【交易】按钮,在配置对话框中的【应用模块】栏勾选【DataManager】。
### 脚本加载
在启动脚本中添加如下代码:
```python3
# 写在顶部
from vnpy_datamanager import DataManagerApp
# 写在创建main_engine对象后
main_engine.add_app(DataManagerApp)
```
## 启动模块
启动VeighNa Trader后,在菜单栏中点击【功能】-> 【数据管理】,或者点击左侧按钮栏的图标:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/data_manager/00.png)
即可进入历史数据管理UI界面,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/data_manager/1.png)
## 下载数据
DataManager模块提供了一键下载历史数据的功能,点击右上角【下载数据】按钮,会弹出下载历史数据窗口,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/data_manager/2.png)
需要填写代码、交易所、周期以及开始日期四个字段信息:
<span id="jump">
- 代码
- 代码格式为合约品种
- 如IF888、rb2105
- 交易所
- 合约交易的交易所(点击窗口右侧箭头按钮可选择VeighNa支持的交易所列表)
- 周期
- MINUTE1分钟K线)
- HOUR1小时K线)
- DAILY(日K线)
- WEEKLY(周K线)
- TICK(一个Tick
- 开始日期
- 格式为yy/mm/dd
- 如2018/2/25
</span>
填写完成后,点击下方【下载】按钮启动下载程序,下载成功如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/data_manager/3.png)
注意下载完成后的历史数据会保存在本地数据库中,后续回测或实盘时可以直接使用,无需每次都重复下载。
### 数据来源:数据服务(期货、股票、期权)
以RQData为例,[RQData](https://www.ricequant.com/welcome/purchase?utm_source=vnpy)提供国内期货、股票以及期权的历史数据。在使用前需要保证数据服务已经正确配置(配置方法详见基本使用篇的全局配置部分)。
### 数据来源:IB(外盘期货、股票、现货等)
Interactive Brokers盈透证券(IB)提供丰富的外盘市场历史数据下载(包括股票、期货、期权、现货等),注意下载前需要先启动IB TWS交易软件,并在VeighNa Trader主界面连接好IB接口,并订阅所需合约行情。
## 导入数据
如果已经从其他渠道获取到了CSV格式的数据文件,可以通过DataManager的数据导入功能,将其快速导入VeighNa数据库。点击右上角的【导入数据】按钮,会弹出从如下图所示的对话框:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/data_manager/21.png)
点击顶部的【选择文件】按钮,会弹出窗口选择要导入的CSV文件路径,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/data_manager/5.png)
然后配置数据导入的相关细节:
- 合约信息
- 格式详见本章[下载数据](#jump)部分的介绍;
- 请注意,导入的合约代码(symbol)和交易所(exchange)两个字段组合起来,才能构成在CTA回测等模块中使用的本地代码(vt_symbol);
- 若合约代码为**IF2003**,交易所选择**CFFEX**(中金所),则在CtaBacktester中回测要用到的本地代码应为**IF2003.CFFEX**
- 可以对时间戳时区进行选择;
- 表头信息
- 可查看CSV文件的表头信息,并将对应的表头字符串输入在表头信息中;
- 对于CSV文件中不存在的字段(如股票数据没有【持仓量】字段),请留空即可;
- 格式信息
- 采用Python内置库datetime模块的时间格式定义,来解析时间戳字符串;
- 默认时间格式为"%Y-%m-%d %H:%M:%S",对应的是"2017-1-3 0:00:00"
- 如果时间戳是"2017-1-3 0:00",那么时间格式应该是"%Y-%m-%d %H:%M"。
填写完毕,则如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/data_manager/22.png)
点击【确定】按钮,开始从CSV文件导入数据到数据库中。导入过程中界面会处于半卡住的情况,CSV文件越大(数据量越多),卡住的时间也会越长。成功载入之后,会弹出窗口显示载入成功,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/data_manager/20.png)
## 查看数据
目前VeighNa Trader中获取数据的方式一共有三种:
- 通过数据服务或者交易接口下载
- 从CSV文件导入
- 使用DataRecorder模块录制
不管采用何种方法获取数据,点击左上角的【刷新】按钮,即可看到当前数据库中已有数据的统计情况(Tick数据除外)。刷新过程中界面可能会有偶尔的卡顿,通常对于越多的数据,卡顿的时间也会越长。刷新成功之后,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/data_manager/7.png)
点击【查看】按钮,则会弹出选择数据要查看数据区间的对话框,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/data_manager/10.png)
选择好要显示的数据范围后,点击【确定】按钮即可在右侧表格中看到每个时间点上具体的数据字段:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/data_manager/11.png)
在数据库已有数据的前提下,点击表格最左侧【数据】列下的数据频率前的小箭头,则可展开或收起该数据频率下的合约信息显示。
若表格的右侧区域显示不完整,可拖动界面底端的横向滚动条进行调整。
## 导出数据
如果想导出数据库中的数据到本地CSV文件,则可选择要导出的合约,点击该合约所在行右侧的【导出】按钮后,会弹出选择数据区间对话框,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/data_manager/8.png)
选择要导出的数据区间范围,点击【确定】后,会再次弹出对话框选择输出文件的位置,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/data_manager/9.png)
选择好导出文件要放置的目录,填写完CSV文件名之后,点击【保存】按钮即可完成CSV文件的导出。
## 删除数据
若想删除特定合约数据,则可选择要删除的合约,点击该合约行数据右侧的【删除】按钮后,会弹出对话框,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/data_manager/12.png)
点击【OK】按钮即可删除该合约数据,并弹出删除成功窗口,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/data_manager/13.png)
此时再点击【刷新】按钮,图形界面上已经没有该合约的信息了,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/data_manager/14.png)
## 更新数据
在用户**配置了数据服务**或者**交易接口(已连接)提供充足的历史数据**的情况下,点击右上角的【更新数据】按钮,即可基于图形界面上显示的所有合约数据,执行一键自动下载更新。
更新前图形界面显示如下图:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/data_manager/17.png)
点击【更新数据】按钮,会弹出更新进度的信息提示对话框,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/data_manager/19.png)
此时DataManager会自动**从数据库中已有数据的结束日期开始,下载截止到当前最新日期**的数据,并更新到数据库中。
如果需要更新的数据较少,则可能瞬间完成更新任务,此时没有观察到更新对话框也是正常的。
更新完成后,点击左上角【刷新】按钮,即可看到该合约数据已更新至当前最新日期。
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/data_manager/18.png)
## 数据范围
请注意,虽然界面上显示了数据库中已有数据的开始和结束时间,**但并不代表数据库中储存了从开始时间到结束时间之间所有的数据**。
如果依赖于交易接口提供的历史数据,一但开始时间和结束时间之间的时间跨度超过接口所能提供的数据范围,就可能导致数据之间出现缺失的情况。因此建议更新数据之后,点击【查看】按钮检查一下该合约数据是否连续。
+69
View File
@@ -0,0 +1,69 @@
# DataRecorder - 实盘行情记录模块
DataRecorder是用于**实盘行情记录**的模块,用户可以利用该模块记录实时Tick数据和K线数据,并自动写入保存到数据库中。
记录的数据可以通过DataManager模块查看,也可以用于CtaBacktester的历史回测,以及CtaStrategy、PortfolioStrategy等策略的实盘初始化。
## 加载启动
### VeighNa Station加载
启动登录VeighNa Station后,点击【交易】按钮,在配置对话框中的【应用模块】栏勾选【DataRecorder】。
### 脚本加载
在启动脚本中添加如下代码:
```python3
# 写在顶部
from vnpy_datarecorder import DataRecorderApp
# 写在创建main_engine对象后
main_engine.add_app(DataRecorderApp)
```
## 启动模块
在启动模块之前,请先连接交易接口(连接方法详见基本使用篇的连接接口部分),看到VeighNa Trader主界面【日志栏】输出“合约信息查询成功”之后再启动模块,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_strategy/1.png)
请注意,IB接口因为登录时无法自动获取所有的合约信息,只有在用户手动订阅行情时才能获取。因此需要在主界面上先行手动订阅合约行情,再启动模块。
成功连接交易接口后,在菜单栏中点击【功能】-> 【行情记录】,或者点击左侧按钮栏的图标:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/data_recorder/1.png)
即可启动DataRecorder,并弹出DataRecorder的UI界面,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/data_recorder/4.png)
## 添加记录
DataRecorder模块支持按需添加K线(1分钟)和Tick数据的记录任务:
1. 在【本地代码】编辑框中输入需要录制的合约本地代码(vt_symbol),如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/data_recorder/5.png)
- 注意本地代码由代码前缀和交易所后缀两部分组成,如rb2112.SHFE
- 编辑框对于接口连接后收到的合约信息,提供自动补全功能(大小写敏感);
2. 在【写入间隔】编辑框中选择定时批量写入频率,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/data_recorder/6.png)
这样可以每次从队列中先取出所有待记录数据,再一次性把队列中已有数据写入数据库,从而降低数据库压力和记录延迟;
3. 点击右侧【K线记录】或者【Tick记录】对应的【添加】按钮添加录制任务:
- 添加成功后,合约本地代码会出现在下方的【K线记录列表】或者【Tick记录列表】中,并在界面下方输出对应日志,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/data_recorder/10.png)
## 移除记录
当不再需要记录某一合约的行情时,可以移除其对应的录制任务:
1. 在【本地代码】编辑框中输入需要移除录制任务的合约本地代码(vt_symbol);
2. 点击右侧【K线记录】或者【Tick记录】对应的【移除】按钮移除相应录制任务。
移除成功,【K线记录列表】或者【Tick记录列表】下对应的录制任务信息会被移除,并在界面下方输出对应日志,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/data_recorder/9.png)
+105
View File
@@ -0,0 +1,105 @@
# ExcelRtd - EXCEL RTD模块
## 功能简介
ExcelRtd是用于**在Excel中访问VeighNa程序内任意数据信息**的功能模块,
RTD全称是RealTimeData,是微软提供的主要面向金融行业中实时数据需求设计的Excel数据对接方案。ExcelRtd依赖于PyXLLC模块(www.pyxll.com),该模块属于商业软件,需要购买才能使用(提供30天免费使用)。
## 安装PyXLL
为了使用ExcelRtd模块,需要安装PyXLL插件。步骤如下:
首先进入[PyXLL官网](https://www.pyxll.com/),点击DownloadPyXLL,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/excel_rtd/excel_rtd_0.png)
接着跳转到下载界面,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/excel_rtd/13.png)
这时需要填写相应字段,其中**Python Version**选择Python3.10,而**Excel Version**则根据自己安装的Excel版本选择,一般为64bit(x64)。
填写完之后点击【Download PyXLL】,就会跳转到下载页面。将文件下载好之后,进入放置该文件的文件夹,按住shift键并且点击鼠标右键,选择【在此处打开PowerShell窗口】,运行以下命令:
```bash
pip install pyxll
pyxll install
```
接着按照软件要求就能成功安装了。
请注意,在执行到下图这一步时:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/excel_rtd/excel_rtd_9.png)
如果没有具体指定路径,会安装到图中的默认位置(因为后面还需要进入这个文件夹,所以请记住这个路径)。
接着进入该目录下的examples目录,并把路径~/veighna_studio/Lib/site-packages/vnpy_excelrtd/下的vnpy_rtd.py放入该目录,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/excel_rtd/excel_rtd_5.png)
如此就算正式安装完成了。
## 加载启动
### VeighNa Station加载
启动登录VeighNa Station后,点击【交易】按钮,在配置对话框中的【应用模块】栏勾选【ExcelRtd】。
### 脚本加载
在启动脚本中添加如下代码:
```python3
# 写在顶部
from vnpy_excelrtd import ExcelRtdApp
# 写在创建main_engine对象后
main_engine.add_app(ExcelRtdApp)
```
## 启动模块
在启动模块之前,请先连接交易接口(连接方法详见基本使用篇的连接接口部分)。看到VeighNa Trader主界面【日志】栏输出“合约信息查询成功”之后再启动模块,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_strategy/1.png)
请注意,IB接口因为登录时无法自动获取所有的合约信息,只有在用户手动订阅行情时才能获取。因此需要在主界面上先行手动订阅合约行情,再启动模块。
成功连接交易接口后,在菜单栏中点击【功能】 -> 【Excel RTD】,或者点击左侧按钮栏的图表:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/excel_rtd/excel_rtd_6.png)
即可进入Excel RTD模块的UI界面,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/excel_rtd/15.png)
## 功能和配置
### 基础应用
在启动Excel RTD模块后,即可在Excel表格中通过PyXll调用该模块提供的功能(主要是通过rtd_tick_data函数获取实时数据)。
首先打开一个excel表格,并且在每个单元格中调用rtd_tick_data函数并传入相应参数则可获取对应的数据,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/excel_rtd/14.png)
上图是获取豆油2205四个字段实时数据(分别是bid_price_1、high_price、low_price以及last_price)的例子。
从图中可以看出rtd_tick_data函数需要两个参数:一个是vt_symbol,另一个是VeighNa中定义的TickData的属性(具体属性可参考源代码vnpy.trader.object.TickData)。这两个参数都是字符串,第一个参数可以通过单元格的具体位置指定,比如“A1”表示A列第1行的数据。
与此同时,在Excel RTD模块的图形界面中也能看到相应输出,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/excel_rtd/16.png)
### 进阶应用
当然,上面只是简单的展示了ExcelRtd模块的功能。至于具体获取哪些数据,以什么样的方式展示在excel上,则由用户根据自己的实际需求编写。这里提供几个进阶的案例,包括期货市场报价跟踪、市场深度行情跟踪以及价差监控:
#### 期货市场报价跟踪
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/excel_rtd/excel_rtd_10.png)
#### 市场深度行情跟踪
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/excel_rtd/excel_rtd_11.png)
#### 价差监控
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/excel_rtd/excel_rtd_12.png)
+23
View File
@@ -0,0 +1,23 @@
策略应用
~~~~~~~~~
.. toctree::
:maxdepth: 2
:caption: Elite版
cta_strategy.md
cta_backtester.md
spread_trading.md
option_master.md
portfolio_strategy.md
algo_trading.md
script_trader.md
paper_account.md
data_recorder.md
data_manager.md
risk_manager.md
rpc_service.md
chart_wizard.md
portfolio_manager.md
excel_rtd.md
web_trader.md
+283
View File
@@ -0,0 +1,283 @@
# OptionMaster - 期权波动率交易模块
## 功能简介
OptionMaster是用于**期权波动率交易**的功能模块,用户可以通过OptionMaster完成期权实时定价、波动率曲面跟踪、持仓希腊值监控、组合压力测试、电子眼自动交易等功能。
## 加载启动
### VeighNa Station加载
启动登录VeighNa Station后,点击【交易】按钮,在配置对话框中的【应用模块】栏勾选【OptionMaster】。
### 脚本加载
在启动脚本中添加如下代码:
```python3
# 写在顶部
from vnpy_optionmaster import OptionMasterApp
# 写在创建main_engine对象后
main_engine.add_app(OptionMasterApp)
```
## 启动模块
启动VeighNa Trader后,在菜单栏中点击【功能】-> 【期权交易】,或者点击左侧按钮栏的图标:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/option_master/1.png)
即可进入OptionMaster管理界面(下称管理界面),如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/option_master/2.png)
## 配置组合
在管理界面上,选择要交易的期权产品,点击【配置】按钮打开如下图所示的组合配置对话框:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/option_master/3.png)
配置参数如下:
* 定价模型
* Black-76模型:针对欧式期货期权(股指期权);
* Black-Scholes模型:针对欧式股票期权(ETF期权);
* Binomial-Tree模型:针对美式期货期权(商品期权);
* 年化利率
* 定价模型中用到的无风险折现利率;
* 合约模式
* 正向:包括ETF期权、期货期权、股指期权等大多数产品;
* Greeks小数位
* 显示希腊值时保留的小数位数;
* 期权链对应的定价标的
* 注意只有选择了标的物的期权链,才会被加入交易组合;
* 定价标的物支持
* 期货合约:交易所本身提供的期货价格;
* 合成期货:基于期权价格算出的合成期货价格;
* OptionMaster在定价计算过程中会对标的物价格相对期权链的升贴水进行自动修正,因此推荐选择交易最活跃的合约作为标的物。
点击底部的【确认】按钮,完成期权组合的初始化,此时管理界面上的【配置】按钮会被锁定,而其他按钮则会被激活。
## 行情监控
点击管理界面的【T型报价】按钮,打开T型报价窗口:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/option_master/4.png)
窗口整体分为左右区域,中间白色列为行权价,左侧为看涨期权,右侧为看跌期权。
每行显示的为某一行权价期权对应的信息,从外向内显示的信息包括:
* 合约代码
* 期权的实时现金希腊值
* Vega
* Theta
* Gamma
* Delta
* 交易信息
* 持仓量
* 成交量
* 1档盘口信息
* 买隐波
* 买量
* 买价
* 卖价
* 卖量
* 卖隐波
* 净持仓
## 快速交易
点击管理界面的【快速交易】按钮,打开手动下单窗口:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/option_master/5.png)
整体使用方法和VeighNa Trader主界面的交易组件相似,输入合约代码、买卖方向、开平方向、交易价格和数量后,点击【委托】按钮即可发出限价委托,点击【全撤】按钮即可一键全撤当前的全部活动委托。
双击T型报价中某一期权的单元格,可以快速填充本窗口的【代码】编辑框。
## 持仓希腊值
点击管理界面的【持仓希腊值】按钮,打开希腊值风险监控窗口:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/option_master/16.png)
窗口中的监控信息分为四个维度:
* 交易组合(包括所有下属期权链和标的物汇总数据)
* 标的物合约
* 期权链(包括所有下属期权汇总数据)
* 期权合约
每个维度的监控信息包括:
* 持仓相关
* 多仓:当前的多头持仓
* 空仓:当前的空头持仓
* 净仓:多仓 - 空仓
* 总希腊值
* Delta:标的价格涨跌1%对应的该维度盈亏金额
* Gamma:标的价格涨跌1%对应的该维度的Delta变动
* Theta:每过去一个交易日,该维度的盈亏金额
* Vega:隐含波动率涨跌1%对应的该维度的盈亏金额
## 升贴水监控
点击管理界面的【升贴水监控】按钮,打开期权链定价升贴水校准幅度的监控窗口:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/option_master/6.png)
以上图为例,可以看到:
* IO2104,以对应月份期货IF2104定价,升贴水接近0;
* IO2105、IO2106、IO2109,以活跃合约IF2104定价,贴水依次增加;
* IO2112、IO2203,以对应月份的合成期货定价,升贴水为0。
## 波动率曲线
点击管理界面的【波动率曲线】按钮,打开当前的市场波动率曲线监控图表:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/option_master/7.png)
图表中每个期权链的波动率曲线采用不同颜色显示,具体颜色对应期权链的图例在左侧。
每个期权链会包括三条曲线:
* 向上箭头:该月份看涨期权的1档盘口隐含波动率中值,即买1价和卖1价盘口波动率的均值;
* 向下箭头:该月份看跌期权的1档盘口隐含波动率中值;
* 小圆点:该月份定价波动率的数值,定价波动率用于希腊值计算和电子眼交易,通过后面的【波动率管理】组件设置。
图表中显示的曲线通过窗口顶部每个期权链对应的勾选框来控制,可以根据需求进行调整,如下图中只显示了IO2109这一个期权链:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/option_master/17.png)
## Delta对冲
点击管理界面的【Delta对冲】按钮,打开交易组合的Delta自动对冲功能:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/option_master/8.png)
* 对冲标的:可以选择投资组合内的任意一个标的物合约;
* 执行频率:多久执行一次检查,判断是否要执行对冲;
* Delta目标:如果触发对冲,将Delta值对冲到多少;
* 选择0,即为保持整体组合的Delta中性;
* 选择正数,即为保持整体组合的Delta多头敞口;
* 选择负数,即为保持整体组合的Delta空头敞口;
* Delta范围:当仓位类型的Delta值偏离上述Delta目标超过多少时,触发对冲任务;
* 委托超价:发出对冲委托时,价格相对于对面盘口的超价;
点击【启动】按钮即可启动自动对冲功能,当读秒达到执行间隔时即会执行一次检查,如果满足条件则会启动TWAP算法执行对冲操作。
点击【停止】按钮即可停止自动对冲功能的运行。
## 情景分析
点击管理界面的【情景分析】按钮,打开交易组合整体持仓风险的压力测试和情景分析功能:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/option_master/9.png)
首先配置执行的分析任务:
* 目标数据:支持盈亏、Delta、Gamma、Theta、Vega
* 时间衰减:交易日的衰减天数;
* 价格变动:
* 分析中价格的涨跌变动范围;
* 假设单前价格为100,变动为10%,则范围为90~110
* 波动率变动:
* 分析中波动率的涨跌变动范围;
* 假设当前波动率为20%,变动为10%,则范围为10%~30%。
点击执行分析按钮后,压力测试引擎会根据当前的交易组合持仓,以及每个情景下的价格和隐含波动率情况,来计算对应的目标数据,并将结果绘制为3D曲面。
下图显示的是以Gamma值为计算目标,10%价格变动,15%波动率变动的结果:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/option_master/18.png)
该3D图中的垂直轴为计算目标的数值,水平的两轴分别为价格和波动率的变动数值。
## 波动率管理
点击管理界面的【波动率管理】按钮,打开定价波动率管理界面:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/option_master/11.png)
点击顶部的期权链标签切换对应期权链的定价波动率管理组件,第一次打开时下方表格中的【定价隐波】数值均为0。
首先进行定价曲线的初始化,点击顶部的【重置】按钮,将当前该行权价的虚值期权的中值隐波,映射到定价隐波上。
映射完成后可以在波动率图表中查看当前的定价波动率曲线形状,如果某一行权价的定价隐波和整体曲线相比存在不平滑的情况,则可以基于相对平滑的行权价的定价隐波对其进行拟合。
在组件表格中的【执行拟合】列,勾选要执行拟合的行权价勾选框,勾选完成后点击顶部的【拟合】按钮,即可基于OptionMaster内置的Cubic Spline(三项式差值)算法来执行波动率曲线的拟合。
拟合完成后如果还存在不满意的部分,则可以通过【定价隐波】列的滚动框来进行手动微调,点击上下箭头每次上升或者下跌0.1%,或者也可以直接输入想要修改的数值。
当因为对波动率曲线高低的整体观点,需要对曲线进行整体平移时,可以通过组件顶部的【+0.1%】和【-0.1%】按钮,来对所有行权价的定价波动率进行平移调整。
## 电子眼
点击管理界面的【电子眼】按钮,打开交易组合的电子眼自动套利算法功能:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/option_master/12.png)
电子眼算法可以基于交易员预设的定价波动率曲线,在允许的持仓范围内自动捕捉市场上出现的瞬时交易执行机会,同时结合Delta自动对冲功能来保证投资组合的整体Delta中性。
电子眼界面类似T型报价分为左右区域,中间的白色为行权价,左侧为看涨期权,右侧为看跌期权。每个期权上对应存在一个独立的电子眼交易算法,交易员可以同时启动数百个交易算法(具体数量取决于CPU性能)而互不干扰。
每个电子眼算法的配置参数包括:
* 交易价差相关
* 价格价差
* 隐波价差
* 仓位限制相关
* 持仓范围
* 目标持仓
* 最大委托
* 单笔最大的委托数量
* 方向
* 算法允许的交易方向
* 包括只允许做多、只允许做空、允许双向交易
电子眼算法的执行流程如下:
1. 基于定价波动率,计算期权的**理论价**
2. 计算目标买卖的价差:
1. 隐波价差的价格值 = 隐波价差 * 期权理论Vega值
2. 交易价差 = max(价格价差, 隐波价差的价格值)
3. 计算目标买卖价:
1. 目标买价 = 理论价 - 交易价差 / 2
2. 目标卖价 = 理论价 + 交易价差 / 2
4. 以做多交易为例,当盘口卖1价格低于目标买价时,触发买入信号
5. 计算本轮委托量:
1. 算法持仓上限 = 目标持仓 + 持仓范围
2. 剩余多头可交易量 = 算法多头持仓上限 - 当前净持仓
3. 本轮委托量 = min(剩余多头可交易量,卖1量,最大委托量)
6. 使用目标买价和本轮委托量,发出对应的交易委托
配置好算法参数后,点击该行的【定价】列的按钮启动算法的定价计算,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/option_master/13.png)
【定价】和【交易】按钮的状态显示:
* 为N时,代表算法当前未启动该任务
* 为Y时,代表算法已在执行对应的任务
启动定价的4个期权算法,会开始实时更新目标买卖价等相关数值。
此时点击【交易】列的按钮,即可启动算法的交易执行,当价格和持仓满足条件时就会自动发出交易委托,详细的算法运行状态日志信息可以通过右侧日志区域监控:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/option_master/14.png)
当需要对算法配置进行批量修改时,可以通过电子眼窗口的右上角的全局修改功能进行操作,更加方便快捷。
+112
View File
@@ -0,0 +1,112 @@
# PaperAccount - 本地仿真交易模块
## 功能简介
PaperAccount是用于**本地仿真交易**的功能模块,用户可以通过其UI界面基于实盘行情进行本地化的模拟交易。
## 加载启动
### VeighNa Station加载
启动登录VeighNa Station后,点击【交易】按钮,在配置对话框中的【应用模块】栏勾选【PaperAccount】。
### 脚本加载
在启动脚本中添加如下代码:
```python3
# 写在顶部
from vnpy_paperaccount import PaperAccountApp
# 写在创建main_engine对象后
main_engine.add_app(PaperAccountApp)
```
## 启动模块
在启动模块之前,请先连接要进行模拟交易的接口(连接方法详见基本使用篇的连接接口部分)。看到VeighNa Trader主界面【日志】栏输出“合约信息查询成功”之后再启动模块,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_strategy/1.png)
请注意,IB接口因为登录时无法自动获取所有的合约信息,只有在用户手动订阅行情时才能获取。因此需要在主界面上先行手动订阅合约行情,再启动模块。
交易接口连接后,本地模拟交易模块自动启动。此时所有合约的交易委托和撤单请求均**被本地模拟交易模块接管**,不会再发往实盘服务器。
## 功能配置
在菜单栏中点击【功能】-> 【模拟交易】,或者点击左侧按钮栏的图标:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/paper_account/4.png)
即可进入本地模拟交易模块的UI界面,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/paper_account/5.png)
用户可以通过UI界面对以下功能进行配置:
- 市价委托和停止委托的成交滑点
- 用于影响市价单和停止单成交时,成交价格相对于盘口价格的**滑点跳数**;
- 模拟交易持仓盈亏的计算频率
- 多少秒执行一次持仓盈亏计算更新,如果持仓较多时发现程序卡顿,建议尝试调低频率;
- 下单后立即使用当前盘口撮合
- 默认情况下,用户发出的委托需要**等到下一个TICK盘口推送才会撮合**(模拟实盘情景),对于TICK推送频率较低的不活跃合约可以勾选该选项,委托后会**立即基于当前的最新TICK盘口撮合**;
- 清空所有持仓
- 一键清空本地所有持仓数据。
本地模拟交易模块同样可以和其他策略应用模块(如CtaStrategy模块、SpreadTrading模块等)一起使用,从而实现本地化的量化策略仿真交易测试。
## 数据监控
用户可以通过【查询合约】来查询确认合约的交易接口状态:
点击菜单栏的【帮助】->【合约查询】,在弹出的对话框中直接点击右上角的【查询】按钮,发现所有合约的【交易接口】列均显示为PAPER,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/paper_account/2.png)
在对某一合约进行下单和撤单操作前,用户必须先**订阅**该合约的行情。
下图中【委托】、【成交】、【持仓】三个监控组件中显示的信息,其接口列均为PAPER(本地模拟数据):
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/paper_account/3.png)
请注意,本地模拟交易模块**没有提供资金计算功能**,所以【资金】组件显示的是实盘账号的资金,并不会因为在本地模拟交易模块产生的委托而改变。
## 业务逻辑
本地模拟交易模块的业务逻辑如下所示:
- 支持的委托类型(不支持的类型会被拒单):
- 限价单;
- 市价单;
- 停止单;
- 委托撮合规则采用**到价成交**模式,以买入委托为例:
- 限价单:当盘口卖1价ask_price_1小于等于委托价格,则成交;
- 停止单:当盘口卖1价ask_price_1大于等于委托价格,则成交;
- 委托成交时**不考虑盘口挂单量**,一次性全部成交;
- 委托成交后,先推送委托状态更新OrderData,再推送成交信息TradeData,**和实盘交易中的顺序一致**;
- 委托成交后,模块会自动记录相应的持仓信息PositionData
- 根据合约本身的持仓模式(多空仓 vs 净仓位)信息,维护对应的持仓信息;
- **开仓成交时,采用加权平均计算更新持仓成本价;**
- **平仓成交时,持仓成本价不变;**
- 多空仓模式下,挂出平仓委托后会冻结相应的持仓数量,可用数量不足时会拒单;
- 持仓的盈亏会基于持仓成本价和最新成交价定时计算(默认频率1秒);
- 数据的持久化保存:
- 成交数据和委托数据不保存,关闭VeighNa Trader后即消失;
- 持仓数据会在有变化时**立即写入硬盘文件**,重启VeighNa Trader登录交易接口后即可看到(要收到相应的合约信息)。
+122
View File
@@ -0,0 +1,122 @@
# PortfolioManager - 投资组合管理模块
## 功能简介
PortfolioManager是用于**投资组合管理**的功能模块,用户可以在盘中通过其UI界面对交易策略进行实时的业绩跟踪和盈亏分析。
## 加载启动
### VeighNa Station加载
启动登录VeighNa Station后,点击【交易】按钮,在配置对话框中的【应用模块】栏勾选【PortfolioManager】。
### 脚本加载
在启动脚本中添加如下代码:
```python3
# 写在顶部
from vnpy_portfoliomanager import PortfolioManagerApp
# 写在创建main_engine对象后
main_engine.add_app(PortfolioManagerApp)
```
## 启动模块
在菜单栏中点击【功能】-> 【投资组合】,或者点击左侧按钮栏的图标:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/portfolio_manager/1.jpg)
即可进入投资组合管理模块的UI界面,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/portfolio_manager/6.png)
## 组合信息表
界面整体可以分为左右两部分,左边显示的是当前已有投资组合的信息表,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/portfolio_manager/7.png)
组合信息表每列的含义如下:
- 组合名称:委托来源标识(reference),所有从VeighNa发出的委托请求都可以直接通过该标识来区分其交易来源,如手动交易、算法执行、量化策略等,每个交易来源可以视作一个独立的投资组合。
- 手动交易:ManualTrading
- CTA策略:CtaStrategy_策略名
- 价差交易:SpreadTrading_价差名
- 期权交易:OptionMaster_ElectronicEye/DeltaHedging
- 算法交易:AlgoTrading_算法编号
- 脚本策略:ScriptTrader
- 组合策略:PortfolioStrategy_策略名
- 本地代码:带交易所后缀的合约代码(vt_symbol)
- 开盘仓位:昨日收盘时(今日开盘),投资组合内该合约的持仓
- 当前仓位:开盘仓位加上今日成交数量(多头成交 - 空头成交)的结果
- 交易盈亏:今日所有成交,以成交价格映射到当前最新价的盈亏
- 持仓盈亏:组合开盘仓位,以昨收盘价映射到当前最新价的盈亏
- 总盈亏:交易盈亏和持仓盈亏的和
- 多头成交:投资组合内该合约今日买开和买平成交数量
- 空头成交:投资组合内该合约今日卖开和卖平成交数量
其中,交易盈亏(TradingPnl)和持仓盈亏(HoldingPnl)的计算方式采用的是期货交易所每日结算时所用的逐日盯市(Marking to Market)算法,计算过程如下所示:
- 交易盈亏 = 持仓量 * (当日收盘价-昨日收盘价)* 合约规模
- 持仓盈亏 = 持仓变化量 * (当日收盘价 - 开仓成交价)* 合约规模
- 总盈亏 = 交易盈亏 + 持仓盈亏
- 净盈亏 = 总盈亏 - 总手续费 - 总滑点
用户可以通过展开和折叠投资组合,调整列宽来查看信息:
- 点击每个投资组合左侧的箭头可以展开和折叠各投资组合的信息;
- 点击顶部的【全部展开】和【全部折叠】按钮对所有投资组合进行批量操作;
- 点击【调整列宽】按钮可以自动调整表格每列的宽度。
## 成交记录表
界面右侧部分显示的是所有成交记录,点击右上角的下拉框可以根据投资组合进行筛选,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/portfolio_manager/8.png)
## 刷新频率
投资组合的盈亏基于定时逻辑自动计算,计算频率可以通过顶部中间的选项框进行调整,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/portfolio_manager/5.png)
请注意,所有组合的持仓数据会在关闭VeighNa Trader时写入缓存文件中,所以不要直接杀进程退出,会丢失数据。
在隔日加载时,程序会自动将昨天的总仓位结算到今天的昨仓数据字段中,该逻辑对于24小时交易的市场(外盘期货)不一定合适,后续考虑加入每日定时结算或者手动结算功能。
如果发现有仓位记录错误,或者策略已经移除的情况,可以手动修改缓存文件,再重新启动VeighNa Trader即可。
Windows系统上缓存文件的默认路径位于:
C:\Users\Administrator\.vntrader\portfolio_manager_data.json
其中Administrator是当前Windows系统的用户名。
+883
View File
@@ -0,0 +1,883 @@
# PortfolioStrategy - 多合约组合策略模块
## 功能简介
PortfolioStrategy是用于**多合约组合策略实盘**的功能模块,用户可以通过其UI界面操作来便捷完成策略初始化、策略启动、策略停止、策略参数编辑以及策略移除等任务。
## 加载启动
### VeighNa Station加载
启动登录VeighNa Station后,点击【交易】按钮,在配置对话框中的【应用模块】栏勾选【PortfolioStrategy】。
### 脚本加载
在启动脚本中添加如下代码:
```python3
# 写在顶部
from vnpy_portfoliostrategy import PortfolioStrategyApp
# 写在创建main_engine对象后
main_engine.add_app(PortfolioStrategyApp)
```
## 启动模块
<span id="jump">
对于用户自行开发的策略,需要放到VeighNa Trader运行时目录下的**strategies**目录中,才能被识别加载。具体的运行时目录路径,可以在VeighNa Trader主界面顶部的标题栏查看。
对于在Windows上默认安装的用户来说,放置策略的strategies目录路径通常为:
```
C:\Users\Administrator\strategies
```
其中Administrator为当前登录Windows的系统用户名。
</span>
在启动模块之前,请先连接交易接口(连接方法详见基本使用篇的连接接口部分)。看到VeighNa Trader主界面【日志】栏输出“合约信息查询成功”之后再启动模块,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_strategy/1.png)
请注意,IB接口因为登录时无法自动获取所有的合约信息,只有在用户手动订阅行情时才能获取。因此需要在主界面上先行手动订阅合约行情,再启动模块。
成功连接交易接口后,在菜单栏中点击【功能】-> 【组合策略】,或者点击左侧按钮栏的图标:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/portfolio_strategy/0.png)
即可进入多合约组合策略模块的UI界面,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/portfolio_strategy/1.png)
如果配置了数据服务(配置方法详见基本使用篇的全局配置部分),打开多合约组合策略模块时会自动执行数据服务登录初始化。若成功登录,则会输出“数据服务初始化成功”的日志,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/portfolio_strategy/2.png)
## 添加策略
用户可以基于编写好的组合策略模板(类)来创建不同的策略实例(对象)。
在左上角的下拉框中选择要交易的策略名称,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/portfolio_strategy/3.png)
请注意,显示的策略名称是**策略类**(驼峰式命名)的名字,而不是策略文件(下划线模式命名)的名字。
选择好策略类之后,点击【添加策略】,会弹出添加策略对话框,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/portfolio_strategy/4.png)
在创建策略实例时,需要配置相关参数,各参数要求如下:
- 实例名称
- 实例名称不能重名;
- 合约品种
- 格式为vt_symbol(合约代码 + 交易所名称);
- 一定要是实盘交易系统中可以查到的合约名称;
- 合约名用“,”隔开,中间不加空格;
- 参数设置
- 显示的参数名是策略里写在parameters列表中的参数名;
- 默认数值为策略里的参数的默认值;
- 由上图可观察到,参数名后面<>括号中显示的是该参数的数据类型,在填写参数时应遵循相应的数据类型。其中,<class 'str'>是字符串、<class 'int'>是整数、<class 'float'>是浮点数;
- 请注意,如果某个参数可能会调整至有小数位的数值,而默认参数值是整数(比如1)。请在编写策略时,把默认参数值设为浮点数(比如1.0)。否则策略会默认该项参数为整数,在后续【编辑】策略实例参数时,会只允许填进整数。
参数配置完成后,点击【添加】按钮,则开始创建策略实例。创建成功后可在左侧的策略监控组件中看到该策略实例,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/portfolio_strategy/5.png)
策略监控组件顶部显示的是策略实例名、策略类名以及策略作者名(在策略里定义的author)。顶部按钮用于控制和管理策略实例,第一行表格显示了策略内部的参数信息(参数名需要写在策略的parameters列表中图形界面才会显示),第二行表格则显示了策略运行过程中的变量信息(变量名需要写在策略的variables列表中图形界面才会显示)。【inited】字段表示当前策略的初始化状态(是否已经完成了历史数据回放),【trading】字段表示策略当前是否能够开始交易。
从上图可观察到,此时该策略实例的【inited】和【trading】状态都为【False】。说明该策略实例还没有初始化,也还不能发出交易信号。
策略实例创建成功后,该策略实例的配置信息会被保存到.vntrader文件夹下的portfolio_strategy_setting.json文件中。
请注意,如果添加了同名的策略实例,则会创建失败,图形界面输出“创建策略失败,存在重名”的日志信息,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/portfolio_strategy/8.png)
## 管理策略
### 初始化
策略实例创建成功后,就可以对该实例进行初始化了。点击该策略实例下的【初始化】按钮,若初始化成功,则如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/portfolio_strategy/6.png)
初始化完成后,可观察到此时该策略实例的【inited】状态已经为【True】。说明该策略实例已经加载过历史数据并完成初始化了。【trading】状态还是为【False】,说明此时该策略实例还不能开始自动交易。
请注意,与CTA策略不同,如果创建实例时输入错误的vt_symbol,多合约组合策略模块会在初始化时报错,而不是在创建策略实例时报错,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/portfolio_strategy/7.png)
### 启动
策略实例初始化成功,【inited】状态为【True】时,才能启动该策略的自动交易功能。点击该策略实例下的【启动】按钮,即可启动该策略实例。成功后如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/portfolio_strategy/10.png)
可观察到此时该策略实例的【inited】和【trading】状态都为【True】。说明此时该策略实例已经完成了历史数据回放,而且此时策略内部的交易请求类函数(buy/sell/short/cover/cancel_order等),以及信息输出类函数(send_email/put_event等),才会真正执行并发出对应的请求指令到底层接口中(真正执行交易)。
在上一步策略初始化的过程中,尽管策略同样在接收(历史)数据,并调用对应的功能函数,但因为【trading】状态为【False】,所以并不会有任何真正的委托下单操作或者交易相关的日志信息输出。
如果启动之后,策略发出了委托,可以去VeighNa Trader主界面【委托】栏查看委托订单细节,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/portfolio_strategy/9.png)
请注意,与CTA策略模块不同,多合约组合策略**不提供本地停止单功能**,所以UI界面上不会有停止单的显示区域了。
### 停止
如果启动策略之后,由于某些情况(如到了市场收盘时间,或盘中遇到紧急情况)想要停止、编辑或者移除策略,可以点击策略实例下的【停止】按钮,即可停止该策略实例的自动交易。成功后如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/portfolio_strategy/11.png)
组合策略引擎会自动将该策略之前发出的所有活动委托全部撤销,以保证在策略停止后不会有失去控制的委托存在。同时该策略实例最新的变量信息会被保存到.vntrader文件夹下的portfolio_strategy_data.json文件中。
此时可观察到该策略实例的【trading】状态已变为【False】,说明此时该策略实例已经停止自动交易了。
在多合约组合策略的实盘交易过程中,正常情况应该让策略在整个交易时段中都自动运行,尽量不要有额外的暂停重启类操作。对于国内期货市场来说,应该在交易时段开始前,启动策略的自动交易,然后直到收盘后,再关闭自动交易。因为现在CTP夜盘收盘后也会关闭系统,早上开盘前重启,所以夜盘收盘后也需要停止策略,关闭VeighNa Trader了。
### 编辑
如果创建策略实例之后,想要编辑某个策略实例的参数(若已启动策略,需要先点击策略实例下的【停止】按钮,停止策略),可以点击该策略实例下的【编辑】按钮,会弹出参数编辑对话框,以供修改策略参数。如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/portfolio_strategy/12.png)
编辑完策略参数之后,点击下方的【确定】按钮,相应的修改会立即更新在参数表格中。
但是策略实例的交易合约代码无法修改,同时修改完后也不会重新执行初始化操作。也请注意,此时修改的只是.vntrader文件夹下porfolio_strategy_setting.json文件中该策略实例的参数值,并没有修改原策略文件下的参数。
修改前,json文件如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/portfolio_strategy/18.png)
修改后,json文件如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/portfolio_strategy/17.png)
若盘中编辑后想要再次启动策略,点击策略实例下的【启动】按钮即可再次启动该策略实例。
### 移除
如果创建策略实例之后,想要移除某个策略实例(若已启动策略,需要先点击策略实例下的【停止】按钮,停止策略),可以点击该策略实例下的【移除】按钮。移除成功后,图形界面左侧的策略监控组件中将不会再显示该策略实例的信息。如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/portfolio_strategy/13.png)
此时.vntrader文件夹下的portfolio_strategy_setting.json文件也移除了该策略实例的配置信息。
### 状态跟踪
如果想要通过图形界面跟踪策略的状态,有两种方式:
1. 调用put_event函数
策略实例中所有的的变量信息,都需要把变量名写在策略的variables列表中,才能在图形界面显示。如果想跟踪变量的状态变化,则需要在策略中调用put_event函数,界面上才会进行数据刷新。
有时用户会发现自己写的策略无论跑多久,变量信息都不发生变化,这种情况请检查策略中是否漏掉了对put_event函数的调用。
2. 调用write_log函数
如果不仅想观察到变量信息的状态变化,还想根据策略的状态输出基于自己需求的个性化的日志,可以在策略中调用write_log函数,进行日志输出。
## 运行日志
### 日志内容
多合约组合策略模块UI界面上输出的日志有两个来源,分别是策略引擎和策略实例。
**引擎日志**
策略引擎一般输出的是全局信息。下图中除了策略实例名后加冒号的内容之外,都是策略引擎输出的日志。
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/portfolio_strategy/15.png)
**策略日志**
如果在策略中调用了write_log函数,那么日志内容就会通过策略日志输出。下图红框里的内容是策略实例输出的策略日志。冒号前是策略实例的名称,冒号后是write_log函数输出的内容。
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/portfolio_strategy/16.png)
### 清空操作
如果想要清空多合约组合策略UI界面上的日志输出,可以点击右上角的【清空日志】按钮,则可一键清空该界面上已输出的日志。
点击【清空日志】后,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/portfolio_strategy/14.png)
## 批量操作
在策略经过充分测试,实盘运行较为稳定,不需要经常进行调整的情况下,如果有多个需要运行的组合策略实例,可以使用界面右上角的【全部初始化】、【全部启动】和【全部停止】功能来执行盘前批量初始化、启动策略实例以及盘后批量停止策略实例的操作。
### 全部初始化
在所有策略实例创建成功后,点击右上角的【全部初始化】按钮,则可批量初始化策略实例,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/portfolio_strategy/19.png)
### 全部启动
在所有策略实例初始化成功后,点击右上角的【全部启动】按钮,则可批量启动策略实例,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/portfolio_strategy/20.png)
### 全部停止
在所有策略实例启动成功后,点击右上角的【全部停止】按钮,则可批量停止策略实例,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/portfolio_strategy/21.png)
## 多合约组合策略模板(StrategyTemplate-- 基础
多合约组合策略模板提供了信号生成和委托管理功能,用户可以基于该模板(位于site-packages\vnpy_portfoliostrategy\template中)自行开发多合约组合策略。
用户自行开发的策略可以放在用户运行文件夹下的[strategies](#jump)文件夹内。
请注意:
1. 策略文件命名采用下划线模式,如portfolio_boll_channel_strategy.py,而策略类命名采用驼峰式,如PortfolioBollChannelStrategy。
2. 自建策略的类名不要与示例策略的类名重合。如果重合了,图形界面上只会显示一个策略类名。
下面通过PortfolioBollChannelStrategy策略示例,来展示策略开发的具体步骤:
在基于策略模板编写策略逻辑之前,需要在策略文件的顶部载入需要用到的内部组件,如下方代码所示:
```python3
from typing import List, Dict
from datetime import datetime
from vnpy.trader.utility import ArrayManager, Interval
from vnpy.trader.object import TickData, BarData
from vnpy_portfoliostrategy import StrategyTemplate, StrategyEngine
from vnpy_portfoliostrategy.utility import PortfolioBarGenerator
```
其中,StrategyTemplate是策略模板,StrategyEngine是策略引擎,Interval是数据频率,TickData和BarData都是储存对应信息的数据容器,PortfolioBarGenerator是组合策略K线生成模块,ArrayManager是K线时间序列管理模块。
### 策略参数与变量
在策略类的下方,可以设置策略的作者(author),参数(parameters)以及变量(variables),如下方代码所示:
```python3
author = "用Python的交易员"
boll_window = 18
boll_dev = 3.4
cci_window = 10
atr_window = 30
sl_multiplier = 5.2
fixed_size = 1
price_add = 5
parameters = [
"boll_window",
"boll_dev",
"cci_window",
"atr_window",
"sl_multiplier",
"fixed_size",
"price_add"
]
variables = []
```
虽然策略的参数和变量都从属于策略类,但策略参数是固定的(由交易员从外部指定),而策略变量则在交易的过程中随着策略的状态而变化,所以策略变量一开始只需要初始化为对应的基础类型。例如:整数设为0,浮点数设为0.0,而字符串则设为""。
如果需要策略引擎在运行过程中,将策略参数和变量显示在UI界面上,并在数据刷新、停止策略时保存其数值,则需把参数和变量的名字(以字符串的数据类型)添加进parameters和variables列表里。
请注意,该列表只能接受参数或变量以str、int、float和bool四种数据类型传入。如果策略里需要用到其他数据类型的参数与变量,请把该参数或变量的定义放到__init__函数下。
### 类的初始化
入参:strategy_engine: StrategyEngine, strategy_name: str, vt_symbols: List[str], setting: dict
出参:无
__init__函数是策略类的构造函数,需要与继承的StrategyTemplate保持一致。
在这个继承的策略类里,初始化一般分四步,如下方代码所示:
```python3
def __init__(
self,
strategy_engine: StrategyEngine,
strategy_name: str,
vt_symbols: List[str],
setting: dict
):
""""""
super().__init__(strategy_engine, strategy_name, vt_symbols, setting)
self.boll_up: Dict[str, float] = {}
self.boll_down: Dict[str, float] = {}
self.cci_value: Dict[str, float] = {}
self.atr_value: Dict[str, float] = {}
self.intra_trade_high: Dict[str, float] = {}
self.intra_trade_low: Dict[str, float] = {}
self.targets: Dict[str, int] = {}
self.last_tick_time: datetime = None
self.ams: Dict[str, ArrayManager] = {}
for vt_symbol in self.vt_symbols:
self.ams[vt_symbol] = ArrayManager()
self.targets[vt_symbol] = 0
self.pbg = PortfolioBarGenerator(self.on_bars, 2, self.on_2hour_bars, Interval.HOUR)
```
1 . 通过super( )的方法继承策略模板,在__init__( )函数中传入策略引擎、策略名称、vt_symbols以及参数设置(以上参数均由策略引擎在使用策略类创建策略实例时自动传入,用户无需进行设置)。
2 . 创建策略所需的存放不同合约K线时间序列管理实例(ArrayManager)和策略变量的字典。
3 . 分别为策略交易的不同合约创建ArrayManager和目标仓位变量并放进字典里。
ArrayManager的默认长度为100,如需调整ArrayManager的长度,可传入size参数进行调整(size不能小于计算指标的周期长度)。
4 . 调用组合策略K线生成模块(PortfolioBarGenerator):通过时间切片将Tick数据合成1分钟K线数据。如有需求,还可合成更长的时间周期数据,如15分钟K线。
如果只基于on_bar进行交易,这里代码可以写成:
```python3
self.pbg = PortfolioBarGenerator(self.on_bars)
```
而不用给pbg实例传入需要基于on_bars周期合成的更长K线周期,以及接收更长K线周期的函数名。
请注意:
- 合成X分钟线时,X必须设为能被60整除的数(60除外)。对于小时线的合成没有这个限制。
- PortfolioBarGenerator默认的基于on_bar函数合成长周期K线的数据频率是分钟级别,如果需要基于合成的小时线或者更长周期的K线交易,请在策略文件顶部导入Interval,并传入对应的数据频率给bg实例。
- **self.on_hour_bars函数名在程序内部已使用**,如需合成1小时K线,请使用self.on_1_hour_bars或者其他命名。
### 策略引擎调用的函数
StrategyTemplate中的update_setting函数和该函数后面四个以get开头的函数以及update_trade和update_order函数,都是策略引擎去负责调用的函数,一般在策略编写的时候是不需要调用的。
### 策略的回调函数
StrategyTemplate中以on开头的函数称为回调函数,在编写策略的过程中能够用来接收数据或者接收状态更新。回调函数的作用是当某一个事件发生的时候,策略里的这类函数会被策略引擎自动调用(无需在策略中主动操作)。回调函数按其功能可分为以下两类:
#### 策略实例状态控制(所有策略都需要)
**on_init**
* 入参:无
* 出参:无
初始化策略时on_init函数会被调用,默认写法是先调用write_log函数输出“策略初始化”日志,再调用load_bars函数加载历史数据。如下方代码所示:
```python3
def on_init(self):
"""
Callback when strategy is inited.
"""
self.write_log("策略初始化")
self.load_bars(10)
```
与CTA策略不同,多合约组合策略只支持K线回测,所以多合约策略模板并没有load_ticks函数。
策略初始化时,策略的inited和trading状态都为【False】,此时只是调用ArrayManager计算并缓存相关的计算指标,不能发出交易信号。调用完on_init函数之后,策略的inited状态才变为【True】,策略初始化才完成。
**on_start**
* 入参:无
* 出参:无
启动策略时on_start函数会被调用,默认写法是调用write_log函数输出“策略启动”日志,如下方代码所示:
```python3
def on_start(self):
"""
Callback when strategy is started.
"""
self.write_log("策略启动")
```
调用策略的on_start函数启动策略后,策略的trading状态变为【True】,此时策略才能够发出交易信号。
**on_stop**
* 入参:无
* 出参:无
停止策略时on_stop函数会被调用,默认写法是调用write_log函数输出“策略停止”日志,如下方代码所示:
```python3
def on_stop(self):
"""
Callback when strategy is stopped.
"""
self.write_log("策略停止")
```
调用策略的on_stop函数停止策略后,策略的trading状态变为【False】,此时策略就不会发出交易信号了。
#### 接收数据、计算指标、发出交易信号
**on_tick**
* 入参:tick: TickData
* 出参:无
绝大部分交易系统都只提供Tick数据的推送。即使一部分平台可以提供K线数据的推送,但是这些数据到达本地电脑的速度也会慢于Tick数据的推送,因为也需要平台合成之后才能推送过来。所以实盘的时候,VeighNa里所有的策略的K线都是由收到的Tick数据合成的。
当策略收到实盘中最新的Tick数据的行情推送时,on_tick函数会被调用。默认写法是通过PortfolioBarGenerator的update_tick函数把收到的Tick数据推进前面创建的pbg实例中以便合成1分钟的K线,如下方代码所示:
```python3
def on_tick(self, tick: TickData):
"""
Callback of new tick data update.
"""
self.pbg.update_tick(tick)
```
请注意,on_tick函数只在实盘中会被调用,回测不支持。
**on_bars**
* 入参:bars: Dict[str, BarData]
* 出参:无
当策略收到最新的K线数据时(实盘时默认推进来的是基于Tick合成的一分钟的K线,回测时则取决于选择参数时填入的K线数据频率),on_bars函数就会被调用。
与CTA策略模块不同,多合约组合策略模块在接收K线推送时,是通过on_bars回调函数一次性接收该时间点上所有合约的K线数据,而不是通过on_bar函数一个个接收(无法判断当前时点的K线是否全部走完了 )。
示例策略里出现过的写法有两种:
1 . 如果策略基于on_bars推进来的K线交易,那么请把交易请求类函数都写在on_bars函数下(因本次示例策略类PortfolioBollChannelStrategy不是基于on_bars交易,故不作示例讲解。基于on_bars交易的示例代码可参考其他示例策略);
2 . 如果策略需要基于on_bars推进来的K线数据通过PortfolioBarGenerator合成更长时间周期的K线来交易,那么请在on_bars中调用PortfolioBarGenerator的update_bars函数,把收到的bars推进前面创建的pbg实例中即可,如下方代码所示:
```python3
def on_bars(self, bars: Dict[str, BarData]):
"""
Callback of new bars data update.
"""
self.pbg.update_bars(bars)
```
示例策略类PortfolioBollChannelStrategy是通过2小时K线数据回报来生成信号的。一共有三部分,如下方代码所示:
```python3
def on_2hour_bars(self, bars: Dict[str, BarData]):
""""""
self.cancel_all()
for vt_symbol, bar in bars.items():
am: ArrayManager = self.ams[vt_symbol]
am.update_bar(bar)
for vt_symbol, bar in bars.items():
am: ArrayManager = self.ams[vt_symbol]
if not am.inited:
return
self.boll_up[vt_symbol], self.boll_down[vt_symbol] = am.boll(self.boll_window, self.boll_dev)
self.cci_value[vt_symbol] = am.cci(self.cci_window)
self.atr_value[vt_symbol] = am.atr(self.atr_window)
current_pos = self.get_pos(vt_symbol)
if current_pos == 0:
self.intra_trade_high[vt_symbol] = bar.high_price
self.intra_trade_low[vt_symbol] = bar.low_price
if self.cci_value[vt_symbol] > 0:
self.targets[vt_symbol] = self.fixed_size
elif self.cci_value[vt_symbol] < 0:
self.targets[vt_symbol] = -self.fixed_size
elif current_pos > 0:
self.intra_trade_high[vt_symbol] = max(self.intra_trade_high[vt_symbol], bar.high_price)
self.intra_trade_low[vt_symbol] = bar.low_price
long_stop = self.intra_trade_high[vt_symbol] - self.atr_value[vt_symbol] * self.sl_multiplier
if bar.close_price <= long_stop:
self.targets[vt_symbol] = 0
elif current_pos < 0:
self.intra_trade_low[vt_symbol] = min(self.intra_trade_low[vt_symbol], bar.low_price)
self.intra_trade_high[vt_symbol] = bar.high_price
short_stop = self.intra_trade_low[vt_symbol] + self.atr_value[vt_symbol] * self.sl_multiplier
if bar.close_price >= short_stop:
self.targets[vt_symbol] = 0
for vt_symbol in self.vt_symbols:
target_pos = self.targets[vt_symbol]
current_pos = self.get_pos(vt_symbol)
pos_diff = target_pos - current_pos
volume = abs(pos_diff)
bar = bars[vt_symbol]
boll_up = self.boll_up[vt_symbol]
boll_down = self.boll_down[vt_symbol]
if pos_diff > 0:
price = bar.close_price + self.price_add
if current_pos < 0:
self.cover(vt_symbol, price, volume)
else:
self.buy(vt_symbol, boll_up, volume)
elif pos_diff < 0:
price = bar.close_price - self.price_add
if current_pos > 0:
self.sell(vt_symbol, price, volume)
else:
self.short(vt_symbol, boll_down, volume)
self.put_event()
```
- 清空未成交委托:为了防止之前下的单子在上一个2小时没有成交,但是下一个2小时可能已经调整了价格,就用cancel_all()方法立刻撤销之前未成交的所有委托,保证策略在当前这2小时开始时的整个状态是清晰和唯一的;
- 调用K线时间序列管理模块:基于最新的2小时K线数据来计算相应的技术指标,如布林带上下轨、CCI指标、ATR指标等。首先获取ArrayManager对象,然后将收到的K线推送进去,检查ArrayManager的初始化状态,如果还没初始化成功就直接返回,没有必要去进行后续的交易相关的逻辑判断。因为很多技术指标计算对最少K线数量有要求,如果数量不够的话计算出来的指标会出现错误或无意义。反之,如果没有return,就可以开始计算技术指标了;
- 信号计算:通过持仓的判断以及结合CCI指标、ATR指标在通道突破点挂出**限价单委托**(buy/sell),同时设置离场点(short/cover)。
请注意:
1. 在CTA策略模块中,通常都是通过访问策略的变量pos获取策略持仓来进行持仓判断。但在多合约组合策略模块中,是通过调用get_pos函数获取某一合约现在的持仓来进行逻辑判断,然后设定该合约的目标仓位,最后通过目标仓位和实际仓位的差别来进行逻辑判断进而发出交易信号的;
2. 如果需要在图形界面刷新指标数值,请不要忘记调用put_event()函数。
#### 委托状态更新
因为组合策略中需要对多合约同时下单交易,在回测时无法判断某一段K线内部每个合约委托成交的先后时间顺序,因此无法提供on_order和on_trade函数来获取委托成交推送,而只能在每次on_bars回调时通过get_pos和get_order来进行相关的状态查询。
### 主动函数
**buy**:买入开仓(DirectionLONGOffsetOPEN
**sell**:卖出平仓(DirectionSHORTOffsetCLOSE
**short**:卖出开仓(DirectionSHORTOffsetOPEN
**cover**:买入平仓(DirectionLONGOffsetCLOSE
* 入参:vt_symbol: str, price: float, volume: float, lock: bool = False, net: bool = False
* 出参:vt_orderids: List[str] / 无
buy/sell/short/cover都是策略内部的负责发单的交易请求类函数。策略可以通过这些函数给策略引擎发送交易信号来达到下单的目的。
以下方buy函数的代码为例,可以看到,**具体要交易合约的代码**,价格和数量是必填的参数,锁仓转换和净仓转换则默认为False。也可以看到,函数内部收到传进来的参数之后就调用了StrategyTemplate里的send_order函数来发单(因为是buy指令,则自动把方向填成了LONG,开平填成了OPEN)。
与CTA策略模块不同,组合策略模块不提供本地停止单功能,所以委托函数中移除了stop参数。
如果lock设置为True,那么该笔订单则会进行锁仓委托转换(在有今仓的情况下,如果想平仓,则会先平掉所有的昨仓,然后剩下的部分都进行反向开仓来代替平今仓,以避免平今的手续费惩罚)。
如果net设置为True,那么该笔订单则会进行净仓委托转换(基于整体账户的所有仓位,根据净仓持有方式来对策略下单的开平方向进行转换)。但是净仓交易模式与锁仓交易模式互斥,因此net设置为True时,lock必须设置为False。
请注意,如果向上期所发出平仓委托,因为该交易所必须指定平今、平昨,底层会对其平仓指令自动进行转换。因为上期所部分品种有平今优惠,所以默认是以平今优先的方式发出委托的(如果交易的标的在上期所平昨更优惠的话,可以自行在vnpy.trader.converter的convert_order_request_shfe函数中做适当的修改)。
```python3
def buy(self, vt_symbol: str, price: float, volume: float, lock: bool = False, net: bool = False) -> List[str]:
"""
Send buy order to open a long position.
"""
return self.send_order(vt_symbol, Direction.LONG, Offset.OPEN, price, volume, lock, net)
```
请注意,国内期货有开平仓的概念,例如买入操作要区分为买入开仓和买入平仓;但对于股票、外盘期货都是净持仓模式,没有开仓和平仓概念,所以只需使用买入(buy)和卖出(sell)这两个指令就可以了。
**send_order**
* 入参:vt_symbol: str, direction: Direction, offset: Offset, price: float, volume: float, lock: bool = False, net: bool = False
* 出参:vt_orderids: List[str] / 无
send_order函数是策略引擎调用的发送委托的函数。一般在策略编写的时候不需要单独调用,通过buy/sell/short/cover函数发送限价委托即可。
实盘的时候,收到传进来的参数后,会调用round_to函数基于合约的pricetick和min_volume对委托的价格和数量进行处理。
请注意,要在策略启动之后,也就是策略的trading状态变为【True】之后,才能发出交易委托。如果策略的Trading状态为【False】时调用了该函数,只会返回[]。
**cancel_order**
* 入参:vt_orderid: str
* 出参:无
**cancel_all**
* 入参:无
* 出参:无
cancel_order和cancel_all都是负责撤单的交易请求类函数。cancel_order是撤掉策略内指定的活动委托,cancel_all是撤掉策略所有的活动委托。
请注意,要在策略启动之后,也就是策略的trading状态变为【True】之后,才能撤单。
### 功能函数
以下为策略以外的功能函数:
**get_pos**
* 入参:vt_symbol: str
* 出参:int / 0
在策略里调用get_pos函数,可以获取特定合约的持仓数据。
**get_order**
* 入参:vt_orderid
* 出参:OrderData / 无
在策略里调用get_order函数,可以获取特定合约的委托数据。
**get_all_active_orderids**
* 入参:无
* 出参:List[OrderData] / 无
在策略里调用get_all_active_orderids函数,可以获取当前全部活动委托号。
**get_pricetick**
* 入参:vt_symbol
* 出参:pricetick: float / None
在策略里调用get_price函数,可以获取特定合约的最小价格跳动。
**write_log**
* 入参:msg: str
* 出参:无
在策略中调用write_log函数,可以进行指定内容的日志输出。
**load_bars**
* 入参:days: int, interval: Interval = Interval.MINUTE
* 出参:无
在策略中调用load_bars函数,可以在策略初始化时加载K线数据。
如下方代码所示,load_bars函数调用时,默认加载的天数是10,频率是一分钟,对应也就是加载10天的1分钟K线数据。在回测时,10天指的是10个交易日,而在实盘时,10天则是指的是自然日,因此建议加载的天数宁可多一些也不要太少。加载时会先依次尝试通过交易接口、数据服务、数据库获取历史数据,直到获取历史数据或返回空。
```python3
def load_bars(self, days: int, interval: Interval = Interval.MINUTE) -> None:
"""
Load historical bar data for initializing strategy.
"""
self.strategy_engine.load_bars(self, days, interval)
```
**put_event**
* 入参:无
* 出参:无
在策略中调用put_event函数,可以通知图形界面刷新策略状态相关显示。
请注意,要策略初始化完成,inited状态变为【True】之后,才能刷新界面。
**send_email**
* 入参:msg: str
* 出参:无
配置好邮箱相关信息之后(配置方法详见基本使用篇的全局配置部分),在策略中调用send_email函数,可以发送指定内容的邮件到自己的邮箱。
请注意,要策略初始化完成,inited状态变为【True】之后,才能发送邮件。
**sync_data**
* 入参:无
* 出参:无
在策略中调用sync_data函数,可以在实盘的时候,每次停止或成交时都同步策略变量进json文件中进行本地缓存,方便第二天初始化时再进行读取还原(策略引擎会去调用,在策略里无需主动调用)。
请注意,要在策略启动之后,也就是策略的trading状态变为【True】之后,才能同步策略信息。
## 多合约组合策略模板(StrategyTemplate-- 进阶
PortfolioStrategy模块针对的是多标的投资组合类的量化策略,这类策略在执行层面追求的是将策略投资组合的持仓调整到目标状态,而不去过多关注底层的委托交易细节。
首先介绍持仓目标调仓交易的功能函数,来展示持仓目标调仓交易的功能支持:
### 持仓目标调仓交易的功能函数介绍
以下为持仓目标调仓交易模式中策略调用的功能函数:
**set_target**
* 入参:vt_symbol: str, target: int
* 出参:无
在策略里调用set_target函数,可以设定特定合约的目标仓位。
请注意:目标仓位是一种持续性的状态,因此设置后在后续时间会持续保持下去,直到被再次设置修改。
**get_target**
* 入参:vt_symbol: str
* 出参:int
在策略里调用get_target函数,可以获取设定的特定合约目标仓位。
请注意:策略的目标仓位状态会在sync_data时(成交、停止等)自动持久化到硬盘文件,并在策略重启后恢复。
**rebalance_portfolio**
* 入参:bars: Dict[str, BarData]
* 出参:无
在策略里调用rebalance_portfolio函数,可以基于设定的特定合约的目标仓位执行调仓交易。
请注意:只有当前bars字典中有K线切片的合约,才会参与本次调仓交易的执行,从而保证非交易时段(没有行情推送)的合约不会错误发出委托。
**calculate_price**
* 入参:vt_symbol: str, direction: Direction, reference: float
* 出参:pricetick: float
在策略里重载calculate_price函数,可以按需设定特定合约的目标价格(如固定价格超价、固定pricetick超价、百分比超价等)。
如果不传则默认返回参考价格(如不在策略中重载,则在rebalance_portfolio函数中以K线的收盘价作为委托价发出)。
### 持仓目标调仓交易的功能函数使用示例
持仓目标调仓交易功能与StrategyTemplate基础用法最大的不同,就在于策略on_bars函数中的处理差异。下面通过TrendFollowingStrategy策略示例,来展示持仓目标调仓交易的具体步骤:
**on_bars**
* 入参:bars: Dict[str, BarData]
* 出参:无
当策略收到最新的K线数据时(实盘时默认推进来的是基于Tick合成的一分钟的K线,回测时则取决于选择参数时填入的K线数据频率),on_bars函数就会被调用。
示例策略类TrendFollowingStrategy是通过一分钟K线数据回报来生成信号的。一共有三部分,如下方代码所示:
```python3
def on_bars(self, bars: Dict[str, BarData]) -> None:
"""K线切片回调"""
# 更新K线计算RSI数值
for vt_symbol, bar in bars.items():
am: ArrayManager = self.ams[vt_symbol]
am.update_bar(bar)
for vt_symbol, bar in bars.items():
am: ArrayManager = self.ams[vt_symbol]
if not am.inited:
return
atr_array = am.atr(self.atr_window, array=True)
self.atr_data[vt_symbol] = atr_array[-1]
self.atr_ma[vt_symbol] = atr_array[-self.atr_ma_window:].mean()
self.rsi_data[vt_symbol] = am.rsi(self.rsi_window)
current_pos = self.get_pos(vt_symbol)
if current_pos == 0:
self.intra_trade_high[vt_symbol] = bar.high_price
self.intra_trade_low[vt_symbol] = bar.low_price
if self.atr_data[vt_symbol] > self.atr_ma[vt_symbol]:
if self.rsi_data[vt_symbol] > self.rsi_buy:
self.set_target(vt_symbol, self.fixed_size)
elif self.rsi_data[vt_symbol] < self.rsi_sell:
self.set_target(vt_symbol, -self.fixed_size)
else:
self.set_target(vt_symbol, 0)
elif current_pos > 0:
self.intra_trade_high[vt_symbol] = max(self.intra_trade_high[vt_symbol], bar.high_price)
self.intra_trade_low[vt_symbol] = bar.low_price
long_stop = self.intra_trade_high[vt_symbol] * (1 - self.trailing_percent / 100)
if bar.close_price <= long_stop:
self.set_target(vt_symbol, 0)
elif current_pos < 0:
self.intra_trade_low[vt_symbol] = min(self.intra_trade_low[vt_symbol], bar.low_price)
self.intra_trade_high[vt_symbol] = bar.high_price
short_stop = self.intra_trade_low[vt_symbol] * (1 + self.trailing_percent / 100)
if bar.close_price >= short_stop:
self.set_target(vt_symbol, 0)
self.rebalance_portfolio(bars)
self.put_event()
```
- 调用K线时间序列管理模块:基于最新的分钟K线数据来计算相应的技术指标,如ATR指标、RSI指标等。首先获取ArrayManager对象,然后将收到的K线推送进去,检查ArrayManager的初始化状态,如果还没初始化成功就直接返回,没有必要去进行后续的交易相关的逻辑判断。因为很多技术指标计算对最少K线数量有要求,如果数量不够的话计算出来的指标会出现错误或无意义。反之,如果没有return,就可以开始计算技术指标了;
- 信号计算:通过持仓的判断(get_pos)以及结合指标计算结果在通道突破点**设定目标仓位**(set_target
- 执行调仓交易(rebalance_portfolio
**calculate_price**
* 入参:vt_symbol: str, direction: Direction, reference: float
* 出参:prcie: float
当rebalance_portfolio函数检测到目标仓位与实际仓位存在差别的时候,会调用calculate_price函数计算调仓委托价格。
策略内的默认写法是针对委托方向基于设置的price_add来计算委托价格,也可以参考示例策略PairTradingStrategy中的基于设置的tick_add来计算委托价格。
```python3
def calculate_price(self, vt_symbol: str, direction: Direction, reference: float) -> float:
"""计算调仓委托价格(支持按需重载实现)"""
if direction == Direction.LONG:
price: float = reference + self.price_add
else:
price: float = reference - self.price_add
return price
```
### 与StrategyTemplate基础用法的差别
**on_bars**
1 . 无需清空未成交委托:rebalance_portfolio中已经有调用cancel_all函数的逻辑,无需再在收到on_bars函数推送的时候调用cancel_all函数对未成交的委托进行撤单处理。
2 . 无需使用self.targets字典缓存合约目标仓位:直接调用set_target函数传入合约以及目标仓位(正数代表做多、负数代表做空)进行设置即可。
3 . 无需基于缓存的目标仓位在策略内手写委托逻辑:rebalance_portfolio函数已经自动接管调仓交易,会基于目标仓位进行委托。
**calculate_price**
持仓目标调仓交易需要调用calculate_price函数计算调仓委托价格。
+71
View File
@@ -0,0 +1,71 @@
# RiskManager - 事前风控管理模块
## 功能简介
RiskManager模块是用于**事前风控管理**的功能模块,用户可以通过其UI界面操作来便捷完成启动风控,参数修改和停止风控等任务。
## 加载启动
### VeighNa Station加载
启动登录VeighNa Station后,点击【交易】按钮,在配置对话框中的【应用模块】栏勾选【RiskManager】。
### 脚本加载
在启动脚本中添加如下代码:
```python3
# 写在顶部
from vnpy_riskmanager import RiskManagerApp
# 写在创建main_engine对象后
main_engine.add_app(RiskManagerApp)
```
## 启动模块
在菜单栏中点击【功能】-> 【交易风控】,或者点击左侧按钮栏的图标:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/risk_manager/1-1.png)
即可进入事前风控模块的UI界面,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/risk_manager/1-2.png)
## 启动风控
事前风控模块负责在委托通过交易API接口发出前,检查其状态是否符合各种风控规则。风控规则包括交易流控、下单数量、活动委托、撤单总数等,具体如下:
- 委托流控相关:
- 委托流控上限:给定时间窗口内最多允许发出的委托笔数
- 委托流控清空:每隔多少秒清零上述统计的委托笔数
- 单笔委托上限:每一笔委托允许的最大下单量
- 总成交上限:今天日内允许的最大总成交笔数(注意不是委托笔数)
- 活动委托上限:允许的处于活动状态(提交中、未成交、部分成交)最大委托数量
- 合约撤单上限:今天日内允许的单合约撤单次数上限(每个合约独立统计)
推荐每天在运行自动交易前启动事前风控,以检查每一笔发出的委托是否符合风控要求:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/risk_manager/1-3.png)
1. 在【风控运行状态】一栏的下拉框中选择【启动】;
2. 设定各种风控规则的参数后,点击下方的【保存】按钮,即可开始运行风控;
3. 此时系统内的每一笔委托,都需要满足全部风控要求(不超过限制)后,才能通过底层接口发出。
## 参数修改
事前风控模块允许用户自定义风控参数:
* 用户可以点击输入框右侧的上下箭头来修改参数,也可以直接输入数字来修改,如下图所示。
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/risk_manager/1-4.png)
* 修改后请点击【保存】按钮生效。
## 停止风控
不需要运行风控时,用户可以停止风控:
* 在【风控运行状态】的下拉框中选择【停止】,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/risk_manager/1-5.png)
* 点击下方的【保存】按钮即可停止对委托的风控检查。
+110
View File
@@ -0,0 +1,110 @@
# RpcService - RPC服务器模块
## 功能简介
RpcService是用于**将VeighNa Trader进程转化为RPC服务器**的功能模块,对外提供交易路由、行情数据推送、持仓资金查询等功能。
关于RPC的具体应用场景请参考本文档结尾的【RPC的应用场景】版块。
## 加载启动
### VeighNa Station加载
启动登录VeighNa Station后,点击【交易】按钮,在配置对话框中的【应用模块】栏勾选【RpcService】。
### 脚本加载
在启动脚本中添加如下代码:
```python3
# 写在顶部
from vnpy_rpcservice import RpcServiceApp
# 写在创建main_engine对象后
main_engine.add_app(RpcServiceApp)
```
### 启动模块
在启动模块之前,请先连接登录交易接口(连接方法详见基本使用篇的连接接口部分)。看到VeighNa Trader主界面【日志】栏输出“合约信息查询成功”之后再启动模块,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/market_radar/1.png)
成功连接交易接口后,在菜单栏中点击【功能】-> 【RPC服务】,或者点击左侧按钮栏的图标:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/rpc_service/1.png)
即可进入RPC服务模块的UI界面,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/rpc_service/2.png)
## 配置和使用
### 配置RPC服务
RPC服务基于ZeroMQ开发,对外的通讯地址包括:
* **请求响应地址**
* 用于被动接收客户端发送过来的请求,执行对应任务后返回结果;
* 功能举例:
* 行情订阅;
* 委托下单;
* 委托撤单;
* 初始化信息查询(合约、持仓、资金等);
* **事件广播地址**
* 用于主动推送服务端收到的事件数据,到所有已连接的客户端;
* 功能举例:
* 行情推送;
* 委托推送;
* 成交推送。
以上地址均采用ZeroMQ的地址格式,由**通讯协议**(如tcp://)和**通讯地址**(如127.0.0.1:2014)两部分组成。
RPC服务支持的通讯协议包括:
* **TCP协议**
* 协议前缀:tcp://
* Windows和Linux系统均可使用
* 可用于本机通讯(127.0.0.1)或者网络通讯(网络IP地址)
* **IPC协议**
* 协议前缀:ipc://
* 只能在Linux系统上使用(POSIX本地端口通讯)
* 只能用于本机通讯,后缀为任意字符串内容
一般推荐直接使用TCP协议(以及默认地址),对于使用Ubuntu系统且希望追求更低通讯延时的用户可以使用IPC协议。
### 运行RPC服务
完成通讯地址的配置后,点击【启动】按钮即可启动RPC服务,日志区域会输出"RPC服务启动成功",如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/rpc_service/3.png)
启动成功后,即可在另一VeighNa Trader进程中(客户端)使用RpcGateway来连接
如需停止RPC服务可以点击【停止】按钮,此时日志输出"RPC服务已停止"。
### 连接客户端
VeighNa提供了与RpcService配套使用的RpcGateway,作为客户端的标准接口来连接服务端并进行交易,对上层应用透明。
从客户端的视角看,RpcGateway是类似CTP的接口。因为已经在服务端统一完成外部交易账户的配置连接,客户端只需要和服务器端进行通讯即可,无需再次输入账户密码等信息。
在客户端加载RpcGateway接口后,进入VeighNa Trader主界面,点击菜单栏中【系统】->【连接RPC】,在弹出的窗口中点击【连接】即可连接使用,如下图所示。
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/rpc_service/5.png)
【主动请求地址】和【推送订阅地址】,分别对应之前在服务端配置的【请求响应地址】和【事件广播地址】,注意不要写反。
## RPC简介
由于全局解释器锁GIL的存在,导致单一Python进程只能利用CPU单核的算力。远程过程调用(Remote Procedure Call Protocol, RPC)服务可以用于**跨进程或者跨网络的服务功能调用**,有效解决了上述问题。
由一个特定的进程连接交易接口充当**服务器**的角色,在本地物理机或者局域网内部向其他独立的**客户端**进程主动推送事件,并处理客户端相关请求,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/rpc_service/7.png)
## RPC服务(RpcService)的应用场景
- 针对运行策略数量较多的用户,只需本地一条行情和交易通道,可以支持多个客户端进程同时交易,且每个客户端中交易策略独立运行,互不影响;
- 针对中小型投资机构用户,可以通过在服务端加载各种交易接口以及RiskManagerApp,实现一个轻量级的资管交易系统,多个交易员共享统一的交易通道,并实现基金产品级别的风险管理。
+439
View File
@@ -0,0 +1,439 @@
# ScriptTrader - 脚本策略交易模块
## 功能简介
ScriptTrader是用于**脚本策略交易**的功能模块,提供了交互式的量化分析和程序化交易功能,又提供以整个策略连续运行的脚本策略功能。
故其可视为直接利用Python对交易客户端进行操作。它与CTA策略模块的区别在于:
- 突破了单交易所,单标的的限制;
- 可以较方便的实现如股指期货和一篮子股票之间的对冲策略、跨品种套利、股票市场扫描自动化选股等功能。
## 加载启动
### VeighNa Station加载
启动登录VeighNa Station后,点击【交易】按钮,在配置对话框中的【应用模块】栏勾选【ScriptTrader】。
### 脚本加载
在启动脚本中添加如下代码:
```python3
# 写在顶部
from vnpy_scripttrader import ScriptTraderApp
# 写在创建main_engine对象后
main_engine.add_app(ScriptTraderApp)
```
## 启动模块
在启动模块之前,请先连接交易接口(连接方法详见基本使用篇的连接接口部分)。看到VeighNa Trader主界面【日志】栏输出“合约信息查询成功”之后再启动模块,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_strategy/1.png)
请注意,IB接口因为登录时无法自动获取所有的合约信息,只有在用户手动订阅行情时才能获取。因此需要在主界面上先行手动订阅合约行情,再启动模块。
成功连接交易接口后,在菜单栏中点击【功能】-> 【脚本策略】,或者点击左侧按钮栏的图标:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/script_trader/0.png)
即可进入脚本交易模块的UI界面,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/script_trader/1.png)
如果配置了数据服务(配置方法详见基本使用篇的全局配置部分),打开脚本交易模块时会自动执行数据服务登录初始化。若成功登录,则会输出“数据服务初始化成功”的日志,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/script_trader/20.png)
用户可以通过UI界面使用以下功能:
### 启动
脚本策略需要事先编写好脚本策略文件,如test_strategy.py(脚本策略模板可参考[**脚本策略**](#jump)部分),因此点击【打开】按钮后需要用户指定该脚本策略文件的路径,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/script_trader/21.png)
打开脚本策略之后,点击【启动】按钮则会启动脚本策略,并在下方界面输出相关信息,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/script_trader/8.png)
### 停止
如果想停止脚本策略,直接点击【停止】按钮,之后策略会停止,通知会在下方界面输出“策略交易脚本停止”的日志,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/script_trader/11.png)
### 清空
如果觉得下方显示界面的信息太多,或者想开启新的脚本策略,可以点击【清空】按钮,这时下方的所有信息就会被清空,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/script_trader/10.png)
## 脚本策略模板
<span id="jump">
脚本策略文件编写需要遵循一定格式,下面提供使用模板,其作用为:
- 订阅两个品种的行情;
- 打印合约信息;
- 每隔3秒获取最新行情。
```python3
from time import sleep
from vnpy_scripttrader import ScriptEngine
def run(engine: ScriptEngine):
""""""
vt_symbols = ["sc2209.INE", "sc2203.INE"]
# 订阅行情
engine.subscribe(vt_symbols)
# 获取合约信息
for vt_symbol in vt_symbols:
contract = engine.get_contract(vt_symbol)
msg = f"合约信息,{contract}"
engine.write_log(msg)
# 持续运行,使用strategy_active来判断是否要退出程序
while engine.strategy_active:
# 轮询获取行情
for vt_symbol in vt_symbols:
tick = engine.get_tick(vt_symbol)
msg = f"最新行情, {tick}"
engine.write_log(msg)
# 等待3秒进入下一轮
sleep(3)
```
其中engine.strategy_active用于控制While循环,可视作是脚本策略的开关:
- 点击【启动】按钮,启动While循环,执行脚本策略;
- 点击【停止】按钮,退出While循环,停止脚本策略。
## 功能函数
Jupyter模式是基于脚本引擎(ScriptEngine)驱动的,下面通过jupyter notebook来说明ScriptEngine引擎的各功能函数。
首先打开Jupyter notebook,然后加载组件、初始化脚本引擎:
```python3
from vnpy_scripttrader import init_cli_trading
from vnpy_ctp import CtpGateway
engine = init_cli_trading([CtpGateway])
```
其中:
- 脚本引擎可以支持同时连接多个接口;
- init_cli_trading(gateways: Sequence[BaseGateway])可以将多个接口类,以列表的形式传递给init_cli_trading
- init_cli_trading可视为vnpy封好的初始化启动函数,对主引擎、脚本引擎等各种对象进行了封装。
### 连接接口
**connect_gateway**
* 入参:setting: dict, gateway_name: str
* 出参:无
不同接口需要不同的配置参数,SimNow的配置如下:
```json
setting = {
"用户名": "xxxx",
"密码": "xxxx",
"经纪商代码": "9999",
"交易服务器":"180.168.146.187:10202",
"行情服务器":"180.168.146.187:10212",
"产品名称":"simnow_client_test",
"授权编码":"0000000000000000"
}
engine.connect_gateway(setting,"CTP")
```
其他接口配置可以参考site-packages目录下不同接口模块类(如vnpy_ctp.gateway.ctp_gateway)中的default_setting来填写。
### 订阅行情
**subscribe**
* 入参:vt_symbols: Sequence[str]
* 出参:无
subscribe()函数用于订阅行情信息,若需要订阅一篮子合约的行情,可以使用列表格式。
```python3
engine.subscribe(vt_symbols = ["rb2209.SHFE","rb2210.SHFE"])
```
### 查询数据
这里介绍一下连接上交易接口并成功订阅数据后的数据存储:
- 底层接口不停向主引擎推送新的数据;
- 主引擎里维护着一个ticks字典用于缓存不同标的的最新tick数据(仅能缓存最新数据);
- use_df的作用是转换成DataFrame格式,便于数据分析。
#### 单条查询
**get_tick**
* 入参:vt_symbol: str, use_df: bool = False
* 出参:TickData
查询单个标的最新tick,use_df为可选参数,用于把返回的类对象转化成DataFrame格式,便于数据分析。
```python3
tick = engine.get_tick(vt_symbol="rb2210.SHFE",use_df=False)
```
其中:
- vt_symbol:为本地合约代码,格式是合约品种+交易所,如rb2210.SHFE
- use_df:为bool变量,默认False,返回TickData类对象,否则返回相应DataFrame,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/script_trader/13.png)
**get_order**
* 入参:vt_orderid: str, use_df: bool = False
* 出参:OrderData
根据vt_orderid查询委托单的详细信息。
```python3
order = engine.get_order(vt_orderid="CTP.3_-1795780178_1",use_df=False)
```
其中,vt_orderid为本地委托号(在委托下单时,会自动返回该委托的vt_orderid)。
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/script_trader/14.png)
**get_contract**
* 入参:vt_symbol, use_df: bool = False
* 出参:ContractData
根据本地vt_symbol来查询对应合约对象的详细信息。
```python3
contract = engine.get_contract(vt_symbol="rb2210.SHFE",use_df=False)
```
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/script_trader/15.png)
**get_account**
* 入参:vt_accountid: str, use_df: bool = False
* 出参:AccountData
根据本地vt_accountid来查询对应资金信息。
```python3
account = engine.get_account(vt_accountid="CTP.189672",use_df=False)
```
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/script_trader/16.png)
**get_position**
* 入参:vt_positionid: str, use_df: bool = False
* 出参:PositionData
根据vt_positionid来查询持仓情况,返回对象包含接口名称、交易所、合约代码、数量、冻结数量等。
```python3
position = engine.get_position(vt_positionid='CTP.hc2305.SHFE.多')
```
注意,vt_positionid为vnpy内部对于一笔特定持仓的唯一持仓编号,格式为"gateway_name.vt_symbol.Direction.value",其中持仓方向可选“多”、“空”和“净”,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/script_trader/17.png)
#### 多条查询
**get_ticks**
* 入参:vt_symbols: Sequence[str], use_df: bool = False
* 出参:Sequence[TickData]
查询多个合约最新tick。
```python3
ticks = engine.get_ticks(vt_symbols=['rb2209.SHFE','rb2210.SHFE'],use_df=True)
```
vt_symbols是列表格式,里面包含多个vt_symbol,如图。
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/script_trader/18.png)
**get_orders**
* 入参:vt_orderids: Sequence[str], use_df: bool = False
* 出参:Sequence[OrderData]
根据查询多个vt_orderid查询其详细信息。vt_orderids为列表,里面包含多个vt_orderid。
```python3
orders = engine.get_orders([orderid_one,orderid_two],use_df=True)
```
**get_trades**
* 入参:vt_orderid: str, use_df: bool = False
* 出参:Sequence[TradeData]
根据给定的一个vt_orderid返回这次报单过程中的所有TradeData对象。vt_orderid是本地委托号,每一个委托OrderData,由于部分成交关系,可以对应多笔成交TradeData。
```python3
trades = engine.get_trades(vt_orderid=your_vt_orderid,use_df=True)
```
**get_bars**
* 入参:vt_symbol: str, start_date: str, interval: Interval, use_df: bool = False
* 出参:Sequence[BarData]
通过配置的数据服务查询历史数据。
```python3
bars = engine.get_bars(vt_symbol="rb2210.SHFE",start_date="20211201",
interval=Interval.MINUTE,use_df=False)
```
其中:
- vt_symbol:本地合约代码,格式为合约代码 + 交易所名称;
- start_date:起始日期,格式为"%Y%m%d"
- interval:K线周期,包括:分钟、小时、日、周;
- bars:包含了一系列BarData数据的列表对象,其BarData的定义如下:
```python3
@dataclass
class BarData(BaseData):
symbol: str
exchange: Exchange
datetime: datetime
interval: Interval = None
volume: float = 0
turnover: float = 0
open_interest: float = 0
open_price: float = 0
high_price: float = 0
low_price: float = 0
close_price: float = 0
def __post_init__(self):
self.vt_symbol = f"{self.symbol}.{self.exchange.value}"
```
#### 全量查询
在全量查询中,唯一参数是use_df,默认为False。返回的是一个包含相应数据的List对象,例如ContractData、AccountData和PositionData。
**get_all_contracts**
* 入参:use_df: bool = False
* 出参:Sequence[ContractData]
默认返回一个list,包含了全市场的ContractData,如果use_df=True则返回相应的DataFrame。
**get_all_active_orders**
* 入参:use_df: bool = False
* 出参:Sequence[OrderData]
活动委托指的是等待委托完全成交,故其状态包含“已提交、未成交、部分成交”;函数将返回包含一系列OrderData的列表对象。
**get_all_accounts**
* 入参:use_df: bool = False
* 出参:Sequence[AccountData]
默认返回包含AccountData的列表对象。
**get_all_positions**
* 入参:use_df: bool = False
* 出参:Sequence[PositionData]
默认返回包含PositionData的列表对象,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/script_trader/19.png)
### 交易委托
**buy**:买入开仓(DirectionLONGOffsetOPEN
**sell**:卖出平仓(DirectionSHORTOffsetCLOSE
**short**:卖出开仓(DirectionSHORTOffsetOPEN
**cover**:买入平仓(DirectionLONGOffsetCLOSE
* 入参:vt_symbol: str, price: float, volume: float, order_type: OrderType = OrderType.LIMIT
* 出参:str
以委托买入为例,engine.buy()函数入参包括:
- vt_symbol:本地合约代码(字符串格式);
- price:报单价格(浮点数类型);
- volume:报单数量(浮点数类型);
- order_typeOrderType枚举常量,默认为限价单(OrderType.LIMIT),同时支持停止单(OrderType.STOP)、FAKOrderType.FAK)、FOKOrderType.FOK)、市价单(OrderType.MARKET),不同交易所支持报单方式不完全一致。
```python3
engine.buy(vt_symbol="rb2210.SHFE", price=4200, volume=1, order_type=OrderType.LIMIT)
```
执行交易委托后会返回本地委托号vt_orderid。
**send_order**
* 入参:vt_symbol: str, price: float, volume: float, direction: Direction, offset: Offset, order_type: OrderType
* 出参:str
send_order函数是脚本交易策略引擎调用的发送委托的函数。一般在策略编写的时候不需要单独调用,通过buy/sell/short/cover函数发送委托即可。
**cancel_order**
* 入参:vt_orderid: str
* 出参:无
基于本地委托号撤销委托。
```python3
engine.cancel_order(vt_orderid='CTP.3_-1795780178_1')
```
### 信息输出
**write_log**
* 入参:msg: str
* 出参:无
在策略中调用write_log函数,可以进行指定内容的日志输出。
**send_email**
* 入参:msg: str
* 出参:无
配置好邮箱相关信息之后(配置方法详见基本使用篇的全局配置部分),调用send_email函数可以发送标题为“脚本策略引擎通知”的邮件到自己的邮箱。
+865
View File
@@ -0,0 +1,865 @@
# SpreadTrading - 多合约价差套利模块
## 功能简介
SpreadTrading是用于**多合约价差套利**的功能模块,用户可以通过其UI界面操作来便捷创建灵活的价差合约、完成手动交易和自动交易等任务。
## 加载启动
### VeighNa Station加载
启动登录VeighNa Station后,点击【交易】按钮,在配置对话框中的【应用模块】栏勾选【SpreadTrading】。
### 脚本加载
在启动脚本中添加如下代码:
```python3
# 写在顶部
from vnpy_spreadtrading import SpreadTradingApp
# 写在创建main_engine对象后
main_engine.add_app(SpreadTradingApp)
```
## 启动模块
<span id="jump">
对于用户自行开发的策略,需要放到VeighNa Trader运行时目录下的**strategies**目录中,才能被识别加载。具体的运行时目录路径,可以在VeighNa Trader主界面顶部的标题栏查看。
对于在Windows上默认安装的用户来说,放置策略的strategies目录路径通常为:
```bash
C:\Users\Administrator\strategies
```
其中Administrator为当前登录Windows的系统用户名。
</span>
在启动模块之前,请先连接交易接口(连接方法详见基本使用篇的连接接口部分)。看到VeighNa Trader主界面【日志】栏输出“合约信息查询成功”之后再启动模块(**如果在合约信息查询成功之前打开模块,可能会导致价差的价格跳动取值为零,进而在委托成交之后引发底层报错**),如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_strategy/1.png)
请注意,IB接口因为登录时无法自动获取所有的合约信息,只有在用户手动订阅行情时才能获取。因此需要在主界面上先手动订阅合约行情,再启动模块。
成功连接交易接口后,在菜单栏中点击【功能】-> 【价差交易】,或者点击左侧按钮栏的图标:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/spread_trading/1.png)
即可进入价差交易模块的UI界面,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/spread_trading/2.png)
## 创建价差合约
### 查询合约
在创建价差合约前,用户可以通过【查询合约】功能,寻找可以组成价差的合约(**不支持交易所套利合约**):
- 在VeighNa Trader菜单栏中点击【帮助】-> 【查询合约】按钮,弹出合约查询界面,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/spread_trading/3.png)
- 在界面中找到可用于组成价差交易的合约;
- 本文档以豆油期货的跨期套利来展示,即交易y2205.DCE(豆油期货22年5月到期合约)和y2209.DCE(豆油期货22年9月到期合约)。
### 构建价差合约
在价差交易的界面左侧,点击【价差创建】按钮,弹出创建价差界面,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/spread_trading/4.png)
价差交易模块支持灵活的价差计算公式(例如A/B、A-B*C等),同时允许引入不参与交易的定价腿,满足复杂境内外套利价差需要考虑汇率和税率等因素的需求。在创建价差合约时,需要配置相关参数,各参数要求如下:
- 价差名称
- 用户定义的价差合约名称;
- 价差名称不能重名;
- 主动腿代码
- 价差盘口价格满足条件时,先发出的那条腿的本地代码。
- 格式为vt_symbol(合约代码 + 交易所名称);
- 必须是下面的腿选项中的一项;
- 最小交易量
- 最小交易手数;
- 价格公式
- 价差合约的计算公式;
- 支持任何Python内置数学函数;
- 注意其中的变量只能是A、B、C、D、E(不需要都用);
- 【A、B、C、D、E】
- 包含构建价差合约的主动腿与被动腿,也可以引入不参与交易的定价腿,由合约代码、交易方向、交易乘数组成:
- 合约代码为公式中的变量所对应的合约本地代码(vt_symbol);
- 一般来说,价差交易原则上是主动腿完成交易后,立刻用被动腿进行对冲,故主动腿一般选择较为不活跃的合约,价格乘数和交易乘数均为正;被动腿一般选择较为活跃的合约,价格乘数和交易乘数均为负;
- 不用的变量留空即可;
设置好价差合约的参数后,点击下方的【创建价差】按钮,即可成功创建价差合约。
在豆油期货跨期套利示例中,其价格乘数和交易乘数均为1:1,即价差 = y2205 - y2209;买入1手价差等于买入1手y2205,同时卖出1手y2209完成对冲。
请注意,在多条腿并且期货合约规模不等时,构建价差合约会相对困难一些,如构建虚拟钢厂套利所用到的价差合约时,计算公式如下:
- 螺纹钢生产技艺是16吨铁矿石加上5吨焦炭练成10吨螺纹钢。
- 基于价格乘数的价差spread = 1* RB - 1.6\*I - 0.5\*J。
- 但是由于螺纹是10吨/手,铁矿石和焦炭都是100吨/手,所以他们交易乘数是1:10:10;
- 故基于最大公约数规则,其实际交易手数关系是每买入100手螺纹钢(1000吨),需要卖出16手铁矿石(1600吨)和5手焦炭(500吨)完成对冲。
### 监控价差合约
价差合约创建完毕,监控界面中的【日志】栏会输出“价差创建成功”;【价差】栏也会展示价差合约的实时行情,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/spread_trading/6.png)
在豆油期货价差交易示例中,【价差】组件的各字段含义如下所示:
- 买价
- y2205买一价 - y2209卖一价
- 买量
- min(y2205买一量, y2209卖一量)
- 取最小值用于保证各合约能均能成交
- 卖价
- y2205卖一价 - y2209买一价
- 卖量
- min(y2205卖一量, y2209买一量)
### 移除价差合约
在价差交易的界面左侧,点击【移除价差】按钮,弹出移除价差界面,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/spread_trading/35.png)
选择好要移除的价差合约之后,点击【移除】按钮,即可成功移除价差合约。【日志】组件输出“价差移除成功”,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/spread_trading/36.png)
## 手动交易
假设当前豆油期货价差合约买价为408,卖价为420,并且在大周期上,价差围绕0上下波动。
价差交易的盈利在于高抛低吸,即在低位,如-300买入豆油期货价差合约,在高位,如+800卖出价差合约,平仓获利离场。由于不能立刻成交,所以其默认执行算法SpreadTaker(主动对价成交算法)会每隔一段时间进行委托操作,一般是以超价的限价单的形式发出委托。
下面通过2个例子,分别是发出委托立即成交和发出委托等待成交来具体介绍手动交易的操作情况:
### 发出委托立即成交
假设目标价差合约价格为420,我们以超价5跳的形式,即430的价位发出买入限价单,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/spread_trading/2-7.png)
由于限价单(430)价位高于当前卖价(410),所以委托立刻成交,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/spread_trading/8.png)
此时各监控组件状态如下所示:
- 日志组件
- 买入y_05_09价差合约的顺序是:发出y2205多头委托 -> y2205委托成交 -> 发出y2209空头委托 -> y2209委托成交。价差交易必须遵循的逻辑是主动腿成交后,才去用被动腿来对冲头寸,并且对冲必须尽可能及时。这也是为什么一般被动腿会选择较为活跃合约的原因。
- 价差组件
- 买入1手豆油期货价差合约成交后,【净仓】从0变成1。实际上,VeighNa Trader【持仓】组件显示,y2205合约多头持仓1手,y2209合约空头持仓1手。
- 算法组件
- 本次委托SpreadTaker算法执行情况:成交数量1手,委托状态是【全部成交】。
### 发出委托等待成交
以400的价位发出限价买入指令,由于当前买价卖价分别位于412和426,所以委托状态显示【未成交】,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/spread_trading/9.png)
此时各监控组件状态如下所示:
- 日志组件
- 本次算法即SpreadTaker_000002已经启动,但由于价格没有触发到目标价位,算法在循环读秒中处于等待状态;
- 算法组件
- 委托状态为【未成交】,要结束算法只需鼠标双击【SpreadTaker_000002】单元格即可。
仅当卖价低于-300时,才触发该限价单,已超价5跳,即-290去主动成交。
### 撤销委托
鼠标双击【SpreadTaker_000002】单元格,即可结束该算法。此时【日志】组件输出“算法已停止”,【算法】组件显示委托状态由【未成交】变成【已撤销】,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/spread_trading/10.png)
## 自动交易
### 添加策略
用户可以基于编写好的价差策略模板(类)来创建不同的策略实例(对象)。
在左侧的下拉框中选择要交易的策略名称(如BasicSpreadStrategy),如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/spread_trading/19.png)
请注意,显示的策略名称是**策略类**(驼峰式命名)的名字,而不是策略文件(下划线模式命名)的名字。
选择好策略类之后,点击【添加策略】,会弹出添加策略对话框,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/spread_trading/11.png)
在创建策略实例时,需要配置相关参数,各参数要求如下:
- 实例名称
- 用户自定义的策略实例名称,这里是test;
- 策略实例名称不能重名;
- 价差名称
- 用于交易的价差合约,这里是y_05_09;
- 一定要是价差组件可以查询到的价差合约;
- 参数设置
- 显示的参数名是策略里写在parameters列表中的参数名;
- 默认数值为策略里的参数的默认值;
- 由上图可观察到,参数名后面<>括号中显示的是该参数的数据类型,在填写参数时应遵循相应的数据类型。其中,<class 'str'>是字符串、<class 'int'>是整数、<class 'float'>是浮点数;
- 请注意,如果某个参数可能会调整至有小数位的数值,而默认参数值是整数(比如1)。请在编写策略时,把默认参数值设为浮点数(比如1.0)。否则策略会默认该项参数为整数,在后续【编辑】策略实例参数时,会只允许填进整数。
- 以BasicSpreadStrategy为例,该策略的参数设置如下:
- buy_price
- 买入开仓阈值,图中是-300,即当价格跌破-300时,执行委托;
- sell_price
- 卖出平仓阈值,图中是400,即当价格回升到400时,执行委托;
- short_price
- 卖出开仓阈值,图中是800,即当价格上涨到800时,执行委托;
- cover_price
- 买入平仓阈值,图中是600,即当价格下跌到600时,执行委托;
- max_pos
- 主动腿委托数量;
- payup
- 超价的跳数;
- interval
- 时间间隔,即每隔一段时间,会发出委托。
参数配置完成后,点击【添加】按钮,则开始创建策略实例。创建成功后可在右下角的策略监控组件中看到该策略实例,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/spread_trading/12.png)
策略监控组件顶部显示的是策略实例名、价差名、策略类名以及策略作者名(在策略里定义的author)。顶部按钮用于控制和管理策略实例,第一行表格显示了策略内部的参数信息(参数名需要写在策略的parameters列表中图形界面才会显示),第二行表格则显示了策略运行过程中的变量信息(变量名需要写在策略的variables列表中图形界面才会显示)。【inited】字段表示当前策略的初始化状态(是否已经完成了历史数据回放),【trading】字段表示策略当前是否能够开始交易。
从上图可观察到,此时该策略实例的【inited】和【trading】状态都为【False】。说明该策略实例还没有初始化,也还不能发出交易信号。
策略实例创建成功后,该策略实例的配置信息会被保存到.vntrader文件夹下的spread_trading_strategy.json文件中。
### 管理策略
#### 初始化
策略实例创建成功后,就可以对该实例进行初始化了。点击该策略实例下的【初始化】按钮,若初始化成功,则如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/spread_trading/23.png)
可观察到此时该策略实例的【inited】状态已经为【True】。说明该策略实例已经调用过load_bar函数加载历史数据并完成初始化了。【trading】状态还是为【False】,说明此时该策略实例还不能开始自动交易。
#### 启动
策略实例初始化成功,【inited】状态为【True】时,才能启动该策略的自动交易功能。点击该策略实例下的【启动】按钮,即可启动该策略实例。成功启动后,【日志】组件则会输出相应信息(请注意,策略启动并不代表算法启动,算法启动状态取决于策略逻辑),如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/spread_trading/13.png)
此时,【算法】组件显示,test策略调用SpreadTaker算法,分别在-300和800的位子上挂上买入和卖出委托;由于实际价格没有达到这2个阈值,故委托一直挂着,其委托状态为【未成交】。
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/spread_trading/14.png)
【策略】组件中【trading】字段从【False】变为【True】,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/spread_trading/24.png)
#### 停止
若要停止策略,点击策略实例下的【停止】按钮,即可停止该策略实例的自动交易。【日志】组件输出“算法已停止”,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/spread_trading/15.png)
【算法】组件中算法状态变为【已撤销】,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/spread_trading/16.png)
【策略】组件中【trading】字段从【True】变为【False】,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/spread_trading/29.png)
#### 编辑
如果创建策略实例之后,想要编辑某个策略实例的参数(若已启动策略,需要先点击策略实例下的【停止】按钮,停止策略),可以点击该策略实例下的【编辑】按钮,会弹出参数编辑对话框,以供修改策略参数,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/spread_trading/18.png)
编辑完策略参数之后,点击下方的【确定】按钮,相应的修改会立即更新在参数表格中,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/spread_trading/30.png)
但是策略实例的交易合约代码无法修改,同时修改完后也不会重新执行初始化操作。也请注意,此时修改的只是.vntrader文件夹下spread_trading_strategy.json文件中该策略实例的参数值,并没有修改原策略文件下的参数。
修改前,json文件如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/spread_trading/26-1.png)
修改后,json文件如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/spread_trading/27-1.png)
若盘中编辑后想要再次启动策略,点击策略实例下的【启动】按钮即可再次启动该策略实例,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/spread_trading/28.png)
#### 移除
如果创建策略实例之后,想要移除某个策略实例(若已启动策略,需要先点击策略实例下的【停止】按钮,停止策略),可以点击该策略实例下的【移除】按钮。移除成功后,图形界面右下角的策略监控组件中将不会再显示该策略实例的信息。如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/spread_trading/34.png)
此时.vntrader文件夹下的spread_trading_strategy.json文件也移除了该策略实例的配置信息。
### 批量操作
在策略经过充分测试,实盘运行较为稳定,不需要经常进行调整的情况下,如果有多个需要运行的价差策略实例,可以使用界面左下角的【全部初始化】、【全部启动】和【全部停止】功能来执行盘前批量初始化、启动策略实例以及盘后批量停止策略实例的操作。
#### 全部初始化
在所有策略实例创建成功后,点击左下角的【全部初始化】按钮,则可批量初始化策略实例,如下图所示:
点击【全部初始化】后,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/spread_trading/31.png)
#### 全部启动
在所有策略实例初始化成功后,点击左下角的【全部启动】按钮,则可批量启动策略实例,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/spread_trading/32.png)
#### 全部停止
在所有策略实例启动成功后,点击左下角的【全部停止】按钮,则可批量停止策略实例,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/spread_trading/33.png)
## 价差交易策略模板(SpreadStrategyTemplate
价差交易策略模板提供了信号生成和委托管理功能,用户可以基于该模板(位于vnpy_spreadtrading.template中)自行开发策略。
用户自行开发的策略可以放在用户运行文件夹下的[strategies](#jump)文件夹内。
请注意:
1. 策略文件命名采用下划线模式,如statistical_arbitrage_strategy.py,而策略类命名采用驼峰式,如StatisticalArbitrageStrategy。
2. 自建策略的类名不要与示例策略的类名重合。如果重合了,图形界面上只会显示一个策略类名。
目前,VeighNa官方提供两个价差策略,即BasicSpreadStrategy和StatisticalArbitrageStrategy。下面通过StatisticalArbitrageStrategy示例,来展示策略开发的具体步骤:
在基于价差交易策略模板编写策略逻辑之前,需要在策略文件的顶部载入需要用到的内部组件,如下方代码所示:
```python3
from vnpy.trader.utility import BarGenerator, ArrayManager
from vnpy_spreadtrading import (
SpreadStrategyTemplate,
SpreadAlgoTemplate,
SpreadData,
OrderData,
TradeData,
TickData,
BarData
)
```
其中,SpreadStrategyTemplate和SpreadAlgoTemplate是价差交易策略模板和价差算法模板,SpreadData、OrderData、TickData、TradeData和BarData是储存对应信息的数据容器,BarGenerator是K线生成模块,ArrayManager是K线时间序列管理模块。
### 策略参数与变量
在策略类的下方,可以设置策略的作者(author),参数(parameters)以及变量(variables),如下方代码所示:
```python3
author = "用Python的交易员"
boll_window = 20
boll_dev = 2
max_pos = 10
payup = 10
interval = 5
spread_pos = 0.0
boll_up = 0.0
boll_down = 0.0
boll_mid = 0.0
parameters = [
"boll_window",
"boll_dev",
"max_pos",
"payup",
"interval"
]
variables = [
"spread_pos",
"boll_up",
"boll_down",
"boll_mid"
]
```
虽然策略的参数和变量都从属于策略类,但策略参数是固定的(由交易员从外部指定),而策略变量则在交易的过程中随着策略的状态变化,所以策略变量一开始只需要初始化为对应的基础类型。例如:整数设为0,浮点数设为0.0,而字符串则设为""。
如果需要价差交易模块引擎在运行过程中,将策略参数和变量显示在UI界面上,并在数据刷新、停止策略时保存其数值,则需把参数和变量的名字(以字符串的数据类型)添加进parameters和variables列表里。
请注意,该列表只能接受参数和变量以str、int、float和bool四种数据类型传入。如果策略里需要用到其他数据类型的参数与变量,请把该参数或变量的定义放到__init__函数下。
### 类的初始化
入参:strategy_engine, strategy_name: str, spread: SpreadData, setting: dict
出参:无
__init__函数是策略类的构造函数,需要与继承的SpreadStrategyTemplate保持一致。
在这个继承的策略类里,初始化一般分三步,如下方代码所示:
```python3
def __init__(self, cta_engine, strategy_name, vt_symbol, setting):
""""""
super().__init__(
strategy_engine, strategy_name, spread, setting
)
self.bg = BarGenerator(self.on_spread_bar)
self.am = ArrayManager()
```
1 . 通过super( )的方法继承SpreadStrategyTemplate,在__init__( )函数中传入策略引擎、策略名称、价差以及参数设置(以上参数均由策略引擎在使用策略类创建策略实例时自动传入,用户无需进行设置);
2 . 调用K线生成模块(BarGenerator):通过时间切片将Tick数据合成1分钟K线数据。如有需求,还可合成更长的时间周期数据。
3 . 调用K线时间序列管理模块(ArrayManager):基于K线数据将其转化为便于向量化计算的时间序列数据结构,并在内部支持使用talib库来计算相应的技术指标。
ArrayManager的默认长度为100,如需调整ArrayManager的长度,可传入size参数进行调整(size不能小于计算指标的周期长度)。
### 价差策略引擎调用的函数
SpreadStrategyTemplate中的update_setting函数、该函数后面四个以get开头的函数和后面两个以update开头的函数,都是价差策略引擎去负责调用的函数,一般在策略编写的时候是不需要调用的。
### 策略的回调函数
SpreadStrategyTemplate中以on开头的函数称为回调函数,在编写策略的过程中能够用来接收价差行情或者接收状态更新。回调函数的作用是当某一个事件发生的时候,策略里的这类函数会被价差交易策略引擎自动调用(无需在策略中主动操作)。回调函数按其功能可分为以下三类:
#### 策略实例状态控制(所有策略都需要)
**on_init**
* 入参:无
* 出参:无
初始化策略时on_init函数会被调用,默认写法是调用write_log函数输出“策略初始化”日志,再调用load_bar函数加载历史数据,如下方代码所示:
```python3
def on_init(self):
"""
Callback when strategy is inited.
"""
self.write_log("策略初始化")
self.load_bar(10)
```
请注意,如果是基于Tick数据回测,请在此处调用load_tick函数。
策略初始化时,策略的inited和trading状态都为【False】,此时只是调用ArrayManager计算并缓存相关的计算指标,不能发出交易信号。调用完on_init函数之后,策略的inited状态才变为【True】,策略初始化才完成。
**on_start**
* 入参:无
* 出参:无
启动策略时on_start函数会被调用,默认写法是调用write_log函数输出“策略启动”日志,如下方代码所示:
```python3
def on_start(self):
"""
Callback when strategy is started.
"""
self.write_log("策略启动")
```
调用策略的on_start函数启动策略后,策略的trading状态变为【True】,此时策略才能够发出交易信号。
**on_stop**
* 入参:无
* 出参:无
停止策略时on_stop函数会被调用,默认写法是调用write_log函数输出“策略停止”日志,同时还原策略的变量,如下方代码所示:
```python3
def on_stop(self):
"""
Callback when strategy is stopped.
"""
self.write_log("策略停止")
self.put_event()
```
调用策略的on_stop函数停止策略后,策略的trading状态变为【False】,此时策略就不会发出交易信号了。
#### 接收数据、计算指标、发出交易信号
**on_spread_data**
* 入参:无
* 出参:无
当价差数据更新的时候on_spread_data函数会被调用(因本次示例策略类StatisticalArbitrageStrategy不是基于on_spread_data交易,故不作示例讲解。基于on_spread_data交易的示例代码可参考示例策略BasicSpreadStrategy)。StatisticalArbitrageStrategy的写法是先调用get_spread_tick获取价差Tick数据,然后推进on_spread_tick函数中,如下方代码所示:
```python3
def on_spread_data(self):
"""
Callback when spread price is updated.
"""
tick = self.get_spread_tick()
self.on_spread_tick(tick)
```
**on_spread_tick**
* 入参:tick: TickData
* 出参:无
当策略收到最新的价差Tick数据的行情时,on_spread_tick函数会被调用。默认写法是通过BarGenerator的update_tick函数把收到的Tick数据推进前面创建的bg实例中以便合成1分钟的K线,如下方代码所示:
```python3
def on_spread_tick(self, tick: TickData):
"""
Callback when new spread tick data is generated.
"""
self.bg.update_tick(tick)
```
**on_spread_bar**
* 入参:bar: BarData
* 出参:无
当策略收到最新的价差K线数据时(实盘时默认推进来的是基于Tick合成的一分钟的K线,回测时则取决于选择参数时填入的K线数据频率),on_spread_bar函数就会被调用。
如果策略基于on_spread_bar推进来的K线交易,那么请把交易请求类函数都写在on_spread_bar函数下。示例策略类StatisticalArbitrageStrategy是通过1分钟K线数据回报来生成CTA信号的。一共有三部分,如下方代码所示:
```python3
def on_spread_bar(self, bar: BarData):
"""
Callback when spread bar data is generated.
"""
self.stop_all_algos()
self.am.update_bar(bar)
if not self.am.inited:
return
self.boll_mid = self.am.sma(self.boll_window)
self.boll_up, self.boll_down = self.am.boll(
self.boll_window, self.boll_dev)
if not self.spread_pos:
if bar.close_price >= self.boll_up:
self.start_short_algo(
bar.close_price - 10,
self.max_pos,
payup=self.payup,
interval=self.interval
)
elif bar.close_price <= self.boll_down:
self.start_long_algo(
bar.close_price + 10,
self.max_pos,
payup=self.payup,
interval=self.interval
)
elif self.spread_pos < 0:
if bar.close_price <= self.boll_mid:
self.start_long_algo(
bar.close_price + 10,
abs(self.spread_pos),
payup=self.payup,
interval=self.interval
)
else:
if bar.close_price >= self.boll_mid:
self.start_short_algo(
bar.close_price - 10,
abs(self.spread_pos),
payup=self.payup,
interval=self.interval
)
self.put_event()
```
- 清空未成交委托:为了防止之前下的单子在上1分钟没有成交,但是下1分钟可能已经调整了价格,就用stop_all_algos()方法立刻撤销之前未成交的所有委托,保证策略在当前这1分钟开始时的整个状态是清晰和唯一的;
- 调用K线时间序列管理模块:基于最新的1分钟价差K线数据来计算相应的技术指标,如布林带通道上下轨等。首先获取ArrayManager对象,然后将收到的K线推送进去,检查ArrayManager的初始化状态,如果还没初始化成功就直接返回,没有必要去进行后续的交易相关的逻辑判断。因为很多技术指标计算对最少K线数量有要求,如果数量不够的话计算出来的指标会出现错误或无意义。反之,如果没有return,就可以开始计算技术指标了;
- 信号计算:通过持仓的判断以及结合布林带通道在通道突破点挂出委托,同时设置离场点。
请注意,如果需要在图形界面刷新指标数值,请不要忘记调用put_event()函数。
#### 委托状态更新
以下函数在策略中几乎都可以直接pass,其具体逻辑应用交给回测/实盘引擎负责。
**on_spread_pos**
* 入参:无
* 出参:无
收到持有仓位更新时on_spread_pos函数会被调用。与CTA策略模块访问策略逻辑持仓不同,价差交易模块访问的是账户底层持仓。所以默认写法是通过调用get_spread_pos函数获取价差持仓,以供策略进行逻辑判断,如下方代码所示:
```python3
def on_spread_pos(self):
"""
Callback when spread position is updated.
"""
self.spread_pos = self.get_spread_pos()
self.put_event()
```
**on_spread_algo**
* 入参:algo: SpreadAlgoTemplate
* 出参:无
收到算法状态更新时on_spread_algo函数会被调用。
**on_order**
* 入参:order: OrderData
* 出参:无
收到策略委托回报时on_order函数会被调用。
**on_trade**
* 入参:trade: TradeData
* 出参:无
收到策略成交回报时on_trade函数会被调用。
### 主动函数
**start_long_algo**
* 入参:price: float, volume: float, payup: int, interval: int, lock: bool = False, extra: dict = None
* 出参:algoid: str
**start_short_algo**
* 入参:price: float, volume: float, payup: int, interval: int, lock: bool = False, extra: dict = None
* 出参:algoid: str
与CTA策略模块不同,价差交易的示例策略都是通过调用star_long_algo/start_short_algo函数(针对价差)而不是buy/sell/short/cover函数(针对特定合约)来发出委托的。在价差交易模块中,算法负责价差交易的执行,策略负责价差算法的调度。价差算法将价差交易简化为了普通委托,封装掉了所有主动腿下单和被动腿对冲的细节。
以下方star_long_algo函数的代码为例,可以看到,价格、数量、超价的数值、时间间隔是必填的参数,锁仓转换和开平方向则分别默认为False和Offset.NONE。也可以看到,函数内部收到传进来的参数之后就调用了SpreadStrategyTemplate里的start_algo函数来发单(因为是long指令,则自动把方向填成了LONG)
```python3
def start_long_algo(
self,
price: float,
volume: float,
payup: int,
interval: int,
lock: bool = False,
extra: dict = None
) -> str:
""""""
if not extra:
extra = None
return self.start_algo(
Direction.SHORT, price, volume,
payup, interval, lock, extra
)
```
**start_algo**
* 入参:direction: Direction, price: float, volume: float, payup: int, interval: int, lock: bool, extra: dict
* 出参:algoid: str
start_algo函数是价差策略引擎调用的启动新的价差交易算法的函数。一般在策略编写的时候不需要单独调用,通过start_long_algo/start_short_algo函数发送委托即可。
请注意,要在策略启动之后,也就是策略的trading状态变为【True】之后,才能发出交易委托。如果策略的Trading状态为【False】时调用了该函数,只会返回[]。
**stop_algo**
* 入参:algoid: str
* 出参:无
**stop_all_algos**
* 入参:无
* 出参:无
stop_algo和stop_all_algos都是负责停止价差算法的交易请求类函数。stop_algo是停止策略内指定的价差算法,stop_all_algos是停止策略所有的活动价差算法。
请注意,要在策略启动之后,也就是策略的trading状态变为【True】之后,才能撤单。
**buy**:买入开仓(DirectionLONGOffsetOPEN
**sell**:卖出平仓(DirectionSHORTOffsetCLOSE
**short**:卖出开仓(DirectionSHORTOffsetOPEN
**cover**:买入平仓(DirectionLONGOffsetCLOSE
* 入参:vt_symbol: str, price: float, volume: float, lock: bool = False
* 出参:vt_orderids: List[vt_orderid] / 无
buy/sell/short/cover都是策略内部的负责针对特定合约发出底层交易委托的请求类函数。策略可以通过这些函数给价差策略引擎发送交易信号来达到下单的目的。
以下方buy函数的代码为例,可以看到,本地代码、价格和数量是必填的参数,锁仓转换则默认为False。也可以看到,函数内部收到传进来的参数之后就调用了SpreadStrategyTemplate里的send_order函数来发单(因为是buy指令,则自动把方向填成了LONG,开平填成了OPEN)
如果lock设置为True,那么该笔订单则会进行锁仓委托转换(在有今仓的情况下,如果想平仓,则会先平掉所有的昨仓,然后剩下的部分都进行反向开仓来代替平今仓,以避免平今的手续费惩罚)。
```python3
def buy(self, vt_symbol: str, price: float, volume: float, lock: bool = False) -> List[str]:
""""""
return self.send_order(vt_symbol, price, volume, Direction.LONG, Offset.OPEN, lock)
```
**send_order**
* 入参:vt_symbol: str, price: float, volume: float, direction: Direction, offset: Offset, lock: bool = False
* 出参:vt_orderids / 无
send_order函数是价差策略引擎调用的针对特定合约(**而不是价差**)发送委托的函数。一般在策略编写的时候不需要单独调用,通过buy/sell/short/cover函数发送委托即可。
请注意,要在策略启动之后,也就是策略的trading状态变为【True】之后,才能发出交易委托。如果策略的Trading状态为【False】时调用了该函数,只会返回[]。
**cancel_order**
* 入参:vt_orderid: str
* 出参:无
**cancel_all**
* 入参:无
* 出参:无
cancel_order和cancel_all都是负责撤单的交易请求类函数。cancel_order是撤掉策略内指定的活动委托,cancel_all是撤掉策略所有的活动委托。
请注意,要在策略启动之后,也就是策略的trading状态变为【True】之后,才能撤单。
### 功能函数
以下为策略以外的功能函数:
**put_event**
* 入参:无
* 出参:无
在策略中调用put_event函数,可以通知图形界面刷新策略状态相关显示。
请注意,要策略初始化完成,inited状态变为【True】之后,才能刷新界面。
**write_log**
* 入参:msg: str
* 出参:无
在策略中调用write_log函数,可以进行指定内容的日志输出。
**get_spread_tick**
* 入参:无
* 出参:tick: TickData
在策略里调用get_spread_tick函数,可以获取价差Tick数据。
**get_spread_pos**
* 入参:无
* 出参:spread_pos: float
在策略里调用get_spread_pos函数,可以获取价差净持仓数据。
**get_leg_tick**
* 入参:vt_symbol: str
* 出参:leg.tick: TickData / None
在策略里调用get_leg_tick函数,可以获取特定合约的Tick数据。
**get_leg_pos**
* 入参:vt_symbol: str, direction: Direction = Direction.NET
* 出参:leg.net_pos: float / leg.long_pos: float /leg.short_pos: float / None
在策略里调用get_leg_pos函数,可以获取特定合约的持仓数据,用于处理瘸腿后的细粒度调整。
**send_email**
* 入参:msg: str
* 出参:无
配置好邮箱相关信息之后(配置方法详见基本使用篇的全局配置部分),在策略中调用send_email函数,可以发送指定内容的邮件到自己的邮箱。
请注意,要策略初始化完成,inited状态变为【True】之后,才能发送邮件。
**load_bar**
* 入参:days: int, interval: Interval = Interval.MINUTE, callback: Callable = None
* 出参:无
在策略中调用load_bar函数,可以在策略初始化时加载价差K线数据。
如下方代码所示,load_bar函数调用时,默认加载的天数是10,频率是一分钟,对应也就是加载10天的1分钟K线数据。在回测时,10天指的是10个交易日,而在实盘时,10天则是指的是自然日,因此建议加载的天数宁可多一些也不要太少。加载时会先依次尝试通过交易接口、数据服务、数据库获取历史数据,直到获取历史数据或返回空。
请注意,回测期内每条腿的K线数据(1分钟最佳),若有某条腿缺失一段,则所有腿的这一段数据都会被弃用。
```python3
def load_bar(
self,
days: int,
interval: Interval = Interval.MINUTE,
callback: Callable = None,
):
"""
Load historical bar data for initializing strategy.
"""
if not callback:
callback = self.on_spread_bar
self.strategy_engine.load_bar(self.spread, days, interval, callback)
```
**load_tick**
* 入参:days: int
* 出参:无
价差Tick数据来源:
首先需要在SpreadTrading模块中创建配置好价差后,通过DataRecorder模块来进行Tick录制,本地代码填入xx-spread.LOCAL,其中xx-spread为用户定义的价差名称,LOCAL为固定交易所后缀(代表本地生成)。
在策略中调用load_tick函数,可以在策略初始化时去数据库加载录制好的价差Tick盘口数据。
+186
View File
@@ -0,0 +1,186 @@
# WebTrader - Web服务器模块
## 功能简介
WebTrader是用于**Web应用后端服务**的功能模块,用户可以通过浏览器(而非PyQt桌面端)来运行管理VeighNa量化策略交易。
## 架构设计
WebTrader采用了FastAPI作为后端服务器,支持REST主动请求调用和WebSocket被动数据推送,运行时整体框架图如下:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/web_trader/web_trader_1.png)
后端服务包括两个独立的进程:
- 策略交易进程
- 运行VeighNa Trader的进程,负责所有策略交易功能的运行;
- 启动了RpcServer用于对Web服务进程功能调用;
- Web服务进程
- 运行了FastAPI的进程,负责对外提供Web访问的服务;
- 启动了RpcClient用于调用策略交易进程的相关功能。
从网页端到策略交易进程的双向通讯模式包括:
- 主动请求调用(订阅行情、挂撤单、查询数据)
- 浏览器发起REST API调用(访问某个URL地址提交数据)到Web服务进程;
- Web服务进程收到后,转换为RPC请求(Req-Rep通讯模式)发送给策略交易进程;
- 策略交易进程执行请求处理后,返回结果给Web服务进程;
- Web服务进程返回数据给浏览器。
- 被动数据推送(行情推送、委托推送)
- 浏览器发起Websocket连接到Web服务进程;
- 策略交易进程通过RPC推送(Pub-Sub通讯),将数据推送给Web服务进程;
- Web服务进程收到后,将数据通过Websocket API实时推送给浏览器(JSON格式)。
## 加载启动
### VeighNa Station加载
启动登录VeighNa Station后,点击【交易】按钮,在配置对话框中的【应用模块】栏勾选【WebTrader】。
### 脚本加载
在启动脚本中添加如下代码:
```python3
# 写在顶部
from vnpy_webtrader import WebTraderApp
# 写在创建main_engine对象后
main_engine.add_app(WebTraderApp)
```
### 启动模块
在启动模块之前,请先连接登录交易接口(连接方法详见基本使用篇的连接接口部分)。看到VeighNa Trader主界面【日志】栏输出“合约信息查询成功”之后再启动模块,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/market_radar/1.png)
成功连接交易接口后,在菜单栏中点击【功能】-> 【Web服务】,或者点击左侧按钮栏的图标:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/web_trader/web_trader_0.png)
即可进入RPC服务模块的UI界面,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/web_trader/web_trader_3.png)
此时系统中运行的只包括策略交易进程,左上角区域的服务器配置选项包括:
- 用户名和密码:从网页端登录Web应用时所用的用户名和密码,使用时请修改为自己想用的用户名和密码(通过启动目录.vntrader下的web_trader_setting.json修改),请注意这里的用户名和密码与底层交易接口无关;
- 请求和订阅地址:架构图中Web服务进程和策略交易进程之间,进行RPC通讯的地址,注意端口不要和其他程序冲突即可。
点击启动按钮后,会根据用户输入的配置信息在系统后台启动Web服务进程,同时在右侧区域输出Fast API运行过程中的相关日志信息。
## 接口演示
在启动Web服务后,在浏览器打开网址<http://127.0.0.1:8000/docs>,即可看到如下图所示的接口文档网页:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/web_trader/web_trader_2.png)
这里包含了目前WebTrader支持的相关接口信息,下面结合vnpy_webtrader项目下提供的[Jupyter Notebook](https://github.com/vnpy/vnpy_webtrader/blob/main/script/test.ipynb)进行相关的接口演示。
### 获得令牌(token
```python3
import 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即可。
### 行情订阅
```
r = requests.post(url + "tick/" + "cu2112.SHFE", headers={"Authorization":"Bearer " + token})
```
通过上述命令可实现对合约cu2112.SHFE的订阅,同时可以在图形界面收到该合约的行情数据推送,入下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/web_trader/web_trader_4.png)
### 批量查询
```python3
# 查询函数
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数据、合约数据、账户数据、 持仓数据、委托数据以及成交数据。
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/web_trader/web_trader_5.png)
### 委托测试
```python3
# 委托测试
req = {
"symbol": "cu2112",
"exchange": "SHFE",
"direction": "",
"type": "限价",
"volume": 1,
"price": 71030,
"offset": "",
"reference": "WebTrader"
}
r = requests.post(
url + "order",
json=req,
headers={"Authorization": "Bearer " + token}
)
vt_orderid = r.json()
print(vt_orderid)
```
下单后同样能在图形化界面看到委托信息,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/web_trader/web_trader_6.png)
### 撤单测试
```python3
# 撤单测试
r = requests.delete(
url + "order/" + vt_orderid,
headers={"Authorization": "Bearer " + token}
)
```
如果想将之前下的委托撤销,可以发送主动请求,结果同样会在图形化界面更新,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/web_trader/web_trader_7.png)
### Websocket测试
```python3
# 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可以被动接收策略交易进程推送过来的行情数据和委托数据等,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/web_trader/web_trader_8.png)
## 后续计划
WebTrader仅实现了Web应用的后端(提供了浏览器访问数据的接口),而前端页面(也就是浏览器中看到的网页)则按照之前的计划交给社区用户来实现,欢迎大家贡献代码。
同时WebTrader目前只支持基础的手动交易功能,后续将会逐渐加上策略交易应用相关的管理功能(比如CtaStrategy的相关调用)。
+9
View File
@@ -0,0 +1,9 @@
社区版
~~~~~~~~~
.. toctree::
:maxdepth: 2
info/index
install/index
app/index
+7
View File
@@ -0,0 +1,7 @@
# 多因子策略投研
vnpy.alpha模块面向量化研究、机器学习建模和因子特征工程场景,供用户在本地Python环境中进行数据处理、特征计算、模型训练和策略研究。
AlphaDataset支持通过`add_feature``set_label`添加字符串形式的因子表达式。该能力用于本地受信用户自行编写和执行量化因子表达式,并非面向远程调用的服务接口。
在二次开发中,不应将Web请求、开放API、远程配置或其他不可信来源的字符串内容未经校验直接作为因子表达式执行。如需支持外部表达式输入,应由业务系统先完成白名单限制、表达式校验、人工审核或隔离执行等安全措施。
+87
View File
@@ -0,0 +1,87 @@
# 贡献代码
---
## 创建PR
我们欢迎任何人贡献代码到VeighNa。
如果希望贡献代码请使用Github的PR(Pull Request)的流程。
PR流程大致如下:
---
1. [创建 Issue][CreateIssue] - 对于较大的改动(如新功能,大型重构等)建议先开issue讨论一下, 较小的improvement(如文档改进,bugfix等)直接发PR即可
2. Fork [VeighNa][#GithubVnpy] - 点击右上角**Fork**按钮
3. Clone你自己的fork: ```git clone https://github.com/$userid/vnpy.git```
> 如果你的fork已经过时,需要手动[sync][GithubDocForSync]
4. 从**dev**创建你自己的branch: ```git checkout -b $my_feature_branch dev```
5. 在$my_feature_branch上修改并将修改push到你Fork之后的仓库上
6. 创建从你的fork的$my_feature_branch分支到主项目的**dev**分支的[Pull Request]:
[点开这里][CreatePR] ,再点击**compare across forks**,选择需要的fork和branch创建PR
---
创建完PR之后请耐心等待:我们一旦有空就会检查PR,一旦你的代码有用且[符合要求](#代码风格),就会被合并!
---
## 代码风格
在为VeighNa写代码的时候,需要遵循一些基本的规则,否则你的代码可能无法被merge。
这些规则包括:
- [贡献代码](#贡献代码)
- [创建PR](#创建pr)
- [代码风格](#代码风格)
- [命名规则](#命名规则)
- [代码格式](#代码格式)
- [代码质量检查](#代码质量检查)
### 命名规则
我们的代码的命名规则如下:
* 类属性、类方法、参数和变量使用小写加下划线的形式
* 类名使用驼峰式命名
* 常量使用大写加下划线的形式
例如:
```python3
DEFAULT_PATH = "/tmp/VeighNa/"
class ClassA:
def __init__(self, arg_one: int, arg_two: str):
if arg_two is None:
arg_two = DEFAULT_PATH
self.property_one = arg_one
variable_one = "some string"
```
### 代码格式
我们对代码格式没有特别严格的要求,但是至少要符合pep8标准,并且额外要在类和函数下面带上docstring(就是一段"""""")。
要让代码符合pep8标准,写完代码之后使用[autopep8](https://github.com/hhatto/autopep8)格式化你的代码就可以了:
```bash
autopep8 --in-place --recursive .
```
### 代码质量检查
VeighNa项目使用两个工具来保证代码质量:
1. [ruff](https://github.com/astral-sh/ruff) - 用于代码风格和质量检查
- 在项目根目录下运行```ruff check .```检查代码中的风格问题
- 可以使用```ruff check --fix .```自动修复部分问题
2. [mypy](https://github.com/python/mypy) - 用于静态类型检查
- 在项目根目录下运行```mypy vnpy```检查代码中的类型注解问题
如果检查出error或warning,说明你的代码需要进行修改以符合项目标准。确保在提交PR前解决所有警告和错误。
[GithubVnpy]:https://github.com/vnpy/vnpy
[GithubDocForSync]:https://help.github.com/articles/syncing-a-fork/
[CreateIssue]:https://github.com/vnpy/vnpy/issues/new
[CreatePR]:https://github.com/vnpy/vnpy/compare?expand=1
+409
View File
@@ -0,0 +1,409 @@
# 数据库
VeighNa Trader目前支持以下八种数据库:
## SQL类数据库简介
### SQLite(默认)
SQLite是一个轻量的嵌入式数据库,无需安装和配置数据服务程序,是VeighNa的**默认数据库**。适合入门新手用户,其特点如下:
- 存储在一个单一的跨平台的磁盘文件上;
- 不需要在系统中配置、安装和管理;
- 不需要一个单独的服务器进程。
#### SQLite配置字段
SQLite在VeighNa Trader中配置时,需填写以下字段信息:
| 字段名 | 值 | 是否必填 |
|--------- |---- | --- |
|database.name | sqlite | 可选(不填默认使用sqlite)
|database.database | 数据库文件(相对于trader目录) | 必填 |
SQLite配置示例如下所示:
| 字段名 | 值 |
|--------- |---- |
|database.name | sqlite |
|database.database | database.db |
### MySQL
MySQL是目前主流的开源关系型数据库,其特点如下:
- 文档材料丰富,社区及用户活跃;
- 支持多种操作系统,多种开发语言;
- 可替换其他高性能NewSQL数据库兼容实现(如TiDB)。
#### MySQL配置字段
MySQL在VeighNa Trader中配置时,需要填写以下字段信息:
| 字段名 | 值 | 是否必填 |
|--------- |---- | ---- |
|database.name | "mysql"| 必填 |
|database.host | 地址 | 必填 |
|database.port | 端口 | 必填 |
|database.database | 数据库名 | 必填 |
|database.user | 用户名 | 可选 |
|database.password | 密码 | 可选 |
MySQL配置示例如下所示:
| 字段名 | 值 |
|--------- |---- |
|database.name | mysql |
|database.host | localhost |
|database.port | 3306 |
|database.database | vnpy |
|database.user | root |
|database.password | |
### PostgreSQL
PostgreSQL是特性更为丰富的开源关系型数据库,只推荐熟手使用。相比于MySQL,其特点如下:
- 采用多进程结构;
- 支持通过扩展插件来新增功能。
#### PostgreSQL配置字段
PostgreSQL在VeighNa Trader中配置时,需要填写以下字段信息:
| 字段名 | 值 | 是否必填 |
|--------- |---- | ---- |
|database.name | "postgresql" | 必填 |
|database.host | 地址 | 必填 |
|database.port | 端口 | 必填 |
|database.database | 数据库名 | 必填 |
|database.user | 用户名 | 必填 |
|database.password | 密码 | 必填 |
PostgreSQL配置示例如下所示:
| 字段名 | 值 |
|--------- |---- |
|database.name | postgresql |
|database.host | localhost |
|database.port | 5432 |
|database.database | vnpy |
|database.user | postgres |
|database.password | 123456 |
请注意,VeighNa不会主动为关系型数据库创建数据库,所以请确保所填写的database.database字段对应的数据库已经创建好了。若未创建数据库,请手动连接数据库并运行该命令:
```sql
create database <database.database>;
```
## 非SQL类数据库简介
### MongoDB
MongoDB是一个基于分布式文件储存(bson格式)的非关系型数据库,其特点如下:
- 面向文档存储,操作比较简单;
- 支持丰富的存储类型和数据操作;
- 内置的热数据内存缓存实现更快的读写速度。
#### MongoDB配置字段
MongoDB在VeighNa Trader中配置时,需要填写以下字段信息:
| 字段名 | 值 | 是否必填|
|--------- |---- | ---|
|database.name | "mongodb" | 必填 |
|database.host | 地址| 必填 |
|database.port | 端口| 必填 |
|database.database | 数据库名| 必填 |
|database.user | 用户名| 可选 |
|database.password | 密码| 可选 |
|database.authentication_source | [创建用户所用的数据库][AuthSource]| 可选 |
MongoDB的带认证配置示例如下所示:
| 字段名 | 值 |
|--------- |---- |
|database.name | mongodb |
|database.host | localhost |
|database.port | 27017 |
|database.database | vnpy |
|database.user | root |
|database.password | |
|database.authentication_source | vnpy |
[AuthSource]: https://docs.mongodb.com/manual/core/security-users/#user-authentication-database
### InfluxDB
InfluxDB是专门针对时间序列数据存储设计的非关系型数据库,其特点如下:
- 列式数据存储提供极高的读写效率;
- 采用独立服务进程的模式运行,也能支持多进程的并发访问需求。
在安装时需要选择2.0版本的InfluxDB。
请注意,运行influxd.exe的cmd需要保持运行,如果关闭则会导致InfluxDB退出,或者也可以使用一些辅助工具将其注册为后台运行的Windows服务。
#### InfluxDB配置字段
InfluxDB在VeighNa Trader中配置时,需要填写以下字段信息:
| 字段名 | 值 | 是否必填 |
|--------- |---- | ---- |
|database.name | "influxdb" | 必填 |
|database.host | 地址| 必填 |
|database.port | 端口| 必填 |
|database.database | 数据库名| 必填 |
|database.user | 用户名| 必填 |
|database.password | 密码| 必填 |
InfluxDB配置示例如下所示:
| 字段名 | 值 |
|--------- |---- |
|database.name | influxdb |
|database.host | localhost |
|database.port | 8086 |
|database.database | vnpy |
|database.user | root |
|database.password | 12345678 |
### DolphinDB
DolphinDB是浙江智臾科技有限公司研发的一款高性能分布式时序数据库,特别适用于对速度要求极高的低延时或实时性任务,其特点如下:
- 列式分析型(OLAP)数据库,采用混合引擎(基于内存和硬盘),充分利用缓存来加速;
- 原生分区表存储,合理的分区方案可以让CPU多线程并行加载每个分区内的数据;
- 支持高效的数据压缩,显著减小硬盘存储空间的同时,还能大幅降低IO通讯的开销。
尽管DolphinDB是商业软件,但是也提供了免费的社区版,在安装时需要选择[2.0 Beta](https://github.com/dolphindb/release/blob/master/2.00/README.md)版本。
请注意:
- 运行dolphindb.exe的cmd需要保持运行,如果关闭则会导致DolphinDB退出,或者也可以使用一些辅助工具将其注册为后台运行的Windows服务;
- 因为DolphinDB目前不支持Python3.10,所以VeighNa Studio 3.0.0没有提供DolphinDB支持。
#### DolphinDB配置字段
需要填写以下字段:
| 字段名 | 值 | 是否必填 |
|--------- |---- | ---- |
|database.name | "dolphindb"| 必填 |
|database.host | 地址 | 必填 |
|database.port | 端口 | 必填 |
|database.database | 数据库名 | 必填 |
|database.user | 用户名 | 必填 |
|database.password | 密码 | 必填 |
DolphinDB配置示例如下所示:
| 字段名 | 值 |
|--------- |---- |
|database.name | dolphindb |
|database.host | localhost |
|database.port | 8848 |
|database.database | vnpy |
|database.user | admin |
|database.password | 123456|
### Arctic
Arctic是由英国量化对冲基金Man AHL基于MongoDB开发的高性能金融时序数据库,其特点如下:
- 支持直接存储pandas的DataFrame和numpy的ndaaray对象;
- 允许对数据进行版本化管理(类似于数据库中的git),便于因子挖掘过程中的数据迭代管理;
- 基于分块化存储和LZ4压缩,在网络和磁盘IO方面节省大量资源,实现超高性能的数据查询。
请注意,因为Arctic目前不支持Python3.10,所以VeighNa Studio 3.0.0没有提供Arctic支持。
#### Artic配置字段
| 字段名 | 值 | 是否必填 |
|--------- |---- | ---- |
|database.name | "arctic"| 必填 |
|database.host | 地址 | 必填 |
|database.port | 端口 | 必填 |
Arctic配置示例如下所示:
| 字段名 | 值 |
|--------- |---- |
|database.name | arctic |
|database.host | localhost |
|database.database | vnpy |
### Level DB
LevelDB是由Google推出的高性能Key/Value数据库,其特点如下:
- 定位为通用型数据存储方案;
- 基于LSM算法实现进程内存储引擎;
- 支持数十亿级别的海量数据。
请注意,因为LevelDB目前不支持Python3.10,所以VeighNa Studio 3.0.0没有提供LevelDB支持。
#### LevelDB配置字段
| 字段名 | 值 | 是否必填 |
|--------- |---- | ---- |
|database.name | "leveldb"| 必填 |
|database.database | 数据库名 | 必填 |
|database.port | 端口 | 必填 |
LevelDB配置示例如下所示:
| 字段名 | 值 |
|--------- | ---- |
|database.name | leveldb |
|database.database | vnpy_data |
## 数据库配置(以MySQL为例)
本文档以MySQL为例,介绍数据库的配置过程。
首先在[MySQL官网](https://dev.mysql.com/downloads/)下载Windows版本安装包【MySQL Installer for Windows】,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/database/1.png)
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/database/2.png)
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/database/3.png)
下载完成后得到msi格式的安装包,双击打开后选择【Full】模式安装MySQL,一路点击【Next】按钮即可完成安装。
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/database/4.png)
安装过程中将会自动从网站下载相关组件,先点击【Execute】按钮来补全,再点击【Next】按钮。
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/database/5.png)
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/database/6.png)
安装过程中将会要求输入3次密码,这里为了方便演示,我们将密码设置为1001,请在自己安装的过程中使用更加复杂安全的密码。
安装完毕后会自动打开MySQL的图形管理工具MySQL WorkBench,点击菜单栏【Database】->【Connect to Database】,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/database/7.png)
在弹出的对话框中,直接选择默认数据库Local Instance MySQL,然后点击【OK】按钮连接MySQL数据库服务器。
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/database/8.png)
在自动打开的数据库管理界面中,点击下图中菜单栏红色方框的按钮,来创建新的数据库。在【Name】中输入“vnpy”,然后点击下方的【Apply】按钮确认。
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/database/9.png)
在之后弹出的数据库脚本执行确认对话框中,同样点击【Apply】即可,这样就完成了在MySQL WorkBench的所有操作。
随后启动VeighNa Trader,点击菜单栏的【配置】,设置数据库相关字段:
- name要改成mysql(请注意大小写);
- database改成vnpy
- host为本地IP,即localhost或者127.0.0.1
- port为MySQL的默认端口3306
- user用户名为root
- password密码则是之前设置的1001。
```json
database.name: mysql
database.database: vnpy
database.host: localhost
database.port: 3306
database.user: root
database.password: 1001
```
填写完毕后如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/database/22.png)
保存完成配置修改后,重启VeighNa Trader来启用新的数据库配置。重启后,在打开VeighNa Trader的过程中若无报错提示,则说明MySQL数据库配置成功。
## 脚本使用
脚本使用前,请先按照上文配置好使用的数据库, 使用时调用相应的函数接口。
### 脚本加载
#### 在脚本中加载所需的包和数据结构
```python3
from datetime import datetime
from typing import List
from vnpy.trader.constant import Exchange, Interval
from vnpy.trader.database import get_database
from vnpy.trader.object import BarData, TickData
# 获取数据库实例
database = get_database()
```
#### 配置所需合约的具体参数数据
```python3
# 合约代码,888为米筐的连续合约,仅用于示范,具体合约代码请根据需求自行更改
symbol = "cu888"
# 交易所,目标合约的交易所
exchange = Exchange.SHFE
# 历史数据开始时间,精确到日
start = datetime(2019, 1, 1)
# 历史数据结束时间,精确到日
end = datetime(2021, 1, 20)
# 数据的时间粒度,这里示例采用日级别
interval = Interval.DAILY
```
#### 数据库的读取操作
如数据库指定时间段没有数据,返回空列表
```python3
# 读取数据库中k线数据
bar1 = database.load_bar_data(
symbol=symbol,
exchange=exchange,
interval=interval,
start=start,
end=end
)
# 读取数据库中tick数据
tick1 = database.load_tick_data(
symbol=symbol,
exchange=exchange,
start=start,
end=end
)
```
#### 数据库的写入操作
请注意,示例中的**bar_data**和**tick_data**均未在示例中展现获取和转换方法。如需以脚本方式写入,请自行参考源码或其他途径,转换成示例中的数据结构。
```python3
# 需要存入的k线数据,请自行获取并转换成所需的形式
bar_data: List[BarData] = None
database.save_bar_data(bar_data)
# 需要存入的k线数据,请自行获取并转换成所需的形式
tick_data: List[TickData] = None
# 将tick数据存入数据库
database.save_tick_data(tick_data)
```
#### 数据库删除操作
无法恢复,请谨慎操作
```python3
# 删除数据库中k线数据
database.delete_bar_data(
symbol=symbol,
exchange=exchange,
interval=interval
)
# 删除数据库中tick数据
database.delete_tick_data(
symbol=symbol,
exchange=exchange
)
```
+138
View File
@@ -0,0 +1,138 @@
# 数据服务
对于数据服务,VeighNa提供了标准化的接口BaseDatafeed(位于vnpy.trader.datafeed中),实现了更加灵活的数据服务支持。在全局配置中,和数据服务相关的字段都以datafeed作为前缀。
具体字段含义如下:
- datafeed.name:数据服务接口的名称,必须为全称的小写英文字母;
- datafeed.username:数据服务的用户名;
- datafeed.password:数据服务的密码。
以上字段对于所有数据服务都是必填的,如果是token方式授权请填写在datafeed.password字段中。目前VeighNa Trader支持以下七种数据服务,**具体每个数据服务的细节可在对应的项目地址中找到**。
## 迅投研
迅投研是由睿智融科公司推出的专业数据服务,对于大部分个人投资者来说应该都是性价比比较高的选择:
- 项目地址:[vnpy_xt](https://github.com/vnpy/vnpy_xt)
- 数据分类:股票、期货、期权、基金、合约信息、财务信息
- 数据周期:日线、小时线、分钟线、TICK(实时更新)
- 注册申请:[迅投研](https://xuntou.net/#/signup?utm_source=vnpy)
## RQData
米筐RQData是由米筐科技公司推出的云端数据服务,提供了广泛的国内金融市场品种数据支持:
- 项目地址:[vnpy_rqdata](https://github.com/vnpy/vnpy_rqdata)
- 数据分类:股票、期货、期权、基金和黄金TD
- 数据周期:日线、小时线、分钟线、TICK(实时更新)
- 注册申请:[RICEQUANT](https://www.ricequant.com/welcome/purchase?utm_source=vnpy)
**请注意,配置信息里的username和password不是米筐官网登录用的账号和密码。**
## UData
恒有数UData是由恒生电子推出的云端数据服务,提供不限次、不限量的多种金融数据获取:
- 项目地址:[vnpy_udata](https://github.com/vnpy/vnpy_udata)
- 数据分类:股票、期货
- 数据周期:分钟线(盘后更新)
- 注册申请:[恒有数UData](https://udata.hs.net/home)
## TuShare
TuShare是国内知名的开源Python金融数据接口项目,由大神Jimmy团队长期开发维护,除了行情数据外还提供许多另类数据:
- 项目地址:[vnpy_tushare](https://www.github.com/vnpy/vnpy_tushare)
- 数据分类:股票、期货
- 数据周期:日线、分钟线(盘后更新)
- 注册申请:[Tushare大数据社区](https://tushare.pro/)
## TQSDK
天勤TQSDK是由信易科技推出的Python程序化交易解决方案,提供当前可交易合约上市以来的历史数据获取:
- 项目地址:[vnpy_tqsdk](https://github.com/vnpy/vnpy_tqsdk)
- 数据分类:期货
- 数据周期:分钟线(实时更新)
- 注册申请:[天勤量化-信易科技(shinnytech.com)](https://www.shinnytech.com/tianqin)
## Wind
万得Wind对于在国内金融机构工作的从业者来说,已经是工作中的标准配置,不管是股票、债券还是商品市场的数据,Wind可以说是应有尽有:
- 项目地址:[vnpy_wind](https://github.com/vnpy/vnpy_wind)
- 数据分类:期货
- 数据周期:分钟线(实时更新)
- 注册申请:[Wind金融终端](https://www.wind.com.cn/newsite/wft.html)
## iFinD
同花顺iFinD是同花顺公司推出的面向专业机构用户的金融数据终端,且在过去几年中的市场占有率快速上升:
- 项目地址:[vnpy_ifind](https://github.com/vnpy/vnpy_ifind)
- 数据分类:期货
- 数据周期:分钟线(实时更新)
- 注册申请:[iFinD金融数据终端](http://www.51ifind.com/)
## Tinysoft
作为国内老牌金融数据公司的天软,其核心产品【天软.NET金融分析平台】(简称TinySoft),在券商研究所和自营领域积累了大量用户。翻看券商的金融工程研报时,经常会发现图表的备注信息中写有“以上数据来自天软”的数据来源说明:
- 项目地址:[vnpy_tinysoft](https://github.com/vnpy/vnpy_tinysoft)
- 数据分类:期货
- 数据周期:分钟线(实时更新)
- 注册申请:[天软.NET金融分析平台](http://www.tinysoft.com.cn/TSDN/HomePage.tsl)
请注意,因为Tinysoft目前不支持Python3.10,所以VeighNa Studio 3.0.0没有提供Tinysoft支持。
## 脚本使用
脚本使用前,请先按照上文配置好使用的数据服务, 使用时调用相应的函数接口(具体接口支持请参考上文中支持的数据周期)。
### 脚本加载
#### 在脚本中加载所需的包和数据结构
```python3
from datetime import datetime
from vnpy.trader.constant import Exchange, Interval
from vnpy.trader.datafeed import get_datafeed
from vnpy.trader.object import HistoryRequest
# 获取数据服务实例
datafeed = get_datafeed()
```
#### 获取k线级别的历史数据
```python3
req = HistoryRequest(
# 合约代码(示例cu888为米筐连续合约代码,仅用于示范,具体合约代码请根据需求查询数据服务提供商)
symbol="cu888",
# 合约所在交易所
exchange=Exchange.SHFE,
# 历史数据开始时间
start=datetime(2019, 1, 1),
# 历史数据结束时间
end=datetime(2021, 1, 20),
# 数据时间粒度,默认可选分钟级、小时级和日级,具体选择需要结合该数据服务的权限和需求自行选择
interval=Interval.DAILY
)
# 获取k线历史数据
data = datafeed.query_bar_history(req)
```
#### 获取tick级别的历史数据
由于tick数据量较大,下载前请先参考上文确认数据服务是否提供tick数据的下载服务
```python3
req = HistoryRequest(
# 合约代码(示例cu888为米筐连续合约代码,仅用于示范,具体合约代码请根据需求查询数据服务提供商)
symbol="cu888",
# 合约所在交易所
exchange=Exchange.SHFE,
# 历史数据开始时间
start=datetime(2019, 1, 1),
# 历史数据结束时间
end=datetime(2021, 1, 20),
# 数据时间粒度,为tick级别
interval=Interval.TICK
)
# 获取tick历史数据
data = datafeed.query_tick_history(req)
```
+780
View File
@@ -0,0 +1,780 @@
# 交易接口
## 加载启动
### VeighNa Station加载
启动登录VeighNa Station后,点击【交易】按钮,在配置对话框中的【交易接口】栏勾选想要交易的接口。
### 脚本加载
以CTP接口为例,在启动脚本中添加如下代码:
```python3
# 写在顶部
from vnpy_ctp import CtpGateway
# 写在创建main_engine对象后
main_engine.add_gateway(CtpGateway)
```
## 连接接口
在图形化操作界面VeighNa Trader上的菜单栏中点击【系统】->【连接CTP】,会弹出账号配置窗口,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/gateway/1.png)
输入账号、密码等相关信息即可连接接口,并立刻进行查询工作: 如查询账号信息、查询持仓、查询委托信息、查询成交信息等。查询成功后可在主界面的组件中看到输出的日志,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/gateway/5.png)
### 修改json配置文件
接口配置相关信息保存在json文件中,放置在用户目录下的.vntrader文件夹内,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/gateway/3.png)
如果需要修改接口配置文件,用户既可以在图形化界面VeighNa Trader内修改,也可以直接在.vntrader文件夹下修改对应的json文件。
另外将json配置文件分离于vnpy的好处在于:避免每次升级都要重新配置json文件。
### 查看可交易的合约
先登录接口,然后在菜单栏中点击【帮助】->【查询合约】即可弹出空白的【查询合约】窗口,点击【查询】按钮后才会显示查询结果。留空则查询全部合约,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/gateway/4.png)
## 接口分类
| 接口 | 类型 |
| ---------------------| :--------------------------------------------: |
| CTP | 期货、期货期权(实盘6.5.1) |
| CTP测试 | 期货、期货期权(测试6.5.1) |
| CTP Mini | 期货、期货期权(实盘1.4) |
| 飞马 | 期货 |
| CTP期权 | ETF期权(实盘20190802 |
| 顶点飞创 | ETF期权 |
| 顶点HTS | ETF期权 |
| 恒生UFT | 期货、ETF期权 |
| 易盛 | 期货、黄金TD |
| 中泰XTP | A股、两融、ETF期权 |
| 国泰君安统一交易网关 | A股 |
| 华鑫奇点股票 | A股 |
| 华鑫奇点期权 | ETF期权 |
| 中亿汇达Comstar | 银行间市场 |
| 东方证券OST | A股 |
| 盈透证券 | 海外多品种 |
| 易盛9.0外盘 | 外盘期货 |
| 直达期货 | 外盘期货 |
| 融航 | 期货资管 |
| TTS | 期货 |
| 飞鼠 | 黄金TD |
| 金仕达黄金 | 黄金TD |
## 接口详解
### CTP
#### 接口支持
- 操作系统
- Windows
- Ubuntu
- 交易品种
- 期货
- 期货期权
- 持仓方向
- 只支持双向持仓
- 历史数据
- 不提供
#### 相关字段
- 用户名:
- 密码:
- 经纪商代码:
- 交易服务器:
- 行情服务器:
- 产品名称:
- 授权编码:
#### 获取账号
- 仿真账号:从SimNow网站上获取。只需输入手机号码和短信验证即可(短信验证有时只能在工作日正常工作时段收到)。SimNow的用户名(InvestorID)为6位纯数字,经纪商编号为9999,并且提供两套环境用于盘中仿真交易以及盘后的测试。需要修改一次密码之后才能使用。请注意每套仿真环境的适用时间段是不同的。
- 实盘账号:在期货公司开户,通过联系客户经理可以开通。用户名为纯数字,经纪商编号也是4位纯数字(每个期货公司的经纪商编号都不同)。另外,实盘账号也可以开通仿真交易功能,同样需要联系客户经理。
### CTPTESTCTP测试)
#### 接口支持
- 操作系统
- Windows
- Ubuntu
- 交易品种
- 期货
- 期货期权
- 持仓方向
- 只支持双向持仓
- 历史数据
- 不提供
#### 相关字段
- 用户名:
- 密码:
- 经纪商代码:
- 交易服务器:
- 行情服务器:
- 产品名称:
- 授权编码:
#### 获取账号
在期货公司开户,通过联系客户经理向期货公司申请进行穿透式接入测试。
### MINICTP Mini
#### 接口支持
- 操作系统
- Windows
- Ubuntu
- 交易品种
- 期货
- 期货期权
- 持仓方向
- 只支持双向持仓
- 历史数据
- 不提供
#### 相关字段
- 用户名:
- 密码:
- 经纪商代码:
- 交易服务器:
- 行情服务器:
- 产品名称:
- 授权编码:
#### 获取账号
在期货公司开户,通过联系客户经理可以开通。用户名为纯数字,经纪商编号也是4位纯数字(每个期货公司的经纪商编号都不同)。另外,实盘账号也可以开通仿真交易功能,同样需要联系客户经理。
### FEMAS(飞马)
#### 接口支持
- 操作系统
- Windows
- 交易品种
- 期货
- 持仓方向
- 只支持双向持仓
- 历史数据
- 不提供
#### 相关字段
- 用户名:
- 密码:
- 经纪商代码:
- 交易服务器:
- 行情服务器:
- 产品名称:
- 授权编码:
#### 获取账号
在期货公司开户,通过联系客户经理可以开通。用户名为纯数字,经纪商代码也是4位纯数字(每个期货公司的经纪商编号都不同)。另外,实盘账号也可以开通仿真交易功能,同样需要联系客户经理。
### SOPTCTP期权)
#### 接口支持
- 操作系统
- Windows
- Ubuntu
- 交易品种
- ETF期权
- 持仓方向
- 只支持双向持仓
- 历史数据
- 不提供
#### 相关字段
- 用户名:
- 密码:
- 经纪商代码:
- 交易服务器:
- 行情服务器:
- 产品名称:
- 授权编码:
#### 获取账号
在期货公司开户,通过联系客户经理可以开通。用户名为纯数字,经纪商代码也是4位纯数字(每个期货公司的经纪商代码都不同)。另外,实盘账号也可以开通仿真交易功能,同样需要联系客户经理。
### SEC(顶点飞创)
#### 接口支持
- 操作系统
- Windows
- 交易品种
- ETF期权
- 持仓方向
- 股票只支持单向持仓
- 股票期权只支持双向持仓
- 历史数据
- 不提供
#### 相关字段
- 账号:
- 密码:
- 行情地址:
- 交易地址:
- 行情协议:TCP、UDP
- 授权码:
- 产品号:
- 采集类型:顶点、恒生、金证、金仕达
- 行情压缩:N、Y
#### 获取账号
在期货公司开户,通过联系客户经理可以开通。
### HTS(顶点HTS
#### 接口支持
- 操作系统
- Windows
- 交易品种
- ETF期权
- 持仓方向
- 双向持仓
- 历史数据
- 不提供
#### 相关字段
- 账号:
- 密码:
- 行情地址:
- 交易地址:
- 行情协议:TCP、UDP
- 授权码:
- 产品号:
- 采集类型:顶点、恒生、金证、金仕达
- 行情压缩:N、Y
#### 获取账号
在期货公司开户,通过联系客户经理可以开通。
### UFT(恒生UFT
#### 接口支持
- 操作系统
- Windows
- Ubuntu
- 交易品种
- 期货
- ETF期权
- 持仓方向
- 只支持双向持仓
- 历史数据
- 不提供
#### 相关字段
- 用户名:
- 密码:
- 行情服务器:
- 交易服务器:
- 服务器类型:期货、ETF期权
- 产品名称:
- 授权编码:
- 委托类型:q
#### 获取账号
测试账号请通过恒生电子申请。
### ESUNNY(易盛)
#### 接口支持
- 操作系统
- Windows
- Ubuntu
- 交易品种
- 期货
- 黄金TD
- 持仓方向
- 支持双向持仓
- 历史数据
- 不支持
#### 相关字段
- 行情账号:
- 行情密码:
- 行情服务器:
- 行情端口:0
- 行情授权码:
- 交易账号:
- 交易密码:
- 交易服务器:
- 交易端口:0
- 交易产品名称:
- 交易授权编码:
- 交易系统:内盘、外盘
#### 获取账号
测试账号请通过易盛官方网站申请。
### XTP(中泰柜台)
#### 接口支持
- 操作系统
- Windows
- Ubuntu
- 交易品种
- A股
- 两融
- ETF期权
- 持仓方向
- 股票只支持单向持仓
- 其余标的支持双向持仓
- 历史数据
- 不提供
#### 相关字段
- 账号:
- 密码:
- 客户号: 1
- 行情地址:
- 行情端口: 0
- 交易地址:
- 交易端口: 0
- 行情协议: TCP、UDP
- 日志级别:FATAL、ERROR、WARNING、INFO、DEBUG、TRACE
- 授权码:
#### 获取账号
测试账号请通过中泰证券申请。
#### 其他特点
XTP是首家提供融资融券的极速柜台。
### HFT(国泰君安统一交易网关)
#### 接口支持
- 操作系统
- Windows
- 交易品种
- A股
- 持仓方向
- 只支持单向持仓
- 历史数据
- 不提供
#### 相关字段
- 交易用户名:
- 交易密码:
- 交易服务器:
- 交易端口:
- 机构代号:
- 营业部代号:
- 网关:
- 行情用户名:
- 行情密码:
- 行情服务器:
- 行情端口:
#### 获取账号
测试账号请通过国泰君安申请。
### TORASTOCK(华鑫奇点股票)
#### 接口支持
- 操作系统
- Windows
- 交易品种
- A股
- 持仓方向
- 只支持单向持仓
- 历史数据
- 不提供
#### 相关字段
- 账号:
- 密码:
- 行情服务器:
- 交易服务器:
- 账号类型:用户代码、资金账号
- 地址类型:前置地址、FENS地址
#### 获取账号
测试账号请通过华鑫证券申请。
### TORAOPTION(华鑫奇点期权)
#### 接口支持
- 操作系统
- Windows
- 交易品种
- ETF期权
- 持仓方向
- 只支持双向持仓
- 历史数据
- 不提供
#### 相关字段
- 账号:
- 密码:
- 行情服务器:
- 交易服务器:
- 账号类型:用户代码、资金账号
- 地址类型:前置地址、FENS地址
#### 获取账号
测试账号请通过华鑫证券申请。
### COMSTAR(中亿汇达)
#### 接口支持
- 操作系统
- Windows
- 交易品种
- 银行间市场
- 持仓方向
-
- 历史数据
- 不提供
#### 相关字段
- 交易服务器:
- 用户名:
- 密码:
- Key
- routing_type5
- valid_until_time18:30:00.000
#### 获取账号
只有各类大型金融机构才能用(券商自营交易部、银行金融市场部等),私募或者个人都用不了。需要购买ComStar的交易接口服务之后才能使用。
### OST(东方证券)
#### 接口支持
- 操作系统
- Windows
- 交易品种
- A股
- 持仓方向
- 单向持仓
- 历史数据
- 不提供
#### 相关字段
- 用户名:
- 密码:
- 交易服务器:
- 上交所快照地址:
- 上交所快照端口: 0
- 深交所快照地址:
- 深交所快照端口: 0
- 本机ip地址:
#### 获取账号
在证券公司开户,通过联系客户经理可以开通。
### IB(盈透证券)
#### 接口支持
- 操作系统
- Windows
- Ubuntu
- Mac
- 交易品种
- 海外多品种
- 持仓方向
- 只支持单向持仓
- 历史数据
- 提供
#### 相关字段
- TWS地址:127.0.0.1
- TWS端口:7497
- 客户号:1
- 交易账户:
#### 获取账号
在盈透证券开户并且入金后可以获得API接入权限。
#### 其他特点
可交易品种覆盖诸多海外市场的股票、期权、期权;手续费相对较低。
请注意,IB接口的合约代码较为特殊,请前往官网的产品查询板块查询。VeighNa Trader中使用的是盈透证券对于每个合约在某一交易所的唯一标识符ConId来作为合约代码,而非Symbol或者LocalName。
### TAP(易盛9.0外盘)
#### 接口支持
- 操作系统
- Windows
- 交易品种
- 外盘期货
- 持仓方向
- 只支持单向持仓
- 历史数据
- 不提供
#### 相关字段
- 行情账号:
- 行情密码:
- 行情服务器:
- 行情端口:0
- 交易账号:
- 交易密码:
- 交易服务器:
- 交易端口:0
- 授权码:
#### 获取账号
测试账号请通过易盛官方网站申请。
### DA(直达期货)
#### 接口支持
- 操作系统
- Windows
- 交易品种
- 外盘期货
- 持仓方向
- 只支持双向持仓
- 历史数据
- 不提供
#### 相关字段
- 用户名:
- 密码:
- 交易服务器:
- 行情服务器:
- 授权码:
#### 获取账号
在直达期货开户并且入金后可以获得API接入权限。
### ROHON(融航)
#### 接口支持
- 操作系统
- Windows
- Ubuntu
- 交易品种
- 期货资管
- 持仓方向
- 只支持双向持仓
- 历史数据
- 不提供
#### 相关字段
- 用户名:
- 密码:
- 经纪商代码:
- 交易服务器:
- 行情服务器:
- 产品名称:
- 授权编码:
#### 获取账号
测试账号请通过融航申请。
请注意,融航接口的【经纪商代码】不再是纯数字形态,而是可以包含英文和数字的字符串;VeighNa连接融航进行交易在穿透式认证中属于【中继】模式,而不再是连接柜台(CTP、恒生等)进行交易时的【直连】模式,所以在申请穿透式认证测试填表时不要选错。
### TTS
#### 接口支持
- 操作系统
- Windows
- Ubuntu
- 交易品种
- 期货
- 期货期权
- 持仓方向
- 只支持双向持仓
- 历史数据
- 不提供
#### 相关字段
- 用户名:
- 密码:
- 经纪商代码:
- 交易服务器:
- 行情服务器:
- 产品名称:
- 授权编码:
#### 获取账号
请通过OpenCTP平台获取。
### SGIT(飞鼠)
#### 接口支持
- 操作系统
- Ubuntu
- 交易品种
- 黄金TD
- 持仓方向
- 只支持双向持仓
- 历史数据
- 不提供
#### 相关字段
- 用户名:
- 密码:
- 交易服务器:
- 行情服务器:
- 产品名称:
- 授权编码:
#### 获取账号
请通过黄金现货经纪商获取。
### KSGOLD(金仕达黄金)
#### 接口支持
- 操作系统
- Ubuntu
- 交易品种
- 黄金TD
- 持仓方向
- 只支持双向持仓
- 历史数据
- 不提供
#### 相关字段
- 用户名:
- 密码:
- 交易服务器:
- 行情服务器:
- 账号类型:银行账号、黄金账号
#### 获取账号
请通过黄金现货经纪商获取。
+199
View File
@@ -0,0 +1,199 @@
# 国际化(i18n
Python中的i18n可以实现程序的多语言支持。下面通过vnpy包在Windows系统上进行演示。
## 标记字符
在源码中标记需要翻译的字符,如以下代码所示:
```python
from .locale import _
output(_("参数优化空间:{}").format(len(settings)))
```
请注意:
- 不要忘记加载_函数
- 需要用format写法代替f-string
## 创建pot文件
在命令行中,调用python环境下Tools\i18n文件夹中的pygettext.py对模块所有python文件进行扫描,把所有标记过的字符都写入指定的pot模板文件,如以下代码所示:
```python
python "你的python环境路径"\Tools\i18n\pygettext.py -o vnpy\trader\locale\vnpy.pot vnpy\trader\*.py vnpy\trader\ui\*.py
```
其中-o后面是要生成的pot文件的路径,“vnpy\trader\*.py”是扫描指定文件夹下所有Python文件的示例。
## 创建po文件
以英文版为例,在locale文件夹下创建/en/LC_MESSAGES文件夹,复制生成的pot文件到该文件夹下并修改后缀为po。
**修改po文件顶部的charset为UTF-8**,再对模板内的msgid进行翻译,如下代码所示:
修改前:
```
#: vnpy/trader/optimize.py:62
msgid "范围参数添加成功,数量{}"
msgstr ""
```
修改后:
```
#: vnpy/trader/optimize.py:62
msgid "范围参数添加成功,数量{}"
msgstr "Range parameter added successfully, quantity {}"
```
请注意标点符号的语言转换。
## 生成mo文件
在命令行中,调用python环境下Tools\i18n文件夹中的msgfmt.py将po文件转成二进制mo文件,如以下代码所示:
```python
python "你的python环境路径"\Tools\i18n\msgfmt.py -o vnpy\trader\locale\en\LC_MESSAGES\vnpy.mo vnpy\trader\locale\en\LC_MESSAGES\vnpy
```
其中-o后面是生成mo文件的路径,最后的是po文件的路径(无需后缀名)
## 打包
打包过程中请在MANIFEST.in文件中添加```*.mo```,这样安装时才不会忽略mo文件
## 使用
配置好系统语言,正常使用软件即可。运行时程序会读取配置的系统语言并尝试寻找对应语言翻译包。
# Internationalization (i18n)
This document outlines the i18n process. Using the steps in this guide, multi-language support can be incorporated into VeighNa using standard Python conventions
References:
* https://docs.python.org/3.10/library/i18n.html
* https://simpleit.rocks/python/how-to-translate-a-python-project-with-gettext-the-easy-way/
* https://www.mattlayman.com/blog/2015/i18n/
## prerequisites
* [gettext](https://www.gnu.org/software/gettext/)
- Linux/Mac: `brew install gettext`
- Windows: https://mlocati.github.io/articles/gettext-iconv-windows.html (or similar)
## mark messages
The first step is to *mark* message strings for translation. We do this by wrapping the string with a special function. Example:
```python
output("优化参数组合为空,请检查")
```
becomes
```python
from .locale import _
output(_("优化参数组合为空,请检查"))
```
or, a parameterised message
```python
output("参数优化空间:{}".format(len(settings)))
```
becomes
```python
from .locale import _
output(_("参数优化空间:{}").format(len(settings)))
```
as unfortunately f-strings are not supported. One way to search for Chinese characters is to use the regex `\p{InCJK_UNIFIED_IDEOGRAPHS}`
## template files
Once all the messages are marked, we run `xgettext` to extract the translatable strings into a message template file
```shell
xgettext -o vnpy/trader/locale/base.pot `find ./vnpy -name "*.py"`
```
## individual language files
We then create individual language files, by copying the template. So for English and Spanish
```shell
mkdir -p vnpy/trader/locale/{en, es}/LC_MESSAGES
cp vnpy/trader/locale/vnpy.pot vnpy/trader/locale/en/LC_MESSAGES/vnpy.po
cp vnpy/trader/locale/vnpy.pot vnpy/trader/locale/es/LC_MESSAGES/vnpy.po
```
Then edit the .po files to add the translated text, updating the `msgstr` attributes. So for English (`vnpy/trader/locale/en/LC_MESSAGES/vnpy.po`):
```
#: vnpy/trader/optimize.py:45
msgid "固定参数添加成功"
msgstr ""
#: vnpy/trader/optimize.py:48
msgid "参数优化起始点必须小于终止点"
msgstr ""
```
becomes
```
#: vnpy/trader/optimize.py:45
msgid "固定参数添加成功"
msgstr "Fixed parameters added successfully"
#: vnpy/trader/optimize.py:62
msgid "范围参数添加成功,数量{}"
msgstr "Range parameter added successfully, quantity {}"
```
See these projects for automation of the translation step:
* https://www.deepl.com/translator
* https://poeditor.com/
* https://www.transifex.com/
Quality of the automatic translation services is variable, and not always free. But they do at least provide a starting point. Sometimes a string will require a manual edit.
## binary files
The plain text languages files (*.po) must be converted into the binary format (.mo) used at runtime. This would be normally done at the build stage. But to do it manually during development or testing:
```shell
msgfmt -o vnpy/trader/locale/en/LC_MESSAGES/vnpy.mo vnpy/trader/locale/en/LC_MESSAGES/vnpy
```
## install
```shell
pip install .
```
## execution
Now run the application, with your chosen language specified
```shell
LANG=en python vnpy/examples/veighna_trader/run.py
```
or, set the environment variable `LANG` first, then run as normal. The names 'LANGUAGE', 'LC_ALL', 'LC_MESSAGES' also work
## distribution
TBD
+16
View File
@@ -0,0 +1,16 @@
交易功能
~~~~~~~~~
.. toctree::
:maxdepth: 2
:caption: Elite版
introduction.md
veighna_station.md
veighna_trader.md
gateway.md
database.md
datafeed.md
pycharm.md
contribution.md
i18n.md
+128
View File
@@ -0,0 +1,128 @@
# 功能介绍
作为一套基于Python的量化交易程序开发框架,VeighNa致力于提供从交易API对接到策略自动交易的量化解决方案。
## 目标用户
如果有以下需求,不妨试试看VeighNa:
* 基于Python语言来开发自己的量化交易程序,充分利用Python社区强大的数据研究和机器学习生态
* 通过一套标准化的交易平台体系,对接国内外诸多不同类型的金融市场:证券、期货、期权、外盘等
* 使用经过充分实盘检验的量化策略引擎,来完成从数据维护、策略开发、回测研究到实盘自动交易的整个业务流程
* 对平台进行各种定制扩展,满足个性化的交易需求:增加交易接口,修改GUI图形界面,基于事件驱动引擎开发复杂策略应用
* 掌控交易程序的源代码细节,杜绝各种程序后门,避免被窃取策略、截获交易信号、偷盗账号密码等风险
* 节约为量化交易平台付出的资金成本,不必再支出上万每年的软件授权费或者每笔成交的额外加点
## 应用场景
从专业个人投资者、创业型私募,到券商资管部门,都能找到VeighNa的应用场景。
* 专业个人投资者:使用VeighNa Trader直连期货公司的CTP期货柜台,实现从策略开发到实盘自动交易的CTA业务流程
* 创业型私募:基于RpcService构建服务器端的统一报盘通道,允许交易员在自己的本地电脑自行开发各类交易策略应用
* 券商资管部门:对接证券公司统一部署的O32资管系统,基于事件驱动引擎定制开发多策略复杂系统
## 支持的接口
**vnpy.gateway**,覆盖国内外所有交易品种的交易接口:
* 国内市场
* CTPctp):期货、期货期权
* CTP测试(ctptest):期货、期货期权
* CTP Minimini):期货、期货期权
* 飞马(femas):期货
* CTP期权(sopt):ETF期权
* 顶点飞创(sec):ETF期权
* 顶点HTShts):ETF期权
* 恒生UFT(uft):期货、ETF期权
* 易盛(esunny):期货、黄金TD
* 中泰XTP(xtp):A股、两融、ETF期权
* 国泰君安统一交易网关(hft):A股、两融
* 华鑫奇点股票(torastock):A股
* 华鑫奇点期权(toraoption):ETF期权
* 中亿汇达Comstarcomstar):银行间市场
* 东方证券OSTost):A股
* 融航(rohon):期货资管
* TTStts):期货
* 飞鼠(sgit):黄金TD
* 金仕达黄金(ksgold):黄金TD
* 海外市场
* 盈透证券(ib):海外多品种
* 易盛9.0外盘(tap):外盘期货
* 直达期货(da):外盘期货
* 特殊应用
* RPC服务(rpc):跨进程通讯接口,用于分布式架构
## 支持的应用
**vnpy.app**,开箱即用的各类量化策略交易应用:
* cta_strategy:CTA策略引擎模块,在保持易用性的同时,允许用户针对CTA类策略运行过程中委托的报撤行为进行细粒度控制(降低交易滑点、实现高频策略)
* cta_backtesterCTA策略回测模块,无需使用Jupyter Notebook,直接使用图形界面直接进行策略回测分析、参数优化等相关工作
* spread_trading:多合约价差套利模块,除了允许用户通过手动的方式来启动算法买卖价差外,也同样支持用户使用策略模板SpreadStrategyTemplate来开发各种价差类的量化交易策略
* algo_trading:算法交易模块,提供多种常用的智能交易算法:TWAP、Sniper、Iceberg、BestLimit等等。支持常用算法配置保存
* option_master:期权波动率交易模块,提供波动率曲线图表,允许用户作出相应的判断分析,进而使用波动率管理组件设置定价参考波动率,然后就可以通过期权电子眼算法自动扫描市场上的交易机会并瞬时完成交易
* portfolio_strategy:多合约组合策略模块,专门针对需要同时交易多合约的量化策略设计,满足其历史数据回测和实盘自动交易的需求
* script_trader:脚本策略模块,针对多标的组合类交易策略设计,同时也可以直接在命令行中实现REPL指令形式的交易,不支持回测功能
* chart_wizard:实时K线图表模块,可以实现简单的实时K线行情显示,直接在本地合约代码的编辑框中输入vt_symbol,点击【新建图表】的按钮就会打开对应合约的图表
* rpc_serviceRPC服务模块,允许将某一VeighNa Trader进程启动为服务端,作为统一的行情和交易路由通道,允许多客户端同时连接,实现多进程分布式系统
* excel_rtdEXCEL RTD模块,RTD全称是RealTimeData,是微软主要为金融行业的实时数据需求设计的Excel数据对接方案。该模块用于实现在Excel中访问VeighNa程序内任意数据信息的功能
* data_manager:历史数据管理模块,是VeighNa Trader内部针对历史数据的多功能管理工具。可以支持数据导入、数据查看以及数据导出等功能,支持自定义数据表头格式
* data_recorder:行情记录模块,基于图形界面进行配置,根据需求实时录制Tick或者K线行情到数据库中,用于策略回测或者实盘初始化
* risk_manager:风险管理模块,提供包括交易流控、下单数量、活动委托、撤单总数等规则的统计和限制,有效实现前端风控功能
* web_traderWeb服务模块,针对B-S架构需求设计,实现了提供主动函数调用(REST)和被动数据推送(Websocket)的Web服务器
* portfolio_manager:投资组合管理模块,该模块主要面向各种采用基本面策略的投资者,针对每个投资策略,创建一个独立的投资组合策略对象
* paper_account:模拟交易账户模块,是为了解决目前各类需要依赖服务端功能的仿真交易账户的问题,直接在交易客户端内部提供一套本地化的模拟交易环境,同时基于实盘行情的盘口数据进行委托撮合
## 通用类组件
**vnpy.event**,简洁易用的事件驱动引擎,作为事件驱动型交易程序的核心。
**vnpy.chart**,Python高性能K线图表,支持大数据量图表显示以及实时数据更新功能。
**vnpy.trader.database**,集成了几大数据库管理端模块,以支持数据库读写性能和未来的新数据库扩展。
**vnpy.trader.datafeed**,提供标准化接口BaseDataFeed,带来了更加灵活的数据服务支持。
+232
View File
@@ -0,0 +1,232 @@
# PyCharm开发指南
PyCharm是由JetBrains公司推出针对Python语言的IDE,其内置一整套可以帮助用户在使用Python语言开发时提高其效率的工具。本文档意在为用户提供通过PyCharm开发使用VeighNa的方案以供参考。
本文档中的内容基于Windows系统编写,但对于Linux/Mac系统大部分也都适用。
VeighNa适用的Windows系统包括:
- Windows 10/11
- Windows Server 2019/2022
> 其他版本的Windows系统安装时可能遇到各种依赖库问题,不推荐使用。
在Windows系统上使用VeighNa,推荐安装官方推出的【VeighNa Studio】Python发行版,**尤其是初次接触Python开发的新手用户**。
## PyCharm安装
首先从[PyCharm官网](https://www.jetbrains.com/pycharm/download/?section=windows#section=windows)下载PyCharm Community安装包:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/pycharm/1.png)
下载完成后,双击安装包则可进入PyCharm安装向导:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/pycharm/2.png)
如果想对安装选项进行设置,可以在PyCharm Community Edition Setup页面对相关选项进行勾选:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/pycharm/3.png)
安装完成后,会跳转到安装成功页面:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/pycharm/4.png)
如果前面勾选了Create Desktop Shortcut选项来创建桌面快捷方式的话,此时桌面上会出现PyCharm的图标,双击图标即可运行PyCharm。
## VeighNa开发
### 创建项目
启动PyCharm之后,在弹出的欢迎界面中点击【New Project】创建新项目,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/pycharm/6.png)
在弹出的新项目窗口中,首先需要选择存放项目的文件夹路径【Location】,然后勾选Python解释器选项中的【Previously configured interpreter】选项(即当前系统中已经安装的Python环境):
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/pycharm/7.png)
点击右侧Add Interpreter下拉框中的【Add Local Interpreter】,在弹出的对话框中点击左侧的【System Interpreter】标签,并在右侧出现的下拉框中选择VeighNa Studio自带Python解释器所在的路径:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/pycharm/8.png)
点击底部的【OK】按钮保存解释器配置,回到新项目窗口中,点击右下方的【Create】按钮来完成新项目的创建:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/pycharm/9.png)
创建成功的项目窗口如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/pycharm/10.png)
此时点击左上方的【External Libraries】,即可看到项目中可以调用的外部库:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/pycharm/11.png)
点击site_packages文件夹,往下滚动就能扎到VeighNa Studio中vnpy核心框架包以及vnpy_前缀的插件模块包。此时可以通过点击对应图标来查看每个包中的文件源码,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/pycharm/13.png)
把鼠标光标移到代码上方,会自动弹出对应代码的文档信息:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/pycharm/14.png)
若按住Ctrl键的同时用鼠标左键点击代码,则会跳转到代码的声明部分:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/pycharm/15.png)
点击窗口右下角的【Python 3.10】按钮,会弹出【Settings】项目配置窗口,可以看到当前解释器环境下安装的包名称、本地版本号、最新版本号。带有升级符号(向上箭头)的包,说明当前版本不是最新版,点击升级符号即可自动升级。
> 请注意:由于VeighNa对于部分依赖库有严格的版本要求,不建议用户手动升级安装的包到最新版,可能会出现版本冲突。
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/pycharm/49.png)
### 运行程序
从Github代码仓库下载[VeighNa Trader启动脚本文件run.py](https://github.com/vnpy/vnpy/blob/master/examples/veighna_trader/run.py),并将其放置于trader文件夹下,即可在窗口左侧的项目导航栏中看见run.py文件:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/pycharm/16.png)
若部分代码下方可以看见绿色波浪线显示(变量名称英文词语检查),可以点击项目名称左方的主菜单按钮 -【File】-【Settings】-【Editor】-【Inspections】-【Proofreading】,取消【Typo】的勾选后点击【OK】确认。再回到主窗口,可以发现绿色波浪线已经消失:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/pycharm/17.png)
点击鼠标右键,选择【Run 'run'】,即可开始运行run.py脚本:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/pycharm/21.png)
此时在界面底部的终端内容输出区域中,可以看到程序运行时的打印信息:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/pycharm/19.png)
<span id="jump">
与此同时,VeighNa Trader的主窗口也会自动弹出显示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/pycharm/20.png)
</span>
回到PyCharm,可以看到项目界面右上角已经有run脚本的运行记录了,后续直接点击三角形运行按钮也可运行脚本,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/pycharm/18.png)
### 断点调试
PyCharm的断点调试功能十分强大,这里使用一个VeighNa的策略历史回测脚本来演示。
在左侧项目导航栏中点击鼠标右键,选择【New】-【File】, 在弹出的对话框中创建backtest.py
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/pycharm/25.png)
然后在文件中编写一段策略回测代码(具体可参考Github仓库中的[回测示例](https://github.com/vnpy/vnpy/blob/master/examples/cta_backtesting/backtesting_demo.ipynb)),在想要调试的地方打上断点,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/pycharm/26.png)
点击鼠标右键选择【Debug 'backtest'】, 即可开始调试脚本:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/pycharm/27.png)
此时项目界面右上角已经可以看到backtest.py的运行记录,后续也可以通过点击这里的按钮直接启动调试任务:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/pycharm/28.png)
启动调试后,可以看到主界面底部的Debug窗口开始输出程序运行信息,并且程序会暂停运行在第一个断点处。左侧显示的是线程信息,右侧则是当前上下文中的变量信息:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/pycharm/29.png)
点击类似播放键的【Resume Program】即可继续运行调试,直到下一个断点处再次暂停:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/pycharm/30.png)
此时可以看到底部右侧监控窗口中,当前上下文中的变量发生了变化:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/pycharm/31.png)
后续重复上述步骤,点击【Resume Program】直到调试结束,可以看到Debug窗口的相应输出:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/pycharm/32.png)
调试完之后,点击【Rerun 'backtest'】即可重新调试:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/pycharm/33.png)
在调试过程中,点击【Step Into】可以进入函数的内部查看运行时的细节状态:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/pycharm/34.png)
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/pycharm/35.png)
点击【Step Out】则可跳出当前函数,查看外层调用栈的状态:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/pycharm/37.png)
点击【Step Over】可越过子函数(子函数会执行):
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/pycharm/36.png)
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/pycharm/38.png)
点击【Stop 'backtest'】则会直接停止当前程序的运行:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/pycharm/39.png)
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/pycharm/40.png)
#### 指定程序的运行目录
在PyCharm新建项目时,默认是在当前目录下运行程序。若需要指定程序运行的目录,可以点击项目界面右上角的【Edit】进入【Run/Debug Configurations】界面:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/pycharm/43.png)
修改程序启动时的目录【Working directory】:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/pycharm/44.png)
#### C++回调断点调试
通常情况下,PyCharm只能在Python解释器中启动的线程里进行代码断点调试。之前有部分用户反馈过尝试在C++回调函数(如CTP API接口、PySide图形库等)中打断点但无法起效的问题。针对这种情况,可以通过在代码中设置断点的方式,来实现对非Python线程(即C++)的断点调试。
在项目左侧导航栏中点击鼠标右键,选择【New】-【File】, 创建geteway_test.py。
在创建成功的geteway_test.py中添加一段脚本策略的代码(可参考[该文件](https://github.com/vnpy/vnpy/blob/master/examples/veighna_trader/demo_script.py)),然后按住Ctrl同时用鼠标左键点击代码中的CtpGateway,跳转至ctp_gateway.py的源码中,在想要调试的回调函数内打上断点(注意不要打在函数定义的def那一行),如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/pycharm/50.png)
回到gateway_test.py,点击鼠标右键选择【Debug 'gateway_test'】, 即可开始调试:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/pycharm/51.png)
> 请注意,如果用load_json函数读取connect_ctp.json,请确保读取对应.vntrader文件夹的json文件中配置了CTP账户登录信息。
此时可观察到并没有进入之前设定的断点,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/pycharm/52.png)
终止调试后,找到之前在ctp_gateway.py中设定的断点处,在回调函数内的断点之前添加以下代码:
```Python 3
import pydevd
pydevd.settrace(suspend=False, trace_only_current_thread=True)
```
请注意:
- pydevd是PyCharm自带的调试插件,没有安装在Python解释器所在的Python环境里;
- suspend参数设置为True之后,调试会在这一句代码运行完之后暂停,而不是停在断点处。trace_only_current_thread参数设置为True之后,调试过程中只会监控当前线程;
- 调试结束之后不要忘记删掉这段代码。
然后再次运行调试gateway_test.py脚本:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/pycharm/53.png)
此时可以看到底部的调试窗口中开始输出相关信息,同时程序暂停在了之前设置的断点处。左侧显示的是线程信息(可以看到多了一个Dummy线程显示),右侧显示的是变量信息(可以看到回调函数的入参):
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/pycharm/54.png)
## 对比VS Code
1. 在PyCharm中,每个项目都需要对Python环境进行配置。在VS Code中,默认通过窗口右下角的Python解释器来选择全局的Python环境(针对所有打开的文件);
2. PyCharm的Community版仅对Jupyter提供了只读支持,需要Professional版才能编辑和运行。VS Code仅需安装功能插件,就可以使用和Jupyter相关全部功能(包括读取、编辑、运行)。
+163
View File
@@ -0,0 +1,163 @@
# VeighNa Station
## 启动程序
### 点击图标启动
安装成功后,双击桌面上VeighNa Station快捷方式:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/veighna_station/1.png)
即可运行VeighNa Station。
### 命令行启动
打开命令行工具,输入veighna回车运行,即可启动VeighNa Station。
## 用户登录
首次使用VeighNa Station时会弹出VeighNa Studio的免责声明,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/veighna_station/2.png)
仔细阅读并点击【确认】之后,会弹出包含用户名输入框、密码输入框、登录按钮和注册按钮的用户登录界面,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/veighna_station/3.png)
用户按照要求在用户名输入框中输入用户名,在密码输入框中输入密码后,点击【登录】按钮,即可完成登录进入VeighNa Station主运行程序。
新用户可以点击【注册】按钮注册账户,注册完成后即可登录。注册时请注意:
- 个人邮箱请如实填写(后续用于找回密码等论坛功能);
- 用户名自动使用注册时的微信【昵称】(不支持修改);
- 密码请牢记,该密码也同样用于登录VeighNa社区论坛。
**登录界面只在首次运行VeighNa Station时弹出**,之后运行VeighNa Station时会自动登录。
## 界面窗口
登录完成后,VeighNa Station界面会自动弹出,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/veighna_station/4.png)
界面主要分为菜单栏、标题栏、功能栏、主显示区域、学习与使用区域、官方频道区域几个部分。
### 菜单栏
菜单栏位于顶部,包含【系统】和【帮助】两个按钮。
#### 配置
点击【系统】-【配置】,会弹出系统配置窗口,可以对PyPI索引和pip代理进行修改,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/veighna_station/5.png)
PyPI索引用于更换VeighNa Station使用的pypiserver地址,当留空时默认使用的是https://pypi.org的PyPI服务器。
pip代理默认为空,用户可自行设置。修改后可点击【保存】按钮,对配置进行保存并退出窗口。
#### 登出
点击【系统】-【登出】,会弹出登出窗口,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/veighna_station/6.png)
点击【Yes】会登出用户,并立即关闭程序。用户登出后,在下次启动时,需要重新进行用户登录。
#### 关闭
点击【系统】-【关闭】,会弹出退出窗口,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/veighna_station/7.png)
点击【Yes】立即关闭程序。
### 主窗口
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/veighna_station/9.png)
如上图所示,图中左侧区域为功能栏,右侧区域为主显示区域。功能栏包括社区、交易、投研、加密、更新等内容。随着左侧功能栏的不同选择,右侧主显示区域会显示对应的相关内容。
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/veighna_station/10.png)
如上图所示,VeighNa Station界面左下角为学习与使用区域。
点击【使用文档】后会打开浏览器,并跳转到官方文档https://www.vnpy.com/docs/cn/index.html ,用户可以查询详细的使用说明。
点击【社区求助】后会打开浏览器,并跳转到官方论坛https://www.vnpy.com/forum/ ,用户可以在论坛查询技术贴,并发帖交流。
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/veighna_station/11.png)
如上图所示,学习与使用区域下方为官方频道区域。
从左到右分别为官方的Github仓库,官方微信公众号和官方知乎账号。点击即可打开浏览器直接跳转到相关页面。
## 功能使用
### 社区
点击VeighNa Station左侧的【社区】按钮,右侧主显示区域显示内容为官方论坛,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/veighna_station/4.png)
用户可以在该区域浏览官方论坛内容。
### 交易
点击VeighNa Station左侧的【交易】按钮,右侧主显示区域显示内容为交易接口、应用模块选择区域和信息输出区域,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/veighna_station/12.png)
点击需要加载的交易接口或应用模块后的白色复选框,进行选择。然后点击主显示区域左下角【启动】按钮,即可启动VeighNa Trader。此时,右侧输出区域将输出程序运行中的信息,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/veighna_station/13.png)
点击主显示区域右下角【修改】按钮,可修改运行目录。
### 投研
点击VeighNa Station左侧的【投研】按钮,右侧主显示区域为jupyterlab应用操作目录,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/veighna_station/14.png)
点击主显示区域左下角的【启动】按钮后,将会在右下角指定的运行目录运行jupyterlab应用,可以在jupyterlab应用中进行投研操作,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/veighna_station/15.png)
### 加密
点击VeighNa Station左侧的【加密】按钮,右侧主显示区域显示加密相关内容,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/veighna_station/16.png)
用户可在此界面下将选定的.py文件编译成.pyd文件,对策略进行加密操作。
点击【选择】按钮,在弹出的窗口里选择需要加密的策略文件路径,点击【打开】按钮。此时主显示区域左下角的输入栏将变更为所需要加密文件的绝对路径,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/veighna_station/17.png)
点击【加密】按钮,对文件进行编译。此时中央的显示区域将输出加密过程中的相关信息,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/veighna_station/18.png)
等到输出文件加密进程终止后,将会在加密文件所在位置生成一个加密后的pyd文件。
请注意,加密后需要先**把pyd文件名中的.cp310-win_amd64部分移除**,然后再放进自建strategies文件夹中。
### 更新
点击VeighNa Station左侧的【更新】按钮,右侧主显示区域显示组件更新相关内容,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/veighna_station/19.png)
点击主显示区域左下角的【检查】按钮,将会显示本地已安装模块和版本,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/veighna_station/20.png)
点击主显示区域右下角的【更新】按钮,后台将启动更新进程并输出相关信息,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/veighna_station/21.png)
更新完成后,会弹出通知窗口,点击【OK】并重启VeighNa Station即可。
+267
View File
@@ -0,0 +1,267 @@
# VeighNa Trader
## 启动程序
### 图形模式
启动登录VeighNa Station后,用户可通过点击【交易】按钮,勾选所需的交易接口和应用模块,点击【启动】按钮进入VeighNa Trader,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/quick_start/22.png)
### 脚本模式
在文件夹examples/veighna_trader中找到run.py文件(不是veighna_studio下的,需要在github上下载源码)。运行run.py即可进入VeighNa Trader。
- 以Win10系统为例,用户可在run.py所在文件夹内按住【Shift】,同时点击鼠标右键,选择【在此处打开 powershell 窗口】,在弹出窗口中,输入如下命令,即可启动VeighNa Trader。
```bash
python run.py
```
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/quick_start/3.png)
启动成功的VeighNa Trader如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/quick_start/23.png)
## 连接接口
### SimNow仿真
以使用SimNow仿真交易账号登录**CTP**接口为例,在VeighNa Trader上的菜单栏中点击【系统】->【连接CTP】,会弹出账号配置窗口,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/gateway/1.png)
其中,各字段填写要求如下:
- 用户名:xxxxxx (6位纯数字账号)
- 密码:xxxxxx (需要修改一次密码用于盘后测试)
- 经纪商代码:9999 (SimNow默认经纪商编号)
- 交易服务器:182.254.243.31:30001 (盘中测试)
- 行情服务器:182.254.243.31:30011 (盘中测试)
- 产品名称:simnow_client_test
- 授权编码:0000000000000000 16个0
请注意:
- 用户名需填写InvestorID(6位纯数字),而不是Simnow网站注册时的账号(手机号)。此外,Simnow注册的账号需要修改一次密码后才能登录。
- 如果点击连接接口之后,没有在VeighNa Trader主界面【日志】组件看到任何输出,可以用telnet工具测试一下交易服务器/行情服务器的端口是否开启。
连接成功以后,VeighNa Trader主界面【日志】组件会立刻输出登录相关信息,同时用户也可以看到账号信息,持仓信息,合约查询等相关信息。如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_strategy/1.png)
## 合约查询
成功连接交易接口后,用户可以通过合约查询功能查询合约信息:
点击菜单栏的【帮助】->【合约查询】,在弹出的对话框中直接点击右上角的【查询】按钮,即可查询合约信息(留空则查询所有合约的价格信息),如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/spread_trading/3.png)
请注意,IB接口因为登录时无法自动获取所有的合约信息,只有在用户手动订阅行情时才能获取。因此需要在主界面上先行手动订阅合约行情,才能查到合约信息。
## 订阅行情
在交易组件输入交易所和合约代码,按回车键即可订阅行情。如订阅股指期货时,交易所填写CFFEX,代码填写对应合约代码IF2206。
订阅成功后,交易组件会显示合约名称,并且在下方显示深度行情报价,如最新价、买一价和卖一价,行情组件会显示最新行情信息,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/quick_start/24.png)
请注意,**输入的合约代码需与在菜单栏的【帮助】->【查询合约】功能中查到的一致**。
## 委托交易
交易组件用于手动发起委托交易,除了填写交易所和合约代码外,还需填写下图中的五个字段(方向、开平、类型、价格和数量):
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/quick_start/5.png)
请注意,若委托类型为市价单,委托价格可不填;若交易接口只支持单向持仓(接口持仓方向支持详见交易接口篇),可不填写开平方向。
发出委托后,本地会缓存委托相关信息,并显示到【委托】组件和【活动】组件,此时委托状态为【提交中】。
交易所收到用户发送的委托后,会将其插入中央订单簿来进行撮合成交,并推送委托回报给用户:
- 若委托还未成交,【委托】组件和【活动】组件只会更新时间和委托状态这两个字段,委托状态变成【未成交】;
- 若委托立刻成交,委托相关信息会从【活动】组件移除,新增至【成交】组件,委托状态变成【全部成交】。
## 数据监控
数据监控由以下组件构成,并附带两个辅助功能:
选定以下任一组件,鼠标右键可以选择【调整列宽】(特别适用于屏幕分辨率较低的情况)或者选择【保存数据】(CSV格式),如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/quick_start/12.png)
### 行情组件
行情组件用于对订阅的行情进行实时监控,如下图所示:
![](https://vnpy-community.oss-cn-shanghai.aliyuncs.com/forum_experience/yazhang/quick_start/subcribe_contract_module.png)
行情组件监控内容包括以下部分:
- 合约信息:合约代码、交易所、合约名称;
- 行情信息:最新价、成交量、开盘价、最高价、最低价、收盘价、买1价、买1量、卖1价、卖1量;
- 其他信息:数据推送时间、接口。
### 活动组件
活动组件用于存放还未成交的委托,如有限价单或者没有立刻成交的市价单,在该组件中鼠标双击任一委托可以完成撤单操作,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/quick_start/15.png)
### 成交组件
成交组件用于存放已成交的委托,在该组件中,价格、数量和时间都是交易所推送过来的成交信息,而不是委托信息,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/quick_start/14.png)
### 委托组件
委托组件用于存放用户发出的所有委托信息,其委托状态可以是提交中、已撤销、部分成交、全部成交、拒单等,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/quick_start/13.png)
### 持仓组件
持仓组件用于记录历史持仓,需要注意以下字段信息。
- 方向:期货品种具有多空方向,而股票品种方向为【净】持仓;
- 数量:总持仓,即今仓 + 昨仓;
- 昨仓:其出现衍生于上期所特有的平今、平昨模式的需要;
- 均价:历史成交的平均价格(某些巨型委托,会发生多次部分成交,需要计算平均价格);
- 盈亏:持仓盈亏。多仓情况下,盈利 = 当前价格 - 均价,空仓则反之。
若平仓离场,持仓数量清零,浮动盈亏变成实际盈亏从而影响账号余额变化。故以下字段:数量、昨仓、冻结、均价、盈亏均为0,如下图所示:
![](https://vnpy-community.oss-cn-shanghai.aliyuncs.com/forum_experience/yazhang/quick_start/query_position.png)
### 资金组件
资金组件显示了账号的基础信息,如下图所示:
![](https://vnpy-community.oss-cn-shanghai.aliyuncs.com/forum_experience/yazhang/quick_start/query_account.png)
需要注意以下三个字段信息:
- 可用资金:可以用于委托的现金
- 冻结:委托操作冻结的金额(与保证金不是一个概念)
- 余额:总资金,即可用资金 + 保证金 + 浮动盈亏
若全部平仓,浮动盈亏变成实际盈亏,保证金和浮动盈亏清零,总资金等于可用资金。
### 日志组件
日志组件用于显示接口登录信息以及委托报错信息,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_strategy/1.png)
## 应用模块
VeighNa官方提供了开箱即用的量化交易应用模块,在启动VeighNa Trader时勾选所需的功能模块,启动成功后在菜单栏中点击【功能】按钮,即可显示所勾选的功能模块,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/quick_start/25.png)
## 全局配置
点击VeighNa Trader菜单栏上的【配置】按钮弹出【全局配置】窗口,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/quick_start/20.png)
### GUI界面
font.family和font.size参数用于配置GUI界面,各参数含义如下所示:
- font.family:设置VeighNa Trader图形界面的字体类型,除了默认的Arial字体,也支持Courier New和System字体;
- font.size:设置VeighNa Trader图形界面的字体大小,用户可以根据自己显示器的实际分辨率对字体大小进行修改。
### 日志输出
log.active, log.level, log.console和log.file用于对日志输出进行配置,各参数含义如下所示:
- log.active:控制是否启动LogEngine,默认为True。如果该项修改为False,则后续几项参数都将失效,同时VeighNa Trader运行时不再输出日志或生成日志文件(可以降低部分系统延时);
- log.level:控制日志输出的级别,日志可以从轻到严重分成DEBUG、INFO、WARNING、ERROR、CRITICAL五个级别,分别对应10、20、30、40、50的整数值。如果日志等级低于该项设置值,将会被忽略。如果想要记录更详细的系统运行信息,建议将该项整数值调低;
- log.consoleconsole指的是终端,如Windows系统上的cmd和Powershell,以及Linux上的Terminal。当设置为True时,通过终端运行脚本(需要注册日志事件监听)来启动VeighNa Trader,日志信息会输出在终端中;如果通过VeighNa Station来直接启动VeighNa Trader,则无console输出;
- log.file:该参数用于控制是否要将日志输出到文件中,建议设置为True,否则无法记录生成的日志。
VeighNa Trader的日志文件,默认位于运行时目录的.vntrader\log目录下,完整路径为:
```
C:\users\administrator\.vntrader\log
```
其中,administrator为当前Windows系统的登录用户名。
### 邮件通知
以email为前缀的参数用于对邮箱进行配置,可以在特定事件发生时(如委托成交,数据异常时)发送邮件实时通知,各参数含义如下:
- email.server: SMTP邮件服务器地址,默认填写好了QQ邮箱服务器地址,可以直接用,如果需要使用其他邮箱,需要自行查找一下其他的服务器地址;
- email.port: SMTP邮件服务器端口号,默认填写好了QQ邮箱服务器端口,可以直接用;
- email.username: 填写邮箱地址即可,如xxxx@qq.com
- email.password: 对于QQ邮箱,此处不是邮箱密码,而是开通SMTP后系统生成的一个授权码;
- email.sender: 发送邮箱名,与email.username一致;
- email.receiver: 接受邮件的邮箱地址。
### 微信通知
VeighNa Trader提供了微信消息通知功能。用户完成微信绑定后,程序可以通过微信实时接收系统推送消息;对于开发者,也可以通过MainEngine.send_notification接口同时向已配置的邮件和微信渠道发送通知。
在VeighNa Trader主界面菜单栏中点击【微信】按钮,会弹出【微信通知】窗口。首次使用时点击【开始绑定】,按窗口提示完成以下步骤:
- 使用微信扫描窗口中显示的二维码;
- 扫码成功后,在微信中向机器人ClawBot发送任意文字消息;
- 程序收到首条消息后会自动完成绑定,并显示Bot ID、用户ID和网关地址。
绑定成功后,可以点击【测试消息】发送一条测试通知。若微信中可以收到“VeighNa Trader 消息推送测试”,说明微信通知已经配置成功。
【微信通知】窗口中的【推送设置】区域提供了【最小间隔】配置,用于控制两次微信推送之间的最小时间间隔。若在间隔内产生多条通知,程序会先暂存这些消息,并在下一次推送时合并为一条发送,从而降低短时间内触达微信机器人发送阈值的风险。
微信机器人存在推送额度限制:用户每发送1条消息,机器人可在24小时内推送10条消息;超限后需要用户再次向机器人发送消息才能恢复。因此,建议根据策略通知频率适当调大【最小间隔】,避免短时间内频繁推送。
绑定信息和推送设置会保存到.vntrader\wechat_setting.json文件中,后续启动VeighNa Trader时会自动加载。
若需要更换接收账号,可以在【微信通知】窗口中点击【重新绑定】;若不再使用微信通知,可以点击【解除绑定】清除当前绑定。
请注意,微信会话可能过期。若日志组件中出现“微信会话已过期,请通过菜单重新扫码绑定”,需要重新打开【微信】窗口完成扫码绑定。
### datafeed数据服务
与数据库适配器类似,对于数据服务有一个标准化的接口BaseDatafeed(位于vnpy.trader.datafeed),实现了更加灵活的数据服务支持,具体字段含义如下:
- datafeed.name: 数据服务接口的名称,全称的小写英文字母;
- datafeed.username: 数据服务的用户名;
- datafeed.password: 数据服务的密码。
字段如图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/quick_start/17.png)
目前支持七种datafeed
- [XT]
- [RQData]
- [Udata]
- [TuShare]
- [TQSDK]
- [Wind]
- [iFinD]
- [Tinysoft]
[XT]:https://github.com/vnpy/vnpy_xt
[RQData]:https://github.com/vnpy/vnpy_rqdata
[Udata]: https://github.com/vnpy/vnpy_udata
[TuShare]: https://github.com/vnpy/vnpy_tushare
[TQSDK]: https://github.com/vnpy/vnpy_tqsdk
[Wind]:https://github.com/vnpy/vnpy_wind
[iFinD]: https://github.com/vnpy/vnpy_ifind
[Tinysoft]: https://github.com/vnpy/vnpy_tinysoft
### 数据库
以database为前缀的参数用于配置数据库服务。目前,VeighNa支持SQLite、MySQL、PostgreSQL、MongoDB、InfluxDB、DolphinDB、Arctic和LevelDB八种数据库。具体配置方法详见项目文档的数据库配置部分。
+291
View File
@@ -0,0 +1,291 @@
# VSCode开发指南
VSCodeVisual Studio Code)是微软开发的跨平台免费源代码编辑器。用户可以通过内置的扩展程序商店安装扩展,以拓展其功能。本文档旨在为用户提供在VSCode中开发VeighNa的参考方案。
本文内容基于Windows系统编写,但大部分也适用于Linux和Mac系统。
VeighNa支持的Windows系统包括:
- Windows 11
- Windows Server 2019/2022
> 其他版本的Windows系统安装时可能遇到各种依赖库问题,不推荐使用。
在Windows系统上使用VeighNa,推荐安装官方推出的【VeighNa Studio】Python发行版,**特别适合初次接触Python开发的新手用户**。
## VSCode安装
首先从[VSCode官网](https://code.visualstudio.com/)下载VS Code for Windows安装包:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/vscode/1.png)
下载完成后,双击安装包则可进入VSCode(User)安装向导:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/vscode/2.png)
选择【我同意此协议】,点击【下一步】进入选择目标位置页面,进行安装目录选择:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/vscode/3.png)
点击【下一步】进入选择开始菜单文件夹页面进行快捷方式选择:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/vscode/4.png)
点击【下一步】进入选择附加任务页面,进行附加任务选择:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/vscode/5.png)
这里建议选中所有的勾选框,每个勾选框的具体功能如下:
- 勾选【将“通过Code打开”操作添加到Windows资源管理器文件上下文菜单】后,用户可以直接通过右键菜单在VSCode中打开单个文件;
- 勾选【将“通过Code打开”操作添加到Windows资源管理器目录上下文菜单】后,用户可以直接通过右键菜单在VSCode中打开整个文件夹及其内容;
- 勾选【将Code注册为受支持的文件类型的编辑器】之后,VSCode将被设置为系统打开默认打开支持的文件类型(如.py、.txt等)的编辑器;
- 勾选【添加到PATH(重启后生效)】后,系统将会在安装完成后把VSCode的安装目录添加到PATH环境变量中。
点击【下一步】进入准备安装页面,会显示之前选择的安装设置内容:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/vscode/6.png)
点击【安装】会开始安装,安装完成后,会跳转到安装成功页面:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/vscode/7.png)
如果勾选了运行 Visual Studio Code选项的话,此时会自动打开VSCode。
## VeighNa开发
### 打开单一文件
启动VSCode之后,在弹出的欢迎界面中点击【Open File】即可打开单一文件,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/vscode/8.png)
在弹出的Open File窗口中,选择存放文件的路径,点击【打开】按钮即可在VSCode中打开文件,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/vscode/9.png)
> 请注意:如果以受限模式打开文件后,想临时关闭该文件的受限模式,可以找到窗口顶部的受限模式提示,点击【Manage】,在弹出的Workspace Trust页面点击【Trust】即可关闭该文件的受限模式。
### 打开文件夹
启动VSCode之后,在弹出的欢迎界面中点击【Open Folder】即可打开文件夹,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/vscode/10.png)
在弹出的Open Folder窗口中,选择存放文件夹的路径,点击【打开】按钮即可在VSCode中打开文件夹,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/vscode/11.png)
### 保存VSCode开发项目
为了方便集中管理代码资源,避免环境切换混乱,VSCode提供了工作区支持。点击【File】-【Save Workspace As...】即可保存工作区到指定路径,便于后续访问使用。
为了解决项目切换困难的问题,工作区还允许将不同的项目放置到同一个工作区中。点击【File】-【Add Folder to Workspace...】即可添加文件夹到工作区。
### Python环境选择
在安装了Python插件之后,打开任意.py文件,可以在VSCode窗口的右下角看到当前使用的Python环境信息,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/vscode/14.png)
请注意,默认显示的是自动搜索到的Python环境。如果当前系统中存在多个Python环境的话,可以点击右下角的Python环境信息,在窗口顶部弹出的下拉框中选择其他环境进行切换,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/vscode/15.png)
### 运行程序
从Github代码仓库下载VeighNa Trader[启动脚本文件run.py](https://github.com/vnpy/vnpy/blob/master/examples/veighna_trader/run.py),通过VSCode打开run.py文件,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/vscode/23.png)
点击VSCode右上角的运行按钮,选择【Run Python File】,即可运行run.py脚本:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/vscode/24.png)
此时在界面底部的TERMINAL终端内容输出标签页中,可以看到程序运行时的打印信息:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/vscode/25.png)
与此同时,VeighNa Trader的主窗口也会自动弹出显示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/vscode/26.png)
请注意:
- 这里启动脚本时,会在当前VSCode使用的Python环境中运行,如须使用其他Python环境请参考前文的步骤进行切换;
- 如果想直接在终端中运行脚本,可以按住Ctrl + J打开Terminal,在其中输入用命令启动VeighNa Trader
- 上图中打印的“没有配置要使用的数据服务,请修改全局配置中的datafeed相关内容”输出不影响VeighNa Trader的运行;如果需要配置数据服务,可以在VeighNa Trader主界面【配置】-【全局配置】中配置即可,如果不需要配置数据服务则忽略此条输出即可。
### 断点调试
VSCode提供了强大的断点调试功能,这里使用一个VeighNa的策略历史回测脚本来演示。
点击【New File】,在界面上方弹出的窗口中选择【Python File】, 在弹出的标签页中创建backtest.py
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/vscode/27.png)
然后在文件中编写一段策略回测代码(具体可参考Github仓库中的[回测示例](https://github.com/vnpy/vnpy/blob/master/examples/cta_backtesting/backtesting_demo.ipynb)),在想要调试暂停的代码行处打上断点,如下图所示(左侧红色小圆点):
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/vscode/28.png)
点击VSCode右上角的向下按钮,选择【Python Debugger: Debug Python File】, 即可开始调试脚本:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/vscode/29.png)
点击左侧菜单栏的Run and Debug图标![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/vscode/30.png)或者直接按F5键也可开始调试。
启动调试后,可以看到窗口左侧的RUN AND DEBUG区域开始输出程序运行信息,并且程序会暂停运行在第一个断点处。左侧分别显示的是变量信息、监视信息、调用堆栈信息和断点信息。点击变量可以看到详细信息,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/vscode/31.png)
点击类似播放键的【Continue】或者按F5键即可继续运行调试,直到下一个断点处再次暂停,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/vscode/32.png)
此时可以看到底部左侧VARIABLES区域中,当前上下文中的变量发生了变化:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/vscode/33.png)
后续重复上述步骤,点击【Continue】直到调试结束,可以看到Terminal的相应输出:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/vscode/34.png)
在调试过程中:
- 点击【Step Into】可以进入子函数的内部查看运行时的细节状态;
- 点击【Step Out】则可跳出当前函数,查看外层调用栈的状态;
- 点击【Step Over】可越过子函数(子函数会执行);
- 点击【Restart】会重新启动调试任务;
- 点击【Stop】则会直接停止当前调试任务的运行。
在VARIABLES区域中选中要监控的变量名称点击鼠标右键,选择【Add to Watch】,即可在WATCH监控区域中观测到变量的变化,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/vscode/35.png)
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/vscode/36.png)
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/vscode/37.png)
窗口底部的DEBUG CONSOLE则提供了交互式的调试功能支持,可以在调试过程中运行任意命令,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/vscode/38.png)
#### C++回调断点调试
通常情况下,VSCode只能在Python解释器中启动的线程里进行代码断点调试。用户如果想要在C++回调函数(如CTP API接口、PySide图形库等)中打断点,可以通过在代码中设置断点的方式,来实现对非Python线程(即C++线程)的断点调试。
点击【New File】,在界面上方弹出的窗口中选择【Python File】, 创建geteway_test.py。
在创建成功的geteway_test.py中添加一段脚本策略的代码(可参考[该文件](https://github.com/vnpy/vnpy/blob/master/examples/veighna_trader/demo_script.py)),然后按住Ctrl同时用鼠标左键点击代码中的CtpGateway,跳转至ctp_gateway.py的源码中,在想要调试的回调函数内打上断点(注意不要打在函数定义的def那一行)。回到gateway_test.py开始调试,会发现并没有进入之前设定的断点,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/vscode/39.png)
> 请注意,使用load_json函数读取connect_ctp.json,请确保读取对应.vntrader文件夹的json文件中配置了CTP账户登录信息。
终止调试后,找到之前在ctp_gateway.py中设定的断点处,在回调函数内的断点之前添加以下代码:
```Python 3
import pydevd
pydevd.settrace(suspend=False, trace_only_current_thread=True)
```
请注意:
- pydevd是VSCode自带的调试插件,没有安装在Python解释器所在的Python环境里;
- suspend参数设置为True之后,调试会在这一句代码运行完之后暂停,而不是停在断点处;
- trace_only_current_thread参数设置为True之后,调试过程中只会监控当前线程;
- **调试结束之后不要忘记删掉这段代码。**
然后再次运行调试gateway_test.py脚本,此时可以看到底部的调试窗口中开始输出相关信息,同时程序暂停在了之前设置的断点处。调用堆栈信息窗口显示的是线程信息(可以看到多了一个Dummy线程显示),变量窗口显示的是变量信息(可以看到回调函数的入参):
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/vscode/40.png)
**请注意**,如果在调试过程没有跳转,可以点击【Run and Debug】页面上方的设置按钮,打开launch.json,将justMyCode参数配置为false,即可在调试过程中进行跳转,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/vscode/41.png)
## 插件安装
VSCode提供了极为丰富的扩展插件功能,可以显著提升用户的开发效率和便捷性。
### 必选插件
#### Python
点击VSCode左边菜单栏的Extensions图标,搜索【Python】,点击【install】安装Python插件,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/vscode/13.png)
安装Python插件时,会自动安装Pylance(提供类型检查、代码补全、引用跳转和代码诊断支持)和Python Debugger(提供断点调试功能)插件。
安装完Python插件以后,即可在VSCode的Extension栏看到Python、Pylance和Python Debugger三个插件,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/vscode/16.png)
安装完Pylance插件后,可以在打开的脚本中,把鼠标光标移到代码的上方,会自动弹出对应的文档信息,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/vscode/17.png)
若按住Ctrl键的同时用鼠标左键点击代码,则会跳转到代码的声明部分,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/vscode/18.png)
#### Jupyter
点击VSCode左边菜单栏的Extensions图标,搜索【Jupyter】,点击【install】安装Jupyter插件,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/vscode/19.png)
Jupyter插件将Jupyter Notebook的功能集成到了VSCode中,此时用户就可以在VSCode中打开、编辑和运行Notebook了。
安装Jupyter插件时,会自动安装
- Jupyter Cell Tags(提供单元格中添加标签支持);
- Jupyter Keymap(提供快捷键支持);
- Jupyter Notebook Renderers(提供对不同内容类型的渲染和解析支持);
- Jupyter Slide Show(提供幻灯片支持)插件。
安装完Jupyter插件以后,即可在VSCode的Extension栏目中看到Jupyter、Jupyter Cell Tags、Jupyter Keymap、Jupyter Notebook Renderers和Jupyter Slide Show五个插件,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/vscode/20.png)
#### Flake8
点击VSCode左边菜单栏的Extensions图标,搜索【Flake8】,点击【install】安装Flake8插件,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/vscode/21.png)
Flake8插件可以检查Python代码是否符合PEP 8代码风格规范,包括代码中的错误、复杂度过高的构造以及不符合PEP8风格指南的地方。
当Flake8插件检测到代码中的不规范或错误时,会在代码下方显示红色波浪线进行警告,帮助用户快速定位问题,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/vscode/22.png)
同时Flake8插件也会在窗口底部的【PROBLEMS】标签页中,显示整个工作分区内检测到的所有错误,如上图所示。
### 可选插件
#### Chinese Language
功能:将VSCode的界面和菜单翻译成中文,适合对英文不太熟悉的用户。
#### Excel Viewer
功能:允许用户在VSCode中直接查看和编辑CSV文件,支持基本的单元格编辑、筛选和排序功能。
#### One Monokai Theme
功能:提供代码高亮主题,通过改变代码的颜色、字体和背景,使代码更易于阅读和理解。
#### Material Icon Theme
功能:将VSCode中的文件和目录图标替换为Material Design风格的图标,使文件和目录在侧边栏中更易于区分和识别。
#### Github Copilot
功能:由GitHub和OpenAI共同开发的人工智能代码辅助工具,提高代码的可移植性和一致性。
#### C/C++和C/C++ Extension Pack
功能:提供C/C++语言支持、代码调试、代码格式化、代码补全、头文件包含等功能支持。
+9
View File
@@ -0,0 +1,9 @@
安装指南
~~~~~~~~~
.. toctree::
:maxdepth: 2
windows_install.md
ubuntu_install.md
mac_install.md
+119
View File
@@ -0,0 +1,119 @@
# Mac安装指南
## Mac系统的CTP接口支持
得益于Python语言本身的跨平台优势(Windows、Linux、Mac三大系统),VeighNa量化交易平台的核心框架部分很早就可以在Mac系统上运行。
但由于C++类交易API对于Mac系统支持的普遍不足,导致之前只有vnpy_ib等少数【纯Python实现】的交易接口可以在Mac系统上运行,对于大部分用户来说没什么实际价值。
从6.6.7版本的CTP API开始,上期技术官方推出了对Mac系统支持,包括Intel(x86_64)和苹果M系(arm64)芯片。终于,VeighNa平台可以在Mac系统上为期货量化用户提供从投研回测到实盘交易的一体化解决方案。
## Mac系统的VeighNa安装流程
目前Mac系统上还没有类似VeighNa Studio的开箱即用发行版,需要手动完成安装流程:
1. 前往Python官网下载3.10版本的安装包(或者使用brew安装),安装完成后在终端(Terminal)中运行命令:
```python3
python3
```
检查确认打开的Python解释器为3.10版本。
2. 使用brew安装TA-Lib的C++开发包:
```python3
brew install ta-lib
```
3. 安装NumPy和TA-LibPython),这里推荐使用豆瓣PyPI镜像解决官方源访问困难的问题:
```python3
python3 -m pip install numpy==1.26.4 --index=https://pypi.doubanio.com/simple
python3 -m pip install ta-lib --index=https://pypi.doubanio.com/simple
```
4. 安装米筐RQData客户端,注意这里使用的是米筐PyPI源:
```python3
python3 -m pip install rqdatac --index=https://pypi2.ricequant.com/simple
```
5. 安装VeighNa核心框架,以及需要使用的功能插件模块:
```python3
python3 -m pip install vnpy --index=https://pypi.doubanio.com/simple
python3 -m pip install vnpy_ctastrategy vnpy_ctabacktester vnpy_datamanager vnpy_sqlite vnpy_rqdata --index=https://pypi.doubanio.com/simple
```
这里的例子中包括(具体可以根据自己的需求调整):
- CTA策略实盘和回测模块:vnpy_ctastrategy、vnpy_ctabacktester
- 历史数据管理模块:vnpy_datamanager
- SQLite数据库驱动:vnpy_sqlite
- RQData数据服务适配器:vnpy_rqdata
pip安装过程中如果出现报错某些依赖库的缺失,可以尝试先pip install该依赖库,然后再次执行上述安装命令。
6. 安装CTP交易接口模块:
由于6.7.2版本CTP的Mac系统API项目结构发生了较大变化,改为了使用framework目录的结构,因此无法再直接从PyPI下载预编译好的wheel二进制包进行安装。
用户需要克隆(或下载)本仓库的源代码到本地后(注意;克隆的源代码文件夹vnpy_ctp不要直接放在用户文件夹下,需要放在一个其的子文件下,否则会出现安装完成后无法识别该模块的情况,如下以在用户文件夹下新建一个名为github的文件夹为例)自行编译安装,具体命令如下:
```python3
mkdir github
cd github
git clone https://github.com/vnpy/vnpy_ctp.git
cd vnpy_ctp
pip3 install -e .
```
相关注意事项如下:
源码编译需要依赖XCode开发工具中的C++编译器,请务必先安装好。
编译过程中,会指定克隆到本地的源码目录中的framework文件夹路径,为API运行时动态库的加载路径。因此后续运行时,该源码目录不能删除,也不能移动位置,否则会导致动态库加载找不到的报错。
由于当前新版本Mac系统的安全机制,编译完成后需要在【访达】中找到下述两个动态库文件,分别手动打开一次后添加到操作系统信任名单,才能在启动Python时成功加载:
* vnpy_ctp/api/libs/thostmduserapi_se.framework/Versions/A/thostmduserapi_se
* vnpy_ctp/api/libs/thosttraderapi_se.framework/Versions/A/thosttraderapi_se
以上两个文件由于本身是二进制格式,并不能正常打开,但不影响添加到系统信任名单。
完成后即可使用run.py脚本启动VeighNa Trader,代码如下:
```python3
from vnpy.event import EventEngine
from vnpy.trader.engine import MainEngine
from vnpy.trader.ui import MainWindow, create_qapp
from vnpy_ctp import CtpGateway
from vnpy_ctastrategy import CtaStrategyApp
from vnpy_ctabacktester import CtaBacktesterApp
from vnpy_datamanager import DataManagerApp
def main():
"""Start VeighNa Trader"""
qapp = create_qapp()
event_engine = EventEngine()
main_engine = MainEngine(event_engine)
main_engine.add_gateway(CtpGateway)
main_engine.add_app(CtaStrategyApp)
main_engine.add_app(CtaBacktesterApp)
main_engine.add_app(DataManagerApp)
main_window = MainWindow(main_engine, event_engine)
main_window.showMaximized()
qapp.exec()
if __name__ == "__main__":
main()
```
+133
View File
@@ -0,0 +1,133 @@
# Ubuntu安装指南
## 检查Python
检查本地Python版本,需要需要3.7版本以上的版本,可在命令行运行python命令查看。
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/install/40.png)
## 安装VeighNa
### 下载源代码
下载VeighNa源代码(Ubuntu系统请选择tar.gz格式):
- [VeighNa Github下载地址](https://github.com/vnpy/vnpy/releases)
- [VeighNa Gitee下载地址](https://gitee.com/mirrors/vn-py/releases)
下载完成后用tar命令解压文件,如下图所示。
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/install/41.png)
### 执行一键安装
安装VeighNa前需要先安装gcc编译器,用于编译C++类接口文件。在终端中运行以下命令:
```
sudo apt-get update
sudo apt-get install build-essential
```
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/install/39.png)
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/install/43.png)
然后进入之前解压出来的VeighNa源代码目录(包含install.sh文件)
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/install/42.png)
打开终端运行如下命令执行一键安装:
```
sudo bash install.sh
```
请注意,如果python软连接名不为python,比如python3或python3.10,请执行如下命令:
```
sudo bash install.sh 你的python软连接
```
一键安装过程整体分为3步:
1. 下载安装ta-lib库和numpy
2. 安装VeighNa本身。
> 若是在虚拟机上运行,请把内存调至4G以上,否则会报错内存不足。
## 启动VeighNa Trader
进入解压VeighNa源代码的目录下,在文件夹examples/veighna_trader中找到run.py文件。
点击鼠标右键打开终端,输入如下命令即可启动VeighNa Trader
```
python run.py
```
请注意run.py中包含了较多的启动加载项(交易接口和应用模块),请根据自己所用的操作系统以及实际的交易需求修改调整使用(若需加载接口,取消接口前注释符号即可)。
请注意部分接口不支持Ubuntu系统,请不要加载。连接接口介绍详见交易接口篇(可查看接口支持的操作系统)。
> 如果启动时出现一些库版本不兼容的情况,可根据提示对这些库重新pip安装。
## 常见问题
### Python开发环境问题处理
如果安装时出现由于找不到头文件导致的报错“command gcc failed with exit status 1”,可能是没有正确安装Python开发环境造成的。可以在终端中运行下述命令尝试解决:
```
sudo apt-get install 你的python软连接-dev
```
### 图形驱动问题处理
在有图形界面的Ubuntu系统上启动,如果出现qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found的报错,可以在终端中运行下述命令来安装libxcb-xinerama0,尝试解决图形驱动的依赖问题:
```
sudo apt-get install libxcb-xinerama0
```
### 中文编码问题处理
如果Ubuntu系统语言是英文,在连接CTP接口这类使用中文语言的接口时,可能会出现下述报错:
terminate called after throwing an instance of 'std::runtime_error'
what(): locale::facet::_S_create_c_locale name not valid
可以使用local-gen安装中文编码尝试解决:
```
sudo locale-gen zh_CN.GB18030
```
如果还没有解决,可能是因为系统缺少中文字体支持。解决方法如下:
```
sudo apt-get update
sudo apt-get install -y fonts-noto-cjk fonts-wqy-zenhei fonts-wqy-microhei
fc-cache -f -v
fc-list :lang=zh | wc -l
sudo locale-gen zh_CN.UTF-8 zh_CN.GB18030
```
### 安装依赖与路径分隔符
在Linux系统中安装C++接口时,如果使用`--no-build-isolation`参数,需要提前安装以下依赖库:
```bash
uv pip install meson-python meson pybind11
sudo apt-get update && sudo apt-get install -y ninja-build
```
此外,建议在Linux系统中使用正斜杠`/`作为路径分隔符,以避免路径解析问题。因此,推荐的安装命令如下:
```bash
uv pip install -e . --no-build-isolation --config-settings=build-dir=./{包的名字}/api
```
此命令将确保API文件夹被正确指定为构建目录,避免路径格式问题导致的安装失败。
+166
View File
@@ -0,0 +1,166 @@
# Windows安装指南
本文档中安装步骤适用的Windows系统包括:
- Windows 10/11
- Windows Server 2019
> 其他版本的Windows系统安装时可能遇到各种依赖库问题,不推荐使用。
在Windows系统上安装VeighNa,推荐使用官方推出的【VeighNa Studio Python发行版】,**尤其是初次接触Python的编程新手**。
作为一站式的量化投研交易Python环境,VeighNa Studio整合了:
- Python 3.10 64位(Python官网版本)
- VeighNa和其他相关依赖库
- VeighNa StationVeighNa框架的图形化管理工具)
对于已经有比较丰富的编程经验或者需要用到特定Python发行版(如Anaconda)的用户,也可以采用手动安装的方案。
## VeighNa Studio方案
### 下载安装
在[VeighNa官网](https://www.vnpy.com/)可以下载VeighNa Studio安装包。
下载完成后,双击安装包进入VeighNa Studio安装向导(推荐点击右键,选择【使用管理员身份运行】进行安装),使用默认设置点击【快速安装】按钮即可进行VeighNa Studio安装,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/install/21.png)
> 推荐将VeighNa Studio安装在默认路径的C:\veighna_studio,其他VeighNa文档和教程中均使用该目录作为VeighNa安装目录进行讲解。
如果想进行个性化安装,可点击【自定义安装】进入高级选项页面,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/install/24.png)
安装完成后,会转换到安装成功页面,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/install/26.png)
此时桌面会出现VeighNa Station的图标,双击图标即可运行VeighNa Station。
### 使用
安装成功后,启动命令行工具即可直接使用VeighNa Studio Python发行版。
输入python即可进入python的交互式环境,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/install/29.png)
此时在命令行中输入python代码就会立即执行。如果想运行pyqtgraph的自带的例子,可以依次输入以下代码:
```python3
from pyqtgraph import examples
examples.run()
```
此时则会弹出Examples的运行窗口,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/install/30.png)
点击左侧的Basic Plotting则会弹出示例的图形界面,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/install/31.png)
如果想打开jupyter lab进行投资研究工作,可以打开cmd,输入jupyter lab,即可成功启动,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/install/32.png)
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/install/38.png)
### 修改
如果安装之后,想要添加或者移除某项功能,可以双击VeighNa Studio的安装包,进入VeighNa Studio安装界面,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/install/33.png)
点击【修改】,进入修改页面,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/install/35.png)
选择完可选功能后,点击【下一步】,进入高级选项页面,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/install/37.png)
选择完毕,即可重新安装。
### 修复
如果安装之后,出现安装不完整或者其他需要修复的情况,可以双击VeighNa Studio的安装包,进入VeighNa Studio安装界面,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/install/33.png)
点击【修复】,进入修复界面,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/install/34.png)
修复完成后,会转换到修复成功页面,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/install/15.png)
### 卸载
如果想卸载VeighNa Studio 可以双击VeighNa Studio的安装包,进入VeighNa Studio安装界面,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/install/33.png)
点击【卸载】,进入卸载界面,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/install/27.png)
卸载完成后,会转换到卸载成功页面,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/install/28.png)
## 手动安装方案
### 准备Python环境
首先请在电脑上准备好Python 3.10 64位环境(**注意必须是64位版本**),推荐使用Python官网的发行版,也可以使用Anaconda、Miniconda、Canopy等发行版。
这里我们以Python官网的发行版为例,首先在[Python官网](https://www.python.org/downloads/windows/)下载安装文件,选择【Windows installer (64-bit)】,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/install/22.png)
下载完毕后,双击文件进入Python安装向导,勾选【Add Python3.10 to PATH】选项后,点击【Install Now】进行安装,推荐使用默认设置一路点击【下一步】直到安装完成即可:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/install/23.png)
### 下载安装VeighNa
下载VeighNa源代码(Windows系统请选择zip格式):
- [VeighNa Github下载地址](https://github.com/vnpy/vnpy/releases)
- [VeighNa Gitee下载地址](https://gitee.com/mirrors/vn-py/releases)
下载完成后解压,然后启动命令行工具(CMD或者PowerShell),进入源代码所在的目录后(即install.bat文件所在的目录),输入下列命令运行脚本执行一键安装:
```
install.bat
```
一键安装过程整体分为3步:
1. 下载安装ta-lib库;
2. 安装VeighNa本身。
如果某一步安装过程中发生错误,请截取保存命令行中的报错信息(**注意优先保存底部的报错内容**),前往VeighNa社区论坛发帖提问寻求帮助。
### 启动VeighNa Trader
启动命令行工具,进入解压VeighNa源代码的目录下,在文件夹examples/veighna_trader中找到run.py文件。
输入如下命令即可启动VeighNa Trader
```
python run.py
```
请注意run.py中包含了较多的启动加载项(交易接口和应用模块),请根据自己所用的操作系统以及实际的交易需求修改调整使用(若需加载接口,取消接口前注释符号即可)。
连接接口介绍详见交易接口篇。
> 如果启动时出现一些库版本不兼容的情况,可根据提示对这些库重新pip安装。
+212
View File
@@ -0,0 +1,212 @@
# Configuration file for the Sphinx documentation builder.
#
# This file does only contain a selection of the most common options. For a
# full list see the documentation:
# http://www.sphinx-doc.org/en/master/config
# -- Path setup --------------------------------------------------------------
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here.
#
# import os
# import sys
# sys.path.insert(0, os.path.abspath('.'))
# -- Project information -----------------------------------------------------
project = 'VeighNa'
copyright = '2015 - 2024, 上海韦纳软件科技有限公司'
author = '上海韦纳软件科技有限公司'
# The short X.Y version
version = '2024.7.18'
# The full version, including alpha/beta/rc tags
release = '2024.7.18'
# -- General configuration ---------------------------------------------------
# If your documentation needs a minimal Sphinx version, state it here.
#
# needs_sphinx = '1.0'
# Add any Sphinx extension module names here, as strings. They can be
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
# ones.
extensions = [
'sphinx.ext.autodoc',
'sphinx.ext.intersphinx',
'recommonmark',
]
# Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates']
# The suffix(es) of source filenames.
# You can specify multiple suffix as a list of string:
#
# source_suffix = ['.rst', '.md']
# source_suffix = '.rst'
source_suffix = {
'.rst': 'restructuredtext',
'.txt': 'markdown',
'.md': 'markdown',
}
# The master toctree document.
master_doc = 'index'
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
#
# This is also used if you do content translation via gettext catalogs.
# Usually you set "language" from the command line for these cases.
language = None
locale_dirs = ["locale/"]
# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
# This pattern also affects html_static_path and html_extra_path.
exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']
# The name of the Pygments (syntax highlighting) style to use.
pygments_style = 'sphinx'
# -- Options for HTML output -------------------------------------------------
# The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes.
#
html_theme = 'alabaster'
# Theme options are theme-specific and customize the look and feel of a theme
# further. For a list of options available for each theme, see the
# documentation.
#
html_theme_options = {
'logo': 'vnpy.ico',
"base_bg": "inherit",
"narrow_sidebar_bg": "inherit",
'github_banner': True,
'github_user': 'vnpy',
'github_repo': 'vnpy',
'github_type': 'star',
'description': (r"<div class='col-md-12'>"
r"<strong>VeighNa</strong>"
r"</div>"
r"<br/>"
r"By Traders, For Traders"),
'fixed_sidebar': True,
'show_related': True
}
# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = ['_static']
# Custom sidebar templates, must be a dictionary that maps document names
# to template names.
#
# The default sidebars (for documents that don't match any pattern) are
# defined by theme itself. Builtin themes are using these templates by
# default: ``['localtoc.html', 'relations.html', 'sourcelink.html',
# 'searchbox.html']``.
#
html_sidebars = {
'index': [
'about.html',
'sidebarintro.html',
'sourcelink.html',
'searchbox.html'
],
'**': [
'about.html',
'localtoc.html',
'relations.html',
'sourcelink.html',
'searchbox.html'
]
}
# -- Options for HTMLHelp output ---------------------------------------------
# Output file base name for HTML help builder.
htmlhelp_basename = 'vnpydoc'
# -- Options for LaTeX output ------------------------------------------------
latex_elements = {
# The paper size ('letterpaper' or 'a4paper').
#
# 'papersize': 'letterpaper',
# The font size ('10pt', '11pt' or '12pt').
#
# 'pointsize': '10pt',
# Additional stuff for the LaTeX preamble.
#
# 'preamble': '',
# Latex figure (float) alignment
#
# 'figure_align': 'htbp',
}
# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title,
# author, documentclass [howto, manual, or own class]).
latex_documents = [
(master_doc, 'vnpy.tex', 'vnpy Documentation',
'VeighNa Team', 'manual'),
]
# -- Options for manual page output ------------------------------------------
# One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section).
man_pages = [
(master_doc, 'vnpy', 'vnpy Documentation',
[author], 1)
]
# -- Options for Texinfo output ----------------------------------------------
# Grouping the document tree into Texinfo files. List of tuples
# (source start file, target name, title, author,
# dir menu entry, description, category)
texinfo_documents = [
(master_doc, 'vnpy', 'vnpy Documentation',
author, 'vnpy', 'One line description of project.',
'Miscellaneous'),
]
# -- Options for intersphinx output ----------------------------------------------
intersphinx_mapping = {
# 'python': ('https://docs.python.org/3/', None),
}
# -- Options for Epub output -------------------------------------------------
# Bibliographic Dublin Core info.
epub_title = project
# The unique identifier of the text. This can be a ISBN number
# or the project homepage.
#
# epub_identifier = ''
# A unique identification for the text.
#
# epub_uid = ''
# A list of files that should not be packed into the epub file.
epub_exclude_files = ['search.html']
# -- Options for Autodoc -------------------------------------------------
autodoc_default_options = {
'member-order': 'bysource',
'undoc-members': True,
}
+141
View File
@@ -0,0 +1,141 @@
# 算法交易执行
Veighna Elite Trader提供了算法委托执行交易支持。
## 功能简介
用户可以通过Veighna Elite Trader主界面的【算法交易】组件来便捷完成启动算法、停止算法等任务。
【算法交易】组件采用独立进程的算法引擎负责委托订单的具体执行过程。目前提供了五种示例算法,用户可以通过把大笔订单自动拆分成合适的小单分批委托的操作,有效降低交易成本和冲击成本,也可以在设定的阈值内进行高抛低吸操作。
## 启动执行
启动Veighna Elite Trader并连接接口之后,点击主界面左侧中部的【算法交易】标签页,就可以看见算法执行组件的操作界面,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/algo/1.png)
在单元格【算法】对应的下拉框中选择要启动的算法,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/algo/2.png)
选择好算法之后,对算法的参数进行配置,点击【启动算法】即可进行算法委托。此时Veighna Elite Trader主界面右侧中上部分的【算法】标签页会显示该算法的执行情况,右侧中上部分的【委托】标签页以及右侧中下部分的【成交】标签页则会显示相关的委托成交情况,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/algo/5.png)
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/algo/6.png)
若需停止所有启动的算法,点击【全部停止】按钮即可停止所有算法。
## 算法状态监控
启动Veighna Elite Trader之后,点击主界面右侧中上部分的【算法】标签页,就可以看见算法状态监控组件。
算法状态监控组件用于记录已启动算法的名称、本地代码、方向、开平、价格、总数量、成交量、剩余量、成交均价、状态、参数以及变量。除此之外,组件每行最左侧还嵌入了两个控制单个算法状态的按钮,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/algo/7.png)
### 算法状态
一个算法具有运行、暂停、停止和结束四种状态。当算法启动时,算法处于“运行”状态(RUNNING)。当算法因为完成任务主动结束(计时到了或成交量满足条件等)时,算法处于“结束”状态(FINISHED)。当算法被暂停,算法处于“暂停”状态(PAUSED)。当算法被动结束,算法处于“停止”状态(STOPPED)。
### 算法控制按钮
当算法启动后,【算法】组件上会显示算法的状态信息。此时该算法信息最左侧的【停止】和【暂停】按钮皆处于可点击状态。若该算法主动结束了,此时该算法最左侧的两个按钮区域皆会变灰(不可点击)。
#### 暂停算法
若想暂停算法的执行,可点击【暂停】按钮,此时原来【暂停】按钮上的文字会变为“恢复”。
#### 恢复算法
如果想恢复已暂停算法的执行,则可点击【恢复】按钮进行恢复,此时原来【恢复】按钮上的文字会变为“暂停”。
#### 停止算法
若想停止该运行中的算法,可以点击【停止】按钮停止算法,此时该算法最左侧的两个按钮区域皆会变灰(不可点击)。
## 算法介绍
目前,【算法交易】组件提供了以下五种内置算法:
### TWAP - 时间加权平均算法
时间加权平均算法(TWAP)具体执行步骤如下:
- 将委托数量平均分布在某个时间区域内,每隔一段时间用指定的价格挂出买单(或者卖单)。
- 买入情况:卖一价低于目标价格时,发出委托,委托数量在剩余委托量与委托分割量中取最小值。
- 卖出情况:买一价高于目标价格时,发出委托,委托数量在剩余委托量与委托分割量中取最小值。
### Iceberg - 冰山算法
冰山算法(Iceberg)具体执行步骤如下:
- 在某个价位挂单,但是只挂一部分,直到全部成交。
- 买入情况:先检查撤单,最新Tick卖一价低于目标价格,执行撤单;若无活动委托,发出委托,委托数量在剩余委托量与挂出委托量中取最小值。
- 卖出情况:先检查撤单,最新Tick买一价高于目标价格,执行撤单;若无活动委托,发出委托,委托数量在剩余委托量与挂出委托量中取最小值。
### Sniper - 狙击手算法
狙击手算法(Sniper)具体执行步骤如下:
- 监控最新Tick推送的行情,发现好的价格立刻报价成交。
- 买入情况:最新Tick卖一价低于目标价格时,发出委托,委托数量在剩余委托量与卖一量中取最小值。
- 卖出情况:最新Tick买一价高于目标价格时,发出委托,委托数量在剩余委托量与买一量中取最小值。
### Stop - 条件委托算法
条件委托算法(Stop)具体执行步骤如下:
- 监控最新Tick推送的行情,发现行情突破立刻报价成交。
- 买入情况:Tick最新价高于目标价格时,发出委托,委托价为目标价格加上超价。
- 卖出情况:Tick最新价低于目标价格时,发出委托,委托价为目标价格减去超价。
### BestLimit - 最优限价算法
最优限价算法(BestLimit)具体执行步骤如下:
- 监控最新Tick推送的行情,发现好的价格立刻报价成交。
- 买入情况:先检查撤单:最新Tick买一价不等于目标价格时,执行撤单;若无活动委托,发出委托,委托价格为最新Tick买一价,委托数量为剩余委托量。
- 卖出情况:先检查撤单:最新Tick买一价不等于目标价格时,执行撤单;若无活动委托,发出委托,委托价格为最新Tick卖一价,委托数量为剩余委托量。
## 多账户支持
### 加载
算法委托执行交易模块提供了多账户批量下单交易支持(手动)。
以登录**CTP**接口为例,在登录界面下方的【交易接口】标签页的下拉框中先选中CTP接口。在“自定义接口”处填写自定义的接口名(例如“CTP1”、“CTP2”)之后点击【添加】按钮,填写子账户的配置信息,点击【确定】按钮,则可依次加载对应账户的接口。
添加完毕后,点击登录界面的【登录】按钮登录VeighNa Elite Trader。在菜单栏中依次点击【系统】->【连接xxx】(xxx是自定义的接口名,若加载时填写的“CTP1”,则菜单栏中显示的就是【连接CTP1】),即可连接子账户接口。
连接成功以后,VeighNa Elite Trader主界面【日志】组件会立刻输出登录相关信息,同时用户也可以看到对应的账号信息,持仓信息等相关信息。
此时已经可以在【市场深度交易】界面通过指定的账户进行委托了。
### 算法下单
#### 账户下单
若需通过【算法交易】组件进行多账户委托,可在创建的图表左上角选择账户对应的【接口】启动算法。
发出委托后,可以在VeighNa Elite Trader主界面【算法】、【委托】和【成交】组件上跟踪到根据对应接口下单的委托,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/algo/4.png)
**请注意**
- 目前支持同时登录最多登录5个交易账户
+45
View File
@@ -0,0 +1,45 @@
# 钉钉实时通知
VeighNa Elite Trader主界面的全局配置的窗口提供了钉钉消息通知功能支持。用户可以通过简单的配置,在钉钉会话中收到程序运行过程中的核心系统日志、CTA策略模块日志、组合策略模块日志以及期权策略模块日志。
## 钉钉配置
启动钉钉,创建一个群聊,点击群聊右上角的设置图标,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/ding/1.png)
在弹出的群设置界面下滑,点击【机器人】设置,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/ding/2.png)
在弹出的界面中点击【添加机器人】,然后在机器人选项中选择【自定义】(通过Webhook接入自定义服务)机器人,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/ding/3.png)
在弹出的添加机器人窗口中输入自己定义的机器人名字并选择要发送消息的群,勾选【加签】选项(此时可点击【复制】按钮复制出密钥),点击【完成】按钮即可成功添加机器人配置,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/ding/4.png)
添加完机器人之后,复制处弹出的设置webhook窗口里Webhook地址中access token=后的Token内容,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/ding/5.png)
请注意,若配置时忘记了复制出密钥和Token,可以在添加完及机器人之后,点击群聊右上角的设置图标,选择【机器人】,在跳出窗口中“本群的机器人”部分下选择之前添加的机器人。可在弹出的【配置】窗口中找到密钥和Token信息,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/ding/7.png)
## VeighNa Elite Trader配置
在VeighNa Elite Trader的全局配置窗口中的【钉钉】部分进行配置:
- 启动:选择【是】选项;
- Token:填入钉钉设置webhook窗口时复制出的Token内容;
- 密钥:填入钉钉添加机器人勾选【加签】选项时复制出的密钥。
## 钉钉接收信息样式
VeighNa Elite Trader和钉钉都配置完毕后,VeighNa Elite Trader运行过程中以“$”结尾(过滤普通日志)的日志就会发送到配置Token对应的钉钉群聊会话中了。如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/ding/6.png)
+44
View File
@@ -0,0 +1,44 @@
# 飞书实时通知
VeighNa Elite Trader主界面的全局配置的窗口提供了飞书消息通知功能支持。用户可以通过简单的配置,在飞书会话中收到程序运行过程中的核心系统日志、CTA策略模块日志、组合策略模块日志以及期权策略模块日志。
## 飞书配置
启动飞书,创建一个群聊,点击群聊右上角的省略号,再点击设置图标,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/feishu/1.png)
在弹出的设置界面中点击【群机器人】设置,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/feishu/2.png)
在弹出的界面中点击【添加机器人】,然后在机器人选项中选择【自定义机器人】,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/feishu/3.png)
先输入自己定义的机器人名称和描述,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/feishu/4.png)
再点击【添加】按钮继续设置Webhook地址(此时可点击【复制】按钮复制出Webhook地址)。接着可以勾选安全设置的【签名校验】选项进行加密(此时可点击【复制】按钮复制出密钥),点击【完成】按钮即可成功添加机器人配置,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/feishu/5.png)
请注意,若配置时忘记了复制出Webhook地址和密钥,可以在添加完及机器人之后,在群聊设置中,选择【群机器人】,在跳出窗口中“群机器人”部分下选择之前添加的机器人。可在弹出的【机器人】窗口中找到Webhook地址和密钥信息,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/feishu/6.png)
## VeighNa Elite Trader配置
在VeighNa Elite Trader的全局配置窗口中的【飞书】部分进行配置:
- 启动:选择【是】选项;
- URL:填入飞书设置Webhook窗口时复制出的Webhook地址;
- 密钥:填入飞书添加机器人勾选【签名校验】选项时复制出的密钥。
## 飞书接收信息样式
VeighNa Elite Trader和飞书都配置完毕后,VeighNa Elite Trader运行过程中以“$”结尾(过滤普通日志)的日志就会发送到配置URL对应的飞书群聊会话中了。如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/feishu/7.png)
+117
View File
@@ -0,0 +1,117 @@
# 市场深度交易
Veighna Elite Trader提供了市场深度交易支持(实时)。
## 应用场景
市场深度交易组件应用于单合约实时日内交易。支持显示买方和卖方订单的实时挂单数据,按目前价格进行更新以反映实时市场活动。
## 启动模块
市场深度交易模块是Veighna Elite Trader自带的模块,无需启动之前通过【策略应用】标签页加载。
启动登录VeighNa Elite Trader后,启动模块之前,请先连接交易接口。看到VeighNa Trader主界面【日志】栏输出“合约信息查询成功”之后再启动模块。
请注意,IB接口因为登录时无法自动获取所有的合约信息,只有在用户手动订阅行情时才能获取。因此需要在主界面上先行手动订阅合约行情,再启动模块。
成功连接交易接口后,在菜单栏中点击【功能】-> 【市场深度交易】,或者点击左侧按钮栏的图标:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/ladder/1.png)
即可进入市场深度交易模块的UI界面,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/ladder/2.png)
## 创建图表
打开市场深度交易模块的UI界面后,在【本地代码】编辑框中输入合约代码(注意本地代码由代码前缀和交易所后缀两部分组成,如rb2305.SHFE)。
点击【打开】按钮,即可创建对应合约的市场深度图表,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/ladder/3.png)
### 多个图表
市场深度交易模块支持同时创建多个图表,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/ladder/7.png)
### 关闭图表
若想关闭已创建的市场深度图表图表,点击对应图表左下角的【关闭】按钮即可顺利关闭该图表。
## 数据监控
图表的顶部显示的是合约代码,左上方显示的是合约的委托路由(可选)、涨跌幅、开盘价、最高价、最低价以及成交量的信息,左侧中部显示的是该合约的持仓情况,左下方显示的是委托相关的按钮以及关闭图表的按钮。
图表的右侧显示的是该合约的市场实时深度信息。【价格】列显示的是合约的价格,价格由高到低排序。【买入】与【卖出】列分别显示的是合约的买方挂单量和卖方挂单量,与【价格】一一对应。
【价格】列上深蓝色单元格显示的是实时买一价,左侧【买入】列同一高度单元深蓝色单元格上显示的是对应的买一量。【价格】列上深红色单元格显示的是实时卖一价,右侧【卖出】列同一高度单元深红色单元格上显示的是对应的卖一量。
【成交】列显示的是最新一个tick的成交量,【委托】列显示的是用户当前在该合约上对应价格的挂单数量。
## 深度下单
市场深度图表创建成功后,用户可基于图表上更新的买方深度挂单和卖方深度挂单进行手动委托。
在界面左侧中部设置好预计委托的手数与开平方向之后,双击【买入】或【卖出】列上与中间【价格】列价格对应的蓝色/红色单元格,会弹出【操作确认】窗口,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/ladder/4.png)
点击【确认】,即可发出委托。此时【委托】列上与委托价格平齐的单元格上则会显示活跃委托的数量,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/ladder/5.png)
## 深度撤单
若想对撤销还未成交的挂单,可双击【委托】列上显示委托价格的单元格,会弹出【操作确认】窗口,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/ladder/6.png)
点击【确认】,即可撤销所有该对应价格的活动委托。
若想对该合约的活动委托进行批量撤单,也可点击图表左下角的【撤卖】/【全撤】/【撤买】按钮撤销委托。
## 多账户支持
### 加载
市场深度交易模块提供了多账户批量下单交易支持(手动)。
以登录**CTP**接口为例,在登录界面下方的【交易接口】标签页的下拉框中先选中CTP接口。在“自定义接口”处填写自定义的接口名(例如“CTP1”、“CTP2”)之后点击【添加】按钮,填写子账户的配置信息,点击【确定】按钮,则可依次加载对应账户的接口。
添加完毕后,点击登录界面的【登录】按钮登录VeighNa Elite Trader。在菜单栏中依次点击【系统】->【连接xxx】(xxx是自定义的接口名,若加载时填写的“CTP1”,则菜单栏中显示的就是【连接CTP1】),即可连接子账户接口。
连接成功以后,VeighNa Elite Trader主界面【日志】组件会立刻输出登录相关信息,同时用户也可以看到对应的账号信息,持仓信息等相关信息。
此时已经可以在【市场深度交易】界面通过指定的账户进行委托了。
### 创建账户下单组合
如果需要构建账户组合,并为组合内的每个账户分配不同的比例乘数,可以在菜单栏中点击【功能】->【多账户批量下单】,进入多账户批量下单模块的UI界面创建下单组合。
### 深度下单
#### 账户下单
若需通过市场深度交易模块进行多账户委托,可在创建的图表左上角选择账户对应的【路由】进行委托。
#### 组合下单
若需通过市场深度交易模块进行组合下单,可在创建的图表左上角选择下单组合对应的【路由】进行委托(根据下单组合指定的比例发出委托)。
发出委托后,除了可在图表的【委托】列观察到委托数量之外,还可在VeighNa Elite Trader主界面【委托】组件和【成交】组件上跟踪到根据对应接口下单的委托,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/ladder/8.png)
**请注意**
- 目前支持同时登录最多登录5个交易账户
- 市场深度交易图表上显示的是连接的所有路由上该合约的总持仓
+10
View File
@@ -0,0 +1,10 @@
智能交易
~~~~~~~~~
.. toctree::
:maxdepth: 2
elite_ladder.md
elite_algotrading.md
elite_dingtalk.md
elite_feishu.md
+9
View File
@@ -0,0 +1,9 @@
Elite版
~~~~~~~~~
.. toctree::
:maxdepth: 2
info/index
strategy/index
extension/index
+44
View File
@@ -0,0 +1,44 @@
# Elite安装配置
本文档中安装步骤适用的操作系统包括:
- Windows 10/11
- Windows Server 2019/2022
> 其他版本的Windows系统安装时可能遇到各种依赖库问题,不推荐使用。
## 安装流程
### 安装
下载VeighNa Elite安装包后,双击安装包进入VeighNa Elite安装向导(推荐点击右键,选择【使用管理员身份运行】进行安装),点击【下一步】按钮即可进行安装目录选择,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/install/1.png)
> 推荐将VeighNa Elite安装在默认路径的C:\veighna_elite,其他VeighNa Elite文档和教程中均使用该目录作为VeighNa Elite安装目录进行讲解。
选择完安装目录之后,点击【安装】即可进行VeighNa Elite安装,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/install/2.png)
安装完成后,会转换到安装成功页面,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/install/3.png)
此时桌面会出现VeighNa Elite Trader和VeighNa Elite Lab的图标,双击图标即可运行对应程序。
### 卸载
如果想卸载VeighNa Elite 可以在Windows系统中打开【设置】-【应用】-【应用和功能】,找到VeighNa Elite进行卸载。
## 注意事项
### 独立环境
VeighNa Elite不会与VeighNa Studio等其他Python环境冲突,如需使用其他模块,可以通过PYTHONPATH环境变量加载。
### 用户信息
用户信息缓存在用户目录下的.vntrader文件夹中。如果卸载时需要清除用户数据及配置信息,需要将.vntrader文件夹删除。如果只是重新安装,只卸载程序即可,重装之后配置信息无需重新填写。
+79
View File
@@ -0,0 +1,79 @@
# 投研开发环境
## 启动运行
### 点击图标启动
安装成功后,双击桌面上VeighNa Elite Lab快捷方式:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/lab/1.png)
即可运行VeighNa Elite Lab。
### 用户登录
每次使用VeighNa Elite Lab都会弹出包含用户名输入框以及密码输入框的登录界面,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/lab/2.png)
用户按照要求在用户名输入框中输入用户名,在密码输入框中输入密码后,点击【登录】按钮,即可完成登录进入VeighNa Elite Lab主运行程序,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/lab/3.png)
请注意,若VeighNa Elite Lab启动时检测到已有更新版本发布,则会弹出【更新提示】窗口。若点击【Yes】则立即更新,若点击【No】则跳过更新正常登录。
## 选择目录
成功登录后,可在VeighNa Elite Lab启动界面的右下角看见运行目录(默认显示用户目录),若需切换到至指定目录运行可点击【修改】按钮在弹出的【选择Jupyter Lab运行目录】窗口中进行选择。指定完运行目录之后,则可点击界面左下角的【启动】按钮打开VeighNa Elite Lab,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/lab/4.png)
## 笔记本模式
点击VeighNa Elite Lab右侧启动器中【Notebook】选项下的图标即可新建一个空白的jupyter笔记本,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/lab/5.png)
### 笔记本运行示例
在VeighNa Elite Lab中,用户可加载VeighNa Elite内置的模块进行研究。
以CTA策略模块的回测笔记本为例,首先需要加载需要用到的组件和策略对象,然后创建回测引擎并设置回测过程中引擎用到的参数。设置完之后再添加策略对象和策略参数设置到回测引擎中,此时就可以加载数据开始跑回测了。结果跑出来之后就可以计算每日盈亏和统计指标并通过图表把结果显示出来了。
## 交互式模式
点击VeighNa Elite Lab右侧启动器中【Console】选项下的图标即可打开一个Python交互式环境,可以直接输入代码,然后执行,并立刻得到结果。如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/lab/6.png)
## 其他模式
VeighNa Elite Lab不仅支持一个页面打开编辑多个NotebookIpython console和terminal终端,还支持预览和编辑更多种类的文件,如代码文件,Markdown文档,json和csv等,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/lab/7.png)
### 命令行
点击VeighNa Elite Lab右侧启动器中【Other】选项下的Terminal图标即可打开命令行。
### 编辑文本
点击VeighNa Elite Lab右侧启动器中【Other】选项下的Text File图标即可新建一个空白的txt文件。VeighNa Elite Lab同时也支持编辑查看已存在的txt文件。
### 编辑Markdown
点击VeighNa Elite Lab右侧启动器中【Other】选项下的Markdown File图标即可新建一个空白的md文件。VeighNa Elite Lab同时也支持编辑查看已存在的md文件。编辑Markdown File时也可点击右键选择【Show Markdown Preview】进行预览。
### 编辑Python文件
点击VeighNa Elite Lab右侧启动器中【Other】选项下的Python File图标即可新建一个空白的py文件。VeighNa Elite Lab同时也支持编辑查看已存在的py文件。
### 显示帮助文档
点击VeighNa Elite Lab右侧启动器中【Other】选项下的Show Contextual Help图标即可新建一个帮助窗口,当鼠标点击任意函数时该窗口会显示对应的帮助文档,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/lab/8.png)
+297
View File
@@ -0,0 +1,297 @@
# 基础交易功能
## 启动交易程序
### 点击图标启动
安装成功后,双击桌面上VeighNa Elite Trader快捷方式:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/install/4.png)
即可运行VeighNa Elite Trader。
### 用户登录
每次使用VeighNa Elite Trader都会弹出包含用户名输入框以及密码输入框的登录界面,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/trader/1.png)
用户按照要求在用户名输入框中输入用户名,在密码输入框中输入密码后,点击【登录】按钮,即可完成登录进入VeighNa Elite Trader主运行程序,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/trader/8.png)
请注意,若VeighNa Elite Trader启动时检测到已有更新版本发布,则会弹出【更新提示】窗口。若点击【Yes】则立即更新,若点击【No】则跳过更新正常登录。
### 加载接口
在登录界面的下方,有两个标签页。分别为【交易接口】和【策略应用】。
点开【交易接口】标签下的接口下拉框,可以看到可供加载的接口,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/trader/2.png)
在下拉框选择完需要加载的接口后,点击【添加】按钮,会弹出对应接口的配置窗口,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/trader/3.png)
接口连接信息配置完毕之后,点击【确认】按钮则可看见选择的接口名字已经显示在标签页内容框中,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/trader/4.png)
添加成功后,配置信息会被保存到本地,下次启动时无需重复填写。
若需更新接口配置信息,选中指定的接口名,点击【修改】按钮,对应的配置窗口会弹出以供更新。
若有无需再加载的接口,可选中指定的接口名,点击【移除】按钮,则可成功移除记录的接口名(没有删除记录的配置信息)。
请注意:
- 如果需要连接融航接口,需要自行安装vcredist 2010才可成功加载
- 如果需要连接GT接口,第一次连接需要使用管理员身份启动程序
- 如果需要使用多账户功能,可参考[多账户支持](#jump)部分的介绍
### 加载应用
在登录界面的下方,点击【策略应用】标签,则可切换到加载策略应用的标签页,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/trader/5.png)
点开【策略应用】标签下的接口下拉框,可以看到可供加载的应用,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/trader/6.png)
在下拉框选择完需要加载的接口后,点击【添加】按钮则可成功加载该应用。与此同时,该策略应用的名字会显示在标签页内容框中,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/trader/7.png)
应用加载成功后,下次启动时无需重复操作。
若有无需再加载的应用,可选中指定的应用名,点击【移除】按钮,即可移除已经加载的应用。
## 登录资金账号
以登录**CTP**接口为例,在VeighNa Elite Trader上的菜单栏中点击【系统】->【连接CTP】,即可连接CTP接口。
连接成功以后,VeighNa Elite Trader主界面【日志】组件会立刻输出登录相关信息,同时用户也可以看到账号信息,持仓信息,合约查询等相关信息。如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/trader/9.png)
## 查看合约信息
成功连接交易接口后,用户可以通过合约查询功能查询合约信息。
点击菜单栏的【帮助】->【合约查询】,在弹出的对话框中直接点击右上角的【查询】按钮,即可查询合约信息(留空则查询所有合约的价格信息),如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/trader/10.png)
请注意,IB接口因为登录时无法自动获取所有的合约信息,只有在用户手动订阅行情时才能获取。因此需要在主界面上先行手动订阅合约行情,才能查到合约信息。
## 订阅行情数据
在交易组件输入交易所和合约代码,按回车键即可订阅行情。如订阅股指期货时,交易所填写CFFEX,代码填写对应合约代码IF2306。
订阅成功后,交易组件会显示合约名称,并且在下方显示深度行情报价,如最新价、买一价和卖一价,行情组件会显示最新行情信息,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/trader/11.png)
请注意,**输入的合约代码需与在菜单栏的【帮助】->【查询合约】功能中查到的一致**。
## 委托下单撤单
【快捷交易】组件用于手动发起委托交易,除了填写交易所和合约代码外,还需填写下图中的五个字段(方向、开平、类型、价格和数量):
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/trader/12.png)
若已成功订阅行情,可以勾选【价格】栏右侧的方框,设置价格随行情更新。勾选之后,【价格】栏上的委托价格会随行情推送自动更新为设定合约的最新价,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/trader/13.png)
请注意,若委托类型为市价单,委托价格可不填;若交易接口只支持单向持仓,可不填写开平方向。
发出委托后,本地会缓存委托相关信息,并显示到【委托】组件和【活动】组件,此时委托状态为【提交中】。
交易所收到用户发送的委托后,会将其插入中央订单簿来进行撮合成交,并推送委托回报给用户:
- 若委托还未成交,【委托】组件和【活动】组件只会更新时间和委托状态这两个字段,委托状态变成【未成交】;
- 若委托立刻成交,委托相关信息会从【活动】组件移除,新增至【成交】组件,委托状态变成【全部成交】。
## 交易数据监控
数据监控由以下组件构成,并附带两个辅助功能:
选定以下任一组件,鼠标右键可以选择【调整列宽】(特别适用于屏幕分辨率较低的情况)或者选择【保存数据】(CSV格式),如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/trader/18.png)
### 委托
委托组件用于存放用户发出的所有委托信息,其委托状态可以是提交中、已撤销、部分成交、全部成交、拒单等,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/trader/19.png)
### 成交
成交组件用于存放已成交的委托,在该组件中,价格、数量和时间都是交易所推送过来的成交信息,而不是委托信息,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/trader/20.png)
### 资金
资金组件显示了账号的基础信息,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/trader/21.png)
需要注意以下三个字段信息:
- 可用:可以用于委托的现金
- 冻结:委托操作冻结的金额(与保证金不是一个概念)
- 余额:总资金,即可用资金 + 保证金 + 浮动盈亏
若全部平仓,浮动盈亏变成实际盈亏,保证金和浮动盈亏清零,总资金等于可用资金。
### 持仓
持仓组件用于记录历史持仓,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/trader/22.png)
需要注意以下字段信息:
- 方向:期货品种具有多空方向,而股票品种方向为【净】持仓;
- 数量:总持仓,即今仓 + 昨仓;
- 昨仓:其出现衍生于上期所特有的平今、平昨模式的需要;
- 均价:历史成交的平均价格(某些巨型委托,会发生多次部分成交,需要计算平均价格);
- 盈亏:持仓盈亏。多仓情况下,盈利 = 当前价格 - 均价,空仓则反之。
若平仓离场,持仓数量清零,浮动盈亏变成实际盈亏从而影响账号余额变化。
## 应用模块
VeighNa Elite提供了开箱即用的量化交易应用模块,在启动VeighNa Elite Trader时加载所需的应用模块,启动成功后在菜单栏中点击【功能】,即可在弹出的菜单中看到应用模块的对应按钮,同时在窗口最左侧区域也会有带图标的模块按钮用于快速打开应用,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/trader/28.png)
## 全局配置
点击VeighNa Elite Trader菜单栏上的【配置】按钮弹出【全局配置】窗口,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/trader/29.png)
### 数据服务
- 服务名: 数据服务接口的名称,全称的小写英文字母;
- 用户名: 数据服务的用户名;
- 密码: 数据服务的密码。
目前支持:
- 迅投研数据服务:用户名填写“token”字符串,密码填写在迅投研用户中心后台页面查询到的令牌token内容
- RQData数据服务:注意用户名username和密码password不是米筐官网登录用的账号和密码,用户名填写“license”这个字符,密码填写邮件收到的license的内容
### 显示
- 字体:设置VeighNa Elite Trader图形界面的字体类型,除了默认的Arial字体,也支持Courier New和System字体;
- 大小:设置VeighNa Elite Trader图形界面的字体大小,用户可以根据自己显示器的实际分辨率对字体大小进行修改。
### 日志
- 启动:控制是否启动LogEngine,默认为True。如果该项修改为False,则后续几项参数都将失效,同时VeighNa Elite Trader运行时不再输出日志或生成日志文件(可以降低部分系统延时);
- 级别:控制日志输出的级别,日志可以从轻到严重分成DEBUG、INFO、WARNING、ERROR、CRITICAL五个级别,分别对应10、20、30、40、50的整数值。如果日志等级低于该项设置值,将会被忽略。如果想要记录更详细的系统运行信息,建议将该项整数值调低;
- 终端输出:控制是否终端输出;
- 文件输出:该参数用于控制是否要将日志输出到文件中,建议设置为True,否则无法记录生成的日志。
VeighNa Elite Trader的日志文件,默认位于运行时目录的.vntrader\log目录下,完整路径为:
```
C:\users\administrator\.vntrader\log
```
其中,administrator为当前Windows系统的登录用户名。
### 钉钉
- 启动:控制是否运行钉钉消息通知功能,如设为True,则在程序运行过程中的核心系统日志、CTA策略模块日志等,均会发送到下文Token对应的钉钉会话中;
- Token:对应钉钉软件中,某一具体聊天会话的令牌,需要在钉钉会话中添加【自定义机器人】(基于Webhook接入自定义服务)后,在弹出的对话框中获取;
- 密钥:用于对发送到钉钉的消息进行加密处理,同样需要在添加机器人时弹出的对话框中获取;
### 飞书
- 启动:控制是否运行飞书消息通知功能,如设为True,则在程序运行过程中的核心系统日志、CTA策略模块日志等,均会发送到下文URL对应的飞书会话中;
- URL:对应飞书软件中,某一具体聊天会话的URL,需要在飞书会话中添加【自定义机器人】(基于Webhook接入自定义服务)后,在设置Webhook窗口框中获取;
- 密钥:用于对发送到飞书的消息进行加密处理,需要在添加机器人时勾选【签名校验】选项时获取;
### 邮件
- 服务器地址: SMTP邮件服务器地址,默认填写了QQ邮箱服务器地址。如果需要使用其他邮箱,需要自行查找一下其他的服务器地址;
- 服务器端口: SMTP邮件服务器端口号,默认填写了QQ邮箱服务器端口;
- 用户名: 填写邮箱地址即可,如xxxx@qq.com
- 密码: 对于QQ邮箱,此处不是邮箱密码,而是开通SMTP后系统生成的一个授权码;
- 发送邮箱: 与用户名一致;
- 接收邮箱: 接受邮件的邮箱地址。
## 多账户支持
<span id="jump">
### 加载
VeighNa Elite Trader提供了多账户批量下单交易支持(手动)。
以登录**CTP**接口为例,在登录界面下方的【交易接口】标签页的下拉框中先选中CTP接口。在“自定义接口”处填写自定义的接口名(例如“CTP1”、“CTP2”)之后点击【添加】按钮,填写对应账户的配置信息,点击【确定】按钮,则可依次加载对应账户的接口。如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/trader/14.png)
添加完毕后,点击登录界面的【登录】按钮登录VeighNa Elite Trader。在菜单栏中依次点击【系统】->【连接xxx】(xxx是自定义的接口名,若加载时填写的“CTP1”,则菜单栏中显示的就是【连接CTP1】),即可连接对应接口。
连接成功以后,VeighNa Elite Trader主界面【日志】组件会立刻输出登录相关信息,同时用户也可以看到对应的账号信息,持仓信息等相关信息。
日志组件如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/trader/15.png)
资金组件如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/trader/25.png)
持仓组件如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/trader/26.png)
此时已经可以在【快速交易】界面通过指定的账户进行委托了。
### 创建账户下单组合
如果需要构建账户组合,并为组合内的每个账户分配不同的比例乘数,可以在菜单栏中点击【功能】->【多账户批量下单】,或者点击左侧按钮栏的图标:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/trader/16.png)
即可进入多账户批量下单模块的UI界面,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/trader/17.png)
在“输入下单组合名称”处输出自建组合的名称,点击【添加】按钮,可看见界面左侧已经输出该组合名称,右侧对应接口的下单单元可已经变为可编辑状态。如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/trader/23.png)
设定完下单组合之后,点击【修改】按钮保存数据,此时该账户组合就创建成功了。
之后若需修改下单比例,可点击【修改】按钮进行编辑。若需删除指定的下单组合,在左侧界面选中组合,点击【移除】按钮即可完成组合的移除。
### 账户下单组合批量下单
若需通过账户下单组合进行委托,可在【快速交易】接口点击【路由】的下拉框选中指定的下单组合进行委托,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/trader/24.png)
委托完成后,可在【委托】组件和【成交】组件上跟踪到比例下单的委托,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/trader/27.png)
**请注意**
- 目前支持同时登录最多登录5个交易账户
</span>
+9
View File
@@ -0,0 +1,9 @@
安装使用
~~~~~~~~~
.. toctree::
:maxdepth: 2
elite_install.md
elite_trader.md
elite_lab.md
+160
View File
@@ -0,0 +1,160 @@
# 算法交易执行
AlgoTrading是用于**算法委托执行交易**的模块,用户可以通过其UI界面操作来便捷完成启动算法、保存配置、停止算法等任务。
## 主要优势
算法交易负责委托订单的具体执行过程。目前,AlgoTrading提供了多种示例算法,用户可以通过把大笔订单自动拆分成合适的小单分批委托,有效降低交易成本和冲击成本,也可以在设定的阈值内进行高抛低吸操作。此外,模块还可监控指定路径的CSV文件进行智能扫单。
## 启动模块
对于用户搭建的算法,需要放到vnpy_algotrading.algos目录中,才能被识别加载。
AlgoTrading模块需要启动之前通过【策略应用】标签页加载。
启动登录VeighNa Elite Trader后,启动模块之前,请先连接交易接口。看到VeighNa Elite Trader主界面【日志】栏输出“合约信息查询成功”之后再启动模块。
请注意,IB接口因为登录时无法自动获取所有的合约信息,只有在用户手动订阅行情时才能获取。因此需要在主界面上先行手动订阅合约行情,再启动模块。
成功连接交易接口后,在菜单栏中点击【功能】-> 【多进程算法交易】,或者点击左侧按钮栏的图标:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/algotrading/0.png)
即可进入多进程算法交易模块的UI界面,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/algotrading/1.png)
## 配置算法
配置参数要求如下:
- 算法:在下拉框中选择要执行的交易算法;
- 交易所:在下拉框中选择交易所;
- 代码:格式为symbol(合约代码);
- 方向:多、空;
- 开平:开、平、平今、平昨;
- 价格:委托下单的价格;
- 委托数量:委托的总数量;
- 接口:在下拉框中选择要发出委托的接口。
## 启动算法
目前VeighNa一共提供了五种常用的示例算法。本文档以时间加权平均算法(TWAP)为例,介绍算法启动过程。
在图形界面左上角填写好算法配置后,点击【启动算法】按钮即可启动算法,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/algotrading/3.png)
若启动成功,则可在右上角【执行中】界面观测到该算法的执行状态。并在右下角【日志】界面看到“算法启动”日志输出。
图中算法执行的任务具体为:使用时间加权平均算法,买入20手沪深300股指期货2409合约(IF2409),执行价格为3422元,执行时间为120秒,每轮间隔为6秒;即每隔6秒钟,当合约卖一价小于等于3422时,以3422的价格买入1手沪深300股指期货2409合约,将买入操作分割成20次。
## CSV监控
当有较多算法需要启动时,可以通过监控CSV文件来启动。点击图形界面左侧的【CSV监控】按钮,在弹出的对话框中选定要监控的文件夹即可监控路径下新写入的CSV文件,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/algotrading/7.png)
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/algotrading/8.png)
请注意,CSV文件的格式应如下图所示,和左侧编辑区的各字段一致:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/algotrading/9.png)
启动成功后,CSV文件中所有算法的执行情况均会在【执行中】、【已结束】和【日志】界面下显示,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/algotrading/10.png)
## 暂停算法
当用户需要暂停正在执行的交易算法时,可以在【执行中】界面点击【暂停】按钮,暂停某个正在执行的算法交易,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/algotrading/4.png)
## 恢复算法
当用户需要恢复已经暂停的交易算法时,可以在【执行中】界面点击【恢复】按钮,恢复某个已经暂停的算法交易,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/algotrading/5.png)
## 停止算法
当用户需要停止正在执行的交易算法时,可以在【执行中】界面点击【停止】按钮,停止某个正在执行的算法交易,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/algo_trading/6.png)
用户也可以在委托交易界面点击最下方的【全部停止】按钮,一键停止所有执行中的算法交易。
## 数据监控
数据监控界面由三个部分构成:
执行中组件:显示正在执行的算法交易,包括:算法、参数和状态。成功启动算法之后,切换到右上角【执行中】界面,会显示该算法的执行状态。
已结束组件:显示已完成的算法交易,同样包括:算法、参数和状态。算法结束或者停止之后,切换到右上角【已结束】界面,会显示该算法的执行状态。
日志组件:显示启动、停止、完成算法的相关日志信息。
## 示例算法
示例算法路径位于vnpy_algotrading.algos文件夹下(请注意,个别算法是没有写开平方向的,若有需要,可基于自身需求进行个性化修改)。目前,算法交易模块提供了以下五种内置算法:
### TWAP - 时间加权平均算法
时间加权平均算法(TWAP)具体执行步骤如下:
- 将委托数量平均分布在某个时间区域内,每隔一段时间用指定的价格挂出买单(或者卖单)。
- 买入情况:卖一价低于目标价格时,发出委托,委托数量在剩余委托量与委托分割量中取最小值。
- 卖出情况:买一价高于目标价格时,发出委托,委托数量在剩余委托量与委托分割量中取最小值。
### Iceberg - 冰山算法
冰山算法(Iceberg)具体执行步骤如下:
- 在某个价位挂单,但是只挂一部分,直到全部成交。
- 买入情况:先检查撤单,最新Tick卖一价低于目标价格,执行撤单;若无活动委托,发出委托,委托数量在剩余委托量与挂出委托量中取最小值。
- 卖出情况:先检查撤单,最新Tick买一价高于目标价格,执行撤单;若无活动委托,发出委托,委托数量在剩余委托量与挂出委托量中取最小值。
### Sniper - 狙击手算法
狙击手算法(Sniper)具体执行步骤如下:
- 监控最新Tick推送的行情,发现好的价格立刻报价成交。
- 买入情况:最新Tick卖一价低于目标价格时,发出委托,委托数量在剩余委托量与卖一量中取最小值。
- 卖出情况:最新Tick买一价高于目标价格时,发出委托,委托数量在剩余委托量与买一量中取最小值。
### Stop - 条件委托算法
条件委托算法(Stop)具体执行步骤如下:
- 监控最新Tick推送的行情,发现行情突破立刻报价成交。
- 买入情况:Tick最新价高于目标价格时,发出委托,委托价为目标价格加上超价。
- 卖出情况:Tick最新价低于目标价格时,发出委托,委托价为目标价格减去超价。
### BestLimit - 最优限价算法
最优限价算法(BestLimit)具体执行步骤如下:
- 监控最新Tick推送的行情,发现好的价格立刻报价成交。
- 买入情况:先检查撤单:最新Tick买一价不等于目标价格时,执行撤单;若无活动委托,发出委托,委托价格为最新Tick买一价,委托数量为剩余委托量。
- 卖出情况:先检查撤单:最新Tick买一价不等于目标价格时,执行撤单;若无活动委托,发出委托,委托价格为最新Tick卖一价,委托数量为剩余委托量。
File diff suppressed because it is too large Load Diff
+198
View File
@@ -0,0 +1,198 @@
# 历史数据管理
DataManager是用于**历史数据管理**的功能模块,用户可以通过其UI界面操作来便捷完成数据下载、数据查看、数据导入、数据导出和数据更新等任务。
## 主要优势
DataManager模块不仅提供了数据下载、数据查看、数据导入、数据导出和数据更新支持,还提供了期权数据更新功能,以实现更加强大的期权策略支持。
## 启动模块
DataManager模块需要启动之前通过【策略应用】标签页加载。
启动登录VeighNa Elite Trader后,在菜单栏中点击【功能】-> 【历史数据管理】,或者点击左侧按钮栏的图标:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/datamanager/1.png)
即可进入历史数据管理UI界面,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/datamanager/2.png)
## 下载数据
DataManager模块提供了一键下载历史数据的功能,点击界面上方的【下载数据】按钮,会弹出下载历史数据窗口,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/datamanager/3.png)
需要填写代码、交易所、周期以及开始日期四个字段信息:
<span id="jump">
- 代码
- 代码格式为合约品种
- 如IF2412、rb2406
- 交易所
- 合约交易的交易所(点击窗口右侧箭头按钮可选择VeighNa支持的交易所列表)
- 周期
- MINUTE1分钟K线)
- HOUR1小时K线)
- DAILY(日K线)
- WEEKLY(周K线)
- TICK(一个Tick
- 开始日期
- 格式为yy/mm/dd
- 如2021/6/6
</span>
填写完成后,点击下方【下载】按钮启动下载程序,下载成功如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/datamanager/4.png)
注意下载完成后的历史数据会保存在本地数据库中,后续回测或实盘时可以直接使用,无需每次都重复下载。
### 数据来源:数据服务(期货、股票、期权)
以迅投研为例,[迅投研](https://xuntou.net/#/signup?utm_source=vnpy)提供国内期货、股票以及期权的历史数据。在使用前需要保证数据服务已经正确配置(配置方法详见基本使用篇的全局配置部分)。
### 数据来源:IB(外盘期货、股票、现货等)
Interactive Brokers盈透证券(IB)提供丰富的外盘市场历史数据下载(包括股票、期货、期权、现货等),注意下载前需要先启动IB TWS交易软件,并在VeighNa Elite Trader主界面连接好IB接口,并订阅所需合约行情。
## 导入数据
如果已经从其他渠道获取到了CSV格式的数据文件,可以通过DataManager的数据导入功能,将其快速导入VeighNa数据库。点击右上角的【导入数据】按钮,会弹出从如下图所示的对话框:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/datamanager/5.png)
点击顶部的【选择文件】按钮,会弹出窗口选择要导入的CSV文件路径,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/datamanager/6.png)
然后配置数据导入的相关细节:
- 合约信息
- 格式详见本章[下载数据](#jump)部分的介绍;
- 请注意,导入的合约代码(symbol)和交易所(exchange)两个字段组合起来,才能构成在CTA回测等模块中使用的本地代码(vt_symbol);
- 若合约代码为**rb2406**,交易所选择**SHFE**(上期所),则在CtaBacktester中回测要用到的本地代码应为**rb2406.SHFE**
- 可以对时间戳时区进行选择;
- 表头信息
- 可查看CSV文件的表头信息,并将对应的表头字符串输入在表头信息中;
- 对于CSV文件中不存在的字段(如股票数据没有【持仓量】字段),请留空即可;
- 格式信息
- 采用Python内置库datetime模块的时间格式定义,来解析时间戳字符串;
- 默认时间格式为"%Y-%m-%d %H:%M:%S",对应的是"2024-1-3 0:00:00"
- 如果时间戳是"2024-1-3 0:00",那么时间格式应该是"%Y-%m-%d %H:%M"。
填写完毕,则如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/datamanager/7.png)
点击【确定】按钮,开始从CSV文件导入数据到数据库中。导入过程中界面会处于半卡住的情况,CSV文件越大(数据量越多),卡住的时间也会越长。成功载入之后,会弹出窗口显示载入成功,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/datamanager/8.png)
## 查看数据
目前VeighNa Elite Trader中获取数据的方式一共有三种:
- 通过数据服务或者交易接口下载
- 从CSV文件导入
- 使用DataRecorder模块录制
不管采用何种方法获取数据,点击左上角的【刷新】按钮,即可看到当前数据库中已有数据的统计情况(Tick数据除外)。刷新过程中界面可能会有偶尔的卡顿,通常对于越多的数据,卡顿的时间也会越长。刷新成功之后,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/datamanager/9.png)
点击【查看】按钮,则会弹出选择数据要查看数据区间(每个时间频率下都可基于交易所查看)的对话框,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/datamanager/12.png)
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/datamanager/11.png)
选择好要显示的数据范围和交易所后,点击【确定】按钮即可在右侧表格中看到每个时间点上具体的数据字段:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/datamanager/13.png)
在数据库已有数据的前提下,点击表格最左侧【数据】列下的数据频率前的小箭头,则可展开或收起该数据频率下的合约信息显示。
若表格的右侧区域显示不完整,可拖动界面底端的横向滚动条进行调整。
## 导出数据
如果想导出数据库中的数据到本地CSV文件,则可选择要导出的合约,点击该合约所在行右侧的【导出】按钮后,会弹出选择数据区间对话框,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/datamanager/14.png)
选择要导出的数据区间范围,点击【确定】后,会再次弹出对话框选择输出文件的位置,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/datamanager/15.png)
选择好导出文件要放置的目录,填写完CSV文件名之后,点击【保存】按钮即可完成CSV文件的导出。
## 删除数据
若想删除特定合约数据,则可选择要删除的合约,点击该合约行数据右侧的【删除】按钮后,会弹出对话框,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/datamanager/16.png)
点击【OK】按钮即可删除该合约数据,并弹出删除成功窗口,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/datamanager/17.png)
此时再点击【刷新】按钮,图形界面上已经没有该合约的信息了,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/datamanager/18.png)
## 更新数据
在用户**配置了数据服务**或者**交易接口(已连接)提供充足的历史数据**的情况下,点击界面上方的【更新数据】按钮,即可基于图形界面上显示的所有合约数据,执行一键自动下载更新。
更新前图形界面显示如下图:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/datamanager/19.png)
点击【更新数据】按钮,会弹出更新进度的信息提示对话框。此时DataManager会自动**从数据库中已有数据的结束日期开始,下载截止到当前最新日期**的数据,并更新到数据库中。
如果需要更新的数据较少,则可能瞬间完成更新任务,此时没有观察到更新对话框也是正常的。
更新完成后,点击左上角【刷新】按钮,即可看到该合约数据已更新至当前最新日期。
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/datamanager/20.png)
## 数据范围
请注意,虽然界面上显示了数据库中已有数据的开始和结束时间,**但并不代表数据库中储存了从开始时间到结束时间之间所有的数据**。
如果依赖于交易接口提供的历史数据,一但开始时间和结束时间之间的时间跨度超过接口所能提供的数据范围,就可能导致数据之间出现缺失的情况。因此建议更新数据之后,点击【查看】按钮检查一下该合约数据是否连续。
## 更新期权数据
对界面右上角的【交易所】和【开始时间】进行配置之后,点击【更新期权数据】按钮,即可基于交易所更新数据库里存储的期权合约信息和历史数据,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/datamanager/21.png)
更新完成后,点击左上角【刷新】按钮,即可看到期权合约数据已更新至当前最新日期。
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/datamanager/22.png)
若在更新过程中想停止数据更新,可以点击右上角的【停止数据更新按钮】,即可停止更新任务,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/datamanager/23.png)
请注意:
- 目前只有配置了迅投研或米筐才能使用期权数据更新功能
- 上图是迅投研更新的截图,若使用配置米筐为数据服务,更新过程中不会出现“开始更新合约历史信息”的输出
- 如果在更新过程中点击图形界面右上角的叉,关闭历史数据管理UI界面的话,更新任务会停止
+64
View File
@@ -0,0 +1,64 @@
# 行情数据过滤
VeighNa Elite Trader的CTA策略模块内置的EliteCtaTemplate提供了对垃圾数据的过滤配置支持。根据示例的格式进行配置之后,EliteCtaTemplate会对非交易时段收到的合成K线进行过滤,避免垃圾数据对策略指标计算结果产生影响。
## 配置过滤信息
### 使用官方提供文件
在VeighNa Elite Trader主界面点击【帮助】- 【更新Tick过滤】即可将生成最新的过滤配置文件filter_setting.json,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/filter/1.png)
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/filter/2.png)
请注意,**该filter_setting.json文件仅供参考,若与实际交易时段有出入(交易所对合约交易时段进行调整),VeighNa官方概不负责**。
filter_setting.json文件生成之后,会放置在VeighNa Elite Trader运行目录(通常是用户目录)下的.vntrader文件夹中。
### 手动编辑文件
如果交易的品种较少,可以自己手动创建一个filter_setting.json文件并填入相应合约交易时间配置信息(允许推送进策略的K线时间段),如下图所示:
```
{
"IF": [
["9:30:00", "11:29:00"],
["13:00:00", "14:59:00"]
],
"rb": [
["9:00:00", "10:14:00"],
["10:30:00", "11:29:00"],
["13:30:00", "14:59:00"],
["21:00:00", "22:59:00"]
],
"au": [
["9:00:00", "10:14:00"],
["10:30:00", "11:29:00"],
["13:30:00", "14:59:00"],
["21:00:00", "23:59:59"],
["00:00:00", "2:29:00"]
]
}
```
请注意:
- VeighNa的K线的datetime是K线的开始时间不是结束时间;
- 若交易商品期货,请不要忘记10:15到10:30的休盘时间;
- 若交易合约的交易时间涉及到跨日,请把夜盘的交易时间拆分成开始时间至23:59:59和00:00:00至结束时间两段。
配置好filter_setting.json文件后,将其放置在VeighNa Elite Trader运行目录下的.vntrader文件夹中即可。
## 过滤效果测试
若想要测试数据过滤功能的效果,可以在策略的on_history函数中添加打印语句看看策略内部是否收到了非交易时段的K线,如下所示:
```python3
# 判断实盘trading状态,只有策略启动之后才进行输出
if self.trading:
self.write_log(f"{self.strategy_name}_{self.vt_symbol}{hm.datetime[-1]}")
```
+475
View File
@@ -0,0 +1,475 @@
# 指标计算函数
VeighNa Elite Trader的CTA策略模块内置了以下计算函数供策略调用:
**sma** :简单移动平均
* 入参
* close: np.ndarray
* time_period: int=30
* 出参
* sma_array: np.ndarray
**ema** :指数滑动平均
* 入参
* close: np.ndarray
* time_period: int=30
* 出参
* ema_array: np.ndarray
**kama** :适应性移动平均
* 入参
* close: np.ndarray
* time_period: int=30
* 出参
* atr_array: np.ndarray
**wma** :加权移动平均
* 入参
* close: np.ndarray
* time_period: int=30
* 出参
* wma_array: np.ndarray
**apo**:绝对价格振荡器
* 入参
* close: np.ndarray
* fast_period: int=12
* slow_period: int=26
* matype: int=0
* 出参
* apo_array: np.ndarray
请注意,matype分别对应:0=SMA, 1=EMA, 2=WMA, 3=DEMA, 4=TEMA, 5=TRIMA, 6=KAMA, 7=MAMA, 8=T3
**cmo**:钱德动量摆动指标
* 入参
* close: np.ndarray
* time_period: int=14
* 出参
* cmo_array: np.ndarray
**mom**:上升动向值
* 入参
* close: np.ndarray
* time_period: int=10
* 出参
* mom_array: np.ndarray
**ppo**:价格震荡百分比指数
* 入参
* close: np.ndarray
* fast_period: int=12
* slow_period: int=26
* matype: int=0
* 出参
* ppo_array: np.ndarray
**roc**:变动率指标
* 入参
* close: np.ndarray
* time_period: int=10
* 出参
* roc_array: np.ndarray
**rocr**:变动率比率
* 入参
* close: np.ndarray
* time_period: int=10
* 出参
* rocr_array: np.ndarray
**rocp**:变动率百分比
* 入参
* close: np.ndarray
* time_period: int=10
* 出参
* rocp_array: np.ndarray
**trix**:三次平滑EMA的一天变化率
* 入参
* close: np.ndarray
* time_period: int=30
* 出参
* trix_array: np.ndarray
**stddev**:标准偏差
* 入参
* close: np.ndarray
* time_period: int=5
* nbdev: float=1
* 出参
* stddev_array: np.ndarray
**std**:标准偏差
* 入参
* close: np.ndarray
* time_period: int=5
* nbdev: float=1
* 出参
* std_array: np.ndarray
**obv**:能量潮
* 入参
* close: np.ndarray
* volume: np.ndarray
* 出参
* obv_array: np.ndarray
**cci**:顺势指标
* 入参
* high: np.ndarray
* low: np.ndarray
* close: np.ndarray
* time_period: int=14
* 出参
* cci_array: np.ndarray
**atr**:真实波动幅度均值
* 入参
* high: np.ndarray
* low: np.ndarray
* close: np.ndarray
* time_period: int=14
* 出参
* atr_array: np.ndarray
**natr**:归一化波动幅度均值
* 入参
* high: np.ndarray
* low: np.ndarray
* close: np.ndarray
* time_period: int=14
* 出参
* natr_array: np.ndarray
**rsi**:相对强弱指数
* 入参
* close: np.ndarray
* time_period: int=14
* 出参
* rsi_array: np.ndarray
**macd**:平均异同移动平均线
* 入参
* close: np.ndarray
* fast_period: int=12
* slow_period: int=26
* signal_period: int=9
* 出参
* macd_array: np.ndarray
* macdsignal_array: np.ndarray
* macdhist_array: np.ndarray
**adx**:平均趋向指数
* 入参
* high: np.ndarray
* low: np.ndarray
* close: np.ndarray
* time_period: int=14
* 出参
* adx_array: np.ndarray
**adxr**:平均趋向指数的趋向指数
* 入参
* high: np.ndarray
* low: np.ndarray
* close: np.ndarray
* time_period: int=14
* 出参
* adxr_array: np.ndarray
**minus_di**:负趋向指标
* 入参
* high: np.ndarray
* low: np.ndarray
* close: np.ndarray
* time_period: int=14
* 出参
* minusdi_array: np.ndarray
**plus_di**:正趋向指标
* 入参
* high: np.ndarray
* low: np.ndarray
* close: np.ndarray
* time_period: int=14
* 出参
* plusdi_array: np.ndarray
**willr**:威廉指标
* 入参
* high: np.ndarray
* low: np.ndarray
* close: np.ndarray
* time_period: int=14
* 出参
* willr_array: np.ndarray
**ultosc**:终极波动指标
* 入参
* high: np.ndarray
* low: np.ndarray
* close: np.ndarray
* time_period: int=7
* time_period2: int=14
* time_period3: int=28
* 出参
* ultosc_array: np.ndarray
**trange**:真实波幅
* 入参
* high: np.ndarray
* low: np.ndarray
* close: np.ndarray
* 出参
* trange_array: np.ndarray
**aroon**:阿隆指标
* 入参
* high: np.ndarray
* low: np.ndarray
* time_period: int=14
* 出参
* aroonup_array: np.ndarray
* aroondown_array: np.ndarray
**aroonosc**:阿隆震荡
* 入参
* high: np.ndarray
* low: np.ndarray
* time_period: int=14
* 出参
* aroonosc_array: np.ndarray
**minus_dm**:负趋向变动值
* 入参
* high: np.ndarray
* low: np.ndarray
* time_period: int=14
* 出参
* minusdm_array: np.ndarray
**plus_dm**:正趋向变动值
* 入参
* high: np.ndarray
* low: np.ndarray
* time_period: int=14
* 出参
* plusdm_array: np.ndarray
**mfi**:资金流量指标
* 入参
* high: np.ndarray
* low: np.ndarray
* close: np.ndarray
* volume: np.ndarray
* time_period: int=14
* 出参
* mfi_array: np.ndarray
**ad**:平衡交易量指标
* 入参
* high: np.ndarray
* low: np.ndarray
* close: np.ndarray
* volume: np.ndarray
* 出参
* ad_array: np.ndarray
**adosc**:震荡指标
* 入参
* high: np.ndarray
* low: np.ndarray
* close: np.ndarray
* volume: np.ndarray
* fast_period: int=3
* slow_period: int=10
* 出参
* adosc_array: np.ndarray
**bop**:均势指标
* 入参
* open: np.ndarray
* high: np.ndarray
* low: np.ndarray
* close: np.ndarray
* 出参
* bop_array: np.ndarray
**stoch**:随机指标
* 入参
* high: np.ndarray
* low: np.ndarray
* close: np.ndarray
* fastk_period: int=5
* slowk_period: int=3
* slowk_matype: int=0
* slowd_period: int=3
* slowd_matype: int=0
* 出参
* slowk_array: np.ndarray
* slowd_array: np.ndarray
**boll**:布林通道
* 入参
* data: np.ndarray
* window: int
* dev: float
* 出参
* bollup_array: np.ndarray
* bolldown_array: np.ndarray
**keltner**:肯特纳通道
* 入参
* high: np.ndarray
* low: np.ndarray
* close: np.ndarray
* window: int
* dev: float
* 出参
* kkup_array: np.ndarray
* kkdown_array: np.ndarray
**donchian**:唐奇安通道
* 入参
* high: np.ndarray
* low: np.ndarray
* window: int
* 出参
* donchianup_array: np.ndarray
* donchiandown_array: np.ndarray
**cross_over**:上穿
* 入参
* data: np.ndarray
* level: float
若data上一个值小于等于level以及data最新值大于level,则返回True。
* 出参
* cross_over: bool
**cross_below**:下穿
* 入参
* data: np.ndarray
* level: float
* 出参
* cross_below: bool
若data上一个值大于等于level以及data最新值小于level,则返回True。
**check_increasing**:检查序列单调上升
* 入参
* data: np.ndarray
* 出参
* increasing: bool
**check_decreasing**:检查序列单调下降
* 入参
* data: np.ndarray
* 出参
* decreasing: bool
**resample_data**:对K线数据重新取样
* 入参
* df: pd.DataFrame
* rule: str
* 出参
* resampled_df: pd.DataFrame
* 示例
若想要测试resample_data函数的效果,可以在策略的on_history函数收到hm推送的时候先获取K线DataFrame,再调用resample_data函数对K线数据重新取样,如下所示:
```python3
# 判断实盘trading状态,只有策略启动之后才进行输出
df: pd.DataFrame = hm.to_dataframe()
resampled_df: pd.DataFrame = resample_data(df, "5min")
```
+762
View File
@@ -0,0 +1,762 @@
# 期权策略交易
OptionStrategy是用于**期权策略交易**的功能模块,用户可以通过其UI界面操作来便捷完成策略初始化、策略启动、策略停止、策略参数编辑以及策略移除等任务。
## 主要优势
OptionStrategy模块针对复杂期权策略,提供了ContractManager组件用于获取合约信息数据、按照交易日逐日加载当日的全量合约数据进行回放并提供了用于多层期权数据映射缓存的数据结构。
## 启动模块
OptionStrategy模块需要启动之前通过【策略应用】标签页加载。
启动登录VeighNa Elite Trader后,启动模块之前,请先连接交易接口。看到VeighNa Elite Trader主界面【日志】栏输出“合约信息查询成功”之后再启动模块。
请注意,IB接口因为登录时无法自动获取所有的合约信息,只有在用户手动订阅行情时才能获取。因此需要在主界面上先行手动订阅合约行情,再启动模块。
成功连接交易接口后,在菜单栏中点击【功能】-> 【期权策略交易】,或者点击左侧按钮栏的图标:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/optionstrategy/1.png)
即可进入期权策略交易模块的UI界面。
如果配置了数据服务,打开多进程组合策略模块时会自动执行数据服务登录初始化。若成功登录,则会输出“数据服务初始化成功”的日志,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/optionstrategy/2.png)
## 策略文件目录
<span id="jump">
对于用户自行开发的策略,需要放到VeighNa Elite Trader运行时目录下的**strategies**目录中,才能被识别加载。具体的运行时目录路径,可以在VeighNa Elite Trader主界面顶部的标题栏查看。
对于在Windows上默认安装的用户来说,放置策略的strategies目录路径通常为:
```
C:\Users\Administrator\strategies
```
其中Administrator为当前登录Windows的系统用户名。
</span>
## 创建策略实例
用户可以基于编写好的组合策略模板(类)来创建不同的策略实例(对象)。
在左上角的下拉框中选择要交易的策略名称,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/optionstrategy/3.png)
请注意,显示的策略名称是**策略类**(驼峰式命名)的名字,而不是策略文件(下划线模式命名)的名字。
选择好策略类之后,点击【添加策略】,会弹出添加策略对话框,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/optionstrategy/4.png)
在创建策略实例时,需要配置相关参数,各参数要求如下:
- 实例名称
- 实例名称不能重名;
- 参数设置
- 显示的参数名称是策略中使用Parameter辅助类定义的参数,如下所示:
- 期权产品代码(一定要是实盘交易系统中可以查到的合约上的期权产品名称)
- 委托超价比例
- 默认数值为策略中的参数的默认值;
- 由上图可观察到,参数名后面<>括号中显示的是该参数的数据类型,在填写参数时应遵循相应的数据类型。其中,<class 'str'>是字符串、<class 'int'>是整数、<class 'float'>是浮点数;
- 请注意,如果某个参数可能会调整至有小数位的数值,而默认参数值是整数(比如1)。请在编写策略时,把默认参数值设为浮点数(比如1.0)。否则策略会默认该项参数为整数,在后续【编辑】策略实例参数时,会只允许填进整数。
参数配置完成后,点击【添加】按钮,则开始创建策略实例。创建成功后可在左侧的策略监控组件中看到该策略实例,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/optionstrategy/5.png)
策略监控组件顶部显示的是策略实例名、策略类名以及策略作者名(在策略里定义的author)。顶部按钮用于控制和管理策略实例,第一行表格显示了策略内部的参数信息(参数名需要在策略中使用Parameter辅助类定义,图形界面才会显示),第二行表格则显示了策略运行过程中的变量信息(变量名需要在策略中使用Variables辅助类定义,图形界面才会显示)。【inited】字段表示当前策略的初始化状态(是否已经完成了历史数据回放),【trading】字段表示策略当前是否能够开始交易。
从上图可观察到,此时该策略实例的【inited】和【trading】状态都为【False】。说明该策略实例还没有初始化,也还不能发出交易信号。
策略实例创建成功后,该策略实例的配置信息会被保存到.vntrader文件夹下的option_strategy_setting.json文件中。
## 初始化策略
策略实例创建成功后,就可以对该实例进行初始化了。点击该策略实例下的【初始化】按钮,若初始化成功,则如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/optionstrategy/6.png)
初始化完成后,可观察到此时该策略实例的【inited】状态已经为【True】。说明该策略实例已经完成初始化了。【trading】状态还是为【False】,说明此时该策略实例还不能开始自动交易。
## 启动策略
策略实例初始化成功,【inited】状态为【True】时,才能启动该策略的自动交易功能。点击该策略实例下的【启动】按钮,即可启动该策略实例。成功后如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/optionstrategy/7.png)
可观察到此时该策略实例的【inited】和【trading】状态都为【True】。说明此时该策略实例已经完成了初始化函数中指定合约的行情订阅,而且此时策略内部的交易请求类函数(buy/sell/short/cover/cancel_order等),以及信息输出类函数(send_email/put_event等),才会真正执行并发出对应的请求指令到底层接口中(真正执行交易)。
在上一步策略初始化的过程中,尽管策略同样在接收(历史)数据(若初始化函数中调用了load_bars函数),并调用对应的功能函数,但因为【trading】状态为【False】,所以并不会有任何真正的委托下单操作或者交易相关的日志信息输出。
如果启动之后,策略发出了委托,可以去VeighNa Elite Trader主界面【委托】栏查看委托订单细节。
## 停止策略
如果启动策略之后,由于某些情况(如到了市场收盘时间,或盘中遇到紧急情况)想要停止、编辑或者移除策略,可以点击策略实例下的【停止】按钮,即可停止该策略实例的自动交易。成功后如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/optionstrategy/8.png)
期权策略引擎会自动将该策略之前发出的所有活动委托全部撤销,以保证在策略停止后不会有失去控制的委托存在。同时该策略实例最新的变量信息会被保存到.vntrader文件夹下的option_strategy_data.json文件中。
此时可观察到该策略实例的【trading】状态已变为【False】,说明此时该策略实例已经停止自动交易了。
在期权策略的实盘交易过程中,正常情况应该让策略在整个交易时段中都自动运行,尽量不要有额外的暂停重启类操作。对于国内期货市场来说,应该在交易时段开始前,启动策略的自动交易,然后直到收盘后,再关闭自动交易。因为现在CTP夜盘收盘后也会关闭系统,早上开盘前重启,所以夜盘收盘后也需要停止策略,关闭VeighNa Elite Trader了。
## 编辑策略
如果创建策略实例之后,想要编辑某个策略实例的参数(若已启动策略,需要先点击策略实例下的【停止】按钮,停止策略),可以点击该策略实例下的【编辑】按钮,会弹出参数编辑对话框,以供修改策略参数。如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/optionstrategy/9.png)
编辑完策略参数之后,点击下方的【确定】按钮,相应的修改会立即更新在参数表格中,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/optionstrategy/10.png)
但是策略实例的交易合约代码无法修改,同时修改完后也不会重新执行初始化操作。也请注意,此时修改的只是.vntrader文件夹下option_strategy_setting.json文件中该策略实例的参数值,并没有修改原策略文件下的参数。
若盘中编辑后想要再次启动策略,点击策略实例下的【启动】按钮即可再次启动该策略实例,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/optionstrategy/11.png)
## 移除策略
如果创建策略实例之后,想要移除某个策略实例(若已启动策略,需要先点击策略实例下的【停止】按钮,停止策略),可以点击该策略实例下的【移除】按钮。移除成功后,图形界面左侧的策略监控组件中将不会再显示该策略实例的信息,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/optionstrategy/12.png)
此时.vntrader文件夹下的option_strategy_setting.json文件也移除了该策略实例的配置信息。
## 状态跟踪
如果想要通过图形界面跟踪策略的状态,有两种方式:
1. 调用put_event函数
策略实例中所有的的变量信息,都需要把变量名写在策略的variables列表中,才能在图形界面显示。如果想跟踪变量的状态变化,则需要在策略中调用put_event函数,界面上才会进行数据刷新。
有时用户会发现自己写的策略无论跑多久,变量信息都不发生变化,这种情况请检查策略中是否漏掉了对put_event函数的调用。
2. 调用write_log函数
如果不仅想观察到变量信息的状态变化,还想根据策略的状态输出基于自己需求的个性化的日志,可以在策略中调用write_log函数,进行日志输出。
## 运行日志
### 日志内容
期权策略策略模块UI界面上输出的日志有两个来源,分别是策略引擎和策略实例。
**引擎日志**
策略引擎一般输出的是全局信息。下图中除了策略实例名后加冒号的内容之外,都是策略引擎输出的日志。
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/optionstrategy/13.png)
**策略日志**
如果在策略中调用了write_log函数,那么日志内容就会通过策略日志输出。下图红框里的内容是策略实例输出的策略日志。冒号前是策略实例的名称,冒号后是write_log函数输出的内容。
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/optionstrategy/14.png)
### 清空操作
如果想要清空期权策略UI界面上的日志输出,可以点击右上角的【清空日志】按钮,则可一键清空该界面上已输出的日志。
点击【清空日志】前,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/optionstrategy/12.png)
点击【清空日志】后,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/optionstrategy/15.png)
## 批量操作
在策略经过充分测试,实盘运行较为稳定,不需要经常进行调整的情况下,如果有多个需要运行的组合策略实例,可以使用界面右上角的【全部初始化】、【全部启动】和【全部停止】功能来执行盘前批量初始化、启动策略实例以及盘后批量停止策略实例的操作。
## 期权策略模板
期权策略模板提供了信号生成和委托管理功能,用户可以基于该模板自行开发期权策略。
用户自行开发的策略可以放在用户运行文件夹下的[strategies](#jump)文件夹内。
请注意:
- 策略文件命名采用下划线模式,如io_strategy.py,而策略类命名采用驼峰式,如IoStrategy。
- 自建策略的类名不要与示例策略的类名重合。如果重合了,图形界面上只会显示一个策略类名。
### StrategyTemplate
VeighNa Elite Trader的期权策略交易模块提供了StrategyTemplate专业期权策略模板,以实现复杂的期权策略开发。
### 策略引擎调用的函数
StrategyTemplate中的update_setting函数和该函数后面三个以get开头的函数(get_parameters、get_variables和get_data)以及update_trade和update_order函数,都是策略引擎去负责调用的函数,一般在策略编写的时候是不需要调用的。
### 策略的回调函数
StrategyTemplate中以on开头的函数称为回调函数,在编写策略的过程中能够用来接收数据或者接收状态更新。回调函数的作用是当某一个事件发生的时候,策略里的这类函数会被期权策略引擎自动调用(无需在策略中主动操作)。回调函数按其功能可分为以下两类:
#### 策略实例状态控制(所有策略都需要)
**on_init**
* 入参:无
* 出参:无
初始化策略时on_init函数会被调用,默认写法是先调用write_log函数输出“策略初始化”日志,再调用subcribe_options函数订阅期权行情(如有需要还可调用subscribe_data函数订阅标的物行情)。
如有需要进行全局缓存的变量,可以在on_init函数中对缓存容器进行定义。
若需读取历史数据进行指标计算,也可调用load_bars函数加载历史数据并进行推送。
策略初始化时,策略的inited和trading状态都为【False】,不能发出交易信号。调用完on_init函数之后,策略的inited状态才变为【True】,策略初始化才完成。
**on_start**
* 入参:无
* 出参:无
启动策略时on_start函数会被调用,默认写法是调用write_log函数输出“策略启动”日志。
调用策略的on_start函数启动策略后,策略的trading状态变为【True】,此时策略才能够发出交易信号。
**on_stop**
* 入参:无
* 出参:无
停止策略时on_stop函数会被调用,默认写法是调用write_log函数输出“策略停止”日志。
调用策略的on_stop函数停止策略后,策略的trading状态变为【False】,此时策略就不会发出交易信号了。
#### 接收数据、计算指标、发出交易信号
**on_tick**
* 入参:tick: TickData
* 出参:无
当策略收到实盘中最新的tick数据的行情推送时,on_tick函数会被调用。默认写法是先决定策略的执行频率(可通过tick的datetime判断过滤),再定时将缓存的tick价格数据推送进封装的策略执行函数中,最后将新收到的tick数据缓存至数据缓存容器中。
请注意,on_tick函数只在实盘中会被调用,回测不支持。
**on_bars**
* 入参:bars: Dict[str, BarData]
* 出参:无
当策略回测过程中收到最新的K线数据时,on_bars函数就会被调用。默认写法是将收到的K线价格数据推送进封装的策略执行函数中。
请注意,on_bars函数只在回测中会被调用,实盘不支持。
期权策略模块在接收K线推送时,是通过on_bars回调函数一次性接收该时间点上所有合约的K线数据,而不是通过on_bar函数一个个接收。
#### 委托状态更新
因为期权策略中需要对多合约同时下单交易,在回测时无法判断某一段K线内部每个合约委托成交的先后时间顺序,因此无法提供on_order和on_trade函数来获取委托成交推送,而只能在回调时通过get_pos来进行状态查询。
### 主动函数
**buy**:买入开仓(DirectionLONGOffsetOPEN
**sell**:卖出平仓(DirectionSHORTOffsetCLOSE
**short**:卖出开仓(DirectionSHORTOffsetOPEN
**cover**:买入平仓(DirectionLONGOffsetCLOSE
* 入参:vt_symbol: str, price: float, volume: float
* 出参:vt_orderids: List[str] / 无
buy/sell/short/cover都是策略内部的负责发单的交易请求类函数。策略可以通过这些函数给策略引擎发送交易信号来达到下单的目的。
以下方buy函数的代码为例,可以看到,**具体要交易合约的代码**,价格和数量是必填的参数,锁仓转换和净仓转换则默认为False。也可以看到,函数内部收到传进来的参数之后就调用了StrategyTemplate里的send_order函数来发单(因为是buy指令,则自动把方向填成了LONG,开平填成了OPEN)。
请注意,如果向上期所发出平仓委托,因为该交易所必须指定平今、平昨,底层会对其平仓指令自动进行转换。因为上期所部分品种有平今优惠,所以默认是以平今优先的方式发出委托的(如果交易的标的在上期所平昨更优惠的话,可以自行在vnpy.trader.converter的convert_order_request_shfe函数中做适当的修改)。
**send_order**
* 入参:vt_symbol: str, direction: Direction, offset: Offset, price: float, volume: float
* 出参:vt_orderids: List[str] / 无
send_order函数是策略引擎调用的发送委托的函数。一般在策略编写的时候不需要单独调用。
实盘的时候,收到传进来的参数后,会调用round_to函数基于合约的pricetick和min_volume对委托的价格和数量进行处理。
请注意,要在策略启动之后,也就是策略的trading状态变为【True】之后,才能发出交易委托。如果策略的Trading状态为【False】时调用了该函数,只会返回[]。
**cancel_order**
* 入参:vt_orderid: str
* 出参:无
**cancel_all**
* 入参:无
* 出参:无
cancel_order和cancel_all都是负责撤单的交易请求类函数。cancel_order是撤掉策略内指定的活动委托,cancel_all是撤掉策略所有的活动委托。一般在策略编写的时候不需要单独调用,调用execute_trading函数时会自动调用cancel_all函数批量取消发出的活动委托。
请注意,要在策略启动之后,也就是策略的trading状态变为【True】之后,才能撤单。
**get_porftfolio**
* 入参:portfolio_name: str
* 出参:portfolio: PortfolioData
在策略里调用get_porftfolio函数,可以获取特定期权产品的期权组合。
**subscribe_options**
* 入参:portfolio_name: str
* 出参:res: bool
在策略里调用subscribe_options函数,可以订阅特定期权产品的期权组合行情。
期权组合名称一定要是实盘交易系统中可以查到的合约上的期权产品名称(可以通过【合约查询】查看)。
标的对应期权产品名称示例:
ETF期权
"510050" - "510050_O"
"159919" - "159919_O"
股指期权
"IF" - "IO"
"IH" - "HO"
"IM" - "MO"
商品期权
"i" - "i_o"
"cu" - "cu_o"
"sc" - "sc_o"
"SR" - "SR"
若返回False,则说明底层没有获取到对应的期权合约信息。
**subscribe_data**
* 入参:vt_symbol: str
* 出参:res: bool
在策略里调用subscribe_data函数,可以订阅特定合约行情。
若返回False,则说明底层没有获取到对应的合约信息。
### 功能函数
以下为策略以外的功能函数:
**get_pos**
* 入参:vt_symbol: str
* 出参:int / 0
在策略里调用get_pos函数,可以获取特定合约的持仓数据。
**write_log**
* 入参:msg: str
* 出参:无
在策略中调用write_log函数,可以进行指定内容的日志输出。
**load_bars**
* 入参:vt_symbol: str, days: int, interval: Interval
* 出参:bars: List[BarData] / 无
在策略中调用load_bars函数,可以在策略类初始化时获取指定合约的K线数据。
load_bars函数在实盘调用时,会先依次尝试通过交易接口、数据服务、数据库获取历史数据,直到获取历史数据或返回空。
**put_event**
* 入参:无
* 出参:无
在策略中调用put_event函数,可以通知图形界面刷新策略状态相关显示。可在封装的策略执行函数中调用。
请注意,要策略初始化完成,inited状态变为【True】之后,才能刷新界面。
**send_email**
* 入参:msg: str
* 出参:无
配置好邮箱相关信息之后(配置方法详见基本使用篇的全局配置部分),在策略中调用send_email函数,可以发送指定内容的邮件到自己的邮箱。
请注意,要策略初始化完成,inited状态变为【True】之后,才能发送邮件。
**sync_data**
* 入参:无
* 出参:无
在策略中调用sync_data函数,可以在实盘的时候,每次停止或成交时都同步策略变量进json文件中进行本地缓存,方便第二天初始化时再进行读取还原(策略引擎会去调用,在策略里无需主动调用)。
请注意,要在策略启动之后,也就是策略的trading状态变为【True】之后,才能同步策略信息。
**save_data**
* 入参:file_name: str, data: dict
* 出参:无
在策略中调用save_data函数,可以保存策略数据到指定文件。
**load_data**
* 入参:file_name: str
* 出参:无
在策略中调用load_data函数,可以从指定文件中加载策略数据。
**get_today**
* 入参:无
* 出参:无
在策略中调用get_today函数,可以获取当前日期。
### 持仓目标调仓交易的功能函数介绍
以下为持仓目标调仓交易模式中策略调用的功能函数:
**set_target**
* 入参:vt_symbol: str, target: int
* 出参:无
在策略里调用set_target函数,可以设定特定合约的目标仓位。
请注意:目标仓位是一种持续性的状态,因此设置后在后续时间会持续保持下去,直到被再次设置修改。
**get_target**
* 入参:vt_symbol: str
* 出参:int
在策略里调用get_target函数,可以获取设定的特定合约目标仓位。
请注意:策略的目标仓位状态会在sync_data时(成交、停止等)自动持久化到硬盘文件,并在策略重启后恢复。
**clear_targets**
* 入参:无
* 出参:int
在策略里调用clear_targets函数,可以清除缓存的合约目标仓位。
**execute_trading**
* 入参:price_data: Dict[str, float], percent_add: float
* 出参:无
在策略里调用execute_trading函数,可以基于设定的特定合约的目标仓位执行调仓交易。
execute_trading是基于设定的目标仓位和超价百分比用来执行交易的函数。委托下单和撤单已经被该函数接管,无需再在策略内进行下单和撤单操作。
execute_trading被调用之后,在函数内部会先撤销策略所有活动委托,然后根据策略目标和策略持仓的仓差(没有则不委托)进行委托。
请注意:只有当前price_data中有切片的合约,才会参与本次调仓交易的执行,从而保证非交易时段(没有行情推送)的合约不会错误发出委托。
### 策略所需数据容器
#### OptionData(期权数据)
##### 属性
- vt_symbol: str(本地代码)
- contract: ContractData(合约信息)
- strike: float(行权价)
- price: float(最新价)
- pos: float(净持仓)
#### ChainData(期权链数据)
##### 属性
- symbol: str(标的物合约代码)
- exchenge: Exchange(交易所)
- expiry: datetime(期权到期日)
- strikes: List[float](期权行权价)
- calls: Dict[float, OptionData](看涨期权)
- puts: Dict[float, OptionData](看跌期权)
- atm_strikefloat (平值期权行权价)
##### 函数
- **add_contract**
* 入参:contract: ContractData
* 出参:option: OptionData
调用add_contract函数,可以将指定期权合约信息添加到期权链实例的calls、puts、strikes里。
一般只有PortfolioData调用add_contract函数时,ChainData的add_contract才会被调用。策略内无需调用该函数。
- **calculate_atm**
* 入参:underlying_price: float
* 出参:无
调用calculate_atm函数,可以对平值期权的行权价进行计算并更新ChainData的atm_strike属性(如没有传入标的,则使用合成期货计算。否则使用标的合约的价格进行计算)。
一般在策略里,封装的策略执行函数收到价格数据之后,会获取指定的portfolio,调用PortfolioData实例的update_price函数更新价格到期权组合。之后就可以调用指定ChainData实例的calculate_atm函数计算平值期权行权价了。
- **calculate_synthetic**
* 入参:无
* 出参:synthetic_price: float
在ChainData实例有了atm_strike之后,调用calculate_synthetic函数可以计算合成期货的价格。
- **get_option_by_level**
* 入参:cp: int, level: int
* 出参:option: OptionData
在ChainData实例有了atm_strike之后,调用get_option_by_level函数就可以基于平值期权在期权链上的位置根据传入的虚值程度查询期权了。
请注意:cp大于0是查询看涨期权,cp小于0是查询看跌期权。level是期权的虚值档位。
#### PortfolioData
##### 属性
- symbol: str(期权产品代码)
- exchenge: Exchange(交易所)
- chains: Dict[str, ChainData](期权链)
- chain_symbols: List[str](每条期权链上的合约代码)
- options: Dict[str, OptionData](期权)
- **add_contract**
* 入参:contract: ContractData
* 出参:无
调用add_contract函数,可以将指定期权合约信息添加到期权组合实例上期权链实例的calls、puts、strikes以及期权组合实例的options字典里。
- **get_chain_by_level**
* 入参:level: int
* 出参:chains: List[ChainData] / 无
调用get_chain_by_level函数,可以根据月份查询期权链。
level参数传0是查询当月期权链。
- **update_price**
* 入参:price_data: dict[str, float]
* 出参:无
调用update_price函数,可以更新收到的价格到指定的期权。
一般price_data的key会设置成合约的vt_symbol。
- **update_pos**
* 入参:pos_data: dict[str, int]
* 出参:无
调用update_price函数,可以更新策略的持仓数据到指定的期权。
一般pos_data的key会设置成合约的vt_symbol。
### 策略可用K线合成器
#### OptionBarGenerator - 期权策略K线截面合成器
OptionBarGenerator是一个专为期权策略设计的K线截面合成工具,用于将实时tick数据转换为1分钟K线数据截面。该工具支持多合约同时处理,能够高效地为期权策略提供所需的K线数据。
##### 功能特点
- 多合约支持:同时处理多个合约的tick数据,生成对应的K线数据
- 时间戳监控:可指定特定合约作为时间戳监控合约,控制K线生成的节奏
- 交易时段过滤(只支持期货和期货期权):基于配置的品种和时段自动过滤非交易时段的数据,确保K线质量
- 实时更新:随着tick数据的推送实时更新K线信息
##### 使用方法
```python
from elite_optionstrategy.utility import OptionBarGenerator
class MyOptionStrategy(StrategyTemplate):
def __init__(self, strategy_engine, strategy_name, vt_symbols, setting):
super().__init__(strategy_engine, strategy_name, vt_symbols, setting)
# 创建K线生成器实例
# 可选指定时间戳监控合约
self.bg = OptionBarGenerator(self.on_bars, dt_symbol="xxx")
def on_tick(self, tick: TickData):
"""tick数据更新"""
# 更新K线生成器
self.bg.update_tick(tick)
# 其他tick数据处理逻辑
def on_bars(self, bars: dict[str, BarData]):
"""K线截面数据更新"""
# 处理K线截面数据
for vt_symbol, bar in bars_dict.items():
print(f"{vt_symbol} - 高:{bar.high_price} 开:{bar.open_price} 低:{bar.low_price} 收:{bar.close_price}")
# 策略信号计算和交易逻辑
```
参数说明
- on_bars: 回调函数,当新的K线截面生成时被调用,接收包含多个合约K线的字典
- dt_symbol: 指定时间戳监控合约代码,用于控制K线生成的节奏(收到该合约下一分钟tick就合成所有合约上一分钟bar),留空则不指定
工作原理
OptionBarGenerator通过持续接收tick数据更新内部状态,当检测到分钟变化时,会生成当前分钟的K线截面并通过回调函数返回。如果指定了时间戳监控合约,则只有当该合约的时间戳发生分钟变化时,才会触发K线截面的生成。如果指定了时间戳监控合约并且配置了合约过滤信息(可参考[行情数据过滤文档](https://www.vnpy.com/docs/cn/elite/strategy/elite_filter.html)),则只有当该合约的时间戳发生分钟变化时且在有效交易时段内,才会触发K线截面的生成。
## 策略回测
期权策略交易模块的策略回测参考代码如下所示:
```
engine = BacktestingEngine()
engine.set_parameters(
interval=Interval.MINUTE,
start=datetime(2023, 1, 1),
end=datetime(2023, 11, 30),
rate=0,
slippage=0,
)
engine.add_strategy(IoStrategy, {})
engine.run_backtesting()
engine.calculate_result()
engine.calculate_statistics()
engine.show_chart()
```
- **set_parameters**
* 入参:interval: Interval, start: datetime, end: datetime, rate: float, slippage: float, capital: int = 1_000_000, cache: str = "", memory: bool = False
* 出参:无
调用set_parameters函数,可以设置BacktestingEngine实例的回测外部参数。
- **add_strategy**
* 入参:strategy_class: Type[StrategyTemplate], setting: dict
* 出参:无
调用add_strategy函数,可以添加期权策略实例和策略设置到BacktestingEngine实例上。
- **run_backtesting**
* 入参:disable_tqdm: bool= False
* 出参:无
调用run_backtesting函数,可以逐日执行回测任务。
调用run_backtesting函数时,BacktestingEngine实例会按照交易日逐日加载当日的全量合约数据进行回放,并模拟实盘情况,每日对策略对象实例进行重新初始化。
- 日内回测过程:先获取昨天收盘的策略仓位和价格数据,再更新数据到每日统计结果中。然后新建策略实例,还原策略仓位并执行策略初始化。此时可根据订阅情况加载历史数据(策略订阅的所有合约),然后执行策略启动和数据回放(处理委托撮合和历史数据推送)。回放完之后执行策略停止,获取收盘策略仓位并更新收盘数据到统计结果中。
- **calculate_result**
* 入参:无
* 出参:无
调用calculate_result函数,可以计算策略实例的逐日盯市盈亏。
- **calculate_statistics**
* 入参:df: DataFrame = None, output: bool = True
* 出参:无
调用calculate_statistics函数,可以基于策略实例的逐日盯市盈亏计算并输出策略实例的统计指标。
- **show_chart**
* 入参:df: DataFrame = None
* 出参:无
调用show_chart函数,可以基于策略实例的回测结果进行图表显示。
### 期权回测数据缓存
为了加快期权策略的回测和优化速度,回测引擎支持数据文件缓存功能:在调用set_parameters函数时,传入回测任务缓存名称参数cache(str类型),即可在首次回测时自动创建数据缓存,并加快后续每次的回测速度。
- **list_cache**
* 入参:无
* 出参:list
调用list_cache函数,可以返回回测数据缓存列表。
- **remove_cache**
* 入参:cache: str
* 出参:list
调用remove_cache函数,可以删除指定缓存数据。
@@ -0,0 +1,244 @@
# 投组截面策略
PortfolioStrategy是用于**多进程组合策略实盘**的功能模块,用户可以通过其UI界面操作来便捷完成策略初始化、策略启动、策略停止、策略参数编辑以及策略移除等任务。
## 主要优势
PortfolioStrategy模块充分利用了多核CPU,支持多进程组合策略交易。
## 启动模块
PortfolioStrategy模块需要启动之前通过【策略应用】标签页加载。
启动登录VeighNa Elite Trader后,启动模块之前,请先连接交易接口。看到VeighNa Elite Trader主界面【日志】栏输出“合约信息查询成功”之后再启动模块。
请注意,IB接口因为登录时无法自动获取所有的合约信息,只有在用户手动订阅行情时才能获取。因此需要在主界面上先行手动订阅合约行情,再启动模块。
成功连接交易接口后,在菜单栏中点击【功能】-> 【多进程组合策略交易】,或者点击左侧按钮栏的图标:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/portfoliostrategy/1.png)
即可进入多进程组合策略交易模块的UI界面。
如果配置了数据服务,打开多进程组合策略模块时会自动执行数据服务登录初始化。若成功登录,则会输出“数据服务初始化成功”的日志,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/portfoliostrategy/2.png)
## 策略文件目录
<span id="jump">
对于用户自行开发的策略,需要放到VeighNa Elite Trader运行时目录下的**strategies**目录中,才能被识别加载。具体的运行时目录路径,可以在VeighNa Elite Trader主界面顶部的标题栏查看。
对于在Windows上默认安装的用户来说,放置策略的strategies目录路径通常为:
```
C:\Users\Administrator\strategies
```
其中Administrator为当前登录Windows的系统用户名。
</span>
## 创建策略实例
用户可以基于编写好的组合策略模板(类)来创建不同的策略实例(对象)。
在左上角的下拉框中选择要交易的策略名称,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/portfoliostrategy/3.png)
请注意,显示的策略名称是**策略类**(驼峰式命名)的名字,而不是策略文件(下划线模式命名)的名字。
选择好策略类之后,点击【添加策略】,会弹出添加策略对话框,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/portfoliostrategy/4.png)
在创建策略实例时,需要配置相关参数,各参数要求如下:
- 实例名称
- 实例名称不能重名;
- 合约品种
- 格式为vt_symbol(合约代码 + 交易所名称);
- 一定要是实盘交易系统中可以查到的合约名称;
- 合约名用“,”隔开,中间不加空格;
- 接口名称
- 选择需要交易的接口名称;
- 参数设置
- 显示的参数名是策略里写在parameters列表中的参数名;
- 默认数值为策略中的参数的默认值;
- 由上图可观察到,参数名后面<>括号中显示的是该参数的数据类型,在填写参数时应遵循相应的数据类型。其中,<class 'str'>是字符串、<class 'int'>是整数、<class 'float'>是浮点数;
- 请注意,如果某个参数可能会调整至有小数位的数值,而默认参数值是整数(比如1)。请在编写策略时,把默认参数值设为浮点数(比如1.0)。否则策略会默认该项参数为整数,在后续【编辑】策略实例参数时,会只允许填进整数。
参数配置完成后,点击【添加】按钮,则开始创建策略实例。创建成功后可在左侧的策略监控组件中看到该策略实例。因为每个策略都是独立进程,所以添加成功后图形界面会输出“策略进程启动”的日志,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/portfoliostrategy/5.png)
策略监控组件顶部显示的是策略实例名、接口名、策略类名以及策略作者名(在策略里定义的author)。顶部按钮用于控制和管理策略实例,第一行表格显示了策略内部的参数信息(参数名需要写在策略的parameters列表中图形界面才会显示),第二行表格则显示了策略运行过程中的变量信息(变量名需要写在策略的variables列表中图形界面才会显示)。【inited】字段表示当前策略的初始化状态(是否已经完成了历史数据回放),【trading】字段表示策略当前是否能够开始交易。
从上图可观察到,此时该策略实例的【inited】和【trading】状态都为【False】。说明该策略实例还没有初始化,也还不能发出交易信号。
策略实例创建成功后,该策略实例的配置信息会被保存到.vntrader文件夹下的portfolio_strategy_setting.json文件中。
## 初始化策略
策略实例创建成功后,就可以对该实例进行初始化了。点击该策略实例下的【初始化】按钮,若初始化成功,则如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/portfoliostrategy/6.png)
初始化完成后,可观察到此时该策略实例的【inited】状态已经为【True】。说明该策略实例已经加载过历史数据并完成初始化了。【trading】状态还是为【False】,说明此时该策略实例还不能开始自动交易。
## 启动策略
策略实例初始化成功,【inited】状态为【True】时,才能启动该策略的自动交易功能。点击该策略实例下的【启动】按钮,即可启动该策略实例。成功后如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/portfoliostrategy/7.png)
可观察到此时该策略实例的【inited】和【trading】状态都为【True】。说明此时该策略实例已经完成了历史数据回放,而且此时策略内部的交易请求类函数(buy/sell/short/cover/cancel_order等),以及信息输出类函数(send_email/put_event等),才会真正执行并发出对应的请求指令到底层接口中(真正执行交易)。
在上一步策略初始化的过程中,尽管策略同样在接收(历史)数据,并调用对应的功能函数,但因为【trading】状态为【False】,所以并不会有任何真正的委托下单操作或者交易相关的日志信息输出。
如果启动之后,策略发出了委托,可以去VeighNa Trader主界面【委托】栏查看委托订单细节。
请注意,与CTA策略模块不同,多合约组合策略**不提供本地停止单功能**,所以UI界面上不会有停止单的显示区域了。
## 停止策略
如果启动策略之后,由于某些情况(如到了市场收盘时间,或盘中遇到紧急情况)想要停止、编辑或者移除策略,可以点击策略实例下的【停止】按钮,即可停止该策略实例的自动交易。成功后如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/portfoliostrategy/8.png)
组合策略引擎会自动将该策略之前发出的所有活动委托全部撤销,以保证在策略停止后不会有失去控制的委托存在。同时该策略实例最新的变量信息会被保存到.vntrader文件夹下的portfolio_strategy_data.json文件中。
此时可观察到该策略实例的【trading】状态已变为【False】,说明此时该策略实例已经停止自动交易了。
在多合约组合策略的实盘交易过程中,正常情况应该让策略在整个交易时段中都自动运行,尽量不要有额外的暂停重启类操作。对于国内期货市场来说,应该在交易时段开始前,启动策略的自动交易,然后直到收盘后,再关闭自动交易。因为现在CTP夜盘收盘后也会关闭系统,早上开盘前重启,所以夜盘收盘后也需要停止策略,关闭VeighNa Trader了。
## 编辑策略
如果创建策略实例之后,想要编辑某个策略实例的参数(若已启动策略,需要先点击策略实例下的【停止】按钮,停止策略),可以点击该策略实例下的【编辑】按钮,会弹出参数编辑对话框,以供修改策略参数。如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/portfoliostrategy/9.png)
编辑完策略参数之后,点击下方的【确定】按钮,相应的修改会立即更新在参数表格中,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/portfoliostrategy/10.png)
但是策略实例的交易合约代码无法修改,同时修改完后也不会重新执行初始化操作。也请注意,此时修改的只是.vntrader文件夹下porfolio_strategy_setting.json文件中该策略实例的参数值,并没有修改原策略文件下的参数。
若盘中编辑后想要再次启动策略,点击策略实例下的【启动】按钮即可再次启动该策略实例,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/portfoliostrategy/11.png)
## 移除策略
如果创建策略实例之后,想要移除某个策略实例(若已启动策略,需要先点击策略实例下的【停止】按钮,停止策略),可以点击该策略实例下的【移除】按钮。移除成功后,图形界面左侧的策略监控组件中将不会再显示该策略实例的信息。因为每个策略都是独立进程,所以移除成功后图形界面会输出“策略进程退出”的日志,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/portfoliostrategy/12.png)
此时.vntrader文件夹下的portfolio_strategy_setting.json文件也移除了该策略实例的配置信息。
## 状态跟踪
如果想要通过图形界面跟踪策略的状态,有两种方式:
1. 调用put_event函数
策略实例中所有的的变量信息,都需要把变量名写在策略的variables列表中,才能在图形界面显示。如果想跟踪变量的状态变化,则需要在策略中调用put_event函数,界面上才会进行数据刷新。
有时用户会发现自己写的策略无论跑多久,变量信息都不发生变化,这种情况请检查策略中是否漏掉了对put_event函数的调用。
2. 调用write_log函数
如果不仅想观察到变量信息的状态变化,还想根据策略的状态输出基于自己需求的个性化的日志,可以在策略中调用write_log函数,进行日志输出。
## 运行日志
### 日志内容
多合约组合策略模块UI界面上输出的日志有两个来源,分别是策略引擎和策略实例。
**引擎日志**
策略引擎一般输出的是全局信息。下图中除了策略实例名后加冒号的内容之外,都是策略引擎输出的日志。
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/portfoliostrategy/13.png)
**策略日志**
如果在策略中调用了write_log函数,那么日志内容就会通过策略日志输出。下图红框里的内容是策略实例输出的策略日志。冒号前是策略实例的名称,冒号后是write_log函数输出的内容。
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/portfoliostrategy/14.png)
### 清空操作
如果想要清空多合约组合策略UI界面上的日志输出,可以点击右上角的【清空日志】按钮,则可一键清空该界面上已输出的日志。
点击【清空日志】前,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/portfoliostrategy/12.png)
点击【清空日志】后,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/portfoliostrategy/15.png)
## 批量操作
在策略经过充分测试,实盘运行较为稳定,不需要经常进行调整的情况下,如果有多个需要运行的组合策略实例,可以使用界面右上角的【全部初始化】、【全部启动】和【全部停止】功能来执行盘前批量初始化、启动策略实例以及盘后批量停止策略实例的操作。
## 多账户支持
### 加载
多进程组合策略模块提供了多账户批量下单交易支持。
以登录**CTP**接口为例,在登录界面下方的【交易接口】标签页的下拉框中先选中CTP接口。在“自定义接口”处填写自定义的接口名(例如“CTP1”、“CTP2”)之后点击【添加】按钮,填写子账户的配置信息,点击【确定】按钮,则可依次加载对应账户的接口。
添加完毕后,点击登录界面的【登录】按钮登录VeighNa Elite Trader。在菜单栏中依次点击【系统】->【连接xxx】(xxx是自定义的接口名,若加载时填写的“CTP1”,则菜单栏中显示的就是【连接CTP1】),即可连接子账户接口。
连接成功以后,VeighNa Elite Trader主界面【日志】组件会立刻输出登录相关信息,同时用户也可以看到对应的账号信息,持仓信息等相关信息。
### 多进程组合策略模块批量下单
若需通过多进程组合策略模块进行批量委托,可在多进程组合策略模块图形界面【添加策略】时点击【gateway_name】的下拉框选中接口进行指定,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/portfoliostrategy/16.png)
策略添加成功后,可以在左侧的策略监控组件中看到策略实例的信息,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/portfoliostrategy/17.png)
策略实例发出委托后,可在VeighNa Elite Trader主界面【委托】组件和【成交】组件上跟踪到根据对应接口下单的委托,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/portfoliostrategy/18.png)
**请注意**
- 目前支持同时登录最多登录5个交易账户
## 多合约组合策略模板
多合约组合策略模板提供了信号生成和委托管理功能,用户可以基于该模板自行开发多合约组合策略。
用户自行开发的策略可以放在用户运行文件夹下的[strategies](#jump)文件夹内。
请注意:
- 策略文件命名采用下划线模式,如portfolio_boll_channel_strategy.py,而策略类命名采用驼峰式,如PortfolioBollChannelStrategy。
- 自建策略的类名不要与示例策略的类名重合。如果重合了,图形界面上只会显示一个策略类名。
### StrategyTemplate
VeighNa Elite Trader对vnpy_portfoliostrategy自带的StrategyTemplate提供支持,通过StrategyTemplate开发的策略可在VeighNa Elite Trader的多合约组合策略模块上成功运行。
+129
View File
@@ -0,0 +1,129 @@
# 事前交易风控
RiskManager模块是用于**事前交易风控**的功能模块,用户可以通过其配置json文件操作来便捷完成风控任务。
## 主要优势
RiskManager模块提供包括标准化的风控规则开发模板,支持用户按需开发各种自定义风控规则。
内置常用风控规则包括:
* BlackListRule: 黑名单规则
* WhiteListRule: 白名单规则
* OrderLimitRule: 委托数量和金额限制规则
* SelfTradeRule: 自成交限制规则
* RiskLevelRule: 账户风险度限制规则
* OrderFlowRule: 委托流量限制规则
* PriceRangeRule: 价格偏离度规则
* PosLimitRule: 持仓上限规则
* TradeValueRule: 日内开仓限制规则
## 启动模块
RiskManager模块需要启动之前通过【策略应用】标签页加载。
启动登录VeighNa Elite Trader后,启动模块之前,请先连接交易接口。看到VeighNa Elite Trader主界面【日志】栏输出“合约信息查询成功”之后再启动模块。
请注意,IB接口因为登录时无法自动获取所有的合约信息,只有在用户手动订阅行情时才能获取。因此需要在主界面上先行手动订阅合约行情,再启动模块。
成功连接交易接口后,在菜单栏中点击【功能】-> 【风控引擎】,或者点击左侧按钮栏的图标:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/riskmanager/1.png)
即可进入风控引擎模块的UI界面,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/riskmanager/2.png)
## 配置风控
事前风控模块负责在委托通过交易API接口发出前,检查其状态是否符合各种风控规则。
用户可通过编辑.vntrader文件夹下的risk_engine_setting.json配置风控规则,如下图所示(仅示例):
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/riskmanager/3.png)
**请注意,风控规则配置的时候,对应规则的“active”要设置为true才会启用规则,设置为false是不会启用的。**
成功配置风控规则之后,启动VeighNa Elite Trader并加载风控引擎模块即可在发出委托之前检查每一笔发出的委托是否符合风控要求。若委托被风控引擎拦截,VeighNa Elite Trader主界面的【日志】栏会输出相应日志,风控引擎的UI界面也会输出日志,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/riskmanager/4.png)
## 风控规则介绍
### BlackListRule: 黑名单规则
- black_list[list[str]] 黑名单
启用之后,在黑名单列表内的vt_symbol委托会被拦截。
### WhiteListRule: 白名单规则
- white_list[list[str]] 白名单
启用之后,不在白名单列表内的vt_symbol委托会被拦截。
### OrderLimitRule: 委托数量和金额限制规则
- order_cancel_limit[int] 日内撤单次数上限
- order_volume_limit[int] 单笔委托数量上限
- order_value_limit[float] 单笔委托金额上限
启用之后,找不到对应vt_symbol合约信息的委托会被拦截,日内撤单次数超过配置上限,单笔委托数量超过配置上限以及单笔委托金额超过配置上限的委托都会被拦截。
### SelfTradeRule: 自成交限制规则
启用之后,委托方向与未成交委托相反且委托价格超过未成交委托价格的委托(以多头为例,新委托方向为多,未成交方向为空,且新委托价格大于等于未成交空方向委托价格)会被拦截。
### RiskLevelRule: 账户风险度限制规则
- risk_level_limit[float] 保证金风险度上限(只支持单账户)
启用之后,接口获取不到账户当前资金时发出的委托会被拦截,账户冻结资金/账户余额小于配置的保证金风险度上限时发出的委托也会被拦截。
### PriceRangeRule: 价格偏离度规则
- price_range_limit[float] 价格偏离度
启用之后,没有获取到对应vt_symbol实时行情的委托会被拦截,委托价格超过合约涨跌停价或者委托价格超过价格上下限的委托都会被拦截。
请注意,价格上下限是基于合约最新价 * (1 +/- price_range_limit)然后取min/max再基于合约价格跳动进行调整的。
### PosLimitRule: 持仓上限规则
- contract_setting[dict]
- vt_symbol(key)
- setting(value)
- long_pos_limit[int] 多头仓位限制
- short_pos_limit[int] 空头仓位限制
- net_pos_limit[int] 净仓位限制
- total_pos_limit[int] 总仓位限制
- oi_percent_limit[float] 日内成交净额限制
启用之后,没有获取到对应vt_symbol实时行情的委托会被拦截,委托合约多仓总数量、空仓总数量、净仓总数量、总仓总数量以及持仓集中度超限的委托会被拦截。
请注意,持仓集中度超限认定是委托合约的总仓位超过了委托合约的持仓量(tick.open_interest)与配置的该合约日内成交净额限制的乘积。
### TradeValueRule: 日内开仓限制规则
- contract_setting[dict]
- vt_symbol(key)
- setting(value)
- trade_value_limit[int] 日内成交敞口变化上限
启用之后,发出委托与缓存的该合约日内成交敞口累加超过配置的变化上限就会被拦截。
请注意,缓存配置合约的每一笔委托成交敞口都是基于委托价格、委托数量以及合约乘数的乘积计算的。
### OrderFlowRule: 委托流量限制规则
- order_flow_interval[int] 委托流控时间窗口
- order_flow_limit[int] 委托流控给定时间窗口内最多允许发出的委托笔数
- total_order_limit[int] 日内总委托笔数上限
启用之后,发出委托笔数在配置的流控时间窗口内超过配置的最多允许委托笔数就会被拦截,发出委托笔数超过配置的当日总委托笔数上限也会被拦截。
请注意,日内总委托笔数取决于主引擎查到的所有委托的长度。
+907
View File
@@ -0,0 +1,907 @@
# 价差套利策略
SpreadTrading是用于**多合约价差套利**的功能模块,用户可以通过其UI界面操作来便捷创建灵活的价差合约、完成半自动算法交易和全自动策略交易等任务。
## 主要优势
SpreadTrading模块不仅提供了Taker、Maker以及Exchange三种价差执行算法支持,并提供了专业价差策略模板EliteSpreadStrategyTemplate,以实现更加强大的价差策略开发。
## 启动模块
SpreadTrading模块需要启动之前通过【策略应用】标签页加载。
启动登录VeighNa Elite Trader后,启动模块之前,请先连接交易接口。看到VeighNa Elite Trader主界面【日志】栏输出“合约信息查询成功”之后再启动模块(**如果在合约信息查询成功之前打开模块,可能会导致价差的价格跳动取值为零,进而在委托成交之后引发底层报错**)。
请注意,IB接口因为登录时无法自动获取所有的合约信息,只有在用户手动订阅行情时才能获取。因此需要在主界面上先行手动订阅合约行情,再启动模块。
成功连接交易接口后,在菜单栏中点击【功能】-> 【套利价差交易】,或者点击左侧按钮栏的图标:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/spreadtrading/1.png)
即可进入套利价差交易模块的UI界面。如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/spreadtrading/2.png)
## 策略文件目录
<span id="jump">
对于用户自行开发的策略,需要放到VeighNa Elite Trader运行时目录下的**strategies**目录中,才能被识别加载。具体的运行时目录路径,可以在VeighNa Elite Trader主界面顶部的标题栏查看。
对于在Windows上默认安装的用户来说,放置策略的strategies目录路径通常为:
```
C:\Users\Administrator\strategies
```
其中Administrator为当前登录Windows的系统用户名。
</span>
## 创建价差合约
### 查询合约
在创建价差合约前,用户可以通过【查询合约】功能,寻找可以组成价差的合约(**不支持交易所套利合约**):
- 在VeighNa Elite Trader菜单栏中点击【帮助】-> 【查询合约】按钮,弹出合约查询界面,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/spreadtrading/3.png)
- 在界面中找到可用于组成价差交易的合约;
- 本文档以豆油期货的跨期套利来展示,即交易y2309.DCE(豆油期货23年9月到期合约)和y2401.DCE(豆油期货24年1月到期合约)。
### 构建价差合约
在价差交易的界面左侧,点击【价差创建】按钮,弹出创建价差界面,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/spreadtrading/4.png)
价差交易模块支持灵活的价差计算公式(例如A/B、A-B*C等),同时允许引入不参与交易的定价腿,满足复杂境内外套利价差需要考虑汇率和税率等因素的需求。在创建价差合约时,需要配置相关参数,各参数要求如下:
- 价差名称
- 用户定义的价差合约名称;
- 价差名称不能重名;
- 主动腿代码
- 价差盘口价格满足条件时,先发出的那条腿的本地代码。
- 格式为vt_symbol(合约代码 + 交易所名称);
- 必须是下面的腿选项中的一项;
- 最小交易量
- 最小交易手数;
- 价格公式
- 价差合约的计算公式;
- 支持任何Python内置数学函数;
- 注意其中的变量只能是A、B、C、D、E(不需要都用);
- 【A、B、C、D、E】
- 包含构建价差合约的主动腿与被动腿,也可以引入不参与交易的定价腿,由合约代码、交易方向、交易乘数组成:
- 合约代码为公式中的变量所对应的合约本地代码(vt_symbol);
- 一般来说,价差交易原则上是主动腿完成交易后,立刻用被动腿进行对冲,故主动腿一般选择较为不活跃的合约,价格乘数和交易乘数均为正;被动腿一般选择较为活跃的合约,价格乘数和交易乘数均为负(图形界面选择【卖出】,交易乘数填写正数;jupyter回测两者皆传负数);
- 不用的变量留空即可;
设置好价差合约的参数后,点击下方的【创建价差】按钮,即可成功创建价差合约。
在豆油期货跨期套利示例中,其价格乘数和交易乘数均为1:1,即价差 = y2401 - y2309;买入1手价差等于买入1手y2401,同时卖出1手y2309完成对冲。
请注意,在多条腿并且期货合约规模不等时,构建价差合约会相对困难一些,如构建虚拟钢厂套利所用到的价差合约时,计算公式如下:
- 螺纹钢生产技艺是16吨铁矿石加上5吨焦炭练成10吨螺纹钢。
- 基于价格乘数的价差spread = 1* RB - 1.6\*I - 0.5\*J。
- 但是由于螺纹是10吨/手,铁矿石和焦炭都是100吨/手,所以他们交易乘数是1:10:10;
- 故基于最大公约数规则,其实际交易手数关系是每买入100手螺纹钢(1000吨),需要卖出16手铁矿石(1600吨)和5手焦炭(500吨)完成对冲。
### 监控价差合约
价差合约创建完毕,监控界面中的【日志】栏会输出“价差创建成功”;【价差】栏也会展示价差合约的实时行情,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/spreadtrading/5.png)
在豆油期货价差交易示例中,【价差】组件的各字段含义如下所示:
- 买价
- y2401买一价 - y2309卖一价
- 买量
- min(y2401买一量, y2309卖一量)
- 取最小值用于保证各合约能均能成交
- 卖价
- y2401卖一价 - y2309买一价
- 卖量
- min(y2401卖一量, y2309买一量)
### 移除价差合约
在价差交易的界面左侧,点击【移除价差】按钮,弹出移除价差界面,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/spreadtrading/6.png)
选择好要移除的价差合约之后,点击【移除】按钮,即可成功移除价差合约。【日志】组件输出“价差移除成功”,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/spreadtrading/7.png)
## 半自动算法交易
用户可以通过模块界面左上角【交易】组件选择算法(目前支持[三种算法](#jump1))进行半自动算法交易,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/spreadtrading/10.png)
填写参数时请注意:
- 开平:只有启动Exchange算法在【开仓】和【平仓】中选择,其他大多数用时候选择【净仓】,股指合约用【锁仓】
下面通过2个SpreadTakerAlgo(主动对价成交算法)的例子,分别是发出委托立即成交和发出委托等待成交来介绍手动交易的操作情况:
### 启动算法立即成交(超价)
目标价差合约价格为-70,以-60的价位启动做多算法(超价),算法会立即发出委托并成交,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/spreadtrading/11.png)
### 启动算法等待成交(限价)
以-80的价位启动做多算法,由于当前买价卖价分别位于-76和-72,所以委托状态显示【未成交】,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/spreadtrading/12.png)
### 停止运行中的算法
鼠标双击需要停止算法的单元格,即可结束该算法。此时【日志】组件输出“算法已停止”,【算法】组件显示委托状态由【未成交】变成【已撤销】,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/spreadtrading/13.png)
## 全自动策略交易
### 添加策略
用户可以基于编写好的价差策略模板(类)来创建不同的策略实例(对象)。
在左侧的下拉框中选择要交易的策略名称(如MeanReversionStrategy),如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/spreadtrading/14.png)
请注意,显示的策略名称是**策略类**(驼峰式命名)的名字,而不是策略文件(下划线模式命名)的名字。
选择好策略类之后,点击【添加策略】,会弹出添加策略对话框,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/spreadtrading/15.png)
在创建策略实例时,需要配置相关参数,各参数要求如下:
- 实例名称
- 用户自定义的策略实例名称;
- 策略实例名称不能重名;
- 价差名称
- 用于交易的价差合约;
- 一定要是价差组件可以查询到的价差合约;
- 参数设置
- 显示的参数名称是在策略中使用Parameter辅助类定义的参数;
- 默认数值为策略里的参数的默认值;
- 由上图可观察到,参数名后面<>括号中显示的是该参数的数据类型,在填写参数时应遵循相应的数据类型。其中,<class 'str'>是字符串、<class 'int'>是整数、<class 'float'>是浮点数;
- 请注意,如果某个参数可能会调整至有小数位的数值,而默认参数值是整数(比如1)。请在编写策略时,把默认参数值设为浮点数(比如1.0)。否则策略会默认该项参数为整数,在后续【编辑】策略实例参数时,会只允许填进整数。
- 以MeanReversionStrategy为例,该策略的参数设置如下:
- ma_window(均线窗口)
- entry_range(入场范围)
- fixed_volume(固定交易数量)
- payup(各条腿委托时,基于对价盘口的加点)
- interval(限价单多少秒不成交,则撤销重挂)
参数配置完成后,点击【添加】按钮,则开始创建策略实例。创建成功后可在右下角的策略监控组件中看到该策略实例,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/spreadtrading/16.png)
策略监控组件顶部显示的是策略实例名、价差名、策略类名以及策略作者名(在策略里定义的author)。顶部按钮用于控制和管理策略实例,第一行表格显示了策略内部的参数信息(参数名需要写在策略的parameters列表中图形界面才会显示),第二行表格则显示了策略运行过程中的变量信息(变量名需要写在策略的variables列表中图形界面才会显示)。【inited】字段表示当前策略的初始化状态(是否已经完成了历史数据回放),【trading】字段表示策略当前是否能够开始交易。
从上图可观察到,此时该策略实例的【inited】和【trading】状态都为【False】。说明该策略实例还没有初始化,也还不能发出交易信号。
策略实例创建成功后,该策略实例的配置信息会被保存到.vntrader文件夹下的spread_trading_strategy.json文件中。
### 管理策略
#### 初始化
策略实例创建成功后,就可以对该实例进行初始化了。点击该策略实例下的【初始化】按钮,若初始化成功,则如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/spreadtrading/17.png)
可观察到此时该策略实例的【inited】状态已经为【True】。说明该策略实例已经调用过load_bar函数加载历史数据并完成初始化了。【trading】状态还是为【False】,说明此时该策略实例还不能开始自动交易。
#### 启动
策略实例初始化成功,【inited】状态为【True】时,才能启动该策略的自动交易功能。点击该策略实例下的【启动】按钮,即可启动该策略实例。成功启动后,【日志】组件则会输出相应信息(请注意,策略启动并不代表算法启动,算法启动状态取决于策略逻辑),如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/spreadtrading/24.png)
【策略】组件中【trading】字段从【False】变为【True】,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/spreadtrading/18.png)
#### 停止
若要停止策略,点击策略实例下的【停止】按钮,即可停止该策略实例的自动交易。【日志】组件输出“策略停止”,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/spreadtrading/25.png)
【策略】组件中【trading】字段从【True】变为【False】,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/spreadtrading/19.png)
- 停止策略时,策略引擎会先停止策略启动的所有算法,撤销所有未成交委托,然后再停止策略实例的自动交易。若停止策略时仍有未停止的算法,可以在【日志】组件观察到“算法已停止”的输出,【算法】组件中对应算法状态也会变为【已撤销】。
#### 编辑
如果创建策略实例之后,想要编辑某个策略实例的参数(若已启动策略,需要先点击策略实例下的【停止】按钮,停止策略),可以点击该策略实例下的【编辑】按钮,会弹出参数编辑对话框,以供修改策略参数,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/spreadtrading/20.png)
编辑完策略参数之后,点击下方的【确定】按钮,相应的修改会立即更新在参数表格中,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/spreadtrading/21.png)
但是策略实例的交易合约代码无法修改,同时修改完后也不会重新执行初始化操作。也请注意,此时修改的只是.vntrader文件夹下spread_trading_strategy.json文件中该策略实例的参数值,并没有修改原策略文件下的参数。
若盘中编辑后想要再次启动策略,点击策略实例下的【启动】按钮即可再次启动该策略实例,如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/spreadtrading/22.png)
#### 移除
如果创建策略实例之后,想要移除某个策略实例(若已启动策略,需要先点击策略实例下的【停止】按钮,停止策略),可以点击该策略实例下的【移除】按钮。移除成功后,图形界面右下角的策略监控组件中将不会再显示该策略实例的信息。如下图所示:
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/elite/spreadtrading/23.png)
此时.vntrader文件夹下的spread_trading_strategy.json文件也移除了该策略实例的配置信息。
### 批量操作
在策略经过充分测试,实盘运行较为稳定,不需要经常进行调整的情况下,如果有多个需要运行的价差策略实例,可以使用界面左下角的【全部初始化】、【全部启动】和【全部停止】功能来执行盘前批量初始化、启动策略实例以及盘后批量停止策略实例的操作。
## 价差交易策略模板
价差交易策略模板提供了信号生成和委托管理功能,用户可以基于模板自行开发策略。
用户自行开发的策略可以放在用户运行文件夹下的[strategies](#jump)文件夹内。
请注意:
- 策略文件命名采用下划线模式,如mean_reversion_strategy.py,而策略类命名采用驼峰式,如MeanReversionStrategy。
- 自建策略的类名不要与示例策略的类名重合,否则会出现策略类互相覆盖的错误情况。
### EliteSpreadStrategyTemplate
VeighNa Elite Trader的价差套利模块提供了EliteSpreadStrategyTemplate专业价差套利策略模板,实现更强大的价差策略开发。
下面通过MeanReversionStrategy策略示例,来展示策略开发的具体步骤:
在基于EliteSpreadStrategyTemplate编写策略逻辑之前,需要在策略文件的顶部载入需要用到的内部组件,如下方代码所示:
```python3
from vnpy.trader.utility import BarGenerator, ArrayManager
from elite_spreadtrading import (
SpreadStrategyTemplate,
SpreadAlgoTemplate,
AlgoType,
AlgoOffset,
Variable,
Parameter,
SpreadData,
OrderData,
TradeData,
TickData,
BarData
)
```
其中:
* SpreadStrategyTemplate是Veighna Elite Trader提供的价差交易策略模板
* SpreadAlgoTemplate是价差算法模板
* AlgoType和AlgoOffset是用来配置算法交易模式的算法类型和算法开平选项
* Parameter是储存策略参数的数据容器
* Variable是储存策略变量的数据容器
* SpreadData、OrderData、TickData、TradeData和BarData是储存对应信息的数据容器
* BarGenerator是K线生成模块
* ArrayManager是K线时间序列管理模块。
### 策略参数与变量
在策略类的下方,可以设置策略的作者(author),参数(parameters)以及变量(variables),如下方代码所示:
```python3
author = "用Python的交易员"
ma_window: int = Parameter(60)
entry_range: int = Parameter(20)
fixed_volume: int = Parameter(10)
payup: int = Parameter(10)
interval: int = Parameter(5)
spread_pos: float = Variable(0.0)
ma_value: float = Variable(0.0)
```
虽然策略的参数和变量都从属于策略类,但策略参数是固定的(由交易员从外部指定),而策略变量则在交易的过程中随着策略的状态变化,所以策略变量一开始只需要初始化为对应的基础类型。例如:整数设为0,浮点数设为0.0。
如果需要价差套利交易模块引擎在运行过程中,将策略参数和变量显示在UI界面上,并在数据刷新、停止策略时保存其数值,则需在创建策略类的时候创建对应的参数和变量实例。
请注意:
- Parameter容器和Variable容器只能接受参数或变量以str、int、float和bool四种数据类型传入。
### 策略的回调函数
SpreadStrategyTemplate中以on开头的函数称为回调函数,在编写策略的过程中能够用来接收价差行情或者接收状态更新。回调函数的作用是当某一个事件发生的时候,策略里的这类函数会被价差交易策略引擎自动调用(无需在策略中主动操作)。回调函数按其功能可分为以下三类:
#### 策略实例状态控制(所有策略都需要)
**on_init**
* 入参:无
* 出参:无
初始化策略时on_init函数会被调用,在此处通常会实现的功能逻辑包括:
1. 实例化K线数据合成组件(BarGenerator):通过时间切片将Tick数据合成1分钟K线数据。如有需求,还可合成更长的时间周期数据。
2. 实例化K线时间序列缓存组件(ArrayManager):基于K线数据将其转化为便于向量化计算的时间序列数据结构,并在内部支持使用talib库来计算相应的技术指标。
- ArrayManager的默认长度为100,如需调整ArrayManager的长度,可传入size参数进行调整(size不能小于计算指标的周期长度)。
3. 对价差算法交易模式进行配置:
- AlgoType
| 枚举值 | 值
| ------ | --------
| TAKER | "taker" |
| MAKER | "maker" |
| EXCHANGE | "exchange" |
- AlgoOffset
| 枚举值 | 值
| ------ | --------
| LOCK | "锁仓" |
| NET | "净仓" |
| OPEN | "开仓" |
| CLOSE | "平仓" |
完成上述组件初始化后,再调用load_bar函数加载历史数据,如下方代码所示:
```python3
def on_init(self):
"""
Callback when strategy is inited.
"""
self.bg = BarGenerator(self.on_spread_bar)
self.am = ArrayManager(self.ma_window + 10)
# 价差算法交易模式配置
self.algo_type: AlgoType = AlgoType.TAKER
self.algo_offset: AlgoOffset = AlgoOffset.NET
self.write_log("策略初始化")
self.load_bar(10)
```
请注意,如果是基于Tick数据回测,请在此处调用load_tick函数。
策略初始化时,策略的inited和trading状态都为【False】,此时只是调用ArrayManager计算并缓存相关的计算指标,不能发出交易信号。调用完on_init函数之后,策略的inited状态才变为【True】,策略初始化才完成。
**on_start**
* 入参:无
* 出参:无
启动策略时on_start函数会被调用,默认写法是调用write_log函数输出“策略启动”日志,如下方代码所示:
```python3
def on_start(self):
"""
Callback when strategy is started.
"""
self.write_log("策略启动")
```
调用策略的on_start函数启动策略后,策略的trading状态变为【True】,此时策略才能够启动价差交易算法。
**on_stop**
* 入参:无
* 出参:无
停止策略时on_stop函数会被调用,默认写法是调用write_log函数输出“策略停止”日志,如下方代码所示:
```python3
def on_stop(self):
"""
Callback when strategy is stopped.
"""
self.write_log("策略停止")
self.put_event()
```
调用策略的on_stop函数停止策略后,策略的trading状态变为【False】,此时策略就不再允许启动价差交易算法了。
#### 接收数据、计算指标、发出交易信号
**on_spread_data**
* 入参:无
* 出参:无
当价差数据更新的时候on_spread_data函数会被调用(因本次示例策略类MeanReversionStrategy不是基于on_spread_data交易,故不作示例讲解)。MeanReversionStrategy的写法是先调用get_spread_tick获取价差Tick数据,然后推进on_spread_tick函数中,如下方代码所示:
```python3
def on_spread_data(self):
"""
Callback when spread price is updated.
"""
tick = self.get_spread_tick()
self.on_spread_tick(tick)
```
**on_spread_tick**
* 入参:tick: TickData
* 出参:无
on_spread_tick函数通常由用户在on_spread_data下发起调用,通常的用法是通过BarGenerator的update_tick函数把收到的Tick数据推进前面创建的bg实例中以便合成1分钟的K线,如下方代码所示:
```python3
def on_spread_tick(self, tick: TickData):
"""
Callback when new spread tick data is generated.
"""
self.bg.update_tick(tick)
```
**on_spread_bar**
* 入参:bar: BarData
* 出参:无
当BarGenerator完成1分钟K线合成时(实盘时默认推进来的是基于Tick合成的一分钟的K线,回测时则取决于选择参数时填入的K线数据频率),on_spread_bar函数就会被调用。
如果策略基于on_spread_bar推进来的K线交易,那么请把交易请求类函数都写在on_spread_bar函数下。示例策略类MeanReversionStrategy是通过1分钟K线数据回报来生成CTA信号的。一共有三部分,如下方代码所示:
```python3
def on_spread_bar(self, bar: BarData):
"""
Callback when spread bar data is generated.
"""
self.stop_all_algos()
self.am.update_bar(bar)
if not self.am.inited:
return
self.ma_value = self.am.sma(self.ma_window)
if not self.spread_pos:
if bar.close_price >= self.ma_value + self.entry_range:
self.start_short_algo(
bar.close_price - 10,
self.fixed_volume,
payup=self.payup,
interval=self.interval,
algo_type=self.algo_type,
algo_offset=self.algo_offset
)
elif bar.close_price <= self.ma_value - self.entry_range:
self.start_long_algo(
bar.close_price + 10,
self.fixed_volume,
payup=self.payup,
interval=self.interval,
algo_type=self.algo_type,
algo_offset=self.algo_offset
)
elif self.spread_pos < 0:
if bar.close_price <= self.ma_value:
self.start_long_algo(
bar.close_price + 10,
abs(self.spread_pos),
payup=self.payup,
interval=self.interval,
algo_type=self.algo_type,
algo_offset=self.algo_offset
)
else:
if bar.close_price >= self.ma_value:
self.start_short_algo(
bar.close_price - 10,
abs(self.spread_pos),
payup=self.payup,
interval=self.interval,
algo_type=self.algo_type,
algo_offset=self.algo_offset
)
self.put_event()
```
- 清空未成交委托:为了防止之前下的单子在上1分钟没有成交,但是下1分钟可能已经调整了价格,就用stop_all_algos()方法立刻撤销之前未成交的所有委托,保证策略在当前这1分钟开始时的整个状态是清晰和唯一的;
- 计算策略信号指标:基于最新的1分钟价差K线数据来计算相应的技术指标,如均线等。首先获取ArrayManager对象,然后将收到的K线推送进去,检查ArrayManager的初始化状态,如果还没初始化成功就直接返回,没有必要去进行后续的交易相关的逻辑判断。因为很多技术指标计算对最少K线数量有要求,如果数量不够的话计算出来的指标会出现错误或无意义。反之,如果没有return,就可以开始计算技术指标了;
- 启动价差执行算法:通过持仓的判断以及结合均线指标挂出委托,同时设置离场点。
请注意:
1. 启动算法时,如果不传algo_type和algo_offset,则分别默认为“taker”和“净仓”;
2. 启动Maker算法时,不要忘记传入active_quote_range和active_max_volume参数;
3. 只有启动Exchange算法时,algoOffset才在AlgoOffset.OPEN和AlgoOffset.CLOSE中选择;
4. 如果需要在图形界面刷新显示的策略状态数值,请不要忘记调用put_event()函数。
#### 委托状态更新
以下函数在策略中几乎都可以直接pass,其具体逻辑应用交给回测/实盘引擎负责。
**on_spread_pos**
* 入参:无
* 出参:无
收到持有仓位更新时on_spread_pos函数会被调用。与CTA策略模块访问策略逻辑持仓不同,价差交易模块访问的是账户底层持仓。所以默认写法是通过调用get_spread_pos函数获取价差持仓,以供策略进行逻辑判断,如下方代码所示:
```python3
def on_spread_pos(self):
"""
Callback when spread position is updated.
"""
self.spread_pos = self.get_spread_pos()
self.put_event()
```
**on_spread_algo**
* 入参:algo: SpreadAlgoTemplate
* 出参:无
收到算法状态更新时on_spread_algo函数会被调用。
**on_order**
* 入参:order: OrderData
* 出参:无
收到策略委托回报时on_order函数会被调用(只有通过策略发出委托才能收到该函数回调,通过策略启动算法进行委托收不到该函数回调)。
**on_trade**
* 入参:trade: TradeData
* 出参:无
收到策略成交回报时on_trade函数会被调用(只有通过策略发出委托才能收到该函数回调,通过策略启动算法进行委托收不到该函数回调)。
### 主动函数
**start_long_algo**
* 入参:price: float, volume: float, payup: int = None, interval: int = None, algo_type: AlgoType = AlgoType.TAKER, algo_offset: AlgoOffset = AlgoOffset.NET, active_quote_range: int = None, active_max_volume: int = None
* 出参:algoid: str
**start_short_algo**
* 入参:price: float, volume: float, payup: int = None, interval: int = None, algo_type: AlgoType = AlgoType.TAKER, algo_offset: AlgoOffset = AlgoOffset.NET, active_quote_range: int = None, active_max_volume: int = None
* 出参:algoid: str
与CTA策略模块不同,价差交易的示例策略都是通过调用star_long_algo/start_short_algo函数(针对价差组合)而不是buy/sell/short/cover函数(针对单一合约)来发出委托的。在价差交易模块中,算法负责价差交易的执行,策略负责价差算法的调度。价差算法将价差交易简化为了普通委托,封装掉了所有主动腿下单和被动腿对冲的细节。
以下方star_long_algo函数的代码为例,可以看到,价格和数量是必填的参数,超价的数值、时间间隔、算法类型、算法开平、maker挂单范围阈值、maker单笔委托量最大值等参数都是选填。也可以看到,函数内部收到传进来的参数之后就调用了SpreadStrategyTemplate里的start_algo函数来发单(因为是long指令,则自动把方向填成了LONG)
```python3
def start_long_algo(
self,
price: float,
volume: float,
payup: int = None,
interval: int = None,
algo_type: AlgoType = AlgoType.TAKER,
algo_offset: AlgoOffset = AlgoOffset.NET,
active_quote_range: int = None,
active_max_volume: int = None
) -> str:
""""""
return self.start_algo(
Direction.LONG,
price,
volume,
payup,
interval,
algo_type,
algo_offset,
active_quote_range,
active_max_volume
)
```
**start_algo**
* 入参:direction: Direction, price: float, volume: float, payup: int = None, interval: int = None, algo_type: AlgoType = AlgoType.TAKER, algo_offset: AlgoOffset = AlgoOffset.NET, active_quote_range: int = None, active_max_volume: int = None
* 出参:algoid: str
start_algo函数是价差策略引擎调用的启动新的价差交易算法的函数。一般在策略编写的时候不需要单独调用,通过start_long_algo/start_short_algo函数发送委托即可。
请注意:
1. 要在策略启动之后,也就是策略的trading状态变为【True】之后,才能发出交易委托。如果策略的Trading状态为【False】时调用了该函数,只会返回"";
2. 若启动算法时少传参或传错参,算法会启动失败并输出相关日志信息。
**stop_algo**
* 入参:algoid: str
* 出参:无
**stop_all_algos**
* 入参:无
* 出参:无
stop_algo和stop_all_algos都是负责停止价差算法的交易请求类函数。stop_algo是停止策略内指定的价差算法,stop_all_algos是停止策略所有的活动价差算法。
请注意,要在策略启动之后,也就是策略的trading状态变为【True】之后,才能撤单。
**buy**:买入开仓(DirectionLONGOffsetOPEN
**sell**:卖出平仓(DirectionSHORTOffsetCLOSE
**short**:卖出开仓(DirectionSHORTOffsetOPEN
**cover**:买入平仓(DirectionLONGOffsetCLOSE
* 入参:vt_symbol: str, price: float, volume: float, lock: bool = False
* 出参:vt_orderids: List[vt_orderid] / 无
buy/sell/short/cover都是策略内部的负责针对特定的单一合约发出底层交易委托的请求类函数。策略可以通过这些函数给价差策略引擎发送交易信号来达到下单的目的。
以下方buy函数的代码为例,可以看到,本地代码、价格和数量是必填的参数,锁仓转换则默认为False。也可以看到,函数内部收到传进来的参数之后就调用了SpreadStrategyTemplate里的send_order函数来发单(因为是buy指令,则自动把方向填成了LONG,开平填成了OPEN)
如果lock设置为True,那么该笔订单则会进行锁仓委托转换(在有今仓的情况下,如果想平仓,则会先平掉所有的昨仓,然后剩下的部分都进行反向开仓来代替平今仓,以避免平今的手续费惩罚)。
```python3
def buy(self, vt_symbol: str, price: float, volume: float, lock: bool = False) -> List[str]:
""""""
return self.send_order(vt_symbol, price, volume, Direction.LONG, Offset.OPEN, lock)
```
**send_order**
* 入参:vt_symbol: str, price: float, volume: float, direction: Direction, offset: Offset, lock: bool = False
* 出参:vt_orderids / []
send_order函数是价差策略引擎调用的针对特定合约(**而不是价差**)发送委托的函数。一般在策略编写的时候不需要单独调用,通过buy/sell/short/cover函数发送委托即可。
请注意,要在策略启动之后,也就是策略的trading状态变为【True】之后,才能发出交易委托。如果策略的Trading状态为【False】时调用了该函数,只会返回[]。
**cancel_order**
* 入参:vt_orderid: str
* 出参:无
**cancel_all**
* 入参:无
* 出参:无
cancel_order和cancel_all都是负责撤单的交易请求类函数。cancel_order是撤掉策略内指定的活动委托,cancel_all是撤掉策略所有的活动委托。
请注意,要在策略启动之后,也就是策略的trading状态变为【True】之后,才能撤单。
### 功能函数
以下为委托交易以外的功能函数:
**put_event**
* 入参:无
* 出参:无
在策略中调用put_event函数,可以通知图形界面刷新策略状态相关显示。
请注意,要策略初始化完成,inited状态变为【True】之后,才能刷新界面。
**write_log**
* 入参:msg: str
* 出参:无
在策略中调用write_log函数,可以进行指定内容的日志输出。
**get_engine_type**
* 入参:无
* 出参:engine_type: EngineType
在策略里调用get_engine_type函数,可以获取策略引擎类型。
**get_spread_tick**
* 入参:无
* 出参:tick: TickData
在策略里调用get_spread_tick函数,可以获取价差Tick数据。
**get_spread_pos**
* 入参:无
* 出参:spread_pos: float
在策略里调用get_spread_pos函数,可以获取价差净持仓数据。
**get_leg_tick**
* 入参:vt_symbol: str
* 出参:leg.tick: TickData / None
在策略里调用get_leg_tick函数,可以获取特定合约的Tick数据。
**get_leg_pos**
* 入参:vt_symbol: str, direction: Direction = Direction.NET
* 出参:leg.net_pos: float / leg.long_pos: float /leg.short_pos: float / None
在策略里调用get_leg_pos函数,可以获取特定合约的持仓数据,用于处理瘸腿后的细粒度调整。
**send_email**
* 入参:msg: str
* 出参:无
配置好邮箱相关信息之后(配置方法详见基本使用篇的全局配置部分),在策略中调用send_email函数,可以发送指定内容的邮件到自己的邮箱。
请注意,要策略初始化完成,inited状态变为【True】之后,才能发送邮件。
**load_bar**
* 入参:days: int, interval: Interval = Interval.MINUTE, callback: Callable = None
* 出参:无
在策略中调用load_bar函数,可以在策略初始化时加载价差K线数据。
如下方代码所示,load_bar函数调用时,默认加载的天数是10,频率是一分钟,对应也就是加载10天的1分钟K线数据,建议加载的天数宁可多一些也不要太少。加载时会先依次尝试通过交易接口、数据服务、数据库获取历史数据,直到获取历史数据或返回空。
请注意,回测期内每条腿的K线数据(1分钟最佳),若有某条腿缺失一段,则所有腿的这一段数据都会被弃用。
```python3
def load_bar(
self,
days: int,
interval: Interval = Interval.MINUTE,
callback: Callable = None,
):
"""
Load historical bar data for initializing strategy.
"""
if not callback:
callback = self.on_spread_bar
self.strategy_engine.load_bar(self.spread, days, interval, callback)
```
**load_tick**
* 入参:days: int
* 出参:无
价差Tick数据来源:
首先需要在SpreadTrading模块中创建配置好价差后,通过DataRecorder模块来进行Tick录制,本地代码填入xx-spread.LOCAL,其中xx-spread为用户定义的价差名称,LOCAL为固定交易所后缀(代表本地生成)。
在策略中调用load_tick函数,可以在策略初始化时去数据库加载录制好的价差Tick盘口数据。
## 算法介绍
<span id="jump1">
价差套利模块都是通过价差算法来执行价差交易,从而将相对复杂的多条腿交易执行简化为面向价差组合的普通委托,封装掉所有主动腿下单和被动腿对冲的细节。
### 算法检查函数
- is_active:检查算法是否结束
- is_order_finished:检查委托是否全部结束
- is_hedge_finished:检查被动腿和主动腿是否匹配
- check_algo_cancelled:检查算法是否被停止
- calculate_traded_volume:计算已成交价差数量
- calculate_traded_price:计算已成交价差均价
### SpreadTakerAlgo(见价下单算法)
#### 算法原理
- 见价下单:主动腿以对价先行下单;被动腿以对价立即对冲
- 算法收到tick数据推送:先检查委托是否结束,再检查对冲是否结束,若未结束则发起被动腿对冲。最后检查盘口是否满足条件,满足条件后发出主动腿委托
- 算法收到委托回报:若收到主动腿已结束的委托,则发起被动腿对冲
- 超时限制:到达计时时间执行委托全撤
#### 算法优势
- 灵活且不占用过多撤单次数
#### 不足
- 所有腿均需要付出盘口买卖价差的滑点成本
- 等待主动腿对价满足条件,需要比Maker更长的时间
### SpreadMakerAlgo(报价做市算法)
#### 算法原理
- 报价做市:基于被动腿盘口,计算主动腿最差成交价
- 算法收到tick数据推送:先检查委托是否结束,再检查对冲是否结束,若未结束则发起被动腿对冲。然后检查新的挂单价格与当前已挂价格的差值是否超过设定的阈值,如果未超过则发出主动腿委托,如果超过则重挂
- 算法收到委托回报:遭遇拒单则停止策略;若收到主动腿已结束的委托,则清空挂单价格记录
- 算法收到成交回报:只关心主动腿委托,若对冲未结束则发起被动腿对冲
- 计时时间到达:到达计时时间执行委托全撤
#### 算法优势
- 主动腿报价挂单做市,目标是赚得盘口价差的同时提高成交概率
#### 不足
- 虽然有设定挂单阈值限制,但撤单行为比Taker更频繁,需要仔细监控委托流量费成本
### SpreadExchangeAlgo(交易所价差算法)
#### 算法原理
- 基于交易所提供的价差组合来创建价差,采用各条腿的行情盘口计算价差盘口,最终采用交易所的价差合约进行交易执行
- 算法收到tick数据推送:检查是否已发出了委托,若已发出则返回。再检查价差套利合约是否生成成功,并查询价差套利合约的合约信息,然后发出交易所价差委托,缓存委托号和价差关系,最后输出日志并记录委托已经发出的状态
#### 算法优势
- 体验上类似单合约,且免去了主动腿撤单
#### 不足
- 缺乏灵活性,可选择合约范围有限
</span>
+17
View File
@@ -0,0 +1,17 @@
量化策略
~~~~~~~~~
.. toctree::
:maxdepth: 2
elite_ctastrategy.md
elite_function.md
elite_filter.md
elite_portfoliostrategy.md
elite_spreadtrading.md
elite_optionstrategy.md
elite_algotrading.md
elite_riskmanager.md
elite_datamanager.md
+58
View File
@@ -0,0 +1,58 @@
# 智策配置
在使用 `智策` 之前,建议先完成基础配置。对大多数用户来说,最关键的准备工作包括两项:
- 打开 `AI服务配置`,确认可用服务与连接信息;
- 打开 `模型浏览器`,确认当前可选择的模型列表。
如果这两部分没有准备好,即使进入智策工作台,也可能无法顺利推进后续步骤。
## 打开AI服务配置
在 Fusion 主界面中点击 `【智策】->【AI服务配置】`,即可打开配置窗口。
该配置页面通常用于管理智策所依赖的 AI 服务连接信息。实际可见字段会根据当前接入方式有所不同,因此建议以界面实际内容和所属机构提供的说明为准。
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/fusion/34.png)
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/fusion/41.png)
完成配置后,建议再次检查输入内容是否准确,避免因为地址、密钥、网络或权限设置问题影响后续使用。
## 选择可用模型
完成服务配置后,可通过 `【智策】->【模型浏览器】` 查看当前可用模型。
模型浏览器的作用通常包括:
- 查看当前服务下可使用的模型;
- 了解模型名称与可选范围;
- 为后续新建智策任务时选择合适模型提供参考。
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/fusion/35.png)
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/fusion/33.png)
## 常见配置说明
在实际使用时,建议优先关注以下几个方面:
- 当前服务是否可正常访问;
- 当前账号是否具备对应模型的使用权限;
- 当前模型是否适合策略逻辑整理、代码生成和结果分析等任务;
- 当前网络环境是否满足在线调用要求。
若你面前有多个模型可选,但又不确定差异,建议先使用机构推荐的默认模型,等熟悉工作流后再尝试比较不同模型表现。
## 配置修改后的生效方式
当你在 `AI服务配置` 中修改并保存配置后,建议重新打开 `智策工作台`,再开始新的任务或继续后续流程。这样更有利于确保最新配置已经生效。
如修改配置后仍无法正常使用,建议按以下顺序排查:
1. 确认配置已成功保存;
2. 重新打开智策相关窗口;
3. 再次检查模型列表是否可见;
4. 如仍异常,再联系所属期货公司或技术支持协助处理。
完成配置后,可继续阅读 [智策工作流](fusion_agent_workflow.md)。
+69
View File
@@ -0,0 +1,69 @@
# 智策简介
`智策` 是 VeighNa Fusion 中面向策略研究与代码辅助的重点能力。它不是一个独立的交易接口,也不是“自动赚钱工具”,而是帮助用户把策略想法逐步整理为逻辑说明、策略代码、检查结果、回测结果和参数优化结论的一套辅助工作流。
## 智策是什么
在 Fusion 中,`智策` 可以理解为一个围绕策略研究展开的工作台。用户输入自己的策略想法后,系统会按步骤推进,帮助完成:
- 策略逻辑整理;
- 逻辑确认;
- 代码生成;
- 代码检查;
- 回测验证;
- 参数优化;
- 结果汇总与复核。
因此,智策更适合作为“研究助手”和“流程组织工具”来理解,而不是替代用户判断的自动决策系统。
## 适合哪些用户
智策尤其适合以下类型的用户:
- 已经有一定交易想法,但不确定如何清晰表达成策略逻辑的用户;
- 希望在图形界面中完成策略研究闭环,而不是完全手写代码和脚本的用户;
- 希望借助 AI 提升策略整理、代码草稿和结果分析效率的用户;
- 愿意对输出结果进行复核、回测和风控验证的用户。
如果你希望完全跳过理解过程,直接依赖 AI 输出进行实盘操作,那么这并不是智策的正确使用方式。
## 可以帮助完成哪些工作
智策能够帮助用户完成的典型工作包括:
- 把一句自然语言想法整理成更清晰的策略说明;
- 生成更容易评审的策略逻辑结构;
- 生成或修改 CTA 策略代码草稿;
- 对生成代码进行检查并给出反馈;
- 串联回测和参数优化步骤;
- 汇总研究过程中形成的主要结果。
这些能力可以显著降低“从想法到第一版可验证策略”的门槛,但并不会替代用户对策略有效性、合规性和风险的判断。
## 与传统策略开发方式的关系
智策并不是对传统策略开发方式的替代,而是对其进行辅助。更合适的理解方式是:
- 传统方式强调用户自行定义逻辑、编写代码、回测和优化;
- 智策在这些步骤之间提供结构化辅助;
- 最终是否采用某个逻辑、代码或参数,仍应由用户自己决定。
对于入门用户来说,建议把智策与 [CTA策略](../strategy/fusion_cta.md)、[回测与优化](../strategy/fusion_backtester.md) 结合起来使用,而不是把智策单独当作完整交易系统。
在投研过程中,【智策投研】可以负责执行量化策略研究任务,【智策助手】可以负责回答VeighNa、CTA策略开发和当前任务相关的问题。
## 从哪里开始
在 Fusion 主界面中,可通过 `【智策】` 菜单进入以下入口:
- `智策工作台`
- `AI服务配置`
- `模型浏览器`
首次使用时,建议先阅读 [智策配置](fusion_agent_config.md),再进入 [智策工作流](fusion_agent_workflow.md) 了解完整流程。
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/fusion/26.png)
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/fusion/36.png)
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/fusion/45.png)
+51
View File
@@ -0,0 +1,51 @@
# 智策使用须知
`智策` 能够显著提升策略研究和代码整理效率,但它始终属于辅助工具能力。无论是逻辑说明、策略代码、检查结果、回测结果还是参数优化结论,都不应被视为可以直接替代用户判断的最终答案。
## AI输出的局限性
在使用智策时,应当默认接受以下事实:
- AI 输出可能存在错误、遗漏、偏差或表达不完整;
- 同一个问题在不同时间、不同模型或不同配置下,结果可能并不完全一致;
- 即使文字描述看起来合理,也不代表对应代码一定可运行或适用于当前场景;
- 即使代码可以运行,也不代表逻辑正确、结果可靠或适合实盘。
因此,智策最适合用来“辅助研究与整理”,而不是代替用户进行最终判断。
## 为什么不能直接用于实盘
将智策输出直接用于实盘,通常会面临以下风险:
- 策略逻辑可能与用户原始意图存在偏差;
- 代码虽能运行,但边界条件处理不充分;
- 回测结果依赖样本区间、参数设置和历史数据质量;
- 参数优化结果可能过拟合;
- 市场环境变化可能导致历史有效逻辑在未来失效。
因此,“能生成”“能运行”“回测结果好”都不等于“可以直接实盘”。
## 使用前必须完成的验证工作
在考虑实盘应用前,建议至少完成以下验证工作:
1. 人工复核策略逻辑是否准确;
2. 人工检查关键代码结构与参数含义;
3. 完成必要的代码检查;
4. 使用历史数据执行回测并理解结果;
5. 执行参数优化时避免只追求历史最优;
6. 配合 [风控管理](../strategy/fusion_risk.md) 设置必要限制;
7. 在更低风险环境中先做进一步观察和验证。
对入门用户来说,真正重要的不是“生成得有多快”,而是“验证是否足够充分”。
## 用户应承担的责任
在使用智策过程中,用户应自行承担以下责任:
- 对输入内容的真实性、合法性和适用性负责;
- 对生成逻辑、代码和结果进行独立审查;
- 对是否进入仿真或实盘运行作出独立判断;
- 对据此产生的交易行为和后果负责。
如果你尚未建立清晰的验证流程,建议先回到 [智策工作流](fusion_agent_workflow.md)、[回测与优化](../strategy/fusion_backtester.md) 和 [风控管理](../strategy/fusion_risk.md),先把研究闭环补完整。
+140
View File
@@ -0,0 +1,140 @@
# 智策工作流
`智策工作流` 是 VeighNa Fusion 中最具特色的使用路径之一。它把“提出策略想法”到“得到可复核结果”的过程拆分成多个连续步骤,帮助用户在同一工作台中完成策略研究。
从整体上看,智策工作流通常遵循以下顺序:
1. 提出策略想法;
2. 生成策略逻辑;
3. 确认策略逻辑;
4. 生成策略代码;
5. 执行代码检查;
6. 执行回测;
7. 规划优化参数;
8. 执行参数优化;
9. 选择最终参数并复核结果。
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/fusion/42.png)
## 从策略想法开始
进入 `智策工作台` 后,通常需要先新建任务,并输入你的策略想法。这里的输入可以是一个简短思路,也可以是较完整的交易设想,例如:
- 想交易哪个品种;
- 准备使用哪类信号;
- 期望的开平仓条件是什么;
- 是否需要止盈、止损或趋势过滤。
输入越清晰,后续得到的逻辑说明通常越容易复核和讨论。
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/fusion/43.png)
## 生成并确认策略逻辑
在拿到用户输入后,智策会先整理成结构化的策略逻辑说明。这个阶段的重点不是立刻生成代码,而是先把“策略到底要做什么”说清楚。
建议在这一阶段重点检查:
- 开仓条件是否明确;
- 平仓条件是否明确;
- 风控条件是否明确;
- 逻辑表达是否与自己的原始想法一致;
- 是否存在明显遗漏或理解偏差。
如果逻辑说明本身就不清楚,那么后面生成的代码和回测结果也很难可靠。
请注意,填写的策略类名不要和示例策略类名或已存在任务的策略类名重合,命名以“Strategy”结尾。
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/fusion/44.png)
## 生成策略代码
当逻辑确认后,智策会继续生成策略代码草稿。对于用户来说,这一步的核心价值是把想法转化为更容易检查和修改的代码形式,而不是直接跳过人工审阅。
阅读生成代码时,建议重点关注:
- 关键变量和参数是否符合预期;
- 开平仓逻辑是否完整;
- 是否包含明显与原始逻辑不一致的部分;
- 命名是否清晰,便于后续维护与复核。
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/fusion/51.png)
## 执行代码检查
代码生成后,智策会继续推进到检查阶段。这个阶段通常用于尽早发现明显问题,例如逻辑错误、结构问题或运行前就能发现的不合理设置。
对用户而言,代码检查的意义在于:
- 尽早发现代码层面的可修正问题;
- 缩短无效回测或无效调试的时间;
- 为后续回测提供更稳定的起点。
即便检查通过,也不意味着代码已经可以直接实盘使用。
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/fusion/50.png)
## 执行回测
在完成代码检查后,智策会进入回测阶段。此时系统会结合回测配置和历史数据,对策略在样本区间内的表现进行验证。
在这一阶段,建议重点关注:
- 回测是否顺利完成;
- 数据区间是否合理;
- 收益、回撤、交易次数等指标是否与策略逻辑匹配;
- 是否存在“能运行,但结果明显不合理”的情况。
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/fusion/47.png)
## 规划优化参数
当基础回测完成后,智策会根据当前策略结构,给出参数优化的规划建议。这个阶段的目标不是立刻给出“最佳参数”,而是帮助你明确:
- 哪些参数值得优化;
- 每个参数适合在哪个范围内尝试;
- 优化目标应如何设定。
这一步有助于避免用户在没有明确目标时盲目做大范围搜索。
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/fusion/48.png)
## 执行参数优化
在确认优化规划后,智策会继续执行参数优化,并输出不同参数组合的结果比较。
使用这一阶段结果时,建议注意:
- 重点看参数区间是否相对稳定,而不只是看单一最佳值;
- 不要把历史样本中的最佳结果直接当作实盘参数;
- 若优化结果与原有逻辑明显冲突,应优先重新审视策略本身。
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/fusion/49.png)
## 选择最终参数
当优化完成后,用户可以基于结果做出判断,决定后续保留哪组参数。
在这个阶段,建议结合以下信息综合判断:
- 回测收益和回撤;
- 参数是否稳定;
- 逻辑是否仍然容易理解;
- 风险是否与自己的交易目标匹配。
如果某组参数虽然历史表现最好,但解释困难、稳定性差或过于依赖样本区间,那么通常不应直接作为最终选择。
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/fusion/52.png)
参数优化任务完成后,工作流会将最终优化参数写回策略的默认值,更新完整策略代码。重新执行回测,更新结果到【回测结果】页面。用户可以通过点击【策略代码】页面的【打开策略文件】按钮访问策略代码并自行保存或调整。
## 结果复核与后续处理
智策工作流走完后,并不意味着研究流程已经结束。比较稳妥的后续做法是:
1. 回头复核逻辑、代码、回测和优化结果之间是否一致;
2. 结合 [CTA策略](../strategy/fusion_cta.md) 和 [风控管理](../strategy/fusion_risk.md) 重新评估实际可用性;
3. 对关键结果进行人工记录和复盘;
4. 未经充分验证,不直接进入实盘自动运行。
如果你还未阅读风险边界说明,建议继续查看 [智策使用须知](fusion_agent_notice.md)。
+10
View File
@@ -0,0 +1,10 @@
智策投研
~~~~~~~~
.. toctree::
:maxdepth: 2
fusion_agent_intro.md
fusion_agent_config.md
fusion_agent_workflow.md
fusion_agent_notice.md
+13
View File
@@ -0,0 +1,13 @@
Fusion版
~~~~~~~~
VeighNa Fusion 是面向期货公司经纪业务客户的 Windows 量化交易与智能投研软件。用户可通过单一 `CTP` 接口完成行情、交易、`CTA策略`、回测、风控以及 `智策` 辅助研究等工作。
本文档以安装使用主线为核心,适合从图形界面开始建立量化交易流程的入门和初阶用户。
.. toctree::
:maxdepth: 2
info/index
strategy/index
agent/index
+114
View File
@@ -0,0 +1,114 @@
# CTP交易连接
VeighNa Fusion 仅提供单一 `CTP` 交易接口,因此完成登录后,最重要的基础操作就是连接 CTP 并确认行情与交易功能工作正常。
## 连接前准备
在执行连接前,建议先确认以下事项:
- 已成功登录 VeighNa Fusion
- 已从所属期货公司获取 CTP 账户所需信息;
- 当前网络环境能够访问交易和行情服务;
- 交易时段、仿真环境或生产环境与账号用途一致。
如果你不确定所需填写的字段含义,应先向所属期货公司确认,不建议自行猜测或混用不同环境的配置。
## 连接CTP
在主界面中点击 `【系统】->【连接CTP】`,即可打开 CTP 连接窗口。按照窗口中的字段要求填写相关信息后,点击确认发起连接。
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/fusion/1.png)
连接发起后,可观察 `日志` 组件输出的状态信息。若连接成功,系统通常会继续推送账户、持仓、合约或行情相关信息。
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/fusion/2.png)
## 查询合约
连接成功后,建议先通过 `【帮助】->【查询合约】`
请注意,等待`日志` 组件输出“合约查询成功”日志之后进行合约查询,查到的才是接口本次连接收到的所有合约。
查询合约时,常见用途包括:
- 确认某个期货合约所属交易所;
- 确认下单时应填写的合约代码;
- 检查当前环境下该合约是否已可正常查询。
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/fusion/3.png)
## 订阅行情
在交易组件中输入正确的**交易所**和合约**代码**后,通常即可订阅该合约的行情。订阅成功后,界面会逐步显示:
- 合约名称;
- 最新价;
- 买卖盘报价;
- 其他实时行情字段。
若订阅后界面长期没有行情更新,应先回到【合约查询】页面**确认代码是否填写正确**,再检查当前时间段是否有有效行情推送。
请注意,名称不用填写,订阅成功之后会自动显示。
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/fusion/4.png)
## 委托下单与撤单
在完成行情订阅后,可在交易组件中填写下单信息,常见字段包括:
- 交易所;
- 代码;
- 方向;
- 开平;
- 委托类型;
- 价格;
- 数量。
填写完成后即可发出委托。委托发出后,建议同时观察:
- `委托` 组件中的状态变化;
- `活动委托` 或相关监控区域中的实时反馈;
- `成交` 组件中是否出现成交记录;
- `日志` 组件中是否出现异常提示。
需要撤销尚未完成的委托时,可在相应委托区域执行撤单操作。
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/fusion/5.png)
## 查看委托成交持仓
完成一次完整交易后,建议重点关注以下几个区域:
- `委托`:确认委托是否已经发出、成交或撤销;
- `成交`:确认是否已有实际成交记录;
- `持仓`:确认成交后持仓是否变化;
- `资金`:观察账户权益和可用资金的变化;
- `日志`:核对是否存在风控提示、接口异常或其他重要信息。
对于入门用户来说,养成“下单后先看委托,再看成交和持仓”的习惯,往往比一味关注价格变动更重要。
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/fusion/6.png)
## 常见连接问题
### 无法建立连接
现象:点击连接后,日志中长时间没有正常登录反馈,或直接提示连接失败。
处理建议:如果长时间没有日志输出反馈,可以通过telnet检查对应服务器端口是否开启。如果有日志反馈输出,可以结合日志输出信息先检查网络状态,再确认填写的信息是否来自正确环境,并联系所属期货公司确认当前服务状态。
### 能登录但无法查询合约
现象:账户连接成功,但查询不到目标合约。
处理建议:先确认交易所和合约代码写法,再确认当前环境是否支持该合约或该交易时段是否有效。
### 能连接但没有行情
现象:连接成功后无法看到实时行情更新。
处理建议:先确认是否已经正确订阅目标合约(如果输入的合约代码是接口连接后已经查到的,订阅成功之后交易组件的“名称”字段会自动显示),再检查当前时间是否处于对应市场的有效行情时段。
### 委托发出后没有成交
现象:委托状态停留在未成交或部分成交。
处理建议:这是交易过程中的正常情况之一,应结合价格、盘口和委托状态综合判断,不要将“未成交”等同于系统异常。
完成 CTP 连接后,你可以继续阅读 [CTA策略](../strategy/fusion_cta.md) 和 [回测与优化](../strategy/fusion_backtester.md),开始进入量化交易主线。
+69
View File
@@ -0,0 +1,69 @@
# 常见问题
本页整理了 VeighNa Fusion 使用过程中最常见的安装、登录、连接和更新问题。若问题仍无法解决,建议保留错误现象、时间点和相关截图,并联系所属期货公司或技术支持进一步排查。
## 安装失败怎么办
现象:安装向导中断、提示权限不足,或安装完成后无法正常启动。
原因:常见原因包括系统权限不足、安装包不完整或本机环境限制。
处理建议:重新确认安装包来源,必要时使用具备安装权限的 Windows 账户重试。
## 启动后没有反应怎么办
现象:双击 `VeighNa Fusion` 后没有看到主界面或登录窗口。
原因:可能是程序未正常启动、被系统拦截,或已有运行中的 Fusion 进程。
处理建议:先确认当前机器是否已经打开过 Fusion;如仍无响应,可重启电脑后再尝试启动。
## 登录时提示用户名或密码错误怎么办
现象:输入账号密码后,系统提示登录失败。
原因:账号信息填写错误、密码已变更,或账号状态异常。
处理建议:重新核对输入内容,如仍无法登录,应联系所属期货公司确认账号状态。
## 登录时提示已在其他设备登录怎么办
现象:当前设备无法登录,系统提示该账户正在其他设备使用。
原因:同一账号存在未结束的会话。
处理建议:先在原设备退出,或等待原有会话超时后再重试;必要时联系技术支持协助处理。
## 登录时提示无法连接服务器怎么办
现象:登录过程中提示连接失败、网络错误或服务器不可用。
原因:本机网络异常,或当前网络环境无法访问 Fusion 所需服务。
处理建议:先检查网络连接,再确认当前环境是否符合期货公司提供的接入要求。
## 无法连接CTP怎么办
现象:点击 `【系统】->【连接CTP】` 后无法完成连接。
原因:常见原因包括参数填写错误、网络不可达或当前环境不匹配。
处理建议:优先核对连接信息来源,确认是否使用了正确的交易环境和账户信息。
## 连接成功但看不到行情怎么办
现象:日志显示连接成功,但行情界面没有实时更新。
原因:可能尚未正确订阅合约,或当前时间不在有效行情时段。
处理建议:先使用合约查询确认代码,再重新订阅目标合约并观察是否恢复更新。
## 委托发出后没有成交是不是程序有问题
现象:委托发出后,状态停留在未成交、部分成交或提交中。
原因:这通常与市场撮合和价格条件有关,不一定是程序异常。
处理建议:先查看委托状态、价格设置和盘口变化,再判断是否需要撤单或修改报价。
## 更新失败怎么办
现象:启动时检测到更新,但更新过程未完成或更新后无法继续使用。
原因:常见原因包括网络不稳定、文件占用或升级过程被中断。
处理建议:不要反复覆盖安装,建议先确认当前版本状态,再联系所属期货公司或技术支持处理。
## 什么时候应该联系支持人员
出现以下情况时,建议尽快联系支持人员处理:
- 连续多次安装或登录失败;
- 提示授权异常、许可异常或会话异常;
- 连接 CTP 后长时间无法恢复正常;
- 软件更新后出现明显功能异常;
- 你无法判断问题来自网络、账号还是软件本身。
如需继续了解基本使用路径,可返回阅读 [安装指南](fusion_install.md)、[登录使用](fusion_login.md) 和 [CTP交易连接](fusion_ctp.md)。
+92
View File
@@ -0,0 +1,92 @@
# 安装指南
VeighNa Fusion 仅提供 Windows 版本,并通过安装包方式交付。用户无需自行准备源码环境,也无需通过命令行安装 Python 依赖,按照安装向导完成安装即可开始使用。
## 适用系统
本文档中的安装说明适用于以下系统环境:
- Windows 10
- Windows 11
如你的机器由期货公司统一管理,建议优先使用机构提供的标准系统环境和安装指引。
## 安装前准备
开始安装前,建议先确认以下事项:
- 已从所属期货公司或指定渠道获取 VeighNa Fusion 安装包;
- 当前 Windows 账户具备安装软件的权限;
- 电脑可正常访问 Fusion 登录和升级所需的网络环境;
- 如本机已安装旧版本 Fusion,建议先确认是否需要保留现有配置和用户数据。
## 安装流程
双击安装包后,按照安装向导提示逐步完成安装。通常建议直接使用默认选项,避免自行修改不熟悉的配置项。
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/fusion/37.png)
在安装过程中,安装向导会提示选择安装目录。若所属期货公司对安装路径有专门要求,请以其要求为准;如无特别说明,建议使用安装向导推荐的默认目录。
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/fusion/46.png)
点击安装后,等待程序完成文件复制和环境配置。安装结束后,桌面会出现唯一入口 `VeighNa Fusion`,双击即可启动软件。
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/fusion/38.png)
## 启动软件
安装完成后,可通过以下方式启动:
- 双击桌面快捷方式 `VeighNa Fusion`
- 或从 Windows 开始菜单中找到 `VeighNa Fusion` 后启动。
首次启动时,系统会进入登录界面。后续登录流程可参考 [登录使用](fusion_login.md)。
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/fusion/39.png)
## 软件升级
Fusion 支持版本更新提示。若软件启动后检测到新版本,通常会弹出更新提示窗口,用户可以选择立即更新,或暂时跳过本次更新后继续登录。
在升级前,建议注意以下事项:
- 如当前有未保存的研究结果或未完成的操作,建议先处理完成再更新;
- 如升级由所属期货公司统一安排,应优先遵循统一升级通知;
- 如升级失败,不建议反复多次尝试覆盖安装,可先查看 [常见问题](fusion_faq.md)。
## 卸载软件
如需卸载 VeighNa Fusion,可在 Windows 的软件管理界面中进行卸载。不同 Windows 版本的入口名称略有差异,通常可通过以下路径找到:
- `设置 -> 应用 -> 已安装的应用`
-`控制面板 -> 程序和功能`
找到 `VeighNa Fusion` 后执行卸载即可。
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/fusion/40.png)
## 注意事项
### 用户数据和配置
卸载软件通常只会移除程序文件,本地登录信息、窗口配置、策略配置或其他用户数据是否保留,取决于具体卸载方式和安装包策略。如需彻底清理,请先确认是否仍需要保留历史配置与研究结果。
### 重装前的建议
如你是因为程序异常而准备重装,建议先确认:
- 是否已经记录了报错现象;
- 是否需要保留本地配置与策略相关资料;
- 是否已经联系所属期货公司或技术支持确认重装是否为推荐处理方式。
### 不建议的做法
以下内容不属于 Fusion 的标准安装流程:
- 手动安装 Python 环境;
- 通过源码目录启动程序;
- 使用 `install.bat` 或类似脚本进行安装;
- 按社区版的开发环境说明配置 Fusion。
如果你已经完成安装,可继续阅读 [登录使用](fusion_login.md) 和 [主界面说明](fusion_trader.md)。
+66
View File
@@ -0,0 +1,66 @@
# 产品介绍
VeighNa Fusion 是面向期货公司经纪业务客户的 Windows 量化交易与智能投研软件。用户可以通过单一 `CTP` 接口完成行情查看、手工交易、`CTA策略` 运行、历史回测、参数优化以及 `智策` 辅助研究等工作。
与社区版偏向开源框架、Elite版覆盖更广泛专业场景不同,Fusion 更强调安装简单、流程清晰和上手直接,适合刚开始接触量化交易或希望在图形界面中逐步建立研究流程的用户。
## VeighNa Fusion是什么
VeighNa Fusion 建立在 VeighNa 量化交易体系之上,提供开箱即用的图形化桌面终端。用户启动软件后,可先完成账号登录,再连接交易账户,随后使用内置模块开展交易与研究工作。
Fusion 的核心特点包括:
- 仅提供 Windows 版本,采用安装包方式交付;
- 仅支持单一 `CTP` 交易接口,减少入门阶段的选择成本;
- 内置 `CTA策略``回测``数据管理``风控` 等常用能力;
- 提供 `智策` 能力,支持策略思路整理、代码辅助、回测与优化流程衔接。
## 适合哪些用户
VeighNa Fusion 主要适合以下用户:
- 通过期货公司获取 Fusion 服务,希望在本地桌面软件中完成量化交易与研究工作的客户;
- 已具备基本期货交易知识,正在从手工交易逐步过渡到程序化交易的用户;
- 希望在图形界面中完成策略研究、回测和参数优化,而不是从源码环境开始搭建的用户;
- 希望借助 `智策` 提升策略研究和代码整理效率,但仍愿意自行完成审查和验证的用户。
如果你已经非常熟悉 Python 开发环境,且更关注框架扩展、接口开发或源码级定制,可以进一步参考 [VeighNa 社区版文档](https://www.vnpy.com/docs/cn/community/index.html)。
## 可以完成哪些事情
使用 VeighNa Fusion,通常可以围绕以下主线开展工作:
1. 安装并启动软件;
2. 登录 Fusion 账号;
3. 连接 `CTP` 交易账户;
4. 查询合约、订阅行情、进行手工下单;
5. 使用 `CTA策略` 模块加载和运行策略;
6. 使用回测模块验证策略表现并进行参数优化;
7. 使用 `智策` 辅助梳理策略逻辑、生成代码和分析结果;
8. 结合 `风控` 模块和人工复核,逐步完善研究与交易流程。
建议初次使用时,先按 [安装指南](fusion_install.md)、[登录使用](fusion_login.md) 和 [CTP交易连接](fusion_ctp.md) 的顺序完成基础配置,再进入策略和智策章节。
## 与社区版和Elite版的区别
从文档使用角度来看,三者的定位可以简单理解为:
| 版本 | 主要特点 | 更适合谁 |
| --- | --- | --- |
| 社区版 | 开源、可扩展、强调源码与生态 | 有开发经验、希望自行定制框架的用户 |
| Elite版 | Windows 成品软件、功能覆盖较广 | 需要成熟桌面交易与研究工具的专业用户 |
| Fusion版 | Windows 安装包、单一 CTP、入门友好、强调智策辅助 | 期货公司经纪业务客户中的入门和初阶量化用户 |
Fusion 文档因此会更关注“如何完成一条完整使用路径”,而不是罗列全部底层配置项或框架原理。
## 使用前需要了解的事项
在正式使用 VeighNa Fusion 前,建议先明确以下几点:
- Fusion 提供的是量化交易与智能投研工具,不构成投资建议、投资顾问服务或收益承诺;
- `智策` 属于辅助功能,生成的策略逻辑、代码、回测结果和优化建议都需要用户独立审查;
- 回测结果、参数优化结果和历史表现均不代表未来实盘收益;
- 未经充分验证的策略、参数和自动化流程,不应直接用于实盘交易;
- 账号开通、权限变更和部分服务范围,通常以所属期货公司的安排为准。
关于 Fusion 中 AI 功能的边界与注意事项,可继续阅读 [智策使用须知](../agent/fusion_agent_notice.md)。
+102
View File
@@ -0,0 +1,102 @@
# 登录使用
每次启动 VeighNa Fusion 后,系统会先进入登录界面。用户需输入账号信息,并确认已阅读相关协议,登录成功后才能进入主程序。
## 首次启动界面
启动 Fusion 后,界面通常会显示:
- 用户名输入框;
- 密码输入框;
- 登录按钮;
- 退出按钮;
- 用户协议和隐私政策的勾选项。
建议首次使用时先完整浏览一遍登录界面,确认账号、网络和协议勾选状态后再点击登录。
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/fusion/8.png)
## 输入账号密码
在登录界面中:
- 在用户名输入框中填写所属期货公司为你开通的用户名;
- 在密码输入框中填写对应密码;
- 确认信息无误后,再执行登录操作。
如你不确定账号信息来源或权限范围,应优先联系所属期货公司确认,不建议反复尝试未知账号或密码。
## 阅读并同意相关协议
Fusion 登录前要求用户勾选相关协议,表示已阅读并同意:
- 《用户协议》
- 《隐私政策》
若未勾选协议,系统将不会继续登录流程。
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/fusion/9.png)
## 首次登录修改密码
部分账号在首次登录时会要求立即修改默认密码。若出现修改密码提示,请按要求完成以下操作:
1. 输入新密码;
2. 再次输入新密码确认;
3. 提交修改;
4. 修改成功后,使用新密码继续后续登录流程。
设置新密码时,建议遵循所属期货公司的密码规范,并避免与旧密码保持一致。
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/fusion/10.png)
## 更新提示说明
Fusion 在登录前可能检查是否存在新版本。若检测到更新,系统通常会弹出更新提示窗口,显示当前版本与最新版本信息。
你可以根据实际情况选择:
- 立即更新后再重新启动软件;
- 暂时跳过本次更新,先继续登录。
如果所属期货公司对升级有统一安排,请优先遵循统一通知。
## 常见登录问题
### 提示未勾选协议
现象:点击登录后,系统提示需要先同意相关协议。
处理建议:勾选协议后再重新登录。
### 提示用户名或密码错误
现象:登录失败,并提示账号信息不正确。
处理建议:检查输入内容是否有空格、大小写、标点符号切换错误或复制错误;如仍无法登录,请联系所属期货公司确认账号状态。
### 提示首次登录需要修改密码
现象:登录校验通过后,系统要求立即修改密码。
处理建议:按页面提示完成密码修改,修改成功后继续登录。
### 提示无法连接服务器
现象:登录时出现网络连接失败、服务器不可达或类似提示。
处理建议:先检查本机网络状态,再确认当前网络环境是否允许访问 Fusion 所需服务。
### 提示该账户已在其他设备登录
现象:系统提示该账号正在其他设备使用,当前无法继续登录。
处理建议:先在原设备退出,或等待原有会话失效后再重试;如长期无法恢复,请联系所属期货公司或技术支持协助处理。
### 提示授权或许可异常
现象:登录过程中提示授权无效、授权超限或类似信息。
处理建议:通常与账号授权状态相关,应由所属期货公司或服务提供方协助核查。
## 登录成功后做什么
登录成功后,建议按以下顺序继续操作:
1. 阅读 [主界面说明](fusion_trader.md),了解菜单和组件位置;
2. 阅读 [CTP交易连接](fusion_ctp.md),完成账户连接和行情订阅;
3. 再进入 `CTA策略``回测``智策` 章节,逐步建立自己的研究与交易流程。
+99
View File
@@ -0,0 +1,99 @@
# 主界面说明
完成登录后,VeighNa Fusion 会进入主界面。主界面是你后续进行交易、策略研究、回测分析和智策操作的工作中心,因此建议先对界面结构有一个整体认识。
## 主界面总览
Fusion 主界面通常由以下部分组成:
- 顶部菜单栏和工具栏;
- 中间的交易与功能工作区;
- 下方或侧边的日志、委托、成交、持仓、资金等监控组件。
不同用户可能会根据自己的习惯调整窗口布局,但整体功能入口是一致的。
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/fusion/11.png)
## 系统菜单
`【系统】` 菜单主要用于连接交易接口和退出程序。
对大多数 Fusion 用户来说,最常用的入口是:
- `【系统】->【连接CTP】`
- `【系统】->【退出】`
在完成登录后,通常应先通过系统菜单连接交易账户,再进行后续操作。
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/fusion/12.png)
## 功能菜单
`【功能】` 菜单用于打开 Fusion 内置的交易与研究模块。常见模块包括:
- `CTA策略`
- `CTA回测`
- `数据管理`
- `交易风控`
这些模块构成了 Fusion 的主要量化工作流:先连接交易,再进行策略运行、回测验证、历史数据管理和风控设置。
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/fusion/13.png)
## 智策菜单
`【智策】` 是 Fusion 的特色入口,通常包括以下功能:
- `智策工作台`
- `AI服务配置`
- `模型浏览器`
如果你希望借助 AI 辅助整理策略思路、生成代码、执行检查或衔接回测优化流程,可以从这里开始。
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/fusion/14.png)
## 帮助菜单
`【帮助】` 菜单主要提供以下辅助能力:
- 查询合约;
- 还原窗口;
- 测试邮件;
- 社区论坛;
- 关于。
其中,对大部分用户最常用的是 `【帮助】->【查询合约】`,可用于确认合约代码和交易所信息。
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/fusion/15.png)
## 常用窗口组件
主界面中常见的窗口组件及用途如下:
| 组件 | 用途 |
| --- | --- |
| 日志 | 查看系统提示、接口连接信息、运行状态和报错信息 |
| 交易 | 输入交易所、合约代码、方向、价格、数量等下单信息 |
| 委托 | 查看已提交委托及其状态变化 |
| 成交 | 查看已经撮合成交的记录 |
| 持仓 | 查看当前账户持仓情况 |
| 资金 | 查看账户资金相关信息 |
初次使用时,建议优先关注 `日志``交易``委托``成交` 四个组件,这些组件最能帮助你理解软件当前是否处于正常工作状态。
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/fusion/16.png)
## 退出软件
完成操作后,可通过以下方式退出 Fusion:
- 点击右上角关闭按钮;
- 或使用 `【系统】->【退出】`
退出前建议先确认:
- 是否仍有正在观察或管理的交易任务;
- 是否有尚未记录的重要日志或结果;
- 是否已经完成当前会话需要保存的研究与配置工作。
如你刚完成登录,下一步建议继续阅读 [CTP交易连接](fusion_ctp.md),先完成交易账户连接与行情订阅。
+12
View File
@@ -0,0 +1,12 @@
安装使用
~~~~~~~~
.. toctree::
:maxdepth: 2
fusion_introduction.md
fusion_install.md
fusion_login.md
fusion_trader.md
fusion_ctp.md
fusion_faq.md
+82
View File
@@ -0,0 +1,82 @@
# 回测与优化
`回测` 是把策略放到历史数据上重新运行,以便观察其历史表现;`参数优化` 则是在一定范围内比较不同参数组合的结果。对于 Fusion 用户来说,回测与优化的意义不在于“证明策略一定赚钱”,而在于帮助你在进入实盘前完成必要验证。
## 为什么先做回测
在正式运行策略之前,建议先做回测,主要原因包括:
- 确认策略逻辑是否能正常运行;
- 检查参数设置是否合理;
- 观察策略在特定历史区间内的表现;
- 识别过度交易、过大回撤或明显不稳定的情形;
- 为后续参数优化提供基础。
对于初学者来说,先做回测是一种控制风险的基本习惯。
## 配置回测参数
打开 `【功能】->【CTA回测】` 后,可进入回测模块。开始回测前,通常需要配置以下内容:
- 策略名称;
- 合约代码与交易所;
- K 线周期;
- 开始时间和结束时间;
- 手续费、滑点等交易成本参数;
- 合约乘数、最小价格跳动和初始资金等基础设置。
这些参数会直接影响回测结果,因此应尽量按照真实交易环境填写,而不是随意估算。
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/fusion/23.png)
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/fusion/24.png)
## 查看回测结果
回测完成后,界面通常会展示:
- 统计指标;
- 收益曲线;
- 回撤曲线;
- 交易明细或成交概览;
- 日志输出。
阅读结果时,建议不要只看收益率,还应同时关注:
- 最大回撤是否可接受;
- 交易次数是否过多或过少;
- 收益是否集中在少量行情阶段;
- 结果是否与策略逻辑本身相一致。
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/fusion/54.png)
## 参数优化入门
当你已经完成基础回测,并希望进一步比较不同参数组合时,可以使用参数优化功能。参数优化通常用于:
- 比较不同指标周期、阈值或止损参数;
- 初步观察哪些参数区间相对稳定;
- 为后续策略微调提供参考。
使用参数优化时,建议:
- 先从少量关键参数开始;
- 控制参数区间和步长,避免组合数量过大;
- 不要把“最佳结果”直接等同于“最适合实盘”的参数。
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/fusion/25.png)
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/fusion/53.png)
## 如何理解回测结果
回测与优化是研究工具,不是结果承诺。理解结果时应特别注意:
- 历史表现不代表未来表现;
- 回测结果依赖历史数据质量、参数设置和成本设定;
- 参数优化可能产生“过拟合”,即参数只对过去样本有效;
- 即使回测收益较好,也仍需结合风控、市场环境和人工复核再决定是否进入实盘。
如果你的策略来自 [智策工作流](../agent/fusion_agent_workflow.md),那么回测与优化更应被视为“验证步骤”,而不是自动决策依据。
下一步建议继续阅读 [历史数据管理](fusion_data.md),了解如何为回测准备和维护数据。
+104
View File
@@ -0,0 +1,104 @@
# CTA策略
`CTA策略` 是 VeighNa Fusion 中最核心的量化交易模块之一。对于多数入门用户而言,理解并掌握 CTA 模块,意味着正式进入“策略加载、参数配置、运行监控和结果复核”的量化交易流程。
## 什么是CTA策略
CTA 是一种常见的程序化交易方式。放在 Fusion 中理解,可以把它看成:
- 根据预先定义好的策略逻辑自动生成交易信号;
- 根据策略参数运行在指定合约上;
- 在运行过程中持续更新持仓、委托、成交和变量状态;
- 配合历史回测、参数优化和风控管理形成完整使用闭环。
对于初学者来说,建议先把 CTA 模块理解为“运行策略的工作台”,而不是一开始就关注底层实现细节。
## 打开CTA模块
登录软件并完成 `CTP` 连接后,可通过 `【功能】->【CTA策略】` 打开 CTA 模块。
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/fusion/18.png)
进入模块后,通常可以看到策略监控区域、实例操作按钮、参数信息和变量信息等内容。
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/fusion/17.png)
## 加载策略
在 Fusion 中使用 CTA 策略时,通常是围绕“策略实例”来进行管理的。一个策略实例对应一组参数、一个目标合约,以及一套独立的运行状态。
典型步骤如下:
1. 选择要使用的策略;
2. 点击添加或创建策略;
3. 填写实例名称、交易合约和相关参数;
4. 完成后在监控区域中查看该策略实例。
使用过程中建议注意:
- 实例名称应尽量清晰,便于区分不同合约或不同参数组合;
- 合约代码和交易所应与实际交易环境保持一致;
- 参数名称和参数含义应在理解后再修改,不建议仅凭感觉调整。
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/fusion/19.png)
## 配置策略参数
策略参数决定了策略运行时的行为。常见场景包括:
- 调整技术指标周期;
- 调整开仓、止盈或止损阈值;
- 调整仓位控制相关参数;
- 针对不同合约使用不同参数组合。
初次使用时,建议采用以下原则:
- 先使用默认参数熟悉策略运行方式;
- 每次只修改少量关键参数,避免同时改动过多内容;
- 每次参数调整后,优先通过回测观察变化,而不是直接进入实盘。
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/fusion/20.png)
## 启动与停止策略
创建策略实例后,通常还需要完成初始化和启动,策略才会进入可交易状态。不同策略在初始化阶段可能需要载入一定历史数据,因此启动前应先确认:
- `CTP` 已成功连接;
- 合约信息已正常获取;
- 所需历史数据已经准备完成;
- 当前市场和策略适用场景匹配。
启动后,策略会根据其逻辑持续运行;当不再需要继续运行时,可执行停止操作。
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/fusion/21.png)
## 观察策略运行情况
CTA 模块的价值不仅在于运行策略,更在于帮助用户观察策略是否按预期工作。建议重点关注以下内容:
CTA策略图形界面:
- `参数信息`:确认当前策略实例使用的是哪组参数;
- `变量信息`:观察策略内部关键状态是否发生变化;
- `日志`:查看初始化、启动、报错和提醒信息;
VeighNa Fusion主界面:
- `委托``成交`:确认策略是否真的发出并完成交易;
- `持仓`:确认策略行为是否已经反映到账户层面。
请注意,CTA策略图形界面右上方显示的只是本地停止单的信息。一旦被成功触发发出超价限价单(不是触发价格)之后,需要基于显示的对应限价委托号去VeighNa Fusion主界面【委托】组件查看委托的具体信息。
如果你只是看到策略“启动成功”,但没有同步查看日志、委托和成交,那么对策略实际状态的判断通常是不完整的。
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/fusion/22.png)
## 使用注意事项
使用 CTA 模块时,建议牢记以下原则:
- 未完成理解和验证的策略,不建议直接用于实盘;
- 参数调整应尽量结合回测结果与市场特性,不宜频繁随机更改;
- 先确认数据、连接和风控状态,再启动策略;
- 出现异常时,应先查看日志和委托状态,不要只凭价格波动判断;
- 若策略来自 `智策` 或其他辅助生成流程,必须先完成人工复核。
下一步建议继续阅读 [回测与优化](fusion_backtester.md),将策略使用与验证流程串联起来。
+65
View File
@@ -0,0 +1,65 @@
# 历史数据管理
历史数据管理模块的核心作用,是为 `CTA策略``回测` 和后续研究工作提供可靠的数据基础。对于 Fusion 用户来说,数据管理不只是“保存数据”,更是确保策略验证结果有参考价值的重要前提。
## 数据管理的作用
在 Fusion 中,历史数据通常会被用于以下场景:
- 为 CTA 策略初始化提供所需的历史 K 线或 Tick 数据;
- 为回测模块提供历史样本;
- 为参数优化提供可重复使用的数据基础;
- 便于导入、查看和整理已有历史数据。
如果历史数据不完整或格式不正确,策略初始化、回测结果和参数优化都可能受到影响。
## 导入历史数据
打开 `【功能】->【数据管理】` 后,可进入历史数据管理模块。若你已经从其他渠道获得历史数据,可以通过导入功能将其写入本地数据环境。
导入前建议先确认:
- 数据文件的来源可靠;
- 时间字段格式清晰;
- 合约代码和交易所信息准确;
- 数据周期与后续使用场景一致。
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/fusion/29.png)
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/fusion/30.png)
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/fusion/31.png)
## 查看与导出数据
在数据管理模块中,通常还可以对已存储的数据进行查看、筛选和导出。常见用途包括:
- 检查某个合约某段时间是否已有数据;
- 确认导入后的数据范围是否完整;
- 将已整理好的数据导出,供外部分析或备份使用。
在开始回测前,先用查看功能确认目标合约和目标区间的数据是否存在,往往能减少很多无效排查。
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/fusion/32.png)
## 为回测做准备
当你准备进行回测或参数优化时,建议先检查:
- 目标合约的数据是否已经覆盖所需日期范围;
- 选择的数据周期是否与策略逻辑一致;
- 数据是否存在明显缺口、重复或异常;
- 回测所需的交易成本参数是否准备完整。
只有当数据准备充分时,回测结果才更有参考价值。
## 使用注意事项
使用历史数据管理时,建议注意以下几点:
- 不同数据来源之间可能存在格式或口径差异;
- 数据导入成功不代表数据一定可直接用于交易判断;
- 若回测结果异常,除了检查策略本身,也要回头检查数据质量;
- 对于重要研究结果,建议保留数据来源和处理过程说明,便于复核。
如果你已经准备好数据,下一步建议阅读 [回测与优化](fusion_backtester.md) 或 [CTA策略](fusion_cta.md)。
+67
View File
@@ -0,0 +1,67 @@
# 风控管理
`风控` 模块用于在委托发出前对交易行为进行检查,帮助用户减少误操作、过度交易和明显超限的情况。对于刚接触量化交易的用户来说,风控不是“可有可无”的附加项,而是实盘前应尽早建立的基础保护机制。
## 为什么需要风控
在程序化交易环境中,错误往往不是来自单一一笔委托,而是来自连续、重复且高速的操作。启用风控的价值主要体现在:
- 限制短时间内过多委托;
- 限制单笔委托数量过大;
- 限制活动委托数量过多;
- 控制单日成交总量或撤单次数;
- 在策略异常或参数失误时提供第一道前端保护。
## 常见风控规则
打开 `【功能】->【交易风控】` 后,可进入交易风控模块。
Fusion 中常见的风控项通常包括:
- 委托流控上限;
- 流控清空时间;
- 单笔委托上限;
- 总成交上限;
- 活动委托上限;
- 单合约撤单上限。
这些规则并不用于判断策略是否盈利,而是用于控制交易行为是否超过你事先设定的安全边界。
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/fusion/27.png)
## 新手如何设置
如果你刚开始使用 Fusion,建议采用“先保守、后调整”的思路:
- 先启用风控,再逐步优化参数;
- 先设置明确的单笔下单量限制;
- 对活动委托数量和撤单次数设置较为保守的上限;
- 在对策略和交易节奏更熟悉后,再结合实际情况逐步调整。
如果你暂时无法判断某个参数应如何设置,可以先采用较保守的值,避免在不了解的情况下把限制设得过于宽松。
![](https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/fusion/28.png)
## 风控触发后的处理
当风控规则被触发时,系统通常会阻止对应委托继续发出,并在日志或相关界面中给出提示。
此时建议按以下顺序处理:
1. 先确认触发的是哪一条风控规则;
2. 判断这是正常保护还是参数设置过严;
3. 如有必要,再结合当前交易状态调整参数;
4. 调整后重新保存并观察是否恢复正常。
不要在未理解触发原因的情况下,直接关闭风控或大幅放宽全部限制。
## 使用建议
在实际使用中,建议把风控与以下流程配合起来:
- 先通过 [回测与优化](fusion_backtester.md) 验证策略;
- 再通过 [CTA策略](fusion_cta.md) 观察策略实盘或仿真运行情况;
- 同时启用风控,降低参数错误或异常行为带来的风险;
- 若策略来自 [智策](../agent/fusion_agent_intro.md),更应保留人工风控和人工复核环节。
对于入门用户来说,风控并不会让策略“变好”,但可以显著降低因为错误操作而造成的额外风险。
+10
View File
@@ -0,0 +1,10 @@
量化交易
~~~~~~~~
.. toctree::
:maxdepth: 2
fusion_cta.md
fusion_backtester.md
fusion_data.md
fusion_risk.md
+11
View File
@@ -0,0 +1,11 @@
VeighNa用户文档
~~~~~~~~~
.. toctree::
:maxdepth: 3
community/index
elite/index
fusion/index
@@ -0,0 +1,194 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 准备数据"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"# 加载模块\n",
"from datetime import datetime\n",
"\n",
"from tqdm import tqdm\n",
"import rqdatac as rq\n",
"\n",
"from vnpy.trader.database import DB_TZ\n",
"from vnpy.trader.datafeed import get_datafeed\n",
"from vnpy.trader.constant import Exchange, Interval\n",
"from vnpy.trader.object import HistoryRequest\n",
"from vnpy.alpha import AlphaLab, logger"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"# 设置下载参数\n",
"task_name = \"csi300\"\n",
"index_symbol = \"000300.SSE\"\n",
"rq_index_symbol = \"000300.XSHG\"\n",
"\n",
"start_date = \"2007-01-01\"\n",
"end_date = \"2024-10-31\""
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"# 创建投研实验室\n",
"lab = AlphaLab(f\"./lab/{task_name}\") # 指定数据文件夹"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"c:\\Python313\\Lib\\site-packages\\rqdatac\\client.py:257: UserWarning: Your account will be expired after 279 days. Please call us at 0755-22676337 to upgrade or purchase or renew your contract.\n",
" warnings.warn(\"Your account will be expired after {} days. \"\n"
]
},
{
"data": {
"text/plain": [
"True"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 初始化数据服务(这里配置使用的RQData)\n",
"datafeed = get_datafeed()\n",
"datafeed.init()"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"# 下载指数成分股\n",
"data = rq.index_components(rq_index_symbol, start_date=start_date, end_date=end_date)\n",
"\n",
"# 转换合约代码\n",
"index_components = {}\n",
"for dt, rq_symbols in data.items():\n",
" vt_symbols: list = []\n",
"\n",
" for rq_symbol in rq_symbols:\n",
" vt_symbol = rq_symbol.replace(\"XSHG\", \"SSE\").replace(\"XSHE\", \"SZSE\")\n",
" vt_symbols.append(vt_symbol)\n",
"\n",
" index_components[dt.strftime(\"%Y-%m-%d\")] = vt_symbols\n",
"\n",
"# 保存到数据中心\n",
"lab.save_component_data(index_symbol, index_components)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"# 加载指数成分股代码\n",
"component_symbols = lab.load_component_symbols(index_symbol, start_date, end_date)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 859/859 [01:52<00:00, 7.66it/s]\n"
]
}
],
"source": [
"# 转换时间格式\n",
"start = datetime.strptime(start_date, \"%Y-%m-%d\")\n",
"start = start.replace(tzinfo=DB_TZ)\n",
"\n",
"end = datetime.strptime(end_date, \"%Y-%m-%d\")\n",
"end = end.replace(tzinfo=DB_TZ)\n",
"\n",
"# 除了成分股,还要下载指数数据\n",
"task_symbols = component_symbols + [index_symbol]\n",
"\n",
"# 遍历下载数据\n",
"for vt_symbol in tqdm(task_symbols):\n",
" symbol, exchange_str = vt_symbol.split(\".\")\n",
"\n",
" req = HistoryRequest(symbol, Exchange(exchange_str), start, end, Interval.DAILY)\n",
" bars = datafeed.query_bar_history(req)\n",
"\n",
" if bars:\n",
" lab.save_bar_data(bars)\n",
" else:\n",
" logger.error(f\"下载{vt_symbol}数据失败\")\n"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"# 添加回测参数配置\n",
"for vt_symbol in component_symbols:\n",
" lab.add_contract_setting(\n",
" vt_symbol,\n",
" long_rate=5/10000,\n",
" short_rate=10/10000,\n",
" size=1,\n",
" pricetick=0.0001,\n",
" )"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.13.2"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+43
View File
@@ -0,0 +1,43 @@
from datetime import datetime
from vnpy.trader.ui import create_qapp, QtCore
from vnpy.trader.constant import Exchange, Interval
from vnpy.trader.database import get_database
from vnpy.chart import ChartWidget, VolumeItem, CandleItem
if __name__ == "__main__":
app = create_qapp()
database = get_database()
bars = database.load_bar_data(
"IF888",
Exchange.CFFEX,
interval=Interval.MINUTE,
start=datetime(2019, 7, 1),
end=datetime(2019, 7, 17)
)
widget = ChartWidget()
widget.add_plot("candle", hide_x_axis=True)
widget.add_plot("volume", maximum_height=200)
widget.add_item(CandleItem, "candle", "candle")
widget.add_item(VolumeItem, "volume", "volume")
widget.add_cursor()
n = 1000
history = bars[:n]
new_data = bars[n:]
widget.update_history(history)
def update_bar() -> None:
bar = new_data.pop(0)
widget.update_bar(bar)
timer = QtCore.QTimer()
timer.timeout.connect(update_bar)
# timer.start(100)
widget.show()
app.exec()
+27
View File
@@ -0,0 +1,27 @@
from vnpy.event import EventEngine
from vnpy.trader.engine import MainEngine
from vnpy.trader.ui import MainWindow, create_qapp
from vnpy_rpcservice import RpcGateway
from vnpy_ctastrategy import CtaStrategyApp
def main():
""""""
qapp = create_qapp()
event_engine = EventEngine()
main_engine = MainEngine(event_engine)
main_engine.add_gateway(RpcGateway)
main_engine.add_app(CtaStrategyApp)
main_window = MainWindow(main_engine, event_engine)
main_window.showMaximized()
qapp.exec()
if __name__ == "__main__":
main()
+73
View File
@@ -0,0 +1,73 @@
from time import sleep
from vnpy.event import EventEngine, Event
from vnpy.trader.engine import MainEngine
from vnpy.trader.ui import MainWindow, create_qapp
from vnpy.trader.event import EVENT_LOG
from vnpy.trader.object import LogData
from vnpy_ctp import CtpGateway
from vnpy_rpcservice import RpcServiceApp
from vnpy_rpcservice.rpc_service.engine import RpcEngine, EVENT_RPC_LOG
def main_ui() -> None:
""""""
qapp = create_qapp()
event_engine = EventEngine()
main_engine = MainEngine(event_engine)
main_engine.add_gateway(CtpGateway)
main_engine.add_app(RpcServiceApp)
main_window = MainWindow(main_engine, event_engine)
main_window.showMaximized()
qapp.exec()
def process_log_event(event: Event) -> None:
""""""
log: LogData = event.data
msg: str = f"{log.time}\t{log.msg}"
print(msg)
def main_terminal() -> None:
""""""
event_engine: EventEngine = EventEngine()
event_engine.register(EVENT_LOG, process_log_event)
event_engine.register(EVENT_RPC_LOG, process_log_event)
main_engine: MainEngine = MainEngine(event_engine)
main_engine.add_gateway(CtpGateway)
rpc_engine: RpcEngine = main_engine.add_app(RpcServiceApp)
setting: dict[str, str] = {
"用户名": "",
"密码": "",
"经纪商代码": "9999",
"交易服务器": "180.168.146.187:10101",
"行情服务器": "180.168.146.187:10111",
"产品名称": "simnow_client_test",
"授权编码": "0000000000000000",
"产品信息": ""
}
main_engine.connect(setting, "CTP")
sleep(10)
rep_address: str = "tcp://127.0.0.1:2014"
pub_address: str = "tcp://127.0.0.1:4102"
rpc_engine.start(rep_address, pub_address)
while True:
sleep(1)
if __name__ == "__main__":
# Run in GUI mode
# main_ui()
# Run in CLI mode
main_terminal()
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
+146
View File
@@ -0,0 +1,146 @@
"""
该程序使用VeighNa框架通过CTP接口连接到期货市场,并自动录制指定交易所和品种的行情数据。
适合初学者了解VeighNa框架的基本用法和数据录制流程。
"""
# 加载Python标准库
from logging import INFO
from time import sleep
# 加载VeighNa核心框架
from vnpy.event import EventEngine, Event
from vnpy.trader.setting import SETTINGS
from vnpy.trader.engine import MainEngine, LogEngine
from vnpy.trader.object import ContractData
from vnpy.trader.constant import Exchange, Product
from vnpy.trader.event import EVENT_CONTRACT
# 加载VeighNa插件模块
from vnpy_ctp import CtpGateway
from vnpy_datarecorder import DataRecorderApp, RecorderEngine
from vnpy_datarecorder.engine import EVENT_RECORDER_LOG
# 开启日志记录功能
# 日志对于排查问题和监控系统运行状态非常重要
SETTINGS["log.active"] = True # 激活日志功能
SETTINGS["log.level"] = INFO # 设置日志级别为INFO,输出详细信息
SETTINGS["log.console"] = True # 在控制台显示日志,方便实时查看
# CTP接口登录信息
# 以下使用的是SimNow模拟账户信息,初学者可以在SimNow官网申请
ctp_setting: dict[str, str] = {
"用户名": "888888", # SimNow账户名
"密码": "123456", # SimNow密码
"经纪商代码": "9999", # SimNow经纪商代码固定为9999
"交易服务器": "180.168.146.187:10201", # SimNow交易服务器地址和端口
"行情服务器": "180.168.146.187:10211", # SimNow行情服务器地址和端口
"产品名称": "simnow_client_test", # 产品名称,用于区分不同的客户端
"授权编码": "0000000000000000" # 授权编码,SimNow模拟账户使用默认值即可
}
# 要录制数据的交易所列表
# 可以根据需要取消注释来添加更多交易所
recording_exchanges: list[Exchange] = [
Exchange.CFFEX, # 中国金融期货交易所
# Exchange.SHFE, # 上海期货交易所
# Exchange.DCE, # 大连商品交易所
# Exchange.CZCE, # 郑州商品交易所
# Exchange.GFEX, # 广州期货交易所
# Exchange.INE, # 上海国际能源交易中心
]
# 要录制数据的品种类型
# 可以根据需要取消注释来添加更多品种
recording_products: list[Product] = [
Product.FUTURES, # 期货品种
# Product.OPTION, # 期权品种
]
def run_recorder() -> None:
"""
运行行情录制程序
该函数是程序的主体,按照以下步骤工作:
1. 创建VeighNa核心组件(事件引擎、主引擎)
2. 添加交易接口和应用模块
3. 设置数据录制规则
4. 连接到交易所并开始录制数据
"""
# 创建事件引擎,负责系统内各模块间的通信
event_engine: EventEngine = EventEngine()
# 创建主引擎,管理系统功能模块,包括底层接口、上层应用等
main_engine: MainEngine = MainEngine(event_engine)
# 添加CTP接口,连接到期货市场
main_engine.add_gateway(CtpGateway)
# 添加数据录制引擎,用于录制Tick行情入库
recorder_engine: RecorderEngine = main_engine.add_app(DataRecorderApp)
# 定义合约订阅函数
def subscribe_data(event: Event) -> None:
"""
处理合约推送并订阅行情
当系统接收到合约信息后,根据预设的交易所和品种过滤条件,
自动为符合条件的合约添加行情录制任务。
参数:
event: 包含合约信息的事件对象
"""
# 从事件对象中获取合约数据
contract: ContractData = event.data
# 判断合约是否符合录制条件
if (
contract.exchange in recording_exchanges # 检查合约所属交易所是否在预设列表中
and contract.product in recording_products # 检查合约品种类型是否在预设列表中
):
# 添加该合约的行情录制任务,vt_symbol是VeighNa中的唯一标识符,格式为"代码.交易所"
recorder_engine.add_tick_recording(contract.vt_symbol) # 录制Tick数据
recorder_engine.add_bar_recording(contract.vt_symbol) # 录制分钟K线
# 注册合约事件处理函数,当有新合约信息推送时,会自动调用subscribe_data函数
event_engine.register(EVENT_CONTRACT, subscribe_data)
# 获取日志引擎并设置日志处理
log_engine: LogEngine = main_engine.get_engine("log")
def print_log(event: Event) -> None:
"""
处理数据录制模块的日志事件
将数据录制模块产生的日志信息输出到控制台和日志文件中,
便于监控录制过程和排查问题。
参数:
event: 包含日志信息的事件对象
"""
log_engine.logger.log(INFO, event.data)
# 注册日志事件处理函数,当有新的日志推送时,会自动调用print_log函数
event_engine.register(EVENT_RECORDER_LOG, print_log)
# 连接CTP接口并登录,第一个参数是接口设置,第二个参数是接口名称
main_engine.connect(ctp_setting, CtpGateway.default_name)
# 等待30秒,CTP接口连接后需要一段时间来完成初始化
sleep(30)
# 提示用户程序已经开始运行,用户可以根据需要随时退出
input(">>>>>> 高频行情数据录制已启动,正在记录数据。按回车键退出程序 <<<<<<")
# 关闭主引擎实现安全退出,避免出现内存中未入库数据的丢失
main_engine.close()
# Python程序的标准入口写法,直接运行此脚本时会执行run_recorder函数
if __name__ == "__main__":
run_recorder()
+180
View File
@@ -0,0 +1,180 @@
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"# 忽略各模块的警告信息\n",
"import warnings\n",
"warnings.filterwarnings(\"ignore\")"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"# 加载所需使用的模块\n",
"from datetime import datetime\n",
"\n",
"from vnpy.trader.datafeed import get_datafeed\n",
"from vnpy.trader.database import get_database, DB_TZ\n",
"from vnpy.trader.constant import Interval\n",
"from vnpy.trader.object import BarData, HistoryRequest\n",
"from vnpy.trader.utility import extract_vt_symbol\n",
"from vnpy.trader.setting import SETTINGS"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# 配置数据服务\n",
"SETTINGS[\"datafeed.name\"] = \"rqdata\" # 可以根据自己的需求选择数据服务:rqdata/xt/wind等\n",
"SETTINGS[\"datafeed.username\"] = \"license\" # RQData的用户名统一为“license”这个字符串\n",
"SETTINGS[\"datafeed.password\"] = \"123456\" # 这里需要替换为你购买或者申请试用的RQData数据license\n",
"\n",
"# 配置数据库\n",
"SETTINGS[\"database.name\"] = \"taos\" # 可以根据自己的需求选择数据库,这里使用的是TDengine\n",
"SETTINGS[\"database.database\"] = \"vnpy\"\n",
"SETTINGS[\"database.host\"] = \"127.0.0.1\"\n",
"SETTINGS[\"database.port\"] = 6030\n",
"SETTINGS[\"database.user\"] = \"root\"\n",
"SETTINGS[\"database.password\"] = \"taosdata\""
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"# 创建对象实例\n",
"datafeed = get_datafeed()\n",
"\n",
"database = get_database()"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"# 要下载数据的合约代码\n",
"vt_symbols = [\n",
" \"IF2501.CFFEX\",\n",
" \"IF2502.CFFEX\",\n",
" \"IF2503.CFFEX\",\n",
"\n",
" \"IH2501.CFFEX\",\n",
" \"IH2502.CFFEX\",\n",
" \"IH2503.CFFEX\",\n",
"\n",
" \"IC2501.CFFEX\",\n",
" \"IC2502.CFFEX\",\n",
" \"IC2503.CFFEX\",\n",
"\n",
" \"IM2501.CFFEX\",\n",
" \"IM2502.CFFEX\",\n",
" \"IM2503.CFFEX\",\n",
"]"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"# 要下载数据的起止时间\n",
"start = datetime(2025, 1, 1, tzinfo=DB_TZ)\n",
"end = datetime(2025, 3, 30, tzinfo=DB_TZ)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"下载数据成功:IF2501.CFFEX,总数据量:2880\n",
"下载数据成功:IF2502.CFFEX,总数据量:7440\n",
"下载数据成功:IF2503.CFFEX,总数据量:12240\n",
"下载数据成功:IH2501.CFFEX,总数据量:2880\n",
"下载数据成功:IH2502.CFFEX,总数据量:7440\n",
"下载数据成功:IH2503.CFFEX,总数据量:12240\n",
"下载数据成功:IC2501.CFFEX,总数据量:2880\n",
"下载数据成功:IC2502.CFFEX,总数据量:7440\n",
"下载数据成功:IC2503.CFFEX,总数据量:12240\n",
"下载数据成功:IM2501.CFFEX,总数据量:2880\n",
"下载数据成功:IM2502.CFFEX,总数据量:7440\n",
"下载数据成功:IM2503.CFFEX,总数据量:12240\n"
]
}
],
"source": [
"# 遍历列表执行下载\n",
"for vt_symbol in vt_symbols:\n",
" # 拆分合约代码和交易所\n",
" symbol, exchange = extract_vt_symbol(vt_symbol)\n",
"\n",
" # 创建历史数据请求对象\n",
" req: HistoryRequest = HistoryRequest(\n",
" symbol=symbol,\n",
" exchange=exchange,\n",
" start=start,\n",
" end=end,\n",
" interval=Interval.MINUTE # 这里下载最常用的1分钟K线\n",
" )\n",
"\n",
" # 从数据服务下载数据\n",
" bars: list[BarData] = datafeed.query_bar_history(req)\n",
"\n",
" # 如果下载成功则保存\n",
" if bars:\n",
" database.save_bar_data(bars)\n",
" print(f\"下载数据成功:{vt_symbol},总数据量:{len(bars)}\")\n",
" # 否则失败则打印信息\n",
" else:\n",
" print(f\"下载数据失败:{vt_symbol}\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.10.2"
}
},
"nbformat": 4,
"nbformat_minor": 4
}

Some files were not shown because too many files have changed in this diff Show More