封装的合约信息好像没有涨跌停字段,在结合竞价阶段,没有tick数据推送吧?如何获取合约的涨跌停价格?
数据源采用聚宽连续合约,标的铁矿石,参数设置如下:
# 样本外检验
# 配置合约信息
# 缺TA8888 CF8888 SM8888 SC8888 ZC8888
# 合约大小写按交易所格式
vt_symbols = [
"i8888.DCE"
]
rates = {s: 0.001 for s in vt_symbols}
slippages = {s: 0 for s in vt_symbols}
sizes = {s: contract_sizes[s] for s in vt_symbols}
priceticks = {s: 0.01 for s in vt_symbols}
# 创建回测引擎
engine = BacktestingEngine()
engine.set_parameters(
vt_symbols=vt_symbols,
interval=Interval.MINUTE,
start=datetime(2019, 1, 1),
end=datetime(2022, 4, 30),
rates=rates,
slippages=slippages,
sizes=sizes,
priceticks=priceticks,
capital=10_000_000,
)
setting = {
"entry_window": 20,
"exit_window": 10,
"n_window": 20,
"unit_limit": 2
}
engine.add_strategy(TurtleStrategy, setting)
engine.load_data()
engine.run_backtesting()
df = engine.calculate_result()
engine.calculate_statistics()
engine.show_chart()
回测发现问题,如图,在2020年2月3日位置,发现净值跳跃
查看文华财经,铁矿石加权价格数据,2月3日为春节后,第一天,价格跳空,如图
通过函数engine.daily_results,engine.trades 导出合成的日线close和 成交明细数据,发现三个问题,需要请教:
第1个问题
在2020年2月3日,跳空前的几天,随机抽取两天1月20日,1月22日,发现 合成的收盘价,是23:00。跳空后的几天,随机抽取两天,合成的收盘价 是在15:00,为什么2月3日的前几天,合成的收盘价会取23:00?
1月20日
1月22日
2月6日
第2个问题
2020年2月3日跳空当天,分钟数据,价格基本都是在600附近,合成的2月3日收盘价 693.5 是如何得出来的?
第3个问题
向下跳空后,按道理,应该是向下突破做空吧?成交明细中,是买多,为什么会开多仓?
海龟策略精析课程中,组合回测之后,请问如何将 品种的原始收盘价曲线数据、回测净值曲线数据,回测统计指标 打印到excel文件? 这几个数据存储在engine的哪个位置?
请问在 no_ui 模式下,是否可以用 on_order 和 on_trade 函数? 使用文档 的案例中没用到这两个
1、10:15之前发单还正常,15分钟休市,10:30之后,发单,有的单子就收不到信息回报了
2、发单了,但是信息的状态 一直是 提交中,没有更新,也就是没有收到 on_order推送
3、期货公司后台查询,没收到订单(收盘很久了,所以查不到柜台是否拒单)
4、期货公司问是否封装了这几个函数?
5、用的是阿里云,感觉网络问题的可能性较小
请问,有可能是什么原因,导致发单了,但却发送不到交易所? 10:15之前都是正常的,10:30之后,有些单子,就没发出去,有些单子是成功的
启动VN Station 加密策略文件成功了。
但尝试了一下,加密非策略文件,譬如加密回测的backtesting.py,报错,加密vnpy/app/cta_strategy/ 中的engine.py文件也报类似的错误。
请问是什么原因?
c:\vnstudio\lib\site-packages\Cython\Compiler\Main.py:369: FutureWarning: Cython directive 'language_level' not set, using 2 for now (Py2). This will change in a later release! File: C:\vnstudio\Lib\site-packages\vnpy\app\cta_strategy\backtesting.py
tree = Parsing.p_module(s, pxd, full_module_name)
Error compiling Cython file:
------------------------------------------------------------
...
def write_log(self, msg: str, strategy: CtaTemplate = None):
"""
Write log message.
"""
msg = f"{self.datetime}\t{msg}"
^
------------------------------------------------------------
Lib\site-packages\vnpy\app\cta_strategy\backtesting.py:1057:14: Cannot convert Unicode string to 'str' implicitly. This is not portable and requires explicit encoding.
Traceback (most recent call last):
File "c:\vnstudio\lib\runpy.py", line 193, in _run_module_as_main
"__main__", mod_spec)
File "c:\vnstudio\lib\runpy.py", line 85, in _run_code
exec(code, run_globals)
File "c:\vnstudio\Scripts\easycython.exe\__main__.py", line 9, in <module>
File "c:\vnstudio\lib\site-packages\begin\main.py", line 54, in start
collector=self._collector)
File "c:\vnstudio\lib\site-packages\begin\cmdline.py", line 253, in apply_options
return_value = call_function(func, signature(ext), opts)
File "c:\vnstudio\lib\site-packages\begin\cmdline.py", line 236, in call_function
return func(*pargs, **kwargs)
File "c:\vnstudio\lib\site-packages\easycython\easycython.py", line 77, in main
ext_modules = cythonize(ext_modules),
File "c:\vnstudio\lib\site-packages\Cython\Build\Dependencies.py", line 1102, in cythonize
cythonize_one(*args)
File "c:\vnstudio\lib\site-packages\Cython\Build\Dependencies.py", line 1225, in cythonize_one
raise CompileError(None, pyx_file)
Cython.Compiler.Errors.CompileError: C:/vnstudio/Lib/site-packages/vnpy/app/cta_strategy/backtesting.py
Compiling C:/vnstudio/Lib/site-packages/vnpy/app/cta_strategy/backtesting.py because it changed.
[1/1] Cythonizing C:/vnstudio/Lib/site-packages/vnpy/app/cta_strategy/backtesting.py
加密失败。
在本地机中,复制examples中的trader文件夹,可以实现在本地 登录不同账号的功能
请问 ,如果购买了阿里云
想几个人都利用这台阿里云,分别交易不同账户或者同一个账号(譬如在本地不同电脑下单),如何实现?
好像有个rpc功能,能阿里云拖几台本地机么?
能不能指导一下步骤,非常感谢
版本号 2.1.9
目的是想将修改后的cta_strategy组件放置在run.py对应的路径下,不影响site-packages中的原文件
但是,启动后,发现策略没有了,不知道哪个路径还需要修改一下
实施步骤:
1、建立examples文件夹
2、examples文件下新建vn_trader 文件夹
3、vn_trader 文件夹中拷贝.vtrader , cta_strategy , gateway , strategies 文件夹, demo_script.py , run.py 文件
4、修改 run.py 中的启动接口
在run.py路径下,shift+右键,输入python run.py启动
但是启动结果是,找不到策略了,还需要修改cta_strategy中的哪个文件才能实现将cta_strategy迁移至run.py所在的路径下?
大连品种,开多一张,再开空一张,保证金是双边收取。
快期V2 软件 有个组合保证金功能, 进入——大商所组合,选自动组合,这样多一张、空一张下单之后(快期要一直开启),锁仓是按单边来收取保证金的。
请问vnpy如何实现 实时组合保证金?(这样就不用再开快期V2软件了)
快期功能说明地址:
https://www.shinnytech.com/blog/dashangsuo-zuhe/
发送订单
第1 发单 cover_vt_orderid = self.cover(cover_price, abs(order_volume))
发单之后INFO信息会返回一个Order Object
第2 打印 self.write_log(f'买入平仓 , pos:{self.pos}, local_pos:{self.local_pos}, \
orderid:{cover_vt_orderid}, symbol:{self.vt_symbol}, price:{cover_price}, volume:{order_volume}')
返回信息 和打印信息如下:
2021-07-02 09:03:05,599 INFO: original_req:OrderRequest(symbol='SP jm2108&jm2110', exchange=<Exchange.DCE: 'DCE'>, direction=<Direction.LONG: '多'>, type=<OrderType.LIMIT: '限价'>, volume=1.0, price=116.5, offset=<Offset.CLOSE: '平'>, reference='')
2021-07-02 09:03:05,599 INFO: req_list:[OrderRequest(symbol='SP jm2108&jm2110', exchange=<Exchange.DCE: 'DCE'>, direction=<Direction.LONG: '多'>, type=<OrderType.LIMIT: '限价'>, volume=1.0, price=116.5, offset=<Offset.CLOSE: '平'>, reference='')]
2021-07-02 09:03:05,617 INFO: req:OrderRequest(symbol='SP jm2108&jm2110', exchange=<Exchange.DCE: 'DCE'>, direction=<Direction.LONG: '多'>, type=<OrderType.LIMIT: '限价'>, volume=1.0, price=116.5, offset=<Offset.CLOSE: '平'>, reference='')
2021-07-02 09:03:05,617 INFO: ex_long jm2108&jm2110: 买入平仓 , pos:50, local_pos:0, orderid:['CTP.6_1679360163_1'], symbol:SP jm2108&jm2110.DCE, price:116.5, volume:1
请问,怎么才能第一时间在策略的内部主动获取这个Order Object的信息
cover_vt_orderid = self.cover(cover_price, abs(order_volume))
譬如在上述发单命令之后,在策略的内部调用self.cta_engine.main_engine.get_order(cover_vt_orderid),获取不到这个order Object,得到的是 None
提交一个挂单,然后再撤单,收到的订单回报正确顺序应该为: 提交中,未成交,已撤单。
但是,发现在收到已撤单前一瞬间,会收到上一个未成交信息的重复推送,变成了:提交中,未成交,未成交,已撤单
请问是我改代码的原因,还是版本的原因? 2.1.1版本。
不知道部分成交撤单会不会出现类似情况
2021-06-25 10:12:48,083 INFO: 行情服务器连接成功
2021-06-25 10:12:48,083 INFO: 交易服务器连接成功
2021-06-25 10:12:48,349 INFO: 交易服务器授权验证成功
2021-06-25 10:12:48,349 INFO: 行情服务器登录成功
2021-06-25 10:12:48,364 INFO: 交易服务器登录成功
2021-06-25 10:12:49,833 INFO: 结算信息确认成功
2021-06-25 10:12:56,552 INFO: 合约信息查询成功
2021-06-25 10:13:01,521 INFO: CTA策略引擎初始化成功
2021-06-25 10:13:05,755 INFO: in_mark_long pp2109开始执行初始化
2021-06-25 10:13:05,755 INFO: in_mark_long pp2109: 策略初始化
2021-06-25 10:13:05,755 INFO: in_mark_long pp2109初始化完成
2021-06-25 10:13:06,224 INFO: in_mark_long pp2109: 策略启动
2021-06-25 10:13:23,786 INFO: cta_engine strategy.name:in_mark_long pp2109
2021-06-25 10:13:23,786 INFO: in_mark_long pp2109: on_order:OrderData(gateway_name='CTP', symbol='pp2109', exchange=<Exchange.DCE: 'DCE'>, orderid='21_331284613_000000001432', type=<OrderType.LIMIT: '限价'>, direction=<Direction.LONG: '多'>, offset=<Offset.OPEN: '开'>, price=8495.0, volume=1, traded=0, status=<Status.SUBMITTING: '提交中'>, datetime=datetime.datetime(2021, 6, 25, 10, 13, 23, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>), reference='')
2021-06-25 10:13:23,786 INFO: in_mark_long pp2109: local_pos:0, pos:0
2021-06-25 10:13:23,786 INFO: in_mark_long pp2109: buy_orderids:['CTP.21_331284613_000000001432'], sell_orderids:[], short_orderids:[], cover_orderids:[]
2021-06-25 10:13:23,864 INFO: in_mark_long pp2109: on_order:OrderData(gateway_name='CTP', symbol='pp2109', exchange=<Exchange.DCE: 'DCE'>, orderid='21_331284613_000000001432', type=<OrderType.LIMIT: '限价'>, direction=<Direction.LONG: '多'>, offset=<Offset.OPEN: '开'>, price=8495.0, volume=1, traded=0, status=<Status.NOTTRADED: '未成交'>, datetime=datetime.datetime(2021, 6, 25, 10, 13, 22, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>), reference='')
2021-06-25 10:13:23,864 INFO: in_mark_long pp2109: local_pos:0, pos:0
2021-06-25 10:13:23,873 INFO: in_mark_long pp2109: buy_orderids:['CTP.21_331284613_000000001432'], sell_orderids:[], short_orderids:[], cover_orderids:[]
2021-06-25 10:13:46,114 INFO: in_mark_long pp2109: on_order:OrderData(gateway_name='CTP', symbol='pp2109', exchange=<Exchange.DCE: 'DCE'>, orderid='21_331284613_000000001432', type=<OrderType.LIMIT: '限价'>, direction=<Direction.LONG: '多'>, offset=<Offset.OPEN: '开'>, price=8495.0, volume=1, traded=0, status=<Status.NOTTRADED: '未成交'>, datetime=datetime.datetime(2021, 6, 25, 10, 13, 22, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>), reference='')
2021-06-25 10:13:46,114 INFO: in_mark_long pp2109: local_pos:0, pos:0
2021-06-25 10:13:46,114 INFO: in_mark_long pp2109: buy_orderids:['CTP.21_331284613_000000001432'], sell_orderids:[], short_orderids:[], cover_orderids:[]
2021-06-25 10:13:46,177 INFO: in_mark_long pp2109: on_order:OrderData(gateway_name='CTP', symbol='pp2109', exchange=<Exchange.DCE: 'DCE'>, orderid='21_331284613_000000001432', type=<OrderType.LIMIT: '限价'>, direction=<Direction.LONG: '多'>, offset=<Offset.OPEN: '开'>, price=8495.0, volume=1, traded=0, status=<Status.CANCELLED: '已撤销'>, datetime=datetime.datetime(2021, 6, 25, 10, 13, 22, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>), reference='')
2021-06-25 10:13:46,177 INFO: in_mark_long pp2109: local_pos:0, pos:0
2021-06-25 10:13:46,177 INFO: in_mark_long pp2109: ask_price:8508.0, bid_price:8507.0, ask_volume:59, bid_volume:12
2021-06-25 10:13:46,177 INFO: in_mark_long pp2109: on_order算法补单
2021-06-25 10:13:46,177 INFO: in_mark_long pp2109: buy_orderids:[], sell_orderids:[], short_orderids:[], cover_orderids:[]
关于手动交易组件里面的实时价格显示,代码中有实时价格的定义,控件也在布局中定义了,为什么手动交易控件中没有显示实时价格呢? 印象中1.9版本的能显示,现在用的是2.1.1版本,目前没有看到显示。 是不是打开方式不对?能看到实时价格显示的正确步骤应该是怎样的?
尝试了一下跟踪其他软件手动下单,订单在vnpy中的处理过程,cta_gateway.py -->gateway.py-->eventengine,这三个位置都用log打印出来,看看发生了什么。
cta_gateway.py中,添加打印如下:
def onRtnOrder(self, data: dict):
"""
Callback of order status update.
"""
symbol = data["InstrumentID"]
exchange = symbol_exchange_map.get(symbol, "")
if not exchange:
self.order_data.append(data)
return
frontid = data["FrontID"]
sessionid = data["SessionID"]
order_ref = data["OrderRef"]
orderid = f"{frontid}_{sessionid}_{order_ref}"
order = OrderData(
symbol=symbol,
exchange=exchange,
orderid=orderid,
type=ORDERTYPE_CTP2VT[data["OrderPriceType"]],
direction=DIRECTION_CTP2VT[data["Direction"]],
offset=OFFSET_CTP2VT[data["CombOffsetFlag"]],
price=data["LimitPrice"],
volume=data["VolumeTotalOriginal"],
traded=data["VolumeTraded"],
status=STATUS_CTP2VT[data["OrderStatus"]],
time=data["InsertTime"],
gateway_name=self.gateway_name
)
self.gateway.on_order(order)
self.sysid_orderid_map[data["OrderSysID"]] = orderid
# 无问西东
logger.info(f"gateway.on_order:{order}")
logger.info(f"data["OrderSysID"]:{data["OrderSysID"]}")
gateway.py中 on_event ,添加打印如下:
def on_event(self, type: str, data: Any = None) -> None:
"""
General event push.
"""
event = Event(type, data)
self.event_engine.put(event)
# 无问西东
logger.info(f"gateway.py on_event event.type:{event.type}")
logger.info(f"gateway.py on_event event.data:{event.data}")
eventengine中,添加打印如下:
def _run(self) -> None:
"""
Get event from queue and then process it.
"""
while self._active:
try:
event = self._queue.get(block=True, timeout=1)
# 无问西东
logger.info(f"_run event_engine event.type:{event.type}")
logger.info(f"_run event_engine event.data:{event.data}")
self._process(event)
except Empty:
pass
1、请问在gateway.on_order函数中,为什么要推送两次?一次是EVENT_ORDER,一次是EVENT_ORDER + order.vt_orderid,两个的作用分别是什么?
def on_order(self, order: OrderData) -> None:
"""
Order event push.
Order event of a specific vt_orderid is also pushed.
"""
self.on_event(EVENT_ORDER, order)
self.on_event(EVENT_ORDER + order.vt_orderid, order)
2、打印出来的结果如下,会发现EVENT_ORDER的event在eventengine中的_run中的队列中被提取掉,并被后续的mainengine处理,而EVENT_ORDER + order.vt_orderid对应的事件在_run函数中没有被提取,也就是没有被打印出来,导致后续所有的下单(包括vnpy自带的下单控件下的单就没有响应,可能是跟队列中,有没被提取的事件导致阻塞有关)。请问为什么平时vnpy自带的下单控件下单对应的EVENT_ORDER + order.vt_orderid事件能被处理,而用其他软件下单对应的EVENT_ORDER + order.vt_orderid事件不能被提取?:
2021-03-10 22:58:33.213 | INFO | vnpy.trader.gateway:on_event:99 - gateway.py on_event event.type:eOrder.
2021-03-10 22:58:33.213 | INFO | vnpy.event.engine:_run:66 - _run event_engine event.type:eOrder.
2021-03-10 22:58:33.227 | INFO | vnpy.trader.gateway:on_event:100 - gateway.py on_event event.data:OrderData(gateway_name='CTP', symbol='m2105', exchange=<Exchange.DCE: 'DCE'>, orderid='21_-647510950_000000000056', type=<OrderType.LIMIT: '限价'>, direction=<Direction.SHORT: '空'>, offset=<Offset.OPEN: '开'>, price=3215.0, volume=1, traded=0, status=<Status.SUBMITTING: '提交中'>, datetime=datetime.datetime(2021, 3, 10, 22, 58, 32, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>), reference='')
2021-03-10 22:58:33.227 | INFO | vnpy.event.engine:_run:67 - _run event_engine event.data:OrderData(gateway_name='CTP', symbol='m2105', exchange=<Exchange.DCE: 'DCE'>, orderid='21_-647510950_000000000056', type=<OrderType.LIMIT: '限价'>, direction=<Direction.SHORT: '空'>, offset=<Offset.OPEN: '开'>, price=3215.0, volume=1, traded=0, status=<Status.SUBMITTING: '提交中'>, datetime=datetime.datetime(2021, 3, 10, 22, 58, 32, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>), reference='')
2021-03-10 22:58:33.227 | INFO | vnpy.trader.gateway:on_event:99 - gateway.py on_event event.type:eOrder.CTP.21_-647510950_000000000056
2021-03-10 22:58:33.227 | INFO | vnpy.trader.engine:process_order_event:400 - mainengine event.type:eOrder.
2021-03-10 22:58:33.227 | INFO | vnpy.trader.gateway:on_event:100 - gateway.py on_event event.data:OrderData(gateway_name='CTP', symbol='m2105', exchange=<Exchange.DCE: 'DCE'>, orderid='21_-647510950_000000000056', type=<OrderType.LIMIT: '限价'>, direction=<Direction.SHORT: '空'>, offset=<Offset.OPEN: '开'>, price=3215.0, volume=1, traded=0, status=<Status.SUBMITTING: '提交中'>, datetime=datetime.datetime(2021, 3, 10, 22, 58, 32, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>), reference='')
2021-03-10 22:58:33.227 | INFO | vnpy.trader.engine:process_order_event:401 - mainengine event.data:OrderData(gateway_name='CTP', symbol='m2105', exchange=<Exchange.DCE: 'DCE'>, orderid='21_-647510950_000000000056', type=<OrderType.LIMIT: '限价'>, direction=<Direction.SHORT: '空'>, offset=<Offset.OPEN: '开'>, price=3215.0, volume=1, traded=0, status=<Status.SUBMITTING: '提交中'>, datetime=datetime.datetime(2021, 3, 10, 22, 58, 32, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>), reference='')
2021-03-10 22:58:33.243 | INFO | vnpy.app.cta_strategy.engine:process_order_event:178 - cta_engine event.type:eOrder.
2021-03-10 22:58:33.243 | INFO | vnpy.app.cta_strategy.engine:process_order_event:179 - cta_engine event.data:OrderData(gateway_name='CTP', symbol='m2105', exchange=<Exchange.DCE: 'DCE'>, orderid='21_-647510950_000000000056', type=<OrderType.LIMIT: '限价'>, direction=<Direction.SHORT: '空'>, offset=<Offset.OPEN: '开'>, price=3215.0, volume=1, traded=0, status=<Status.SUBMITTING: '提交中'>, datetime=datetime.datetime(2021, 3, 10, 22, 58, 32, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>), reference='')
2021-03-10 22:58:33.259 | INFO | vnpy.trader.gateway:on_event:99 - gateway.py on_event event.type:eOrder.
2021-03-10 22:58:33.259 | INFO | vnpy.trader.gateway:on_event:100 - gateway.py on_event event.data:OrderData(gateway_name='CTP', symbol='m2105', exchange=<Exchange.DCE: 'DCE'>, orderid='21_-647510950_000000000056', type=<OrderType.LIMIT: '限价'>, direction=<Direction.SHORT: '空'>, offset=<Offset.OPEN: '开'>, price=3215.0, volume=1, traded=0, status=<Status.NOTTRADED: '未成交'>, datetime=datetime.datetime(2021, 3, 11, 22, 58, 32, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>), reference='')
2021-03-10 22:58:33.259 | INFO | vnpy.trader.gateway:on_event:99 - gateway.py on_event event.type:eOrder.CTP.21_-647510950_000000000056
2021-03-10 22:58:33.259 | INFO | vnpy.trader.gateway:on_event:100 - gateway.py on_event event.data:OrderData(gateway_name='CTP', symbol='m2105', exchange=<Exchange.DCE: 'DCE'>, orderid='21_-647510950_000000000056', type=<OrderType.LIMIT: '限价'>, direction=<Direction.SHORT: '空'>, offset=<Offset.OPEN: '开'>, price=3215.0, volume=1, traded=0, status=<Status.NOTTRADED: '未成交'>, datetime=datetime.datetime(2021, 3, 11, 22, 58, 32, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>), reference='')
请问一下,如果是其他交易软件手动下的单,如何通过vnpy获取该手动订单的订单信息以及成交回报信息?想实现手动开仓,vnpy自动风控
目前看到的样例是轮询驱动
while engine.strategy_active:
......
sleep(1)
自己想到的接近on_tick的模式是,不断轮询,判断tick的datetime是否有更新,最大误差就是sleep的时间
while engine.strategy_active:
for i in range(10):
tick = engine.get_tick(vt_symbol, use_df=True)
if tick['datetime'][0] != tick_pre['datetime'][0]:
break # 如果是新tick数据,则跳出循环
sleep(0.1)
......
请问 jupyter notebook是否可以on_tick或on_trade事件驱动触发?可不可以举个简单例子?
非常感谢
vnpy版本1.9.2
onTick触发时,程序开始和结束的时候,都记录本地时间,并writeCtaLog出来
def onTick(self, tick):
self.writeCtaLog(u'本地时间: %s' %(datetime,datetime.now())
tickstarttime = datetime.datetime.now()
策略主体
tickendtime = datetime.datetime.now()
passtime = str(tickendtime - tickstarttime)
self.writeCtaLog(u'onTick程序运行时长: %s' %(passtime))
一、发现两个现象
有时候打印出来的Log时间差大于onTick程序实际的运行时间,有时候Log时间差又小于onTick程序实际的运行时间,如下:
1、onTick程序运行时间0.001s,Log记录的时间差有0.007s (即23,598 - 23,591)
2019-12-23 13:43:23,591 INFO: CTA_STRATEGY p2005 LongStrategy:本地时间: 2019-12-23 13:43:23.588000
2019-12-23 13:43:23,592 INFO: CTA_STRATEGY p2005 LongStrategy:pos **** :0
2019-12-23 13:43:23,592 INFO: CTA_STRATEGY p2005 LongStrategy:self.auto[self.vtSymbol] :on
2019-12-23 13:43:23,594 INFO: CTA_STRATEGY p2005 LongStrategy:askprice askvolume:6014.0 595
2019-12-23 13:43:23,595 INFO: CTA_STRATEGY p2005 LongStrategy:bidprice bidvolume:6012.0 525
2019-12-23 13:43:23,595 INFO: CTA_STRATEGY p2005 LongStrategy:拒单数 撤单数:0 0
2019-12-23 13:43:23,595 INFO: CTA_STRATEGY p2005 LongStrategy:仓位:0
2019-12-23 13:43:23,596 INFO: CTA_STRATEGY p2005 LongStrategy:self.lastTick.lastVolume:0
2019-12-23 13:43:23,596 INFO: CTA_STRATEGY p2005 LongStrategy:self.lastTick.volume:2501110
2019-12-23 13:43:23,596 INFO: CTA_STRATEGY p2005 LongStrategy:self.limitVolume[self.vtSymbol]:200
2019-12-23 13:43:23,596 INFO: CTA_STRATEGY p2005 LongStrategy:order.price:6000.0
2019-12-23 13:43:23,598 INFO: CTA_STRATEGY p2005 LongStrategy:onTick程序运行时长 :0:00:00.001000
2、onTick程序运行时间0.005s,Log记录的时间只有0.004s (即07,096 - 07,092),
且记录的起始时间比程序本身的时间要晚0.020s,即第一条程序时间13:51:07.072000,Log时间13:51:07,092
2019-12-23 13:51:07,092 INFO: CTA_STRATEGY p2005 LongStrategy:本地时间: 2019-12-23 13:51:07.072000
2019-12-23 13:51:07,092 INFO: CTA_STRATEGY p2005 LongStrategy:pos **** :0
2019-12-23 13:51:07,094 INFO: CTA_STRATEGY p2005 LongStrategy:self.auto[self.vtSymbol] :on
2019-12-23 13:51:07,094 INFO: CTA_STRATEGY p2005 LongStrategy:askprice askvolume:6024.0 415
2019-12-23 13:51:07,094 INFO: CTA_STRATEGY p2005 LongStrategy:bidprice bidvolume:6022.0 660
2019-12-23 13:51:07,095 INFO: CTA_STRATEGY p2005 LongStrategy:拒单数 撤单数:0 0
2019-12-23 13:51:07,095 INFO: CTA_STRATEGY p2005 LongStrategy:仓位:0
2019-12-23 13:51:07,095 INFO: CTA_STRATEGY p2005 LongStrategy:self.lastTick.lastVolume:0
2019-12-23 13:51:07,095 INFO: CTA_STRATEGY p2005 LongStrategy:self.lastTick.volume:2561906
2019-12-23 13:51:07,095 INFO: CTA_STRATEGY p2005 LongStrategy:self.limitVolume[self.vtSymbol]:200
2019-12-23 13:51:07,095 INFO: CTA_STRATEGY p2005 LongStrategy:order.price:6000.0
2019-12-23 13:51:07,096 INFO: CTA_STRATEGY p2005 LongStrategy:onTick程序运行时长 :0:00:00.005000
二、问题
1、writeCtaLog函数记录的时候和程序主体运行是什么样的关系?Log时间差一会大,一会小,感觉是相互独立的
2、如果onTick中运用了较多的writeCtaLog函数来记录,譬如20个策略,每个策略onTick中写出30个writeCtaLog函数,这样在效率上会影响onTick程序的运行么?
3、假如writeCtaLog函数较多会影响onTick程序的效率,怎么提高效率呢,Log的信息改用pandas输出?还是说用多进程multiprocessing包?
非常感谢!
易盛 极星 内盘,在期货数据方面有些优势,譬如郑商所的商品期货,数据有免费五档行情,以及tick切片是0.25s,优势很明显,请问易盛 极星 内盘的数据api接口有没有上线的计划?谢谢
目的是添加一个手动开仓的UI,按钮链接到策略的sendOrder,然后策略自动平仓(譬如止损),但失败了,启动半个小时左右,UI就 无响应了
版本 vnpy1.8.1
具体实施的步骤如下:
1、在主窗口增加了一个 “测试” 菜单
2、‘’测试‘下拉菜单里,添加按钮,连接到弹出窗口
测试按钮代码:
# 帮助
helpMenu = menubar.addMenu(vtText.HELP)
helpMenu.addAction(self.createAction(vtText.CONTRACT_SEARCH, self.openContract, loadIconPath('contract.ico')))
helpMenu.addAction(self.createAction(vtText.EDIT_SETTING, self.openSettingEditor, loadIconPath('editor.ico')))
helpMenu.addSeparator()
helpMenu.addAction(self.createAction(vtText.RESTORE, self.restoreWindow, loadIconPath('restore.ico')))
helpMenu.addAction(self.createAction(vtText.ABOUT, self.openAbout, loadIconPath('about.ico')))
helpMenu.addSeparator()
helpMenu.addAction(self.createAction(vtText.TEST, self.test, loadIconPath('test.ico')))
# 测试
testMenu = menubar.addMenu(vtText.TEST)
testMenu.addAction(self.createAction(u'参数配置', self.openSettingParameter, loadIconPath('editor.ico')))
testMenu.addAction(self.createAction(u'sniper', self.sniperTrade, loadIconPath('editor.ico')))**
弹出窗口函数
def sniperTrade(self):
"""打开手动交易"""
try:
self.widgetDict['sniperTrade'].show()
except KeyError:
self.widgetDict['sniperTrade'] = SniperTradingWidget(self.mainEngine, self.eventEngine, self.ctaEngine) # 无问西东 新建窗体 新增传入ctaEngine
self.widgetDict['sniperTrade'].show()
3、弹出窗口是参照“简单交易组件”照搬过来,增加了几个下单的按钮(可以连接到策略中的sendOrder)
class TradingWidget(QtWidgets.QFrame):
class SniperTradingWidget(QtWidgets.QFrame):
这个UI界面中没有耗时程序,基本updateTick函数,更新UI时间在10ms内
一般能正常启动和正常运行,半个小时到一个小时后,UI就无响应了(包括MainWindow),UI虽然无响应,但是后台的策略程序在正常运行。
请问这样加载一个新的弹出窗口的程序步骤是正确的么?无响应的问题会出在哪个环节?谢谢
按照知乎帖子“vn.trader的tick-to-trade延时测试”一文,链接为https://zhuanlan.zhihu.com/p/24242972,想测试一下本机的内部耗时,vnpy为1.8.1版本,在visual studio 2013 (boost为boost_1_68_0版本)编译的时候,出现如下错误:
错误 2 error C2039: “task_time”: 不是“Task”的成员
错误 3 error C2039: “t”: 不是“MdApi”的成员
错误 4 error C2228: “.QuadPart”的左边必须有类/结构/联合
5 IntelliSense: class "Task" 没有成员 "task_time"
原文代码的github链接失效了,所以不知道具体还改了哪些地方,我只改了“vn.trader的tick-to-trade延时测试”一文中提到的内容,不知道为什么会出现这样的错误(boost版本的原因?),请指点一下,谢谢