demo_EventArbitrage例子中我发现一个问题
demo_EventArbitrage例子中我发现一个问题,再次跟老师讨论下。是我搞错了,还是真有不妥的地方//委托更新事件函数,参数ord表示更新的委托结构体 OnOrder(OrderRef ord) { LogFile(\"OnOrder:\"+ ord.symbol + \",\" + Text(ord.orderId)); //1.如果是左腿单,有成交,则锁定对手合约下单 if(ord.symbol==data0.Symbol()) { If(!MapContain(leftOrderMap, ord.orderId))//如果这个orderid不在leftOrderMap中,说明没记录,那就直接返回 { //防止收到重复的委托 Return; } leftOrderMap[ord.orderId]=ord;//如果order订单状态更新了,则重新更新leftOrderMap里面对应的订单信息 If(!isOrdersFinished(leftOrderMap))// 如果所有挂单还没都成交,则直接返回,等到所有单子都成交了,再往下执行, { Return; } fillVolume = sumFillVolume(leftOrderMap);//计算所有左腿单的总下单量 If(fillVolume <= 0) { //左腿没有成交量 finishArbitrage(); Return; } size=fillVolume-sumOrderVolume(rightOrderMap);//计算左腿总下单量-右腿总下单量,看看右腿还差多少手 if(size>0) { sendRightOrder(size);//再补多少手右腿的单子 } Return; } //2.如果是右腿单,则判断否完成套利,如果完成清理缓存,重新挂单 if(ord.symbol==data1.Symbol()) { If(!MapContain(rightOrderMap, ord.orderId)) { //防止收到重复的委托 Return; } rightOrderMap[ord.orderId]=ord; If(!isOrdersFinished(rightOrderMap)) //下面红色代码部分应该移动到这里 { Return; } //2.1判断右腿委托是否满足,如果不满足,则继续委托 size=sumFillVolume(leftOrderMap)-sumOrderVolume(rightOrderMap); if(size>0) { sendRightOrder(size); Return; } If(!isOrdersFinished(rightOrderMap)) //这个红色字体的代码应该放到上面蓝色的地方 { Return; } //2.2判断左右腿委托是否完成,如果都完成,则清空缓存,重新挂单 size=sumFillVolume(leftOrderMap)-sumFillVolume(rightOrderMap); if(size==0) { finishArbitrage(); } } }总得来说:就是把 2.如果是右腿单,则判断否完成套利 里面的 If(!isOrdersFinished(rightOrderMap))这个代码移动到上面去,要先确保rightOrderMap里面所有单子已经完结(要么成交,要么被删)。 再计算左腿总单量和右腿总单量的差,进行判断如果为0就套利完成,如果还有差额就补挂右腿单。否则的话,右腿开单挂的单子都没有完结呢,你就开始判断差额了。那这个差额不用算了肯定等于左腿单了。也就是肯定等于0的。基本等于没用这个功能。