实盘行情由TICK驱动运行,速度很快,我在ONORDER中用命令作PRINT输出,感觉输出内容不全,是否有的输出内容会被跳过?
PRINT本来就是用来测试策略的,如果输出不全,我就无法验证策略逻辑,请老师们指导!!!
什么内容不全说明一下,截图,代码都可以
不可能输出不全
没输出,就是没执行
写文件
//------------------------------------------------------------------------
// 简称: ZS33
// 名称: 报单&撤单
// 类别: 公式应用
// 类型: 用户应用
// 输出: VSid
//------------------------------------------------------------------------
//------------------------------------------------------------------------
// 简称: Boll_B_A
// 名称: 布林强盗/多/A函数
// 类别: 公式应用
// 类型: 用户应用
// 输出: VSid
//------------------------------------------------------------------------
//------------------------------------------------------------------------
// 简称: Boll_S
// 名称: 布林强盗/空
// 类别: 公式应用
// 类型: 用户应用
// 输出: VSid
//------------------------------------------------------------------------
//------------------------------------------------------------------------
// 简称: ZS27_1
// 名称: 布林强盗/空
// 类别: 公式应用
// 类型: 用户应用
// 输出: VSid
//------------------------------------------------------------------------
//------------------------------------------------------------------------
// 简称: ZS27
// 名称: 布林强盗/多
// 类别: 公式应用
// 类型: 用户应用
// 输出: VSid
//------------------------------------------------------------------------
//------------------------------------------------------------------------
// 简称: BollingerBandit_L
// 名称: 布林强盗_多
// 类别: 公式应用
// 类型: 内建应用
// 输出:
//------------------------------------------------------------------------
/*
策略说明:
基于布林通道的突破系统
系统要素:
1、基于收盘价计算而来的布林通道
2、基于收盘价计算而来的进场过滤器
3、自适应出场均线
入场条件:
1、满足过滤条件,并且价格上破布林通道上轨,开多单
2、满足过滤条件,并且价格下破布林通道下轨,开空单
出场条件:
1、持有多单时,自适应出场均线低于布林通道上轨,并且价格下破自适应出场均线,平多单
2、持有空单时,自适应出场均线高于布林通道下轨,并且价格上破自适应出场均线,平空单
注 意:
此公式仅做多
*/
/*返回TRUE,表示是成功执行了这个撤单命令,并不是指撤单成功。
成功执行撤单命令和撤单成功是两回事
因为你如果填错了订单号,导致找不到这个订单,那就是执行失败了,这叫没有成功执行撤单命令。
撤单成功是指成功执行撤单命令后,交易所收到撤单命令,然后把委托单撤销,并且回报给客户端。*/
Params
Numeric Lots(1);// 交易手数
Vars
Series<Numeric> BAR0(0); // BAR索引
Series<Numeric> BarS(0); // 开仓BAR
Series<Numeric> BarP(0); // 平仓BAR
Series<Numeric> TickSell(0); // 开仓Tick
Series<Numeric> TickP(0); // 平仓Tick
//Series<Numeric> SellJs(0); // 发出开空单计数
//Series<Numeric> PingJs(0); // 发出平空单计数
Series<Numeric> StopPrice;
//订单变量
Global Array<Integer> Sid;//开仓单号
Global Array<Integer> Pid;//平仓单号
Global Numeric SellJs(0); // 发出开空单计数
Global Numeric PingJs(0); // 发出平空单计数
Global Numeric HaveS(0);//空单持仓(Position是系统关键字)
Global Numeric CancelS(0);//撤回开空单计数
Global Numeric CancelP(0);//撤回平仓单计数
Global Numeric MinDiff;////最小变动价/一跳价
Global Numeric PPP;//基准价
Global Numeric TickSn;//Tick索引
Global Numeric OrderStatuS;//开空单状态
Global Numeric OrderStatuP;//平空单状态
Events
OnInit()//策略执行前的初始化事件,只运行一次。/可以订阅数据,数据准备等操作。
{
//SubscribeBar(Data0.Symbol,"Tick",Data0.BeginDateTime);//图层1
//CreateTimer(10000);
//data[0].hide;//隐藏图层
HaveS=0;
//PPP=0;
SubscribeTick(Symbol);
//SubscribeTick(RelativeSymbol);//返回主力合约,用于888或000
OrderStatuS=5;
OrderStatuP=5;
}
OnReady()
{
MinDiff=PriceScale*MinMove;//最小变动价/一跳价
}
OnOrder(OrderRef Ord)//委托更新事件
{
//PRINT("Ord" +TEXT(Ord.status));
//OrderStatuS
IF (Ord.status==Enum_Filled AND Ord.ORDERID==Sid[0])//开空单已成交
{
SellJs=0; // 发出开空单计数
HaveS=1;
OrderStatuS=5;
Print("开空单已成交,TickSn("+TEXT(TickSn)+")");
}
IF (Ord.status==Enum_Declared AND Ord.ORDERID==Sid[0])//开空单已申报(未成交)
{
OrderStatuS=2;
Print("开空单未成交,TickSn("+TEXT(TickSn)+")");
}
IF (Ord.status==Enum_Canceled AND Ord.ORDERID==Sid[0])//开空单(已撤单)
{
OrderStatuS=6;
Print("开空单已撤回,TickSn("+TEXT(TickSn)+")");
}
//OrderStatuP
IF (Ord.status==Enum_Filled AND Ord.ORDERID==Pid[0])//平空单已成交
{
PingJs=0;
HaveS=0;
OrderStatuP=5;
Print("平空单已成交,TickSn("+TEXT(TickSn)+")");
}
IF (Ord.status==Enum_Declared AND Ord.ORDERID==Pid[0])//平仓单已申报(未成交)
{
OrderStatuP=2;
Print("平空单未成交,TickSn("+TEXT(TickSn)+")");
}
IF (Ord.status==Enum_Canceled AND Ord.ORDERID==Pid[0])//平仓单(已撤单)
{
OrderStatuP=6;
Print("平空单已撤回,TickSn("+TEXT(TickSn)+")");
}
}//OnOrder
OnBarOpen(ArrayRef<Integer> indexs)
{
TickSn=0;
}
OnBar(ArrayRef<Integer> indexs)
{
IF (BarStatus==2)
{
If(HaveS==0 AND OrderStatuS==5 And OPEN<=C[1]) //开空
{
IF (A_SendOrderEx(Enum_Sell,Enum_Entry,Lots,Open+MinDiff*2,Sid ));
{
//HaveS=1;
BarS=Bar0;
TickSell=TickSn;
StopPrice=H[1];
SellJs=SellJs+1;
Print("首开空单编号="+TEXT(Sid[0])+"/BarS="+TEXT(BarS)+"/TickS="+TEXT(TickSell));
Print("/开空次数="+TEXT(SellJs)+"/持空仓量="+TEXT(HaveS));
}
}
/*IF (OrderStatuS==5)//开空单已成交
SellJs=0; // 发出开空单计数*/
IF (OrderStatuS==2 AND (BAR0-BARS)*120+TickSn-TickSell>10)//撤回开空单
{
A_DeleteOrder(Sid[0]);
Print("撤回开空单,TickSn("+TEXT(TickSn)+")");
}
IF (OrderStatuS==6 AND (BAR0-BARS)*120+TickSn-TickSell>11)//重发开空单
{
IF (A_SendOrderEx(Enum_Sell,Enum_Entry,Lots,Q_Last,Sid));//重发开空单(买1价)
{
Print("重开空单价="+TEXT(Q_Last)+"/开空次数="+TEXT(SellJs));
BarS=Bar0;
TickSell=TickSn;
SellJs=SellJs+1;
Print("重开空单编号="+TEXT(Sid[0])+"/BarS="+TEXT(BarS)+"/TickS="+TEXT(TickSell));
}
}
// 出场
If(HaveS==1 AND OrderStatuP==5 And BAR0>BarS And H>=StopPrice)
{
IF (A_SendOrderEx(Enum_BUY,Enum_Exit,Lots,StopPrice-MinDiff*1,Pid))
{
//HaveS=0;
BarP=Bar0;
TickP=TickSn;
PingJs=PingJs+1;
Print("首平空单编号="+TEXT(Pid[0])+"/BarP="+TEXT(BarP)+"/TickP="+TEXT(TickP)+"HaveS="+TEXT(HaveS)+"/平空次数="+TEXT(PingJs));
}
}
/*IF (OrderStatuP==5)//开空单已成交
PingJs=0;*/
IF (OrderStatuP==2 And (BAR0-BARP)*120+TickSn-TickP>10)//撤回平空单
{
A_DeleteOrder(Pid[0]);
Print("撤回平空单,TickSn("+TEXT(TickSn)+")");
}
IF (OrderStatuP==6 AND (BAR0-BARP)*120+TickSn-TickP>11);//重发平空单
{
IF (A_SendOrderEx(Enum_BUY,Enum_EXIT,Lots,Q_Last,Pid));//重发平空单(卖1价)
{
Print("重平空单的价="+TEXT(Q_Last)+"/平空次数="+TEXT(PingJs));
BarP=Bar0;
TickP=TickSn;
PingJs=PingJs+1;
Print("重平空单编号="+TEXT(Pid[0])+"/BarP="+TEXT(BarP)+"/TickP="+TEXT(TickP));
}
}
TickSn=TickSn+1;
Print("Tick索引="+TEXT(TickSn));
}// IF (BarStatus==2)
}
//------------------------------------------------------------------------
// 编译版本 GS2014.10.25
// 版权所有 TradeBlazer Software 2003-2025
// 更改声明 TradeBlazer Software保留对TradeBlazer平
// 台每一版本的TradeBlazer公式修改和重写的权利
//------------------------------------------------------------------------
请帮我验证上传交易策略的逻辑,策略用途是测试订单流,策略要求是持仓不超过1手,但测试过程中频繁发出订单(开仓或平仓),请帮我找出逻辑BUG并修正,谢谢!!!
哥 把你当AI用了 哈哈哈哈哈哈哈哈哈
写一下估计十几分钟
改一下估计要半天
等老师给他看看吧😂
你给他看看
刚好训练一下😁
有纸笔
记一下规则
估计十几分钟能改好
麻烦两位老师了,我请DEPPSIK看过了,说了一堆不在重点,所以才斗胆请教老师,不用感激!!!
我改进了策略,已重新发贴,麻烦老师看新贴!!!