5. 指标进阶 5.1. 常见错误 技术指标是量化分析和设计操作方法的基础,每个自定义指标都可以反映作者对股市的独特简介。指南针自定义指标平台推出以来,广大网员编写了许多指标,其中有许多精品,但是也有一些普遍性的错误,在本章中列举一些常见的错误类型,供广大网员参考。 5.1.1. 条件语句没有考虑所有情况 条件跳转语句属于分支结构,每个条件跳转语句都应该有两个分支——条件满足和条件不满足,原则上两个分支都需要考虑。请看下面指标TEST的实现代码(结果指标是TEST和AA): IF( CLOSE > OPEN ) THEN AA = CLOSE; ENDIF; TEST = MA( AA, 10 ); 这种类型的代码在指标平台的实际使用中很常见。我们先看条件跳转语句,如果今天K线收阳(CLOSE > OPEN),则结果指标AA赋值为CLOSE,下面直接把AA作简单移动平均赋值给结果指标TEST。但是如果今天K线不收阳(CLOSE<=OPEN)那?此时结果指标AA没有被赋值,接下来对AA作MA运算是没有意义的,此时指标TEST的数值可能会和用户原来的设想大相径庭。 依据实际情况,这段代码有多种修改方法,例如: IF( CLOSE > OPEN ) THEN AA = CLOSE; ELSE AA = OPEN; ENDIF; TEST = MA( AA, 10 ); 或者 AA = 0; IF( CLOSE > OPEN ) THEN AA = CLOSE; ENDIF; TEST = MA( AA, 10 ); 可以看出,第一种修改方法把条件跳转的两个分支都考虑进去了,而第二种方法则是先对指标AA赋初始值,然后无论接下来的条件跳转语句是否会对AA赋值,AA的数值都是有意义的。 5.1.2. 循环语句不能正常退出 技术指标是量化分析和设计操作方法的基础,每个自定义指标都可以反映作者对股市的独特简介。指南针自定义指标平台推出以来,广大网员编写了许多指标,其中有许多精品,但是也有一些普遍性的错误,在本章中列举一些常见的错误类型,供广大网员参考。 有两种循环语句:一种明确知道循环次数,另一种则不明确知道循环次数。无论哪种循环语句,在实际使用中都经常出现循环不能正常退出的错误。 1) 明确知道循环次数的循环语句 明确知道循环次数的循环语句的一般形式如下(I是局部变量,用来控制循环次数,称为循环控制变量): I = 0; LOOPBEGIN IF( I >= 10 ) THEN BREAK; ENDIF; …… // I = I + 1; LOOP; 具体来说,这种循环语句由三部分构成:循环控制变量(I)赋初值;通过I值判断是否需要退出循环;累加I。这三个部分是缺一不可的。但是,实际使用中缺经常出现类似下面的代码: LOOPBEGIN IF( I >= 10 ) THEN BREAK; ENDIF; …… I = I + 1; LOOP; 或者 I = 0; LOOPBEGIN IF( I >= 10 ) THEN BREAK; ENDIF; …… LOOP; 第一中情况中,循环控制变量I没有赋初值就直接进入循环,此时I值没有意义,所以无论是接下来的条件判断语句或者累加I的操作都变成没有意义了。第二种情况则是忘了写累加I的语句,此时I一直是0,条件语句恒不满足,是个不能退出的死循环。 2) 不明确知道循环次数的循环语句 先观察一个实际指标的实现代码(F、N是局部变量,): F = 0; //用来累加“换手率” N = 0; LOOPBEGIN IF( F > 100 ) THEN BREAK; ENDIF; …… F = F + 换手率[N]; N = N + 1; LOOP; 这个循环语句的结束条件是累加换手率超过100。从设计思想上来说没有错,但是,如果新股刚上市,所有交易日的换手率加起来也不到100,则这个指标就出现问题了,此时循环可能无法退出。应该改为下面的写法: F = 0; //用来累加“换手率” N = 0; LOOPBEGIN IF( (F > 100) & (KLINEINDEX <= 0) ) THEN BREAK; ENDIF; …… F = F + 换手率[N]; N = N + 1; LOOP; 比较两段代码,可以发现第二段代码中增加了一个退出循环的条件:如果到了上市第一天,也退出循环。通过增加这个条件,避免了新股刚上市的问题。 5.1.3. 局部变量的使用 在使用中,经常可以发现这样的代码(N是局部变量,TEST是结果指标): //…… //…… 通过一段代码计算出局部变量N的数值 TEST = MA( N, 10 ); 在通过一系列复杂的运算计算出局部变量N的值后,对N作简单移动平均并把结果赋值给结果指标TEST。这段代码的初始构想是把上面的一系列运算的结果作平均,但是最后一条语句中局部变量的用法却是错误的,得到的结果与原来的构想完全不同。实际上,最后一条语句等同于: TEST = N; 要明白这一点,就要先分清楚局部变量和指标的区别。指标相当与一个数组,指标的数值会随着日期的改变而改变,对于一个指标A来说,A[0]、A[1]、A[2]是不同的数值,一般来说指标数值是不一样的。而局部变量则不同,局部变量的数值不会随着日期的改变而改变,所以N[1]、N[2]、N[3]其实都是N。所以,通过MA的算法可以看出: TEST = MA( N, 10 ) = 10 * N / 10 = N; 总的来说,在引用函数、大盘函数和统计函数中,以X表述的参数都应该是一个包含了指标的表达式,例如: CLOSE CLOSE + OPEN (HIGH[1] + LOW) / 2 等等……。 5.2. 用指标速度测试提高指标计算速度 自定义指标的代码越复杂,计算速度就越慢。而那些实现复杂,计算速度极慢的自定义指标是系统速度的瓶颈。找到这些指标,对指标代码进行优化,甚至在必要情况下不加载这些指标,往往可以极大的提高系统速度。而自定义指标平台中的“速度测试” 功能则是找到这些“龟速指标”标的利器。 可以在“速度测试”功能中的“添加指标”中加入一个或者几个指标,但是最方便的方法是使用“添加指标”中的“所有自定义指标”按钮,加入系统中的所有自定义指标进行测试,虽然测试速度会慢一些,但是可以对自己的所有自定义指标的速度有一个综合了解,能够更好的做取舍。 |
|