vn.py量化社区
By Traders, For Traders.
Member
avatar
加入于:
帖子: 94
声望: 1

找了下原因

description

分别打印出 每个周期的一些变量值, am的size都是给的500,为何策略初始化后的am.count值还是从1开始计算的???
导致am.inited一直是False,没有初始化成功,难怪一直没交易委托产生

Member
avatar
加入于:
帖子: 94
声望: 1

str_pythin wrote:

找了下原因

description

分别打印出 每个周期的一些变量值, am的size都是给的500,为何策略初始化后的am.count值还是从1开始计算的???
导致am.inited一直是False,没有初始化成功,难怪一直没交易委托产生

在顶一下
陈总别忽视这个问题

Member
avatar
加入于:
帖子: 94
声望: 1

str_pythin wrote:

str_pythin wrote:

找了下原因

description

分别打印出 每个周期的一些变量值, am的size都是给的500,为何策略初始化后的am.count值还是从1开始计算的???
导致am.inited一直是False,没有初始化成功,难怪一直没交易委托产生

在顶一下
陈总别忽视这个问题

持续顶

Administrator
avatar
加入于:
帖子: 4028
声望: 221

请附上代码,光是这个日志没法知道逻辑是什么

Member
avatar
加入于:
帖子: 94
声望: 1

用Python的交易员 wrote:

请附上代码,光是这个日志没法知道逻辑是什么

description

为什么初始化之后,途中的count的值还是0 ???
之前就是在多周期策略中打印出每周期的count的值,这就导致初始化ininted还是False

Administrator
avatar
加入于:
帖子: 4028
声望: 221

还是没有你的那堆打印日志,count信息输出的语句啊?

如果担心泄露策略逻辑,就请自己排查吧。

Member
avatar
加入于:
帖子: 94
声望: 1

from vnpy.app.cta_strategy import (
CtaTemplate,
StopOrder,
TickData,
BarData,
TradeData,
OrderData,
BarGenerator,
ArrayManager,
)

class MultiTimeframeStrategy(CtaTemplate):
""""""
author = "用Python的交易员"

rsi_signal = 20
rsi_window = 14
fast_window = 5
slow_window = 20
fixed_size = 1

rsi_value = 0
rsi_long = 0
rsi_short = 0
fast_ma = 0
slow_ma = 0
ma_trend = 0
bar_num = 1

parameters = ["rsi_signal", "rsi_window",
              "fast_window", "slow_window",
              "fixed_size"]

variables = ["rsi_value", "rsi_long", "rsi_short",
             "fast_ma", "slow_ma", "ma_trend"]

def __init__(self, cta_engine, strategy_name, vt_symbol, setting):
    """"""
    super().__init__(cta_engine, strategy_name, vt_symbol, setting)

    self.rsi_long = 50 + self.rsi_signal
    self.rsi_short = 50 - self.rsi_signal

    self.bg5 = BarGenerator(self.on_bar, 2, self.on_5min_bar)
    self.am5 = ArrayManager(500)

    self.bg15 = BarGenerator(self.on_bar, 3, self.on_15min_bar)
    self.am15 = ArrayManager(500)

    self.bg60 = BarGenerator(self.on_bar, 10, self.on_60min_bar)
    self.am60 = ArrayManager(500)

def on_init(self):
    """
    Callback when strategy is inited.
    """
    self.write_log("策略初始化")
    self.load_bar(days=10)
    # self.load_bar(days=10, use_database=True)
    print('策略初始化')

def on_start(self):
    """
    Callback when strategy is started.
    """
    self.write_log("策略启动")

def on_stop(self):
    """
    Callback when strategy is stopped.
    """
    self.write_log("策略停止")

def on_tick(self, tick: TickData):
    """
    Callback of new tick data update.
    """
    self.bg5.update_tick(tick)

def on_bar(self, bar: BarData):
    """
    Callback of new bar data update.
    """
    self.bar_num += 1
    print("on_bar num:",self.bar_num)
    self.bg5.update_bar(bar)
    self.bg15.update_bar(bar)

def on_5min_bar(self, bar: BarData):
    """"""
    print("on_5min_bar0")
    self.cancel_all()

    self.am5.update_bar(bar)
    print('self.am5.count:',self.am5.count)
    print('self.am5.inited:',self.am5.inited)
    if not self.am5.inited:
        return
    print("on_5min_bar1")

    if not self.ma_trend:
        return
    print("on_5min_bar2")

    self.rsi_value = self.am5.rsi(self.rsi_window)
    print("self.rsi_value:", self.rsi_value)

    if self.pos == 0:
        if self.ma_trend > 0 and self.rsi_value >= self.rsi_long:
            self.buy(bar.close_price + 5, self.fixed_size)
        elif self.ma_trend < 0 and self.rsi_value <= self.rsi_short:
            self.short(bar.close_price - 5, self.fixed_size)

    elif self.pos > 0:
        if self.ma_trend < 0 or self.rsi_value < 50:
            self.sell(bar.close_price - 5, abs(self.pos))

    elif self.pos < 0:
        if self.ma_trend > 0 or self.rsi_value > 50:
            self.cover(bar.close_price + 5, abs(self.pos))

    print("self.pos:", self.pos)

    self.put_event()

