【vn.py学习笔记(六)】vn.py constant源码阅读、委托生命周期

  • 写在前面
  • 1 constant
    • 1.1 Direction
    • 1.2 Offset
    • 1.3 Status
    • 1.4 Product
    • 1.5 OrderType
    • 1.6 OptionType
    • 1.7 Exchange
    • 1.8 Curency
    • 1.9 Interval
  • 2 object
  • 3 setting
  • 4 委托的生命周期
    • 4.1 on_tick的K线合成
    • 4.2 on_order的推送时机
    • 4.3 on_trader的持仓更新
  • 学习资料

写在前面

  笔者刚接触量化投资,对量化投资挺感兴趣,在闲暇时间进行量化投资的学习,只能进行少量资金进行量化实践。目前在进行基于vnpy的A股市场的量化策略学习,主要尝试攻克的技术难点在:A股市场日线数据的免费获取维护、自动下单交易、全市场选股程序、选股策略的回测程序、基于机器学习的股票趋势预测。
  现阶段的学习任务是阅读vn.py的源码,学习vn.py架构机制,在学习的过程中,会以分享的形式记录,以加深对vn.py的理解,有不对的地方欢迎大家批评指正。
  分享的github仓库:https://github.com/PanAndy/quant_share。

觉得文章有收获,欢迎关注公众号鼓励一下作者呀~
在学习的过程中,也搜集了一些量化、技术的视频及书籍资源,欢迎大家关注公众号【亚里随笔】获取


  仍然关注vnpy/trader下的核心代码,这次先来看vnpy/trader/constant.py、vnpy/trader/object.py和vnpy/trader/setting.py,这块没有什么难以理解的内容;然后来梳理一下vn.py委托的生命周期,这块是我在学习vn.py官方的教程时很难理解的地方,但对将来精细化交易控制非常重要,借此机会梳理一下。下一篇内容将来介绍vnpy/trader对rqdata的封装。同样,参考的学习资料也会引用。

1 constant

  vnpy/trader/constant.py文件下主要定义了vn.py核心代码所使用的常量,包括九大常量:Direction、Offset、Status、Product、OrderType、OptionType、Exchange、Currency、Interval。

1.1 Direction

  Direction定义了订单/交易/仓位的方向枚举值,一般分LONG、SHORT、NET,期货品种具有多空方向,而股票品种方向为“净”持仓。

class Direction(Enum):"""Direction of order/trade/position."""LONG = "多"SHORT = "空"NET = "净"

1.2 Offset

  Offset指期货开平,包含两种交易行为,期货开仓和期货平仓。开仓也叫建仓,是指交易者新买入或新卖出一定数量的期货合约。平仓是指通过一笔数量相等、方向相反的期货交易来冲销期货合约,以此来了结期货交易,解除到期进行实物交割的义务。

class Offset(Enum):"""Offset of order/trade.平今 就是平掉今天的仓单,平 就是平掉历史仓单中国只有上海期货交易所才严格区分“平仓”和”平今“,当天建的仓单只能用“平今”指令才能平掉郑州和大连的对此不做区分大商所的平今单不收手续费,鼓励作短线"""NONE = ""OPEN = "开"CLOSE = "平"CLOSETODAY = "平今"CLOSEYESTERDAY = "平昨"

1.3 Status

  Status枚举值定义了vn.py系统内定单的状态,包括提交中、未成交、部分成交、全部成交、已撤销、拒单。vn.py发出委托同时本地缓存委托相关信息,这时状态就是“提交中”,然后等待委托回报。交易所收到用户发送的委托,将其插入到中央订单簿来进行撮合成交,并推送委托回报给用户,根据委托回报:若委托还未成交,这时的委托状态是“未成交”;若委托立刻成交,委托状态变成“全部成交”;同样,委托可能只有部分成交的情况,这时就是“部分成交”;被交易所拒绝下单的状态为“拒单”。vn.py还可以发出取消委托命令,此时,定单的状态就是“已撤销”。

class Status(Enum):"""Order status."""SUBMITTING = "提交中"NOTTRADED = "未成交"PARTTRADED = "部分成交"ALLTRADED = "全部成交"CANCELLED = "已撤销"REJECTED = "拒单"

1.4 Product

  Product枚举值定义了合约的类型,共11类。

