4.21K 浏览
0

实盘下单的时候下单函数执行开多仓1手,结果实际开多仓了2手.用同样的程序对同样的时段进行回测,回测结果正常,只开了1手多仓,请问这是怎么回事?实盘和回测的结果如图

lookis 已回答的问题 2020年8月8日
2

这要很大情况下要看你的代码逻辑,set_target_volume的实现方式是先读取本地的仓位,然后计算出要下单的差值数量,再使用 insert_order的方式去下单。所以如果你在判断需要下单的代码如果调用过快,就有可能下单之后,还没成交或者成交之后还没有把仓位更新信息发送到本地导致下一次使用set_target_volume的时候判断错误。

比方说之前我就遇到过下单逻辑是放在 quote 更新的回调里的,因为quote数据更新很快,可能一秒种有好几次的调用,但我下单成交的仓位还没有更新导致重复下单。

我的解决办法是自己重新封装了一下 set_target_volume 然后加了一把RLock,一下单就会锁住,然后在 position 的回调里做相关判断之后才把锁释放了。

lookis 发表新评论 2020年8月10日

我在使用set_target_volume的时候使用了一个flag变量,只要一执行下单就改变flag,保证这一步下单只完成一次。我上一次下单和重复下单的时间间隔了20分钟的样子,这一步下单的时候持仓量应该是正确的持仓量呀。会不会是因为网络传输的原因把下单指令传输了两次?

你控制台输出不是增仓了么,第一次间隔20分钟是你的第一个仓位吧,重复的应该是你的增仓信号

1

而回测的撮合引擎因为在数据更新的回调里的时序都能得到保证,所以不存在这样的问题

xiaosun666 发表新评论 2020年9月1日

Hi lookis,我现在也遇到了你讲的那个问题(update quote的时候),也希望加一个lock 等position完全再判断。可是自己代码能力太弱,我看那个set_target_volume只有一行pos_chan.sendnowait(int(volume)),不知道该怎么加锁,如果可以的话,能不能教大家一下示例代码,我相信很多人会非常感激的。