写了一段逻辑判断代码,但程序运行结果让我很是疑惑,代码及运行结果如下,请老师指导:
Vars
Global Numeric Ks_temp(0.3);
Global Numeric Kx_temp(0.3);
Integer s_time(20170101);
Integer e_time(20181231);//订阅起始时间
OnInit()
{
SubscribeBar("000300.SSE","1d",s_time,e_time);//订阅沪深300指数(000300.SSE)日K线行情
SubscribeBar("000300.SSE","5m",s_time,e_time);//订阅沪深300指数1分钟K线行情
}
Range[0:0]
{
If(Close[1]>=Average(Close[1],ma))//如果沪深300在10日均线之上,则将触发看涨的阀值降低
{
data1.Commentary("前一根日K线在10日线之上,前一天10日线金额为:" + Text(data0.Average(data0.Close[1],ma)));
Ks_temp=Ks-0.1;
}Else If(Close[1]<Average(Close[1],ma))//如果沪深300在10日均线之下,则将触发看跌的阀值降低
{
data1.Commentary("前一根日K线在10日线之下,前一天10日线金额为:" + Text(data0.Average(data0.Close[1],ma)));
Kx_temp=Kx-0.1;
}
Else
{
data1.Commentary("前一根日K线既不在10日线之下,也不在10日线之上");
data1.Commentary("Close[1]=" + Text(data0.Close[1]) + " Average(Close[1],ma)=" + Text(data0.Average(data0.Close[1],ma)));
Ks_temp=0.3;
Kx_temp=0.3;
}
从逻辑上说,0号图层的日K线,除了大于等于20日均线或小于20日均线两种结果外,不会有第三种结果,也就是说else{}中的代码不会执行。但程序运行的结果则不是如些,某些情况下,else中的代码被触发,这是什么原因导致?
先看看单图层会不会也这样
尝试用了单个图层,也还是有这个问题,截图和代码如下:
Params
//此处添加参数
Integer n(5);
Numeric Ks(0.3);
Numeric Kx(0.3);
Integer ma(10);
Vars
//此处添加变量
Global Numeric Ks_temp(0.3);
Global Numeric Kx_temp(0.3);
Integer s_time(20170101);
Integer e_time(20181231);//订阅起始时间
Events
//此处实现事件函数
//初始化事件函数,策略运行期间,首先运行且只有一次,应用在订阅数据等操作
OnInit()
{
SubscribeBar("000300.SSE","1d",s_time,e_time);//订阅沪深300指数(000300.SSE)日K线行情
//与数据源有关
Range[0:DataCount-1]
{
//=========数据源相关设置==============
AddDataFlag(Enum_Data_RolloverBackWard()); //设置后复权
AddDataFlag(Enum_Data_RolloverRealPrice()); //设置映射真实价格
AddDataFlag(Enum_Data_AutoSwapPosition()); //设置自动换仓
AddDataFlag(Enum_Data_IgnoreSwapSignalCalc()); //设置忽略换仓信号计算
}
}
//Bar更新事件函数,参数indexs表示变化的数据源图层ID数组
OnBar(ArrayRef<Integer> indexs)
{
Numeric HH;
Numeric LC;
Numeric HC;
Numeric LL;
Numeric R;
Numeric U;
Numeric DD;
Integer lot(1);
Range[0:0]
{
If(Close[1]>=Average(Close[1],ma))//如果沪深300在10日均线之上,则将触发看涨的阀值降低
{
data0.Commentary("前一根日K线在10日线之上,前一天10日线金额为:" + Text(data0.Average(data0.Close[1],ma)));
Ks_temp=Ks-0.1;
}Else If(Close[1]<Average(Close[1],ma))//如果沪深300在10日均线之下,则将触发看跌的阀值降低
{
data0.Commentary("前一根日K线在10日线之下,前一天10日线金额为:" + Text(data0.Average(data0.Close[1],ma)));
Kx_temp=Kx-0.1;
}
Else
{
data0.Commentary("前一根日K线既不在10日线之下,也不在10日线之上");
data0.Commentary("Close[1]=" + Text(data0.Close[1]) + " Average(Close[1],ma)=" + Text(data0.Average(data0.Close[1],ma)));
Ks_temp=0.3;
Kx_temp=0.3;
}
HH = Highest(High[1],N);
LC = Lowest(Close[1],N);
HC = Highest(Close[1],N);
LL = Lowest(Low[1],N);
R = Max(HH-LC,HC-LL);
U = Open[0] + Ks_temp*R;
DD = Open[0] - Kx_temp*R;
PlotNumeric("上轨",U,0,Red);
PlotNumeric("下轨",DD,0,Blue);
PlotNumeric("MA",AverageFC(Close,10));
}
}
不要在IF ELSE里面做序列变量计算。
改成下面这样
先在vars里面定义一个序列变量ma10
Series<Numeric> ma10;
然后onbar里面的代码做如下修改
ma10 = Average(Close,ma);
If(Close[1]>=ma10[1])//如果沪深300在10日均线之上,则将触发看涨的阀值降低
{
data0.Commentary("前一根日K线在10日线之上,前一天10日线金额为:" + Text(ma10[1]));
Ks_temp=Ks-0.1;
}Else If(Close[1]<ma10[1])//如果沪深300在10日均线之下,则将触发看跌的阀值降低
{
data0.Commentary("前一根日K线在10日线之下,前一天10日线金额为:" + Text(ma10[1]));
Kx_temp=Kx-0.1;
}
Else
{
data0.Commentary("前一根日K线既不在10日线之下,也不在10日线之上");
data0.Commentary("Close[1]=" + Text(data0.Close[1]) + " Average(Close[1],ma)=" + Text(ma10[1]));
Ks_temp=0.3;
Kx_temp=0.3;
}
就不会出现你那个奇怪的问题了
问题已经解决!感谢!
“TB公式编写必看——序列函数避坑指南”这个帖子我也看过,但自己写代码的时候就没往那里想
你这个代码贴全了吗, 为什么没有主程序域onbar
没有贴全,只是把重点贴了出来,rang[0:0]就是onbar里的内容