class Product(Enum):"""Product class."""EQUITY = "股票"FUTURES = "期货"OPTION = "期权"INDEX = "指数"FOREX = "外汇"SPOT = "现货"ETF = "ETF"BOND = "债券"WARRANT = "权证"SPREAD = "价差"FUND = "基金"

1.5 OrderType

  OrderType枚举值定义了vn.py系统内的订单类型。

  • 限价单,指买卖委托中设有低于市场价格的买进价格,或高于市场价格的卖出价格,当市场价格达到其设定的价格时,即成交。限价单会面临委托设定的价格可能不会达到成无法成交的风险。
  • 市价单,在委托中不规定买入或卖出的价格,而要求经纪人按当时的市场价格来购买或出售股票的行。
  • 停止单,也称止损委托单。买进停止单将给出一个高于市价的价格,一旦上涨至停止单价格,委托单则开始生效,变为市价委托单,这种委托单称为有条件的市价委托单。卖出停止单的价格将低于市场价格。比如,以做多为例,一般想的是价格跌到多少的时候买进,Long 170表示如果价格低于170,就买入,这是限价单;而如果我们想要价格上涨到多少的时候买进,Long 170就表示如果价格高于170,就买入,这就是停止单。停止单也可以看作是一种预埋单。
  • FAK,立即成交剩余指令自动撤销指令,指在限定价位下达指令,如果该指令下部分申报手数成交,该指令剩余申报手数自动被系统撤销。比如,FAK 下100手,一次成交了50手,只剩余未成交的50手委托被撤销。FAK指令下,可以设定最小成交数量,也可以不设。
  • FOK,立即全部成交否则自动撤销指令,指在限定价位下单指令,如果该指令下所有申报手数未能全部成交,该指令下所有申报手数自动被系统撤销。能一次成交完就一次成交,不能一次成交完,就撤销。
  • RFQ,发送询价单后,就在交易所上建立唯一且可交易的工具,并请求市场参与者显示指定工具的买卖价格,类似于经纪商打电话向交易大厅询价,交易者无义务就提交的询价单进行交易。
class OrderType(Enum):"""Order type."""LIMIT = "限价"MARKET = "市价"STOP = "STOP"FAK = "FAK"FOK = "FOK"RFQ = "询价"

1.6 OptionType

  OptionType指期权类型:

class OptionType(Enum):"""Option type."""CALL = "看涨期权"PUT = "看跌期权"

1.7 Exchange

  Exchange中列出了vn.py支持的所有交易所,另外还添加了本地模拟交易。

class Exchange(Enum):"""Exchange."""# ChineseCFFEX = "CFFEX"         # China Financial Futures ExchangeSHFE = "SHFE"           # Shanghai Futures ExchangeCZCE = "CZCE"           # Zhengzhou Commodity ExchangeDCE = "DCE"             # Dalian Commodity ExchangeINE = "INE"             # Shanghai International Energy ExchangeSSE = "SSE"             # Shanghai Stock ExchangeSZSE = "SZSE"           # Shenzhen Stock ExchangeSGE = "SGE"             # Shanghai Gold ExchangeWXE = "WXE"             # Wuxi Steel ExchangeCFETS = "CFETS"         # China Foreign Exchange Trade System# GlobalSMART = "SMART"         # Smart Router for US stocksNYSE = "NYSE"           # New York Stock ExchnageNASDAQ = "NASDAQ"       # Nasdaq ExchangeARCA = "ARCA"           # ARCA ExchangeEDGEA = "EDGEA"         # Direct Edge ExchangeISLAND = "ISLAND"       # Nasdaq Island ECNBATS = "BATS"           # Bats Global MarketsIEX = "IEX"             # The Investors ExchangeNYMEX = "NYMEX"         # New York Mercantile ExchangeCOMEX = "COMEX"         # COMEX of CMEGLOBEX = "GLOBEX"       # Globex of CMEIDEALPRO = "IDEALPRO"   # Forex ECN of Interactive BrokersCME = "CME"             # Chicago Mercantile ExchangeICE = "ICE"             # Intercontinental ExchangeSEHK = "SEHK"           # Stock Exchange of Hong KongHKFE = "HKFE"           # Hong Kong Futures ExchangeHKSE = "HKSE"           # Hong Kong Stock ExchangeSGX = "SGX"             # Singapore Global ExchangeCBOT = "CBT"            # Chicago Board of TradeCBOE = "CBOE"           # Chicago Board Options ExchangeCFE = "CFE"             # CBOE Futures ExchangeDME = "DME"             # Dubai Mercantile ExchangeEUREX = "EUX"           # Eurex ExchangeAPEX = "APEX"           # Asia Pacific ExchangeLME = "LME"             # London Metal ExchangeBMD = "BMD"             # Bursa Malaysia DerivativesTOCOM = "TOCOM"         # Tokyo Commodity ExchangeEUNX = "EUNX"           # Euronext ExchangeKRX = "KRX"             # Korean ExchangeOTC = "OTC"             # OTC Product (Forex/CFD/Pink Sheet Equity)IBKRATS = "IBKRATS"     # Paper Trading Exchange of IB# CryptoCurrencyBITMEX = "BITMEX"OKEX = "OKEX"HUOBI = "HUOBI"BITFINEX = "BITFINEX"BINANCE = "BINANCE"BYBIT = "BYBIT"         # bybit.comCOINBASE = "COINBASE"DERIBIT = "DERIBIT"GATEIO = "GATEIO"BITSTAMP = "BITSTAMP"# Special FunctionLOCAL = "LOCAL"         # For local generated data

