昨天开的贴子好像沉了,重开帖,请教老师们一个信号闪烁问题。我这是一个截面策略,多品种,不同图层之间会有交互计算,在指定的时间点对加载的品种通过筛选做一次调仓交易,逻辑不复杂,回测信号没问题,实盘会有信号消失的情况。
具体的症状是:当一次调仓交易完成后,如果不重启策略单元那么监控器不会查出不匹配,但重启策略单元了马上可以查出不匹配。不匹配的情况是:要么帐户报单了,查看图表没有信号(可能事后消失了);要么图表有信号,帐户没报单。
以下是代码,代码不长,请老师帮忙看一下,是哪个环节出问题了,谢谢!代码中没有用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)
{
}
这么久了不知你们的问题解决了吗?
我碰到和你一样的问题,一样的截面策略,你是放在onbaropen中,如果放在onbar中,回测就会提示信号闪烁问题。现在也没法解决
放在ONBAR是会提示闪烁,放在ONBAROPEN里不会提示闪烁,但是会有疑似信号消失的问题,重启策略单元后,监控器马上会发现不匹配,所以潜在的问题好像无论放在哪个域都一样。
你是不是在夜盘的时候发现信号消失了
这次我没有加载没有夜盘的品种,所有品种既有夜盘也有白盘,白天和夜盘都信号消失
老师能再关注一下我的这个问题吗,谢谢,在线等
建议你看一下之前关于信号闪烁的案例和答疑。信号闪烁诊断需要花费比较多的精力和时间,手头需要回复 的问题比较多,如果确实自己诊断不出来,建议发邮件等讲解
刘风老师,信号闪烁的案例我每个视频都看过了,社区里关于信号闪烁的帖子共10页我也一个个看过了,所以常见的明显的闪烁问题我应该都规避了,还是没有解决。但TB一个老师现在正在帮我看,也许能解决,现在还没有确认,这里说一声。如果解决了,我会再回复一次解决了。谢谢
刘风老师请问发哪个邮箱呢