只对未成交的平仓单进行撤单

这两天发了个帖子请教如何对未成交报单在指定时间内进行撤单,这个问题已经解决,但是我现在想只对未成交的平仓单进行撤单, 用以下写法:if(A_OpenOrderEntryOrExit(orderIDs[j])==Enum_Exit or A_OpenOrderEntryOrExit(orderIDs[j])==Enum_ExitToday),为什么不对?感谢!if(time>pctime1 and time<pctime2) { PlotBool("pc_jing",pc_jing); Array<Integer> orderIDs; Bool ret=A_GetUnFillOrderIDs(RelativeSymbol,orderIDs,""); Integer j=0; For j = 0 To GetArraySize(orderIDs) - 1 { Print("orderid:" + Text(orderIDs[j])+",A_GetOrder:"); Commentary("orderid:" + Text(orderIDs[j])+",A_GetOrder:"); Order value; ret=A_getorder(orderids[j],value); Print(IIFString(ret, "True", "False") + "," + Text(value)); if(A_OpenOrderEntryOrExit(orderIDs[j])==Enum_Exit or A_OpenOrderEntryOrExit(orderIDs[j])==Enum_ExitToday) { A_DeleteOrderEx(orderids[j]); } } }

A_OpenOrderEntryOrExit这类函数需要锁定品种的你按照我的方式试试

A_GetOrder(ids[ii], myOrder); IF (myOrder.side == Enum_Sell && myOrder.combOffset > 2) A_DeleteOrderEx(ids[ii]);

回复:这是多单卖平空单同理

回复:A函数类别尽量一致枚举尽量穷尽

回复:既然已经get到Order value又去A一遍A_OpenOrderEntryOrExit是不是多此一举用法又不对还是尽量熟悉并逻辑一致处理问题

看上去没什么问题

回复:昨天的测试找到了更简单的测试方法这个函数是针对委托单索引的(从0开始排序,0表示最新)我事先挂一个单,直接填0查就是出来了说明不是报单索引,这个函数当下意义不大

回复:

回复:按昨天wgy_king老师提供的方法,重新修改了代码,现在可以获取未成交订单信息也可以撤单,现在留下最后一步没法解决,想让老师帮忙解决下。就是撤单后按最新的价格进行重报这一步不知道如何处理。疑问如下:1、我的需求是想在指定时间内(比如下午14:55至14:59之间)对当天未成交的平仓单进行撤单并按最新价重新报单。下述代码的写法是在撤单指令后马上就写重报指令,实际测试出来的结果是撤单是可以,但重报的指令没有执行。所以,上述需求应该如何改?2、我不想在onorder里用撤单完成这个事件去触发重新报单,因为在14:55至14:59之前的盘中时间一样有撤单事件,如果在onorder域里写重报那么系统会对所有撤单都进行重报,而我并不想这样。因为我是日内交易,我就是在收盘前想把未成交的平仓单进行重报了结,避免隔夜头寸,用监控器平仓太麻烦会忘记。3、ONBAR里正常的报单指令我想用图表函数而不是A函数,因为我有用监控器监控帐户持仓和图表信号持仓是否一致的习惯,纯粹用A函数报单就不能用监控器不放心。我只想收盘前对未成交平仓单进行撤单重报时用A函数,虽然这样图表函数和A函数混用,但只是收盘前作这一简单的处理对实际交易应该影响不大。以上,希望能获得帮助,感谢!以下是用双均线策略作为逻辑的测试代码,如下:Params Numeric FastLength(5);// 短期指数平均线参数 Numeric SlowLength(20);// 长期指数平均线参数 Numeric pctime1(0.1455); Numeric pctime2(0.1459); Numeric pre_pctime(0.1459); Vars Series<Numeric> AvgValue1; Series<Numeric> AvgValue2; bool pc_jing; Series<Numeric> sellexit_canceled_num; Series<Numeric> buyexit_canceled_num; Events OnInit() { AddDataFlag(Enum_Data_RolloverBackWard()); //设置后复权 AddDataFlag(Enum_Data_RolloverRealPrice()); //设置映射真实价格 AddDataFlag(Enum_Data_AutoSwapPosition()); //设置自动换仓 } OnReady() { SetBackBarMaxCount(1+Max(FastLength,SlowLength)); } OnBar(ArrayRef<Integer> indexs) { if(time==pre_pctime) { sellexit_canceled_num=0; buyexit_canceled_num=0; } if(time==pctime1) { PlotBool("pc_jing",pc_jing); Integer j=0; Integer h=0; Array<Integer> orderIDs; Bool ret=A_GetUnFillOrderIDs(RelativeSymbol,orderIDs,""); For j = 0 To GetArraySize(orderIDs) - 1 { Order value; ret=A_getorder(orderids[j],value); if(value.combOffset==Enum_Exit or value.combOffset==Enum_ExitToday and value.side==Enum_Sell and sellexit_canceled_num<>1) { bool ret1 =A_DeleteOrderEx(orderids[j]); sellexit_canceled_num=1; bool ret= A_SendOrder(Enum_Sell, Enum_Exit, 0, open); } if(value.combOffset==Enum_Exit or value.combOffset==Enum_ExitToday and value.side==Enum_buy and buyexit_canceled_num<>1) { bool ret1= A_DeleteOrderEx(orderids[j]); buyexit_canceled_num=1; bool ret= A_SendOrder(Enum_Sell, Enum_Exit, 0, open); } } } AvgValue1 = AverageFC(Close,FastLength); AvgValue2 = AverageFC(Close,SlowLength); PlotNumeric("MA1",AvgValue1); PlotNumeric("MA2",AvgValue2); If(MarketPosition <>1 && AvgValue1[1] > AvgValue2[1]) { Buy(0,Open); } If(MarketPosition <>-1 && AvgValue1[1] < AvgValue2[1]) { Sell(0,Open+20*MinMove * PriceScale*rollover); } }

回复:onorder里也能写条件的14:55至14:59那么就是if ( currenttime > 0.1455 and currenttime < 0.1459) 筛选出正确的条件

回复:撤单重报代码有问题前几个帖子我已经明确告诉你了你没有思考?你先想想不会我再说

回复:我先跟你说很简单就能实现

回复:谢谢老师,之前提醒过,有思考,不过当时急着解决其它问题就把这个问题先放下了。在ONORDER里进行重报,目前应该是解决了。晚上再测试一下

回复:别onorder域再折腾了啊把事情搞复杂了

回复:numeric sleep = SystemDateTime;while(true){ A_getOrder(orderids[j], value); if(value.status == Enum_Canceled) break; if(value.status == Enum_Filled) break; if(DateTimeDiffV2(Sleep, SystemDateTime) >= 1000) break;}然后发单

回复:还有你这个场景放在onbaropen域多好刚好每一个分钟做一次