为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

金字塔程式化交易设计指南--高级篇

2012-05-01 50页 doc 1MB 49阅读

用户头像

is_662875

暂无简介

举报
金字塔程式化交易设计指南--高级篇 目 录 4第一章 交易模型的编写规则 51.1数据引用 61.2特殊数据引用 71.3公式体构成结构 8第二章 金字塔的控制语句 82.1序列变量与数组 102.2循环语句 122.3条件语句 14第三章 序列模式和逐K线模式 153.1控制语句在两种不同模式下的运行特点 163.2关于模型运行时这两种模式的选择 17第四章 金字塔的新交易系统 174.1下单模型语句 174.2简单交易系统示例 184.3复杂交易系统示例 20第五章 新交易系统的函数 23...
金字塔程式化交易设计指南--高级篇
目 录 4第一章 交易模型的编写规则 51.1数据引用 61.2特殊数据引用 71.3公式体构成结构 8第二章 金字塔的控制语句 82.1序列变量与数组 102.2循环语句 122.3条件语句 14第三章 序列模式和逐K线模式 153.1控制语句在两种不同模式下的运行特点 163.2关于模型运行时这两种模式的选择 17第四章 金字塔的新交易系统 174.1下单模型语句 174.2简单交易系统示例 184.3复杂交易系统示例 20第五章 新交易系统的函数 235.1快速入门 265.2常见问题 27第六章 交易系统编写范例和常见问题 276.1趋势类交易模型编写范例 336.2振荡类交易模型编写范例 346.3日内交易模型编写范例 366.4常见问题 38第七章 金字塔的后台程式化交易 397.1程式化交易系统的函数 417.2程式化交易函数 437.3程式化交易执行语句常用的其它函数 447.4账户函数介绍 46第八章 三种交易函数的区别 478.1普通图表交易函数 478.2新图表交易函数 488.3后台交易函数 48第九章 图表交易和后台交易的主要区别和联系 489.1联系 499.2区别 49第十章 程式化交易测试和优化 4910.1完整交易系统的组成 5010.2测试平台的基本内容和架构 5110.3金字塔的图表程式化交易和后台程式化交易的结构 5310.4程式化交易的前提、 55第十一章 程序化交易的启用 5511.1启动图表交易 5511.2启动后台程式化交易 57第十二章 公式系统的编写调试 5712.1PEL语言的模块化编程 5912.2基于图表公式的调试 6112.3金字塔的公式调试器的使用 6212.4基于后台预警和程式化交易的调试 64第十三章 VBS公式教程 6413.1嵌入式VBS、JS脚本 6413.2 VBS接口 6513.3利用VBS公式 67第十四章 自定义函数 6814.1自定义函数的格式 6814.2自定义函数的两种工作模式 70第十五章 DLL扩展函数程序调用接口 70第十六章 金字塔插件接口 本教程主要介绍金字塔的公式系统编写高级篇,重点介绍金字塔的新图表交易系统和后台程式化交易,本篇教程的读者需要有一定的金字塔PEL语言(金字塔简易语言简称PEL)编写经验,并且里面涉及到的部分功能需要版及其以上用户才可以使用。 第一章 交易模型的编写规则 我们在金字塔的程式化交易初级教程里已经对公式模型编写有了一定程度的探讨,这里我们再进行一遍简单的回顾。 在金字塔决策交易系统的图形分析界面,按Shift+W快捷键就会出现公式系统管理面板,然后在“交易系统”按鼠标右键, 图1.1公式选择器 选“新建公式”,出现图1.2交易系统编辑器 4.2交易系统编辑器 通过该界面我们可以了解该系统的公式设定的内容和相关规则: A:每一个指标公式必须有一个名称,这个名称由字母和数字组成,公式名称在同类公式中必须是唯一的,例如不能同时存在两个AAA系统公式,公式名称最多16个字符。 B:公式说明是一段文字,用来简单描述该公式的含义,在公式列表时显示这段文字,这段文字不宜过长。 C:计算参数:计算参数用来替代公式中所需要的常数,在使用时可以方便地调节参数,不必修改公式就可以对计算进行调节。计算参数包括参数名称、最小值、最大值、缺省值四个部分,参数名称用于标识参数,计算公式时采用缺省值计算,而最小值和最大值是参数的调整范围。 D:公式编辑栏,本栏为公式编辑的文本区。 E:密码保护,选中该栏目为指标公式加密。 F:公式注释是一段文字,相对于公式描述而言它可以很长,主要用来描述一个公式如何使用、注意事项、计算方法等等。 G:周期的设定:数据分析周期就是相邻两组数据的时间间隔,可能是从几秒、1分钟到1000天间的任意间隔;还可以是分笔成交分析周期,这种情况下时间间隔不定。 公式系统的引用周期:应不同的使用者在分析周期习惯上的差异,金字塔特别设定了周期选择。这主要是针对在引用类函数在引用数据时锁定自己所需要的周期,例如在日线上,或者在周线上等等的要求。 H:费率设置和平仓止损,请用户一定根据要监控的品种填写好这里的费率设置,以防止在某些K线图上出现因为资金用尽而没有开平仓信号。 所有的公式系统都是遵守统一的运算法则,统一的格式进行函数之间的计算,所以我们掌握了技术指标公式的基本原理,其他的公式也不会出脱其外。 例如我们在指标公式系统内写下公式(公式执行体的编写--包括各种符号--都要在英文状态输入法下,否则不被识别,测试时会报错): A:=X+Y; B:=A/Z;  C:=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)表示的是从当天看来的上一周的数据,而基本格式就是当天看来的本周的数据。 注意: 金字塔的在用户翻看一个品种时是可以自动补数据的,但是无法自动补被引用品种的或者该品种不同周期的数据,在首次使用金字塔或者在不确定被引用数据是否齐全时,请手工进行数据补充工作,手工补充数据方法:http://www.weistock.com/download/receivedata.jpg。您也可以先浏览一下该品种的对应周期K线数据是否完整。 如果是开盘后才连上服务器,软件一打开,就先翻看所需合约要引用的K线数据—如5分钟K线数据.以保证对应合约所在周期数据的完整性;盘中,只要服务器是一直连接良好的,对应周期数据就是齐全的. 跨周期引用指标基本格式----"指标.指标线#周期"(参数); 跨周期引用指标扩展格式----"指标.指标线##周期"(参数); 关于如何使用“##”来引用其他指标周期问题的示例 示例1: 第一步:新建一个指标,命名为H,在H中写入下面这句代码 H1:high; L1:low; 第二步:新建第二个指标,命名为TEST,在TEST中写入下面代码: preDayHigh:"H.H1##day"; //昨日最高价 preDayLOW:"H.L1##day"; //昨日最低价 第三步:将指标“TEST”运行应用于盘面,您将在K线图上看到该品种昨日最高价和昨日最低价。 金字塔还提供了STKINDI函数----引用任意品种任意周期的任意指标输出,具体可参考第12章第1节模块化编程,里面对该函数及其使用有详细描述。 C、其他数据引用 使用以下的格式可以在当前的分析界面下引用大盘的数据或者其他个股的数据实现横向上的对比. a、引用大盘数据引用大盘数据时使用下列函数:INDEXC/INDEXV,等等! b、引用个股数据引用个股数据时使用下列格式:"品种代码$数据",在以上格式当中调用CLOSE,VOL,AMOUNT等等!例如"SZ000002$VOL"表示000002该股本周期的成交量,"SH000001$CLOSE"同样也可以表示为大盘本周期的收盘价,此时的大盘被视为一只个股。 金字塔还提供了CALLSTOCK函数—可引用其他证券或合约的部分基础数据,具体请参考金字塔软件自带的函数列表里的函数说明。 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>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”表示最粗的线。 第二章 金字塔的控制语句 金字塔是个强大的脚本执行平台,除了我们在基础教程部分介绍的顺序执行语句外,可以执行带条件分支和循环以及无条件跳转都是金字塔的特色功能,金字塔的模型在工作时,由于内部运行机制不同,分为序列模式以及逐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个元素的字符串型的数组   公式代码如下: 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递增循环 先从一个的实例开始,求当前股票收盘价的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   2.2.2 FOR递减循环 上面的FOR循环,循环变量是每次递增1,可称之为递增FOR循环。还有一种FOR循环是递减FOR循环,循环变量是每次递减1,语法如下: FOR var=n1 DOWNTO n2 DO expr2; {从 var=n1 开始到 var=n2 开始循环执行 expr 语句,每执行一次var减1} 上面我们设计2日平均收盘价的公式时,是从前面往后面计算的,仔细想想,其实也可以从后面往前面计算,公式代码如下: fc:=close; for i=datacount downto 2 do ma2[i] : (fc[i-1]+fc[i])/2; 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:=close; //定义序列变量ma2等于收盘价 aa:=setlbound(ma2,2); //设置序列变量ma2的下界为2,起始有效位置是从第2根K线开始 fc:=close; for i=datacount downto 2 do ma2[i]:(fc[i-1]+fc[i])/2; 2.2.4复合语句 复合语句注释: 把多条语句看作一条语句 语法:BEGIN...END 这里,begin和end是成对出现的,被begin和end包围起来的语句可以有很多条,这些语句可以看成是一条复合语句。 下面我们用begin…end来改写递增循环计算2日平均收盘价的公式: fc:=close; //定义序列变量为收盘价 for i=2 to datacount do begin a:= fc[i-1]+fc[i]; //定义一个临时的单值变量a,保存中间计算结果 ma2[i] : a/2; end; 这段代码,就是由2行代码组成的复合语句,被循环执行若干次。为了代码容易分辨,我们特别把复合语句中的2行代码,都向右缩了4格,表明这是2行复合语句,是被循环语句所控制的。以前对于这类分层次的语句,都要进行缩格,便于看懂代码,特别是复杂的代码,如果不进行缩格,时间久了,恐怕连自己都很难看懂,大家一开始就要养成好习惯。 有人会问,书写代码不缩格行吗?不缩格公式会不会出错?答案是,缩格书写代码,仅仅是为了方便看清程序代码的逻辑层次,对公式的运行没有影响。 有了复合语句,循环的功能就更加强大了,可以轻松实现多重循环,即循环中套循环。在计算N日的平均价时会用到,如果事先不知道N是多少,就要用到二重循环。对于循环中要执行的语句,如果重复太多,也可以使用多重循环来简化。以二重循环为例,大致结构如下: for i=n1 to n2 do begin 语句; … for j=m1 to m2 do begin 语句; … end; 语句; … end; 2.3条件语句 条件语句的语法如下: IF条件语句 语法:IF cond THEN expr1 ELSE expr2 如果 cond 条件成立,则执行语句 expr1,否则执行 expr2 语句。 说明:   1、在条件判断比较简单的情况下,ELSE expr2 子句可以省略。   2、条件 cond 可以是单值变量,也可以为序列变量。当为序列变量时,cond将取最后一个周期的值做为条件判断语句。   条件语句的语法比较简单,但使用时却容易出错,下面举若干示例。   例1:修改成交量公式VOL,当流通盘不为零且当前周期为日以上周期时,显示换手率,代码参考如下(仿此,大家绕过指标模组,可以自行设计,“绑定”到周期、券种等的公式) 代码: VOL,VOLSTICK; MA1:MA(VOL,M1); MA2:MA(VOL,M2); MA3:MA(VOL,M3); if capital>0 and DATATYPE>=6 then 换手率:vol/capital; //日以上周期及非指数个股,显示换手率 当切换到60分钟及以下周期,或者切换到大盘(此时流通盘=0),会发现“换手率”指标线、名称及数值都不显示。   以上是较简单的情况,没有使用 ELSE expr2 子句。上面代码稍加改进,使用复合语句,使之适用于任意周期:   例2,修改成交量公式,流通盘不为0时,显示换手率(60分钟及以下周期,计算当日最新的换手率),代码参考如下: 代码: VOL,VOLSTICK; MA1:MA(VOL,M1); MA2:MA(VOL,M2); MA3:MA(VOL,M3); IF CAPITAL>0 then //如果换手率>0,则 IF DATATYPE>=6 then //如果周期为日及以上的较长周期,则 b:=VOL/CAPITAL*100; else //否则 begin //复合语句开始,即以下3条语句,视为1条语句,end表示复合语句结束 tj:=DAY>REF(DAY,1) or BARSSINCE(CLOSE)=0; ts:=BARSLAST(tj)+1; b:=SUM(VOL,ts)/CAPITAL*100; end; 换手率:b;   例3、通过参数N,控制调整均线数,代码参考如下: 代码: input:p1(5,0,300),p2(10,0,300),p3(20,0,300),p4(30,0,300),n(4,1,4);{参数定义} IF n>0 then MA1:MA(CLOSE,P1);{如果n>=1则输出ma1指标线} IF n>1 then MA2:MA(CLOSE,P2);{如果n>=2则输出ma1指标线} IF n>2 then MA3:MA(CLOSE,P3);{如果n>=3则输出ma1指标线} IF n>3 then MA4:MA(CLOSE,P4);{如果n>=4则输出ma1指标线}   在使用条件语句“IF cond THEN”中,序列模式下,cond如果是序列变量,那么IF语句只取最后序列值做为条件判断,比如: 代码: fc:=close; fo:=open; if fc>fo then //这里的fc、fo是序列变量,因此只取最后一个周期的条件做为判断依据 xx:=1; else xx:=0; y:xx;   这里,if fc>fo then 这种写法的本意是,“如果收盘价大于开盘价则”,是针对序列变量的每个数据(相当于数组的每个元素),但是在序列模式下是不会得到执行结果的,在金字塔的序列模式运行中,正确的写法应该是这样的: 代码: //如果xx是序列变量,则代码参考如下 fc:=close; fo:=open; for i=1 to datacount do begin if fc[i]>fo[i] then xx[i]:=1; //请注意这里跟上面代码的不同 else xx[i]:=0; end y:xx; 第三章 序列模式和逐K线模式 金字塔公式系统工作两种模式,即序列和逐K线两种模式。序列模式公式系统每次刷新时解析公式按照序列或者常数计算返回结果,整个执行过程只解析一遍公式系统,我们前面所讲的控制语句的用法都是基于序列模式下运行的。逐K线模式为从第1个K线直到最后一个K线逐个解析公式系统,每根K线都会解析整个公式系统一遍,返回值也只有数值类型这一种,故这种模式运行时效率要比序列模式低,但此种模式下由于是逐根周期执行运算的,故我们可以在编写公式时使用各种更加灵活的控制语法。 3.1控制语句在两种不同模式下的运行特点     逐K线计算时,控制语句比如IF THEN ,FOR 等语句工作机制是每周期都去执行一次,因此在逐K线模式下,可以利用这种灵活的模式来设计我们的策略,比如加仓、减仓、资金管理策略等等。     序列模式计算时,控制语句条件允许使用序列变量,由于序列模式只执行一次控制语句解析,对于序列变量,仅取最后一个数据做为条件判断。 如:前面我们在序列模式下无法正常工作的公式 fc:=close; fo:=open; if fc>fo then //这里的fc、fo是序列变量,因此只取最后一个周期的条件做为判断依据 xx:=1 else xx:=0; 但是在逐K线模式下,该公式是可以正常工作的。因为逐K线每根K线都得到了执行,故不需要向序列运行那样在后面用FOR循环重新赋值一遍了。 为了更能说明金字塔两种模式下的公式运行特点,特制作一个计算移动平均线的公式,如下: //用于序列模式下运行的公式: INPUT:N(5,2,500);      //参数申明 RUNMODE:1;              //运行于序列模式 VARIABLE:I=0,S=0; VAR1:=C;//变量申明 FOR J=1 TO DATACOUNT DO BEGIN  S:=S+VAR1[J];  IF J>=N THEN BEGIN   IF J>N THEN     S:=S-VAR1[J-N];   MA1[J]:S/N;        //实现MA(C,N)   I:=0;  END; END; 上述公式使用序列模式运行,但是如果在逐K线模式下运行上述公式就会变得异常缓慢,由于金字塔逐K线模式在每个周期上都要执行一遍这样的循环,效率自然就变得非常低了。鉴于金字塔的特点,如果将上述公式改进一下,则可以高效的在序列和逐K线模式同时高效运行,公式如下:   INPUT:N(5,2,500);      //参数申明 VARIABLE:I=0,S=0;     //全局变量申明 VAR1:=C; //金字塔下放在这里的变量为序列赋值 //为了加快运算速度,只有最后一个周期时才循环计算 IF NOT(ISLASTBAR) THEN EXIT; FOR J=1 TO DATACOUNT DO BEGIN  S:=S+VAR1[J];  IF J>=N THEN BEGIN   IF J>N THEN     S:=S-VAR1[J-N];   MA1[J]:S/N;        //实现MA(C,N)   I:=0;  END; END;  上述公式中增加了 IF NOT(ISLASTBAR) 判断是否最后一个周期的指令,在逐K线模式下,由于是判断到最后一个周期才执行的下面循环,故效率是非常高的。对于序列模式,由于同样使用了ISLASTBAR控制,故符合控制语句取最后一个数据的特点,所以该公式同时可以在两种模式下得到正确执行。   为了更能说明逐K线的运行特点,计算移动平均线的公式还可以这样写 INPUT:N(5,2,500);      //参数申明 RUNMODE:0;            //工作于逐K线模式 IF BARPOS <= N THEN //从计算周期开始计算  EXIT;   MA1:C; FOR J=1 TO N-1 DO  MA1:=MA1+CLOSE[BARPOS-J]; MA1:=MA1/N; 这样的公式即保证了效率,也可以使编写公式的复杂程度大大降低,提高了公式的可读性 另外逐K线模式下运行的代码,还可以配合使用GOGO语句以及EXIT指令,控制语句的执行流程,达到各种复杂的逻辑运算要求。 3.2关于模型运行时这两种模式的选择 我们在模型运行时尤其是新手用户往往面对如何选择这两种运行模式纠结,在通常情况下,我们推荐用户在序列模式下运行你的公式系统,因为这样会有很高的执行效率,只有在序列模式下无法表达编写出你的策略时,再考虑使用逐K线模式,因为逐K线可以精细的控制每跟K线周期的动作,所以灵活性较高,可以完成多数序列模式下无法完成的事情。 建义如下:在普通技术指标,选股指标,简单的图表程式化交易,以及公式中涉及到BACKSET、REFX等未来函数调用等,推荐使用序列模式;用户需要精细控制K线周期的操作时例如资金头寸管理、止损操作等,推荐使用逐K线模式。简单一句话,如果是指标交易,那么使用序列模式,算法交易,使用逐K线模式。 第四章 金字塔的新交易系统 使用传统的ENTERLONG程式化交易信号做出的自动交易策略,存在着例如无法进行头寸管理,灵活性不够的缺点,为了对介入价位和仓位进行精确的控制,譬如海龟交易法的头寸管理.,需要金字塔提供扩展性更为强大的程式化交易模式,为此提供了一系列的功能和众多交易函数。这些函数用户可以在公式函数列表的“交易系统”组里找到.但是需要注意的是金字塔的新交易系统,是不能与旧的交易系统比如ENTERLONG混用的.金字塔的新交易系统采取的虚拟仓位和资金在图表做显示和模拟交易的,也就是说新图表交易系统的交易操作是按照预先我们在公式属性里设定的资金来进行的,与用户的实际资金和持仓没有任何关系。因此使用之前用户需要在公式属性里将资金和费率设置正确,以确保能更加贴近实战.真实自动交易时,在图表出现信号后系统将根据交易指令发出的交易类型和价格以及数量,按照同比例手数进行真实下单交易。但是这里用户也要注意,一旦出现开平仓信号后,也就是说无论实盘此笔交易是否已经成交,图表上的虚拟持仓都是按成交后显示的,因为为了确保图表上显示的持仓与实际的持仓保持一致,委托时应该尽量的贴近实际价格,以确保能够按要求成交。此外金字塔的新交易系统只能在逐K线模式下运行,另外该模式仅限标准版及其以上用户才可以进行下单交易。 4.1下单模型语句 BUY(COND,V,Type,P); //开多 SELL(COND,V,Type,P); //平多 BUYSHORT(COND,V,Type,P); //开空 SELLSHORT(COND,V,Type,P); //平空 初学者一般会对TYPE有一些疑惑,TYPE可以是本周期收盘(THISCLOSE)、市价(MARKET)、限价单(LIMIT)、停损单(STOP)等交易方式控制符;对于限价单、停损单需要指定的价格P。 4.2简单交易系统示例 例一:KD交易系统 我们仍然使用前面的KD交易系统为例,将其修改为新版的程式化交易模型。 RSV:=(CLOSE-LLV(LOW,N))/(HHV(HIGH,N)-LLV(LOW,N))*100; K:=SMA(RSV,M1,1); D:=SMA(K,M2,1); //注意看下面两行语句 BUY(CROSS(K,D) AND K<20,V,TYPE,P); SELL(CROSS(D,K) AND K>80,V,TYPE,P); 例二:一个最简单的3天均线穿越5天均线的多头交易系统 资产:ASSET,LINETHICK0; 可用现金:CASH(0),LINETHICK0; 持仓:HOLDING,LINETHICK0; MA3:MA(C,3); MA5:MA(C,5); BUY(CROSS(MA3,MA5),1,THISCLOSE); //开多1手 SELL(CROSS(MA5,MA3),0,THISCLOSE);//平多0表示平掉全部持仓 上述的交易模型都能在图表做显示使用,并可以做图表交易。 在交易系统评测中,介入时机与价位,是针对旧交易系统的4种信号指定买卖的介入时机与价位的,这里是以BUY函数的实际指定价格为准。 4.3复杂交易系统示例 例三:30分钟翻转系统 //《日内30分钟翻转系统》 //适用于1分钟周期 //编写日期:20100812-JYL //准备需要的中间变量 h30 := ref(hhv(h,30),1); l30 := ref(llv(l,30),1); //建立多头的进场条件 long := h>h30 and time>093000 and time<145000; if long then begin sellshort(holding < 0, 0, limitr, h30); buy(holding = 0, 1, limitr, h30); end //画出多头的止损线 partline(holding>0, l30,colorred); //开空条件 short := l < l30 and time > 093000 and time < 145000; if short then begin sell(holding > 0, 0, limitr, l30); buyshort(holding = 0, 1, limitr, l30); end //画出空头的止损线 partline(holding<0, h30, colorgreen); //收盘前5分钟平仓 if time > 145500 then begin sell(holding > 0, 0, thisclose); sellshort(holding < 0, 0, thisclose); end 例四:30突破模型 //开盘后前三十分钟最高最低价突破模型--涨停价多单止盈/跌停价空单止盈 //适用于1分钟周期 M:=BARSLAST(DATE<>REF(DATE,1) )+1; h30:=VALUEWHEN(TIME<=093000,HHV(HIGH,M)); l30:=VALUEWHEN(TIME<=093000,LLV(LOW,M)); //假设涨停价为 昨收的百分之4 upstop :=ref(c,1)*(1+0.04); downstop:=ref(c,1)*(1-0.04); //建立多头进场条件 long:=CLOSE>h30 AND TIME<145500 AND TIME>093000; if long then begin sellshort(holding < 0, 0, limitr, h30); buy(holding = 0, 1, limitr, h30); end //建立多头止盈条件(涨停价多单止盈,不开空仓) if holding>0 and TIME<145500 AND TIME>093000 then sell(c>upstop-3*mindiff,0,thisclose); //建立空头进场条件 short:=CLOSE093000; if short then begin sell(holding > 0, 0, limitr, l30); buyshort(holding = 0, 1, limitr, l30); end //建立空头止盈条件(跌停价空单止盈,不开多仓) if holding<0 and TIME<145500 AND TIME>093000 then sellshort(c 145500 then begin sell(holding > 0, 0, thisclose); sellshort(holding < 0, 0, thisclose); end 资产:ASSET,LINETHICK0; 可用现金:CASH(0),LINETHICK0; 持仓:HOLDING,LINETHICK0; 第五章 新交易系统的函数 交易系统之开多操作, 用法:BUY(COND,V,Type,P); 表示当COND条件成立时, 买入V股(手)当前品种,TYPE表示买入类型, P表示买入价格,所有参数均可以省略。 V:买入股(手)数或买入资金百分比(N%),省略表示100%; TYPE:可以是本周期收盘(THISCLOSE),次周期开盘(MARKET), 次周期限价单(LIMIT),次周期停损单(STOP)等交易方式控制符; P:对于限价单、停损单需要指定的买入价格 例如:BUY(C>O ,1000,THISCLOSE);表示收阳线则在本周期收盘价上买入1000股(手)。 BUY(C>0,50%,LIMIT,CLOSE-0.2);表示在次周期CLOSE-0.2元位置下买入限价单, 若价格达到或低于该价格则用50%资金买入。 交易系统之平多操作, SELL(COND,V,Type,P); 用法同上 交易系统之开空操作, BUYSHORT(COND,V,Type,P); 用法同上 交易系统之平空操作, SELLSHORT(COND,V,Type,P); 用法同上 ASSET当前资产 户账户客的净自有资产=可用现金+占用保证金-融资(现金+品种市值-融资) AVGENTERPRICE 持仓均价 当前持有品种的平均持仓成本——最近空仓以来计 BESTPERCENT 最大利润率 当前位置之前所有交易中利润率最大一次的利润率,其数值在0—1之间 BESTTRADE 最大盈利额 当前位置之前所有交易中盈利最大一次的利润额 CASH(N) 现金存量 得到当前帐户的可用资金余额 用法:CASH(N),N表示投资方向 0多头 1空头 例如:CASH(0)表示取当前多头帐户的可用现金余额 ENTERBARS 开仓历时 返回上次开仓到当前的周期数,若之前没有开仓记录返回-1 ENTERPRICE 上次开仓价 得到当前位置的上次开仓价 ENTERVOL 上次开仓量 得到当前位置的上次开仓量 EXITBARS 平仓历时 返回上次平仓到当前的周期数,若之前没有开仓记录返回-1 EXITPRICE 上次平仓价 得到当前位置的上次平仓价 EXITVOL 上次平仓量 得到当前位置的上次平仓量 HOLDING 持仓量 得到当前帐户持仓量,多仓返回正数空仓返回负数 LIMIT 限价交易 交易方式控制符:加入限价单,次周期达到限价即操作,否则放弃。处于图表交易时按照指定限价报单交易 LIMITR 限价交易 交易方式控制符:加入限价单,本周期达到限价即操作,否则放弃。处于图表交易时按照指定限价报单交易 Market 市价交易,交易方式控制符:按照次周期开盘价操作。处于图表交易时按照实际交易市价操作 例如:buy(cond ,1000,market); 该控制符仅对交易评测时有效 MAXSEQLOSS 最大连续亏损次数 当前位置之前连续亏损交易的最大次数 MAXSEQWIN 最大连续盈利次数 当前位置之前连续盈利交易的最大次数 NUMLOSSTRADE 亏损次数 当前位置之前总共有多少次亏损的交易,注意每次卖出算一次交易,而买入不算 NUMSEQLOSS 连亏次数 当前位置之前连续有多少次亏损的交易,注意每次卖出算一次交易,而买入不算 NUMSEQWIN 连盈次数 当前位置之前连续有多少次盈利的交易,注意每次卖出算一次交易,而买入不算 NUMWINTRADE 盈利次数 当前位置之前总共有多少次盈利的交易,注意每次卖出算一次交易,而买入不算 OPENBAR 开仓历时 上一次仓位=0以来的周期数 OPENPROFIT 浮动盈亏 当前浮动盈亏(当前持仓市值与持仓成本之差) PERCENTWIN 交易胜率 当前位置之前盈利交易占总交易次数的比例,其数值在0—1之间 SEQLOSS 连亏金额 当前位置之前连续亏损总额,注意每次卖出算一次交易,而买入不算 SEQWIN 连盈金额 当前位置之前连续盈利总额,注意每次卖出算一次交易,而买入不算 STATE 帐户状态 得到当前帐户状态,无仓输出0;有多头仓输出1;有空头仓输出-1 STOP 停损交易 交易方式控制符:加入停损单,或又称突破交易,次周期达到设定价格即操作买入,否则放弃。 所谓停损就是交易价比设定的价格要差,具体说来对于买入或卖空就是高于设定价格, 对于卖出或买空就是低于设定价格 例如:BUY(COND ,1000,STOP,CLOSE-0.01); 该控制符仅对交易评测时有效 STOPR 停损交易 为本周期的,其它同上 THISCLOSE 收盘价交易 交易方式控制符,按照本周期收盘价操作 例如:BUY(COND ,1000,THISCLOSE); 该控制符仅对交易评测时有效 TOTALTRADE 交易次数 当前位置之前总共有多少次交易,注意每次卖出算一次交易,而买入不算 TYPE(N) 上N次信号类型 得到当前位置之前上N次信号类型 输出:0、无信号1、开多2、平多3、开空;4、平空 TYPEBAR 表示上次信号, 得到当前位置之前上N
/
本文档为【金字塔程式化交易设计指南--高级篇】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索