maxwell中对box设置zsize为slugframe.size.height 44是什么意思

【2017年整理】Maxwell基础教程仿真实例doc下载_爱问共享资料
【2017年整理】Maxwell基础教程仿真实例.doc
【2017年整理】Maxwell基础教程仿真实例.doc
【2017年整理】Maxwell基础教程仿真实例.doc
简介:本文档为《【2017年整理】Maxwell基础教程仿真实例doc》,可适用于高等教育领域,主题内容包含【年整理】Maxwell基础教程仿真实例说明:部分操作因版本不同存在差异静电场问题实例:平板电容器电容计算仿真平板电容器模型描述:上下两极板尺寸:m符等。
侵权或盗版
*若权利人发现爱问平台上用户上传内容侵犯了其作品的信息网络传播权等合法权益时,请按照平台要求书面通知爱问!
赌博犯罪类
添加成功至
资料评价:
所需积分:0[讲解]Maxwell仿真实例doc下载_爱问共享资料
[讲解]Maxwell仿真实例.doc
[讲解]Maxwell仿真实例.doc
[讲解]Maxwell仿真实例.doc
简介:本文档为《[讲解]Maxwell仿真实例doc》,可适用于初中教育领域,主题内容包含讲解Maxwell仿真实例静电场问题实例:平板电容器电容计算仿真平板电容器模型描述:上下两极板尺寸:mmmmmm材料:pec(理想导体)介质尺寸:m符等。
侵权或盗版
*若权利人发现爱问平台上用户上传内容侵犯了其作品的信息网络传播权等合法权益时,请按照平台要求书面通知爱问!
赌博犯罪类
添加成功至
资料评价:
所需积分:0vn.pyvn.py基于python的开源交易平台开发框架关注专栏更多最新文章{&debug&:false,&apiRoot&:&&,&paySDK&:&https:\u002F\\u002Fapi\u002Fjs&,&wechatConfigAPI&:&\u002Fapi\u002Fwechat\u002Fjssdkconfig&,&name&:&production&,&instance&:&column&,&tokens&:{&X-XSRF-TOKEN&:null,&X-UDID&:null,&Authorization&:&oauth c3cef7c66aa9e6a1e3160e20&}}{&database&:{&Post&:{&&:{&title&:&vnpy接收行情数据性能测试与改进优化&,&author&:&jerry-he-20&,&content&:&近来,量化交易平台vnpy因其开源、功能强大、开发容易、可定制性强的特点,目前已经被广泛应用在量化交易中。 行情数据落地是量化交易平台必须解决的一个基础问题,它有两个方面的作用:一是供策略开发时进行分析、回测;二是为实盘程序时提供近期的历史数据。前者可以通过传统效率更高的实现方式(比如我们有基于C++和leveldb实现的行情数据接收、转发、历史数据获取程序)实现,也可以通过向数据提供方购买获取。但是对于后者,直接基于vnpy落地近期的数据更为简易的方式。\u003Cbr\u003E\u003Cp\u003Evnpy包含行情落地模块dataRecorder,已经实现了tick数据、分钟bar数据保存功能。 本工作主要包括:\u003C\u002Fp\u003E\u003Cul\u003E\u003Cli\u003Evnpy原落地函数的性能考查\u003C\u002Fli\u003E\u003Cli\u003E针对CTP接口,原落地函数的修正与优化\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cp\u003E以下所有性能测试时间单位均为毫秒。\u003C\u002Fp\u003E\u003Cp\u003E测试基于windows 7, i7 3.4GHz.\u003C\u002Fp\u003E\u003Cbr\u003EIn [1]:\u003Cbr\u003E\u003Ccode lang=\&text\&\u003Efrom datetime import datetime, time\nimport time as gtime\nimport pymongo\nfrom dateutil.parser import parse\n\u003C\u002Fcode\u003E\u003Cbr\u003E\u003Ch2\u003E重构vnpy接收行情数据代码,以用于测试\u003C\u002Fh2\u003E\u003Cbr\u003EIn [2]:\u003Cbr\u003E\u003Ccode lang=\&text\&\u003ETICK_DB_NAME='Test'\n\nEMPTY_STRING = ''\nEMPTY_UNICODE = u''\nEMPTY_INT = 0\nEMPTY_FLOAT = 0.0\n\nclass DrTickData(object):\n
\&\&\&Tick数据\&\&\&\n\n
#----------------------------------------------------------------------\n
def __init__(self):\n
\&\&\&Constructor\&\&\&
self.vtSymbol = EMPTY_STRING
# vt系统代码\n
self.symbol = EMPTY_STRING
# 合约代码\n
self.exchange = EMPTY_STRING
# 交易所代码\n\n
# 成交数据\n
self.lastPrice = EMPTY_FLOAT
# 最新成交价\n
self.volume = EMPTY_INT
# 最新成交量\n
self.openInterest = EMPTY_INT
# 持仓量\n
self.upperLimit = EMPTY_FLOAT
# 涨停价\n
self.lowerLimit = EMPTY_FLOAT
# 跌停价\n
# tick的时间\n
self.date = EMPTY_STRING
self.time = EMPTY_STRING
self.datetime = None
# python的datetime时间对象\n
# 五档行情\n
self.bidPrice1 = EMPTY_FLOAT\n
self.bidPrice2 = EMPTY_FLOAT\n
self.bidPrice3 = EMPTY_FLOAT\n
self.bidPrice4 = EMPTY_FLOAT\n
self.bidPrice5 = EMPTY_FLOAT\n
self.askPrice1 = EMPTY_FLOAT\n
self.askPrice2 = EMPTY_FLOAT\n
self.askPrice3 = EMPTY_FLOAT\n
self.askPrice4 = EMPTY_FLOAT\n
self.askPrice5 = EMPTY_FLOAT
self.bidVolume1 = EMPTY_INT\n
self.bidVolume2 = EMPTY_INT\n
self.bidVolume3 = EMPTY_INT\n
self.bidVolume4 = EMPTY_INT\n
self.bidVolume5 = EMPTY_INT\n
self.askVolume1 = EMPTY_INT\n
self.askVolume2 = EMPTY_INT\n
self.askVolume3 = EMPTY_INT\n
self.askVolume4 = EMPTY_INT\n
self.askVolume5 = EMPTY_INT
\ndef insertData(db,collection,data):\n
client[db][collection].insert(data.__dict__)\n\ndef procecssTickEvent(tick, insertDB=False):\n
\&\&\&处理行情推送\&\&\&\n
vtSymbol = tick.vtSymbol\n\n
# 转化Tick格式\n
drTick = DrTickData()\n
d = drTick.__dict__\n
for key in d.keys():\n
if key != 'datetime':\n
d[key] = tick.__dict__[key]\n
drTick.datetime = datetime.strptime(' '.join([tick.date, tick.time]), '%Y%m%d %H:%M:%S.%f')
# 更新Tick数据\n
if insertDB:\n
insertData(TICK_DB_NAME, vtSymbol, drTick)
\n\u003C\u002Fcode\u003E\u003Cbr\u003E\u003Ch2\u003E创建一个用于测试的Tick数据\u003C\u002Fh2\u003E\u003Cbr\u003EIn [3]:\u003Cbr\u003E\u003Ccode lang=\&text\&\u003Eclient=pymongo.MongoClient()\ndata=client['VnTrader_Tick_Db']['rb1705'].find_one({})\ndel data['_id']\n\nclass InputTick: pass\ntick=InputTick()\ntick.__dict__.update(data)\nprint tick.__dict__\n\u003C\u002Fcode\u003E\u003Cbr\u003E\u003Ccode lang=\&text\&\u003E{u'askPrice2': 0.0, u'lastPrice': 2977.0, u'exchange': u'UNKNOWN', u'bidVolume5': 0, u'bidVolume4': 0, u'bidVolume3': 0, u'bidVolume2': 0, u'bidVolume1': 1551, u'datetime': datetime.datetime(, 21, 27, 36, 500000), u'askVolume1': 120, u'askVolume3': 0, u'askVolume2': 0, u'askVolume5': 0, u'askVolume4': 0, u'date': u'', u'askPrice5': 0.0, u'volume': 392068, u'lowerLimit': 2725.0, u'bidPrice5': 0.0, u'bidPrice4': 0.0, u'bidPrice1': 2976.0, u'bidPrice3': 0.0, u'bidPrice2': 0.0, u'vtSymbol': u'rb1705', u'time': u'21:27:36.5', u'openInterest': , u'askPrice4': 0.0, u'askPrice3': 0.0, u'symbol': u'rb1705', u'askPrice1': 2977.0, u'upperLimit': 3136.0}\n\u003C\u002Fcode\u003E\u003Cbr\u003E\u003Ch2\u003E测试原版函数性能\u003C\u002Fh2\u003E\u003Cbr\u003EIn [4]:\u003Cbr\u003E\u003Ccode lang=\&text\&\u003Edef profiling(count,func=None):\n
if func==None: func=lambda: procecssTickEvent(tick)\n
t0=gtime.time()\n
for i in range(count):\n
total_time=(gtime.time()-t0)\n
return total_time*Fcount\n\ntest_count=10000\n\u003C\u002Fcode\u003EIn [5]:\u003Cbr\u003E\u003Ccode lang=\&text\&\u003Eoriginal_nodb=profiling(test_count)\nclient.drop_database(TICK_DB_NAME)\noriginal_db=profiling(test_count,func=lambda: procecssTickEvent(tick,insertDB=True))\nprint '原版不保存数据到mongodb单次耗时:%.4f' %original_nodb\nprint '原版含保存数据到mongodb单次耗时:%.4f' %original_db\n\u003C\u002Fcode\u003E\u003Cbr\u003E\u003Ccode lang=\&text\&\u003E原版不保存数据到mongodb单次耗时:0.0255\n原版含保存数据到mongodb单次耗时:0.2334\n\u003C\u002Fcode\u003E\u003Cbr\u003E\u003Ch2\u003E改进版本\u003C\u002Fh2\u003E\u003Cp\u003E原版程序使用CTP接口保存期货数据时,存在几个问题:\u003C\u002Fp\u003E\u003Cul\u003E\u003Cli\u003E非交易时间收到的野数据没有被过滤掉\u003C\u002Fli\u003E\u003Cli\u003E当前各交易所提供的date字段混乱,有的使用真实日期,有的使用交易日,导致计算的datetime字段也是有问题的\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cp\u003E针对以上问题的改进版本如下:\u003C\u002Fp\u003E\u003Cbr\u003EIn [6]:\u003Cbr\u003E\u003Ccode lang=\&text\&\u003E#过滤掉的时间区间,注意集合竞价tick被过滤了。\ninvalid_sections=[(time(2,30,59),time(9,0,0)),\n
(time(11,30,59),time(13,0,0)),\n
(time(15,15,0),time(21,0,0))]\n\n#本地时间在此区间时对收到的Tick数据不处理,避免有时期货公司会抽风把数据重推一次。\ninvalid_local_section=(time(5,0,0),time(8,30,0))\n\ndef procecssTickEvent(tick, insertDB=False):\n
\&\&\&处理行情推送\&\&\&\n
# 1. 本地时间检查\n
local_datetime=datetime.now()\n
local_time=local_datetime.time()\n
if local_time&invalid_local_section[0] and local_time&invalid_local_section[1]:\n
return\n\n
# 2. 转化Tick格式\n
drTick = DrTickData()\n
d = drTick.__dict__\n
for key in d.keys():\n
if key != 'datetime':\n
d[key] = tick.__dict__[key]\n\n
#防御时间格式变为 ”9:00:00.5\&\n
if tick.time[2] != ':': \n
tick.time = '0' + tick.time\n
tick_hour = int(tick.time[0:2])
local_hour = local_time.hour\n
real_date=local_datetime\n
if tick_hour == 23 and local_hour == 0:#行情时间慢于系统时间\n
real_date+=timedelta(-1)\n
elif tick_hour == 0 and local_hour == 23:#系统时间慢于行情时间\n
real_date+=timedelta(1)\n\n
tick.time = tick.time.ljust(12,'0')\n
drTick.datetime = datetime(real_date.year,real_date.month,real_date.day,\n
int(tick.time[0:2]), int(tick.time[3:5]), int(tick.time[6:8]), int(tick.time[9:12])*1000)\n\n
tmpTime=drTick.datetime.time()\n
for sec in invalid_sections:\n
if tmpTime&sec[0] and tmpTime&sec[1]:\n
# 3. 更新Tick数据\n
if insertDB:\n
insertData(TICK_DB_NAME, tick.vtSymbol, drTick)
\n\nprocecssTickEvent(tick)\n\u003C\u002Fcode\u003EIn [7]:\u003Cbr\u003E\u003Ccode lang=\&text\&\u003Enew_nodb=profiling(test_count)\nclient.drop_database(TICK_DB_NAME)\nnew_db=profiling(test_count,func=lambda: procecssTickEvent(tick,insertDB=True))\nprint '新版不保存数据到mongodb单次耗时:%.4f' %original_nodb\nprint '新版含保存数据到mongodb单次耗时:%.4f' %original_db\n\u003C\u002Fcode\u003E\u003Cbr\u003E\u003Ccode lang=\&text\&\u003E新版不保存数据到mongodb单次耗时:0.0255\n新版含保存数据到mongodb单次耗时:0.2334\n\u003C\u002Fcode\u003E\u003Cbr\u003E\u003Ch2\u003E保存为文本文件效率\u003C\u002Fh2\u003E\u003Cbr\u003EIn [8]:\u003Cbr\u003E\u003Ccode lang=\&text\&\u003Edef insertData(db,collection,data):\n
for key in data.__dict__:\n
fout.write(str(data.__dict__[key])+',')\n\u003C\u002Fcode\u003EIn [9]:\u003Cbr\u003E\u003Ccode lang=\&text\&\u003Efout=open('D:\u002Ftest.txt','w')\nnew_db_text=profiling(test_count,func=lambda: procecssTickEvent(tick,insertDB=True))\nprint '新版含保存数据到text file单次耗时:%.4f' %original_db\nfout.close()\n\u003C\u002Fcode\u003E\u003Cbr\u003E\u003Ccode lang=\&text\&\u003E新版含保存数据到text file单次耗时:0.2334\n\u003C\u002Fcode\u003E\u003Cbr\u003E\u003Ch2\u003E时间类型转化效率\u003C\u002Fh2\u003E\u003Cp\u003E注意到不保存数据到数据的版本中,新版相比老版耗时反而降低了,这主要是由于时间转化函数的改写。\u003C\u002Fp\u003E\u003Cp\u003E如下三种时间转化方法效率差别巨大:\u003C\u002Fp\u003E\u003Cbr\u003EIn [10]:\u003Cbr\u003E\u003Ccode lang=\&text\&\u003Etime_convert1=profiling(10000,lambda:parse(':21:21.5'))\ntime_convert2=profiling(10000,lambda:datetime.strptime(':21:21.5', '%Y%m%d %H:%M:%S.%f'))\ndef customized_parse(s):\n
s=s.ljust(21,'0')\n
return datetime(int(s[0:4]),int(s[4:6]),int(s[6:8]),int(s[9:11]), int(s[12:14]), int(s[15:17]), int(s[18:21])*1000 )\ntime_convert3=profiling(10000,lambda:customized_parse(':21:21.5'))
\nprint '转化方法1耗时:%.4f' %time_convert1\nprint '转化方法2耗时:%.4f' %time_convert2\nprint '转化方法3耗时:%.4f' %time_convert3\n\u003C\u002Fcode\u003E\u003Cbr\u003E\u003Ccode lang=\&text\&\u003E转化方法1耗时:0.0560\n转化方法2耗时:0.0122\n转化方法3耗时:0.0032\n\u003C\u002Fcode\u003E\u003Cbr\u003E\u003Ch1\u003E总结\u003C\u002Fh1\u003E\u003Cbr\u003EIn [11]:\u003Cbr\u003E\u003Ccode lang=\&text\&\u003Eimport pandas as pd\ndf=pd.DataFrame([{u'无数据写入':original_nodb,u'mongodb写入':original_db},\n
{u'无数据写入': new_nodb, u'mongodb写入': new_db, u'text文件写入':new_db_text}\n
],index=['原版','新版'])\ndf\n\u003C\u002Fcode\u003EOut[11]:\u003Cbr\u003Emongodb写入text文件写入无数据写入原版0.2334NaN0.0255新版0..Cbr\u003E\u003Cbr\u003E\u003Cp\u003E总的来看,行情数据落地原版与新版一次落地耗时都为0.2ms左右。函数中,耗时主要来源于mongodb的插入,占约为90%的耗时。通过尝试简单的text写入作为数据存储方式,耗时得到了大幅降低,获得了单次0.04ms耗时的效果,采取其它更高效的格式有望进一步降低耗时。但考虑到无数据写入时的耗时为约0.02ms,所以期望的最优耗时也就在0.02ms左右。\u003C\u002Fp\u003E\u003Cp\u003E总的来说,基于mongodb的方案能够实时存储的条目数在每秒几百条量级;进一步优化可能达到几千条量级。此水平应该己能满足绝大多数的需求。\u003C\u002Fp\u003E&,&updated&:new Date(&T15:46:05.000Z&),&canComment&:false,&commentPermission&:&anyone&,&commentCount&:15,&likeCount&:43,&state&:&published&,&isLiked&:false,&slug&:&&,&isTitleImageFullScreen&:false,&rating&:&none&,&sourceUrl&:&&,&publishedTime&:&T23:46:05+08:00&,&links&:{&comments&:&\u002Fapi\u002Fposts\u002F2Fcomments&},&url&:&\u002Fp\u002F&,&titleImage&:&&,&summary&:&&,&href&:&\u002Fapi\u002Fposts\u002F&,&meta&:{&previous&:null,&next&:null},&snapshotUrl&:&&,&commentsCount&:15,&likesCount&:43},&&:{&title&:&2017年vn.py项目计划&,&author&:&traderusingpython&,&content&:&\u003Cp\u003E去年初写2016年项目计划的情景还历历在目,眨眼就一年过去了,vn.py项目在2016年的成长速度远远超出了我的预期。截止写这篇文章的日,vn.py项目在Github上收获了2244个Star以及1276个Fork,比起2016年初几乎翻了四倍,代码贡献者的数量超过了20人(其中17人是在Github上直接提交了代码),机构用户的数量也已经超过了50家。\u003C\u002Fp\u003E\u003Ch3\u003E首先回顾2016年项目计划的完成情况\u003C\u002Fh3\u003E\u003Cp\u003E整体上去年计划的完成情况还不错,只有一个期权的CTA策略因为标的波动太小没有去做。\u003C\u002Fp\u003E\u003Cp\u003E\u003Cstrong\u003E代码方面:\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Col\u003E\u003Cli\u003E\u003Cp\u003E完善飞创、易盛等相对小众接口的添加,这块将由社区驱动,作者主要负责代码检查和管理(增加了vn.xspeed、vn.sgit、vn.okcoin、vn.shzd等接口,易盛暂时还未有计划)\u003C\u002Fp\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cp\u003E整理vn.py项目中API的具体版本号,保证封装接口的对应,这点已经有多位用户提起过,项目初期没有做详细记录所以很多API的版本号一时都较难对上(已完成)\u003C\u002Fp\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cp\u003ELinux上API的编译以及vn.trader支持(已完成)\u003C\u002Fp\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cp\u003E基于VirtualBox的vn.py开发环境镜像,解决部分用户反映项目初期不知该如何搭建开发环境的问题,这个镜像会由官方长期维护下去(已完成)\u003C\u002Fp\u003E\u003C\u002Fli\u003E\u003C\u002Fol\u003E\u003Cp\u003E\u003Cstrong\u003E文章方面:\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Col\u003E\u003Cli\u003E\u003Cp\u003E作者自己作为交易员的成长经历(通过知乎LIVE完成)\u003C\u002Fp\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cp\u003Evn.trader的使用教程(已完成)\u003C\u002Fp\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cp\u003E将ta-lib(技术分析)和quantlib(金融工程和量化)整合到vn.trader中应用的教程,解决目前策略开发过程中技术指标和量化函数缺乏的问题(已完成)\u003C\u002Fp\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cp\u003E一套关于开发基于股指交易ETF期权的CTA策略的教程(未完成,上证50指数波动太小,准备在2017年基于商品期权来开发)\u003C\u002Fp\u003E\u003C\u002Fli\u003E\u003C\u002Fol\u003E\u003Cp\u003E\u003Cstrong\u003E社区方面:\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Col\u003E\u003Cli\u003E\u003Cp\u003E重新建设官方网站,目前使用的是托管在Github Pages上的Hexo静态博客,一来功能比较有限,二来有些用户反映Github时不时会被墙,考虑基于Flask重建一个托管在国内的官网(已完成,基于Pelican的新官网)\u003C\u002Fp\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cp\u003E有用户提出建设互动性更强的网站作为交流平台(如论坛或者知乎Q&A类似的模式),这点在考虑中,主要制约因素是作者参与的时间,可能考虑和更多的资深用户合作是个好主意?(已完成,维恩的派论坛)\u003C\u002Fp\u003E\u003C\u002Fli\u003E\u003C\u002Fol\u003E\u003Ch3\u003E然后展望一下2017年的项目计划\u003C\u002Fh3\u003E\u003Cp\u003E2015年是vn.py项目的诞生年,主要在打基础和完善架构;2016年基于社区的反馈,增加了很多新的接口和扩展模块;2017年准备集中在上层应用的开发,进一步解决量化交易员在实盘交易中的痛点。\u003C\u002Fp\u003E\u003Cp\u003E\u003Cstrong\u003ESpread Trading价差交易模块\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cp\u003E这个应该是目前呼声最高的应用,还有个名字叫做Pair Trading(配对交易),主要用于实现各种套利类的交易策略,如跨期套利、跨品种套利、跨市场套利等。\u003C\u002Fp\u003E\u003Cp\u003E在设计vn.trader中的CTA策略模块时,为了给策略开发者提供最大的自由度,选择把所有的交易委托细节都暴露给策略逻辑来管理。和CTA策略不同的是,价差交易策略一般只给出开平仓的信号,而不会直接去负责交易委托的细节管理。因此整个模块的实现上需要提供额外的一层功能:Spreading Algo价差委托算法,用于接受策略给出的交易信号,并自动管理各条套利腿的委托挂撤。\u003C\u002Fp\u003E\u003Cp\u003E\u003Cstrong\u003EWeb界面\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cp\u003E越来越多的量化交易员开始拥有自己的交易服务器,无论是成本较低的云服务器还是机构比较常用的经纪商托管服务器。\u003C\u002Fp\u003E\u003Cp\u003E当前vn.trader的GUI界面开发使用的是PyQt4,只能在提供图形界面的操作系统上使用(Windows或者启动了X11服务的Linux)。而很多交易服务器考虑到系统稳定性和性能延时等因素,使用的都是纯命令行工作模式的Linux,在这种情况下Web界面就成为了比较合理的选择。\u003C\u002Fp\u003E\u003Cp\u003E外观上准备参考AlgoTrader的\u003Ca href=\&http:\u002F\u002Fhtml5.algotrader.ch\u002F\& data-editable=\&true\& data-title=\&Web界面\&\u003EWeb界面\u003C\u002Fa\u003E,技术方面初步考虑使用Flask、Websocket、Bootstrap和Vue.js(已经有人提醒这个可能是大坑),后续开发过程中如果发现不合适再更换。\u003C\u002Fp\u003E\u003Cp\u003E\u003Cstrong\u003EDocker支持\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cp\u003E相信不少vn.py项目的用户在刚上手使用时都掉过各种各样Python环境配置方面的坑:弄错Anaconda的版本、弄错vcredist的版本、不知道如何使用pip安装三方包等。为了解决这个问题,之前打包制作了一个VirtualBox的Ubuntu镜像,实现了用户的开箱即用,但存在几个问题:镜像过大下载缓慢、打包复杂没有时间长期维护、只能在虚拟机中使用。\u003C\u002Fp\u003E\u003Cp\u003E最近两年诞生了一种新的容器技术Docker,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后用户可以在任何支持Docker的机器上直接使用,无论是虚拟机还是真实服务器。同时Docker的打包过程允许只提供环境搭建的指令,当用户部署Docker时才根据指令去下载和搭建整个环境,因此镜像可以很小(只是个脚本),还提供类似Github的Docker Hub方便镜像资源的分享。\u003C\u002Fp\u003E\u003Cp\u003E目前社区已经有用户在Docker中成功运行了vn.trader,但仅实现了CTP接口,同时是纯命令行模式没有GUI界面(使用脚本启动)。接下来官方支持的Docker会实现所有Linux下可用的接口,并提供界面方便使用(Web界面或者X11服务穿透)。\u003C\u002Fp\u003E\u003Cp\u003E\u003Cstrong\u003E国际化支持\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cp\u003E准备提供项目的英文支持,计划分为两步:软件界面上的英文翻译和文档的英文翻译。尽管vn.py项目诞生时主要面向的是国内量化交易员,但随着项目的成长,现在感觉也到了可以走出去看看的时候了。同时个人对vn.ib接口无论是API功能支持还是性能方面都挺有信心,想试试看能否超越IbPy。\u003C\u002Fp\u003E\u003Cp\u003E\u003Cstrong\u003E文档建设\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cp\u003E有个笑话:程序员最恨的事情之一是别人的项目不写文档,之二就是给自己的项目写文档。之前也是有不少人抱怨过vn.py项目的文档资料太少,只有知乎专栏和\u003Ca href=\&http:\u002F\u002Fwww.vnpy.org\&\u003Ehttp:\u002F\u002Fwww.vnpy.org\u003C\u002Fa\u003E上面不多的文章,文章的抽象程度也比较高,让用户在刚上手时无从下手。\u003C\u002Fp\u003E\u003Cp\u003E2017年准备从用户使用的角度来设计一套全面的文档:入门使用、策略开发、扩展模块开发、架构细节、封装原理等,让新手能够循序渐进的学习,不至于一上来掉坑后爬不出来就气馁。\u003C\u002Fp\u003E\u003Cp\u003E最近开始接受项目捐赠来维护一个vn.py项目基金,第一个考虑的用途就是支持项目文档的编写。由本人设计好整个文档的目录,并给出几篇示例性质的章节后,鼓励社区成员选择自己擅长的题目章节去编写文档,对于文档作者而言参与的价值包括:\u003C\u002Fp\u003E\u003Col\u003E\u003Cli\u003E在编写文档过程中遇到的问题,本人和另外几位社区管理员(资深用户)会提供更加充分的答疑解难,有条件的时候可以线下辅导;\u003C\u002Fli\u003E\u003Cli\u003E最终文档在发布后会署名作者的姓名,过去两年Python开发经验在国内量化领域求职时已经慢慢成为了一个重要加分项,有直接的vn.py文档编写经历证明相信可以为简历增色不少;\u003C\u002Fli\u003E\u003Cli\u003E一定量的资金回馈(从项目基金中支付),写文档时候的咖啡钱组织总还是出得起的。\u003C\u002Fli\u003E\u003C\u002Fol\u003E\u003Ch1\u003E最后,各种地缘政治因素的动荡注定了2017年不会是平静的一年,祝大家在市场的大幅波动中多多赚钱!\u003C\u002Fh1\u003E&,&updated&:new Date(&T15:56:50.000Z&),&canComment&:false,&commentPermission&:&anyone&,&commentCount&:46,&likeCount&:207,&state&:&published&,&isLiked&:false,&slug&:&&,&isTitleImageFullScreen&:false,&rating&:&none&,&sourceUrl&:&&,&publishedTime&:&T23:56:50+08:00&,&links&:{&comments&:&\u002Fapi\u002Fposts\u002F2Fcomments&},&url&:&\u002Fp\u002F&,&titleImage&:&https:\u002F\\u002Fv2-d9c66747dbbdd5554484e_r.jpg&,&summary&:&&,&href&:&\u002Fapi\u002Fposts\u002F&,&meta&:{&previous&:null,&next&:null},&snapshotUrl&:&&,&commentsCount&:46,&likesCount&:207},&&:{&title&:&开箱即用的开源云端量化交易平台 —— 写在vn.py v1.4发布之际&,&author&:&traderusingpython&,&content&:&\u003Ch2\u003E开箱即用\u003C\u002Fh2\u003E\u003Cp\u003E想想还是在开头声明下:这一段是帮量衍投资做的一个产品广告,一是感谢量衍对于vn.py社区做出的贡献,二是也确实觉得这个产品对于很多用户有价值(尤其是新手)。\u003C\u002Fp\u003E\u003Cp\u003E\u003Cstrong\u003E量衍介绍:\u003C\u002Fstrong\u003E 量衍投资的全称是量衍投资咨询,业务范围包括量化交易相关的技术咨询和外包开发服务(主要围绕vn.py项目),同时也是vn.py项目当前唯一的商业支持公司,贡献了大量开源项目中的代码,并赞助运营着社区论坛\u003Ca href=\&http:\u002F\\& data-title=\&“维恩的派”\& class=\&\&\u003E“维恩的派”\u003C\u002Fa\u003E。\u003C\u002Fp\u003E\u003Cp\u003E之前曾经和量衍合作发布过一个基于VirtualBox的vn.py开箱即用镜像,被社区里的很多新手用户誉为“菜鸟福音”。\u003C\u002Fp\u003E\u003Cimg src=\&v2-6c0c72f7c351ab2200cc40a.png\& data-rawwidth=\&1784\& data-rawheight=\&1005\&\u003E\u003Cp\u003E这次在vn.py发布v1.4版本的同时,量衍也开发完成了一套阿里云上的开箱即用镜像(上图),试用几天后不得不说让我印象非常深刻:\u003C\u002Fp\u003E\u003Col\u003E\u003Cli\u003E基于Ubuntu 16.04(LTS) 64位开发,比起14.04更新了很多重要的库(比如boost),比起Windows对服务器配置的要求更低(简单来说就是省钱)。\u003C\u002Fli\u003E\u003Cli\u003E提供了基于XFCE + vnc4server的远程桌面,这个太给力了!!!之前用过腾讯云和阿里云的Linux云服务器无一例外都是纯命令行模式,尽管可以跑不带界面的vn.trader,但在策略和系统的监控上非常不方便,最后还是换回了Windows,而有了这个远程桌面后,基本可以和Windows的云服务器say goodbye了。顺道一提量衍还做了桌面美化,平板化的桌面主题比Win7漂亮不少。\u003C\u002Fli\u003E\u003Cli\u003E安装并配置好了全套vn.py运行环境:vn.py(v1.4)、Anaconda、MongoDB、IB TWS、相关Python库、API编译,点个图标就能立即启动vn.trader,对于新手而言再也不用一步步研究如何安装环境了。\u003C\u002Fli\u003E\u003Cli\u003E提供了量化业务中常用的工具:Atom(代码查看和编辑)、Robomongo(数据库监控)、GitKraken(代码仓库管理)、Terminator(带子窗口终端)。\u003C\u002Fli\u003E\u003C\u002Fol\u003E\u003Cp\u003E镜像支持的接口也比较全面,包括了所有主要的金融资产类别:\u003C\u002Fp\u003E\u003Cul\u003E\u003Cli\u003ECTP(期货)\u003C\u002Fli\u003E\u003Cli\u003ELTS(证券、期权)\u003C\u002Fli\u003E\u003Cli\u003EIB(外盘)\u003C\u002Fli\u003E\u003Cli\u003EOANDA(外汇)\u003C\u002Fli\u003E\u003Cli\u003EOKCOIN(比特币)\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cp\u003E因为是商业公司,量衍的这套镜像是收费的:100元每个用户(不限安装数量)。总的来说,个人觉得对于很多新手而言这是一个性价比相当不错的产品,少量的花费就可以省去踩坑各种环境配置的烦恼,把更多精力放在量化策略上,不过对于技术大神或者喜好折腾的用户而言就没必要了。镜像的购买方式在文章最后。\u003C\u002Fp\u003E\u003Ch2\u003Ev1.4版本\u003C\u002Fh2\u003E\u003Cp\u003E大约5天前刚发布了vn.py的v1.4版本,其中比较重要的几个更新包括:\u003C\u002Fp\u003E\u003Col\u003E\u003Cli\u003E增加前后端分离的vn.trader实现:基于vn.rpc模块的vtServer和vtClient\u003C\u002Fli\u003E\u003Cli\u003E增加量投科技QDP柜台的接入:vn.qdp和qdpGateway\u003C\u002Fli\u003E\u003Cli\u003E增加vn.how目录:用于存放项目应用相关的演示代码\u003C\u002Fli\u003E\u003Cli\u003E改进ibGateway的行情和成交推送功能:\u003C\u002Fli\u003E\u003Cli\u003E改进vn.okcoin和okcoinGateway的断线重连功能\u003C\u002Fli\u003E\u003C\u002Fol\u003E\u003Cp\u003E这个版本的更新里最值得一提的就是前后端分离的vn.trader。之前发布vn.rpc后,很多人对于如何使用这个模块毫无头绪,这里的前后端分离方案就可以作为使用vn.rpc模块时的一个参考或者说开发模板。\u003C\u002Fp\u003E\u003Cp\u003E开发时最重要原则是理清自己的实际业务需求:\u003C\u002Fp\u003E\u003Col\u003E\u003Cli\u003E先找到自己程序在某方面的的瓶颈(速度、稳定性、扩展性等)\u003C\u002Fli\u003E\u003Cli\u003E然后设计好合理的程序解耦方案(需要几个进程、每个进程里运行什么逻辑)\u003C\u002Fli\u003E\u003Cli\u003E最后使用vn.rpc把每个子进程中的逻辑给包装和连接起来\u003C\u002Fli\u003E\u003C\u002Fol\u003E\u003Cp\u003E记住一定要确保自己有实际的需求,不要为了解耦而解耦。\u003C\u002Fp\u003E\u003Ch2\u003E未来版本计划\u003C\u002Fh2\u003E\u003Cp\u003E为防止自己懒癌发作,先在这里把开发计划给公布了。准备在2017年底前将项目推进到v2.0,每个版本的计划如下:\u003C\u002Fp\u003E\u003Cul\u003E\u003Cli\u003Ev1.5: 中泰证券XTP柜台接入\u003C\u002Fli\u003E\u003Cli\u003Ev1.6:Spread Trading(价差交易)模块\u003C\u002Fli\u003E\u003Cli\u003Ev1.7:完整的海龟策略实现(多标的、资金仓位管理、算法交易)\u003C\u002Fli\u003E\u003Cli\u003Ev1.8: 英文支持(包括vn.ib的文档和vn.trader程序)\u003C\u002Fli\u003E\u003Cli\u003Ev1.9:Web界面\u003C\u002Fli\u003E\u003Cli\u003Ev2.0:新的稳定版\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cp\u003E以上版本计划在具体开发的过程中可能有先后顺序的变化,不过既然都公布了相信我还是会全部完成的。\u003C\u002Fp\u003E\u003Ch2\u003E镜像购买方式\u003C\u002Fh2\u003E\u003Col\u003E\u003Cli\u003E通过支付宝转账100元到\u003C\u002Fli\u003E\u003Cli\u003E发送邮件给,告知自己的阿里云aliyunID\u003C\u002Fli\u003E\u003Cli\u003E镜像通过共享镜像的形式交付,量衍一般会在第二天之前把买家的aliyunID加入到共享清单中,并回复确认邮件\u003C\u002Fli\u003E\u003Cli\u003E用户收到确认邮件后,即可登录阿里云并使用共享镜像中的vn.py镜像来创建自己的云服务器\u003C\u002Fli\u003E\u003Cli\u003E有任何问题请直接去“维恩的派”论坛咨询,也可以直接邮件联系\u003C\u002Fli\u003E\u003C\u002Fol\u003E&,&updated&:new Date(&T16:03:44.000Z&),&canComment&:false,&commentPermission&:&anyone&,&commentCount&:40,&likeCount&:144,&state&:&published&,&isLiked&:false,&slug&:&&,&isTitleImageFullScreen&:false,&rating&:&none&,&sourceUrl&:&&,&publishedTime&:&T00:03:44+08:00&,&links&:{&comments&:&\u002Fapi\u002Fposts\u002F2Fcomments&},&url&:&\u002Fp\u002F&,&titleImage&:&https:\u002F\\u002Fv2-a64fd0d047fe54e961b0a4_r.jpg&,&summary&:&&,&href&:&\u002Fapi\u002Fposts\u002F&,&meta&:{&previous&:null,&next&:null},&snapshotUrl&:&&,&commentsCount&:40,&likesCount&:144},&&:{&title&:&vn.py文档编写计划&,&author&:&traderusingpython&,&content&:&\u003Ch1\u003E\u003Cstrong\u003E鸡年的第一篇文章,给各位读者拜个年,祝大家新的一年身体健康,全家幸福~\u003C\u002Fstrong\u003E\u003Cbr\u003E\u003C\u002Fh1\u003E\u003Ch3\u003E需求\u003C\u002Fh3\u003E\u003Cp\u003E之前在vn.py项目2017年计划里面提到,如果对vn.py社区用户们的需求情况做个排序,项目文档绝对可以排在第一位。尤其对于新手而言,目前能找到的文档资料比较零碎,只能自己去看源代码,学习曲线比较陡,也让很多人望而却步。\u003C\u002Fp\u003E\u003Ch3\u003E误区\u003C\u002Fh3\u003E\u003Cp\u003E之前走入了一个误区,因为自己是作者的关系对整个项目的了解比较全面,所以写文档的时候是从开发者的角度,按照自己一步步开发vn.py项目的顺序在写:CTP接口原理、接口封装、事件引擎、GUI界面、应用模块开发等。直接的后果就是导致用户上来就先接触最难的底层部分,然后才一点点过度到自己实际应用中会用到的上层开发部分,学习效率非常低下。\u003C\u002Fp\u003E\u003Ch3\u003E用户\u003C\u002Fh3\u003E\u003Cp\u003E接下来新的文档准备从用户的角度来写:先讲安装配置、基本使用,让用户能先把vn.py跑起来,不用再到处问环境怎么配置;然后介绍如何使用CTA模块来开发交易策略,如何结合风控模块来做事前风险管理;下一步讲解基于事件引擎的扩展模块的开发方式,使得用户能够去实现一些比较复杂的功能应用;最后再介绍接口封装、架构细节等内容,让有兴趣的用户来进一步提高。\u003C\u002Fp\u003E\u003Cp\u003E不再废话了,直接进入目录。\u003C\u002Fp\u003E\u003Ch3\u003E目录\u003C\u002Fh3\u003E\u003Col\u003E\u003Cli\u003E\u003Cp\u003E安装配置\u003C\u002Fp\u003E\u003Col\u003E\u003Cli\u003E\u003Cp\u003EWindows(200)\u003C\u002Fp\u003E\u003Col\u003E\u003Cli\u003EPython环境:Anaconda安装\u003C\u002Fli\u003E\u003Cli\u003EVS2013运行时:vcredist x86\u003C\u002Fli\u003E\u003Cli\u003E数据库:MongoDB、RoboMongo\u003C\u002Fli\u003E\u003Cli\u003EPython库:pip安装\u003C\u002Fli\u003E\u003Cli\u003E成功运行\u003C\u002Fli\u003E\u003C\u002Fol\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cp\u003EUbuntu(200)\u003C\u002Fp\u003E\u003Col\u003E\u003Cli\u003E环境安装\u003C\u002Fli\u003E\u003Cli\u003EAPI编译(Linux下的链接问题)\u003C\u002Fli\u003E\u003Cli\u003E成功运行\u003C\u002Fli\u003E\u003C\u002Fol\u003E\u003C\u002Fli\u003E\u003C\u002Fol\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cp\u003E基本使用(400)\u003C\u002Fp\u003E\u003Col\u003E\u003Cli\u003E配置接口的账号、密码、服务器地址等,并测试连接\u003C\u002Fli\u003E\u003Cli\u003E日志信息、合约列表查询、行情订阅\u003C\u002Fli\u003E\u003Cli\u003E手动下单、撤单,成交和委托的数据监控\u003C\u002Fli\u003E\u003Cli\u003E错误、持仓、资金的数据监控\u003C\u002Fli\u003E\u003Cli\u003E其他贴士:窗口拖动、还原,一键测试功能\u003C\u002Fli\u003E\u003C\u002Fol\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cp\u003ECTA策略\u003C\u002Fp\u003E\u003Col\u003E\u003Cli\u003E\u003Cp\u003E模块文件介绍(200)\u003C\u002Fp\u003E\u003Col\u003E\u003Cli\u003E每个文件的功能说明\u003C\u002Fli\u003E\u003Cli\u003E文件内模块的关系图\u003C\u002Fli\u003E\u003C\u002Fol\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cp\u003E策略回测(400)\u003C\u002Fp\u003E\u003Col\u003E\u003Cli\u003E回测引擎API的使用\u003C\u002Fli\u003E\u003Cli\u003E读懂回测报告\u003C\u002Fli\u003E\u003Cli\u003E参数优化(普通模式)\u003C\u002Fli\u003E\u003Cli\u003E多进程优化\u003C\u002Fli\u003E\u003C\u002Fol\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cp\u003E策略实盘(200)\u003C\u002Fp\u003E\u003Col\u003E\u003Cli\u003E载入策略到CTA引擎\u003C\u002Fli\u003E\u003Cli\u003E编写策略实例的json配置文件\u003C\u002Fli\u003E\u003Cli\u003E使用CTA监控组件来管理策略的生命周期\u003C\u002Fli\u003E\u003Cli\u003E策略实盘过程中的运维细节\u003C\u002Fli\u003E\u003C\u002Fol\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cp\u003E策略开发(600)\u003C\u002Fp\u003E\u003Col\u003E\u003Cli\u003E策略模板CtaTemplate介绍\u003C\u002Fli\u003E\u003Cli\u003E委托类型\u003C\u002Fli\u003E\u003Cli\u003E时间序列数据结构\u003C\u002Fli\u003E\u003Cli\u003E使用talib中的技术指标\u003C\u002Fli\u003E\u003C\u002Fol\u003E\u003C\u002Fli\u003E\u003C\u002Fol\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cp\u003E事前风控(200)\u003C\u002Fp\u003E\u003Col\u003E\u003Cli\u003E使用风控模块RiskManager\u003C\u002Fli\u003E\u003Cli\u003E风控规则配置\u003C\u002Fli\u003E\u003Cli\u003E添加自定义规则\u003C\u002Fli\u003E\u003C\u002Fol\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cp\u003E行情解决方案(200)\u003C\u002Fp\u003E\u003Col\u003E\u003Cli\u003E使用行情记录模块DataRecorder\u003C\u002Fli\u003E\u003Cli\u003E配置行情记录的规则\u003C\u002Fli\u003E\u003Cli\u003E历史数据下载功能ctaHistory.py\u003C\u002Fli\u003E\u003C\u002Fol\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cp\u003E事件引擎(400)\u003C\u002Fp\u003E\u003Col\u003E\u003Cli\u003E事件引擎的结构\u003C\u002Fli\u003E\u003Cli\u003E事件引擎的启动和停止\u003C\u002Fli\u003E\u003Cli\u003E事件引擎的工作流程\u003C\u002Fli\u003E\u003Cli\u003E事件处理函数\u003C\u002Fli\u003E\u003Cli\u003E定时器事件\u003C\u002Fli\u003E\u003Cli\u003E使用中需要注意的细节\u003C\u002Fli\u003E\u003C\u002Fol\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cp\u003E应用开发\u003C\u002Fp\u003E\u003Col\u003E\u003Cli\u003E应用模块的设计思路(200)\u003Col\u003E\u003Cli\u003E监听事件(事件引擎)\u003C\u002Fli\u003E\u003Cli\u003E调用功能(主引擎)\u003C\u002Fli\u003E\u003C\u002Fol\u003E\u003C\u002Fli\u003E\u003Cli\u003E使用合理的数据结构来解决问题(200)\u003Col\u003E\u003Cli\u003E列表list、字典dict、集合set\u003C\u002Fli\u003E\u003Cli\u003E特殊结构collections\u003C\u002Fli\u003E\u003Cli\u003E矩阵numpy、时间序列pandas\u003C\u002Fli\u003E\u003C\u002Fol\u003E\u003C\u002Fli\u003E\u003Cli\u003E设计应用的算法逻辑(200)\u003C\u002Fli\u003E\u003Cli\u003E开发应用的GUI界面(200)\u003Col\u003E\u003Cli\u003E使用表格(TableWidget)\u003C\u002Fli\u003E\u003Cli\u003E调整显示方式(GroupBox、TabWidget)\u003C\u002Fli\u003E\u003Cli\u003E数据选择工具(ComboBox,SpinBox)\u003C\u002Fli\u003E\u003Cli\u003E使用按钮调用功能\u003C\u002Fli\u003E\u003C\u002Fol\u003E\u003C\u002Fli\u003E\u003Cli\u003E将模块加载到vn.trader中\u003C\u002Fli\u003E\u003C\u002Fol\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cp\u003ERPC(400)\u003C\u002Fp\u003E\u003Col\u003E\u003Cli\u003E什么时候应该使用vn.rpc模块\u003C\u002Fli\u003E\u003Cli\u003E服务器端RpcServer和客户端RpcClient的介绍\u003C\u002Fli\u003E\u003Cli\u003E服务器端的开发\u003C\u002Fli\u003E\u003Cli\u003E客户端的开发\u003C\u002Fli\u003E\u003Cli\u003Evn.rpc模块的工作原理\u003C\u002Fli\u003E\u003Cli\u003E使用中需要注意的细节(如线程安全、心跳等)\u003C\u002Fli\u003E\u003C\u002Fol\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cp\u003E接口封装\u003C\u002Fp\u003E\u003Col\u003E\u003Cli\u003E各种API的介绍和对比(200)\u003C\u002Fli\u003E\u003Cli\u003EAPI类模块的编译和使用(vn.ctp、vn.lts等)(200)\u003C\u002Fli\u003E\u003Cli\u003E类CTP交易API(200)\u003Col\u003E\u003Cli\u003E工作原理\u003C\u002Fli\u003E\u003Cli\u003E封装设计\u003C\u002Fli\u003E\u003C\u002Fol\u003E\u003C\u002Fli\u003E\u003Cli\u003EInteractive Brokers(IB)的API(200)\u003Col\u003E\u003Cli\u003E工作原理\u003C\u002Fli\u003E\u003Cli\u003E封装设计\u003C\u002Fli\u003E\u003C\u002Fol\u003E\u003C\u002Fli\u003E\u003Cli\u003E其他API(400)\u003Col\u003E\u003Cli\u003Eoanda\u003C\u002Fli\u003E\u003Cli\u003Ewind\u003C\u002Fli\u003E\u003Cli\u003Eshzd\u003C\u002Fli\u003E\u003Cli\u003Eokcoin\u003C\u002Fli\u003E\u003C\u002Fol\u003E\u003C\u002Fli\u003E\u003C\u002Fol\u003E\u003C\u002Fli\u003E\u003C\u002Fol\u003E\u003Ch2\u003E社区协作\u003C\u002Fh2\u003E\u003Cp\u003E之前的一些文档编写大多是本人独自在做,接下来打算借助社区的力量来一起完成这个新的项目文档。\u003C\u002Fp\u003E\u003Cp\u003E既然涉及到团队协作就需要一套协作流程,每个章节的编写流程如下(初步计划,有不合理的地方欢迎指出):\u003C\u002Fp\u003E\u003Col\u003E\u003Cli\u003E作者(社区成员)选择自己有兴趣编写的章节并联系本人来确定一些细节:是否已有人在编写、内容框架、完成时间和报酬费用(下面会提到)等;\u003C\u002Fli\u003E\u003Cli\u003E细节确认无误后,作者就可以开始本章节的编写;\u003C\u002Fli\u003E\u003Cli\u003E在编写文档的过程中,遇到技术方面的难题可以直接联系本人,会帮助优先解决;\u003C\u002Fli\u003E\u003Cli\u003E作者完成文档的编写后发送给本人,本人会和作者一起对文档内容做回顾和修改;\u003C\u002Fli\u003E\u003Cli\u003E本人将最终完成的文档发布到vnpy.org网站上的文档板块,并向作者支付报酬费用;\u003C\u002Fli\u003E\u003Cli\u003E之前的目录中,部分章节旁边有一个括号中的数字,就是该章节计划的报酬费用,某些是需要完成一个子章节,某些是需要完成一个完整的章节。\u003C\u002Fli\u003E\u003C\u002Fol\u003E\u003Cp\u003E开始的时候计划自己来写几篇文档作为范例来给社区参考,为了给社区其他作者更多学习实践的机会,我会选择相对较为简单的章节(其实纯粹就是为了偷懒~)。\u003C\u002Fp\u003E\u003Cp\u003E综上,社区作者在这个新文档编写工作中才是最重要的角色,本人更多只是扮演一个组织者。相应的,对于社区作者来说,参与文档的编写也能为你的交易和职业生涯带来一些帮助:\u003C\u002Fp\u003E\u003Col\u003E\u003Cli\u003E全面了解vn.py框架:除非自己已经弄得非常明白了,否则很难写出能让别人明白的文档;\u003C\u002Fli\u003E\u003Cli\u003E遇到技术问题时的优先帮助:现在社区群的规模已经较大,很多用户的提问我没有办法一一解答(QQ未读信息已经积累一堆了),对于文档作者我会提供自己的微信和手机,方便直接联系和保证问题的解答,同时也会分享自己在做量化交易过程中的一些实战经验;\u003C\u002Fli\u003E\u003Cli\u003E加入vn.py项目贡献者名单:章节发布后署名,拥有未来社区活动的优先参与资格,同时对于很多招聘Python方向量化职位的金融机构来说,有vn.py的项目经验也是一个不错的加分项;\u003C\u002Fli\u003E\u003Cli\u003E报酬费用:金额不多估计只够买买咖啡,更多是表达整个社区对文档作者的一份感谢。\u003C\u002Fli\u003E\u003C\u002Fol\u003E\u003Ch3\u003E有兴趣参与的朋友请直接qq私信我或者发邮件到vn.,提前谢过。\u003C\u002Fh3\u003E&,&updated&:new Date(&T02:49:14.000Z&),&canComment&:false,&commentPermission&:&anyone&,&commentCount&:27,&likeCount&:84,&state&:&published&,&isLiked&:false,&slug&:&&,&isTitleImageFullScreen&:false,&rating&:&none&,&sourceUrl&:&&,&publishedTime&:&T10:49:14+08:00&,&links&:{&comments&:&\u002Fapi\u002Fposts\u002F2Fcomments&},&url&:&\u002Fp\u002F&,&titleImage&:&https:\u002F\\u002Fv2-8b2aed731cbaade99d612c_r.jpg&,&summary&:&&,&href&:&\u002Fapi\u002Fposts\u002F&,&meta&:{&previous&:null,&next&:null},&snapshotUrl&:&&,&commentsCount&:27,&likesCount&:84},&&:{&title&:&用Python的交易员的Live--阅读:交易员的内功修炼&,&author&:&traderusingpython&,&content&:&我是用 python 的交易员,vn.py 作者,懂点交易,懂点编程。 \n\u003Cp\u003E在平时的工作和社交中,经常遇到一些朋友为了如何提高自己在交易方面的内功而烦恼:有些是想要毕业后从事交易相关工作的学生不知道该如何入门,有些则是初入行的交易员苦恼于如何提高自己的交易水平。和很多其他的行业一样,阅读也是交易员修炼内功、自我提高不可或缺的一种方式。 每个交易员在风格上可能有自己的侧重:技术面、基本面、量化分析等等,但在当前国内金融市场飞速发展的时代,如果太过「偏科」,只关心自己眼前的那一亩三分地,无疑很容易坐井观天,错过很多稍纵即逝的交易机会。 \n\u003C\u002Fp\u003E\u003Cp\u003E知乎上之前已经有过不少关于金融阅读的 Live :如理财、并购、量化等等,但交易这一金融市场的核心领域还没有覆盖。在这次的 Live 中,我希望从过来人 的角度来和大家分享一些自己的经验:如何通过阅读一点一滴地修炼自己的内功,从一个完全不懂交易的小白,经历过技术爱好者、巴菲特粉丝、量化矿工等阶段,逐渐成长为能够独当一面负担起公司 PNL 的交易员。\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cbr\u003E本次 Live 主要包括以下内容: \n\u003Cbr\u003E\u003Cul\u003E\u003Cli\u003E快速了解交易员这一职业,如何通过阅读来提高自己 \u003Cbr\u003E\u003C\u002Fli\u003E\u003Cli\u003E技术面、基本面和量化分析:交易员必修的内功 \u003Cbr\u003E\u003C\u002Fli\u003E\u003Cli\u003E各种金融考试,对于交易员是否真的毫无意义 \u003Cbr\u003E\u003C\u002Fli\u003E\u003Cli\u003E面对回撤时的痛苦, 哪些书能够帮到你 \u003Cbr\u003E\u003C\u002Fli\u003E\u003Cli\u003E哪些销量很大的书其实是名不符实,还容易把人带进坑里 \u003C\u002Fli\u003E\u003C\u002Ful\u003E本次的 Live 主要针对希望从事交易员工作的在校大学生和初入职场的新人交易员,因此价格定在 19 元,同时提醒 Live 中的某些观点可能带有强烈的个人偏好。\u003Cbr\u003E\u003Cbr\u003E\u003Cp\u003E【传送门】\u003Ca href=\&https:\u002F\\u002Flives\u002F287168\& data-editable=\&true\& data-title=\&知乎 Live - 全新的实时问答\& class=\&\&\u003Ehttps:\u002F\\u002Flives\u002F3C\u002Fa\u003E\u003C\u002Fp\u003E&,&updated&:new Date(&T09:49:49.000Z&),&canComment&:false,&commentPermission&:&anyone&,&commentCount&:4,&likeCount&:32,&state&:&published&,&isLiked&:false,&slug&:&&,&isTitleImageFullScreen&:false,&rating&:&none&,&sourceUrl&:&&,&publishedTime&:&T17:49:49+08:00&,&links&:{&comments&:&\u002Fapi\u002Fposts\u002F2Fcomments&},&url&:&\u002Fp\u002F&,&titleImage&:&https:\u002F\\u002Fv2-de14aeee4827a60cdc756d_r.jpg&,&summary&:&&,&href&:&\u002Fapi\u002Fposts\u002F&,&meta&:{&previous&:null,&next&:null},&snapshotUrl&:&&,&commentsCount&:4,&likesCount&:32},&&:{&title&:&vn.py发布v1.5&,&author&:&traderusingpython&,&content&:&\u003Cp\u003E标题图片里的是本人挺喜欢的一个威士忌牌子:强尼遛弯,而曲折不平的道路挺符合最近几个月开发v1.5时遇到的情况,当协作的团队成员数量上升时你会面对很多原本不存在的挑战。\u003C\u002Fp\u003E之前计划中的中泰证券XTP接口模块因为种种原因(合规、风控、安全等),无法放到开源项目中了,而是会采取和中泰合作的一款量化交易软件的形式来发布:接口和引擎层面闭源,上层策略模块和vn.py兼容,允许客户基于策略模板来开发各种股票、ETF、债券等证券方面的量化交易策略。\u003Cp\u003E不过虽然少了XTP,v1.5的发布中依旧有不少重大更新。\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cp\u003E接口方面:\u003C\u002Fp\u003E\u003Col\u003E\u003Cli\u003E增加火币的比特币交易接口vn.huobi,以及vn.trader的接入huobiGateway\u003Cbr\u003E\u003C\u002Fli\u003E\u003Cli\u003E增加链行的比特币交易接口vn.lhang,以及vn.trader的接入lhangGateway\u003Cbr\u003E\u003C\u002Fli\u003E\u003Cli\u003E增加vn.ctp模块的Python 3封装,感谢社区成员bigtan的贡献\u003C\u002Fli\u003E\u003Cli\u003E增加了vn.ib模块的英文介绍信息,感谢社区成员wangzhe3224的贡献\u003C\u002Fli\u003E\u003Cli\u003E在ctpGateway中,尝试加入了对无效Tick数据的自动过滤(无成交量)\u003C\u002Fli\u003E\u003C\u002Fol\u003E\u003Cbr\u003E\u003Cp\u003E策略模块方面:\u003C\u002Fp\u003E\u003Col\u003E\u003Cli\u003ECtaAlgo模块下的策略文件实现自动识别和启动时载入\u003C\u002Fli\u003E\u003Cli\u003E增加通达信分钟数据导入MongoDB的功能,感谢社区成员AaronGuan的贡献\u003Cbr\u003E\u003C\u002Fli\u003E\u003Cli\u003E增加基于目标持仓来进行交易的策略模板,感谢量衍投资的贡献\u003C\u002Fli\u003E\u003Cli\u003E增加King Keltner策略,用来展示OCO(One-Cancel-Other)委托和5分钟K线聚合的写法\u003C\u002Fli\u003E\u003C\u002Fol\u003E\u003Cbr\u003E\u003Cp\u003E风控方面:\u003C\u002Fp\u003E\u003Cp\u003E1. 增加风控引擎中关于每日撤单次数的事前风控管理,感谢社区成员sunlit和ares89的贡献\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cp\u003E接下来开始进入v1.6的开发,也就是挺多人期待已久的价差套利模块(SpreadingAlgo),终于开始啃今年的硬骨头了。\u003C\u002Fp\u003E&,&updated&:new Date(&T15:04:44.000Z&),&canComment&:false,&commentPermission&:&anyone&,&commentCount&:21,&likeCount&:80,&state&:&published&,&isLiked&:false,&slug&:&&,&isTitleImageFullScreen&:false,&rating&:&none&,&sourceUrl&:&&,&publishedTime&:&T23:04:44+08:00&,&links&:{&comments&:&\u002Fapi\u002Fposts\u002F2Fcomments&},&url&:&\u002Fp\u002F&,&titleImage&:&https:\u002F\\u002Fv2-ce766474ebb11f953b32_r.jpg&,&summary&:&&,&href&:&\u002Fapi\u002Fposts\u002F&,&meta&:{&previous&:null,&next&:null},&snapshotUrl&:&&,&commentsCount&:21,&likesCount&:80},&&:{&title&:&什么?有人解决了Python最难的问题GIL!还用来做高频交易?!&,&author&:&traderusingpython&,&content&:&\u003Ch2\u003E\u003Cu\u003E申明\u003C\u002Fu\u003E\u003C\u002Fh2\u003E事情起源于这篇文章:\u003Ca href=\&https:\u002F\\u002Fp\u002F?group_id=705600\& class=\&\& data-editable=\&true\& data-title=\&Quicklib对VNPY团队贬低回应和异步IO与传统架构性能对比 - 知乎专栏\&\u003EQuicklib对VNPY团队贬低回应和异步IO与传统架构性能对比 - 知乎专栏\u003C\u002Fa\u003E\u003Cblockquote\u003EQuicklib利用Python特点,在底层驱动上采用了异步IO来替代多线程,使得底层没有全局锁,性能大大提高。进入应用层后,复杂的耗时计算则采用Python的多进程库。\u003C\u002Fblockquote\u003E\u003Cp\u003E对于Quicklib这个项目,过去几个月也是一直有所耳闻,不过一直没有时间去做深入的研究。晚上吃饭的时候收到多位朋友发来的这篇文章,发现作者在文中对于vn.py表现出了诸多不满的情绪(社区和代码),尤其指责vn.py核心开发团队对Quicklib大肆抨击。\u003C\u002Fp\u003E\u003Cp\u003E想了半天也记不起来自己或者几个做核心开发的朋友干过相关的事情(最近因为商品期权上市一直忙的不可开交),然后去调查了一圈,发现是社区论坛上有位用户写了若干篇关于Quicklib的分析文章,估计引起了Quicklib作者的不满,在此先告个歉。\u003C\u002Fp\u003E\u003Cp\u003E不过同时也想郑重申明下:\u003Cb\u003E\u003Cu\u003Evn.py的核心开发团队基本都是各家大型量化私募的交易负责人,平时一般都忙于从“交易”而非“软件”或者“培训””上赚钱,以后没有弄清楚请不要乱扣帽子。\u003C\u002Fu\u003E\u003C\u002Fb\u003E\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cbr\u003E\u003Ch2\u003E\u003Cu\u003E回应\u003C\u002Fu\u003E\u003C\u002Fh2\u003E\u003Cp\u003E本来做完上面的申明后就准备这么算了,不过豆粕期权的隐含波动率从上市日的18%三个交易日不到就跌的接近了最近的实现波动率13%,接下来几天一下子没了什么特别显著的交易机会,闲来无事就多看了点Quicklib相关的信息,不看还好,看了后这下真是有点气不打一处来。\u003C\u002Fp\u003E\u003Cp\u003E在多篇文章里,Quicklib的作者都表达了对vn.py性能方面的抨击,指出vn.py在架构方面的各种不合理,并且提出Quicklib则是解决了Python最大的难题GIL全局锁,并且能够直接使用Python来开发超高频交易策略。\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cp\u003E“同行是冤家”的道理我明白,也知道不是所有开源项目的作者都对于盈利没有追求,有时抨击下对手抬高下自己本不是什么大不了的事情,只要说的事情符合事实那都可以算作“技术切磋”的范畴,不过从\u003Ca href=\&http:\u002F\\u002Findex.htm\& data-editable=\&true\& data-title=\&Quicklib官网\&\u003EQuicklib官网\u003C\u002Fa\u003E下载“内盘期货CTP Python框架”后,解压一看瞬间有点无语:\u003C\u002Fp\u003E\u003Cp\u003E首先是一张“QuickLibGUIDemo”的截图:\u003C\u002Fp\u003E\u003Cp\u003E\u003Cimg src=\&v2-8cd67aeb100c.png\& data-rawwidth=\&1016\& data-rawheight=\&659\&\u003E诶,怎么和vn.py早期开发演示模块的vn.demo看着这么像??可能只是借鉴了一些GUI设计吧......\u003C\u002Fp\u003E\u003Cp\u003E然后再打开目录:\u003C\u002Fp\u003E\u003Cp\u003E\u003Cimg src=\&v2-c249b91bd.jpg\& data-rawwidth=\&1395\& data-rawheight=\&633\&\u003E怎么连部分文件名都一模一样??不会这么巧吧。\u003C\u002Fp\u003E\u003Cp\u003E不信邪了,打开demoUi.py文件看看:\u003C\u002Fp\u003E\u003Cp\u003E\u003Cimg src=\&v2-f1d95d069a85ddafd659ac.png\& data-rawwidth=\&862\& data-rawheight=\&1012\&\u003E我了个CAO!根本就是vn.demo里面的代码啊,类名、变量名就算了,连格式都是WingIDE内置模板自动生成的效果!当然在文件开头Quicklib的作者没有忘记加入一些自己的“原创描述”内容。\u003C\u002Fp\u003E\u003Cp\u003E\u003Cu\u003E\u003Cb\u003Evn.py项目采用的是授权非常自由的MIT协议,允许任何人用于任何其他的开源或者商业项目,都无需向我或者vn.py社区支付任何费用(其实连招呼都不用打)\u003C\u002Fb\u003E\u003C\u002Fu\u003E。\u003C\u002Fp\u003E\u003Cp\u003E但是Quicklib作者老兄,您一边抨击着vn.py架构的各种不合理,一边还在自己的项目里大量使用着vn.py的代码,我想问问:\u003C\u002Fp\u003E\u003Cp\u003E而且抄的时候拜托能不能专业点,哪怕把代码里的格式稍微换换也行啊......\u003C\u002Fp\u003E\u003Cp\u003E为了留个证据,我把Quicklib官网下载的代码上传了:\u003Ca href=\&https:\u002F\\u002Ff939a837eabbf5a7a1c94efd\& data-editable=\&true\& data-title=\&微云文件\&\u003E微云文件\u003C\u002Fa\u003E。\u003C\u002Fp\u003E\u003Cp\u003E另外如果有人质疑以上代码是否属于vn.py项目先写出来的,可以问问vn.py社区早期的用户,几乎所有人都看过这些代码,也可以去\u003Ca href=\&\u002Fvnpy\u002Fvnpy\& data-editable=\&true\& data-title=\&vn.py的Github仓库\&\u003Evn.py的Github仓库\u003C\u002Fa\u003E翻commit的历史,没记错这些应该是差不多两年前的代码了。\u003C\u002Fp\u003E\u003Cp\u003E另外还有看到Quicklib的仓库里有这么一个文件夹:\u003Ca href=\&https:\\u002Fwdgwz\u002Fquicklib\u002Ftree\u002Fmaster\u002F%E4%B8%8E%E5%85%B6%E4%BB%96%E5%BC%80%E6%BA%90%E6%A1%86%E6%9E%B6%E5%AF%B9%E6%AF%94%E8%81%8A%E5%A4%A9%E6%88%AA%E5%9B%BE\&\u003E与其他开源框架对比聊天截图\u003C\u002Fa\u003E。我也真是醉了,借用一个朋友的评论:\u003Cu\u003E\u003Cb\u003E做开源用这种方式攻击对手,犯得着么?要是真做商业项目那还得了?\u003C\u002Fb\u003E\u003C\u002Fu\u003E(我默默补一句:还用了一堆对手的代码......)\u003C\u002Fp\u003E\u003Cbr\u003E\u003Ch2\u003E计划\u003C\u002Fh2\u003E\u003Cp\u003E对于看到了这里的读者朋友想先道个歉,讲了这么多废话还没有提到和标题相关的内容。\u003C\u002Fp\u003E\u003Cp\u003E生气归生气,本人好歹是做交易的,转念一想:Quicklib万一真的是彻底解决了GIL的问题,而且还可以应用于超高频交易,那么这个技术无论是对于我自己的交易策略或者对于vn.py项目本身也完全值得借鉴啊!\u003C\u002Fp\u003E\u003Cp\u003E毕竟开源的好处之一不就是可以博览众长,吸收各家的有点么(想到年底的Performance不进口水也流了下来)!\u003C\u002Fp\u003E\u003Cp\u003E获得在vn.py社区论坛发布Quicklib相关文章的作者同意后,接下来将会在专栏里发布其写的几篇文章,另外我本人也会再做一个系列关于性能方面的专题内容,一方面是想看看Quicklib是否真的完成了解决GIL痛点的技术(这么言之凿凿估计还是有些干货),另一方面也希望可以激发vn.py社区的灵感和相关讨论,看看有没有其他的办法可以进一步提高vn.py框架的性能。\u003C\u002Fp\u003E\u003Cbr\u003E不早了,准备睡觉,感谢读者朋友们的耐心~\u003Cbr\u003E\u003Cp\u003E\u003Cu\u003E\u003Cb\u003Evn.py项目的Github仓库:\u003Ca href=\&https:\\u002Fvnpy\u002Fvnpy\& data-editable=\&true\& data-title=\&vnpy\u002Fvnpy\&\u003Evnpy\u002Fvnpy\u003C\u002Fa\u003E,觉得还不错的话不妨来点个star!\u003C\u002Fb\u003E\u003C\u002Fu\u003E\u003C\u002Fp\u003E&,&updated&:new Date(&T16:44:51.000Z&),&canComment&:false,&commentPermission&:&anyone&,&commentCount&:64,&likeCount&:224,&state&:&published&,&isLiked&:false,&slug&:&&,&isTitleImageFullScreen&:false,&rating&:&none&,&sourceUrl&:&&,&publishedTime&:&T00:44:51+08:00&,&links&:{&comments&:&\u002Fapi\u002Fposts\u002F2Fcomments&},&url&:&\u002Fp\u002F&,&titleImage&:&https:\u002F\\u002Fv2-9cbd6b9efa7c0aed20cac_r.jpg&,&summary&:&&,&href&:&\u002Fapi\u002Fposts\u002F&,&meta&:{&previous&:null,&next&:null},&snapshotUrl&:&&,&commentsCount&:64,&likesCount&:224},&&:{&title&:&突破GIL?! - 转载 - Quicklib 源码分析 1&,&author&:&traderusingpython&,&content&:&\u003Ch2\u003E\u003Cu\u003E写在前面\u003C\u002Fu\u003E\u003C\u002Fh2\u003E\u003Cp\u003E昨天文章中提到过的Quicklib的事情,目前整个情况的发展有点超出我的预期,Quicklib的作者早上很快发出了第二篇文章:\u003Ca href=\&https:\u002F\\u002Fp\u002F\& data-editable=\&true\& data-title=\&Quicklib对VNPY团队贬低回应和异步IO与传统架构性能对比(2) - 知乎专栏\& class=\&\&\u003EQuicklib对VNPY团队贬低回应和异步IO与传统架构性能对比(2) - 知乎专栏\u003C\u002Fa\u003E,同时也在昨天文章下面做了留言提到\u003Cu\u003E\u003Cb\u003E自己并没有说过Quicklib可以用来做高频交易\u003C\u002Fb\u003E\u003C\u002Fu\u003E,而是本人理解有误。\u003C\u002Fp\u003E\u003Cp\u003E又仔细看了一遍之前的文章后,发现Quicklib的作者确实只提到了“Quicklib资金曲线工具,对高频交易的资金曲线进行测试”这么个说法。所以是本人昨天看文章不仔细抱个歉,不过看了“对高频交易的资金曲线进行测试”半天后,还是没能想明白到底在说什么。可能回头Quicklib作者写文章的时候,语言表达方面还是要稍微精炼一下?\u003C\u002Fp\u003E\u003Cp\u003E接下来会转载vn.py社区论坛上一位用户写的关于Quicklib的分析文章系列,\u003Cb\u003E\u003Cu\u003E再次强调下文章仅代表他的个人观点,和vn.py核心开发团队无关\u003C\u002Fu\u003E\u003C\u002Fb\u003E。\u003C\u002Fp\u003E\u003Cp\u003E看着豆粕期权波动率横盘了一上午,也是找了个空仔细拜读了一下这位朋友(“金融民工“,下称“民工”)的分析文章。不得不说民工在语言方面有点过激,就算内容方面讲的全都是事实,换了我是Quicklib的作者也肯定开心不起来。而且Coding这件事情谁都难免会有一些疏漏,在此代表vn.py社区向Quicklib的作者再抱个歉,抱歉的次数有点多哈,见谅。后面的讨论我们都会尽量集中在纯粹的技术领域,而不是人身攻击。\u003C\u002Fp\u003E\u003Cp\u003E另外也是联系了民工后他表示最近工作比较忙,没时间重写这几篇分析文章了。大家请将就着看吧,\u003Cb\u003E\u003Cu\u003E多关注技术内容,语言方面请包涵下了\u003C\u002Fu\u003E\u003C\u002Fb\u003E。\u003C\u002Fp\u003E\u003Cbr\u003E\u003Ch2\u003E\u003Cu\u003E正文\u003C\u002Fu\u003E\u003C\u002Fh2\u003E\u003Cp\u003E作者:金融民工\u003C\u002Fp\u003E\u003Cp\u003E这个世界事变,不是因为坏人作恶,而是因为好人不作为。看着最近有名为quicklib的一个library到处秀智商下限,招摇撞骗,不懂装懂,睁眼说瞎话,这种行径如果是无意为之那就是蠢,如果是蓄意为之就是坏,目前看起来很可能是又蠢又坏。所以鄙人打算在此写一个小的源码分析系列, 让大家看看这个所谓的quicklib究竟是什么玩意。\u003Cbr\u003E\u003Cbr\u003E可能很多人还不知道quicklib是干嘛的,没关系可以搓这里\u003Ca href=\&http:\\u002Findex.htm\& class=\&\& data-editable=\&true\& data-title=\&quicklib主页\&\u003Equicklib主页\u003C\u002Fa\u003E。简而言之其作者称其为一个Python的交易框架。以\&高性能\&, \&架构美丽\&为宣传点四处发牛皮鲜似的广告。好了带大家一起来看看这个所谓之\&高性能\&,\&架构美丽\&到底如何。\u003C\u002Fp\u003E\u003Cp\u003Egit clone下来可以看到这样的目录(请原谅我笑点低, 看到红色画框的部分就莫名的想笑.)\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Cimg src=\&v2-bcace6d563c0e8eb4905a60.png\& data-rawwidth=\&802\& data-rawheight=\&979\&\u003E代码部分主要看 Quicklib\u002F(A)Quicklib CTP期货行情交易接口Python开源框架\u002FWindows\u002Fsource, 分为行情和交易两个部分:\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Cimg src=\&v2-22b6bbde37fd4a585bbc9a.png\& data-rawwidth=\&457\& data-rawheight=\&80\&\u003E先来看看这个这么吊炸天的框架所谓之行情部分如何实现.vs2015打开项目文件之后, 可以看到项目文件结构是这样:\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Cimg src=\&v2-031a83e181d35ade45aa.png\& data-rawwidth=\&348\& data-rawheight=\&708\&\u003E哟还有AES加密呢,但grep了一下, 似乎没有什么地方用得到AES呢,为了拼行数吗?不知道为何又莫名的笑了一下。同样的CRC32也没发现什么地方用到啊。\u003C\u002Fp\u003E\u003Cp\u003E好吧正经一点儿,我们来进入正题。\u003Cbr\u003E\u003Cbr\u003E先来看QLCTPMDInterface.h这里,好多可以看到extern \&C\&{} 包起来的各式函数声明. 这些函数的定义在QuicklibCtpMD.cpp里面,然后QuicklibCtpMD.cpp里面呢除了这些函数定义之外, 还充斥着大量的杂乱无章的全局变量。为什么会这样呢?因为Python调用C的library非常方便, 那么简单的把CTP的内容用函数都包一下, 就可以了,来看个例子:\u003Cbr\u003E\u003C\u002Fp\u003E\u003Ccode lang=\&cpp\&\u003E\u002F\u002F 声明部分\nint QUCIKLIB_MD_API ReqUserLogin();\n\n\u002F\u002F 定义部分\nint ReqUserLogin()\n{\n
return gMDSpi.ReqUserLogin();\n}\n\u003C\u002Fcode\u003E\u003Cp\u003E看gMDSpi变量的声明, 呵呵果不其然是一个全局对象, 在945行:\u003Cbr\u003E\u003C\u002Fp\u003E\u003Ccode lang=\&cpp\&\u003ECMdSpi gMDS\n\u003C\u002Fcode\u003E\u003Cp\u003E在来看看订阅行情的函数:\u003Cbr\u003E\u003C\u002Fp\u003E\u003Ccode lang=\&cpp\&\u003E\u002F\u002F 声明\nvoid QUCIKLIB_MD_API Subscribe(const char *InstrumentID);\n\n\u002F\u002F 定义\nvoid Subscribe(const char *InstrumentID)\n{\n
\u002F\u002Fchar * crcvalue = NULL;\n
Add(InstrumentID, NULL);\n
ppInstrumentID[amount] = new TThostFtdcInstrumentIDT\n
::strcpy(ppInstrumentID[amount], InstrumentID);\n
\u002F\u002F::strcpy_s(ppInstrumentID[amount],sizeof(ppInstrumentID[amount]), contract);\n
gMarket[InstrumentID] =\n
\u002F\u002Fdata[amount] = new CThostFtdcDepthMarketDataF\n
depthdata[amount] = new CThostFtdcDepthMarketDataF\n
gMDSpi.SubscribeMarketData();\n
\n}\n\u003C\u002Fcode\u003E\u003Cp\u003E有没有感受到一股浓郁的c with class气息, 仿佛回到了大一初学C++的样子? \u003C\u002Fp\u003E\u003Cp\u003EgMDSpi.SubscribeMarketData();之前几行在准备各种参数, 写在全局变量里面, 然后调用gMDSpi.SubscribeMarketData();SubscribeMarketData函数:\u003Cbr\u003E\u003C\u002Fp\u003E\u003Ccode lang=\&cpp\&\u003Evoid CMdSpi::SubscribeMarketData()\n{\n
int iResult = mpUserApi-&SubscribeMarketData( &(ppInstrumentID[amount - 1]), 1);\n
if (iResult != 0)\n
cerr && \&Failer:订阅[\& && ppInstrumentID[amount - 1] && \&]\& && ((iResult == 0) ? \&成功\& : \&失败(\&) && iResult && \&)\& &&\n
std::cout && \&Scuess:订阅[\& && ppInstrumentID[amount - 1] && \&]行情成功\& && std::\n\n}\n\u003C\u002Fcode\u003E\u003Cp\u003E也不传个参数,则直接取全局对象来用,然后这些随意的随处可见的std::cout,printf, std::cerr,这代码技艺作为一个自称写了10多年C++的人来说真是令人叹为观止! \u003Cbr\u003E\u003Cbr\u003EMdSpi.h是CThostFtdcMdSpi的派生类CMdSpi声明部分, 而MdSpi.cpp则是对应的实现部分, MdSpi.cpp接近6k行代码, 而下面四个函数, 就4800多行!\u003C\u002Fp\u003E\u003Cp\u003EModifyMap, 1700行+\u003Cbr\u003EClearGuestOnlineHash, 300行+\u003Cbr\u003EInitGuestOnlineHash, 800行+\u003Cbr\u003EUpdatePriceHash, 1900行+\u003C\u002Fp\u003E\u003Cp\u003E看到这里的时候我也是惊掉下巴,是怎么样复杂的代码非要这样实现呢。看到这里的时候一度不想继续看下去,感觉就像一只在吃*一样难受。不过不必细看才也猜得出来这几个函数所实现的逻辑是tick数据生成bar数据的,(上千行的函数, 真心没耐心看下去, 如果猜得不对还望指出)。\u003C\u002Fp\u003E\u003Cp\u003E不能光指出问题自己没干货嘛,那么一般来讲tick生成bar应该怎么写呢?bar数据一般来讲包含以下几个信息:high、low、open、close。进入一个周期的第一个tick记录下open,并给high和low赋初值,周期最后一个tick记录下close,并发出bar信息。而1min, 5min, 1day, 1mon的bar除了周期不同,并没有其他不同。好,随手来写一段(徒手写, 请不要在意语法细节问题):\u003Cbr\u003E\u003C\u002Fp\u003E\u003Ccode lang=\&cpp\&\u003E#include &stdint.h&\n\n#include &vector&\n#include &functional&\n#include &unordered_map&\n\n#include &boost\u002Fany.hpp&\n\nclass Bus\n{\npublic:\n
template&class T&\n
void send(const T &t)\n
\u002F\u002F...\n
template&class T&\n
void register_type(const std::function&void (const T &)& &cb)\n
_callbacks.insert({typeid(T).hash_code(), cb});\n
void run();\n\nprivate:\n
std::unordered_multimap&size_t, boost::any& _\n};\n\nstruct Tick\n{\\\n
int32_\n\n\n};\n\n\ntemplate&uint64_t PERIOD&\nstruct Bar\n{\\\\\n};\n\nconstexpr uint64_t MIN = 120;
\u002F\u002F 1min(500ms一次, 60s有120)\nconstexpr uint64_t HOUR = 7200;\nconstexpr uint64_t DAY = 172800;\n\ntypedef Bar&MIN& bar_1min_t;\ntypedef Bar&HOUR& bar_1hour_t;\ntypedef Bar&DAY& bar_1day_t;\n\ntemplate&uint64_t PERIOD&\nclass Generator\n{\npublic:\n
Generator(Bus &bus)\n
: _bus(bus)\n
, _period(PERIOD)\n
, _ticks(PERIOD)\n
, _index(0)\n
void init()\n
_bus.register_type(std::bind(&Generator&PERIOD&::on_tick,\n
void on_tick(const Tick &tick)\n
switch(_index)\n
_open = tick.\n
_high = tick.\n
_low = tick.\n
case PERIOD-1:\n
_close = tick.\n
if(_high & tick.lastprice) _high = tick.\n
if(_low & tick.lastprice) _low = tick.\n\n
_bus.send(Bar&PERIOD&{\n
_index = 0;\n \n
default:\n
if(_high & tick.lastprice) _high = tick.\n
if(_low & tick.lastprice) _low = tick.\n
}\n\nprivate:\n
Bus &_\n\n
double _\n
double _\n
double _\n
double _\n\n
int32_t _\n};\n\nvoid on_min(const bar_1min_t &bar)\n{\n
\u002F\u002F ...\n}\n\nvoid on_day(const bar_1day_t &bar)\n{\n
\u002F\u002F ...\n}\n\n\nint main(int argc, char *argv[])\n{\n
bus.register_type&bar_1min_t&(on_min);\n
bus.register_type&bar_1day_t&(on_day);\n\n
Generator&MIN& gen_1min(bus);\n
gen_1min.init();\n\n
Generator&DAY& gen_1day(bus);\n
gen_1day.init();\n\n
bus.run();\n\n
return 0;\n}\n\n\u003C\u002Fcode\u003E\u003Cp\u003E算是比较朴素的一段代码,也没使用上什么奇淫奇技。\u003C\u002Fp\u003E\u003Cp\u003E所有号称性能比较屌的玩意,我都喜欢看看它的log。我们来看看quicklib的log是怎么实现的:\u003Cbr\u003E\u003C\u002Fp\u003E\u003Ccode lang=\&cpp\&\u003E#define LOG_LENGTH
100\nstruct LOGSTRUCT\n{\n
char log[LOG_LENGTH];\n};\nlist &LOGSTRUCT&\nlist &LOGSTRUCT&::iterator log_I\n\nvoid LOG(char * msg)\n{\n
LOGSTRUCT\n\n
memset(&tn, 0, sizeof(LOGSTRUCT));\n
_snprintf_s(tn.log, sizeof(tn.log), sizeof(tn.log), \&%s\&, msg);\n
EnterCriticalSection(&g_csdata);\n
loglist.push_back(tn);\n
LeaveCriticalSection(&g_csdata);\n
SetEvent(hEvent[EID_OnLog]);\n\n}\n\u003C\u002Fcode\u003E\u003Cp\u003E真是平淡无奇的log啊,snprintf把指针的内容打印到数组里面存起来, 然后放到全局的数组list里面。因为用的全局的对象(loglist),这里需要用EnterCriticalSection和EnterCriticalSection把可能存在争用的资源给lock一下。\u003C\u002Fp\u003E\u003Cp\u003E然后SetEvent发出个信号.(这个SetEvent会对应OnCmd函数里面的WaitForMultipleObjects, 这部分在讲quicklib的事件驱动机制的时候再详细讲)。\u003C\u002Fp\u003E\u003Cp\u003E代码很简单, 问题倒不少, 呢首先功能太鸡肋了, 能接受char *这样的参数。\u003C\u002Fp\u003E\u003Cp\u003E然后性能真是太shit了, 表现在几个方面:\u003Cbr\u003E\u003C\u002Fp\u003E\u003Col\u003E\u003Cli\u003Esnprintf这玩意很慢很慢\u003Cbr\u003E\u003C\u002Fli\u003E\u003Cli\u003E其次假如调用是LOG(\&啦啦啦啦\&), 这样的时候, \&啦啦啦啦\&这一串字符常量是存储在特定的区域的, 处理字符常量只需要拷贝一个指针就可以了, 不需要拷贝整窜字符串. \u003Cbr\u003E\u003C\u002Fli\u003E\u003Cli\u003E这玩意是同步的, 同步的log你知道io有多慢吗????!!!\u003Cbr\u003E\u003C\u002Fli\u003E\u003Cli\u003E除此之外保护全局对象的lock, 为什么不用RAII来管理? 这个问题quicklib的所有全局对象都有。\u003C\u002Fli\u003E\u003C\u002Fol\u003E\u003Cbr\u003E短短7行代码就暴露如此多的问题, 说框架性能多屌, 我是一丁点都不信的. 因为论坛字数限制本篇完, 下一篇继续带大家讲解\&神奇\&的quicklib。\u003Cbr\u003E\u003Ch2\u003E\u003Cu\u003E写在后面\u003C\u002Fu\u003E\u003C\u002Fh2\u003E\u003Cp\u003E关注vn.py的朋友应该知道之前一直比较集中于新API接口对接、新交易功能开发、文档编写等方面,性能方面的问题因为vn.py项目核心开发团队所在的一些量化大机构中都有自己的低延时算法交易系统,所以没有专门去深入研究。\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cp\u003E这次被Quicklib的作者调起了兴趣,也希望借着这个机会能集思广益,一方面彻底研究下vn.py性能方面的瓶颈所在(发现问题),另一方面看看有没有什么好的方法可以突破这个瓶颈(解决方案),毕竟对于一个管钱的交易员来说交易的利润才是最终追求。\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cbr\u003E\u003Cp\u003E\u003Cu\u003E\u003Cb\u003Evn.py项目的Github仓库:\u003Ca href=\&http:\u002F\\u002F?target=https%3A\\u002Fvnpy\u002Fvnpy\& class=\&\& data-editable=\&true\& data-title=\&vnpy\u002Fvnpy\&\u003Evnpy\u002Fvnpy\u003C\u002Fa\u003E,觉得还不错的话不妨来点个star!\u003C\u002Fb\u003E\u003C\u002Fu\u003E\u003C\u002Fp\u003E&,&updated&:new Date(&T05:22:20.000Z&),&canComment&:false,&commentPermission&:&anyone&,&commentCount&:36,&likeCount&:31,&state&:&published&,&isLiked&:false,&slug&:&&,&isTitleImageFullScreen&:false,&rating&:&none&,&sourceUrl&:&&,&publishedTime&:&T13:22:20+08:00&,&links&:{&comments&:&\u002Fapi\u002Fposts\u002F2Fcomments&},&url&:&\u002Fp\u002F&,&titleImage&:&https:\u002F\\u002Fv2-967f6ce6a5cb24b004e46ba02578ebe0_r.jpg&,&summary&:&&,&href&:&\u002Fapi\u002Fposts\u002F&,&meta&:{&previous&:null,&next&:null},&snapshotUrl&:&&,&commentsCount&:36,&likesCount&:31},&&:{&title&:&突破GIL?? - 转载 - Quicklib 源码分析 2&,&author&:&traderusingpython&,&content&:&\u003Cp\u003E\u003Cb\u003E提示:\u003C\u002Fb\u003E\u003Cb\u003E干货\u003C\u002Fb\u003E\u003Cb\u003E分析在第二段和第三段,想节省时间的朋友可以跳过第一段。\u003C\u002Fb\u003E\u003Cbr\u003E\u003C\u002Fp\u003E\u003Ch2\u003E\u003Cu\u003E\u003Cb\u003E写在前面\u003C\u002Fb\u003E\u003C\u002Fu\u003E\u003C\u002Fh2\u003E\u003Cp\u003E周末陪家人出去玩了一天,回来后看到Quicklib的作者在我的两篇文章下发了不少重复的评论,简单总结下他的观点,也写一下我的回应。\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E观点1:vn.py的代码写的很烂,完全不屑于看。\u003C\u002Fp\u003E\u003Cp\u003E回应1:作为一个非科班出身的程序员,我一直觉得自己代码写的不咋地,高手不屑于看我表示完全理解。\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cp\u003E观点2:vn.py采用的是落后的多线程架构,Quicklib采用的异步IO架构性能要高得多。\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E回应2:才说不屑于看vn.py的代码,这就能知道vn.py采用的是落后的多线程架构,这个我只能表示不明觉厉。另外,和Quicklib作者相反,我正在仔细研究Quicklib的代码,希望可以理解其所谓的“异步IO”架构,受限于较低的代码阅读水平,还没完全看懂,我会继续努力。\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cp\u003E观点3:Quicklib是Python的Node.js版本,性能远超PHP(指vn.py)。\u003C\u002Fp\u003E\u003Cp\u003E回应3:这个需要靠代码分析和测试结果来说话,否则似乎给人一种“五菱宏光才是秋名山神车”的感觉?\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cbr\u003E\u003Cp\u003E观点4:Quicklib中的那部分vn.demo代码,是社区用户贡献的,和作者无关,接下来立即就会删除。\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E回应4:这点我表示完全理解,早期vn.py代码也有过比较混乱的阶段。不过想要项目未来能够成功,作者还是得看一眼社区的PR内容后再合并吧。\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cbr\u003E\u003Cp\u003E观点5:vn.py占据了先发优势,对Quicklib这个有潜在威胁的项目进行提前打压,本质好比2岁的孩子打10个月的孩子一样。\u003C\u002Fp\u003E\u003Cp\u003E回应5:感谢对vn.py这么高的评价,不过个人觉得现在的完成度离2岁的孩子还很远。另外感谢社区用户的捧场,我作为嘉宾过去一年受邀参加过几次活动(PyCon2016、中国金融创新峰会等),演讲过程中对于国内其他的一些开源量化项目:tushare、easy trader、at_py、RQAlpha等都做了介绍和推荐,网上也还能找到相关的视频和报道。说我现在专门针对Quicklib进行提前打压,是在暗示所有这些我推荐过的项目都比不上Quicklib?\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cp\u003E读者如果觉得有遗漏的观点请在文章下面留言哈,我会在下一篇里继续回应,现在进入正文部分了。\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cbr\u003E\u003Ch2\u003E\u003Cu\u003E\u003Cb\u003E正文\u003C\u002Fb\u003E\u003C\u002Fu\u003E\u003C\u002Fh2\u003E\u003Cp\u003E\u003Cb\u003E作者:金融民工\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cp\u003E上一篇看完log,这一篇我们来看看quicklib一直吹嘘所谓先进的事件驱动机制到底有何神奇之处,先来看看OnCmd这个函数:\u003C\u002Fp\u003E\u003Ccode lang=\&cpp\&\u003Eint OnCmd()\n{\nDWORD dw = WaitForMultipleObjects(MAX_EVENTNUM, hEvent, FALSE, INFINITE);\n\nswitch (dw)\n{\ncase WAIT_OBJECT_0 + EID_OnFrontDisconnected:\n\n\u002F\u002F The process identified by h[0] (hProcess1) terminated.\nreturn SYSTEM_NETCONNECT_BREAK;\\n\ncase WAIT_OBJECT_0 + EID_OnFrontConnected:\n\n\u002F\u002F The process identified by h[1] (hProcess2) terminated.\nreturn SYSTEM_NETCONNECT_SCUESS;\\n\ncase WAIT_OBJECT_0 + EID_OnRspUserLogin_Failer:\n\n\u002F\u002F The process identified by h[2] (hProcess3) terminated.\nreturn SYSTEM_LOGIN_DENIED;\\ncase WAIT_OBJECT_0 + EID_OnRspUserLogin_Scuess:\n\n\u002F\u002F The process identified by h[2] (hProcess3) terminated.\nreturn SYSTEM_LOGIN_SCUESS;\\ncase WAIT_OBJECT_0 + EID_OnRtnDepthMarketData:\n\n\u002F\u002F The process identified by h[2] (hProcess3) terminated.\nreturn SYSTEM_NEWTICK;\\ncase WAIT_OBJECT_0 + EID_IsErrorRspInfo:\n\n\u002F\u002F The process identified by h[2] (hProcess3) terminated.\nreturn SYSTEM_SYSTEM_ERROR;\\ncase WAIT_OBJECT_0 + EID_OnRspSubMarketData:\n\n\u002F\u002F The process identified by h[2] (hProcess3) terminated.\nreturn SYSTEM_SUBCRIBE_SCUESS;\\ncase WAIT_OBJECT_0 + EID_OnRspUnSubMarketData:\n\n\u002F\u002F The process identified by h[2] (hProcess3) terminated.\nreturn SYSTEM_UNSUBCRIBE_SCUESS;\\ncase WAIT_OBJECT_0 + EID_OnRspUserLogout:\n\n\u002F\u002F The process identified by h[2] (hProcess3) terminated.\nreturn SYSTEM_LOGINOUT_SCUESS;\\n\ncase WAIT_OBJECT_0 + EID_OnRspForQuote:\n\n\u002F\u002F The process identified by h[2] (hProcess3) terminated.\nreturn SYSTEM_QRY_FORQUOTE;\\ncase WAIT_OBJECT_0 + EID_OnLog:\n\n\u002F\u002F The process identified by h[2] (hProcess3) terminated.\nreturn SYSTEM_LOG;\\n\n}\n\nreturn SYSTEM_EMPTY;\n\u003C\u002Fcode\u003E\u003Cp\u003E不熟悉Windows sdk的同学看得有点懵是把,重点在WaitForMultipleObjects这个函数这里。这个函数详细参考请看\u003Ca href=\&https:\u002F\\u002Fen-us\u002Flibrary\u002Fwindows\u002Fdesktop\u002Fms687025(v=vs.85).aspx\& class=\&\& data-editable=\&true\& data-title=\&MSDN对应的词条\&\u003EMSDN对应的词条\u003C\u002Fa\u003E,通俗点说就是它可以等待多个内核对象}

我要回帖

更多关于 box size 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信