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,为什么输出为0

PRINT("ORDER编号Eid[0]=" +TEXT(A_OrderContractNo(Eid[0])));//明明没有平仓,为何输出单号?而且与SID的单号一样?

请老师费心看一下,不胜感激!!!

输出
基础数据有误?
PRINT输出不全
tick的性质判断有误
持仓数据有误吧
输出格式
报警输出 True false
画线数据输出
这里的帮助文档是否有误
输出为何是0

我觉得你最大的问题是框架设计路走歪了

你想设计订单管理模型,但是之前没设计过这种程度的自动化模型,业务逻辑,函数使用,数据结构,都不算精通,所以没办法自发得设计出这一套自动化框架。

你可以看看这个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,本来就是一个东西啊

开平你分两个全局数组啊


还有一个

不太建议你用这种方式

你为什么一定要取订单号

到底什么场景

需要这么细致

你被绕进去了

他说的不是这个事

我太难了

🤝

哈哈哈哈哈哈哈又被绕了吗

那就是上班时间太长了 没休息好 该放假