vb中,我按照下面的顺序执行的时候,会出现重复下单:
do while 每2秒
1、获取当前的持仓:Order.HoldingInfoByCode2
2、根据当前持仓,判断是否需要开\平仓,如果需要开平仓:
(1)获取未成交委托笔数,order.OrderNum2
(2)获取未成交委托号,order.OrderInfo2
(3)根据未成交单委托号,全部撤单order.CancelOrder
(4)重新委托下单,order.buy(市价委托)
end
问题:
1、重复下单的原因,是否是成交回报>2秒?
2、如果1成立,市价委托,成交回报>2秒,粗粗感觉,同样的环境,比手工设置的止损单回报要慢。
3、请问,如何增加对委托回报或者成交回报的判断,来避免重复下单的问题?
我尝试做的工作如下:
4、尝试使用了SynchroByAccount 刷新委托信息,但是该函数有问题,无法显示“未成交委托”;舍弃;(见下图)
5、尝试使用OrderStatusEx2,但是如果SynchroByAccount无法使用的话,如何能保证OrderStatusEx2取到的是最新数据?
该问题比较急迫,烦请解答,非常谢谢!
1、可以看下交易日志里面下单到回报过来,这个时间差有多少
2、OrderStatusEx2这个没问题的,你可以通过判断Status 报单是否已提交
使用你的逻辑是没法精确判断上笔报单是否成交,加上你2秒的轮询出现重复下单是必然的。
并不是成交回报要2秒,而是你这2秒的轮询期间,那面正好有重合点是你报单回报没来得及回来的时刻这样你就会产生重复下单。
我们金字塔处理防止重复下单是采用得到order.buy的返回值的订单ID,这个ID在你下单后会马上产生,你保存这个订单号,遇到成交回报或者撤单回报等回报,与回报里的订单ID比较,成交或者撤单后再删除这个ID。这样下次再做下单时只要判断你保存的订单ID是否存在就可以了。
此外,VBA的开发工作是细致的工作,用户应该掌握最基本的调试手段,本地记录日志是最常用,这样你就可以自己去分析解决问题,而不是具足无措了
非常感谢耐心解答!
1、确实忘记打开记录日志了(现已打开);
2、我看到帮助文档里,order.buy下面写:当使用orderqueue时,返回值恒定为0,而要通过成交回报获得订单ID
目前使用了orderqueue,请问有什么方法能够快捷得到刚刚委托的订单ID?
orderinfo2可以获取未成交的id,假设有多笔未成交的时候,感觉根据orderinfo2的参数index来获取不一定准确。
烦请不辞辛苦,指点一二!
嗯,有道理,既然判断到逐笔的委托的状态,完全可以代替使用orderqueue了;
我再试一下,非产感谢哈!