这两天发了个帖子请教如何对未成交报单在指定时间内进行撤单,这个问题已经解决,但是我现在想只对未成交的平仓单进行撤单, 用以下写法: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域多好
刚好每一个分钟做一次