china_lizhi 发表于 2016-3-10 15:18:26

把这个函数拷贝出来编译警示可能有问题——NthExtremes

//------------------------------------------------------------------------
// 简称: NthExtremes
// 名称: 求N极值
// 类别: 用户函数
// 类型: 内建函数
// 输出: 数值型
//------------------------------------------------------------------------

Params
        NumericSeries Price(1);
        Numeric Length(10);
        Numeric N(5);
        Bool bMax(True);
        NumericRef NthExtremeBar;
Vars
        Numeric nMaxBar;
        Numeric NthMaxValue;
        Numeric nMinBar;
        Numeric NthMinValue;
        Numeric TmpValue;
        Numeric NthReturnValue;
        Numeric nBetterCnt;
        Numeric nEqualCnt;
        Numeric nEqualIndex;
        Numeric i;
        Numeric j;
        Numeric k;
Begin
        if (Length > 0 && N>0 && N <= Length)
        {
                NthMaxValue = Extremes(Price, Length, True, nMaxBar);
                NthMinValue = Extremes(Price, Length, False, nMinBar);
               
                If(bMax)
                {
                        For i = 2 To N
                        {
                                TmpValue = NthMinValue - 1;
                                nBetterCnt = 0;
                                nEqualCnt = 0;
                                For j = 0 To Length - 1
                                {
                                        If ( Price > NthMaxValue)
                                        {
                                                nBetterCnt = nBetterCnt + 1;
                                        }else If ( Price < NthMaxValue)
                                        {
                                                if (Price > TmpValue)
                                                {
                                                        TmpValue = Price ;
                                                        nMaxBar = j;
                                                }
                                        }Else
                                        {
                                                nEqualCnt = nEqualCnt + 1;
                                        }
                                }
                                       
                                if (nBetterCnt + nEqualCnt >= i)
                                {
                                        nEqualIndex = 0;
                                        for  k = 0 To  Length - 1
                                        {
                                                if (Price == NthMaxValue)
                                                {
                                                        nEqualIndex = nEqualIndex + 1;
                                                        if (nEqualIndex == (i - nBetterCnt))
                                                        {
                                                                nMaxBar = k;
                                                        }
                                                }
                                        }
                                }else
                                {
                                        NthMaxValue = TmpValue;
                                }                               
                        }
                        NthExtremeBar = nMaxBar;
                        NthReturnValue = NthMaxValue;
                }Else
                {
                        For i = 2 To N
                        {
                                TmpValue = NthMaxValue + 1;
                                nBetterCnt = 0;
                                nEqualCnt = 0;
                                For j = 0 To Length - 1
                                {
                                        If ( Price < NthMinValue)
                                        {
                                                nBetterCnt = nBetterCnt + 1;
                                        }else If ( Price > NthMinValue)
                                        {
                                                if (Price < TmpValue)
                                                {
                                                        TmpValue = Price ;
                                                        nMinBar = j;
                                                }
                                        }Else
                                        {
                                                nEqualCnt = nEqualCnt + 1;
                                        }
                                }
                                       
                                if (nBetterCnt + nEqualCnt >= i)
                                {
                                        nEqualIndex = 0;
                                        for  k = 0 To  Length - 1
                                        {
                                                if (Price == NthMinValue)
                                                {
                                                        nEqualIndex = nEqualIndex + 1;
                                                        if (nEqualIndex == (i - nBetterCnt))
                                                        {
                                                                nMinBar = k;
                                                        }
                                                }
                                        }
                                }else
                                {
                                        NthMinValue = TmpValue;
                                }                               
                        }
                        NthExtremeBar = nMinBar;
                        NthReturnValue = NthMinValue;
                }
        }Else
        {
                NthReturnValue = -1;
                NthExtremeBar = -1;
        }
        Return NthReturnValue;
End

//------------------------------------------------------------------------
// 编译版本        GS2010.12.08
// 版权所有        TradeBlazer Software 2003-2010
// 更改声明        TradeBlazer Software保留对TradeBlazer平
//                        台每一版本的TradeBlazer公式修改和重写的权利
//------------------------------------------------------------------------

china_lizhi 发表于 2016-3-10 15:19:15

调整成如下顺序编译就没问题了
Begin
        NthMaxValue = Extremes(Price, Length, True, nMaxBar);
        NthMinValue = Extremes(Price, Length, False, nMinBar);
        if (Length > 0 && N>0 && N <= Length)
        {

china_lizhi 发表于 2016-3-10 15:25:06

把内建函数NthExtremes中的源代码原封不动地拷贝到了自定义函数中了,然后编译对如下两行代码有如下的警示:
                NthMaxValue = Extremes(Price, Length, True, nMaxBar);
                NthMinValue = Extremes(Price, Length, False, nMinBar);
这两行提示:FOR、WHILE、IF、ELSE中包含序列函数,可能存在潜在的逻辑错误。

小米 发表于 2016-3-10 15:34:55

china_lizhi 发表于 2016-3-10 15:25 static/image/common/back.gif
把内建函数NthExtremes中的源代码原封不动地拷贝到了自定义函数中了,然后编译对如下两行代码有如下的警示 ...

已经 通过编译的,可以忽略此提示。。
但凡在条件里使用了序列函数的都会有此提示,如果在公式应用中,尽可能避免如此使用。在函数中,特别是系统自带的函数是可以确定其运算结果无误的,就可以不用理会了。
页: [1]
查看完整版本: 把这个函数拷贝出来编译警示可能有问题——NthExtremes