//------------------------------------------------------------------------
// 简称: 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的单号一样?
请老师费心看一下,不胜感激!!!
我觉得你最大的问题是框架设计路走歪了
你想设计订单管理模型,但是之前没设计过这种程度的自动化模型,业务逻辑,函数使用,数据结构,都不算精通,所以没办法自发得设计出这一套自动化框架。
你可以看看这个a函数模型开发实战演练的课
https://space.bilibili.com/31053817/lists/2531821?type=series
开平仓前
cleararray一下两个全局数组
1、ArrayClear(sid)之后再开仓
ArrayClear(eid)之后再平仓
2、一般来说,不需要取报单序号,他只是发个单子出去,除非你有非常必要的逻辑
3、订单后续控制逻辑,大多都在onOrder域处理就足够了
报单序号这玩意
处理清楚需要很多逻辑
真的
放弃吧
你说说你到底什么需求
告诉你方案
连老刘都被绕疯了
😂
十分感谢您的无私帮助!!!!!!!!
我的需求是:发单后5秒后不成交,撤单并按市价重新追单,还要控制不要重复发出开(追)单,请老师直接给我一段代码我来测试,万分感激!!!!!!!!
你这个需求
瞎折腾报单号干啥?
给你简单点的方案:
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
总体就这个意思
消化一下
谢谢!!!,这个视频已看过两次,再看一次复习下
谢谢!!!本来不想学定时器的(时间加减一样可以实现的吧?),相信设计者,定时器应该更好(至少分域计算时逻辑更清晰),开始学习定时器。
我确实是有点莫名其妙,为什么要用
因为你的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,本来就是一个东西啊
开平你分两个全局数组啊
还有一个
不太建议你用这种方式
你为什么一定要取订单号
到底什么场景
需要这么细致
你被绕进去了
他说的不是这个事
我太难了
🤝
哈哈哈哈哈哈哈又被绕了吗
那就是上班时间太长了 没休息好 该放假