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

问题描述:我在我自己的每个用户策略,都开了一个Timer的定时任务线程,self.timer=Timer(1,self.Timer_Task),并且在Timer_Task不断的开启定时任务循环运行Timer_Task,开这个定时任务的主要目的是在开盘的时候第一时间发单(我现在已经知道我这个做法不对,我已经修改.现在我主要想请教一下我遇到的故障的原因)

但是有出现的情况是这样,两个策略A和B,在各自的定时任务线程下同一时间发单,A和B策略发单后,两个策略都返回取得了同一个订单号(正常应该是各自取得策略本身的订单号)
A策略发单之后,返回了A的订单号,但是后续的order和trade并没有推送给A策略
B策略发单之后,返回的也是A的订单号,并且把A策略的这个订单的order和trade都推送到B策略这边了
而B策略本身发出去的那个订单,有在委托列表中,但是不被识别了

我读了代码,觉得应该是订单ID和策略之间的映射字典出错了.但是我不懂是什么原因?

请问,是不是2个线程同时调用CTP gateway的send_order,然后订单号返回给了错误的策略?

我分析了一下这个问题,不知道是不是这样:
限价,也就是OrderType.LIMIT,对应的ROHON信号为:(THOST_FTDC_OPT_LimitPrice, THOST_FTDC_TC_GFD, THOST_FTDCVC$),也就是 (('2', '3', '1'),)
但是现在推送过来的却是(('2', '\x03', '1'),),本来是十进制的字符串'3',推送成了十六进制的'\x03'过来
导致在委托类型映射表找不到这个委托类型,从而出现错误

另外请问:假设是我说的这个原因,那么,出现错误之后,onRtnOrder接下来后面的语句就都不再执行了吗?如果有新的onRtnOrder过来,还会执行吗?

MTF wrote:

那就是6.5.1.7了,你的版本没问题,要找期货公司融航系统的运维IT,做下联合调试来排查了

今天这个问题又出现了,结合上次的时间点,我发现都是在周一开盘后出现这个问题.是不是因为周末放假期间,有啥问题导致的这个?

出现的错误提示如下:

2023-05-05 20:47:50 --------------------------------------------------
2023-05-05 20:47:50 VeighNa Trader进程启动
2023-05-05 20:47:55 找不到数据服务驱动vnpy_,使用默认的RQData数据服务
2023-05-08 09:00:01 KeyError: (('2', '\x03', '1'),)

At:
C:\veighna_studio\lib\site-packages\vnpy_rohon\gateway\rohon_gateway.py(669): onRtnOrder

2023-05-08 09:00:21 KeyError: (('2', '\x03', '1'),)

At:
C:\veighna_studio\lib\site-packages\vnpy_rohon\gateway\rohon_gateway.py(669): onRtnOrder

2023-05-08 09:00:21 KeyError: (('2', '\x03', '1'),)

At:
C:\veighna_studio\lib\site-packages\vnpy_rohon\gateway\rohon_gateway.py(669): onRtnOrder

KeyError: (('2', '\x03', '1'),)

miro wrote:

如果vnpy_rohon版本比较老的话,可能是委托状态映射里没有THOST_FTDC_OST_NoTradeNotQueueing和THOST_FTDC_OST_PartTradedNotQueueing,我之前遇到过类似的问题

要如何解决呢?我是官网下载的安装包安装的.

MTF wrote:

请检查下vnpy_rohon版本号是否为目前新的6.5.1.7

我是官网主页下载的安装包安装的,4月14日刚下载安装的VerghNa-3.6.0.

在site-packages文件夹下面,有vnpy_rohon-6.5.1.7.dist-info和vnpy_rohon这2个文件夹.

从文件夹名字看,是您说的版本(我不懂得哪里查版本号,从文件夹名字看的)

根据LOG信息里,20230424_09:07:48这个时间的5条TradeData,成交数量已经达到6手(我是开仓3手套利合约,单边是6手)

然后根据记录,一直都没有推送OrderData过来,并且在20230424_10:16:01和20230424_11:31:01,我的代码主动调用查询order信息,发现状态一直为"未成交"

完整的LOG如下:

20230421_20:45:41.673695:('策略启动,初始化参数',)

