如上图是tick级数据的时间戳, 每秒是两条的数据,时间戳上是一样的
1.上传数据时会有数据的覆盖吗?
2.tick级回测时 是怎么看时间的?
锁仓后,下一交易日平仓时,怎么进行平仓?
只能手动平仓吗?
股指期货平今的手续费很高,为了锁定收益,进行锁仓,vnpy代码中怎么实现锁仓的操作呢?
持多仓时,直接语句self.short来锁仓吗? 反之,self.buy?
vnpy可以在锁仓后的第二个交易日实现自动平仓操作吗?
xiaohe wrote:
请问通过data_manager模块还能看见该合约数据吗?
是用的什么数据库?
可以的
数据库是默认的sqlite 知道mongodb怎么重启 sqlite数据库不知道怎么重启 服务中也没
数据是正常的, 之前回测都好好的
优化参数时,出现memory Error后, 在回测就连接不上数据库的数据了
这种怎么解决
应该是出现在委托下单交易时
Exception in thread Thread-1:
Traceback (most recent call last):
File "C:\Anaconda3\lib\threading.py", line 917, in _bootstrap_inner
self.run()
File "C:\Anaconda3\lib\threading.py", line 865, in run
self._target(*self._args, **self._kwargs)
File "C:\Anaconda3\lib\site-packages\vnpy\event\engine.py", line 60, in _run
self._process(event)
File "C:\Anaconda3\lib\site-packages\vnpy\event\engine.py", line 73, in _process
[handler(event) for handler in self._handlers[event.type]]
File "C:\Anaconda3\lib\site-packages\vnpy\event\engine.py", line 73, in <listcomp>
[handler(event) for handler in self._handlers[event.type]]
File "C:\Anaconda3\lib\site-packages\vnpy\app\cta_strategy\engine.py", line 157, in process_tick_event
self.check_stop_order(tick)
File "C:\Anaconda3\lib\site-packages\vnpy\app\cta_strategy\engine.py", line 270, in check_stop_order
stop_order.lock
File "C:\Anaconda3\lib\site-packages\vnpy\app\cta_strategy\engine.py", line 366, in send_limit_order
lock
File "C:\Anaconda3\lib\site-packages\vnpy\app\cta_strategy\engine.py", line 318, in send_server_order
reference=f"{APPNAME}{strategy.strategy_name}"
TypeError: init() missing 1 required positional argument: 'volume'
这样也省去了初始化数据 开启策略的工作
一周或者几天打开关闭就行?
问题请见标题
期货和现货价格交割前会逐渐趋于一致, 只看到期货价格,不知道哪里可以看现货价格
用Python的交易员 wrote:
脚本模式,你初始化的合约是rb2005.SHFE,这个没数据。
图形模式,你初始化的合约是fu2005.SHFE,这个有数据。2.0里的数据库连接,程序初始化的时候自动做掉了,无需用户自己调用任何函数。
图形模式,初始化合约rb2005.SHFE和fu2005.SHFE 都是有数据的 都可以初始化成功 当时是试了好几个合约都是可以
脚本模式,都不可以,所以觉得是脚本模式没能成功获取数据导致,具体不知道为何?
找不到原因 暂时只有还是回到vnpy1了
用Python的交易员 wrote:
在on_bar里,加上:
if not self.inited:
print(bar.datetime)然后点击策略初始化,看看cmd里初始化打印出来的K线时间,是从什么时候到什么时候。
没有打印出任何东西:
但是通过客户端初始化数据是完全可以的:
应该是用no_ui中的run.py自动服务,没有连接数据库导致,下面是vnpy1 vs vnpy2中的自动服务:
这个no_ui中的run.py 主引擎是怎么连接数据库的? 没找到对应连接的函数
用Python的交易员 wrote:
因为你数据库里的数据量不够,图中就能看到am15序列里,只填充了5个15分钟线,而默认的am缓存数据长度是100,请用RQData数据服务或者用DataRecorder来录制数据
数据量充足,上面只填充5个15分钟线,还是连接ctp后填充的数据,也就是说初始化没成功,一直找的是为何初始化没成功?
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???
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
用Python的交易员 wrote:
请附上代码,光是这个日志没法知道逻辑是什么
为什么初始化之后,途中的count的值还是0 ???
之前就是在多周期策略中打印出每周期的count的值,这就导致初始化ininted还是False
str_pythin wrote:
str_pythin wrote:
找了下原因
分别打印出 每个周期的一些变量值, am的size都是给的500,为何策略初始化后的am.count值还是从1开始计算的???
导致am.inited一直是False,没有初始化成功,难怪一直没交易委托产生在顶一下
陈总别忽视这个问题
持续顶
str_pythin wrote:
找了下原因
分别打印出 每个周期的一些变量值, am的size都是给的500,为何策略初始化后的am.count值还是从1开始计算的???
导致am.inited一直是False,没有初始化成功,难怪一直没交易委托产生
在顶一下
陈总别忽视这个问题
找了下原因
分别打印出 每个周期的一些变量值, am的size都是给的500,为何策略初始化后的am.count值还是从1开始计算的???
导致am.inited一直是False,没有初始化成功,难怪一直没交易委托产生
Traceback (most recent call last):
File "C:\vnstudio\Lib\site-packages\vnpy\trader\ui\mainwindow.py", line 278, in open_widget
widget = widget_class(self.main_engine, self.event_engine)
File "C:\vnstudio\Lib\site-packages\vnpy\app\cta_strategy\ui\widget.py", line 37, in init
self.cta_engine.init_engine()
File "C:\vnstudio\Lib\site-packages\vnpy\app\cta_strategy\engine.py", line 109, in init_engine
self.load_strategy_data()
File "C:\vnstudio\Lib\site-packages\vnpy\app\cta_strategy\engine.py", line 794, in load_strategy_data
self.strategy_data = load_json(self.data_filename)
File "C:\vnstudio\Lib\site-packages\vnpy\trader\utility.py", line 99, in load_json
data = json.load(f)
File "c:\vnstudio\lib\json__init.py", line 296, in load
parse_constant=parse_constant, object_pairs_hook=object_pairs_hook, **kw)
File "c:\vnstudio\lib\json\init__.py", line 348, in loads
return _default_decoder.decode(s)
File "c:\vnstudio\lib\json\decoder.py", line 337, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "c:\vnstudio\lib\json\decoder.py", line 355, in raw_decode
raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 31 column 17 (char 714)
这是什么问题??
simnow 非交易时间的ctp