VeighNa量化社区
你的开源社区量化交易平台
solmyr's Avatar
Member
离线
13 帖子
声望: 0

意思是把5M的策略写在1M的on_1min_bar中?

只有5分钟数据,策略也是基于5分钟的,可以回测吗?
看回测界面及导入数据地方是只有1分钟的

晕倒,不知什么时候碰到键盘,策略中的self.bg15sec = BarGenerator(self.on_bar...变成self.bg15sec = BarGenerator(self.onnnnnnn

可以跑起来了,还有个加载历史数据部分需要改

应该不是,不执行update_tick,只执行update_sec_tick观察的结果是没触发update_bar这个函数
self.on_bar(self.bar),,这行代码执行了没有任何响应,on_bar中的打印日志也没有

def update_bar(self, bar: BarData) -> None:
    """
    Update 1 minute bar into generator
    """
    if self.interval == Interval.SECOND:
        self.update_bar_second_window(bar)
    elif self.interval == Interval.MINUTE:
        self.update_bar_minute_window(bar)
    else:
        self.update_bar_hour_window(bar)

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

1分钟的可以解释为三个周期每个触发一次
5分钟的也触发三次是怎么来的?

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

每根一分钟线,都会打印三次,且值不一样
是怎么触发的?

修改peewee
增加self._state.conn.ping(reconnect=True)
没问题了,但感觉不该在这改。。。

数据管理界面第一次正常,下载也正常,过几分钟打开就出错了
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))")

以前自己写的断线重连是类似这样的代码,但在VNPY中没找到在哪改
def execute_db(self, sql):
try:

    # 检查连接是否断开,如果断开就进行重连
    self.conn.ping(reconnect=True)
    self.cur.execute(sql)
    self.conn.commit()
except Exception as e:
    print("操作出现错误:{}".format(e))
    self.conn.rollback()

没改时,数据管理这个界面,第一次下载历史成功,关闭界面,第二次打开时数据库连接就断了

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, '')

参考这个网页中的修改还是一样

© 2015-2022 微信 18391752892
备案服务号:沪ICP备18006526号

沪公网安备 31011502017034号

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