20230421_21:00:00.146116:('定单号:1682079061_101_16,合约:SPD RM308&RM309,卖平数量:3,价格:24.00',)

20230421_21:00:00.208397:('order触发,trading值:', True)
20230421_21:00:00.208397:(OrderData(gateway_name='ROHON', extra=None, symbol='SPD RM308&RM309', exchange=<Exchange.CZCE: 'CZCE'>, orderid='1682079061_101_16', type=<OrderType.LIMIT: '限价'>, direction=<Direction.SHORT: '空'>, offset=<Offset.CLOSE: '平'>, price=24.0, volume=3.0, traded=0, status=<Status.SUBMITTING: '提交中'>, datetime=None, reference='CtaStrategy_RM308309_zhang_02'),)

20230421_21:00:02.692924:('order触发,trading值:', True)
20230421_21:00:02.692924:(OrderData(gateway_name='ROHON', extra=None, symbol='SPD RM308&RM309', exchange=<Exchange.CZCE: 'CZCE'>, orderid='1682079061_101_16', type=<OrderType.LIMIT: '限价'>, direction=<Direction.SHORT: '空'>, offset=<Offset.CLOSE: '平'>, price=24.0, volume=3, traded=0, status=<Status.NOTTRADED: '未成交'>, datetime=datetime.datetime(2023, 4, 21, 21, 0, tzinfo=zoneinfo.ZoneInfo(key='Asia/Shanghai')), reference=''),)

20230424_08:20:20.450230:('order触发,trading值:', True)
20230424_08:20:20.450230:(OrderData(gateway_name='ROHON', extra=None, symbol='SPD RM308&RM309', exchange=<Exchange.CZCE: 'CZCE'>, orderid='1682079061_101_16', type=<OrderType.LIMIT: '限价'>, direction=<Direction.SHORT: '空'>, offset=<Offset.CLOSE: '平'>, price=24.0, volume=3, traded=0, status=<Status.NOTTRADED: '未成交'>, datetime=datetime.datetime(2023, 4, 21, 21, 0, tzinfo=zoneinfo.ZoneInfo(key='Asia/Shanghai')), reference=''),)

20230424_09:07:48.507890:('trade触发,trading值:', True)
20230424_09:07:48.507890:(TradeData(gateway_name='ROHON', extra=None, symbol='RM309', exchange=<Exchange.CZCE: 'CZCE'>, orderid='1682079061_101_16', tradeid=' 1407', direction=<Direction.LONG: '多'>, offset=<Offset.CLOSE: '平'>, price=2786.0, volume=1, datetime=datetime.datetime(2023, 4, 24, 9, 7, 48, tzinfo=zoneinfo.ZoneInfo(key='Asia/Shanghai'))),)
20230424_09:07:48.507890:('trade触发,trading值:', True)
20230424_09:07:48.507890:(TradeData(gateway_name='ROHON', extra=None, symbol='RM309', exchange=<Exchange.CZCE: 'CZCE'>, orderid='1682079061_101_16', tradeid=' 1408', direction=<Direction.LONG: '多'>, offset=<Offset.CLOSE: '平'>, price=2786.0, volume=1, datetime=datetime.datetime(2023, 4, 24, 9, 7, 48, tzinfo=zoneinfo.ZoneInfo(key='Asia/Shanghai'))),)
20230424_09:07:48.586168:('trade触发,trading值:', True)
20230424_09:07:48.586168:(TradeData(gateway_name='ROHON', extra=None, symbol='RM308', exchange=<Exchange.CZCE: 'CZCE'>, orderid='1682079061_101_16', tradeid=' 1409', direction=<Direction.SHORT: '空'>, offset=<Offset.CLOSE: '平'>, price=2810.0, volume=2, datetime=datetime.datetime(2023, 4, 24, 9, 7, 48, tzinfo=zoneinfo.ZoneInfo(key='Asia/Shanghai'))),)
20230424_09:07:48.586168:('trade触发,trading值:', True)
20230424_09:07:48.586168:(TradeData(gateway_name='ROHON', extra=None, symbol='RM309', exchange=<Exchange.CZCE: 'CZCE'>, orderid='1682079061_101_16', tradeid=' 1410', direction=<Direction.LONG: '多'>, offset=<Offset.CLOSE: '平'>, price=2786.0, volume=1, datetime=datetime.datetime(2023, 4, 24, 9, 7, 48, tzinfo=zoneinfo.ZoneInfo(key='Asia/Shanghai'))),)
20230424_09:07:48.586168:('trade触发,trading值:', True)
20230424_09:07:48.586168:(TradeData(gateway_name='ROHON', extra=None, symbol='RM308', exchange=<Exchange.CZCE: 'CZCE'>, orderid='1682079061_101_16', tradeid=' 1411', direction=<Direction.SHORT: '空'>, offset=<Offset.CLOSE: '平'>, price=2810.0, volume=1, datetime=datetime.datetime(2023, 4, 24, 9, 7, 48, tzinfo=zoneinfo.ZoneInfo(key='Asia/Shanghai'))),)

