以文本方式查看主题 - 金字塔客服中心 - 专业程序化交易软件提供商 (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 |
-- 作者:FireScript -- 发布时间:2019/4/18 13:19:39 -- 语法:IF COND THEN EXPR1 ELSE EXPR2 当满足 COND 条件的时候,执行语句 EXPR1,否则执行 EXPR2 语句 |
-- 作者:m1978xz -- 发布时间:2019/4/18 13:32:11 -- 那这个问题是不是因为不支持多层嵌套导致的? 就是说不支持这样的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 .... .... |