可以在 init 或者 start 方法中为策略添加定时器
def add_timer(self, when,
offset=datetime.timedelta(), repeat=datetime.timedelta(),
weekdays=[], weekcarry=False,
monthdays=[], monthcarry=True,
allow=None,
tzdata=None, cheat=False,
*args, **kwargs):
例子:
def __init__(self):
self.add_timer(
when=self.p.when,# datetime.time(15, 30)
offset=self.p.offset,# datetime.timedelta()
repeat=self.p.repeat,# datetime.timedelta()
weekdays=self.p.weekdays
)# [1]
解释:
这里when 设为 15:30,weekday=[1],也就是要求每周一触发一次,触发事件为15:30。
如果when设为bt.timer.SESSION_START则为开市时间
如果设置策略 offset=datetime.timedelta(minutes=30),即 相对when偏移30分钟,则触发事件为 16:00
如果设置参数repeat=datetime.timedelta(minutes=30),则要求定时器每30分钟重复触发一次,如果数据是分钟级数据可以实现,其他数据级别则无效
注意:
目前使用PandasData读取的feed。不能在15:30触发,需要使用GenericCSVData。
将pandas数据转换成GenericCSVData 的fedd数据:
def dataframe_to_csv_feed(df, file='cache.csv'):
'''
将 AKshare 的dataframe数据转换成csv的 datafeed
:param df: AKshare 的dataframe数据
:param file: csv缓存文件
:return:
'''
date_list = df['日期'].to_list()
begin_date = datetime.datetime.strptime(str(date_list[0]), "%Y-%m-%d %H:%M:%S") # 数据的起始日期
end_date = datetime.datetime.strptime(str(date_list[-1]), "%Y-%m-%d %H:%M:%S") # 数据的起始日期
df.to_csv(file)
feed = bt.feeds.GenericCSVData(
dataname=file,
datetime=1, # 日期行所在列
open=2, # 开盘价所在列
high=4, # 最高价所在列
low=5, # 最低价所在列
close=3, # 收盘价价所在列
volume=6, # 成交量所在列
openinterest=-1, # 无未平仓量列
dtformat=('%Y-%m-%d'), # 日期格式
fromdate=begin_date, # 起始日
todate=end_date, # 结束日
timeframe=bt.TimeFrame.Days,
compression=1,
sessionstart=datetime.time(9, 0),
sessionend=datetime.time(17, 30),
)
return feed
feed = bt.feeds.PandasData(
dataname=stock_zh_a_hist_df_daily,
datetime=0, # 日期行所在列
open=1, # 开盘价所在列
high=3, # 最高价所在列
low=4, # 最低价所在列
close=2, # 收盘价价所在列
volume=5, # 成交量所在列
openinterest=-1, # 无未平仓量列.(openinterest是期货交易使用的)
fromdate=begin_date, # 起始日
todate=end_date,
timeframe=bt.TimeFrame.Days, # 数据粒度
compression=1,
sessionstart=datetime.time(9, 0),
sessionend=datetime.time(17, 30)
)
它们的含义分别是日线bar的开始时间和bar的结束时间(相当于一天的开市和闭市时间),一根bar的处理过程为一个session。默认情况下,它们的取值为 00:00:00.00000 和 23:59:59.999989。这里设置它们为9:00开始17:30结束。
当通过add_timer方法添加timer后,这个timer在某日触发notify_timer事件方法。触发规则如下:
1、如果cheat参数=False:
2、如果cheat参数=True:
Tips:
在cheat=True时,对日线数据,如下情形是合法的