20230424_10:16:01.999447:('更新order信息:',)
20230424_10:16:01.999447:(OrderData(gateway_name='ROHON', extra=None, symbol='SPD RM308&RM309', exchange=<Exchange.CZCE: 'CZCE'>, orderid='1682079061_101_16', type=<OrderType.LIMIT: '限价'>, direction=<Direction.SHORT: '空'>, offset=<Offset.CLOSE: '平'>, price=24.0, volume=3, traded=0, status=<Status.NOTTRADED: '未成交'>, datetime=datetime.datetime(2023, 4, 21, 21, 0, tzinfo=zoneinfo.ZoneInfo(key='Asia/Shanghai')), reference=''),)
20230424_10:16:01.999447:('order信息更新完毕:',)

20230424_11:31:01.726556:('更新order信息:',)
20230424_11:31:01.726556:(OrderData(gateway_name='ROHON', extra=None, symbol='SPD RM308&RM309', exchange=<Exchange.CZCE: 'CZCE'>, orderid='1682079061_101_16', type=<OrderType.LIMIT: '限价'>, direction=<Direction.SHORT: '空'>, offset=<Offset.CLOSE: '平'>, price=24.0, volume=3, traded=0, status=<Status.NOTTRADED: '未成交'>, datetime=datetime.datetime(2023, 4, 21, 21, 0, tzinfo=zoneinfo.ZoneInfo(key='Asia/Shanghai')), reference=''),)
20230424_11:31:01.726556:('order信息更新完毕:',)

20230424_14:26:47.286601:('策略停止',)

ROHON接口,在主界面出现一个什么Keyerr的错误(具体错误我没有记录下来就关掉了,因为那时候我不知道真的出错,大概有印象是这么个名字)

然后我发现账户的实际持仓和我程序记录的不一样,我就打开LOG,发现如下问题:

在正常情况下,一个单子完全成交后,既有推送OrderData过来,也有推送TradeData过来.并且,OrderData状态会更新为"完全成交"

但是,这次,完全成交完后,只有推送几条TradeData,没有推送OrderData过来

并且,在盘后,我的代码有主动调用main_engine.get_order(vt_orderid)打印出来的order信息仍然为"未成交"

在CTA界面模式下,是否可能实现某个策略的重载?

比如我是策略运行过程中,需要修改其中的某个策略的代码,盘中就需要把这个策略的新代码重载应用到策略里

现在的做法是必须停止所有策略,退出CTA,然后再重新启动开始.

但是这种做法,其他策略也不得不停止,已经挂出去的订单不得不重新排队

所以,请问,界面模式下,能否实现只重载单个策略?

RT,vnpy.trader.engine里面的get_all_orders,这个取的是当前策略的orders,还是账户里所有品种的orders?

RT,CTA策略中的self.pos变量,在界面上显示的那个后台是否有使用,用户代码里,是否可以改变管理这个self.pos,不会对下单等产生冲突吧?

MTF wrote:

18650802653 wrote:

是不是底层那边,需要等待trade数据,更新仓位才行?

order数据显示 已全部成交还不够?

对的,这里涉及到融航内部的仓位维护逻辑,根据你这里反馈猜测也是基于on_trade来计算,所以你在收到on_trade之前(一般延时很低很低,但也不排除特殊情况慢个百毫秒到几秒)就去下平仓委托,自然可能出现仓位不足了。

