PRING输出有误

//------------------------------------------------------------------------ // 简称: ZS18_1 // 名称: ZS33_1 // 类别: 公式应用 // 类型: 用户应用 // 输出: Void //------------------------------------------------------------------------ Params Numeric Lots(1);// 交易手数 Vars Series<Numeric> BAR0(0); // BAR索引 Series<Numeric> BarSell(0); // 开仓BAR Global Array<Integer> Sid;//开仓单号 Global Array<Integer> Eid;//平仓单号 Global Numeric HaveS(0); //空单持仓 Global Numeric MinDiff; //最小变动价/一跳价 Events OnInit()//策略执行前的初始化事件,只运行一次。/可以订阅数据,数据准备等操作。 { SubscribeTick(Symbol);//订阅TICK行情 PrintClear; } OnReady() { MinDiff=PriceScale*MinMove;//最小变动价/一跳价 //PrintClear; } OnOrder(OrderRef Ord)//委托更新事件 { PRINT("====ONORDER=====" ); PRINT("ORDER编号" +TEXT(Ord.orderId)); PRINT("ORDER状态" +TEXT(Ord.status)); PRINT("ORDER方向" +TEXT(Ord.side)); PRINT("ORDER编号Sid[0]=" +TEXT(A_OrderContractNo(Sid[0]))); PRINT("ORDER编号Eid[0]=" +TEXT(A_OrderContractNo(Eid[0]))); }//OnOrder OnBar(ArrayRef<Integer> indexs) { BAR0=CurrentBar(); IF (BarStatus==2) { If(HaveS==0 ) { BOOL RET=A_SendOrderEx(Enum_Sell,Enum_Entry,Lots,Q_Last-MinDiff,Sid );//开空(市价-点) IF (RET=TRUE) { BarSell=Bar0; HaveS==1; Print("开空单索引=" +TEXT(Sid[0])+"开空价="+TEXT(Q_Last-MinDiff)); Print("BarSell=" +TEXT(BarSell)+"HaveS=" +TEXT(HaveS)); } } If(HaveS==1 And BAR0>BarSell ) { BOOL RET=A_SendOrderEx(Enum_BUY,Enum_Exit,Lots,Q_Last+MinDiff,Eid);//平空(市价+点) IF (RET=TRUE) { Print("开空单索引=" +TEXT(Eid[0])+"平空单报价="+TEXT(Q_Last+MinDiff)); } } }// IF (BarSelltatus==2) }代码如上,在CF509的1分钟运行结果如下:Print("BarSell=" +TEXT(BarSell)+"HaveS=" +TEXT(HaveS));//HaveS应该是1,为什么输出为0PRINT("ORDER编号Eid[0]=" +TEXT(A_OrderContractNo(Eid[0])));//明明没有平仓,为何输出单号?而且与SID的单号一样?请老师费心看一下,不胜感激!!!

我觉得你最大的问题是框架设计路走歪了你想设计订单管理模型,但是之前没设计过这种程度的自动化模型,业务逻辑,函数使用,数据结构,都不算精通,所以没办法自发得设计出这一套自动化框架。你可以看看这个a函数模型开发实战演练的课 https://space.bilibili.com/31053817/lists/2531821?type=series

开平仓前cleararray一下两个全局数组

回复:1、ArrayClear(sid)之后再开仓ArrayClear(eid)之后再平仓2、一般来说,不需要取报单序号,他只是发个单子出去,除非你有非常必要的逻辑3、订单后续控制逻辑,大多都在onOrder域处理就足够了

回复:报单序号这玩意处理清楚需要很多逻辑真的放弃吧你说说你到底什么需求告诉你方案

回复:连老刘都被绕疯了😂

回复:十分感谢您的无私帮助!!!!!!!!我的需求是:发单后5秒后不成交,撤单并按市价重新追单,还要控制不要重复发出开(追)单,请老师直接给我一段代码我来测试,万分感激!!!!!!!!

回复:撤单视频教学 https://video.tbquant.net/video?id=video292

