//------------------------------------------------------------------------
// 简称: zs33_1
// 名称: 小改
// 类别: 公式应用
// 类型: 用户应用
// 测试目的:最多持仓1手;开空最多追单3次,平空不限次数直至成交。防止多次的无谓发单
//------------------------------------------------------------------------
Params
Numeric Lots(1);// 交易手数
Vars
Series<Numeric> BAR0(0); // BAR索引
Series<Numeric> BarSell(0); // 开仓BAR
Series<Numeric> BarE(0); // 平仓BAR
Series<Numeric> TickSell(0); // 开仓Tick
Series<Numeric> TickExit(0); // 平仓Tick
Series<Numeric> StopPrice;
//订单变量
Global Array<Integer> Sid;//开仓单号
Global Array<Integer> Eid;//平仓单号
Global Numeric SellJs(0); // 发出开空单计数
Global Numeric ExitJs(0); // 发出平空单计数
Global Numeric HaveS(0); //空单持仓(Position是系统关键字)
//Global Numeric CancelS(0);//撤回开空单计数
//Global Numeric CancelE(0);//撤回平仓单计数
Global Numeric MinDiff;////最小变动价/一跳价
//Global Numeric PPP;//基准价
Global Numeric Tick0;//Tick索引
Global Numeric OrderStatuS;//开空单状态
Global Numeric OrderStatuE;//平空单状态
Events
OnInit()//策略执行前的初始化事件,只运行一次。/可以订阅数据,数据准备等操作。
{
SubscribeTick(Symbol);//订阅TICK行情
HaveS=0;
SellJs=0;
ExitJs=0;
OrderStatuS=5;
OrderStatuE=5;
}
OnReady()
{
MinDiff=PriceScale*MinMove;//最小变动价/一跳价
}
OnOrder(OrderRef Ord)//委托更新事件
{
IF (Ord.status==Enum_Filled AND Ord.ORDERID==Sid[0])//开空单已成交
{
SellJs=0; // 发出开空单计数
HaveS=1;//持有空单数
OrderStatuS=5;//开空订单状态
Print("开空单已成交,Tick0("+TEXT(Tick0)+")");
}
IF (Ord.status==Enum_Declared AND Ord.ORDERID==Sid[0])//开空单已申报(未成交)
{
OrderStatuS=2;
Print("开空单未成交,Tick0("+TEXT(Tick0)+")");
}
IF (Ord.status==Enum_Canceled AND Ord.ORDERID==Sid[0])//开空单(已撤单)
{
OrderStatuS=6;
Print("开空单已撤回,Tick0("+TEXT(Tick0)+")");
}
//OrderStatuE
IF (Ord.status==Enum_Filled AND Ord.ORDERID==Eid[0])//平空单已成交
{
ExitJs=0;//发出平空单次数
HaveS=0;//持有空单数
OrderStatuE=5;//平空单状态
Print("平空单已成交,Tick0("+TEXT(Tick0)+")");
}
IF (Ord.status==Enum_Declared AND Ord.ORDERID==Eid[0])//平仓单已申报(未成交)
{
OrderStatuE=2;
Print("平空单未成交,Tick0("+TEXT(Tick0)+")");
}
IF (Ord.status==Enum_Canceled AND Ord.ORDERID==Eid[0])//平仓单(已撤单)
{
OrderStatuE=6;
Print("平空单已撤回,Tick0("+TEXT(Tick0)+")");
}
}//OnOrder
OnBarOpen(ArrayRef<Integer> indexs)
{
Tick0=0;
}
OnBar(ArrayRef<Integer> indexs)
{
IF (BarStatus==2)
{
//开空条件:持有空单数为0(隐含:平空已成)& 开空已成或已撤 &追单不超过3次&准入控制
If(HaveS==0 AND (OrderStatuS==5 OR OrderStatuS==6) AND SellJs<4 And OPEN<=C[1])
{
IF (A_SendOrderEx(Enum_Sell,Enum_Entry,Lots,Q_Last+MinDiff*SellJs,Sid ));//开空(市价+点)
{
BarSell=Bar0;
TickSell=Tick0;
StopPrice=H[1];
SellJs=SellJs+1;
Print("开空单编号="+TEXT(Sid[0])+"/BarSell="+TEXT(BarSell)+"/TickSell="+TEXT(TickSell));
Print("开空单次数="+TEXT(SellJs));
}
}
IF (OrderStatuS==2 AND (BAR0-BarSell)*120+Tick0-TickSell>10)//撤回开空单
{
A_DeleteOrder(Sid[0]);
Print("撤回开空单,Tick0("+TEXT(Tick0)+")");
}
// 平空条件:持有空单数为1(隐含:开空已成)& 平空已成或已撤 &准入控制
If(HaveS==1 AND (OrderStatuE==5 || OrderStatuE==6) And BAR0>BarSell And H>=StopPrice)
{
IF (A_SendOrderEx(Enum_BUY,Enum_Exit,Lots,Q_Last-MinDiff*ExitJs,Eid))
{
//HaveS=0;
BarE=Bar0;
TickExit=Tick0;
ExitJs=ExitJs+1;
Print("平空单编号="+TEXT(Eid[0])+"/BarE="+TEXT(BarE)+"/TickExit="+TEXT(TickExit)+"HaveS="+TEXT(HaveS));
Print("平空单次数="+TEXT(ExitJs));
}
}
IF (OrderStatuE==2 And (BAR0-BarE)*120+Tick0-TickExit>10)//撤回平空单
{
A_DeleteOrder(Eid[0]);
Print("撤回平空单,Tick0("+TEXT(Tick0)+")");
}
Tick0=Tick0+1;
Print("Tick索引="+TEXT(Tick0)+"持空仓量="+TEXT(HaveS));
}// IF (BarSelltatus==2)
}
以上是一个测试程序, 测试目的:最多持仓1手;开空最多追单3次,平空不限次数直至成交。防止多次的无谓发单
感觉ONORDER域没有执行,以下是我刚实盘运行的情况:ONORDER的PRINT内容无输出
请老师帮我看下,难道是我的逻辑本身有问题?不胜感激!!!
你要证明onorder没有触发
onorder
{
print("你好");
}
而不是先扔一堆东西进去
我感觉你逻辑是混乱的。
你的所有print,都是写在onorder域的if分支结构下,换句话说,如果要print显示内容,不仅要驱动onorder域,还得满足你至少一个分支条件,才有print输出。
你因为这个就断定是onorder域没有执行吗?是不是起码在onorder的主结构中写一个print看看到底是onorder没有执行还是没进if分支结构?
好的,我加一行测试onorder,麻烦看下我的逻辑问题(自我感觉很简单的逻辑,就是不知道哪里问题),不胜感激!!!
我加一行测试onorder,重新运行。
有成交单,但仍不显示测试行,感觉还是没有进onorder
你的脸为什么是黄的
要绿的才是进入了交易的
运行之后暂停策略,之后截图的
运行之后暂停策略,之后截图的
ONBAR域有输出成交时间的
ONBAR域有输出成交时间的
我试了 order域没有问题的
你把你if里的条件挨个打印一下bool看看
我试了两个 都是false
哦 我没开交易,开了就可以了,Onorder输出没有问题的,是你其他逻辑的问题
很棒,我还没来得及测试