VeighNa量化社区
你的开源社区量化交易平台
niubility's Avatar
Member
离线
10 帖子
声望: 0

用Python的交易员 wrote:

  1. 请使用64位的项目设置
  2. 链接器文件里,需要添加两个CTP lib静态库的文件名

感谢,这两个我都试过了,还是不行,后来我把 Debug 改成 Release 后,编译就成功了,我现在都没有想通为啥。。。。

vnpy 版本为 2.0.8

编译 6.3.16 64位的 CTP接口
我使用的是 VS2017(v141)
直接打开 vnpy.api.ctp.vnctp 下的 vnctp.sln 文件项目
修正了windows SDK版本(10.0.17763.0),VC++ 目录包含 python 3.7.5 的include 和 libs,如下图所示:
description
这样之后没有头文件等报错了。

我在编译的时候,选择 X64 平台会出现如下报错:
description

选择 X86 平台是又有这种错误:
description

对于 X86的错误我的理解是因为我使用了python 3.7.5 的libs,并没有32的库文件,所以出错,但是我实在不知道 X64平台的错误再哪里?(编译没错,链接报错了)
还望大家有空帮忙看一下,感谢!!

用Python的交易员 wrote:

并不是,因为上一个小时线也是从同样位置开始分割的,小时线里包含的还是60根分钟线,想不明白可以自己加个计数器打印出来看看

哦哦,对,确实还是 1 小时长度的,只是小时的分割并非按照正常时间的 00 分到 60分, 而是 01分到下一个小时的01分,感谢!

用Python的交易员 wrote:

BarGenerator只负责K线的聚合功能,回测时下单数据的撮合是由回测引擎内部的逻辑负责的,严格遵循T时刻委托,只有T+1时刻之后才能撮合的逻辑,所以并不会有未来函数问题。

这里的last_bar,是上一跟收到的1分钟K线数据,而不是合成过程中缓存的K线数据

这里就有一个问题了,就是此时的 window_bar 其实包含了 此时刻 bar 的数据的,也就是说 window_bar 是 1小时零1分的 K线了,并非 1小时的

在 cta_backtester/ui/widget.py 中 CandleChartDialog 类修改 update_trades 函数:
注释下面的代码:
if trade.direction == Direction.LONG:
scatter["symbol"] = "t1"
scatter["brush"] = pg.mkBrush((255, 255, 0))
else:
scatter["symbol"] = "t"
scatter["brush"] = pg.mkBrush((0, 0, 255))

在同位置新增代码:
if trade.direction == Direction.LONG and trade.offset == Offset.OPEN:
scatter["symbol"] = "t1" # 上三角
scatter["brush"] = pg.mkBrush((255, 255, 0))
elif trade.direction == Direction.SHORT and trade.offset == Offset.OPEN:
scatter["symbol"] = "t" # 下三角
scatter["brush"] = pg.mkBrush((255, 255, 0))
elif trade.direction == Direction.LONG and trade.offset != Offset.OPEN:
scatter["symbol"] = "t1"
scatter["brush"] = pg.mkBrush((0, 0, 255))
elif trade.direction == Direction.SHORT and trade.offset != Offset.OPEN:
scatter["symbol"] = "t"
scatter["brush"] = pg.mkBrush((0, 0, 255))

这样之后,黄色表示开仓,蓝色表示平仓的,箭头表示多空,这样感觉更直观

首先,将 rqdata 保存到 sqlite 时,对rqdata 的日期做了特殊处理,减了1分钟,也就是说时间为 10:00:00的数据其实是10:00:00 到 10:01:00的ohlc价格,这个是前提

再看 BarGenerator 的 update_bar 函数,它会将最新的 bar 的数据更新到 self.window_bar 中,假设此时传到 update_bar 中的 bar 的时间为10:00:00(注意这个bar实际表示的价格是10:00:00 到 10:01:00之间的),这个bar 的 ohlc 价格会先更新到 self.window_bar(合成1小时时,此时这个window_bar要表示的是9点的数据) 中,之后代码中再判断当前bar与上一个bar 的小时是否相等,如果相等表示这个window_bar完成,这是不是有问题了,这个windows_bar其实用到了未来数据了(就是10:00:00 到 10:01:00的价格)?还望回答一下,谢谢!

description

description
请教一下,上图中画圈的两个三角型,向下是表示开仓做空,向上是表示开仓做多么?平仓是怎么看的?感谢!

我看到某些策略中存在 exit_time = time(hour=14, minute=55),比如程序中已经写好的策略 DualThrustStrategy,并且会进行判断当前时间是否大于 exit_time,如果大于 exit_time 就全部平仓,这样是不是意味着放弃夜盘了?虽然是日内策略,但是这样是不是有些不大对了?还望解答,感谢!

出现该问题的原因是 BacktestingEngine 中的 cross_stop_order 函数没有对 stop_order 的状态进行判断。该函数的最后会调用 self.strategy.on_trade(trade) 函数,而类似 KingKeltnerStrategy 中的 on_trade 函数会调用 cancel_order 取消某条 stop_order 报单,将 active_stop_orders 中的 该条 stop_order 报单 pop 出去,但是在 cross_stop_order 中循环时还是可能会访问到该条 stop_order 报单,如果这条报单正好可以成交,会导致再次 pop 而报错。

解决方式为在 cross_stop_order 函数最开始加一条判断就好了:
if stop_order.status == StopOrderStatus.CANCELLED:
continue

© 2015-2022 微信 18391752892
备案服务号:沪ICP备18006526号

沪公网安备 31011502017034号

【用户协议】
【隐私政策】
【免责条款】