1.8 Curency

class Currency(Enum):"""Currency."""USD = "USD"HKD = "HKD"CNY = "CNY"

1.9 Interval

  Bar数据的周期。

class Interval(Enum):"""Interval of bar data."""MINUTE = "1m"HOUR = "1h"DAILY = "d"WEEKLY = "w"TICK = "tick"

2 object

  vnpy/trader/object.py文件里定义了vn.py系统内使用的数据类,包括BaseData、TickData、OrderData、TraderData、PositionData、AccountData、LogData、ContractData、SubScribeRequest、OrderRequest、CancelRequest、HistoryRequest。从命名就可以看出分为两类,数据类和请求类。源码就不在这贴了,感兴趣的可以自己打开看看。

3 setting

  vnpy/trader/setting.py文件里定义了SETTINGS字典,主要是vntrader运行时的配置,包括字体、日志、邮件、rqdata、数据库、rpc等设置,对应UI启动的配置里。SETTING字典里的内容都会同步到vt_setting.json文件内。源码不必贴。

4 委托的生命周期

  这部分内容是在vn.py社区里《CTA策略复杂交易算法实现》里学习到的,刚好源码读到Status部分,就把这块内容整理一下,作为学习笔记的一部分。将来《CTA策略复杂交易算法实现》课程我也会单独整理一份学习笔记的,一步一步来~

4.1 on_tick的K线合成

  当收到一个tick的时候,vn.py的操作如下图所示。而至于如何处理tick、如何合成k线、如何合成N分钟K线都是开放给用户的,用户可以在策略里进行实现、处理策略逻辑等。

4.2 on_order的推送时机

  order创建以后,它的6种状态可以分为两类:活动的和结束的,所谓活动的order就是order还在生命周期内,还没有结束,处于活动状态的order状态有提交中、未成交和部分成交三种状态;所谓结束的order就是order已经结束了它的生命周期,不会有后续了,处于结束状态的order状态有拒单、撤单、全成。理解这个活动状态的order之后,对后面代码里active_orders的维护会有更好的理解。状态如下图所示:

4.3 on_trader的持仓更新

  vn.py内,持仓更新的逻辑为委托在交易所成交以后,交易所回报给vn.py,vn.py收到委托回报推送后,调用on_order回调函数表示收到成交推送,然后更新策略pos,最后调用on_trade,表示交易结束。on_trader持仓更新流程图如下图所示。

学习资料

  1. 期货交易中开平有三个选项,有个是平今仓,什么意思啊
  2. vn.py项目文档
  3. FOK 和FAK指令说明书
  4. vn.py社区服务公众号:vnpy-community

