IF ELSE逻辑疑问

写了一段逻辑判断代码,但程序运行结果让我很是疑惑,代码及运行结果如下,请老师指导: 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; } 就不会出现你那个奇怪的问题了

回复:问题已经解决!感谢! &ldquo;TB公式编写必看&mdash;&mdash;序列函数避坑指南&rdquo;这个帖子我也看过,但自己写代码的时候就没往那里想

你这个代码贴全了吗, 为什么没有主程序域onbar

回复:没有贴全,只是把重点贴了出来,rang[0:0]就是onbar里的内容