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

那可以在engine的process_trade_event函数里收到成交信息的时候用round_to函数把成交数量根据合约取整一下试试

手动委托不会改变策略持仓(self.pos),策略on_trade函数也只能收到该策略的成交信息,而不是该品种的

vnpy_ctastrategy.engine的send_order函数

可以在vnpy.trader.utility的BarGenerator类下的update_tick函数里打印排查看看为什么没有合成1分钟bar

教育账号只能在校园网内使用

感谢楼主的贡献,尝试复现了一下,需要成功使用还有些补充的地方:
 
1楼已贴代码补充:
 
(1). 3.4.2: vnpy_rqdata\rqdata_datafeed.py里class RqdataDatafeed下需要加一行

trading_hours_file = "trading_hours.json"

 
(2). 3.4.3: vnpy\trader\engine.py里顶部添加from .utility import load_json,然后main_engine的init函数下也需要加一句

self.all_trading_hours = load_json("trading_hours.json")

 
如需通过CTA策略模块使用MyBarGenerator,还需对vnpy_ctastrategy做出相应调整:
 
(1). vnpy_ctastrategy.template的CtaTemplate类下添加get_trading_hours函数:

    def get_trading_hours(self):
        """
        Return trading_hours of trading contract.
        """
        return self.cta_engine.get_trading_hours(self)

 
(2). vnpy_ctastrategy.engine下添加get_trading_hours函数:

    def get_trading_hours(self, strategy: CtaTemplate):
        """
        Return contract trading hours.
        """
        trading_hours: str = self.main_engine.get_trading_hours(strategy.vt_symbol)
        return trading_hours

 
(3). vnpy_ctastrategy.backtesting的BacktestingEngine类的init函数下添加self.trading_hours: str = ""定义、在set_parameters函数中添加trading_hours入参以及添加get_trading_hours函数:

    def set_parameters(
        self,
        vt_symbol: str,
        interval: Interval,
        start: datetime,
        rate: float,
        slippage: float,
        size: float,
        pricetick: float,
        capital: int = 0,
        end: datetime = None,
        mode: BacktestingMode = BacktestingMode.BAR,
        inverse: bool = False,
        risk_free: float = 0,
        annual_days: int = 240,
        trading_hours: str = ""    # add
    ):
        """"""
        self.mode = mode
        self.vt_symbol = vt_symbol
        self.interval = Interval(interval)
        self.rate = rate
        self.slippage = slippage
        self.size = size
        self.pricetick = pricetick
        self.start = start

        self.symbol, exchange_str = self.vt_symbol.split(".")
        self.exchange = Exchange(exchange_str)

        self.capital = capital
        self.end = end
        self.mode = mode
        self.inverse = inverse
        self.risk_free = risk_free
        self.annual_days = annual_days

        self.trading_hours = trading_hours    # add

 

    def get_trading_hours(self, strategy: CtaTemplate):
        """
        Return contract trading hours.
        """
        return self.trading_hours

 

策略内使用方法:
 
1分钟K线:
策略顶部导入MyBarGeratorfrom vnpy.trader.utility import MyBarGenerator,策略init函数初始化MyBarGerator:

    def __init__(self, cta_engine, strategy_name, vt_symbol, setting):
        """"""
        super().__init__(cta_engine, strategy_name, vt_symbol, setting)
        trading_hours: str = self.get_trading_hours()

        self.bg = MyBarGenerator(self.on_bar, trading_hours=trading_hours)
        self.am = ArrayManager()

 

 
n分钟K线:
策略顶部导入MyBarGeneratorfrom vnpy.trader.utility import MyBarGenerator, Interval,策略init函数初始化MyBarGenerator:

    def __init__(self, cta_engine, strategy_name, vt_symbol, setting):
        """"""
        super().__init__(cta_engine, strategy_name, vt_symbol, setting)
        trading_hours: str = self.get_trading_hours()

        self.bg = MyBarGenerator(self.on_bar, 15, self.on_15min_bar, interval=Interval.DAILY, trading_hours=trading_hours)
        self.am = ArrayManager()

 
请注意,如需使用MyBarGenerator进行CTA策略回测,回测脚本调用engine.engine.set_parameters函数的时候不要忘记传入trading_hours参数
 

  1. date_str这里每个tick更新,会有额外性能开销的;
  2. ctp的onRtnDepthMarketData函数推送一秒两次,修改前后tick.datetime不会有差别的。

不会

可以换个高性能的数据库,可能会快一点

可以不用anaconda,一键安装或者下个官方python手动安装试试

没有缺失啊,VeighNa的K线是以K线开始时间作为时间戳的

你engine.py里没加get_size函数吧

可以自己看看样本内外效果看看是否有过拟合的问题

想研究细粒度挂撤单可以参考公众号vnpy-community的【进阶资料】-【实战进阶CTA资料】的课时29

可以自己根据报错信息在网上搜索解决了

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

沪公网安备 31011502017034号

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