以文本方式查看主题

-  金字塔客服中心 - 专业程序化交易软件提供商  (http://222.73.7.161/bbs/index.asp)
--  公式模型编写问题提交  (http://222.73.7.161/bbs/list.asp?boardid=4)
----  分支语句的多层嵌套问题  (http://222.73.7.161/bbs/dispbbs.asp?boardid=4&id=169425)

--  作者:m1978xz
--  发布时间:2019/4/18 12:49:10
--  分支语句的多层嵌套问题
在第48行显示错误:ELSE前边缺少IF
这个else实际是对应第一个IF的。
我以为一个IF后边可以有多个ELSE if的多分支判断。莫非这样不可以?应该怎么修改啊?

TB中可以用{}来清晰化嵌套关系,请问金字塔中有类似的方法么?

以下内容为程序代码:

1 s_czsc_high:ref(H,1);//前一K线处理完包含关系之后的高,初值暂定为前K高
2 s_czsc_low:ref(L,1);//前一K线处理完包含关系之后的低,初值暂定为前K低
3 s_direction:0;
4 s_status:0;
5
6 //包含
7 czsc_high:=0;//当前K线高点,初值暂定为前K高
8 czsc_low:=0; //当前K线低点,初值暂定为前K低
9 //分型
10 direction:=0; //当前K线方向
11 status:=0;
12 //分型
13 direction:=0; //当前K线方向
14 status:=0;
15 //当前K线状态(0.表示延续方向 1.表示K线转变方向)
16 If (s_czsc_high>0 or s_czsc_low>0)then begin //如果前高大于零或者前低大于零 IF1 //存在缠中说禅K线的
17 If ((s_czsc_high>High and s_czsc_low<Low) or (High>s_czsc_high and Low<s_czsc_low))then begin //是否存在包含关系IF2
18 If (s_direction>0)then begin //IF3 //依据上一根K线方向确定当前K线方向
19 direction=1;
20 status=0;
21 czsc_high=Max(s_czsc_high,High);
22 czsc_low=Max(s_czsc_low,Low);
23 end //对应IF3
24 //更新最高点和最低点
25 Else begin
26 if (s_direction<0)then begin//IF4
27 direction=-1;
28 status=0;
29 czsc_high=Min(s_czsc_high,High);
30 czsc_low=Min(s_czsc_low,Low);
31 end//对应IF4
32 end//对应IF2
33
34 ///---------------上边暂时没问题了
35 Else begin //不存在包含关系
36 If (s_direction>0)then begin //IF5 //依据上一根K线方向确定当前K线方向
37 If (High<s_czsc_high)then begin //IF6 //是否发生转向
38 direction=-1; status=1;
39 czsc_high=High;
40 czsc_low=Low;
41 end//对应IF6
42 Else begin
43 direction=1;
44 status=0;
45 czsc_high=Max(s_czsc_high,High);
46 czsc_low=Max(s_czsc_low,Low);
47 end //对应F5
48 Else begin
49 If (s_direction<0)then begin
50 If (Low>s_czsc_low)then begin
51 direction=1;
52 status=1;
53 czsc_high=High;
54 czsc_low=Low;
55 end
56 Else begin
57 direction=-1;
58 status=0;
59 czsc_high=Min(s_czsc_high,High);
60 czsc_low=Min(s_czsc_low,Low);
61
62 Else begin
63 If ((High>High[1] and Low<Low[1]) or (High[1]>High and Low[1]<Low))then begin //当不存在缠中说禅K线时用K线高低点作为依据判断存在包含关系
64 If (High[1]>High[2])then begin //判断方向
65 direction=1;
66 status=0;
67 czsc_high=Max(High[1],High);
68 czsc_low=Max(Low[1],Low);
69 end
70 Else begin
71 If (Low[1]<Low[2])then begin
72 direction=-1;
73 status=0;
74 czsc_high=Min(High[1],High);
75 czsc_low=Min(Low[1],Low);
76 end
77 Else begin
78 If (High[2]<High[1])then begin
79 If (High[1]>High)then begin
80 direction=-1;
81 status=1;
82 czsc_high=High;
83 czsc_low=Low;
84 Else begin
85 direction=1;
86 status=0;
87 czsc_high=Max(High[1],High);
88 czsc_low=Max(Low[1],Low);
89
90 Else begin
91 If (Low[2]>Low[1])then begin
92 If (Low[1]<Low)then begin
93 direction=1;
94 status=1;
95 czsc_high=High;
96 czsc_low=Low;
97 end
98 end
99 Else begin
100 direction=-1;
101 status=0;
102 czsc_high=Min(High[1],High);
103 czsc_low=Min(Low[1],Low);
104
105 If (czsc_low>0 or czsc_high>0)then begin
106 PlotNumeric("czsc",czsc_low,czsc_high); //输出缠中说禅K线
107 Commentary("("+Text(direction)+","+Text(status)+")");
108 end
109
110 End
111



[此贴子已经被作者于2019/4/18 12:49:48编辑过]

--  作者:m1978xz
--  发布时间:2019/4/18 13:12:42
--  
抱歉,我刚才看了下,这个else 对应的是36行的那个IF


图片点击可在新窗口打开查看此主题相关图片如下:qq截图20190418131211.png
图片点击可在新窗口打开查看

--  作者:FireScript
--  发布时间:2019/4/18 13:19:39
--  
语法:IF COND THEN EXPR1 ELSE EXPR2
当满足 COND 条件的时候,执行语句 EXPR1,否则执行 EXPR2 语句



--  作者:m1978xz
--  发布时间:2019/4/18 13:32:11
--  
那这个问题是不是因为不支持多层嵌套导致的?

图片点击可在新窗口打开查看此主题相关图片如下:qq截图20190418131211.png
图片点击可在新窗口打开查看

就是说不支持这样的Else模块中包含更低一级别的Else?



--  作者:FireScript
--  发布时间:2019/4/18 13:33:32
--  
支持的。
--  作者:m1978xz
--  发布时间:2019/4/18 13:38:39
--  
那版主您能帮我看看问题出在哪里么?
我从上午一直鼓捣这个,实在看不出错在哪儿了图片点击可在新窗口打开查看

s_czsc_high:ref(H,1);//前一K线处理完包含关系之后的高,初值暂定为前K高
s_czsc_low:ref(L,1);//前一K线处理完包含关系之后的低,初值暂定为前K低
s_direction:0;
s_status:0;

        //包含
czsc_high:=0;//当前K线高点,初值暂定为前K高
czsc_low:=0;   //当前K线低点,初值暂定为前K低
        //分型
direction:=0;        //当前K线方向
status:=0;
        //分型
direction:=0;        //当前K线方向
status:=0;
//当前K线状态(0.表示延续方向 1.表示K线转变方向)      
        If (s_czsc_high>0 or s_czsc_low>0)then begin  //如果前高大于零或者前低大于零  IF1                                                                                                                                   //存在缠中说禅K线的
                If ((s_czsc_high>High and s_czsc_low<Low) or (High>s_czsc_high and Low<s_czsc_low))then begin       //是否存在包含关系IF2
                        If (s_direction>0)then begin   //IF3                                                                                                                                                 //依据上一根K线方向确定当前K线方向
                                direction=1; 
                                status=0;
                                czsc_high=Max(s_czsc_high,High); 
                                czsc_low=Max(s_czsc_low,Low);   
                         end //对应IF3
 //更新最高点和最低点
                         Else begin
                          if (s_direction<0)then begin//IF4
                                direction=-1; 
                                status=0;
                                czsc_high=Min(s_czsc_high,High); 
                                czsc_low=Min(s_czsc_low,Low);
                           end//对应IF4
                           end//对应IF2
                           
///---------------上边暂时没问题了
                Else begin                                                                                                                                                                                       //不存在包含关系
                        If (s_direction>0)then begin  //IF5                                                                                                                                                      //依据上一根K线方向确定当前K线方向
                                If (High<s_czsc_high)then begin  //IF6                                                                                                                                     //是否发生转向
                                        direction=-1; status=1;
                                        czsc_high=High; 
                                        czsc_low=Low;
                                 end//对应IF6
                                Else begin  
                                        direction=1; 
                                        status=0;
                                        czsc_high=Max(s_czsc_high,High); 
                                        czsc_low=Max(s_czsc_low,Low);
                           end //对应F5
                        Else begin 
                         If (s_direction<0)then begin
                                If (Low>s_czsc_low)then begin
                                        direction=1;
                                        status=1;
                                        czsc_high=High; 
                                        czsc_low=Low;
                                 end
                                Else begin
                                        direction=-1; 
                                        status=0; 
                                        czsc_high=Min(s_czsc_high,High); 
                                        czsc_low=Min(s_czsc_low,Low);
        
        Else begin
                If ((High>High[1] and Low<Low[1]) or (High[1]>High and Low[1]<Low))then begin                                                               //当不存在缠中说禅K线时用K线高低点作为依据判断存在包含关系
                        If (High[1]>High[2])then begin                                                                                                                                              //判断方向
                                direction=1; 
                                status=0;
                                czsc_high=Max(High[1],High); 
                                czsc_low=Max(Low[1],Low);
                        end
                        Else begin
                        If (Low[1]<Low[2])then begin 
                                direction=-1; 
                                status=0;
                                czsc_high=Min(High[1],High); 
                                czsc_low=Min(Low[1],Low);
                         end
                Else  begin
                        If (High[2]<High[1])then begin
                                If (High[1]>High)then begin
                                        direction=-1; 
                                        status=1;
                                        czsc_high=High; 
                                        czsc_low=Low;
                                Else begin
                                        direction=1; 
                                        status=0;
                                        czsc_high=Max(High[1],High); 
                                        czsc_low=Max(Low[1],Low);
                          
                        Else begin
                         If (Low[2]>Low[1])then begin
                                If (Low[1]<Low)then begin
                                        direction=1; 
                                        status=1;
                                        czsc_high=High; 
                                        czsc_low=Low;
                                 end
                          end 
                                Else begin
                                        direction=-1; 
                                        status=0;
                                        czsc_high=Min(High[1],High); 
                                        czsc_low=Min(Low[1],Low);          

        If (czsc_low>0 or czsc_high>0)then begin
                PlotNumeric("czsc",czsc_low,czsc_high);                                                                                                                        //输出缠中说禅K线
                Commentary("("+Text(direction)+","+Text(status)+")");
       end       
        
End


--  作者:m1978xz
--  发布时间:2019/4/18 13:51:21
--  
我把这个分支 语句单独提出来做成一个公式,还是出现这个问题:

s_czsc_high:ref(H,1);//前一K线处理完包含关系之后的高,初值暂定为前K高
s_czsc_low:ref(L,1);//前一K线处理完包含关系之后的低,初值暂定为前K低
s_direction:0;
s_status:0;

        //包含
czsc_high:=0;//当前K线高点,初值暂定为前K高
czsc_low:=0;   //当前K线低点,初值暂定为前K低
        //分型
direction:=0;        //当前K线方向
status:=0;
        //分型
direction:=0;        //当前K线方向
status:=0;

                      If (s_direction>0)then begin  //IF5                                                                                                                                                      //依据上一根K线方向确定当前K线方向
                                If (High<s_czsc_high)then begin  //IF6                                                                                                                                     //是否发生转向
                                        direction=-1; status=1;
                                        czsc_high=High; 
                                        czsc_low=Low;
                                 end//对应IF6
                                Else begin  
                                        direction=1; 
                                        status=0;
                                        czsc_high=Max(s_czsc_high,High); 
                                        czsc_low=Max(s_czsc_low,Low);
                           end //对应F5
                        Else begin 
                         If (s_direction<0)then begin//F7
                                If (Low>s_czsc_low)then begin //F8
                                        direction=1;
                                        status=1;
                                        czsc_high=High; 
                                        czsc_low=Low;
                                 end//对应F8
                                Else begin
                                        direction=-1; 
                                        status=0; 
                                        czsc_high=Min(s_czsc_high,High); 
                                        czsc_low=Min(s_czsc_low,Low);
                          end  //对应F7

--  作者:FireScript
--  发布时间:2019/4/18 13:51:35
--  
 不是 你应该按照这样的方式:
s:=1;
if c>o-2 then s:=0; else if c>o+1 then s:=-1; else if c<o then s:=-2;
每一个else  if 后面都要有一个条件判断的。

你后面的似乎都没有按照这个方式去处理的?你这个我看的都理不清。。。

--  作者:m1978xz
--  发布时间:2019/4/18 13:56:30
--  
您说的我大致明白了。我有的Else后边没有IF,就像下边这样了。

 Else begin  
                                        direction=1; 
                                        status=0;
                                        czsc_high=Max(s_czsc_high,High); 
                                        czsc_low=Max(s_czsc_low,Low);

不过前边的if不是判断过了么?
else是否则的意思,就是如果前一个IF的条件不成立,就按后边的方式来改变变量的值。

所以else 后边 不一定要有if吧?
[此贴子已经被作者于2019/4/18 13:56:57编辑过]

--  作者:FireScript
--  发布时间:2019/4/18 14:21:02
--  
 其实是这样,如果就2个条件  a 或者not(a)
if  a then ... else ....
后面可以直接else

但是如果是多个分支,比如判断一个数值在什么区间段。那肯定不能省掉 if 后面的条件判断的。
比如这里你要判断多个条件情况下,那肯定得类似下面这样操作:
if a then EXPR1
else if b EXPR2
else if c EXPR3
....
....