【vn.py学习笔记(六)】vn.py constant源码阅读、委托生命周期相关推荐

  1. Qt学习笔记,再次分析EVA源码之后得出的结论-QListView,QListViewItem(Qt3);Q3ListView,Q3ListViewItem(Qt4)...

    Qt学习笔记,再次分析EVA源码之后得出的结论-QListView,QListViewItem(Qt3);Q3ListView,Q3ListViewItem(Qt4) 今天再次分析了Eva的源码,也看 ...

  2. Ui学习笔记---EasyUI的EasyLoader组件源码分析

    Ui学习笔记---EasyUI的EasyLoader组件源码分析 技术qq交流群:JavaDream:251572072   1.问题1:为什么只使用了dialog却加载了那么多的js   http: ...

  3. Netty网络框架学习笔记-16(心跳(heartbeat)服务源码分析)

    Netty网络框架学习笔记-16(心跳(heartbeat)服务源码分析_2020.06.25) 前言: Netty 作为一个网络框架,提供了诸多功能,比如编码解码等,Netty 还提供了非常重要的一 ...

  4. Kubernetes学习笔记之Calico CNI Plugin源码解析(二)

    女主宣言 今天小编继续为大家分享Kubernetes Calico CNI Plugin学习笔记,希望能对大家有所帮助. PS:丰富的一线技术.多元化的表现形式,尽在"360云计算" ...

  5. Kubernetes学习笔记之Calico CNI Plugin源码解析(一)

    女主宣言 今天小编为大家分享Kubernets Calico CNI Plugin的源码学习笔记,希望对正在学习k8s相关部分的同学有所帮助: PS:丰富的一线技术.多元化的表现形式,尽在" ...

  6. Delphi-IOCP学习笔记九======性能测试和IOCP源码下载5000个连接数

    刚刚的测试,服务端上图 开了5个客户端<每个客户端1000>进行测试. 内存视乎不是很多.客户端的发过来的数据包大小在4096+88字节左右. 测试Echo测试线程 procedure T ...

  7. NODEMCU学习笔记-01 esp8266 WIFI杀手 源码上传版

    NODEMCU学习笔记-01 esp8266WIFI杀手 动手前的准备 NODEMCU和ESP8266 ARDUINO IDE GITHUB CSDN 让我们开始吧 连接开发板并安装驱动 安装ardu ...

  8. [OC学习笔记]分类和关联对象源码解析

    我们平时在开发的时候经常会使用分类来添加方法.协议.属性,但在添加属性的时候属性是不会自动生成成员变量的,这时候我们就需要关联对象来动态存储属性值. 分类 @interface NSObject(St ...

  9. MyBatis源码学习笔记(从设计模式看源码)

    文章目录 1.源码分析概述 ①.Mybatis架构分析 ②.门面模式 ③.设计模式的原则 2.日志模块分析 ①.适配器模型 ②.动态代理 ③.日志模块分析 3.数据源模块分析 ①.工厂模式 ②.数据源 ...

最新文章

  1. mmse评估量表_简易精神状态评价量表(mmse量表) 打印版.doc
  2. POJ1734(floyd求最小环的路径)
  3. c# 正则表达式 html标签,C#匹配HTML标签,正则表达式谁会?
  4. ubuntu mysql 内存满了_Ubuntu mysql可以把data防止到内存盘中
  5. python def函数报错详解_python自定义函数def的应用详解
  6. C#调用系统蜂鸣(需要发出警告时挺好用的 即使没有声卡)
  7. weblogic集群部署与负载均衡_集群,负载均衡,分布式的讲解和多台服务器代码同步...
  8. springcloud服务网关-gateway
  9. 【玩转win7之简单几步为闪存盘加密】
  10. Java中的random
  11. cmd 复制文件夹内容
  12. cactiez mysql_CactiEz 无法登陆 、重启不画图处理
  13. html表格上下居中 w3c,HTML中怎么把表格居中
  14. 基于AE的GIS二次开发作业文档
  15. 使用UltraISO制作U盘系统启动盘图文教程
  16. 魅族开机卡flyme转圈圈
  17. 解决克隆虚拟机后无法上网问题(亲测有效)
  18. 支持tcam的服务器,一种支持TCAM规则更新与压缩方法.doc
  19. launchOptions利用userActivity呼起app设置
  20. WooCommerce Product Feed指南 – Google Shopping和Facebook[2022]

热门文章

  1. C++ 冒泡排序时间复杂度测试
  2. MySQL数据库常用命令大全(完整)(表格形式)
  3. Collection介绍(转载)
  4. java可变参数特性
  5. 网络上收集的有关七田真1000幅图训练方法
  6. linux怎么找回误删的文件,Linux恢复误删除的文件或者目录
  7. 你需要改掉的Python开发习惯(五)
  8. linux下C的GBD调试学习笔记
  9. 清除流氓软件工具大合集,欢迎补充!
  10. imgui绘图框架使用