已经连续两天出现,程序为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);
}
}
问题定位到了。
你的这个timppoint数组有问题
最后一个值是0.0229,比如tb,23点就结束交易了,那么这个0.0229就会归结到第二天早上九点开盘去执行
建议你看一下帮助中心的案例,可以通过getsessionendtime来获取每个品种各自的小节结束时间,然后再取收盘执行时间。用你现在写死的方法,会碰到时间点和合约对不上的问题,导致你现在的问题。
部分品种没有2点的,多了一个没用的时间
按照你贴出来的代码逻辑,我觉得没什么问题,不应该出这个问题。
我先要确认一下这个情况可复现,然后才能分析哪里出问题。因为你说是九点开始,那么最早也要明天早上才能复现。为了防止复现不出你这个情况,建议你把单元的配置都描述清楚,包括几个图层,样本设置等等