针对VNPY的软件bugs的修改总结
前言
本人fork了VNPY的2.1.7版本,但是为了别人能够安装和使用官方的版本,所以取名叫howtrader, 意思就是如何Trader,如何成为一个quant或者trader。

但是在使用和测试的过程中,发现针对币安的api部分,有不少的bug进行修改。现将部分的修改总结一下。

bugs分析和修复过程
k先部分,VNPY Trader是根据tick的数据来合成分钟的K线,然后再讲分钟的K线合成更高界别的K线数据。但是币安的api他们推送的ticker数据是滚动24小时的ticker数据,成交的价格和量都是过去24小时的数据,数据格式如下:

 {"e": "24hrTicker",  // 事件类型"E": 123456789,     // 事件时间"s": "BNBBTC",      // 交易对"p": "0.0015",      // 24小时价格变化"P": "250.00",      // 24小时价格变化(百分比)"w": "0.0018",      // 平均价格"x": "0.0009",      // 整整24小时之前,向前数的最后一次成交价格"c": "0.0025",      // 最新成交价格"Q": "10",          // 最新成交交易的成交量"b": "0.0024",      // 目前最高买单价"B": "10",          // 目前最高买单价的挂单量"a": "0.0026",      // 目前最低卖单价"A": "100",         // 目前最低卖单价的挂单量"o": "0.0010",      // 整整24小时前,向后数的第一次成交价格"h": "0.0025",      // 24小时内最高成交价"l": "0.0010",      // 24小时内最低成交加"v": "10000",       // 24小时内成交量"q": "18",          // 24小时内成交额"O": 0,             // 统计开始时间"C": 86400000,      // 统计结束时间"F": 0,             // 24小时内第一笔成交交易ID"L": 18150,         // 24小时内最后一笔成交交易ID"n": 18151          // 24小时内成交数
}

根据这样的ticker数据处理,实际上得不到分钟的数据的。所以需要订阅分钟的数据,然后拿到分钟的数据进行合成。

vnpy的分钟合成小时数据实际上它是慢了一分钟的的,我们看下它合成的逻辑

def update_bar(self, bar: BarData) -> None:"""Update 1 minute bar into generator"""# If not inited, creaate window bar objectif not self.window_bar:# Generate timestamp for bar dataif self.interval == Interval.MINUTE:dt = bar.datetime.replace(second=0, microsecond=0)else:dt = bar.datetime.replace(minute=0, second=0, microsecond=0)self.window_bar = BarData(symbol=bar.symbol,exchange=bar.exchange,datetime=dt,gateway_name=bar.gateway_name,open_price=bar.open_price,high_price=bar.high_price,low_price=bar.low_price)# Otherwise, update high/low price into window barelse:self.window_bar.high_price = max(self.window_bar.high_price, bar.high_price)self.window_bar.low_price = min(self.window_bar.low_price, bar.low_price)# Update close price/volume into window barself.window_bar.close_price = bar.close_priceself.window_bar.volume += int(bar.volume)self.window_bar.open_interest = bar.open_interest# Check if window bar completedfinished = Falseif self.interval == Interval.MINUTE:# x-minute barif not (bar.datetime.minute + 1) % self.window:finished = Trueelif self.interval == Interval.HOUR:if self.last_bar and bar.datetime.hour != self.last_bar.datetime.hour:# 1-hour barif self.window == 1:finished = True# x-hour barelse:self.interval_count += 1if not self.interval_count % self.window:finished = Trueself.interval_count = 0if finished:self.on_window_bar(self.window_bar)self.window_bar = None# Cache last bar objectself.last_bar = bar

主要看这个代码, 它是根据当前小时和上一个小时数据不同的时候,就是一小时的数据,但是币安的K线数的时间是开始的时间的,所以一小时的结束的时候,实际上是59分钟,也就是59分钟的时候这个小时就走完了,另外成交量是可以float的类型,它强制转成int的类型,也是不对的。

if self.interval == Interval.MINUTE:# x-minute barif not (bar.datetime.minute + 1) % self.window:finished = True
elif self.interval == Interval.HOUR:if self.last_bar and bar.datetime.hour != self.last_bar.datetime.hour:# 1-hour barif self.window == 1:finished = True# x-hour barelse:self.interval_count += 1if not self.interval_count % self.window:finished = Trueself.interval_count = 0

正确的做法是:

if self.interval == Interval.MINUTE:# x-minute barif not (bar.datetime.minute + 1) % self.window:finished = True
elif self.interval == Interval.HOUR:# if self.last_bar and bar.datetime.hour != self.last_bar.datetime.hour: # vnpy的判断条件if (bar.datetime.minute == 59 and bar.interval == Interval.MINUTE) or (self.last_bar and bar.datetime.hour != self.last_bar.datetime.hour and bar.interval == Interval.HOUR):# if the bar is one minute, then the 59minute is the last one bar for one hour.# 1-hour barif self.window == 1:finished = True# x-hour barelse:self.interval_count += 1if not self.interval_count % self.window:finished = Trueself.interval_count = 0

关于订单的on_trade的推送
on_trade事件的推送非常重要,如果on_trade的事件没有收到,那么策略的仓位数据pos是计算错误的。
VNPY的on_trade更新只来自服务器的推送,如果不凑巧,某个时间你刚好成交了,但是由于你的websocket断开,你没有收到服务器推送的on_trade的更新,导致你的策略的pos计算错误。