意思是说,这个仓位不足的拒单,是融航那边拒绝的.而不是VNPY这边本地拒绝的,是吧?

VNPY这边发单,有进行仓位判断吗?还是直接就发出去?

下面是完整的LOG记录:
我下的是套利单,先收到ORDER回调,显示已完全成交,然后我发单,发单的时候,收到TRADE回调,TRADE信息显示品种1成交了2手,品种2成交了1手,然后被拒单,拒单完后,才收到品种2成交第2手的信息

完全成交的ORDER信息,是柜台那边推送过来的,还是VNPY后台根据TRADE信息推算出来的?如果是VNPY来推算的,是不是只根据品种1的成交就推算全部成交了?

20230417_09:03:00.843838:('order触发,trading值:', True)
20230417_09:03:00.843838:(OrderData(gateway_name='ROHON', extra=None, symbol='SPD CF307&CF309', exchange=<Exchange.CZCE: 'CZCE'>, orderid='1681689782_151_4', type=<OrderType.LIMIT: '限价'>, direction=<Direction.LONG: '多'>, offset=<Offset.OPEN: '开'>, price=-130.0, volume=2.0, traded=0, status=<Status.SUBMITTING: '提交中'>, datetime=None, reference='CtaStrategy_CF307309_ren_02'),)

20230417_09:03:05.437649:('order触发,trading值:', True)
20230417_09:03:05.437649:(OrderData(gateway_name='ROHON', extra=None, symbol='SPD CF307&CF309', exchange=<Exchange.CZCE: 'CZCE'>, orderid='1681689782_151_4', type=<OrderType.LIMIT: '限价'>, direction=<Direction.LONG: '多'>, offset=<Offset.OPEN: '开'>, price=-130.0, volume=2, traded=0, status=<Status.NOTTRADED: '未成交'>, datetime=datetime.datetime(2023, 4, 17, 9, 3, tzinfo=zoneinfo.ZoneInfo(key='Asia/Shanghai')), reference=''),)

20230417_09:49:28.957018:('order触发,trading值:', True)
20230417_09:49:28.957018:(OrderData(gateway_name='ROHON', extra=None, symbol='SPD CF307&CF309', exchange=<Exchange.CZCE: 'CZCE'>, orderid='1681689782_151_4', type=<OrderType.LIMIT: '限价'>, direction=<Direction.LONG: '多'>, offset=<Offset.OPEN: '开'>, price=-130.0, volume=2, traded=2, status=<Status.ALLTRADED: '全部成交'>, datetime=datetime.datetime(2023, 4, 17, 9, 3, tzinfo=zoneinfo.ZoneInfo(key='Asia/Shanghai')), reference=''),)

20230417_09:49:28.957018:('开多全部成交,订单号:', '1681689782_151_4', ',数量:', 2, ',价格:', -130.0)
20230417_09:49:28.957018:('定单号:ROHON.1681689782_151_49,合约:SPD CF307&CF309,卖出平仓数量:2,价格:-120.000000\n',)

20230417_09:49:28.957018:('order触发,trading值:', True)
20230417_09:49:28.957018:(OrderData(gateway_name='ROHON', extra=None, symbol='SPD CF307&CF309', exchange=<Exchange.CZCE: 'CZCE'>, orderid='1681689782_151_49', type=<OrderType.LIMIT: '限价'>, direction=<Direction.SHORT: '空'>, offset=<Offset.CLOSE: '平'>, price=-120.0, volume=2.0, traded=0, status=<Status.SUBMITTING: '提交中'>, datetime=None, reference='CtaStrategy_CF307309_ren_02'),)

20230417_09:49:28.957018:('trade触发,trading值:', True)
20230417_09:49:28.957018:(TradeData(gateway_name='ROHON', extra=None, symbol='CF309', exchange=<Exchange.CZCE: 'CZCE'>, orderid='1681689782_151_4', tradeid=' 3182', direction=<Direction.SHORT: '空'>, offset=<Offset.OPEN: '开'>, price=15080.0, volume=2, datetime=datetime.datetime(2023, 4, 17, 9, 49, 29, tzinfo=zoneinfo.ZoneInfo(key='Asia/Shanghai'))),)
20230417_09:49:28.957018:('trade触发,trading值:', True)
20230417_09:49:28.957018:(TradeData(gateway_name='ROHON', extra=None, symbol='CF307', exchange=<Exchange.CZCE: 'CZCE'>, orderid='1681689782_151_4', tradeid=' 3183', direction=<Direction.LONG: '多'>, offset=<Offset.OPEN: '开'>, price=14950.0, volume=1, datetime=datetime.datetime(2023, 4, 17, 9, 49, 29, tzinfo=zoneinfo.ZoneInfo(key='Asia/Shanghai'))),)

