全部 智大领峰 TBQuant功能 TBL语言 TB开户 问答专区 高手圈 其他
【不能回复重发】OnBarClose每天上午9点开盘时,第一个周期每个Tick都执行问题
kenston 分享到
2024-06-25 09:48

已经连续两天出现,程序为15分钟周期,在每天早上9点开盘时,会自动执行OnBarClose,且在9:00:00~9:14:59会连续执行,每个tick执行一次。

请帮忙看看是怎么回事?

截图如下:

开盘即执行:

data-href=

每个tick都执行:

data-href=

一直执行到9点14分59秒结束:

data-href=



代码如下所示:

自定义函数:

//------------------------------------------------------------------------

// 简称: 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);

}

}

kyover

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

2024-06-25 10:29
您未登录,请先 登录注册 后发表评论
顶部