在分钟回测时,如果是最后一根bar来触发下单,好像都要第二天的第一根bar成交。 而实际是希望能将这个成交算在当天。 有什么方式可以达到目标? 谢谢
1)用行情记录模块的功能,记录一个合约的tick数据。(mysql数据库)。可是查看数据库的时候,发现只有1秒一笔数据,而且只精确到秒。这是为什么?
2)如果只用vnpy框架来订阅合约,并指定保存到文件的方式记录tick。可以每秒2笔,发现一天下来,保存会有数据遗漏(大概几百笔,每天数量不定)。 这种遗漏是否用行情记录模块记录也会发生(现在每秒一笔也是有遗漏)。是网络丢包造成,还是程序写入时有错误,或者是ctp漏报?
3)实盘交易的时候,是否也会有收不到的tick数据? 怎样可以解决这种问题,交易程序放到(交易所)期货公司机房里边?
谢谢
报错如下:
Traceback (most recent call last):
File "c:\vnstudio\lib\site-packages\vnpy\app\portfolio_manager\ui\widget.py", line 207, in process_trade_event
self.monitor.update_trade(trade)
File "c:\vnstudio\lib\site-packages\vnpy\app\portfolio_manager\ui\widget.py", line 278, in update_trade
reference_cell = BaseCell(trade.reference, trade)
AttributeError: 'TradeData' object has no attribute 'reference'
在CTP的order回报中。关于时间的字段有很多:
///报单日期
TThostFtdcDateType InsertDate;
///委托时间
TThostFtdcTimeType InsertTime;
///激活时间
TThostFtdcTimeType ActiveTime;
///挂起时间
TThostFtdcTimeType SuspendTime;
///最后修改时间
TThostFtdcTimeType UpdateTime;
///撤销时间
TThostFtdcTimeType CancelTime;
自己看了下vnpy的代码,
在object.py 当中定义的OrderData 有两个时间字段,datetime: datetime = None 和 cancel_time: str = ""
在ctp_gateway.py 当中的onRtnOrder里边,有timestamp = f"{data['InsertDate']} {data['InsertTime']}"
疑问1)OrderData 的datetime代表什么?
测试在CTA策略模块里,下委托单后,打印每次收到on_order 里边的datetime,时间是变化的,而且比tick行情的时间早?
例如 09:45:10.400 tick行情触发下单,然后在on_order收到的情况是:09:45:09 提交中;09:45:09 提交中;09:45:10全部成交;
从上面的代码来看,OrderData 当中的datetime应该是委托报单时间才对?这个时间应该是ctp报过来的,不是本地时间对吧?那为什么会实际收到的变化的时间呢?
2)怎么可以在orderdata对象中增加对应CTP里边的CancelTime撤单时间 和 UpdateTime最后更新时间(我理解就是order的全部成交时间)?
在ctp_gateway.py 当中的data有定义data['CancelTime']吗,哪里可以增加这个定义,从而让接口有这个数据? 然后在ctp_gateway.py 的onRtnOrder添加一行 canceltime = data[CancelTime]? 同样的,这笔委托的最后更新时间 updatetime = data[updateTime]?
感谢!
委托来源字段记录了委托来自哪个策略(实例),可是VNPY没有将这些信息保存到文件或者数据库当中。当系统重启动后,这些来源字段就变成空了。。。。
请问,是否有接口可以直接查询并获取客户端显示的所有委托信息,从而自行保存?
同一个策略(不同参数)的两个实例,交易的是同一个品种。这种情况下,vnpy可以识别委托是属于哪一个策略实例的。
问题是:
1)如何去检查某个策略实例的持仓与实际持仓是否一致?
如果只有一个策略实例的时候,可以通过查询实际持仓 与 策略持仓比较来发现是否持仓一致。但是,两个实例(同一品种)的话,因为在同一个实际账户里边,查询实际持仓是得到两个策略实例的实际持仓,无法区分某个策略实例。一般是怎么做最理想呢?(是否只能通过成交回报来自行维护实例的持仓,无法进行实际持仓的比较?)
2)如果想要手动补单到对应的策略实例当中,可以怎么操作?
能否可以将某笔成交指定到某个策略实例当中。 假设当发现策略实例和实际持仓不一致时,想要手动补单到策略中。。
仿真环境下,ctpgateway报错。。。
ValueError: time data '20210408 144916.0' does not match format '%Y%m%d %H:%M:%S.%f'
At:
C:\vnstudio\lib_strptime.py(359): _strptime
C:\vnstudio\lib_strptime.py(577): _strptime_datetime
C:\vnstudio\lib\site-packages\vnpy\gateway\ctp\ctp_gateway.py(315): onRtnDepthMarketData
ValueError: time data '20210408 144917.0' does not match format '%Y%m%d %H:%M:%S.%f'
At:
C:\vnstudio\lib_strptime.py(359): _strptime
C:\vnstudio\lib_strptime.py(577): _strptime_datetime
C:\vnstudio\lib\site-packages\vnpy\gateway\ctp\ctp_gateway.py(315): onRtnDepthMarketData
ValueError: time data '20210408 144918.0' does not match format '%Y%m%d %H:%M:%S.%f'
At:
C:\vnstudio\lib_strptime.py(359): _strptime
C:\vnstudio\lib_strptime.py(577): _strptime_datetime
C:\vnstudio\lib\site-packages\vnpy\gateway\ctp\ctp_gateway.py(315): onRtnDepthMarketData
ValueError: time data '20210408 144919.0' does not match format '%Y%m%d %H:%M:%S.%f'
At:
C:\vnstudio\lib_strptime.py(359): _strptime
C:\vnstudio\lib_strptime.py(577): _strptime_datetime
C:\vnstudio\lib\site-packages\vnpy\gateway\ctp\ctp_gateway.py(315): onRtnDepthMarketData
在vnpy程序已经启动,并且CTA模块对应策略开始运行了。
如果在某些特殊情况,策略代码发生错误了。一般,在CTA界面上可以看到有报错提示。
1)某个策略错误,是否不影响其他策略的运行?
2)是否CTA模块在监测策略代码运行状态?什么位置可以获取这个错误。。。因为不一定随时都盯着界面看,想要及时知道报错发生了的话,在哪个地方可以增加一个处理:例如,在界面上报错的同时,发邮件微信或者做什么动作进行提醒?
。
谢谢
对一个未成交单进行撤单操作:cancel_order().想要知道撤单的处理结果,怎么能够的到呢?
1)在on_order() 里边好像也得不到回报? 好像"已撤单"状态可以收到. 但是如果撤单失败哪里得到??
2)撤单可能成功,也可能失败. 有各种原因的失败(比如, id报的不对; 单已被撤;等等) 这些错误信息又可以怎么获得?
谢谢
假定股指有昨仓 buy 2手,sell 2手; 今天第一笔开仓想要 sell open 1手。 调用的self.short(). 用了锁仓模式lock=True。
结果应该是变成buy1手,sell 2手?(即 buy close 1)--我认为预期结果是这个。
还是 buy 2手,sell 3 手?(即直接sell open 1 )?
按照convert.py代码里的:
if yd_available:
req_yd = copy(req)
if self.exchange in [Exchange.SHFE, Exchange.INE]:
req_yd.offset = Offset.CLOSEYESTERDAY
else:
req_yd.offset = Offset.CLOSE
req_yd.volume = close_volume
req_list.append(req_yd)
发现最终下出去的指令是 sell close。。。为什么不是buy close?!
麻烦大侠指教,谢谢
若在实盘交易过程中,因各种原因导致程序退出或网络中断,一段时间后,程序网络又重新启动恢复正常。如果恰好退出/断开的中间有成交回报错过,因为 策略层没法主动查询底层持仓,持仓怎么维护?
1)原本策略代码想是通过成交回报自己维护持仓。那么中断导致策略漏掉数据,有什么方法?
2)系统重启动后,self.pos(逻辑持仓)还会是准确的吗?系统重启时,会主动更新一次逻辑持仓吗? 怎么可以获取详细持仓信息然后同步回策略自己维护的持仓当中。
3)断开的过程中,可能还包括手动去做的一些下单操作等,这些成交怎么可以同步回逻辑持仓当中?
谢谢
1)日志问题:为了debug,从run.py 加载ui界面。然后进入CTA回测。在回测当中,界面上有日志,可是日志文件始终没有生成。 在界面的配置里面已经设置了级别10,True等。是要怎么才有文件日志生成呢?
2)CTA策略init时,调用ArrayManager(10) 。假设参数是10. 为什么分钟onbar开始的时候,第一分钟就是从9:40开始,为什么不是9:30开始呢?
是不是说因为我的策略要求前10分钟的数据需要用来计算指标之类的,所以必然从9:40开始。 那么,如果我需要昨天最后n分钟,例如n=30分钟的数据来计算指标(onBar第一分钟从第二天的9:31开始),那该怎么设置?(如果这里设置30,开始日期要提前一天的话,好像也不对啊?)
3)是不是 on_init()里面的load_bar() --指定加载过去n天的数据来执行策略初始化任务。这个只要大于我前面ArrayManager(10)的就可以。比如我只要30分钟的,那么这里1天就足够了?
谢谢
策略在运行当中,考虑追单,平仓等原因,需要获取当日的历史成交信息,当前的持仓信息(甚至包括昨仓和今仓)以及当日的委托信息等。。
1)看了论坛的一些提问和说法:在策略里,是没有接口获取吗?如果有,请问要怎么获取。main_engine.get_all_trades这种是可以直接用吗?
2)如果不能在策略获取,那是不是说要在策略的onTrade/onOrder里边,这些信息全部由策略代码来自己维护这些信息?
3)假设自己维护这些信息,那么怎么确保和ctp柜台端保持一致。可能有各种原因导致自己保存的和柜台的不一致的情况。可以定期从CTP同步还是建议策略怎么做?有具体同步函数接口吗
3)如果在策略运行的过程中,使用vnpy界面进行了开平仓处理,会触发策略的onTrade/onOrder吗(如果有单过来,还可以自己维护起来)? 再者,如果未经过vnpy,而是通过类似快期这种ctp客户端操作,vnpy底层会忽略还是说会触发到策略层,由策略层来自己决定如何处理?
谢谢。