20230417_09:49:28.988440:('order触发,trading值:', True)
20230417_09:49:28.988440:(OrderData(gateway_name='ROHON', extra=None, symbol='SPD CF307&CF309', exchange=<Exchange.CZCE: 'CZCE'>, orderid='1681689782_151_49', type=<OrderType.LIMIT: '限价'>, direction=<Direction.SHORT: '空'>, offset=<Offset.CLOSE: '平'>, price=-120.0, volume=2, traded=0, status=<Status.REJECTED: '拒单'>, datetime=None, reference=''),)

20230417_09:49:28.988440:('平多委托失败,订单号:', '1681689782_151_49', ',数量:', 2, ',价格:', -120.0)

20230417_09:49:28.988440:('trade触发,trading值:', True)
20230417_09:49:28.988440:(TradeData(gateway_name='ROHON', extra=None, symbol='CF307', exchange=<Exchange.CZCE: 'CZCE'>, orderid='1681689782_151_4', tradeid=' 3184', direction=<Direction.LONG: '多'>, offset=<Offset.OPEN: '开'>, price=14950.0, volume=1, datetime=datetime.datetime(2023, 4, 17, 9, 49, 29, tzinfo=zoneinfo.ZoneInfo(key='Asia/Shanghai'))),)

是不是底层那边,需要等待trade数据,更新仓位才行?

order数据显示 已全部成交还不够?

在收到on_order回调的时候,根据order: OrderData读取到订单已经成交(判断依据:volume=2, traded=2, status=<Status.ALLTRADED: '全部成交'>)
我根据成交状态,发出一个平多订单,然后这个订单被拒了,
在错误信息那边提示:交易委托失败,代码:30,信息:多仓不足,无法平仓[投机][卖][平仓][SPD CF307&CF309][2][-120.000][1 < 2]
根据最后的错误信息[1 < 2],好像是说仓位只有1,不足2,所以下单失败.
请问我这个下单流程错了吗?

这种错误也不是每次都发生,有的也能成功.

在收到on_order回调的时候,根据order: OrderData读取到订单已经成交,记录入下:

20230417_09:49:28.957018:('order触发,trading值:', True)
20230417_09:49:28.957018:(OrderData(gateway_name='ROHON', extra=None, symbol='SPD CF307&CF309', exchange=<Exchange.CZCE: 'CZCE'>, orderid='1681689782_151_4', type=<OrderType.LIMIT: '限价'>, direction=<Direction.LONG: '多'>, offset=<Offset.OPEN: '开'>, price=-130.0, volume=2, traded=2, status=<Status.ALLTRADED: '全部成交'>, datetime=datetime.datetime(2023, 4, 17, 9, 3, tzinfo=zoneinfo.ZoneInfo(key='Asia/Shanghai')), reference=''),)

然后我根据全部成交状态,发出一个平多订单:

20230417_09:49:28.957018:('order触发,trading值:', True)
20230417_09:49:28.957018:(OrderData(gateway_name='ROHON', extra=None, symbol='SPD CF307&CF309', exchange=<Exchange.CZCE: 'CZCE'>, orderid='1681689782_151_49', type=<OrderType.LIMIT: '限价'>, direction=<Direction.SHORT: '空'>, offset=<Offset.CLOSE: '平'>, price=-120.0, volume=2.0, traded=0, status=<Status.SUBMITTING: '提交中'>, datetime=None, reference='CtaStrategy_CF307309_ren_02'),)
20230417_09:49:28.957018:('trade触发,trading值:', True)
20230417_09:49:28.957018:(TradeData(gateway_name='ROHON', extra=None, symbol='CF309', exchange=<Exchange.CZCE: 'CZCE'>, orderid='1681689782_151_4', tradeid=' 3182', direction=<Direction.SHORT: '空'>, offset=<Offset.OPEN: '开'>, price=15080.0, volume=2, datetime=datetime.datetime(2023, 4, 17, 9, 49, 29, tzinfo=zoneinfo.ZoneInfo(key='Asia/Shanghai'))),)
20230417_09:49:28.957018:('trade触发,trading值:', True)
20230417_09:49:28.957018:(TradeData(gateway_name='ROHON', extra=None, symbol='CF307', exchange=<Exchange.CZCE: 'CZCE'>, orderid='1681689782_151_4', tradeid=' 3183', direction=<Direction.LONG: '多'>, offset=<Offset.OPEN: '开'>, price=14950.0, volume=1, datetime=datetime.datetime(2023, 4, 17, 9, 49, 29, tzinfo=zoneinfo.ZoneInfo(key='Asia/Shanghai'))),)

