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

写在前面

  笔者刚接触量化投资,对量化投资挺感兴趣,在闲暇时间进行量化投资的学习,只能进行少量资金进行量化实践。目前在进行基于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.
    """
    # Chinese
    CFFEX = "CFFEX"         # China Financial Futures Exchange
    SHFE = "SHFE"           # Shanghai Futures Exchange
    CZCE = "CZCE"           # Zhengzhou Commodity Exchange
    DCE = "DCE"             # Dalian Commodity Exchange
    INE = "INE"             # Shanghai International Energy Exchange
    SSE = "SSE"             # Shanghai Stock Exchange
    SZSE = "SZSE"           # Shenzhen Stock Exchange
    SGE = "SGE"             # Shanghai Gold Exchange
    WXE = "WXE"             # Wuxi Steel Exchange
    CFETS = "CFETS"         # China Foreign Exchange Trade System

    # Global
    SMART = "SMART"         # Smart Router for US stocks
    NYSE = "NYSE"           # New York Stock Exchnage
    NASDAQ = "NASDAQ"       # Nasdaq Exchange
    ARCA = "ARCA"           # ARCA Exchange
    EDGEA = "EDGEA"         # Direct Edge Exchange
    ISLAND = "ISLAND"       # Nasdaq Island ECN
    BATS = "BATS"           # Bats Global Markets
    IEX = "IEX"             # The Investors Exchange
    NYMEX = "NYMEX"         # New York Mercantile Exchange
    COMEX = "COMEX"         # COMEX of CME
    GLOBEX = "GLOBEX"       # Globex of CME
    IDEALPRO = "IDEALPRO"   # Forex ECN of Interactive Brokers
    CME = "CME"             # Chicago Mercantile Exchange
    ICE = "ICE"             # Intercontinental Exchange
    SEHK = "SEHK"           # Stock Exchange of Hong Kong
    HKFE = "HKFE"           # Hong Kong Futures Exchange
    HKSE = "HKSE"           # Hong Kong Stock Exchange
    SGX = "SGX"             # Singapore Global Exchange
    CBOT = "CBT"            # Chicago Board of Trade
    CBOE = "CBOE"           # Chicago Board Options Exchange
    CFE = "CFE"             # CBOE Futures Exchange
    DME = "DME"             # Dubai Mercantile Exchange
    EUREX = "EUX"           # Eurex Exchange
    APEX = "APEX"           # Asia Pacific Exchange
    LME = "LME"             # London Metal Exchange
    BMD = "BMD"             # Bursa Malaysia Derivatives
    TOCOM = "TOCOM"         # Tokyo Commodity Exchange
    EUNX = "EUNX"           # Euronext Exchange
    KRX = "KRX"             # Korean Exchange
    OTC = "OTC"             # OTC Product (Forex/CFD/Pink Sheet Equity)
    IBKRATS = "IBKRATS"     # Paper Trading Exchange of IB

    # CryptoCurrency
    BITMEX = "BITMEX"
    OKEX = "OKEX"
    HUOBI = "HUOBI"
    BITFINEX = "BITFINEX"
    BINANCE = "BINANCE"
    BYBIT = "BYBIT"         # bybit.com
    COINBASE = "COINBASE"
    DERIBIT = "DERIBIT"
    GATEIO = "GATEIO"
    BITSTAMP = "BITSTAMP"

    # Special Function
    LOCAL = "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
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
vn.py】CTP首次登陆修改密码 之 接口调用法 c++量化 阅读约 7 分钟 编辑 背景 最近一直在玩vn.py,上一篇文章vn.py开发环境搭建(windows)介绍了如何搭建二次开发环境,解决了一些搭建环境过程中遇到的坑。那么接下来这篇文章将解决运行期间的第一个问题。 开始vn.py 1.环境部署完成之后,启动examples/vn_trader/run.py,弹出启动页面。具体搭建过程参考vn.py开发环境搭建(windows)。 image.png 2。连接CTP,点击系统->连接CTP,弹出连接界面。 image.png 3.介绍一下个字段 用户名:在simnow注册的用户名6位数字 密码:登录simnow使用的密码 经纪商代码:9999 交易服务器地址:180.168.146.187:10101 行情服务器地址:180.168.146.187:10111 产品名称:simnow_client_test 授权码:0000000000000000 16个0 4.获取你的用户名和密码 登录http://www.simnow.com.cn/,从右上角的注册账号开始操作,这里就不讲了,大家自己鼓捣吧。 问题来了 所有准备工作做好后,点击连接,这时左下角会显示日志。 image.png 如果你是第一次登陆,那么会提示CTP首次登陆需要修改密码,这也就是我们今天要解决的问题 试图解决 刚看到这个问题觉得没什么,修改一下密码就可以了,但是。。。。。 首先没有再vn.py上找到可以修改密码的地方,后来想了想,也正常人家只是策略平台,也不仅仅是给CTP用, 所以去注册的地方simnow官网找找吧,但是。。。。 很遗憾仍然没有找到,这里不得不吐槽一下simnow了。是不是应该给个改密码的地方? 据说可以使用市场上的交易应用修改密码,大家可以去试试。或者大家有更好的方法也可以回复留言。 开始撸它 好吧,那么我们用程序员的方式来解决这个问题吧。 1.在vnpy/api/ctp目录下可以看到完整ctp开发的api,包括库和头文件。哈哈,是不是会让你产生非分之想? 2.我们在ThostFtdcTraderApi.h中发现了我们想要的东西 ///用户口令更新请求 virtual int ReqUserPasswordUpdate(CThostFtdcUserPasswordUpdateField *pUserPasswordUpdate, int nRequestID) = 0; 3.找到ctp api文档在simnow官网上可以找到,我这里用的事《综合交易平台TraderAPI接口说明.pdf》 4.开始撸代码吧,我显示在linux开始撸,后来发现我的操作系统编译器版本太低,当然升级版本应该可以解决,但升级gcc,glibc还是相当耗时的。所以后来移植到了windows,但工程还是linux风格,使用cmake构建,好在现在vs对cmake支持的不错。 5.继续撸,先贴一段吧 #include "ctp_trade_handler.h" #include "INIReader.h" #include int main(int argc, char* argv[]) { string a; INIReader reader("../conf/ctp.ini"); if (reader.ParseError() != 0) { std::cout << "Can't load 'test.ini'\n"; return 1; } std::cout << reader.GetInteger("user","BrokerID",9999) << endl; ctp_trade_handle ctp; ctp.CreateFtdcTraderApi(); ctp.RegisterFront("tcp://180.168.146.187:10100"); ctp.init(); //CThostFtdcReqAuthenticateField reqAuthenticate = { 0 }; //strcpy(reqAuthenticate.AppID, "simnow_client_test"); //strcpy(reqAuthenticate.UserID, "158477"); //strcpy(reqAuthenticate.AuthCode, "0000000000000000"); //strcpy(reqAuthenticate.BrokerID, "9999"); //ctp.ReqAuthenticate(&reqAuthenticate, 1); CThostFtdcReqUserLoginField reqUserLogin = { 0 }; strcpy(reqUserLogin.BrokerID,"9999"); strcpy(reqUserLogin.UserID,"158477"); strcpy(reqUserLogin.Password,"qwe123"); ctp.ReqUserLogin(&reqUserLogin, 1); std::cout <> a; CThostFtdcUserPasswordUpdateField reqUserPasswordUpdate = { 0 }; strcpy(reqUserPasswordUpdate.BrokerID, "9999"); strcpy(reqUserPasswordUpdate.UserID, "158477"); strcpy(reqUserPasswordUpdate.OldPassword, "qwe123"); strcpy(reqUserPasswordUpdate.NewPassword, a.c_str()); ctp.ReqUserPasswordUpdate(&reqUserPasswordUpdate, 3); std::cin >> a; ctp.exit(); return 0; } 代码很简单,这里就不多说了。目前只是为了解决我修改密码的需求,后续还会不断完善。 如有需要可以自己取来撸,代码托管地址:https://github.com/FrankXMX/c... 欢迎watch和star 5.使用上就是填写好你的相关信息,编译运行,输入新密码。得到屏幕输出。 6.回到vn.py,使用新密码重新连接ctp。 大功告成!!!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值