【不能回复重发】OnBarClose每天上午9点开盘时,第一个周期每个Tick都执行问题

已经连续两天出现,程序为15分钟周期,在每天早上9点开盘时,会自动执行OnBarClose,且在9:00:00~9:14:59会连续执行,每个tick执行一次。请帮忙看看是怎么回事?截图如下:开盘即执行:每个tick都执行:一直执行到9点14分59秒结束:代码如下所示:自定义函数://------------------------------------------------------------------------// 简称: My_SetTriggerBarClose// 名称: 设置OnBarClose调用时间// 类别: 用户函数// 类型: 用户函数// 输出: 数值型// 说明:设置收盘前调用OnBarClose,默认按1小时时间设置//------------------------------------------------------------------------Params //此处添加参数 String strCycle(1h);Vars //此处添加变量 Array<Numeric> timppoint_15m([0.101459,0.112959,0.145959,0.225959, 0.022959]); //收盘前提前处理OnBarClose,15分钟周期 Array<Numeric> timppoint_1h([0.112959,0.145959,0.225959, 0.022959]); //收盘前提前处理OnBarClose,1小时周期Begin //此处添加代码正文 If(15m == strCycle Or 5m == strCycle) { SetTriggerBarClose(timppoint_15m); } Else If(1h == strCycle) { SetTriggerBarClose(timppoint_1h); } Return 0;End策略公式:Params //此处添加参数 Numeric nMALength(20); //平均线周期 Numeric nATRLength(20); //ATR周期 Numeric nATRUpperParameter(10); //ATR上限倍数参数,10代表1倍 Numeric nATRLowerParameter(10); //ATR下限倍数参数,10代表1倍Vars //此处添加变量 Series<Numeric> sMAValue; //平均线值 Series<Numeric> sAvgTR; //平均ATR String strCycle(15m); //收盘前提前处理OnBarClose,15分钟周期Defs //此处添加公式函数 Events //此处实现事件函数 //初始化事件函数,策略运行期间,首先运行且只有一次 OnInit() { My_SetTriggerBarClose(strCycle); } //Bar更新事件函数,参数indexs表示变化的数据源图层ID数组 OnBar(ArrayRef<Integer> indexs) { sMAValue = AverageFC(Close, nMALength); PlotNumeric(AvgMA, sMAValue); } //在新bar的第一次执行之前调用一次,参数为新bar的图层数组 OnBarOpen(ArrayRef<Integer> indexs) { Numeric nOpen = Open; Numeric nAvgTRValue = sAvgTR[1]; Numeric nMAValue = sMAValue[1]; //跳空判断 If(time == 0.0900 Or time == 0.1030 Or time == 0.1330 Or time == 0.2100) { Numeric nOpen = Open; Print(---------【OnBarOpen】-------nDate: + DateToString(date) + + TimeToString(time)); Print(Open: + Text(nOpen)); Print(nAvgTRValue: + Text(nAvgTRValue)); If(nATRUpperParameter < 0 Or nATRLowerParameter < 0) Return; //ATR上下轨 Numeric nUper = nMAValue + nAvgTRValue*(nATRUpperParameter/10); Numeric nLower = nMAValue - nAvgTRValue*(nATRLowerParameter/10); // PlotNumeric(ATR nUper, nUper); // PlotNumeric(ATR nLower, nLower); Print(Uper: + Text(nUper)); Print(MAValue: + Text(nMAValue)); Print(Lower: + Text(nLower)); Print(MarketPosition: + Text(MarketPosition)); If(1 == MarketPosition && nOpen <= nLower) //当前多仓,跳空 { Print(【OnBarOpen】nOpen <= nLower); Sell(1, nOpen); SellShort(1, nOpen); } Else If(-1 == MarketPosition && nOpen >= nUper) //当前空仓,跳空 { Print(【OnBarOpen】nOpen >= nUper); BuyToCover(1, nOpen); Buy(1, nOpen); } Else If(0 == MarketPosition) //当前无仓位 { If(nOpen < nLower) //空头建仓 SellShort(1, nOpen); Else If(nOpen > nUper) //多头建仓 Buy(1, nOpen); } } } //Bar结束时事件,在新Bar开始前 OnBarClose(ArrayRef<Integer> indexs) { Print(---------[OnBarClose]---------nDate: + DateToString(date) + + TimeToString(CurrentTime)); Numeric nClose = Close; //参数检查 If(nATRUpperParameter < 0 Or nATRLowerParameter < 0) Return; //指数平均ATR sAvgTR = XAverage(TrueRange, nATRLength); Numeric nAvgTRValue = sAvgTR; Commentary(AvgATR: + Text(nAvgTRValue)); Numeric nMAValue = sMAValue; Numeric nATRUpper = nMAValue + nAvgTRValue*(nATRUpperParameter/10); //ATR上限 Numeric nATRLower = nMAValue - nAvgTRValue*(nATRLowerParameter/10); //ATR下限 Commentary(nAvgTRValue: + Text(nAvgTRValue)); Commentary(nClose: + Text(nClose)); Commentary(ATRUpper: + Text(nATRUpper)); Commentary(ATRLower: + Text(nATRLower)); Commentary(nMAValue + Text(nMAValue)); PlotNumeric(ATR Lower, nATRLower); PlotNumeric(ATR Upper, nATRUpper); //开多,K线上穿均线和ATR上限,且当前无多仓。若有空单则先平 If(MarketPosition != 1 && nClose > nMAValue && nClose > nATRUpper) { Print(---------[OnBarClose] Buy---------); BuyToCover(1, nClose); //先平空单 Buy(1, nClose); } //开空,K线下穿均线和ATR下限,且当前无空仓。若有多单则先平 If(MarketPosition != -1 && nClose < nMAValue && nClose < nATRLower) { Print(---------[OnBarClose] Sell---------); Sell(1, nClose); //先平多单 SellShort(1, nClose); } }

另外一个贴好像回复过你了