diff --git a/README.md b/README.md index 73bbb7e4..b3e27bef 100644 --- a/README.md +++ b/README.md @@ -1,83 +1,64 @@ # vn.py 基于python的开源交易平台开发框架 -## vn.py框架交流群 -QQ群号:262656087 +## Quick Start +1. 准备一台Windows 7 64位系统的电脑 +2. 安装[Anaconda](http://www.continuum.io/downloads),下载Python 2.7 32位版本,注意必须是32位 +3. 安装[MongoDB](https://www.mongodb.org/downloads#production),下载Windows 64-bit 2008 R2+版本 +4. 安装pymongo,在cmd中运行 + pip install pymongo -相关问题在这个里面问的答复最快。 +## 2016年vn.py项目计划 -## 2015/12/23项目状态 -完成了飞马和金仕达黄金T+D(浦发银行)的接口封装。 +首先要感谢所有vn.py用户,是你们的热情让vn.py项目在2015年从最初单纯的交易API接口Python封装一步步成长为现在较为全面的交易程序开发框架。 -其中vn.ksgold使用时,必须把ksgoldapi下的SLEdll复制到python.exe所在的文件夹下。 +截止2016年2月15日,vn.py项目在Github上收获了583个Star和362个Fork,且已有6位贡献者提交了代码。项目的用户包括:私募基金,证券自营、资管,期货公司,高校的金融研究院系,个人投资者等,机构用户加起来至少20多家(和作者交流过的)。 +###总结一下项目当前取得的进展 +1. 较为丰富的Python交易和数据API接口,基本覆盖了国内所有常规交易品种(股票、期货、期权),具体包括: + * CTP(vn.ctp) + * 飞马(vn.femas) + * LTS(vn.lts) + * 金仕达黄金(vn.ksgold) + * 金仕达期权(vn.ksotp) + * 通联数据(vn.datayes) -## 2015/12/9项目状态## -中间缺失了相当一段内容的更新,说明文档计划重新做一下了。 +2. 简洁易用的事件驱动引擎(vn.event),作为事件驱动型交易程序的核心 -本次更新的主要内容是vn.ksotp,金仕达期权API的封装接口(已经加入了vn.trader)。 +3. 针对如何使用API和事件驱动引擎开发交易程序的示例(vn.demo) -本套接口同时支持: -1. 现货期权(ETF、个股) -2. 股指期权 -3. 商品期权 +4. 开箱即用的实盘交易平台vn.trader(相比之下vn.demo仅建议学习用),整合了多种交易接口,并针对具体策略算法和功能开发提供了简洁易用的API,功能应用举例: + * 同时登录多个交易接口,在一套界面上监控多种市场的行情和多种资产账户的资金、持仓、委托、成交情况 + * 支持跨市场套利(CTP期货和LTS证券)、境内外套利(CTP期货和IB外盘)、多市场数据整合实时预测走势(CTP的股指期货数据、IB的外盘A50数据、Wind的行业指数数据)等策略应用 + * CTA策略引擎模块,在保持易用性的同时,允许用户针对CTA类策略运行过程中委托的报撤行为进行细粒度控制(降低交易滑点、实现高频策略) -使用前,必须把ksotpapi下的KSInterB2C.lkc(接口授权文件)放到python.exe所在的文件夹下。 +5. [官网](http://vnpy.org)和[知乎专栏](http://zhuanlan.zhihu.com/vn-py),内容目前主要是《Python量化交易平台开发教程系列》,以及vn.py项目进展的更新 -例如,把Anaconda安装在了D:\Anaconda下的话,就需要把KSInterB2C.lkc复制粘贴到D:\Anaconda文件夹,否则运行时Python虚拟机会捕获未知C++错误的异常。 +6. 官方交流QQ群262656087,管理较严格(定期清除长期潜水的成员) -另外需要测试账户的请联系南华期货高贝贝申请,15021816078,说vn.py群介绍,对方会提供。 +### 展望一下项目2016年的计划 -## 2015/4/24项目状态## -发布了基于vn.ctp的Demo,在vn.demo/ctpdemo文件夹下,可用于CTP柜台期货公司的手动交易。 +代码方面: +1. 完善飞创、易盛等相对小众接口的添加,这块将由社区驱动,作者主要负责代码检查和管理 +2. 整理vn.py项目中API的具体版本号,保证封装接口的对应,这点已经有多位用户提起过,项目初期没有做详细记录所以很多API的版本号一时都较难对上 +3. Linux上API的编译以及vn.trader支持 +4. 基于VirtualBox的vn.py开发环境镜像,解决部分用户反映项目初期不知该如何搭建开发环境的问题,这个镜像会由官方长期维护下去 -## 2015/4/20项目状态## -发布了用于展示如何使用vn.py框架开发的vn.demo,使用了vn.event和vn.lts模块,可以用于华宝证券LTS柜台的手动交易。 +文章方面: +1. 作者自己作为交易员的成长经历(这一年来收到好多人关于如何成为Quant、建议看什么书、怎么选学校等类似的问题,与其零散的回答不如介绍下自己的一些经历给大家参考可能更有帮助) +2. vn.trader的使用教程(目前基本除了代码里的注释什么都没有...) +3. 将ta-lib(技术分析)和quantlib(金融工程和量化)整合到vn.trader中应用的教程,解决目前策略开发过程中技术指标和量化函数缺乏的问题 +4. 一套关于开发基于股指交易ETF期权的CTA策略的教程(股指期货短时间内还看不到恢复的希望,咱得另谋出路) -demo的简单说明: +社区方面: +1. 重新建设官方网站,目前使用的是托管在Github Pages上的Hexo静态博客,一来功能比较有限,二来有些用户反映Github时不时会被墙,考虑基于Flask重建一个托管在国内的官网 +2. 有用户提出建设互动性更强的网站作为交流平台(如论坛或者知乎Q&A类似的模式),这点在考虑中,主要制约因素是作者参与的时间,可能考虑和更多的资深用户合作是个好主意? -- demoApi.py主要包含了程序的底层接口,对vn.lts中的API进行了简化封装 -- demoEngine.py主要包含了程序的中间层,负责调用底层接口 -- demoUi.py主要包含了用于数据监控和主动函数调用相关的GUI组件 -- demoMain.py包含了程序的主函数入口,双击运行 -- demoMain.pyw功能和demoMain.py一样,双击时会自动调用pythonw.exe运行(无cmd界面) +###最后,2016年,Happy Trading!!! -接下来将会发布几篇和vn.demo相关的教程在vnpy.org网站上。 - -## 2015/3/26项目状态## -因为有不少人问CTP的接口,正好我最近的项目也要用到,就把开发CTP封装的工作提前了。 - -CTP的python封装发布在vn.ctp文件夹下: - -1. 封装使用的API是最新支持期货交易所期权的6.3.0版本 -2. md部分已经完全经过了测试 -3. td部分只进行了少量测试,接下来几天会继续,测试仅会覆盖和交易相关的函数(银期转账等等测试大家有需要自己做吧) - -## 2015/3/3项目状态 ## -目前完成: - -1. 华宝证券的LTS API的python封装,发布在vn.lts文件夹下 -2. 事件驱动引擎,发布在vn.event文件夹下 - -### vn.lts ### -ltsapi:华宝证券官方的LTS C++ API -pyscript:用于自动生成重复度较高的封装代码的python脚本 -vnltsmd:行情API的封装源代码和测试脚本 -vnltstd:交易API的封装源代码和测试脚本 - -### vn.event ### -eventType:定义事件类型常量 -eventEngine:包含事件驱动引擎实现 - -## 下一步计划 ## -1. API封装、编译、使用方面的教程 -2. 事件驱动引擎原理、使用方面的教程 -3. 基于API和引擎开发的LTS交易客户平台(因为华宝没有提供官方的LTS交易软件,目前的两个实现分别是基于C++的尔易终端和基于.COM封装的盈佳终端) -4. 策略引擎接口 - ## 联系作者 ## -作者知乎名:用python的trader,想要联系作者可以通过知乎私信。 +作者知乎名:用python的trader,想要联系作者可以通过知乎私信 ## License ## MIT diff --git a/vn.lts/vnltsmd/vnltsmd/vnltsmd.h b/vn.lts/vnltsmd/vnltsmd/vnltsmd.h index fa33dd8e..b7ebc928 100644 --- a/vn.lts/vnltsmd/vnltsmd/vnltsmd.h +++ b/vn.lts/vnltsmd/vnltsmd/vnltsmd.h @@ -14,7 +14,7 @@ #include //pythonװ #include //е̹߳ #include //е̹߳ -#include //еʵ +#include //еʵ //API #include "SecurityFtdcMdApi.h" diff --git a/vn.trader/ContractData.vt b/vn.trader/ContractData.vt new file mode 100644 index 00000000..0d5cad63 Binary files /dev/null and b/vn.trader/ContractData.vt differ diff --git a/vn.trader/ctaAlgo/ctaEngine.py b/vn.trader/ctaAlgo/ctaEngine.py index efbbf305..3835ab55 100644 --- a/vn.trader/ctaAlgo/ctaEngine.py +++ b/vn.trader/ctaAlgo/ctaEngine.py @@ -326,8 +326,12 @@ class CtaEngine(object): """初始化策略""" if name in self.strategyDict: strategy = self.strategyDict[name] - strategy.inited = True - strategy.onInit() + + if not strategy.inited: + strategy.inited = True + strategy.onInit() + else: + self.writeCtaLog(u'请勿重复初始化策略实例:%s' %name) else: self.writeCtaLog(u'策略实例不存在:%s' %name) diff --git a/vn.trader/ctaAlgo/ctaTemplate.py b/vn.trader/ctaAlgo/ctaTemplate.py index 66c5b104..c69650da 100644 --- a/vn.trader/ctaAlgo/ctaTemplate.py +++ b/vn.trader/ctaAlgo/ctaTemplate.py @@ -113,20 +113,20 @@ class CtaTemplate(object): if self.trading: # 如果stop为True,则意味着发本地停止单 if stop: - orderID = self.ctaEngine.sendStopOrder(self.vtSymbol, orderType, price, volume, self) + vtOrderID = self.ctaEngine.sendStopOrder(self.vtSymbol, orderType, price, volume, self) else: - orderID = self.ctaEngine.sendOrder(self.vtSymbol, orderType, price, volume, self) - return orderID + vtOrderID = self.ctaEngine.sendOrder(self.vtSymbol, orderType, price, volume, self) + return vtOrderID else: return None #---------------------------------------------------------------------- - def cancelOrder(self, orderID): + def cancelOrder(self, vtOrderID): """撤单""" - if STOPORDERPREFIX in orderID: - self.ctaEngine.cancelStopOrder(orderID) + if STOPORDERPREFIX in vtOrderID: + self.ctaEngine.cancelStopOrder(vtOrderID) else: - self.ctaEngine.cancelOrder(orderID) + self.ctaEngine.cancelOrder(vtOrderID) #---------------------------------------------------------------------- def insertTick(self, tick): diff --git a/vn.trader/ksgoldGateway/ksgoldGateway.py b/vn.trader/ksgoldGateway/ksgoldGateway.py index a92a2600..e37d0556 100644 --- a/vn.trader/ksgoldGateway/ksgoldGateway.py +++ b/vn.trader/ksgoldGateway/ksgoldGateway.py @@ -109,8 +109,6 @@ class KsgoldGateway(VtGateway): #---------------------------------------------------------------------- def close(self): """关闭""" - if self.mdConnected: - self.mdApi.close() if self.tdConnected: self.tdApi.close() diff --git a/vn.trader/uiBasicWidget.py b/vn.trader/uiBasicWidget.py index 12003bf8..3f7a5c02 100644 --- a/vn.trader/uiBasicWidget.py +++ b/vn.trader/uiBasicWidget.py @@ -910,10 +910,10 @@ class TradingWidget(QtGui.QFrame): # 查询合约 if exchange: vtSymbol = '.'.join([symbol, exchange]) - contract = self.dataEngine.getContract(vtSymbol) + contract = self.mainEngine.getContract(vtSymbol) else: vtSymbol = symbol - contract = self.dataEngine.getContract(symbol) + contract = self.mainEngine.getContract(symbol) if contract: gatewayName = contract.gatewayName