那可以在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参数
“用到数据了的吗?”指的是?
不会
可以换个高性能的数据库,可能会快一点
可以不用anaconda,一键安装或者下个官方python手动安装试试
没有缺失啊,VeighNa的K线是以K线开始时间作为时间戳的
请问你是合成几分钟bar?最后一根bar时间是?
你engine.py里没加get_size函数吧
可以自己看看样本内外效果看看是否有过拟合的问题
想研究细粒度挂撤单可以参考公众号vnpy-community的【进阶资料】-【实战进阶CTA资料】的课时29
可以自己根据报错信息在网上搜索解决了