金字塔程式化交易设计指南高级篇2文档格式.docx
《金字塔程式化交易设计指南高级篇2文档格式.docx》由会员分享,可在线阅读,更多相关《金字塔程式化交易设计指南高级篇2文档格式.docx(80页珍藏版)》请在冰豆网上搜索。
=B*0.618;
分析以上公式,我们可以引出以下相关的格式和法则的结论:
1.1数据引用
A、数据来源
公式中的基本数据来源于接收的每日行情数据,这些数据有行情函数从数据库中按照一定的方式提取,例如,高开低收,成交量,成交额等等。
B、数据类型
按照公式使用的数据类型,系统可以处理的数据分为两类:
变量和常量。
所谓变量就是一个随着时间变化而变化的数据,例如成交量;
常量就是一个永远不变的数据。
例如3,每个函数需要的参数可能是变量也可能是常量,不能随便乱用,函数计算的结果一般是一个变量。
例如计算收盘价均线MA(CLOSE,5),MA函数要求第一个参数为变量,而CLOSE函数返回的正是一个变量;
MA函数要求的第二个参数是常量,5就是一个常量,所以我们就不能这样书写:
MA(5,CLOSE)。
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等等!
例如"
SZ000002$VOL"
表示000002该股本周期的成交量,"
SH000001$CLOSE"
同样也可以表示为大盘本周期的收盘价,此时的大盘被视为一只个股。
1.3公式体构成结构
A、公式语句
所有的公式体由若干语句按照一定的格式组成,每个语句表示一个计算结果,根据各个语句的功能分为两大类语句,一类是赋值语句,一类是中间表达式。
B、赋值语句
在技术指标“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>
3AND12>
=4的结果等于1,4>
3OR3>
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”表示最粗的线。
第二章金字塔的控制语句
金字塔是个强大的脚本执行平台,除了我们在基础教程部分介绍的顺序执行语句外,可以执行带条件分支和循环以及无条件跳转都是金字塔的特色功能,金字塔的模型在工作时,由于内部运行机制不同,分为序列模式以及逐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。
上面所举的例子,数组的每一个元素是数值型的,称之为数值型数组,数组的每个元素也可以是字符串的,即字符串型数组。
一般来说,数组的使用,要先定义,然后初始化(即赋予数组的每个元素一个初始的数据)。
在金字塔中,目前只支持一维数组,并且下标是从1开始的。
在金字塔中,如何定义、初始化并使用数组?
下面简单示例说明:
例1、在金字塔中,定义一个含10个元素的数值型数组
定义数组的语句是variable,公式代码如下:
variable:
A[10]=0;
//定义一个含10个元素的数值型数组A,并把所有元素初始化为0;
例2:
定义一个3个元素的字符串型的数组
公式代码如下:
B[3]='
abc'
;
//定义一个含3个元素的字符串型数组B,并把所有元素初始化为'
例3:
把{1,3,5,7,9}定义为数组
分析:
这组数据共有5个数值型数据,因此应定义长度为5的数组,并给每个元素赋值。
公式代码如下:
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循环语句
金字塔的循环语句有两个类别,一个是FORTO…,另一个是REPEATUNTIL…,这里我们重点介绍FOR循环,REPEATUNTIL的例子,用户请自行在金字塔软件函数列表中查看使用方法。
2.2.1FOR递增循环
先从一个的实例开始,求当前股票收盘价的2日算术平均价,为了方便起见,以刚上市不久的600340国祥股价来说明,首先定义序列变量fc为收盘价,根据上一讲我们知道,fc可以看成是一个数组,因此,数组fc的每一个元素如下表所示:
600340国祥股份
时间收盘
fc[1]2003/12/308.92
fc[2]2003/12/318.96
fc[3]2004/01/029.25
fc[4]2004/01/059.64
fc[5]2004/01/069.92
fc[6]2004/01/079.74
fc[7]2004/01/0810.44
fc[8]2004/01/099.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循环语句
语法:
FORvar=n1TOn2DOexpr;
{从var=n1开始,直到var=n2,开始循环执行expr语句,每执行一次var加1。
这里,var称之为循环变量。
}
用循环语句表达上面计算2日平均收盘价,公式代码如下:
//定义序列变量fc为收盘价
fori=2todatacountdoma2[i]:
(fc[i-1]+fc[i])/2;
//从i=2到i=datacount循环执行ma2[i]:
(fc[i-1]+fc[i])/2
2.2.2FOR递减循环
上面的FOR循环,循环变量是每次递增1,可称之为递增FOR循环。
还有一种FOR循环是递减FOR循环,循环变量是每次递减1,语法如下:
FORvar=n1DOWNTOn2DOexpr2;
{从var=n1开始到var=n2开始循环执行expr语句,每执行一次var减1}
上面我们设计2日平均收盘价的公式时,是从前面往后面计算的,仔细想想,其实也可以从后面往前面计算,公式代码如下:
fori=datacountdownto2doma2[i]:
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);
用“设置序列变量下界”语句setlbound(x,n),改写上面的公式,代码如下:
ma2:
//定义序列变量ma2等于收盘价
aa:
=setlbound(ma2,2);
//设置序列变量ma2的下界为2,起始有效位置是从第2根K线开始
fori=datacountdownto2doma2[i]:
(fc[i-1]+fc[i])/2;
2.2.4复合语句
复合语句注释:
把多条语句看作一条语句
语法:
BEGIN...END
这里,begin和end是成对出现的,被begin和end包围起来的语句可以有很多条,这些语句可以看成是一条复合语句。
下面我们用begin…end来改写递增循环计算2日平均收盘价的公式:
//定义序列变量为收盘价
fori=2todatacountdo
begin
a:
=fc[i-1]+fc[i];
//定义一个临时的单值变量a,保存中间计算结果
ma2[i]:
a/2;
end;
这段代码,就是由2行代码组成的复合语句,被循环执行若干次。
为了代码容易分辨,我们特别把复合语句中的2行代码,都向右缩了4格,表明这是2行复合语句,是被循环语句所控制的。
以前对于这类分层次的语句,都要进行缩格,便于看懂代码,特别是复杂的代码,如果不进行缩格,时间久了,恐怕连自己都很难看懂,大家一开始就要养成好习惯。
有人会问,书写代码不缩格行吗?
不缩格公式会不会出错?
答案是,缩格书写代码,仅仅是为了方便看清程序代码的逻辑层次,对公式的运行没有影响。
有了复合语句,循环的功能就更加强大了,可以轻松实现多重循环,即循环中套循环。
在计算N日的平均价时会用到,如果事先不知道N是多少,就要用到二重循环。
对于循环中要执行的语句,如果重复太多,也可以使用多重循环来简化。
以二重循环为例,大致结构如下:
fori=n1ton2do
语句;
…
forj=m1tom2do
begin
end;
2.3条件语句
条件语句的语法如下:
IF条件语句
IFcondTHENexpr1ELSEexpr2
如果cond条件成立,则执行语句expr1,否则执行expr2语句。
说明:
1、在条件判断比较简单的情况下,ELSEexpr2子句可以省略。
2、条件cond可以是单值变量,也可以为序列变量。
当为序列变量时,cond将取最后一个周期的值做为条件判断语句。
条件语句的语法比较简单,但使用时却容易出错,下面举若干示例。
例1:
修改成交量公式VOL,当流通盘不为零且当前周期为日以上周期时,显示换手率,代码参考如下(仿此,大家绕过指标模组,可以自行设计,“绑定”到周期、券种等的公式)
VOL,VOLSTICK;
MA1:
MA(VOL,M1);
MA2:
MA(VOL,M2);
MA3:
MA(VOL,M3);
ifcapital>
0andDATATYPE>
=6then
换手率:
vol/capital;
//日以上周期及非指数个股,显示换手率
当切换到60分钟及以下周期,或者切换到大盘(此时流通盘=0),会发现“换手率”指标线、名称及数值都不显示。
以上是较简单的情况,没有使用ELSEexpr2子句。
上面代码稍加改进,使用复合语句,使之适用于任意周期:
例2,修改成交量公式,流通盘不为0时,显示换手率(60分钟及以下周期,计算当日最新的换手率),代码参考如下:
IFCAPITAL>
0then//如果换手率>0,则
IFDATATYPE>
=6then//如果周期为日及以上的较长周期,则
b:
=VOL/CAPITAL*100;
else//否则
begin//复合语句开始,即以下3条语句,视为1条语句,end表示复合语句结束