1.2特殊数据引用 A、指标数据引用
经常地编制公式的过程当中,需要使用另外一个指标的值,如果按照通常的做法,重新编写过这个指标显得很麻烦,因此有必要学习使用如何调用别的指标公式。 基本格式为:“指标.指标线”(参数)
a、指标和指标线之间用顿号分开,一个指标不一定只有一条指标线,所以有必要在指标后标注指标线的名称,但是如果缺失则表示引用最后一条指标线。
b、参数在表达式的末尾,必须用括号括起来,参数之间用逗号分开,通过参数设置可以选择设定该指标的参数,如果参数缺失则表示使用该指标的默认参数设置。
c、整个表达式用引号引在其中,除参数以外。 例如:
“MACD.DEF”(26,12,9):表示计算MACD指标的DEA指标线,计算参数为26、12、9; “MACD”(26,12,9):表示该指标的最后一条指标线,计算参数是26、12、9; “MACD”:表示该指标的最后一条指标线并且使用公式的默认参数。
B、跨周期引用指标数据
在金字塔当中允许使用不同分析周期上的指标数据,但是只能是向上引用,不能在原周期上使用比现在周期长度小的周期上的指标数据。
a、基本格式为:“指标.指标线#周期” (参数),格式上只是比上面指标引用多了一个周期设定,其他内容和方法一样,在周期调用上存在以下对应关系:
MIN1:1分钟 MIN5:5分钟......DAY:日线 WEEK:周线 MONTH:月线 YEAR:年线
如上所示,MIN1表示的分析周期为1分钟,那么只能是在当前周期为分笔成交图时才可以实现对该周期指标线数据的引用。
例如:当前周期为日线,那么在公式中使用“MACD.DEA#WEEK”(26,12,9)表示使用了当天所在的本周的MACD指标中的数据。
b、以上格式的扩展格式为:“指标.指标线##周期”(参数),该格式比基本格式采用了不同的对齐方式,简而言之,就是说“#”的格式调用的本周期所在的上一级周期的指标数据,那么“##”的格式则表示调用了前一种格式的前一周期的指标数据,举上例而言,“MACD.DEF##WEEK”(26,12,9)表示的是从当天看来的上一周的数据,而基本格式就是当天看来的本周的数据。
C、其他数据引用
使用以下的格式可以在当前的分析界面下引用大盘的数据或者其他个股的数据实现横向上的对比.
a、引用大盘数据引用大盘数据时使用下列函数:INDEXC/INDEXV,等等!
b、引用个股数据引用个股数据时使用下列格式:\品种代码$数据\,在以上格式当中调用CLOSE,VOL,AMOUNT等等!例如\表示000002该股本周期的成交量,\同样也可以表示为大盘本周期的收盘价,此时的大盘被视为一只个股。 1.3公式体构成结构 A、公式语句
所有的公式体由若干语句按照一定的格式组成,每个语句表示一个计算结果,根据各个语句的功能分为两大类语句,一类是赋值语句,一类是中间表达式。
B、赋值语句
6
在技术指标“B:A/Z”和“C:B*0.618”就是分别两条指标线,语言间用冒号隔开。该语句被称为赋值语句,在技术指标当中,赋值语句的计算结果将会被计算机执行并形成相应的图形。每个语句可以有一个名称,该名称写在语句的最前面,并用一个冒号将它与语句分隔开。例如:ST:MA(CLOSE,5);表示该语句求收盘价的五日均线,语句的名称为ST,在该语句后的语句中可以直接用ST来替代MA(CLOSE,5),例如:MA(ST,5)表示对收盘价的五日均线再求五日平均。
C、中间语句
一个语句如果不需要显示,可以将它定义为中间语句,例如在上例当中的第一句“A:=X+Y;”,这样该语句就不会被系统辨认为是指标线了,中间语句用“:=”替代冒号,其他与一般语句完全一样,使用中间语句可以有效降低公式的书写难度,还可以将需要重复使用的语句定义成中间语句以减少计算量。
每个公式最多可以分6个语句,中间公式数量没有限制,所有语句之间需要使用分号隔开。
D、公式计算符
公式计算符将函数连接成为公式,计算分为算术计算符和逻辑计算符。
a、算术计算符:
包括+、-、*、/、&,它们分别对计算符两边的数据进行加减乘除计算,这同一般意义上的算术计算没有差异。 其中&为字符串相加运算
b、逻辑计算符
包括>、<、<>、>=、<=、=、AND、OR八种,分别表示大于、小于、不等于、大于等于、小于等于、等于、逻辑与、逻辑或运算,如果条件成立计算结果就等于1,否则等于0,例如:3+4=7,4>3都等于1,3<=12就等于0,“逻辑与”表示两个条件都成立时结果才成立;“逻辑或”表示两个条件中只要有一个成立结果成立。
例如,4>3 AND 12>=4的结果等于1,4>3 OR 3>12的结果等于1。
注意:运算符的优先级直接决定了表达式执行的先后顺序,用户使用多个算术和逻辑运算符时,要注意运算符的优先级,如果不太确定,最好用括号把紧密的表达式括起来。 E、线形描述符
对于技术指标公式可以在语句加上线形描述符,用来表示如何画该语句描述的指标线。
线形描述符号包括以下7种。描述符写在语句后分号前,用逗号将它们与语句分隔开,例如在上例当中加入一句线形描述符,C:B*0.618,COLORSTICK;该语句在被执行时,会在图中添加色彩柱线,该功能在编制MACD等指标的时候会显出它的用处。
STICK:柱状线
COLORSTICK:彩色柱状线,当值为正时显示红色,否则显示绿色 COLORRED:为线形色,RED表示红色 COLORBLUE:为线形色,BLUE表示蓝色 COLORYELLOW:为线形色,YELLOW表示黄色
VOLSTICK:成交量柱状线,当股价上涨时显示红色空心柱,否则绿色 LINESTICK:同时画出柱状线和指标线 LINETHICK:对线体的粗细作出描述 CROSSDOT:小叉线 CIRCLEDOT:小圆圈线 POINTDOT:小圆点线
a、COLORRED等三个线形描述符还可以自定义颜色,格式为COLOR+“BBGGRR”;BB、GG、RR表示蓝色,绿色和红色的分量,每种颜色的取值范围是00-FF,采用了16进制,例如:MA5:MA(CLOSE,5),COLOR00FFFF表示纯红色与纯绿色的混合色;COLOR808000表示淡蓝色和淡绿色的混合色。
b、LINETHICK可以允许对线型的粗细进行自定义的描述,格式“LINETHICK+(0/7)”:参数的取值范围在0-7之间,“LINETHICK0”表示最细的线,而“LINETHICK7”表示最粗的线。
7
第二章 金字塔的控制语句
金字塔是个强大的脚本执行平台,除了我们在基础教程部分介绍的顺序执行语句外,可以执行带条件分支和循环以及无条件跳转都是金字塔的特色功能,金字塔的模型在工作时,由于内部运行机制不同,分为序列模式以及逐K线模式,我们这里先从序列模式介绍公式系统的运行机理,逐K线模式我们在后面会另有介绍。下面我们将逐步向大家介绍如何使用金字塔的控制语句编写模型。 2.1序列变量与数组
在金字塔的新公式系统的增加部分中,需要大量运用并区分数组、单值变量及序列变量的概念,这些概念也是进一步学习编程(比如编DLL)所必需的,因此有必要简单描述并初步掌握这些概念。 2.1.1常数与单值变量
常数,在金字塔中,就是不允许改变的数值,在我们平常写公式时,为了公式更加灵活,大量使用了参数,这些参数就是常数,不允许在公式中改变,比如参数n(1,1,25),表示参数n最小值是1、最大值是25、默认值是1,如果在公式中再写一行“n:=30;”就是非法的。
单值变量,即只有一个数值,不随时间而改变,比如“x:100;”,就是定义了一个单值变量x=100,这个值不随时间而改变,做成副图指标看,今天x是100明天x也是100,直到最后1根K线也是100,即副图指标是一条数值为100的水
平直线。
2.1.2数组
所谓数组,就是有序数据的集合
如{1,2,5,7,9}这样一组有先后顺序的数据,我们可以把它们定义成一个数组,例如定义为A,数组A就表示这组有序的数据,这里A就是数组的名称(即数组名)。
数组中的每1个数据,称之为数组中的一个元素,显然上面所说的数组A,第1个元素是1,第2个元素是2,第3个元素是5......,用A[1]、A[2]、A[3]......来表示,用方括号括起来的部分称之为下标,用下标来表示第几个元素。大家可以看出,在本例中,A[1]等于1,A[2]等于2,A[5]等于7,数组A共5个元素,我们就说数组A的长度是5。 上面所举的例子,数组的每一个元素是数值型的,称之为数值型数组,数组的每个元素也可以是字符串的,即字符串型数组。
一般来说,数组的使用,要先定义,然后初始化(即赋予数组的每个元素一个初始的数据)。在金字塔中,目前只支
8
持一维数组,并且下标是从1开始的。
在金字塔中,如何定义、初始化并使用数组?下面简单示例说明:
例1、在金字塔中,定义一个含10个元素的数值型数组 定义数组的语句是variable,公式代码如下:
variable:A[10]=0; //定义一个含10个元素的数值型数组A,并把所有元素初始化为0; 例2:定义一个3个元素的字符串型的数组 公式代码如下:
variable:B[3]='abc'; //定义一个含3个元素的字符串型数组B,并把所有元素初始化为'abc' 例3:把{1,3,5,7,9}定义为数组
分析:这组数据共有5个数值型数据,因此应定义长度为5的数组,并给每个元素赋值。公式代码如下:
variable:A[5]=0; A[1]:=1; A[2]:=3; A[3]:=5; A[4]:=7; A[5]:=9;
前面所举的关于数组例子,都是概念性的,单纯数组的应用一般都比较复杂,比如,从每天的分笔成交中统计,各个成交价位成交的笔数。等到后面讲完循环有机会时再写具体的代码。 2.1.3序列变量:
我们平时接触最多的是收盘价close,写一行代码“fc:close\fc,并把收盘价赋值给变量fc。这里变量fc就是序列变量,因为fc不是一个值,而是一序列随时间而变化的值(收盘价),在K线图中,从第1根K线到最后1根K线都有一个收盘价,因此fc跟单值变量不同,是由一系列的值组成的变量,因此我们称之为序列变量。事实上,把“fc:close”这行代码做成一个指标,就可以看出fc是一条变化的曲线而不是一条水平直线。
金字塔新的公式系统,可以把序列变量等同于一个数组,这是一个特殊的数组,这个数组的最小下标是从序列变量的起始有效位置开始,数组的最大下标是K线数量,其中K线的数量,可以从datacount函数得到。
比如“fc:close;\fc看成是一个下标从1开始直到datacount的数组。如果我们想知道第1、2、5、最后1根K线的收盘价,可以写成如下代码: 代码:
fc:=close;//定义一个序列变量,相当于是一个数组 k1:fc[1];//第1根K线的收盘价 k2:fc[2];//第2根K线的收盘价 k3:fc[5];//第5根K线的收盘价
k_end:fc[datacount];//最后1根K线的收盘价
2.2循环语句
金字塔的循环语句有两个类别,一个是 FOR TO ? ,另一个是REPEAT UNTIL ?,这里我们重点介绍FOR循环,REPEAT UNTIL的例子,用户请自行在金字塔软件函数列表中查看使用方法。 2.2.1 FOR递增循环
9
先从一个的实例开始,求当前股票收盘价的2日算术平均价,为了方便起见,以刚上市不久的600340国祥股价来说明,首先定义序列变量fc为收盘价,根据上一讲我们知道,fc可以看成是一个数组,因此,数组fc的每一个元素如下表所示: 600340 国祥股份 时间 收盘 fc[1] 2003/12/30 8.92 fc[2] 2003/12/31 8.96 fc[3] 2004/01/02 9.25 fc[4] 2004/01/05 9.64 fc[5] 2004/01/06 9.92 fc[6] 2004/01/07 9.74 fc[7] 2004/01/08 10.44 fc[8] 2004/01/09 9.99
显然, 2日平均收盘价必须是从第2根K线即上市后第2日开始,到最后一天结束,设2日平均股价用序列变量ma2来表示,由于2日平均收盘价等于当日收盘价加昨收盘除以2,如果手工一行一行来写代码计算,则: ma2[2]:=(fc[1]+fc[2])/2; //今收盘与昨收盘之和除以2,等于今2日平均收盘价 ma2[3]:=(fc[2]+fc[3])/2; ma2[4]:=(fc[3]+fc[4])/2; ma2[5]:=(fc[4]+fc[5])/2; ma2[6]:=(fc[5]+fc[6])/2; ma2[7]:=(fc[6]+fc[7])/2; ma2[8]:=(fc[7]+fc[8])/2;
分析上面代码,2日平均价的计算特点是: ① 从第2根K线开始计算的
② 每天的均价都等于(今收盘+昨收盘)/2 ③ 直到最后1根K线结束
容易知道,如果有1000根K线,则要写999行代码,显然效率太低了。 我们来找找规律,如果是中间的某天即第i天,则上面的表达式可以写为 ma2[i]:=(fc[i-1]+fc[i])/2;
这个i是从第2根K线开始直到最后1根K线。这些计算都是重复同样的计算,只不过i不同罢了。如果有一种方法,可以自动重复计算这些表达式,并且每重复一次,i自动增加1,就可以达到目的了。由此我们定义一种循环语句,可以自动循环、重复运行某一行代码。在金字塔中,循环语句有2种,下面先介绍FOR循环语句 语法:
FOR var=n1 TO n2 DO expr;
{从 var=n1 开始,直到 var=n2,开始循环执行 expr 语句,每执行一次var加1。这里,var称之为循环变量。} 用循环语句表达上面计算2日平均收盘价,公式代码如下: fc:=close; //定义序列变量fc为收盘价
for i=2 to datacount do ma2[i] : (fc[i-1]+fc[i])/2; //从i=2到i=datacount循环执行ma2[i] : (fc[i-1]+fc[i])/2
10