def on_15min_bar(self, bar: BarData):
    """"""
    print("on_15min_bar0")
    self.am15.update_bar(bar)
    print('self.am15.count:',self.am15.count)
    print('self.am15.inited:',self.am15.inited)
    if not self.am15.inited:
        return
    print("on_15min_bar1")

    self.fast_ma = self.am15.sma(self.fast_window)
    self.slow_ma = self.am15.sma(self.slow_window)

    if self.fast_ma > self.slow_ma:
        self.ma_trend = 1
    else:
        self.ma_trend = -1
    print("self.ma_trend:", self.ma_trend)

def on_60min_bar(self, bar: BarData):
    """"""
    print("on_60min_bar0")
    self.am60.update_bar(bar)
    print('self.am60.count:',self.am60.count)
    print('self.am60.inited:',self.am60.inited)
    if not self.am60.inited:
        return
    print("on_60min_bar1")

def on_order(self, order: OrderData):
    """
    Callback of new order data update.
    """
    pass

def on_trade(self, trade: TradeData):
    """
    Callback of new trade data update.
    """
    self.put_event()

def on_stop_order(self, stop_order: StopOrder):
    """
    Callback of stop order update.
    """
    pass
Administrator
avatar
加入于:
帖子: 4028
声望: 221
  1. on_bar里始终没有调用过bg60.update_bar,所以这个周期的K线不会合成,也不会有后续逻辑

  2. 你的BarGenerator参数设置有问题:

    self.bg5 = BarGenerator(self.on_bar, 2, self.on_5min_bar)
    self.am5 = ArrayManager(500)

    self.bg15 = BarGenerator(self.on_bar, 3, self.on_15min_bar)
    self.am15 = ArrayManager(500)

    self.bg60 = BarGenerator(self.on_bar, 10, self.on_60min_bar)
    self.am60 = ArrayManager(500)

这种写法,合成的分别是2、3、10分钟线

Member
avatar
加入于:
帖子: 94
声望: 1

from vnpy.app.cta_strategy import (
CtaTemplate,
StopOrder,
TickData,
BarData,
TradeData,
OrderData,
BarGenerator,
ArrayManager,
)

class BollChannelfu2005Strategy(CtaTemplate):
""""""

author = "用Python的交易员"

boll_window = 13
boll_dev = 3.0
cci_window = 5
atr_window = 34
sl_multiplier = 4.8
fixed_size = 1

boll_up = 0
boll_down = 0
cci_value = 0
atr_value = 0

intra_trade_high = 0
intra_trade_low = 0
long_stop = 0
short_stop = 0

# dingdingTitle = ''
# dingdingContent = ''

parameters = ["boll_window", "boll_dev", "cci_window",
              "atr_window", "sl_multiplier", "fixed_size"]
variables = ["boll_up", "boll_down", "cci_value", "atr_value",
             "intra_trade_high", "intra_trade_low", "long_stop", "short_stop"]

def __init__(self, cta_engine, strategy_name, vt_symbol, setting):
    """"""
    super().__init__(cta_engine, strategy_name, vt_symbol, setting)

    #self.bg = BarGenerator(self.on_bar)
    #self.am = ArrayManager()

    self.bg15 = BarGenerator(self.on_bar, 2, self.on_15min_bar)
    self.am15 = ArrayManager()

def on_init(self):
    """
    Callback when strategy is inited.
    """
    self.write_log("策略初始化")
    self.load_bar(days=10, use_database=True)

def on_start(self):
    """
    Callback when strategy is started.
    """
    self.write_log("策略启动")

def on_stop(self):
    """
    Callback when strategy is stopped.
    """
    self.write_log("策略停止")

def on_tick(self, tick: TickData):
    """
    Callback of new tick data update.
    """
    self.bg15.update_tick(tick)

def on_bar(self, bar: BarData):
    """
    Callback of new bar data update.
    """
    #self.bg.update_bar(bar)
    self.bg15.update_bar(bar)

