那我为了使得实际交易更接近回测时候的情况,是不是应该在一开盘的时候重新挂单呢
回测的时候好像不是这样的,我会发现有一些交易是在21:00发生的
假设我的策略是15分钟频率的,因为vnpy是15分钟走完之后才去挂单,假设14:59时触发了一个买入条件,挂了限价单,这个限价单会保留到夜盘的21:14吗?
青青子荆 wrote:
可参考示例策略如boll_channel_strategy里的on_15min_bar
可我想在突破上轨后short,如果stop=True,逻辑就变成了价格低于上轨时short不是么
假设上轨是bar.close_price + self.atr_multiplier*self.atr_value,当价格向上突破上轨时则卖出。这个逻辑该怎么写呢?
如果采用论坛中的bar和last_bar的date相比较的方法,会使得新的一天第一根分钟k线走完才将日k推送出来,信号慢1分钟
因为每天的结束时点会不一样,会分成两类情况:
1。如果有夜盘,则从23:59切分
2.。如果没有夜盘(如长假前一天),则从14:59切分(国债期货为15:14)
那么如何制定规则,让程序自动判定呢?
太好了,期待早日推出
看了下源代码,似乎改成tick级别的市价单就行了
请问如何将相同品种的多个策略信号进行合并呢?开仓信号套用MultiSignalStrategy的模板比较容易处理,但因为每个策略有单独的止损条件,止损取决于开仓时点的价格,所以使用MultiSignalStrategy似乎行不通。
看了下商品期货的平今手续费比平昨更低,那么直接平仓不是更好的选择吗,在什么情况下会需要锁仓呢?
现需要将VNPY的策略代码移植到其他平台,但新的平台并不支持停止单(Stop=True)。请问以boll_channel_strategy为例,如何将止损单改写成限价单呢,且用于实盘呢?
self.long_stop = self.intra_trade_high - self.atr_value * self.sl_multiplier
self.sell(self.long_stop, abs(self.pos), True)
用Python的交易员 wrote:
不会,vn.py在下载米筐数据时做了调整,保证时间戳的回测和实盘 一致
谢谢回复,如果我用其他数据源构建历史数据库的话,是不是要先把K线时间戳调整成K线开始时间点(9:01变成9:00)再做回测呢
我参考了一下论坛中关于时间戳的帖子:
https://www.vnpy.com/forum/topic/5119-qiu-jiao-ru-he-xiu-gai-bargeneratorneng-shi-qi-sheng-cheng-barshu-ju-de-shi-jian-chuo-tong-mi-kuang-bao-chi-yi-zhi
在将rqdata历史数据写入mysql数据库之前,是否需要将时间戳减掉一分钟,这样才和vnpy的逻辑保持一致呢?
可不可以这样理解:
使用CTP接口合成的分钟K线时从00分钟开始,至59分钟结束,因此需要bar.datetime.minute + 1做调整;
但是回测用数据的分钟K线时从01分钟就开始至00分钟结束,如果还用同样的逻辑就会出问题
def update_bar(self, bar: BarData) -> None:
"""
Update 1 minute bar into generator
"""
# If not inited, creaate window bar object
if not self.window_bar:
# Generate timestamp for bar data
if 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 bar
else:
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 bar
self.window_bar.close_price = bar.close_price
self.window_bar.volume += int(bar.volume)
self.window_bar.open_interest = bar.open_interest
# Check if window bar completed
finished = False
if self.interval == Interval.MINUTE:
# x-minute bar
if not (bar.datetime.minute + 1) % self.window:
finished = True
elif self.interval == Interval.HOUR:
if self.last_bar:
new_hour = bar.datetime.hour != self.last_bar.datetime.hour
last_minute = bar.datetime.minute == 59
if new_hour or last_minute:
# 1-hour bar
if self.window == 1:
finished = True
# x-hour bar
else:
self.interval_count += 1
if not self.interval_count % self.window:
finished = True
self.interval_count = 0
if finished:
self.on_window_bar(self.window_bar)
self.window_bar = None
# Cache last bar object
self.last_bar = bar
print('bar:',bar)
print('window_bar:',self.window_bar)
print('')
尝试合成5分钟k线,我在每次update_bar时将bar和self.window_bar打印出来,结果如下:
米筐的分钟数据是从9:01开始打时间戳的,代表9:00到9:01这一分钟的数据。测试发现k线合成走到9:04分的时候就结束了(finished=True,self.window_bar=None),只用了9:00~9:04这四根1分钟k线就合成了第一根5分钟k线,而9:04-9:05这一分钟最新数据完全没有用到。依次类推,第二根5分钟k线用的是9:05~9:09的数据,而9:09~9:10这一分钟也被忽略了。回测模式下,合成k线时总是会漏掉最新的一分钟k线,这个影响还是挺大的吧。
米筐的1分钟k线从9:01开始,代表9:00:00到9:01:00(左闭右开)这段时间的数据描述。
我的理解是,从1分钟线合成15分钟线时,应该走完9:01~9:15这15根k线才进行合成。
我在米筐的研究环境中做了实验,如果取每天早上的第一条15分钟K线,其成交量为前15分钟K线之和(如下图所示),即用到了9:01~9:15这15条数据。
但是vnpy在合成xmin bar的逻辑有如下代码:
if not (bar.datetime.minute + 1) % self.window:
finished = True
由于这个“+1”的存在,导致程序走完9:14这一根k线的时候就合成完毕了,实际上只用了前14根k线。不知道这算不算bug呢?
我理解实盘的时候是将tick数据转换成分钟数据,因此vnpy是以一分钟的开始作为标记,即用9:30标记9:30~9:31(左闭右开)的数据;然而米筐数据是采用分钟的结束作为标记,即用9:31来标记9:30~9:31(左闭右开)的数据。如果是做回测,是不是会导致分钟k线错位?举个例子:
15分钟K线应该对应以9:16~9:30标记的分钟数据,而vnpy在回测时用到的数据却是9:15~9:29,因为代码中的“+1“,恰好错位了1分钟。
请问如何在回测中查看K线图表(买卖时点)的同时显示策略变量的走势图呢,如ma,atr等等。具体需要修改那些文件的源代码呢?谢谢
嗯,明白了。谢谢
但是我看全实战进阶里面讲止损方法的时候,都是这种写法。所以是不是应该加个else