所以解决问题的方法是,我们更过监听on_trade的方法,然后计算每次订单的成交量来计算on_trade, 同时我们会在主引擎那里,定时去查询挂单时间比较长的订单,防止由于服务器的断开导致我们的订单状态更新没有收到。

关于推送的on_position
同样on_position是我们做合约非常重要的数据,我们可能成交了,但是position的数据由于websocket没有及时的推送,另外VNPY查询的on_position如果通过rest api查询的话,实际上它只推送position不为零的数据,这个也不太合理,合理的做法是我们也应该推送订阅行情的仓位数据,这样如果我们的平仓的时候,我们的仓位也是为零的,但是也应该推送给我们,这样我们才能监听到我们的具体仓位的变化。
代码更新
具体查看github的代码
请参考网易云课堂的课程视频
作者:51bitquant
链接:https://www.jianshu.com/p/98846a083cb4
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

【转载收藏】针对VNPY的软件bugs的修改总结相关推荐

  1. 【转载收藏】OldVersion下载旧版本软件网站

    [转载收藏]OldVersion下载旧版本软件网站 OldVersion http://www.oldversion.com/ OldVersion是一个提供着Windows.Mac.Linux.游戏 ...

  2. 【转载收藏】介绍一种百度盘高速下载方式 - Pandownload网页版

    [转载收藏]介绍一种百度盘高速下载方式 - Pandownload网页版 百度盘高速下载软件Pandownload推出了网页版,我测试了下还挺好用的,下载速度不错,网页版在pc和手机上都可以用,对于偶 ...

  3. php如何把线条变粗,科学网—AutoCAD线条加粗秘诀(转载收藏) - 顿玉环的博文...

    AutoCAD线条加粗秘诀(转载收藏) 已有 4129 次阅读 2009-8-28 18:19 |个人分类:未分类|系统分类:科研笔记 对图形中的某些线条进行加粗是经常需要进行的工作,AutoCAD ...

  4. 头条视频消重软件 免费批量修改视频md5

             头条视频消重软件 免费批量修改视频md5          随后,抖音对此进行回应,称其指控失实,或将追究责任.                      在短视频操作中,视频修改的 ...

  5. 百家号视频怎么消重批量处理去重消重去水印去logo软件视频MD5修改工具(短视频去重) 自媒体如何解...

    百家号视频怎么消重批量处理去重消重去水印去logo软件 视频MD5修改工具(短视频去重) 自媒体如何解决视频重复问题头条视频去重 今日头条视频消重去重复方法 自媒体视频获利怎么去重复做好伪原创 短视频 ...

  6. 新中大连接服务器文件,新中大软件服务器地址修改

    新中大软件服务器地址修改 内容精选 换一换 客户端通过负载均衡器访问后端服务器异常,负载均衡器的"后端服务器组"页签显示后端服务器的健康检查结果为"异常".共享 ...

  7. 视频消重软件百度云 修改视频md5为原创吸粉

             视频消重软件百度云 修改视频md5为原创吸粉          简单的说,用户A将头条系链接分享到自己的朋友圈时,B点击该链接时A的账号信息和B的Cookie会传送到服务器.,在我们 ...

  8. Linux常用命令大全(转载收藏)

    转载自鸿燕藏锋:https://www.cnblogs.com/yjd_hycf_space/p/7730690.html 最近都在和Linux打交道,感觉还不错.我觉得Linux相比windows比 ...

  9. 转载:优启通添加软件方法(一些 EXLOAD 简单的应用例子 )

    近日,由于未知原因,使用优启通自带浏览器访问ip地址网页时,总是无法访问.故采取自行添加单文件Chrome浏览器的方式,添加自定义软件.添加方法来源于IT天空https://www.itsk.com/ ...

最新文章

  1. 业务工作流平台设计(六)
  2. Wsus存储更新文件的磁盘已满
  3. 基于Autoencoder的反欺诈数据集的异常检测
  4. bootstrap图片叠加_图片 | Images
  5. java is number_数据类型----Number
  6. java rest tomcat_java – REST服务返回HTTP 204(Tomcat / Linux)
  7. Android系统进程间通信(IPC)机制Binder中的Server启动过程源代码分析
  8. WAI-ARIA和屏幕阅读器
  9. SharePoint 2007 开发系列(14) 调试sharepoint web part
  10. LazyInitializationException的四种解决方案–第1部分
  11. 《算法基础》——3.9 总结
  12. 如何将Vue中表格数据,以Excel格式导出?报saveAs错误如何解决?
  13. mac制作ubuntu 18.04 U盘启动盘
  14. 软件工程阶段性总结(二)——软件计划和需求分析
  15. 禁止 Windows 10 和 Windows Server 自动更新
  16. C语言解决打鱼晒网问题
  17. PTA L1-003 个位数统计(详解)
  18. 北京科技大学本科毕业论文答辩和论文选题PPT模板
  19. oracle解锁账户以及修改密码
  20. 读《Java编程思想》笔记

热门文章

  1. TCP/IP四层模型与OSI七层参考模型(网络协议)
  2. 【服务器知识】免费申请SSL证书并给网站添加证书
  3. Windows10鼠标右键增加新项
  4. h3c服务器开机无法自行进入系统,H3C服务器设置自启动
  5. 【ATT 与 Intel】汇编与C语言相互调用及内联汇编
  6. Win7及以上笔记本设置共享WiFi热点
  7. 阿里巴巴字体图标怎么改变尺寸
  8. 经济学计算机会成本 会计成本的案例题,案例4:利润在经济学家与会计师眼中的是不同的...
  9. 人工智能还是人工智障?我tm快崩溃了
  10. WinSockAPI