def on_15min_bar(self, bar: BarData):
    """"""
    self.cancel_all()

    am15 = self.am15
    am15.update_bar(bar)
    print('len(am15.close),am15.close:',len(am15.close),am15.close)
    print('am15.count an15.inited:',am15.count, am15.inited)
    if not am15.inited:
        return

    self.boll_up, self.boll_down = am15.boll(self.boll_window, self.boll_dev)
    self.cci_value = am15.cci(self.cci_window)
    self.atr_value = am15.atr(self.atr_window)
    print('cci_value:', self.cci_value,'atr_value:',self.atr_value)


    if self.pos == 0:
        self.intra_trade_high = bar.high_price
        self.intra_trade_low = bar.low_price

        if self.cci_value > 0:
            self.buy(self.boll_up, self.fixed_size, True)

        elif self.cci_value < 0:
            self.short(self.boll_down, self.fixed_size, True)


    elif self.pos > 0:
        self.intra_trade_high = max(self.intra_trade_high, bar.high_price)
        self.intra_trade_low = bar.low_price

        self.long_stop = self.intra_trade_high - self.atr_value * self.sl_multiplier
        self.sell(self.long_stop, abs(self.pos), True)


    elif self.pos < 0:
        self.intra_trade_high = bar.high_price
        self.intra_trade_low = min(self.intra_trade_low, bar.low_price)

        self.short_stop = self.intra_trade_low + self.atr_value * self.sl_multiplier
        self.cover(self.short_stop, abs(self.pos), True)


    self.put_event()

def on_order(self, order: OrderData):
    """
    Callback of new order data update.
    """
    pass

def on_trade(self, trade: TradeData):
    """
    Callback of new trade data update.
    """
    self.put_event()

def on_stop_order(self, stop_order: StopOrder):
    """
    Callback of stop order update.
    """
    pass

为了说明问题,还是以用这个作为例子吧,为了尽快看到输出信息所以用2分钟self.bg15 = BarGenerator(self.on_bar, 2, self.on_15min_bar)
输出信息如下

description

description

(打印an15.inited写错,应该是am15.inited)

其实想问的是为何没能初始化成功,am15.inited在初始化后还是False???

Administrator
avatar
加入于:
帖子: 4028
声望: 221

因为你数据库里的数据量不够,图中就能看到am15序列里,只填充了5个15分钟线,而默认的am缓存数据长度是100,请用RQData数据服务或者用DataRecorder来录制数据

Member
avatar
加入于:
帖子: 94
声望: 1

用Python的交易员 wrote:

因为你数据库里的数据量不够,图中就能看到am15序列里,只填充了5个15分钟线,而默认的am缓存数据长度是100,请用RQData数据服务或者用DataRecorder来录制数据

description

数据量充足,上面只填充5个15分钟线,还是连接ctp后填充的数据,也就是说初始化没成功,一直找的是为何初始化没成功?

Administrator
avatar
加入于:
帖子: 4028
声望: 221

在on_bar里,加上:
if not self.inited:
print(bar.datetime)

然后点击策略初始化,看看cmd里初始化打印出来的K线时间,是从什么时候到什么时候。

Administrator
avatar
加入于:
帖子: 4028
声望: 221

如果自己实在搞不定历史数据的维护,就用RQData吧,直接从服务端获取最新数据,不会有任何上述问题。

Member
avatar
加入于:
帖子: 94
声望: 1

用Python的交易员 wrote:

在on_bar里,加上:
if not self.inited:
print(bar.datetime)

然后点击策略初始化,看看cmd里初始化打印出来的K线时间,是从什么时候到什么时候。

没有打印出任何东西:

description

description

但是通过客户端初始化数据是完全可以的:

description

应该是用no_ui中的run.py自动服务,没有连接数据库导致,下面是vnpy1 vs vnpy2中的自动服务:

description

description

这个no_ui中的run.py 主引擎是怎么连接数据库的? 没找到对应连接的函数

Administrator
avatar
加入于:
帖子: 4028
声望: 221

脚本模式,你初始化的合约是rb2005.SHFE,这个没数据。
图形模式,你初始化的合约是fu2005.SHFE,这个有数据。

2.0里的数据库连接,程序初始化的时候自动做掉了,无需用户自己调用任何函数。

Member
avatar
加入于:
帖子: 94
声望: 1

用Python的交易员 wrote:

脚本模式,你初始化的合约是rb2005.SHFE,这个没数据。
图形模式,你初始化的合约是fu2005.SHFE,这个有数据。

2.0里的数据库连接,程序初始化的时候自动做掉了,无需用户自己调用任何函数。

图形模式,初始化合约rb2005.SHFE和fu2005.SHFE 都是有数据的 都可以初始化成功 当时是试了好几个合约都是可以
脚本模式,都不可以,所以觉得是脚本模式没能成功获取数据导致,具体不知道为何?
找不到原因 暂时只有还是回到vnpy1了

© 2015-2019 上海韦纳软件科技有限公司
备案服务号:沪ICP备18006526号-3