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

description

如上图是tick级数据的时间戳, 每秒是两条的数据,时间戳上是一样的

1.上传数据时会有数据的覆盖吗?

2.tick级回测时 是怎么看时间的?

锁仓后,下一交易日平仓时,怎么进行平仓?
只能手动平仓吗?

股指期货平今的手续费很高,为了锁定收益,进行锁仓,vnpy代码中怎么实现锁仓的操作呢?

持多仓时,直接语句self.short来锁仓吗? 反之,self.buy?

vnpy可以在锁仓后的第二个交易日实现自动平仓操作吗?

xiaohe wrote:

请问通过data_manager模块还能看见该合约数据吗?
是用的什么数据库?

可以的

description

数据库是默认的sqlite 知道mongodb怎么重启 sqlite数据库不知道怎么重启 服务中也没

description

数据是正常的, 之前回测都好好的
优化参数时,出现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线时间,是从什么时候到什么时候。

没有打印出任何东西:

description

description

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

description

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

description

description

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

用Python的交易员 wrote:

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

description

数据量充足,上面只填充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)
输出信息如下

description

description

(打印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:

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

description

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

str_pythin wrote:

str_pythin wrote:

找了下原因

description

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

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

持续顶

str_pythin wrote:

找了下原因

description

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

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

找了下原因

description

分别打印出 每个周期的一些变量值, 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

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

沪公网安备 31011502017034号

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