只有5分钟数据,策略也是基于5分钟的,可以回测吗?
看回测界面及导入数据地方是只有1分钟的
Interval中增加个SECOND
BarGenerator 增加两个函数,为什么秒周期出来的出来的数据跟1分钟的一样,还差什么地方呢?谢谢
def update_sec_tick(self, tick: TickData) -> None:
"""
Update new tick data into generator.
"""
new_sec = False
if not self.bar:
new_sec = True
elif not (self.bar.datetime.second % self.bar.window):
sec = (tick.datetime.second // self.bar.window) * self.bar.window
self.bar.datetime = self.bar.datetime.replace(
second=sec, microsecond=0
)
self.on_bar(self.bar)
new_sec = True
if new_sec:
self.bar = BarData(
symbol=tick.symbol,
exchange=tick.exchange,
interval=Interval.SECOND,
datetime=tick.datetime,
gateway_name=tick.gateway_name,
open_price=tick.last_price,
high_price=tick.last_price,
low_price=tick.last_price,
close_price=tick.last_price,
open_interest=tick.open_interest
)
else:
self.bar.high_price = max(self.bar.high_price, tick.last_price)
if tick.high_price > self.last_tick.high_price:
self.bar.high_price = max(self.bar.high_price, tick.high_price)
self.bar.low_price = min(self.bar.low_price, tick.last_price)
if tick.low_price < self.last_tick.low_price:
self.bar.low_price = min(self.bar.low_price, tick.low_price)
self.bar.close_price = tick.last_price
self.bar.open_interest = tick.open_interest
self.bar.datetime = tick.datetime
if self.last_tick:
volume_change = tick.volume - self.last_tick.volume
self.bar.volume += max(volume_change, 0)
turnover_change = tick.turnover - self.last_tick.turnover
self.bar.turnover += max(turnover_change, 0)
self.last_tick = tick
def update_bar_second_window(self, bar: BarData) -> None:
""""""
# If not inited, create window bar object
if not self.window_bar:
sec = (bar.datetime.second // self.window) * self.window
dt = bar.datetime.replace(second=sec, 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/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
# Check if window bar completed
# if not (bar.datetime.second + 1) % self.window:
if not (bar.datetime.second % self.window):
self.on_window_bar(self.window_bar)
self.window_bar = None
class JasonTrendStrategy(CtaTemplate):
""" """
author = "Smart Trader"
#定义参数
maTrend_fast_window = 5
maTrend_slow_window = 20
fast_window = 10
slow_window = 20
def __init__(
self,
cta_engine: Any,
strategy_name: str,
vt_symbol: str,
setting: dict,
):
super().__init__(cta_engine,strategy_name,vt_symbol,setting)
#定义2个周期的bg函数
self.bg15min = BarGenerator(self.on_bar,
window=15,
on_window_bar=self.on_15min_bar,
interval=Interval.MINUTE)
self.bg5min = BarGenerator(self.on_bar,
window=5,
on_window_bar=self.on_5min_bar,
interval=Interval.MINUTE)
self.bg = BarGenerator(self.on_bar)
#定义2个周期的am
self.am15min = ArrayManager()
self.am5min = ArrayManager()
self.am = ArrayManager()
def on_init(self):
"""策略初始化"""
#注册
self.write_log('策略初始化')
self.load_bar(10)
def on_start(self):
"""启动"""
self.write_log('策略启动')
def on_stop(self):
"""停止"""
self.write_log('策略停止')
def on_tick(self,tick:TickData):
"""Tick更新"""
self.bg15min.update_tick(tick)
self.bg5min.update_tick(tick)#bg会自动判断当前分钟是否已经走完,合成1分钟线
self.bg.update_tick(tick)
#定义2个周期的 on_bar 函数
def on_bar(self,bar:BarData):
"""k线更新,切记先更新长周期,再更新短周期"""
self.bg15min.update_bar(bar)#将1小时K线合成1小时K线
self.bg5min.update_bar(bar)#将1分钟K线合成15分钟K线
am = self.am
am.update_bar(bar)
if not am.inited:
return
trend_lt = am.sma(20, array= True)
last_trend = trend_lt[-1]
pre_trend = trend_lt[-2]
str_t = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime())
print('1m',str_t,last_trend)
#定义2个周期的on_hour或者min_bar函数
def on_15min_bar(self,bar:BarData):#执行2H的K线,只做判断,不做买卖
am = self.am15min
am.update_bar(bar)
if not am.inited:
return
trend_lt = am.sma(20, array= True)
last_15_trend = trend_lt[-1]
pre_15_trend = trend_lt[-2]
str_t = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime())
print('**15m',str_t,last_15_trend)
def on_5min_bar(self,bar:BarData):#执行15分钟的K线 做出判断并且发出买卖信号
self.cancel_all
am = self.am5min
am.update_bar(bar)
if not am.inited:
return
trend_lt = am.sma(20, array= True)
last_5_trend = trend_lt[-1]
pre_5_trend = trend_lt[-2]
str_t = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime())
print('5m**',str_t,last_5_trend)
打印出来的日志是:
15m 2021-03-10 20:00:26 1821.5195000000003
5m 2021-03-10 20:00:26 1819.6295000000005
1m 2021-03-10 20:00:26 1817.7245000000007
1m 2021-03-10 20:01:27 1817.9080000000006
1m 2021-03-10 20:01:27 1817.9950000000003
1m 2021-03-10 20:01:27 1818.0655000000002
1m 2021-03-10 20:02:27 1818.4440000000002
1m 2021-03-10 20:02:27 1819.0145
1m 2021-03-10 20:02:27 1819.5835
1m 2021-03-10 20:03:26 1820.1965
1m 2021-03-10 20:03:26 1820.7814999999996
1m 2021-03-10 20:03:26 1821.2854999999995
1m 2021-03-10 20:04:26 1821.6954999999994
1m 2021-03-10 20:04:26 1822.0555000000004
1m 2021-03-10 20:04:26 1822.5295000000006
5m 2021-03-10 20:05:26 1819.760500000001
1m 2021-03-10 20:05:26 1822.9360000000001
5m 2021-03-10 20:05:26 1819.895000000001
1m 2021-03-10 20:05:26 1823.3905
5m** 2021-03-10 20:05:26 1819.671000000001
1m 2021-03-10 20:05:26 1823.953
每根一分钟线,都会打印三次,且值不一样
是怎么触发的?
Traceback (most recent call last):
File "D:\vnstudio\lib\site-packages\pymysql\connections.py", line 756, in _write_bytes
self._sock.sendall(data)
ConnectionAbortedError: [WinError 10053] 你的主机中的软件中止了一个已建立的连接。
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "D:\vnstudio\lib\site-packages\peewee.py", line 3129, in execute_sql
cursor.execute(sql, params or ())
File "D:\vnstudio\lib\site-packages\pymysql\cursors.py", line 148, in execute
result = self._query(query)
File "D:\vnstudio\lib\site-packages\pymysql\cursors.py", line 310, in _query
conn.query(q)
File "D:\vnstudio\lib\site-packages\pymysql\connections.py", line 547, in query
self._execute_command(COMMAND.COM_QUERY, sql)
File "D:\vnstudio\lib\site-packages\pymysql\connections.py", line 814, in _execute_command
self._write_bytes(packet)
File "D:\vnstudio\lib\site-packages\pymysql\connections.py", line 760, in _write_bytes
CR.CR_SERVER_GONE_ERROR, "MySQL server has gone away (%r)" % (e,)
pymysql.err.OperationalError: (2006, "MySQL server has gone away (ConnectionAbortedError(10053, '你的主机中的软件中止了一个已建立的连接。', None, 10053, None))")
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "D:\vnstudio\lib\site-packages\vnpy\database\mysql\mysql_database.py", line 35, in execute_sql
cursor = super(RetryOperationalError, self).execute_sql(sql, params, commit)
File "D:\vnstudio\lib\site-packages\peewee.py", line 3136, in execute_sql
self.commit()
File "D:\vnstudio\lib\site-packages\peewee.py", line 2902, in exit
reraise(new_type, new_type(exc_value, *exc_args), traceback)
File "D:\vnstudio\lib\site-packages\peewee.py", line 185, in reraise
raise value.with_traceback(tb)
File "D:\vnstudio\lib\site-packages\peewee.py", line 3129, in execute_sql
cursor.execute(sql, params or ())
File "D:\vnstudio\lib\site-packages\pymysql\cursors.py", line 148, in execute
result = self._query(query)
File "D:\vnstudio\lib\site-packages\pymysql\cursors.py", line 310, in _query
conn.query(q)
File "D:\vnstudio\lib\site-packages\pymysql\connections.py", line 547, in query
self._execute_command(COMMAND.COM_QUERY, sql)
File "D:\vnstudio\lib\site-packages\pymysql\connections.py", line 814, in _execute_command
self._write_bytes(packet)
File "D:\vnstudio\lib\site-packages\pymysql\connections.py", line 760, in _write_bytes
CR.CR_SERVER_GONE_ERROR, "MySQL server has gone away (%r)" % (e,)
peewee.OperationalError: (2006, "MySQL server has gone away (ConnectionAbortedError(10053, '你的主机中的软件中止了一个已建立的连接。', None, 10053, None))")
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "D:\vnstudio\lib\site-packages\vnpy\database\mysql\mysql_database.py", line 185, in save_bar_data
DbBarData.insert_many(c).on_conflict_replace().execute()
File "D:\vnstudio\lib\site-packages\peewee.py", line 1898, in inner
return method(self, database, *args, **kwargs)
File "D:\vnstudio\lib\site-packages\peewee.py", line 1969, in execute
return self._execute(database)
File "D:\vnstudio\lib\site-packages\peewee.py", line 2730, in _execute
return super(Insert, self)._execute(database)
File "D:\vnstudio\lib\site-packages\peewee.py", line 2465, in _execute
cursor = database.execute(self)
File "D:\vnstudio\lib\site-packages\peewee.py", line 3142, in execute
return self.execute_sql(sql, params, commit=commit)
File "D:\vnstudio\lib\site-packages\vnpy\database\mysql\mysql_database.py", line 38, in execute_sql
self.close()
File "D:\vnstudio\lib\site-packages\peewee.py", line 3083, in close
raise OperationalError('Attempting to close database while '
peewee.OperationalError: Attempting to close database while transaction is open.
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "D:\vnstudio\lib\site-packages\peewee.py", line 3286, in rollback
return self._state.conn.rollback()
File "D:\vnstudio\lib\site-packages\pymysql\connections.py", line 479, in rollback
self._execute_command(COMMAND.COM_QUERY, "ROLLBACK")
File "D:\vnstudio\lib\site-packages\pymysql\connections.py", line 793, in _execute_command
raise err.InterfaceError(0, "")
pymysql.err.InterfaceError: (0, '')
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "D:\vnstudio\lib\site-packages\vnpy\app\data_manager\ui\widget.py", line 591, in download
count = self.engine.download_bar_data(symbol, exchange, interval, start)
File "D:\vnstudio\lib\site-packages\vnpy\app\data_manager\engine.py", line 206, in download_bar_data
database_manager.save_bar_data(data)
File "D:\vnstudio\lib\site-packages\vnpy\database\mysql\mysql_database.py", line 185, in save_bar_data
DbBarData.insert_many(c).on_conflict_replace().execute()
File "D:\vnstudio\lib\site-packages\peewee.py", line 4158, in exit
return self._helper.exit(exc_type, exc_val, exc_tb)
File "D:\vnstudio\lib\site-packages\peewee.py", line 4189, in exit
self.rollback(False)
File "D:\vnstudio\lib\site-packages\peewee.py", line 4176, in rollback
self.db.rollback()
File "D:\vnstudio\lib\site-packages\peewee.py", line 3286, in rollback
return self._state.conn.rollback()
File "D:\vnstudio\lib\site-packages\peewee.py", line 2902, in exit
reraise(new_type, new_type(exc_value, *exc_args), traceback)
File "D:\vnstudio\lib\site-packages\peewee.py", line 185, in reraise
raise value.with_traceback(tb)
File "D:\vnstudio\lib\site-packages\peewee.py", line 3286, in rollback
return self._state.conn.rollback()
File "D:\vnstudio\lib\site-packages\pymysql\connections.py", line 479, in rollback
self._execute_command(COMMAND.COM_QUERY, "ROLLBACK")
File "D:\vnstudio\lib\site-packages\pymysql\connections.py", line 793, in _execute_command
raise err.InterfaceError(0, "")
peewee.InterfaceError: (0, '')
参考这个网页中的修改还是一样