欢迎使用金字塔普通技术服务论坛,您可以在相关区域发表技术支持贴。
我司技术服务人员将优先处理 VIP客服论坛 服务贴,普通区问题处理速度慢,请耐心等待。谢谢您对我们的支持与理解。


金字塔客服中心 - 专业程序化交易软件提供商金字塔软件公式模型编写问题提交 → 函数不能在IF THEN FOR循环控制语句中被引用的原理和解决方案

   

欢迎使用金字塔普通技术服务论坛,您可以在相关区域发表技术支持贴。
我司技术服务人员将优先处理 VIP客服论坛 服务贴,普通区问题处理速度慢,请耐心等待。谢谢您对我们的支持与理解。    


  共有41051人关注过本帖树形打印复制链接

主题:函数不能在IF THEN FOR循环控制语句中被引用的原理和解决方案

帅哥哟,离线,有人找我吗?
陈泉清
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:新手上路 帖子:25 积分:286 威望:0 精华:0 注册:2009/12/4 13:43:34
  发帖心情 Post By:2010/1/20 10:46:37    Post IP:58.54.182.250[显示全部帖子]

以下是引用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",
"MA","DMA","EMA","FILTER","REF","WMA","TMA","SMA","SUM","SUMBARS","CROSS","LONGCROSS","AVEDEV","DEVSQ","FORCAST","SLOPE","STD","STDP","VAR","VARP","SAR","BETA","COVAR","ALL",
"BACKSET","REFX","PARTLINE","SFILTER","RELATE","ALIKE","FILLRGN","NEWHBARS","NEWLBARS"

例如:

input:atrn1(1,1,10),atrn2(5,2,20);

if atrn1<atrn2 and vol>20000 then
begin
    TR1:= MAX(MAX((HIGH-LOW),ABS(REF(CLOSE,1)-HIGH)),ABS(REF(CLOSE,1)-LOW));
    ATRn_1:= MA(TR1,atrn1);
    ATRn_2:= MA(TR1,atrn2);
end;

上述公式语句由于将REF和MA函数放在了IF语句之中,所以该公式无法正常编译。解决办法是将他们放到IF语句之外去执行:

input:atrn1(1,1,10),atrn2(5,2,20);

A1:=REF(CLOSE,1);
MA1:=MA(atrn1,atrn1);
MA2:=MA(atrn2,atrn2);

if atrn1<atrn2 and vol>20000 then
begin
    TR1:= MAX(MAX((HIGH-LOW),ABS(A1-HIGH)),ABS(A1-LOW));
    ATRn_1:= MA1;
    ATRn_2:= MA2;
end;

这样经过修正的公式就可以正常编译了,此外公式还将两次REF语句引用合并到一个语句中,这样做还可以提高公式系统的运行效率,因为REF统计语句只执行了一次。

[此贴子已经被作者于2009-11-2 10:22:11编辑过]

input:atrn1(1,1,10),atrn2(5,2,20);

A1:=REF(CLOSE,1);
MA1:=MA(atrn1,atrn1);
MA2:=MA(atrn2,atrn2);

if atrn1<atrn2 and vol>20000 then
begin
    TR1:= MAX(MAX((HIGH-LOW),ABS(A1-HIGH)),ABS(A1-LOW));
    ATRn_1:= MA1;
    ATRn_2:= MA2;
end;
这红色的语句有问题吧


 回到顶部