全部 智大领峰 TBQuant功能 TBL语言 TB开户 问答专区 高手圈 其他
跨图层信号闪烁,帮忙看个代码
2024-01-10 09:37

昨天开的贴子好像沉了,重开帖,请教老师们一个信号闪烁问题。我这是一个截面策略,多品种,不同图层之间会有交互计算,在指定的时间点对加载的品种通过筛选做一次调仓交易,逻辑不复杂,回测信号没问题,实盘会有信号消失的情况。

具体的症状是:当一次调仓交易完成后,如果不重启策略单元那么监控器不会查出不匹配,但重启策略单元了马上可以查出不匹配。不匹配的情况是:要么帐户报单了,查看图表没有信号(可能事后消失了);要么图表有信号,帐户没报单。

以下是代码,代码不长,请老师帮忙看一下,是哪个环节出问题了,谢谢!代码中没有用CLOSE,用的是CLOSE[1],也没有用序列函数和全局变量作条件判断。


Params

  Bool IsRollover(true);//是否后复权

  Bool IsRolloverRealPrice(true);//是否映射真实价格

  Bool IsAutoSwapPosition(true);//是否自动换仓


  Numeric Fund(167000);//下单金额

  Numeric N(25);//回溯周期

  Numeric instNum(36);//品种数量 ,

  Numeric WeekdaySet(2);//选择星期几交易

  Numeric TimeSet(0.10);//选择哪个时间点交易

  Numeric FEN(1);//选择排名第一和排名最后的参数


Vars

  Array<Numeric> RR;//因子值

  Array<Numeric> RS;//保存因子值的变量

  //NumericArray atr;

  Numeric i;

  Numeric k;

  Numeric j;

  Array<Numeric> lots;//下单手数

 

  Array<Numeric> myclose;//把价格转变成复权后价格,方便手数计算

  Series<Numeric> RRup;//排名第一的分界点

  Series<Numeric> RRdown;//排名最后的分界点

  Integer status;

 


Events

//此处实现事件函数

//初始化事件函数,策略运行期间,首先运行且只有一次,应用在订阅数据等操作

OnInit()

