在vnpy社区版3.8.0, 我写了一个策略,监控27个商品,就是同一个策略,应用到多个symbol。发现如下异常:
我昨天特意到8:55以后初始化策略实例,发现郑商所的品种可以接收tick,大商所还是不行。上期所和广期所OK。 我的猜想:
请高手指点哪里出问题了?
使用VNStation 3.1 安装后,发现MongoDB导入数据异常。 表现为数据可以插入,但是bar_overview统计出错。具体代码出错位置就是统计bar数量 Cousor.count()报错,说是没有这个函数。
对比VNstation 3.0, 发现pymongo版本不同。使用老的pymongo==3.12.3替换后,正常。 后来发现是Cousor.count()失效了。 请及时团队更新这个问题
我也发现这个问题。 数据下载,存入mongodb的时候不带时区(没有按照MongoDB官方推荐的用UTC存)。 数据存取时候做了相应转换,没有问题。
但是回测过程中, 在MongoManager批量读取的时候,开始时间和结束时间需要带时区。 逻辑是OK的,但是给大家提个醒。
engine = BacktestingEngine()
engine.set_parameters(
vt_symbols=option_vt_symbols,
interval=Interval.MINUTE,
start=datetime(2021, 1, 1, 8, 30, 0).astimezone(get_localzone()),
end=datetime(2021, 1, 20, 15, 30, 0).astimezone(get_localzone()),
rates=option_rates,
slippages=slippages,
sizes=sizes,
priceticks=priceticks,
capital=1_000_000,
)
策略代码中,收盘1%的报价间隔也超出仿真环境报价范围。需要改小,比如改为0.5%的报价间隔
if self.pos > 0:
self.sell(bar.close_price * 0.995, abs(self.pos)) # 原来1%的差距太大。在仿真环境超出报价范围
elif self.pos < 0:
self.cover(bar.close_price * 1.005, abs(self.pos)) # 原来1%的差距太大。在仿真环境超出报价范围
中金所 仿真环境的限制, 如上楼。还是影响了IF的仿真。
本地停止单对分钟线上日内交易有价值。我把策略逻辑改为非本地停止单,策略效果大大退步。本地停止单可以在本bar完成,而非停止单要本bar完成后的下一个ticket才触发。
我自己稍微修改了一下,CtaEngine类的check_stop_order()函数。在原来的代码下面增加了一段。这里 CtaEngine.sim_trade 是类变量,可以用来做全局变量,控制这段逻辑,这样实盘就不用改代码了。
"""这里重新计算停止单"""
# 在中金所仿真环境中,tick.limit_up tick.limit_down报价失败,同时也没有tick.ask_price_5和tick.bid_price_5
if CtaEngine.sim_trade:
jump = tick.ask_price_1 - tick.bid_price_1
if stop_order.direction == Direction.LONG:
price =tick.ask_price_1 + 5*jump
else:
price =tick.bid_price_1 - 5*jump
今天测试了一下中信期货仿真生产环境,发现IF1912不能支持本地停止单。 目前程序用市价单,就是tick.limit_up 和tick.limit_down报单,被拒。中金所仿真环境的报价范围好像只有当前价格的上下30个点。 ticket对象中也没有ask_price_5或者bid_price_5。 (其他非中金所的品种没有测试)
中信期货仿真生产环境如下:
brokid :66666
针对生产版本API_6.3.15
tcp://ctpfz1-front1.citicsf.com:51305
tcp://ctpfz1-front1.citicsf.com:51313
是不是中信期货的仿真环境功能比较全,中信期货仿真交易下可以用本地停止单吗?
CTP仿真环境支持本地停止单吗?
用华鑫期货的仿真环境,测试中用到了vnpy的本地停止单(local_stop_order)功能,在IF1912合约上。发现出错。 策略发的本地停止单3840的空单,ctp发的
3476的现价空单。 所以仿真环境CTP报错,错误信息是超出报价范围。
我看了一下CtaEngine类的check_stop_order()函数。需要ticket中的tick.ask_price_5,bid_price_5,或者tick.limit_down,tick.limit_up。仿真环境中买五,卖五的价格都没有啊。
if stop_order.direction == Direction.LONG:
if tick.limit_up:
price = tick.limit_up
else:
price = tick.ask_price_5
else:
if tick.limit_down:
price = tick.limit_down
else:
price = tick.bid_price_5
我以KingKeltnerStrategy示例的本地停止单模式。
采用本地停止单的模式下,我发现在实盘下无法正常撤单。版本2.0.6, 股指IC1908合约交易。
在回测模式下是OK的。然后我debug了一下,发现在回测模式下,backtesting engine返回的是 vt_orderid是这样的格式["STOP.1"] ,而在cta engine下,返回的本地停止单的的格式是'STOP.1", 是不带[]的。 请问正确的格式是应该是怎样的? 我找了一下相关源代码,如下
cta engine的代码(413行)=====>
self.stop_orders[stop_orderid] = stop_order
vt_orderids = self.strategy_orderid_map[strategy.strategy_name]
vt_orderids.add(stop_orderid)
self.call_strategy_func(strategy, strategy.on_stop_order, stop_order)
self.put_stop_order_event(stop_order)
return stop_orderid
BacktestingEngine的代码(906行)======>
price = round_to(price, self.pricetick)
if stop:
vt_orderid = self.send_stop_order(direction, offset, price, volume)
else:
vt_orderid = self.send_limit_order(direction, offset, price, volume)
return [vt_orderid]
遇到同样的问题。 跪等答案。
重新安装 numpy 1.16.3 后, 运行 python run.py, python 程序报错。 错误信息如下:
问题签名:
问题事件名称: APPCRASH
应用程序名: python.exe
应用程序版本: 3.7.150.1013
应用程序时间戳: 5b34dd6a
故障模块名称: libopenblas.IPBC74C7KURV7CB2PKT5Z5FNR3SIBV4J.gfortran-win_amd64.
故障模块版本: 0.0.0.0
故障模块时间戳: 5cbcde25
异常代码: c000001d
异常偏移: 00000000010fecc1
OS 版本: 6.1.7601.2.1.0.274.10
区域设置 ID: 2052
其他信息 1: 753d
其他信息 2: 753dccad1d6d05691900c4bfecccafaa
其他信息 3: 5ec1
其他信息 4: 5ec122d7c777f1340a189b487718a9dc
联机阅读隐私声明:
http://go.microsoft.com/fwlink/?linkid=104288&clcid=0x0804
如果无法获取联机隐私声明,请脱机阅读我们的隐私声明:
C:\Windows\system32\zh-CN\erofflps.txt
自己示例程序写了如下run.py,执行后出错。
from vnpy.event import EventEngine
from vnpy.trader.engine import MainEngine
from vnpy.trader.ui import MainWindow, create_qapp
from vnpy.gateway.ctp import CtpGateway
from vnpy.app.cta_strategy import CtaStrategyApp
def main():
"""Start VN Trader"""
qapp = create_qapp()
event_engine = EventEngine()
main_engine = MainEngine(event_engine)
main_engine.add_gateway(CtpGateway)
main_engine.add_app(CtaStrategyApp)
main_window = MainWindow(main_engine, event_engine)
main_window.showMaximized()
qapp.exec()
if name == "main":
main()
出现如下错误=======================>
Traceback (most recent call last):
File "C:\ProgramData\VNConda\lib\site-packages\numpy\core__init__.py", line 16, in <module>
from . import multiarray
ImportError: DLL load failed: %1 不是有效的 Win32 应用程序。
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:/vnpy-2.0.2/qic/run.py", line 2, in <module>
from vnpy.trader.engine import MainEngine
File "C:\vnpy-2.0.2\vnpy\trader\engine.py", line 26, in <module>
from .setting import SETTINGS
File "C:\vnpy-2.0.2\vnpy\trader\setting.py", line 7, in <module>
from .utility import load_json
File "C:\vnpy-2.0.2\vnpy\trader\utility.py", line 9, in <module>
import numpy as np
File "C:\ProgramData\VNConda\lib\site-packages\numpy__init.py", line 142, in <module>
from . import add_newdocs
File "C:\ProgramData\VNConda\lib\site-packages\numpy\add_newdocs.py", line 13, in <module>
from numpy.lib import add_newdoc
File "C:\ProgramData\VNConda\lib\site-packages\numpy\lib\init.py", line 8, in <module>
from .type_check import *
File "C:\ProgramData\VNConda\lib\site-packages\numpy\lib\type_check.py", line 11, in <module>
import numpy.core.numeric as _nx
File "C:\ProgramData\VNConda\lib\site-packages\numpy\core\init__.py", line 26, in <module>
raise ImportError(msg)
ImportError:
Importing the multiarray numpy extension module failed. Most
likely you are trying to import a failed build of numpy.
If you're working with a numpy git repo, try git clean -xdf
(removes all
files not under version control). Otherwise reinstall numpy.
Original error was: DLL load failed: %1 不是有效的 Win32 应用程序。
Process finished with exit code 1