以文本方式查看主题 - 金字塔客服中心 - 专业程序化交易软件提供商 (http://222.73.7.161/bbs/index.asp) -- 公式模型编写问题提交 (http://222.73.7.161/bbs/list.asp?boardid=4) ---- 函数不能在IF THEN FOR循环控制语句中被引用的原理和解决方案 (http://222.73.7.161/bbs/dispbbs.asp?boardid=4&id=130) |
-- 作者:admin -- 发布时间:2009/11/2 10:19:35 -- 函数不能在IF THEN FOR循环控制语句中被引用的原理和解决方案 金字塔的公式系统在处于逐k线模式计算时,像例如REF,MA等带有统计性质的函数以及指标公式引用无法直接使用在IF语句之中(序列运行模式可以),因为带变量判断的IF语句会在某些周期无法调用这些统计函数而导致计算结果出现错误。解决办法是将这些函数放到IF语句之外去执行或者修改为数组模式。 "RET","LOD","HOD","VALUEWHEN","MD","LAST","ANY","SETVAL","FILTERX","BARSCOUNT","BARSLAST","BARSSINCE","COUNT","HHV","HHVBARS","LLV","LLVBARS", "ZTEST","TOPRANGE","LOWRANGE","TREND","GROWTH","LINEST","LOGEST"
IF THEN 语句的描述 例如: input:atrn1(1,1,10),atrn2(5,2,20); if atrn1<atrn2 and vol>20000 then 上述公式语句由于将REF和MA函数放在了IF语句之中,所以该公式无法正常编译。解决办法是将他们放到IF语句之外去执行: input:atrn1(1,1,10),atrn2(5,2,20);
对于REF较为有效率的使用改进方案 金字塔提供了强大的数组功能,完成可以代替REF函数,使用数组代替REF不仅可以解决不能再IF THEN语句的限制,还可以提高运行效率,我们举例如下: If Barpos-1 = N then
将REF修改为数组模式的代码为 If Barpos-1 = N then
FOR 等循环语句的描述 虽然金字塔没有限制在FOR等循环语句中使用这类统计性质的函数,但是如果使用不当在循环语句中同样会导致我们的公式出现意外结果。 在序列模式下这类函数每次循环将会为计算而分配内存,如果循环语句循环的次数过多将会消耗大量内存,而最终导致计算机崩溃。 在逐K线模式下虽然没有崩溃的危险,但是如果我们在循环控制语句中使用了BREAK,CONTINUE影响循环流程的控制语句中那么就有可能导致计算结果出现异常,同样如果对循环控制语句使用不当,比如某个周期因为动态变化的原因而导致循环未被执行,那么同样会出现问题,我们分别举例如下:
FOR J:=0 TO 10 DO END
上述的代码在逐K线模式下使用则不会出现问题,因为这样的语法保证了在每根K线周期都能完整的执行到REF函数。
FOR J:=0 TO BPZ DO END
上述的代码则存在安全隐患,因为BPZ变量可能因为它为0的时候而导致本次循环没被完整执行。
FOR J:=0 TO 10 DO IF ZP = 1 THEN BREAK; END
上述代码同样存在安全隐患,因为会在执行循环过程中被BREAK终止循环而导致REF在本次K线周期未必执行到。
那么问题该如何解决呢? 其实我们在大部分的FOR循环语法使用的时候,基本都是在对序列数组进行循环的操作,我们其实可以利用数组来解决这些问题,我们举例如下:
PT:=HIGH; FOR I=0 TO BARPOS DO TmpPrice:=REF(PT,I+N_SS); END
上述代码嵌套了2层FOR循环语句,里面其实都利用了对序列变量PT的引用,为了在FOR循环中避免使用REF函数带来的安全隐患,我们可以这样改写程序
PT:=HIGH; FOR I=0 TO BARPOS DO TmpPrice:=PT[BARPOS-(I+N_SS)]; END
通过直接使用数组下标的方式在循环语句里处理即可得到我们需要的效果。当然上述代码PT:=HIGH;其实我们还可以省略掉,因为金字塔对HIGH这类序列数据已经内置了数组的引用方式,我们可以直接使用 HIGH[BARPOS-(I+N_SS)];这样的方式来对数据直接来做处理。
若需要禁止提示循环中的这个问题在代码中的最前面加入如下语句即可: WARNING_DISABLE:3; [此贴子已经被作者于2017-1-21 20:34:01编辑过]
|
-- 作者:陈泉清 -- 发布时间:2010/1/20 10:46:37 -- 以下是引用admin在2009-11-2 10:19:35的发言:
金字塔的公式系统由于支持IF语句的变量运行,所以像例如REF,MA等带有统计性质的函数无法直接使用在IF语句之中,因为带变量判断的IF语句会在某些周期无法调用这些统计函数而导致计算结果出现错误。解决办法是将这些函数放到IF语句之外去执行。 "RET","LOD","HOD","VALUEWHEN","MD","LAST","ANY","SETVAL","FILTERX","BARSCOUNT","BARSLAST","BARSSINCE","COUNT","HHV","HHVBARS","LLV","LLVBARS", 例如: input:atrn1(1,1,10),atrn2(5,2,20); if atrn1<atrn2 and vol>20000 then 上述公式语句由于将REF和MA函数放在了IF语句之中,所以该公式无法正常编译。解决办法是将他们放到IF语句之外去执行: input:atrn1(1,1,10),atrn2(5,2,20); [此贴子已经被作者于2009-11-2 10:22:11编辑过] input:atrn1(1,1,10),atrn2(5,2,20); |
-- 作者:bhwhui -- 发布时间:2010/1/22 2:18:18 -- 呵呵呵,你好眼力,是笔误。自己看帮助就知道了。。。。。 |
-- 作者:敢赢 -- 发布时间:2010/5/22 11:00:48 -- 还有一处好象有问题! input:atrn1(1,1,10),atrn2(5,2,20); [此贴子已经被作者于2010-5-22 11:02:21编辑过]
|
-- 作者:蔡宛宏 -- 发布时间:2012/2/1 18:04:02 -- |
-- 作者:人生如棋 -- 发布时间:2012/2/1 19:01:02 -- 没事挖什么坟。。。。有意思嘛,挖坟又不给你钱,这么起劲。。。 |
-- 作者:momocll -- 发布时间:2012/12/4 14:53:32 --
PT:=HIGH; FOR I=0 TO BARPOS DO TmpPrice:=PT[BARPOS-(I+N_SS)]; END
这样编辑会报“数组越界操作”的错, |
-- 作者:王锋 -- 发布时间:2012/12/4 22:05:30 -- 以下是引用momocll在2012-12-4 14:53:32的发言:
PT:=HIGH; FOR I=0 TO BARPOS DO TmpPrice:=PT[BARPOS-(I+N_SS)]; END
这样编辑会报“数组越界操作”的错,
在循环代码前,加上对BARPOS的限制防止越界
IF BARPOS < N THEN EXIT; |
-- 作者:勇敢的心 -- 发布时间:2013/11/4 11:35:01 -- 您好,按照以上提供的方法,解决IF循环语句中不能实用HHV的问题,
H1:=HHV(H,ENTERBARS);
LONGX1.1 := (H1-AVGENTERPRICE <3*R AND H1-AVGENTERPRICE ≥2*R);
IF LONGX1.1 AND BUYORDERTHISBAR=0 THEN BEGIN
MYENTRYPRICE := IF(OPEN>T20HI+MINDIFF ,OPEN ,T20HI+MINDIFF ) ;
MYEXITPRICE := MYENTRYPRICE+1.4*R ;
SELL( _DEBUG ,0,LIMITR,MYEXITPRICE);
POSITION := 0 ;
TURTLEUNITS := 0 ;
END)但解决后,还是显示HHV在逐K线模式下,不能直接在IF控制语句之内引用。 谢谢。
|
-- 作者:jinzhe -- 发布时间:2013/11/4 13:02:36 -- H1定义这一句外面,还有个IF? |