经过专家指导,分享下通过日线合成周线方法,测试应该是可以的
if self.interval == Interval.WEEKLY.value:
# Get public holidays data from Shanghai Stock Exchange
cn_calendar: exchange_calendars.ExchangeCalendar = exchange_calendars.get_calendar('XSHG')
holidays: list = [x.to_pydatetime() for x in cn_calendar.precomputed_holidays()]
#print(holidays)
# Filter future public holidays
start: datetime = bar.datetime.replace(tzinfo=None)
PUBLIC_HOLIDAYS = [x for x in holidays if x >= start]
#print(PUBLIC_HOLIDAYS)
if not self.window_bar:
dt: datetime = bar.datetime.replace(hour=0, 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
)
print("k线合成开始第{}周,星期{},日期{}".format(bar.datetime.isocalendar()[1], bar.datetime.isocalendar()[2], bar.datetime))
# 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
)
print("这是第{}周,星期{},日期{}".format(bar.datetime.isocalendar()[1], bar.datetime.isocalendar()[2], bar.datetime))
# Update close price/volume/turnover into window bar
self.window_bar.close_price = bar.close_price
self.window_bar.volume += bar.volume
self.window_bar.turnover += bar.turnover
self.window_bar.open_interest = bar.open_interest
self.week_num = bar.datetime.isocalendar()[2]
if bar.datetime.isocalendar()[2] == 5:
print("第{}周推送".format(bar.datetime.isocalendar()[1]))
self.on_window_bar(self.window_bar)
self.window_bar = None
self.week_num = 0
elif bar.datetime.isocalendar()[2] < 5:
days = 1
# tomorrow = bar.datetime + timedelta(days=1)
tomorrow: datetime = bar.datetime.replace(hour=0, minute=0, second=0, microsecond=0,tzinfo=None)
tomorrow += timedelta(days=1)
while tomorrow in PUBLIC_HOLIDAYS:
print("明天是周{}".format(tomorrow.isocalendar()[2]))
if tomorrow.isocalendar()[2] == 5:
print("明天假期,第{}周强制推送".format(bar.datetime.isocalendar()[1]))
self.on_window_bar(self.window_bar)
self.window_bar = None
break
tomorrow += timedelta(days=1)
有没有大神分享下周线合成的方法,是不是合成周线都存在这个问题呢
alvinli512 wrote:
如果回测数据是每天的bar,可以用最新的bar是周几来判断(bar.datetime.isocalendar()[2]表示周几)。
在拿到周五的bar的时候,一周结束。
但是有少数情况周五不是一周的最后一个交易日。
对呀,就怕是有节假日,周五没数据,这种方法就不行了,有可能吧两周合成一周了
280690233 wrote:
麻烦咨询下老师 ,有用日线合成周线的方法吗
可以看下我的帖子,我是通过周进行判断的,不过交易时间点貌似有点问题,都是周二交易去了
在通过日线合成周线的过程中,通过判断bar日期属于第几周进行判断,当出现周数不同的时候,就合成周线,同时开始新的周线,问题是,只能在新k线来的时候(正常是周一的k线)才能判断出是不属于同一周的,那么按照vnpy的交易逻辑,第二根k线进行交易,所有周线的交易全部都变成周二了,正常应该是周一的时候进行交易,这个问题有什么好的解决办法吗
MTF wrote:
VeighNa的回测引擎是下一根K线撮合机制,所以无法保证开盘价一定成交(以买入为例,必须要你的委托价格高于下一根K线最低点才能成交),所以某些情况下会存在无法成交后续策略撤单了
我做了处理,就是出现信号后,第二天的开盘价进行成交
我写了策略以k线的开盘价进行成交,不知道什么原因会出现很多撤单的情况,撤单应该是未成交成功,但是为什么会出现这种情况呢