VeighNa量化社区
你的开源社区量化交易平台
Member
avatar
加入于:
帖子: 38
声望: 0

请问如何在策略里读取交易当天的开盘价,或者某时某刻的成交价?在dual thrust 的 例子里,是通过判定上一个bar和当前bar的日期不同,来决定当前bar是否开盘时刻,但这似乎不适用于有夜盘交易的?

Member
avatar
加入于:
帖子: 4618
声望: 284
  1. 可以把判断时间戳上日期的逻辑改成判断开盘时间点的逻辑吧;
  2. on_trade里读取trade.price就可以了
Member
avatar
加入于:
帖子: 38
声望: 0

感谢回复!
我用来下面代码来读开盘价,烦请您看看对不对,

open_time = time(hour=9, minute=0)
if bar.datetime.time() == self.open_time:
self.open_price = bar.open_price
print(bar.datetime, self.open_price)
self.put_event()

open_price 被设成了变量,print出来的结果似乎是对的,但在策略面板上,open_price却老是几天前的值,不会更新到当天的值。这是怎么回事呢?

Member
avatar
加入于:
帖子: 4618
声望: 284

初始化完成的时候是显示的昨天的开盘价吧,今天的开盘价要启动策略到时间了才变吧

Member
avatar
加入于:
帖子: 38
声望: 0

我是开盘之后才启动vnpy初始化策略的,程序正常是不是会自动调取rqdata的数,然后更新这个开盘价呢?

Member
avatar
加入于:
帖子: 4618
声望: 284

应该是

Member
avatar
加入于:
帖子: 38
声望: 0

那我这个更新不了,是哪儿可能出问题了呢?数据库连接都没问题。或者应该怎么去查这个问题呢?感谢!

Member
avatar
加入于:
帖子: 4618
声望: 284

建议在更新day_open的前后都print看看是在哪一步出的问题

Member
avatar
加入于:
帖子: 38
声望: 0

我在前后都加了print, 结果如下,9:00 之后,确实开盘价发生了变化,所以现在问题是这个最新数传不到面板上,但我用了self.put_event()啊,这个函数有啥讲究吗?多谢!

16650.0
2020-12-02 00:59:00+08:00 16650.0
16650.0
2020-12-02 09:00:00+08:00 16860.0
16860.0

Member
avatar
加入于:
帖子: 4618
声望: 284

那就请把.vntrader里的json文件cta_strategy_data删了再试一下,应该是之前也是用的S同一个名字创建的策略实例,然后缓存了退出之前的值

Member
avatar
加入于:
帖子: 38
声望: 0

问题解决,太感谢了!以后是不是经常需要清理一下cta_strategy_data这个文件?

Member
avatar
加入于:
帖子: 4618
声望: 284

不是的,cta_strategy_data就是保存的你上一次跑的数据和指标。比如说你今天收盘策略持仓是-1,如果删掉json文件,那么明天初始化的时候会显示你策略持仓为0,这样就不对了。如果你盘前进行初始化,那么初始化结束正好就是显示昨天的开盘价,然后开盘推送第一根K线之后自然会随着逻辑判断变成今天的开盘价。如果还想今天一样盘后启动策略,想初始化之后day_open就是今天的开盘价,那么只把一定不能删的策略参数放在variables里应该就可以了(variables留空就只会保存策略持仓pos)。
可以看一下社区文档的实盘运行这一块https://www.vnpy.com/docs/cn/cta_strategy.html#id23

Member
avatar
加入于:
帖子: 38
声望: 0

明白了,所以最好是在盘前就初始化。因为如果把“开盘价”放在variables里,然后开盘后初始化策略,”开盘价“就不会得到更新了,而只会沿用昨天的开盘价了。如果“开盘价”不放在variables里,是不是意味着面板上也看不到这个值了? 我的理解对吗? 感谢感谢!

Member
avatar
加入于:
帖子: 4618
声望: 284

是的,但是你初始化的时候本来就读取的前10天的数据进行指标的计算,初始化结束显示昨天的开盘价就是正确的。你开盘之后走到了判断逻辑就自然会更新成今天的开盘价了。
“开盘价”不放在variables里,面板上是看不到这个值了。

Member
avatar
加入于:
帖子: 38
声望: 0

明白,非常感谢耐心帮助,您帮大忙了!!

Member
avatar
加入于:
帖子: 38
声望: 0

我试了一下,“开盘价”不放在variables里,然后开盘后初始化策略,发现系统没有把今天开盘之后到我启动vnpy这段时间的数据加载进来,数据只是到昨天下午收盘为止。我在更新day_open的前加了print, 显示的结果是这样的,6620是昨天的开盘价,我是差不多10:13初始化策略的。请教一下这是为什么呢?

2020-12-02 14:56:00+08:00 6620.0
2020-12-02 14:57:00+08:00 6620.0
2020-12-02 14:58:00+08:00 6620.0
2020-12-02 14:59:00+08:00 6620.0
2020-12-03 10:13:00+08:00 6620.0

Member
avatar
加入于:
帖子: 4618
声望: 284
  1. 不知道你具体怎么写的,比如说你是写的bar的时间戳的day不同才变,那么应该这根K线传进来的时候读取的这根K线的open_price.如果你是写的open_time到了就变,那么应该是在推过来open_time这跟K线的的时候取这根K线的open_price;
  2. 如果有数据服务的话,应该会拉取最新的数据才对,可以print一下看看if not self.trading(初始化状态下)on_bar推过来的最新的bar的时间;
  3. 看你打印的信息,并不是在更新day_open之前加了print,因为day_open一天只会更新一次(判断换日逻辑那里),建议在更新代码的前后打印会更好
Member
avatar
加入于:
帖子: 38
声望: 0

我是在判定开盘时间之前加了print,每一根k线传进来时,都会打印一下日开盘价,所以看到的是每分钟时间,加上 日“开盘价”。具体代码如下。您说的if not self.trading 下,是指初始化后,但没有开始交易吗?

open_time = time(hour=9, minute=0)
print(bar.datetime, self.open_price)
if bar.datetime.time() == self.open_time:
self.open_price = bar.open_price
print(bar.datetime, self.open_price)

Member
avatar
加入于:
帖子: 38
声望: 0

初始化后,我在on_bar里打印bar的时间,就是到2020-12-02 14:59:00+08:00, 昨天夜盘数据也没进来,不知道怎么回事?哪块地方有可能影响到这个数据下载的区间段呢?多谢了。

Member
avatar
加入于:
帖子: 4618
声望: 284

实盘初始化调用的是vnpy.app.cta_strategy.engine里的load_bar函数,可以去这个函数里print一下start和end看看

© 2015-2022 上海韦纳软件科技有限公司
备案服务号:沪ICP备18006526号

沪公网安备 31011502017034号

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