{

Range[0:DataCount-1]

       {

If(IsRollover)

{

AddDataFlag(Enum_Data_RolloverBackWard());//设置后复权

}

If(IsRolloverRealPrice)

{

AddDataFlag(Enum_Data_RolloverRealPrice());//是否映射真实价格

}

If(IsAutoSwapPosition)

{

AddDataFlag(Enum_Data_AutoSwapPosition());//设置自动换仓

}

   }

SetGlobalVar2(\"Switch\", 0);

//GetGlobalVar2(\"Switch\")

}


//在新bar的第一次执行之前调用一次,参数为新bar的图层数组

OnBarOpen(ArrayRef<Integer> indexs)

{


Numeric k;

Numeric result=1;

for k=0 to DataSourceSize-1

{

result= result*data[k].BarExistStatus;

}

If(result<>1) Return;

If(DATA[i].Rollover<>DATA[i].Rollover[1])

       PlotBool(\"true\",True);

           

     


//If(QuoteStatus() != 1) Return;//过滤集合竞价

Commentary(\"当前bar的时间\"+text(date+time));

//If(data!=data[1]and high==low) Return;

//使用FOR循环,品种编号,全部使用索引  

//#############################################数据获取计算部份##################################

Commentary(\"当前bar的时间\"+text(date+time));

For i = 0 to instNum-1

{

if(data[i].close[1]==data[i].close[2]&&data[i].close[2]==data[i].close[3]&&data[i].close[3]==data[i].close[4])

{

RR[i]=10000000;//对于未上市的品种,将因子值赋予相对无限大,使其升序排序时不影响后面的交易

Commentary(\"data \"+text(i)+\" 出问题\"+text(date+time));

//print(\"data \"+text(i)+\" 出问题\"+text(date+time));

}

else

{

Numeric mysummation;

mysummation=summation(Abs(data[i].close[2]-data[i].close[3]),N);

RR[i]=(data[i].close[1]-data[i].close[N])/mysummation;//ER因子

k=k+1;

//print(\"status = \"+text(status));

}

myclose[i]=data[i].close[1]/data[i].Rollover;

lots[i]=(Fund+Portfolio_TotalProfit())/(myclose[i]*data[i].ContractUnit*data[i].BigPointValue*data[i].MarginRatio);

data[i].Commentary(\"lots[i]=\"+text(lots[i]));

}

Commentary(\"k = \"+Text(k));

RS=RR;//用RS值来保存原始的因子值RR数组

Commentary(\"RS=\"+TextArray(RS));

//对因子值进行排序,排序后RR数组本身会发生改变

ArraySort(RR,True);

//截取33%,66%分位数的因子值

j=MAX(1,FEN);

RRup=RR[j-1];//得到排名前33%

RRdown=RR[k-j];//得到排名后33%  

Commentary(\"RR=\"+TextArray(RR));

Commentary(\"j = \"+Text(j));

Commentary(\"RRup=\"+Text(RRup));

Commentary(\"RRdown=\"+Text(RRdown));

Commentary(\"Time=\"+Text(Time));

k =0;

Commentary(\"RR1111=\"+TextArray(RR));

////#############################################循环交易下单执行部份##################################

       Numeric Temp_RRup=RRup;

       Numeric Temp_RRdown=RRdown;

         

For i=0 to instNum-1

{

//做多排名第一的品种  

If( RS[i]>=Temp_RRdown AND RS[i]!=10000000 AND data[i].MarketPosition!=1 AND Weekday==WeekdaySet and time==TimeSet)

{

print(\"当前bar1 \"+text(Time));

IF(data[i].MarketPosition==0)

{

DATA[i].Buy(Lots[i],data[i].Open);

}

Else IF(data[i].MarketPosition==-1)

{

DATA[i].BuyToCover(0,DATA[i].open);

DATA[i].Buy(Lots[i],data[i].Open);

}

}

//做空排名最后的品种

If( RS[i]<=Temp_RRup AND RS[i]!=10000000 AND data[i].MarketPosition!=-1 AND Weekday==WeekdaySet AND time==TimeSet)

{

print(\"当前bar2 \"+text(Time));

IF(data[i].MarketPosition==0)

{

DATA[i].SellShort(Lots[i],data[i].Open);

}

Else IF(data[i].MarketPosition==1)

{

DATA[i].Sell(0,DATA[i].open);

DATA[i].SellShort(Lots[i],data[i].Open);

}

}

//除了第一和最后,其它品种空仓

If(RS[i]>Temp_RRup AND RS[i]<Temp_RRdown AND DATA[i].MarketPosition==1 AND Weekday==WeekdaySet AND time==TimeSet)

{

print(\"当前bar3 =\"+text(Time));

DATA[i].Sell(0,DATA[i].open);

}

If(RS[i]==10000000 AND DATA[i].MarketPosition==1 AND Weekday==WeekdaySet AND time==TimeSet)

{

print(\"当前bar4 \"+text(Time));

DATA[i].Sell(0,DATA[i].open);

}

If (RS[i]>Temp_RRup AND RS[i]<Temp_RRdown AND DATA[i].MarketPosition==-1 AND Weekday==WeekdaySet AND time==TimeSet)

{

print(\"当前bar5 \"+text(Time));

DATA[i].BuyToCover(0,DATA[i].open);

}

If(RS[i]==10000000 AND DATA[i].MarketPosition==-1 AND Weekday==WeekdaySet AND time==TimeSet)

{

print(\"当前bar6 \"+text(Time));

DATA[i].BuyToCover(0,DATA[i].open);

}

}

}

//Bar更新事件函数,参数indexs表示变化的数据源图层ID数组

OnBar(ArrayRef<Integer> indexs)

{

       

 

       

}




//下一个Bar开始前,重新执行当前bar最后一次,参数为当前bar的图层数组

OnBarClose(ArrayRef<Integer> indexs)

{

}

kyover

你是不是在夜盘的时候发现信号消失了

2024-01-10 09:55
hyqh901097026
@kyover

这次我没有加载没有夜盘的品种,所有品种既有夜盘也有白盘,白天和夜盘都信号消失

2024-01-10 11:31
hyqh901097026
@kyover

老师能再关注一下我的这个问题吗,谢谢,在线等

2024-01-10 14:08
kyover
@hyqh901097026

建议你看一下之前关于信号闪烁的案例和答疑。信号闪烁诊断需要花费比较多的精力和时间,手头需要回复 的问题比较多,如果确实自己诊断不出来,建议发邮件等讲解

2024-01-12 08:56
hyqh901097026
@kyover

刘风老师,信号闪烁的案例我每个视频都看过了,社区里关于信号闪烁的帖子共10页我也一个个看过了,所以常见的明显的闪烁问题我应该都规避了,还是没有解决。但TB一个老师现在正在帮我看,也许能解决,现在还没有确认,这里说一声。如果解决了,我会再回复一次解决了。谢谢

2024-01-12 16:51
hyqh901097026
@kyover

刘风老师请问发哪个邮箱呢

2024-01-15 14:48
gordenwch

我碰到和你一样的问题,一样的截面策略,你是放在onbaropen中,如果放在onbar中,回测就会提示信号闪烁问题。现在也没法解决

2024-01-11 14:32
hyqh901097026
@gordenwch

放在ONBAR是会提示闪烁,放在ONBAROPEN里不会提示闪烁,但是会有疑似信号消失的问题,重启策略单元后,监控器马上会发现不匹配,所以潜在的问题好像无论放在哪个域都一样。

2024-01-12 16:52
rsdy184****1520

这么久了不知你们的问题解决了吗?

2024-09-09 09:03
您未登录,请先 登录注册 后发表评论
顶部