1、10.2基于后台预警和程式化交易的调试 54第十一章 VBS公式教程 5511.1嵌入式VBS、JS脚本 5511.2 VBS接口 5511.3利用VBS设计公式 55第十二章 自定义函数 5812.1自定义函数的格式 5912.2自定义函数的两种工作模式 59第十三章 DLL扩展函数程序调用接口 62第十四章 金字塔插件接口 62 本教程主要介绍金字塔的公式系统编写高级篇,重点介绍金字塔的新图表交易系统和后台程式化交易,本篇教程的读者需要有一定的金字塔PEL语言(金字塔简易语言简称PEL)编写经验,并且里面涉及到的部分功能需要标准版及其以上用户才可以使用。第一章 交易模型的编写规则我们在金字
2、塔的程式化交易初级教程里已经对公式模型编写有了一定程度的探讨,这里我们再进行一遍简单的回顾。在金字塔的主图分析界面,按功能键F3就会出现图4.1公式选择器的界面,图1.1公式选择器在“交易系统”上按鼠标右键,选“新建公式”,出现图1.2交易系统编辑器4.2交易系统编辑器通过该界面我们可以了解该系统的公式设定的内容和相关规则:A:每一个指标公式必须有一个名称,这个名称由字母和数字组成,公式名称在同类公式中必须是唯一的,例如不能同时存在两个AAA系统公式,公式名称最多16个字符。B:公式说明是一段文字,用来简单描述该公式的含义,在公式列表时显示这段文字,这段文字不宜过长。C:计算参数:计算参数用来
3、替代公式中所需要的常数,在使用时可以方便地调节参数,不必修改公式就可以对计算方法进行调节。计算参数包括参数名称、最小值、最大值、缺省值四个部分,参数名称用于标识参数,计算公式时采用缺省值计算,而最小值和最大值是参数的调整范围。D:公式编辑栏,本栏为公式编辑的文本区。E:密码保护,选中该栏目为指标公式加密。F:公式注释是一段文字,相对于公式描述而言它可以很长,主要用来描述一个公式如何使用、注意事项、计算方法等等。G:周期的设定:数据分析周期就是相邻两组数据的时间间隔,可能是从几秒、1分钟到1000天间的任意间隔;还可以是分笔成交分析周期,这种情况下时间间隔不定。公式系统的引用周期:应不同的使用者
4、在分析周期习惯上的差异,金字塔特别设定了周期选择。这主要是针对在引用类函数在引用数据时锁定自己所需要的周期,例如在日线上,或者在周线上等等的要求。H:费率设置和平仓止损,请用户一定根据要监控的品种填写好这里的费率设置,以防止在某些K线图上出现因为资金用尽而没有开平仓信号。所有的公式系统都是遵守统一的运算法则,统一的格式进行函数之间的计算,所以我们掌握了技术指标公式的基本原理,其他的公式也不会出脱其外。 例如我们在指标公式系统内写下公式(公式执行体的编写-包括各种符号-都要在英文状态输入法下,否则不被识别,测试时会报错): A:=X+Y; B:=A/Z;=B*0.618; 分析以上公式,我们可以
5、引出以下相关的格式和法则的结论:1.1数据引用A、数据来源 公式中的基本数据来源于接收的每日行情数据,这些数据有行情函数从数据库中按照一定的方式提取,例如,高开低收,成交量,成交额等等。B、数据类型 按照公式使用的数据类型,系统可以处理的数据分为两类:变量和常量。 所谓变量就是一个随着时间变化而变化的数据,例如成交量;常量就是一个永远不变的数据。例如3,每个函数需要的参数可能是变量也可能是常量,不能随便乱用,函数计算的结果一般是一个变量。 例如计算收盘价均线MA(CLOSE,5),MA函数要求第一个参数为变量,而CLOSE函数返回的正是一个变量;MA函数要求的第二个参数是常量,5就是一个常量,
6、所以我们就不能这样书写:MA(5,CLOSE)。1.2特殊数据引用 A、指标数据引用 经常地编制公式的过程当中,需要使用另外一个指标的值,如果按照通常的做法,重新编写过这个指标显得很麻烦,因此有必要学习使用如何调用别的指标公式。 基本格式为:“指标.指标线”(参数) a、指标和指标线之间用顿号分开,一个指标不一定只有一条指标线,所以有必要在指标后标注指标线的名称,但是如果缺失则表示引用最后一条指标线。b、参数在表达式的末尾,必须用括号括起来,参数之间用逗号分开,通过参数设置可以选择设定该指标的参数,如果参数缺失则表示使用该指标的默认参数设置。c、整个表达式用引号引在其中,除参数以外。例如:“M
7、ACD.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:周线 M
8、ONTH:月线 YEAR:年线 如上所示,MIN1表示的分析周期为1分钟,那么只能是在当前周期为分笔成交图时才可以实现对该周期指标线数据的引用。当前周期为日线,那么在公式中使用“MACD.DEA#WEEK”(26,12,9)表示使用了当天所在的本周的MACD指标中的数据。b、以上格式的扩展格式为:“指标.指标线#周期”(参数),该格式比基本格式采用了不同的对齐方式,简而言之,就是说“#”的格式调用的本周期所在的上一级周期的指标数据,那么“#”的格式则表示调用了前一种格式的前一周期的指标数据,举上例而言,“MACD.DEF#WEEK”(26,12,9)表示的是从当天看来的上一周的数据,而基本格式
9、就是当天看来的本周的数据。C、其他数据引用 使用以下的格式可以在当前的分析界面下引用大盘的数据或者其他个股的数据实现横向上的对比.a、引用大盘数据引用大盘数据时使用下列函数:INDEXC/INDEXV,等等!b、引用个股数据引用个股数据时使用下列格式:“品种代码数据”,在以上格式当中调用CLOSE,VOL,AMOUNT等等!例如“0002VOL”表示0002该股本周期的成交量,“1A0001CLOSE”同样也可以表示为大盘本周期的收盘价,此时的大盘被视为一只个股。1.3公式体构成结构 A、公式语句 所有的公式体由若干语句按照一定的格式组成,每个语句表示一个计算结果,根据各个语句的功能分为两大类
10、语句,一类是赋值语句,一类是中间表达式。B、赋值语句在技术指标“B:A/Z”和“C:B*0.618”就是分别两条指标线,语言间用冒号隔开。该语句被称为赋值语句,在技术指标当中,赋值语句的计算结果将会被计算机执行并形成相应的图形。每个语句可以有一个名称,该名称写在语句的最前面,并用一个冒号将它与语句分隔开。ST:MA(CLOSE,5);表示该语句求收盘价的五日均线,语句的名称为ST,在该语句后的语句中可以直接用ST来替代MA(CLOSE,5),例如:MA(ST,5)表示对收盘价的五日均线再求五日平均。C、中间语句 一个语句如果不需要显示,可以将它定义为中间语句,例如在上例当中的第一句“A:=X+
11、Y;”,这样该语句就不会被系统辨认为是指标线了,中间语句用“:=”替代冒号,其他与一般语句完全一样,使用中间语句可以有效降低公式的书写难度,还可以将需要重复使用的语句定义成中间语句以减少计算量。每个公式最多可以分6个语句,中间公式数量没有限制,所有语句之间需要使用分号隔开。D、公式计算符 公式计算符将函数连接成为公式,计算分为算术计算符和逻辑计算符。a、算术计算符:包括+、-、*、/、&,它们分别对计算符两边的数据进行加减乘除计算,这同一般意义上的算术计算没有差异。 其中&为字符串相加运算b、逻辑计算符包括、=、3都等于1,33 AND 12=4的结果等于1,43 OR 312的结果等于1。注
12、意:运算符的优先级直接决定了表达式执行的先后顺序,用户使用多个算术和逻辑运算符时,要注意运算符的优先级,如果不太确定,最好用括号把紧密的表达式括起来。E、线形描述符 对于技术指标公式可以在语句加上线形描述符,用来表示如何画该语句描述的指标线。 线形描述符号包括以下7种。描述符写在语句后分号前,用逗号将它们与语句分隔开,例如在上例当中加入一句线形描述符,C:B*0.618,COLORSTICK;该语句在被执行时,会在图中添加色彩柱线,该功能在编制MACD等指标的时候会显出它的用处。STICK:柱状线 COLORSTICK:彩色柱状线,当值为正时显示红色,否则显示绿色 COLORRED:为线形色,
13、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),COLOR00FFF
14、F表示纯红色与纯绿色的混合色;COLOR808000表示淡蓝色和淡绿色的混合色。b、LINETHICK可以允许对线型的粗细进行自定义的描述,格式“LINETHICK+(0/7)”:参数的取值范围在0-7之间,“LINETHICK0”表示最细的线,而“LINETHICK7”表示最粗的线。第二章 金字塔的控制语句金字塔是个强大的脚本执行平台,除了我们在基础教程部分介绍的顺序执行语句外,可以执行带条件分支和循环以及无条件跳转都是金字塔的特色功能,金字塔的模型在工作时,由于内部运行机制不同,分为序列模式以及逐K线模式,我们这里先从序列模式介绍公式系统的运行机理,逐K线模式我们在后面会另有介绍。下面我们
15、将逐步向大家介绍如何使用金字塔的控制语句编写模型。2.1序列变量与数组在金字塔的新公式系统的增加部分中,需要大量运用并区分数组、单值变量及序列变量的概念,这些概念也是进一步学习编程(比如编DLL)所必需的,因此有必要简单描述并初步掌握这些概念。2.1.1常数与单值变量常数,在金字塔中,就是不允许改变的数值,在我们平常写公式时,为了公式更加灵活,大量使用了参数,这些参数就是常数,不允许在公式中改变,比如参数n(1,1,25),表示参数n最小值是1、最大值是25、默认值是1,如果在公式中再写一行“n:=30;”就是非法的。单值变量,即只有一个数值,不随时间而改变,比如“x:100;”,就是定义了一
16、个单值变量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.,用A1、A2、A3.来表示,用方括号括起来的部分称之为下标,用下标来表示第几个元素。大家可以看出,在本例中,A1等于1,A2等于2
17、,A5等于7,数组A共5个元素,我们就说数组A的长度是5。上面所举的例子,数组的每一个元素是数值型的,称之为数值型数组,数组的每个元素也可以是字符串的,即字符串型数组。一般来说,数组的使用,要先定义,然后初始化(即赋予数组的每个元素一个初始的数据)。在金字塔中,目前只支持一维数组,并且下标是从1开始的。在金字塔中,如何定义、初始化并使用数组?下面简单示例说明:例1、在金字塔中,定义一个含10个元素的数值型数组定义数组的语句是variable,公式代码如下:variable:A10=0; /定义一个含10个元素的数值型数组A,并把所有元素初始化为0;例2:定义一个3个元素的字符串型的数组公式代码
18、如下:B3=abc; /定义一个含3个元素的字符串型数组B,并把所有元素初始化为例3:把1,3,5,7,9定义为数组分析:这组数据共有5个数值型数据,因此应定义长度为5的数组,并给每个元素赋值。公式代码如下:A5=0;A1:=1;A2:=3;A3:=5;A4:=7;A5:=9;前面所举的关于数组例子,都是概念性的,单纯数组的应用一般都比较复杂,比如,从每天的分笔成交中统计,各个成交价位成交的笔数。等到后面讲完循环有机会时再写具体的代码。2.1.3序列变量:我们平时接触最多的是收盘价close,写一行代码“fc:close,就是定义了一个变量fc,并把收盘价赋值给变量fc。这里变量fc就是序列变
19、量,因为fc不是一个值,而是一序列随时间而变化的值(收盘价),在K线图中,从第1根K线到最后1根K线都有一个收盘价,因此fc跟单值变量不同,是由一系列的值组成的变量,因此我们称之为序列变量。事实上,把“fc:close”这行代码做成一个指标,就可以看出fc是一条变化的曲线而不是一条水平直线。金字塔新的公式系统,可以把序列变量等同于一个数组,这是一个特殊的数组,这个数组的最小下标是从序列变量的起始有效位置开始,数组的最大下标是K线数量,其中K线的数量,可以从datacount函数得到。比如“fc:close;,这行代码,可以把fc看成是一个下标从1开始直到datacount的数组。如果我们想知道
20、第1、2、5、最后1根K线的收盘价,可以写成如下代码:代码:fc:=close;/定义一个序列变量,相当于是一个数组k1:fc1;/第根K线的收盘价k2:fc2;/第2根K线的收盘价k3:fc5;/第5根K线的收盘价k_end:fcdatacount;/最后1根K线的收盘价2.2循环语句金字塔的循环语句有两个类别,一个是 FOR TO ,另一个是REPEAT UNTIL ,这里我们重点介绍FOR循环,REPEAT UNTIL的例子,用户请自行在金字塔软件函数列表中查看使用方法。2.2.1 FOR递增循环先从一个的实例开始,求当前股票收盘价的2日算术平均价,为了方便起见,以刚上市不久的60034
21、0国祥股价来说明,首先定义序列变量fc为收盘价,根据上一讲我们知道,fc可以看成是一个数组,因此,数组fc的每一个元素如下表所示:600340 国祥股份 时间 收盘fc1 2003/12/30 8.92fc2 2003/12/31 8.96fc3 2004/01/02 9.25fc4 2004/01/05 9.64fc5 2004/01/06 9.92fc6 2004/01/07 9.74fc7 2004/01/08 10.44fc8 2004/01/09 9.99显然, 2日平均收盘价必须是从第2根K线即上市后第2日开始,到最后一天结束,设2日平均股价用序列变量ma2来表示,由于2日平均收盘
22、价等于当日收盘价加昨收盘除以2,如果手工一行一行来写代码计算,则:ma22:=(fc1+fc2)/2; /今收盘与昨收盘之和除以2,等于今2日平均收盘价ma23:=(fc2+fc3)/2;ma24:=(fc3+fc4)/2;ma25:=(fc4+fc5)/2;ma26:=(fc5+fc6)/2;ma27:=(fc6+fc7)/2;ma28:=(fc7+fc8)/2;分析上面代码,2日平均价的计算特点是: 从第2根K线开始计算的 每天的均价都等于(今收盘+昨收盘)/2 直到最后1根K线结束容易知道,如果有1000根K线,则要写999行代码,显然效率太低了。我们来找找规律,如果是中间的某天即第i天
23、,则上面的表达式可以写为ma2i:=(fci-1+fci)/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日平均收盘价,公式代码如下: /定义序列
24、变量fc为收盘价for i=2 to datacount do ma2i : (fci-1+fci)/2;/从i=2到i=datacount循环执行ma2i : (fci-1+fci)/22.2.2 FOR递减循环上面的FOR循环,循环变量是每次递增1,可称之为递增FOR循环。还有一种FOR循环是递减FOR循环,循环变量是每次递减1,语法如下:FOR var=n1 DOWNTO n2 DO expr2;从 var=n1 开始到 var=n2 开始循环执行 expr 语句,每执行一次var减1上面我们设计2日平均收盘价的公式时,是从前面往后面计算的,仔细想想,其实也可以从后面往前面计算,公式代码
25、如下:for i=datacount downto 2 do ma2i :2.2.3设置序列变量下界语句原因是我们把ma2定义成序列值收盘价,在上面的循环代码中,只是从第2根K线开始计算均价,第1根K线的位置没有计算,仍然保留了原来收盘价的数值。怎样去掉第1根K线位置的数值,使得ma2的起始有效位置是从第2根K线开始的?使用下面的语句就可以实现:设置序列变量下界(有效数据起始下标),函数返回序列下界用法:SETLBOUND(X,N),设置序列变量X的下界(最小下标),N为0或N超过上界则整个序列数据都无效例如:VAR1:C;n1:=SETLBOUND(VAR1,10);用“设置序列变量下界”语
26、句setlbound(x,n),改写上面的公式,代码如下:ma2: /定义序列变量ma2等于收盘价aa:=setlbound(ma2,2); /设置序列变量ma2的下界为2,起始有效位置是从第2根K线开始for i=datacount downto 2 do ma2i:(fci-1+fci)/2;2.2.4复合语句复合语句注释:把多条语句看作一条语句语法:BEGIN.END 这里,begin和end是成对出现的,被begin和end包围起来的语句可以有很多条,这些语句可以看成是一条复合语句。下面我们用beginend来改写递增循环计算2日平均收盘价的公式: /定义序列变量为收盘价for i=2
27、 to datacount dobegin a:= fci-1+fci; /定义一个临时的单值变量a,保存中间计算结果 ma2i : a/2;end;这段代码,就是由2行代码组成的复合语句,被循环执行若干次。为了代码容易分辨,我们特别把复合语句中的2行代码,都向右缩了4格,表明这是2行复合语句,是被循环语句所控制的。以前对于这类分层次的语句,都要进行缩格,便于看懂代码,特别是复杂的代码,如果不进行缩格,时间久了,恐怕连自己都很难看懂,大家一开始就要养成好习惯。有人会问,书写代码不缩格行吗?不缩格公式会不会出错?答案是,缩格书写代码,仅仅是为了方便看清程序代码的逻辑层次,对公式的运行没有影响。有了复合语句,循环的功能就更加强大了,可以轻松实现多重循环,即循环中套循环。在计算N日的平均价时会用到,如果事先不知道N是多少,就要用到二重循环。对于循环中要执行的语句,如果重复太多,也可以使用多重循环来简化。以二重循环为例,大致结构如下:for i=n1 to n2 do 语句; for j=m1 to m2 do begin end;2.3条件语句条件语句的语法如下:IF条件语句IF cond THEN expr1 ELSE expr2如果 cond 条件成立,则
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1