然后这个订单被拒了:
20230417_09:49:28.988440:('order触发,trading值:', True)
20230417_09:49:28.988440:(OrderData(gateway_name='ROHON', extra=None, symbol='SPD CF307&CF309', exchange=<Exchange.CZCE: 'CZCE'>, orderid='1681689782_151_49', type=<OrderType.LIMIT: '限价'>, direction=<Direction.SHORT: '空'>, offset=<Offset.CLOSE: '平'>, price=-120.0, volume=2, traded=0, status=<Status.REJECTED: '拒单'>, datetime=None, reference=''),)
20230417_09:49:28.988440:('平多委托失败,订单号:', '1681689782_151_49', ',数量:', 2, ',价格:', -120.0)

在错误信息那边提示:交易委托失败,代码:30,信息:多仓不足,无法平仓[投机][卖][平仓][SPD CF307&CF309][2][-120.000][1 < 2]

请问这是咋回事?根据最后的错误信息[1 < 2],也就是仓位只有1,不足2,所以下单失败.

可是on_order过来的数据是显示已全部成交了呀?

wp61413 wrote:

使用说明的文档上写:
get_position
入参:vt_positionid: str, use_df: bool = False
出参:PositionData
根据vt_positionid来查询持仓情况,返回对象包含接口名称、交易所、合约代码、数量、冻结数量等。
position = engine.get_position(vt_positionid='rb2202.SHFE.多')

这是查询某个交易所某个合约某个方向的持仓情况的语句,如果想查询所有的持仓,该如何写呢?

请问你说的这个说明文档,是在哪里看的?我没找到过类似的这种文档?

我已经实现在界面模式下的CTA交易模块,在策略中实现了定时器触发,并通过修改engine.py和template.py,在20点40分实现了自动重连行情服务器和交易服务器.

从而实现了,15点收盘后,不关机,晚上夜盘自动开始进行新一天的交易.

但是现在有个问题,在交易窗口,比如"行情","活动","委托"窗口那边,还会停留前一交易日的委托信息,没有自动清屏.

如何代码实现在收盘后清屏交易界面的"活动""委托"中的订单?

要去修改调用哪个文件的哪个函数?

MTF wrote:

融航接口,需要装下vcredist x64 2010和2015-2022

这2个哪里下载安装?奇怪的是,我之前几台电脑也没有特地装你说的这2个,怎么之前都没这个问题,安装好VerghNa直接就可以用了?

刚装好的WIN10系统,刚装好的VNPY,启动融航模块显示如下错误:

2023-04-06 19:16:36 --------------------------------------------------
2023-04-06 19:16:36 VeighNa Trader进程启动
2023-04-06 19:16:37 Traceback (most recent call last):
File "C:\veighna_studio\lib\runpy.py", line 196, in _run_module_as_main
return _run_code(code, main_globals, None,
File "C:\veighna_studio\lib\runpy.py", line 86, in _run_code
2023-04-06 19:16:37 exec(code, run_globals)
File "build\bdist.win-amd64\egg\veighna_station\trader.py", line 39, in <module>
File "build\bdist.win-amd64\egg\veighna_station\trader.py", line 24, in run_trader
AttributeError: module 'vnpy_rohon' has no attribute 'RohonGateway'
2023-04-06 19:16:48 VeighNa Trader进程终止

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

沪公网安备 31011502017034号

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