找了下原因
分别打印出 每个周期的一些变量值, am的size都是给的500,为何策略初始化后的am.count值还是从1开始计算的???
导致am.inited一直是False,没有初始化成功,难怪一直没交易委托产生
找了下原因
分别打印出 每个周期的一些变量值, am的size都是给的500,为何策略初始化后的am.count值还是从1开始计算的???
导致am.inited一直是False,没有初始化成功,难怪一直没交易委托产生
str_pythin wrote:
找了下原因
分别打印出 每个周期的一些变量值, am的size都是给的500,为何策略初始化后的am.count值还是从1开始计算的???
导致am.inited一直是False,没有初始化成功,难怪一直没交易委托产生
在顶一下
陈总别忽视这个问题
str_pythin wrote:
str_pythin wrote:
找了下原因
分别打印出 每个周期的一些变量值, am的size都是给的500,为何策略初始化后的am.count值还是从1开始计算的???
导致am.inited一直是False,没有初始化成功,难怪一直没交易委托产生在顶一下
陈总别忽视这个问题
持续顶
请附上代码,光是这个日志没法知道逻辑是什么
用Python的交易员 wrote:
请附上代码,光是这个日志没法知道逻辑是什么
为什么初始化之后,途中的count的值还是0 ???
之前就是在多周期策略中打印出每周期的count的值,这就导致初始化ininted还是False
还是没有你的那堆打印日志,count信息输出的语句啊?
如果担心泄露策略逻辑,就请自己排查吧。
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
on_bar里始终没有调用过bg60.update_bar,所以这个周期的K线不会合成,也不会有后续逻辑
你的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分钟线
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)
输出信息如下
(打印an15.inited写错,应该是am15.inited)
其实想问的是为何没能初始化成功,am15.inited在初始化后还是False???
因为你数据库里的数据量不够,图中就能看到am15序列里,只填充了5个15分钟线,而默认的am缓存数据长度是100,请用RQData数据服务或者用DataRecorder来录制数据
用Python的交易员 wrote:
因为你数据库里的数据量不够,图中就能看到am15序列里,只填充了5个15分钟线,而默认的am缓存数据长度是100,请用RQData数据服务或者用DataRecorder来录制数据
数据量充足,上面只填充5个15分钟线,还是连接ctp后填充的数据,也就是说初始化没成功,一直找的是为何初始化没成功?
在on_bar里,加上:
if not self.inited:
print(bar.datetime)
然后点击策略初始化,看看cmd里初始化打印出来的K线时间,是从什么时候到什么时候。
如果自己实在搞不定历史数据的维护,就用RQData吧,直接从服务端获取最新数据,不会有任何上述问题。
用Python的交易员 wrote:
在on_bar里,加上:
if not self.inited:
print(bar.datetime)然后点击策略初始化,看看cmd里初始化打印出来的K线时间,是从什么时候到什么时候。
没有打印出任何东西:
但是通过客户端初始化数据是完全可以的:
应该是用no_ui中的run.py自动服务,没有连接数据库导致,下面是vnpy1 vs vnpy2中的自动服务:
这个no_ui中的run.py 主引擎是怎么连接数据库的? 没找到对应连接的函数
脚本模式,你初始化的合约是rb2005.SHFE,这个没数据。
图形模式,你初始化的合约是fu2005.SHFE,这个有数据。
2.0里的数据库连接,程序初始化的时候自动做掉了,无需用户自己调用任何函数。
用Python的交易员 wrote:
脚本模式,你初始化的合约是rb2005.SHFE,这个没数据。
图形模式,你初始化的合约是fu2005.SHFE,这个有数据。2.0里的数据库连接,程序初始化的时候自动做掉了,无需用户自己调用任何函数。
图形模式,初始化合约rb2005.SHFE和fu2005.SHFE 都是有数据的 都可以初始化成功 当时是试了好几个合约都是可以
脚本模式,都不可以,所以觉得是脚本模式没能成功获取数据导致,具体不知道为何?
找不到原因 暂时只有还是回到vnpy1了