回复:你这个需求瞎折腾报单号干啥?给你简单点的方案:Var域Global Integer DeleteTimer(-1);OnBar域发单后加一行DeleteTimer = CreateTimer(5 * 1000, 0, 1);ontimer域 If( id == DeleteTimer ) { Array<Integer> ids; Integer ii; Order myOrder; Bool isSleep(False); Numeric temp_Sleep; A_GetUnFillOrderIDs(Symbol, ids); For ii = 0 to GetArraySize(ids) - 1 { A_GetOrder(ids[ii], myOrder); IF (myOrder.side == Enum_Sell && myOrder.combOffset == Enum_Entry) { A_DeleteOrderEx(ids[ii]); isSleep = True; } } If (isSleep) { For ii = 0 to GetArraySize(ids) - 1 { temp_Sleep = SystemDateTime; while(true) { A_GetOrder(ids[ii], myOrder); if(myOrder.status == Enum_Canceled) { A_SendOrder(Enum_Sell, Enum_Entry, myOrder.volume - myOrder.fillVolume, Q_LowerLimit); break; } if(myOrder.status == Enum_Filled) break; if(DateTimeDiffV2(temp_Sleep, SystemDateTime) >= 1000) break; } } } }

回复:等你熟练了按照逻辑把代码移植到 Ontimer域 + OnOrder域 处理

回复:如果你每天开仓一次这个代码足够了如果多次开仓TimeDiff(myOrder.localDateTime, SystemDateTime) >= 5//用这个校验 //break换成Continue总体就这个意思消化一下

回复:谢谢!!!,这个视频已看过两次,再看一次复习下

回复:谢谢!!!本来不想学定时器的(时间加减一样可以实现的吧?),相信设计者,定时器应该更好(至少分域计算时逻辑更清晰),开始学习定时器。

我确实是有点莫名其妙,为什么要用A_OrderContractNo因为你的eid[0]是空值,所以变成默认取最后提交的委托单数据,那不就是开仓单的委托单号吗?这不是都对的吗?这已经是给你第三个截图案例了你前面两个都看了没啊?

回复:感谢老师!!!!!给您添麻烦了我也不知道,EID是0时它会取最后1个委托单(而且还正好是SID的)的索引啊。在你看来我提了个无脑的问题,在我看来就是过不去的坎(因为不合基本逻辑啊)。我在教学视频里看过:开单、止盈单、止损单,分别建立了数组存放ID,我就学过来了。回头看,问题出在我对A_OrderContractNo理解不透,这个函数如何根据ID读取相应的订单号?(特别是存在两个或更多的ID数组时)

前面的帖子也回复你了,这个函数和驱动结构体参数都没问题

回复:我没说结构体有问题,请老师按我的反馈测试一下,看我提的问题是否属实?如有语法错误,请指正!!!

==?

回复:谢谢!!!还是不能太编译

朋友Ord.orderId和ContractNo不是一个东西sendorderex里获取到的orderid 跟onorder驱动order参数的order.orderid才是一个东西

回复:麻烦老师再看一下,现在的情况 是PRINT("ORDER编号" +TEXT(Ord.orderId));==PRINT("ORDER编号Sid[0]=" +TEXT(A_OrderContractNo(Sid[0])));//开空单号,两个一样 PRINT("ORDER编号Eid[0]=" +TEXT(A_OrderContractNo(Eid[0])));//平空单号也和上面一样我的取数过程没有问题,但是取出的结果有问题,SID和EID怎么会取出两个一样的单号

回复:我去一个星期了还在折腾

回复:老刘搞错了我跟你说的你不是已经搞成了吗?

回复:?我看错了?可是a_sendorderex里的orderid ,和onorder驱动的order结构体里的order.orderid,本来就是一个东西啊

回复:开平你分两个全局数组啊还有一个不太建议你用这种方式你为什么一定要取订单号到底什么场景需要这么细致

回复:你被绕进去了他说的不是这个事

回复:我太难了

回复:🤝

回复:哈哈哈哈哈哈哈又被绕了吗那就是上班时间太长了 没休息好 该放假