全部 智大领峰 TBQuant功能 TBL语言 TB开户 问答专区 高手圈 其他
IF ELSE逻辑疑问
hongqida 分享到
2022-07-29 08:58

写了一段逻辑判断代码,但程序运行结果让我很是疑惑,代码及运行结果如下,请老师指导:

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中的代码被触发,这是什么原因导致?

wangkaiming

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

2022-07-29 10:25
hongqida
@wangkaiming

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

2022-07-29 11:02
wangkaiming

先看看单图层会不会也这样

2022-07-29 10:30
hongqida
@wangkaiming

尝试用了单个图层,也还是有这个问题,截图和代码如下:

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));
        }
    }

2022-07-29 11:18
Bryan2020
@hongqida

不要在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;
            }

就不会出现你那个奇怪的问题了

2022-07-29 11:45
hongqida
@Bryan2020

问题已经解决!感谢!

“TB公式编写必看——序列函数避坑指南”这个帖子我也看过,但自己写代码的时候就没往那里想crying

2022-07-29 14:46
您未登录,请先 登录注册 后发表评论
顶部