分析家V5.0公式系统 帮助文件 版权所有©2003深圳市汇天奇电脑有限公司 本手册是分析家《公式设计指南》的补充手册,是对分析家V5.0公式系统新增功能的说明,其基本操作请参阅《公式设计指南》。 深圳市汇天奇电脑有限公司对分析家软件及本手册的内容不做任何形式的保证。用户在使用本软件及手册的过程中造成的必然或偶然之过失,深圳市汇天奇电脑有限公司概不负责。 未经深圳市汇天奇电脑有限公司事先书面许可,本手册的任何部分不得以任何形式进行增删、改编、节选、翻译、翻印或仿制。 本手册的全部内容深圳市汇天奇电脑有限公司可能随时加以更改,此类更改将不另行通知。 ©2003本手册的著作权属于深圳市汇天奇电脑有限公司 分析家V5.0公式系统 1 使用与提高 1 分析家V5.0公式系统 6 一. 分析家新公式系统简介 6 二. 隐含在公式中的循环 7 1. 计算的顺序 7 2. 迭代计算 8 3. 初始数值及变量声明 9 4. 参数说明 10 三. 分支 10 1. 为什么要分支 10 2. 以前我们是怎样实现分支的 10 3. 分支的描述方法 11 4. 分支举例 13 四. 循环 13 1. 为什么要循环 13 2. WHILE循环 15 3. FOR循环 16 4. 循环的终止 17 5. 循环的嵌套 17 6. 循环举例 18 五. 新交易系统 19 1. 新交易系统的设计目标 19 2. 新交易系统的买入和卖出 19 3. 新交易系统设置 22 4. 新交易系统状态函数 23 5. 新交易系统的K线指示 24 6. 新交易系统的测试 25 7. 新交易系统指标 25 8. 新交易系统举例 26 六. 字符串 26 1. 字符串的定义 26 2. 字符串的计算 27 七. 数组 27 八. 专业财务数据 29 九. 其它 29 1. 数据二 29 2. 自定义数据 30 3. 交易系统介入点设定 31 十. 调试 33 1. 为什么需要调试 33 2. 调试前的准备工作 33 3. 运行 34 4. 单步运行 34 5. 执行到指定目标 34 6. 设置断点 35 7. 查看变量内容 35 8. 运行到指定时间 35 十一. 综合举例 35 1. 均线系统 35 2. 指数平滑移动平均线 36 3. 宝塔线(鬼变脸) 36 十二. 新增函数列表 38 1. 相关性函数 38 2. 除权除息 40 3. 行情函数 40 4. 时间函数 41 5. 引用函数 41 6. 常数函数 42 7. 绘图函数 43 8. 字符串函数 45 9. 指标函数 48 10. 数据函数 48 11. 专业财务数据 48 12. 专业财务数据代码内容对照表 50 13. 交易系统函数 59 14. 输出修饰符 64 15. 其它函数 66 分析家V5.0公式系统 分析家V5.0公式系统在兼容旧版本公式系统的基础上,引入了一些全新的概念,为书写、描述更为复杂的公式提供了强有力的工具。对于有一定公式编写基础的用户,可以学习以下内容,掌握分析家新公式系统的强大功能。 一. 分析家新公式系统简介 你是否在编写公式的过程中有以下困惑: 1) 书写很长的而且大量重复的公式 2) 为怎样描述一个特殊的概念而伤透脑筋 3) 希望增加公式系统的函数数量 4) 希望了解计算过程中,中间结果的数值 5) 希望自己编写函数 如果有,那么你就需要使用分析家V5.0公式系统了,新的公式系统全面兼容以前的公式系统,同时还给你带来许多革命性的特性。新公式系统的增加的主要内容有: 1) 新增迭代、分支、循环等标准程序语言语法 2) 强大的字符串和数组运算 3) 内建调试器,方便公式查错 分析家新公式系统为用户提供了两个公式编辑器:一个是专业公式编辑器,通过公式管理器可以进入,它提供了公式编辑、编译、调试等多种功能,是一个功能强大的编辑器;另一个是标准编辑器,它与过去版本界面类似,通过除了公式管理器以外的位置均进入到这个标准编辑器,它短小精干,易于使用。 这些新增的内容有一定的难度,适合具有计算机编程知识的用户阅读。通过下面章节的学习,你将会逐步了解到这些新特性将给你带来的方便。 二. 隐含在公式中的循环 1. 计算的顺序 在公式系统中,每一个公式是按照语句顺序执行的,例如: V0:=MA(CLOSE,5); V1:=MA(CLOSE,10); 将首先执行5日均线的计算,然后再计算10日均线,但是我们忽略了一个问题,那就是其中还隐含了一个时间顺序的问题,也就是说先计算昨天的数值再计算今天的数值。这样,我们就有了两个顺序——语句顺序和时间顺序,我们到底以哪一个顺序为优先呢?答案是以时间顺序为优先,也就是说计算第一天的V0,第一天的V1,然后是第二天的V0,第二天的V1…。对于上面这个例子,由于前后语句之间不存在相互影响,所以到底哪个顺序优先并不影响结果,因此很多人都忽略了这个问题,认为应该首先计算完所有的V0,然后再计算V1。但是在看下面例子: V0:=IF(V1>CLOSE,CLOSE,V1); V1:=MA(CLOSE,10); 前面的语句引用了后面的数据,这样V1昨天的计算结果就会影响到V0的计算,此时就必须以时间顺序为优先。 有了这个时间顺序优先,我们就可以解决过去前后数据互相引用、变量重新赋值、迭代计算等问题了。 因此我们应当按照这样的方式思考:我们用公式描述一天的情况,而不是描述一条曲线,整个公式又隐含着一个时间循环,当算完一天的数据后,又重新回到公式起点,计算第二天的数据,如此循环直到计算完所有的数据。需要注意的是,这个隐含循环中可能存在前面语句引用后面数据的问题,如上例中第一个语句中引用了V1变量,而V1变量需要到第二句才有赋值,所以此时它的数值是在上一轮循环中第二条语句所赋值的,也就是昨天的10日均线数值。这是不是有点太复杂了,但是我们将看到这种循环为我们带来的好处。 2. 迭代计算 我们在分析中经常会用到迭代的概念,比如说指数平滑移动平均线EMA,今日均线等于昨日均线*(N-1)加上今日收盘价*2,然后再除以N+1。这样的问题还包括SMA、DMA等等。所谓迭代就是用上一周期的数值来计算本周期的数值。 过去由于公式系统不能直接支持迭代,所以只能用函数来实现这些迭代功能,用新公式系统后,迭代变得可以自己实现了,而且非常简单。以EMA为例: V1 := (V1*(N-1) + CLOSE*2) / (N+1); 就这么简单,直接按照其原理书写就可以了。我们来分析一下为什么可以这样写。赋值符号 := 左边的V1表示本周期的数值,而右边的V1由于还没有赋值,还保持着上一周期的数值,因此这个V1就还维持着上次计算的结果,也就是上周期的数值,此时它等同于REF(V1,1)。同样的,SMA可以表述为: V1 := (V1*(N-1) + CLOSE) / N; 需要注意的是,在本语句之后,由于V1已经被赋值,所以它的数值也就变成本周期的数值了。类似的例子还包括:若上周期V1值大于收盘价,则V1等于最高价,否则等于最低价: V1:= IF(V1>CLOSE, HIGH, LOW); 前面的例子: V1 := (V1*(N-1)+CLOSE)/N; 我们可能会问,计算第一天的时候,V1的数值是多少。如无特殊说明,变量的初始数值等于0。显然在这个问题中这个设定是不正确的,因为V1等于0的话,计算结果就等于CLOSE/N,显然他不等于第一天的均值,因此我们需要这样说明: V1 :=IF(BARPOS=0,CLOSE, (V1*(N-1)+CLOSE)/N); 当计算第一天的时候,V1等于收盘价,随后等于指数平滑移动平均。 迭代这个概念理解起来有一定的难度,但如果能够很好地应用它能为我们解决很多问题。 3. 初始数值及变量声明 任何变量在使用之前必须先赋值,那么迭代就有可能出现一个问题:变量还没有赋值怎么使用。我们需要用变量声明来解决这个问题:直接说明变量的初始数值和变量的类型,其语法如下: VARIABLE: P=1; 表示声明一个变量P,设定其初始数值为1,也就是说在计算的第一天,它的数值为1。这样就可以在迭代中使用变量P了。变量声明必须写在任何语句之前,但如果有INPUT参数说明,则应当放在它的后面。 一个完整的指数平滑移动平均线公式可以写成: VARIABLE: V1=0; V1 :=IF(BARPOS=0,CLOSE, (V1*(N-1)+CLOSE*2)/(N+1)); 再举个例子,我们需要知道当前正在计算第几根K线?第一天为1,第二天为2,我们可以写成: VARIABLE: P=0; P := P+1; 使用迭代,方便地描述了这个要求,今天的数值等于昨天的数值+1。这个例子也很好地说明了迭代的简洁和功能强大。 在这里需要特别指出的是,变量声明设定的初始值表示计算的第一天的数值,今后每次计算新的一天并不对该变量设定初始值,例如: VARIABLE: V1=0; V2:=0; V1:=V1+1; V2:=V2+1; 这当中V1、V2的计算结果将截然不同,V1设定了初始数值0,每次隐含循环加1,他的计算结果为1、2、3、4…,是一个递增的序列;而V2则由于每次循环均被重新设定为数值0,因此V2:=V2+1这条语句将V2设置为1。因此,如果我们需要每天设定初始数值,则需要一条赋值语句来设定;如果我们不需要每天设初始值而是第一天需要,则使用VARIABLE语句声明变量并且赋予初始数值。 4. 参数说明 新公式系统引入参数说明语句: INPUT: [参数名]([默认值],[最小值],[最大值],[测试步长]); 其中默认值是必需的,其他值若没有指定,则使用其默认值0,100和1。参数说明语句必须放在公式的最前面。 参数说明等同于在公式编辑器中直接在参数输入框中输入参数。系统将参数输入框中和INPUT语句说明的参数累加起来,其总数不能不超过16个。使用参数说明语句,可以使公式程序放在一段文字中,可以方便一部分喜欢这种方式的用户。你可以使用两种方法中的任意一种,他们不存在区别。 我们可以在INPUT语句中说明多个参数,它们之间用逗号分隔。例如: INPUT: P1(10,0,20), P2(20,0,100); 5. 总结 新公式系统的核心在于:我们只需要描述每一天的行为,如果当天没有改变一个变量,则该变量维持昨天的数值不变。 三. 分支 1. 为什么要分支 所谓分支,就是如果满足某个条件就执行某些指令,否则就指令另外一些指令。有了分支,计算机就有了智能,知道根据具体情况作出不同的动作,这是计算机最重要的功能之一。 2. 以前我们是怎样实现分支的 过去,我们也在函数中隐含地使用了一些分支概念,在函数中直接将分支包含进去。例如绘图函数DRAWTEXT(Cond,Price,Text),表示如果Cond条件满足就输出文字。再例如,IF(Cond,V1,V2)表示如果Cond条件成立就返回V1,否则就返回V2。 但是这种包含在函数中间的条件也有许多缺陷,那就是它只能控制一条语句,而且只在有限的几个函数中包含条件,这极大地限制了分支的应用。例如,我们就无法描述如果条件成立,V1就等于CLOSE,否则V2就等于CLOSE。 3. 分支的描述方法 我们使用IF [条件] THEN [语句] 来描述如果条件成立就执行语句这样一个逻辑,例如 IF CLOSE>OPEN THEN P := P+1; 它表示如果收盘价大于开盘价,P的数值就增加1,否则P值维持不变,也就是说统计历史阳线的数量。 需要注意,IF语句和IF函数使用同样的关键字,区分它们的办法是在IF语句之后必然存在THEN语句,而IF函数则没有。因此我们不能在IF语句条件部分包含IF函数,例如: IF IF(CLOSE>OPEN, OPEN, CLOSE)>10 THEN P := P+1; 该语句将混淆两个IF的作用,可以使用以下方法来解决: C1 := IF(CLOSE>OPEN, OPEN, CLOSE)>10; IF C1 THEN P := P+1; 如果我们想要在条件满足的情况下多做几件事情怎么办?在此我们引入BEGIN…END这样一个语句来形成组合语句,也就是说将它们中间所包含的语句看作一个整体,一起执行。组合语句被认为是一个整体,在接下来的分支、循环等操作中均需要用到。例如: IF CLOSE>OPEN THEN BEGIN P := P+1; Q := MA(CLOSE,10); END 它表示如果条件成立,将执行对P和Q的赋值语句,否则这两条语句均不执行。 BEGIN…END语句可以嵌套,END与之前面最接近的还没有配对的BEGIN进行配对。例如: IF CLOSE>OPEN THEN BEGIN (1) P := P+1; IF CLOSE>10 THEN BEGIN (2) P := P+1; Q := MA(CLOSE,10); END (3) END (4) 其中,2-3是配对的,1-4是配对的。 分支语句还有以下形式:IF…THEN…ELSE,它表示如果条件满足就执行某件事,否则就执行另外一件事。例如: IF CLOSE>OPEN THEN P := P+1; ELSE Q := Q+1; 这段公式表示,如果今天收阳线,则将P的数值增加1,否则将Q的数值增加1,需要注意的是,ELSE必须与IF配对,而且中间只能有一条语句或用BEGIN…END包围起来的组合语句。IF…THEN…ELSE可以嵌套,ELSE与之前最接近的未配对的IF语句进行配对,例如: IF CLOSE>OPEN THEN (1) P := P+1; ELSE IF CLOSE< OPEN THEN (2) Q := Q+1; ELSE (3) R := R+1; 其中第(2)行的ELSE与第(1)行的IF配对,因为她前面只有一个IF;第(3)行的ELSE与第(2)行的IF配对而不与第(1)行的IF配对,因为第(2)行的IF未配对,而且距离第(3)行最近。在使用多层分支嵌套时,要时刻注意这个配对原则。 4. 分支举例 例1:计算上市以来上涨天数和下跌天数的比率: VARIABLE: UP=0, DN=0; IF CLOSE>REF(CLOSE,1) THEN UP := UP+1; ELSE IF CLOSE< REF(CLOSE,1) THEN DN := DN+1; RATIO: IF(DN=0,0,UP/DN); 最后一条语句,判断DN是否为0,用来保护结果不被0除。 例2:计算历史上阳线的平均涨幅和阴线的平均跌幅 VARIABLE:UPR=0,UP=0,DNR=0,DN=0; R := CLOSE/REF(CLOSE,1)-1; IF CLOSE>OPEN THEN BEGIN UPR := UPR + R; UP := UP+1; END ELSE IF CLOSE< OPEN THEN BEGIN DNR := DNR + R; DN := DN+1; END 平均涨幅: IF(UP=0,0,100*UPR/UP); 平均跌幅: IF(DN=0,0,100*DNR/DN); 四. 循环 1. 为什么要循环 循环是计算机程序中一个最重要的概念,它使计算机能够按照用户的意志重复执行某个任务,我们前面所提到的公式系统中存在的隐含循环也是一种沿时间变化的循环。其实我们的函数中也大量包含了循环的概念,比如SUM、MA等等。我们来看看循环的概念。 如果我们计算从1加到100,写成公式: 1+2+3+4+5…+100; 这个公式很长,而且写起来容易出错,如果我们是计算从1加到10000怎么办?这就需要用到循环,我们让计算机循环计算,总共循环10000次,其中第N次循环加N即可解决这个问题: FOR I=1 TO 10000 DO SU := SU+I; 等一会儿我们再来解释它。我们看到,有了循环以后,许多繁杂的事情都可以轻松解决了。由于以前没有循环,我们必须在函数内部来实现一些循环,现在有了它,我们可以省去好多函数。例如,SUM表示计算N天数值的总和,写成公式 C + REF(C,1) + REF(C,2)+ … + REF(C,N-1); 由于书写困难而且不灵活,我们引入SUM函数来计算。但是如果我们使用循环: SU := 0; FOR I=0 TO N-1 DO SU := SU+REF(C,I); FOR循环表示,循环执行SU := SU+REF(C,I)这条语句,第一次循环变量I等于0,每次循环I递增1,直到大于N-1时循环结束。也就是说,REF(C,I)在每次循环中表示今天、昨天、前天…N-1天前的收盘价,将它们累加到SU变量中,完成了累加的功能。 我们需要注意的是,此时的循环与公式中的隐含循环是不一样的,隐含循环不需要书写而且是不可避免的,而循环需要用循环语句写出来。循环语句所描述的循环,是针对某一根K线执行的,整个循环过程中其计算位置是不变的。因此,在整个隐含循环中,每进行一次隐含循环,就要执行一轮循环语句。因此,大量使用循环语句,尤其是嵌套循环语句将大大降低运算速度。我们可以来看看,如果某股票有3000根K线,我们在公式中包含一个100次的循环,则循环将执行3000*100=30万次,如果还存在循环嵌套,也就是循环套循环,如果内外均是100次的循环,则循环次数为3000*100*100=3000万次,其执行速度将非常缓慢。分析家系统限制总的循环次数要小于1亿次,否则不能得到计算结果。 循环分为WHILE和FOR循环两种。 2. WHILE循环 WHILE循环语法:WHILE [条件] DO [语句] 它表示,如果条件成立则循环执行语句,直到条件不成立为止。例如我们计算最近多少天完成100%换手: HR := VOL; ND := 0; WHILE HR< CAPITAL DO BEGIN ND := ND+1; HR := HR + REF(VOL,ND); END ND就是结果。HR表示最近成交量累加,设初始值为当日成交量,然后循环直到它大于流通盘为止。循环体中,ND每次循环加1,HR每次循环加上ND天前的成交量,也就是说最近ND天的成交量累加。 在循环中必须注意的是,循环条件在循环过程中一定要发生变化,并且会变成条件不成立,否则会形成死循环,也就是说循环条件永远成立,计算机不断地进行循环计算。 在上例中,HR每次递增,当它增大到流通盘以上时,条件变成不成立,从而终止循环。另外一个我们没有注意到的问题是,如果今天是上市第一天,而且换手率没有达到100,则这个循环会出现问题,因为不论ND怎样增大,REF(VOL,ND)总是返回没有数值,也就是说HR的不到递增,也就永远无法破坏循环条件而终止循环,它也是一个死循环。因此我们需要改成: HR := VOL; ND := 1; WHILE HR< CAPITAL AND ND< BARPOS DO BEGIN HR := HR + REF(VOL,ND); ND := ND+1; END 增加一个ND< BARPOS用以阻止超过上市日的向前引用。 从这些例子中我们看到,自己使用循环来实现算法,其功能是强大的,但是需要十分小心,避免死循环的发生。因此,我们能够使用函数来实现的功能,还是尽量使用函数来实现,避免不必要的复杂性。 3. FOR循环 我们大多数的循环是指定循环次数的循环,而且我们证券计算也大量使用向前引用若干天的数据,因此 FOR循环将更加实用。 FOR [变量]=[初值] TO [终值] DO [语句] 它表示使用变量来控制执行循环语句,首先给变量赋初值,然后判断变量是否小于或等于终值,若满足条件则执行语句,然后将变量加1,循环判断变量是否小于等于终值并循环执行,直到条件不满足为止。例如 FOR I=1 TO N DO… 表示循环N次,循环变量从1到N,类似的 FOR I=0 TO N-1 DO… 也表示循环N次,但是循环变量从0到N-1。 循环变量还可以从大循环到小,可以使用 FOR [变量]=[初值] DOWNTO [终值] DO [语句] 此时变量将从大到小变化,直到小于终值为止。 我们在使用中需要注意递增还是递减变化,否则将形成死循环。 使用FOR循环的一个最大的好处在于其循环次数可以控制,不像WHILE循环可能存在潜在的死循环。还以WHILE循环中的换手100%为例: HR := 0; FOR I=0 TO BARPOS-1 DO BEGIN IF HR< CAPITAL THEN BEGIN HR := HR+REF(VOL,I); IF HR>=CAPITAL ND := I+1; END END 我们用FOR循环来控制总的循环次数不超过数据总数,从而避免了死循环的发生。在循环中,如果换手未超过流通盘,则继续累加,当换手刚达到流通盘时,将循环次数赋给结果ND。 4. 循环的终止 我们看到,循环过程中必须要有一个终止循环的方法,WHILE语句中使用条件不满足来终止循环,FOR循环中使用变量递增递减来终止循环,是否还有其它的需要呢? 我们看上面的例子,该循环有一个问题,就是无论是否计算出结果,循环都将继续下去,直到计算到上市第一天,这将大大降低效率。我们通过主动终止循环来解决这个问题: HR := 0; FOR I=0 TO BARPOS-1 DO BEGIN HR := HR+REF(VOL,I); IF HR>=CAPITAL BEGIN ND := I+1; BREAK; END END 执行BREAK语句将终止循环,无论循环中值条件是否达到。在本例中,当计算到结果,就停止循环。一般说来,BREAK语句总是与IF语句配合使用。使用BREAK语句可以使公式看起来更加简单。 BREAK可以用来终止WHILE循环和FOR循环。 5. 循环的嵌套 我们可以在循环中再套入循环,这就叫做循环嵌套。例如我们想要找到最近100天中收盘价相同的天数: ND := 0; FOR I=0 TO 99 DO BEGIN FOR J=I+1 TO 99 DO BEGIN IF REF(CLOSE,I)=REF(CLOSE,J) THEN ND := ND+1; END END 我们分成内外两个循环,外层循环使用I作为循环变量,它从0到99循环,得到之前每一天的收盘价REF(CLOSE,I),而内层循环使用J作为循环变量,它I+1到99循环,表示从第I+1天前开始查找等于第I天数值的K线,若找到(条件REF(CLOSE,I)=REF(CLOSE,J)满足),则将ND加1。 使用循环嵌套,我们可以做许多过去无法做的事情了。但是使用嵌套一定要注意,不要是循环次数太大,否则运行速度会很慢。 6. 循环举例 例1.计算N日均线 SU := 0; FOR I=0 TO N-1 DO SU := SU+REF(CLOSE,I); SU / MIN(N,BARPOS); 该例子中有两个技巧,其一,没有可以去避免向前循环超过上市日的问题,因为发生这样情况时SU的数值不会增加,也就是说SU等于上市到现在的总和;其二,如果当前位置小于N,则SU的数值表示上市到现在的总和而不是N日总和,所以平均价格应该为SU/BARPOS,因此我们使用了SU / MIN(N,BARPOS); 例2.计算前十大股东占总股本的比例 SU:=0; FOR I=1 TO 10 DO SU := SU + PROFFIN(5002+(I-1)*6,0); 比例: SU/PROFFIN(1001,0)*100; 在本循环中使用了一个技巧,我们发现第一、第二、第三…股东持股量的代码是5002,5008,5014…,它们之间间隔6,所以我们可以使用5002+(I-1)*6来表示这些代码 五. 新交易系统 1. 新交易系统的设计目标 在分析家过去的版本中,已经引入了交易系统这个概念,那时的交易系统实际上更象一个有买入和卖出条件的选股系统,主要解决了在什么情况下买入,在什么情况下卖出的问题。然而在实际交易的过程当中,我们必须要考虑仓位、资金、交易系统对当前股票的适应情况等等问题,从而决定我们应当在什么样的条件下,买入或卖出多少股票,在连续出现信号的情况下又该如何处理。 新交易系统就是为了解决这些问题提出来的,它为我们提供了一整套交易需要的交易执行、交易状态函数,从而使我们能够根据当前行情状况、资金状况、持仓状况、盈利亏损状况等不同的情况,来决定我们应当如何操作,操作的价格和量都可以直接控制。 可以说,新交易系统的提出,缩小了计算机交易和人为交易之间的差异,为用户实现系统交易方法提供了有力的保证。 2. 新交易系统的买入和卖出 新交易系统引入了四个买卖函数,它们分别是 BUY(V,Type,P):买入 SELL(V,Type,P):卖出 BUYSHORT(V,Type,P):空头买入 SELLSHORT(V,Type,P):空头卖出 使用这四个函数是区别于新旧交易系统的关键,若需要使用旧交易系统则不能出现这四个函数。 函数中第一个参数V表示买入量,它可以是一个具体的量或者是最大买入(卖出)量的某一比例。例如,BUY(1000)表示买入1000股,而BUY(30%)则表示用当前资金量的30%买入,SELL(100%)则表示将当前持仓量卖出。这个参数可以省略,若省略则表示100%。买入和卖出量如果超过资金量或持仓量,则按照最大可买入(卖出)量执行,买入量会自动取整到每手股数的整数倍,具体到A股就是100股及其整数倍,若少于100股则不买入。 函数中第二个参数表示交易单据类型,它可以是以下几种: 1. THISCLOSE,收市价单,表示按照本周期收盘价交易; 2. MARKET,市价单,表示按照次周期开盘价交易; 3. LIMIT,限价单,表示次周期按照好于指定价格进行交易; 4. STOP,停损单,表示次周期按照差于指定价格进行交易; 若本参数省略,则表示THISCLOSE。 对于第3、4两种交易类型,还需要指定一个价格,那就是第三个参数P,它表示限定的价格是多少,可以使用任意合法的公式语句来设定。对于1、2两种交易类型,不能有第三个参数。例如BUY(100,LIMIT,CLOSE+0.1)表示在当前收盘价+0.1元的位置设定限价单,若次周期股价等于或低于这个价格,则买入100股。 对于收市价单和市价单,它们所指定的价格是股价必然能够达到的,因此这两种单据是一定能够成交的,若考虑市场容量的问题,也只会影响到能够成交多少,但价格是可以保证的。有关市场容量的问题请参阅下一节中关于“市场容量”的描述。 然而对于限价单和停损单,则不一定能够成交,因为我们设定了一个价格,若股价不能达到该限定价格,则这个单据将不能成交,我们称之为未成交交易。在系统指示中,这种交易将被显示成灰色,表示下了单但是没有成交。 我们再来研究一下限价单和停损单的区别,我们说限价单就是要求成交价格好于指定价格,而好于这个概念对于买入和卖出,多头和空头是不一样的。对于买入来说,好于就是以更低的价格买入,而对于卖出来说就是以更高的价格卖出;对于空头买入卖出来说又正好相反,空头买入希望以更高的价格买入,以更低的价格卖出。在这里我们不用死记硬背,只要确定一点,那就是限价单表示成交的价格只能是期望价格更好,而停损单则指比期望价格更差。 有人要问,更差的价格要来干什么?我们举个例子来看看,假如我们预计明天是一个转折点,若股价上涨则其涨幅可以达到8%以上,但如果不涨则可能下跌,此时我们应当设定一个停损单,设定价格在CLOSE*1.01,表示上涨1%后我再买入,这样就可以保证只有在上涨的情况下才进行交易。 既然有了这些限制,所以限价单和停损单就有可能不能成交,例如我们设定收盘价限价单,但次日股价跳空上涨,其最低价都高于我们设定限价,当然也就不能成交。 需要注意的是,使用限价单和停损单,有可能成交价格不是我们设定的价格,当开盘价满足我们的限定条件,则按照开盘价成交。例如设定10元的限价单,次日开盘价为9.5元,它已经满足条件,当然就按照它成交。 这四个函数并不存在一般函数中的条件项,只要出现这个函数就立即执行买入或卖出,因此它们一般都会与IF语句相结合。总是以这种形式出现: IF cond THEN BUY; 表示当天价格满足的时候就买入。 若当天出现多个买入语句,则每个买入语句均会被执行,因此用户需要注意区分不同情况。例如: IF CLOSE>OPEN THEN BUY(1000); IF CLOSE>OPEN*1.02 THEN BUY(2000); 此时,若第二个条件满足则第一个也肯定同时满足,系统将下了两个买入单,共买入3000股。若这不是您所希望的,那么可能需要这样写: IF CLOSE>OPEN*1.02 THEN BUY(2000); ELSE IF CLOSE>OPEN THEN BUY(1000); 另外,循环中不能有交易函数。 3. 新交易系统设置 资金问题:新交易系统引入了资金概念,也就是说可以设定初始投入资金量,该资金量将影响到每一次交易能否正常进行。每次买入,资金量减少,卖出则资金量又增加,若买入资金量不足,则在资金量允许的范围内调整买入量,甚至取消买入。这样就与我们实际操作更加接近。资金投入设定请按“设定”按钮进行设置。 市场容量问题:设想交易系统发出信号,买入100000股某股票,但该股票当日成交量仅有80000股,则这个买入单是不能够成交的。一般认为,只要你的交易量达到当日成交量的10%以上,就会影响到该股票的走势,因此我们一般设定当日交易量要小于成交量的10%。交易量限制设定请按“设定”按钮进行设置。 交易系统设置 止损问题:过去,交易系统止损按照收盘价进行,这与实际情况有一定的差异,试想,若设定10%止损价位应当是当股价达到10%损失的时候就进行止损,而不是等到收盘再进行。因此,新交易系统的止损原则是,若开盘价达到止损条件,则按照开盘价止损,否则按照最接近止损设定的价格进行。 连续买入和连续卖出问题:过去,交易系统发出买入信号,我们就全额买入,之后再发出信号就不再买入;发出卖出信号则全部卖出,不存在连续买入和卖出的问题。在测试平台中,引入了连续买入的概念,但其设置相对固定,不能模拟出更加精细的设置。新交易系统改变了这种状态,你可以不断地买入或卖出,只要资金或持仓条件满足。当然,这也就引出了一个成本计算的问题,如果经过多次交易后,我们的持仓成本是多少,这一单的利润是多少? 成本问题:我们计算成本的方法是,每次买入就将新买入的股票与持有的股票进行加权平均,也就是(买入价*买入量+持仓量*持仓成本)/(买入量+持仓量);卖出时,无论盈利与否,当前持仓股票的成本不变。我们所有的盈利计算、止损价格计算均基于这个原则。 4. 新交易系统状态函数 这些状态函数描述了交易系统当前的状态,您可以根据这些状态来决定您的交易策略。状态函数包括: ENTERPRICE:买入价格,表示上次交易的买入价格。 EXITPRICE:卖出价格,表示上次交易的卖出价格。 CASH:现金存量,表示当前的现金存量。 OPENPROFIT:浮动盈亏,表示当前持股的浮动盈亏,也就是当前持仓市值与持仓成本之差。 HOLDING:当前持仓量,表示当前持有的股票股数。 AVGENTERPRICE:平均买入成本,表示当前持有股票的平均买入成本 ENTERBARS:买入位置,表示上次买入到当前的周期数。 EXITBARS:卖出位置,表示上次卖出到当前的周期数. BESTTRADE:最大盈利,表示当前位置之前所有交易中盈利最大一次的利润额。 BESTPERCNET:最大利润率,表示当前位置之前所有交易中利润率最大一次的利润率。 WORSTTRADE:最大亏损,表示当前位置之前所有交易中亏损最大一次的亏损额。 WORSTPERCENT:最大亏损率,表示当前位置之前所有交易中亏损率最大一次的利润率。 TOTALTRADE:交易次数,表示当前位置之前总共有多少次交易,注意每一次卖出算一次交易,而买入不算。 NUMWINTRADE:盈利交易次数,表示当前位置之前总共有多少次盈利的交易。 NUMLOSSTRADE:亏损交易次数,表示当前位置之前总共有多少次亏损的交易。 NUMSEQWIN:当前连续盈利次数,表示当前位置之前连续有多少次盈利的交易。 NUMSEQLOSS:当前连续亏损次数, 表示当前位置之前连续有多少次亏损的交易。 MAXSEQWIN:最大连续盈利次数,表示当前位置之前连续盈利交易的最大次数。 MAXSEQLOSS,最大连续亏损次数,表示当前位置之前连续亏损交易的最大次数。 PERCENTWIN,交易胜率,表示当前位置之前盈利交易占总交易次数的比例,其数值在0—1之间。 5. 新交易系统的K线指示 使用系统指示功能,在K线图上显示新交易系统的交易指示与以往有些不同,主要表现在: 1.交易指示的下面可以标注买卖量,买入用Bxxx表示买入若干股,而卖出用Sxxx表示卖出若干股。配合标注箭头旁的切入点指示小三角,可以方便地让用户看到每一个交易的交易价格和交易量。可以通过鼠标右键点取指示箭头并选择“系统指示显示买卖量”用来隐藏或显示买卖量。 2.显示未成交的交易,过去只要条件满足,就显示买卖箭头,而不管该箭头是否能够成交;现在我们将不能够成交指示用灰色来显示,方便用户分析。可以通过鼠标右键点取指示箭头并选择“系统指示显示未成交交易”以隐藏或显示它们。 3.设定资金投入日期,由于加入的资金策略,在什么时间开始计算(即投入资金时间)将会直接影响交易系统的计算,因此可以设定资金投入时间,方法是鼠标右键点取指示箭头并选择“设定系统指示开始计算时间”。缺省情况下使用股票上市时间。 4.与新交易系统指示配合,系统加入3个内嵌指标,他们用来显示系统指示中第一个新交易系统的收益、利润、持仓状态。这三个指标分别是:PROFIT利润指标,显示交易系统的历史总盈利和持仓股票的浮动利润;MARKET浮动市值指标,显示交易系统的浮动市值和总市值,其区别在于后者只有卖出时才重新计算,而前者是随着股价的变化随时计算;HOLDING持仓量指标,显示持仓量的历史变化情况。这三个指标只有在交易系统指示中存在新交易系统是才有效。 6. 新交易系统的测试 新交易系统将资金模型、连续买入模型都已经放到公式中进行设定,因此在系统测试平台中有关资金模型、连续买入模型都被禁止,全市场模型也被禁止。 7. 新交易系统指标 配合新交易系统,分析家V5.0内嵌了三个指标,MARKET,PROFIT,HOLDING,当主图上系统指示中存在新交易系统时,用于指示该新交易系统的市场状态。 MARKET指标描述了交易系统市值,它有浮动市值和总市值两条指标线。浮动市值表示现金+持有股票的市值,而总市值表示每次卖出后的总资产情况,而买入及持仓过程中的浮动市值不计算在内。 PROFIT指标描述了每次交易的利润情况,它有利润和浮动利润两条指标线,利润表示每次卖出所产生的利润的累计,而浮动利润则表示当前持仓的浮动利润。 HOLDING指标描述了持仓量,它表示当前持有股票的数量。 8. 新交易系统举例 例1:涨幅超过5%则以30%资金买入,超过8%则以50%资金买入,跌幅超过4%则卖出50%,跌幅超过8%则全部卖出。买入使用限价单,卖出使用收市价单: PR := (CLOSE/REF(CLOSE,1)-1)*100; IF PR>8 THEN BUY(50%,LIMIT,CLOSE); ELSE IF PR>5 THEN BUY(30%,LIMIT,CLOSE); ELSE IF PR<-8 THEN SELL(100%); ELSE IF PR<-4 THEN SELL(50%); 例2:若5日均线与20日均线金叉,则增加持仓量一倍,至少买入1000股。 IF CROSS(MA(CLOSE,5),MA(CLOSE,20)) THEN BUY(MAX(HOLDING,1000)); 这样碰到连续买入信号时,其买入量为1000股,1000股,2000股,4000股… 六. 字符串 1. 字符串的定义 在公式中,我们有时候需要输出一些文字,这就需要使用字符串。字符串常量我们在过去的版本中已经存在,就是使用单引号“’”括起来的字符,这些字符可以在文字输出函数等地方直接使用。 在分析家5.0新公式系统中,我们引入字符串变量这个概念,它可以像数值变量一样自由改变,可以根据具体情况赋给不同的数值。字符串变量和普通变量一样可以赋值、运算、赋初始值等等。例如: S := ‘CCC’; 我们将变量S赋值‘CCC’; VARIABLE: S=’ABC’; 表示我们定义了一个字符串变量S,给它赋初始值‘ABC’; S := STKNAME+ ‘ ’ + STKLABEL; 字符串S等于股票名称后跟股票代码。 我们可以像使用字符产常量一样使用字符串变量,例如在DRAWTEXT函数中。 2. 字符串的计算 字符串可以进行计算,包括字符串比较、求字符串子串、大小写转化、字符串查找等等。字符串的比较是以字母表为顺序的,越靠后的越大,小写字母都大于大写字母。例如: STRCMP(‘ABC’,’abc’); 比较两个字符串,显然小写字母大于大写字母,所以函数返回1。 在分析家公式系统中引入字符串加法的概念,就是将后面的字符串连接到前面字符串的尾部,我们使用的一个简单的办法:用加号,例如 S := STKNAME+ ‘的代码是’ + STKLABEL; 使用加号直接将后面字符串接到前面字符串的尾部,对于浦发银行来说,字符串S等于“浦发银行的代码是600000”。 更为强大的是,字符串加法还可以直接加数值型的数据。例如: S := ’今天收盘价:’ + CLOSE; 系统会将收盘价CLOSE的数值转化为字符串连接进来。所以,当我们看到一个字符串加上数值的时候,千万不要以为这是普通的加法。除了这种隐含的转化方法外,我们还可以用函数NUMTOSTR将数值强制转化为字符串,例如: S := NUMTOSTR(CLOSE); 或者将字符串转化为数值STRTONUM。 七. 数组 本节内容较复杂,一般用户可以跳过本节。 所谓数组,就是一个容器,它可以存放多个数据,我们可以通过序号来访问这些数据。一般说来我们总是将一些相关的数据组织在一起放到数组中,当我们在使用循环的时候,数组就可以发挥它的优势。分析家公式系统目前支持一维数组。 数组在使用之前一定要先声明: VARIABLE: V[20]=0; 表示定义一个数值型数组V,它总共有20个元素,这些元素的初始值为0。 VARIABLE: S[10]=’A’; 表示定义一个字符串型数组S,它总共有10个元素,这些元素的初始值为’A’。 数组变量声明以后,就可以像普通变量一样使用了。在使用数组变量时,需要在变量名后面带上序号,表示引用数组中的第几个元素,元素的序号从1开始。例如: P:= V[5]*CLOSE; 表示V的第5号元素乘以收盘价。 数组和普通变量有一个重要的区别,数组是不能够引用过去的数值的,对数组进行引用过去数值的操作将会得到它当天的数值,就是说数组只存在当天的数值,从某种意义上来说它更像一个可以重新赋值的常量。因此, REF(V[3],1); MA(V[2],10); 等均会返回一个常数。如果你需要引用过去的数值,可以将数组元素赋值给一个普通变量,例如: P:=V[3]; MA(P,10); 使用数组以后,我们可以利用数组的序号来访问数据,这给循环带来了方便,我们通过循环可以遍历整个数组了。 八. 专业财务数据 在分析家机构版中,内嵌了二百多项专业财务数据。这些专业财务数据包含了每只股票历史上的每一次变化,对于注重基本分析的用户,我们提供了一整套结合技术分析、基本分析的公式平台。 专业财务数据包括七个函数,分别用来访问、设定专业财务数据。所有的财务数据均带有一个数据类型参数,它表示需要访问具体哪一个数据,例如1001表示总股本,5001表示第一大股东名称等等。这些函数包括: PROFFIN(N,M), PROFSTR(N,M)访问专业财务数据的数值,它们的区别在于前者得到数值型的财务数据,后者得到字符型的财务数据。N表示数据类型,M表示哪一期数据,0表示最近一期,1表示前一期。 PROFFINON(N,Y,MD), PROFSTRON(N,Y,MD)访问指定日期的财务数据,它们的区别在于前者得到数值型的财务数据,后者得到字符型的财务数据。N表示数据类型,Y表示年,MD表示月日,例如PROFFINON(1001,2001,0101)表示2001年1月1日的总股本。 SETPROFFIN(X)用来设定财务数据属性。财务数据包括季报、中报和年报,适用本函数可以决定是否需要它们中的哪一些类型。X是一个五位数,每一位表示不同的含义,最高位表示是否调整中报季报数据(分别对1季报、中报和3季报的部分财务指标做乘以3、2、4/3的处理),次高位表示是否包含最新财务指标,最低三位表示是否包含季报、中报和年报。这些位置如果为1就表示设置,如果为0就表示不需要。例如:01111就表示不对季报中报调整,数据包含全部的年报中报和季报;00001表示只需要年报。使用本函数后,其它专业财务数据函数将受到它的影响。 九. 其它 1. 数据二 我们经常需要分析两只股票之间的关系,比如它们之间的相关性、贝塔系数等,新公式系统引入数据二概念,它在公式中代表另外一只股票,这只股票可能是K线图上叠加的股票,或者相关性分析中的相关股票。语法: DATA2.[数据] 其中数据可以是CLOSE、OPEN、HIGH、LOW、VOLUME或AMOUNT,表示引用数据二的开盘价、收盘价等。例如我们可以计算两只股票收盘价之比: CLOSE/DATA2.CLOSE; 数据二对于相关性分析很重要,所谓相关性就是两个数据的相似程度,该数值分布在-1到+1之间,若等于+1表示两者完全相同,若等于-1表示两者完全相反,若等于0表示二者无关。一般说来,两只股票收盘价的相关性会在0—1之间。相关函数: RELATE(P1,P2,N); 表示P1和P2之间在最近N天的相似程度。 使用相关性分析不同的数据,得到的意义是不一样的。例如收盘价相关性: RELATE(CLOSE,DATA2.CLOSE,60); 他描述了两只股票价格走势的相似性,也就是说基本形态走势相像。而涨跌幅相关性: RELATE(CLOSE/REF(CLOSE,1),DATA2.CLOSE/REF(DATA2.CLOSE,1),60); 表示每日涨跌的相似性。使用该指标所得到的结果可能看起来走势不是十分相似,但在多数情况下它们的涨跌情况是接近的,也就是说同涨同跌。 如果用其它的指标来计算相关性,则其结果可能更难理解,但是真正掌握两只股票某种属性的相似可能会对你的投资带来很的大改变。 2. 自定义数据 分析家机构版V5.0引入自定义数据概念,用户可以利用该功能自己设定若干数据。自定义数据可以从F10资料中提取,可以使用公式计算得到,可以从文本文件引入,也可以自己手工输入。该数据是基于日线的,也就是说我们只能在日线分析周期中使用它。 自定义数据分为四类,分别是 1. 股票相关序列数:每一只股票均有它自己的一组数据,每天一个数据,它和扩展数据非常类似,我们可以用它来存储每日成交笔数、某公式计算结果等数据。 2. 股票无关序列数:所有股票共用一组数据,每天一个数据,它主要用来存储与市场相关的数据,例如每天的流通市值等。 3. 单值数据:每一只股票均有它自己的一个数据,该数据并不随时间发生变化,例如我们可以用它来存储发行价、中签率等。 4. 字符串数据:每一只股票均有它自己的一个字符串数据,该数据并不随时间发生变化,例如我们可以用它来存储板块类别、法人代表等。 用户可以根据自己的需要,设定自定义数据类型,对于从F10提取或使用公式计算得到的自定义数据,可以设定自动更新,当执行收盘作业时,系统将自动执行自定义数据的刷新工作。 每一个自定义数据均有一个名称,我们总是通过它来访问自定义数据。在公式系统中,使用SELFDATA来访问数值型的自定义数据,而使用SELFSTRING来访问字符串型的自定义数据。 在动态显示牌中,我们也可以直接显示自定义数据,方法是用鼠标右键点击标题栏,选择自定义数据并且选中需要的项目即可。 3. 交易系统介入点设定 分析家新公式系统中,新增交易系统介入点设定关键字,放在买入、卖出条件之后,用逗号将它们隔开,描述方法类似颜色、线型描述符。接入点关键字分为前后两个部分,前半部分描述时本周期介入还是次周期介入,后半部分描述以什么价格介入,具体如下: 前半部分:THIS—本周期;NEXT—次周期。 后半部分:MID—中价;CLOSE—收盘价;OPEN—开盘价;HIGH—最高价;LOW—最低价。 前后两部分直接连接,中间不能有间隔。例如: ENTERLONG: CLOSE>OPEN, NEXTOPEN; 表示如果收阳线,则在次日以开盘价买入。 4. 数据引用 公式中会大量使用数据引用函数REF,比较麻烦。现在可以在函数调用之后加上方括号表示向前引用,起作用和REF函数一样。例如: REF(CLOSE,10)可以写成CLOSE[10] REF(MA(CLOSE,10),100)可以写成MA(CLOSE,10)[100] 需要注意方括号在数据引用与数组下标之间的区别。二者形式一样,但方括号跟在函数后面就是引用,而跟在数组变量后面就是下标。 5. 坐标设定 分析家新公式系统中,坐标设定采用公式来实现,方法是: REFLINE:L1,L2,…LN; 表示在L1、L2、…LN处绘制水平坐标线。 6. 宏定义 在许多计算机语言中,均提供了宏定义,用于简化公式中大量重复语句的书写,提高程序的可读性。分析家新公式系统也提供了宏定义给用户使用,语法是: #define X Y 它表示,将Y定义为X,今后凡是书写X,就把它当作Y来处理。宏必须定义在整个公式代码的最前面。比方说 #define MMA MA(MA(CLOSE,10),10) 表示今后凡是需要MA(MA(CLOSE,10),10)计算的地方均可以用MMA来代替,直接写MMA即可。 宏定义也可以带参数,在公式编译的时候将宏定义中的参数用实际参数来替代。例如以下定义: #define MMA(x,y) MA(MA(CLOSE,x),y) x,y就是宏参数,在使用时需要用实际的参数来替代,例如: MMA(10,20)就表示MA(MA(CLOSE,10),20),再宏展开时用10代替了参数x,用20代替了参数y。 如果我们需要定义的宏很长,在一行里书写比较困难,可以用续行符“\”放在需要许行的最后位置,就可以将下一行接到宏定义中。例如: #define BBY(x) IF CLOSE>OPEN THEN BEGIN\ IF CLOSE>OPEN*1.08 THEN \ BUY(2*x); \ ELSE \ BUY(x); \ END 由于每一行的结尾均有一个续行符“\”,因此BBY宏就代表了整个这六行代码。今后凡是需要书写着六行代码,只需要书写BBY即可。 对于需要重复书写的代码,可以采用宏定义,将重复的代码定义为宏,这样可以大大减少代码量,同时也可以提高公式的可读性。 十. 调试 1. 为什么需要调试 公式系统是一个简单的程序设计环境,只要是程序设计就有可能出现差错,有可能出现没有想到的问题,因此多数程序设计工具均提供一个调试工具,让用户可以一步一步地执行程序,查看中间结果等等。 分析家新公式系统为用户提供了一个强大的设计环境,当然需要提供一个调试器用以查找错误。利用分析家公式调试器,你可以单步执行公式程序、连续单步执行、查看变量数值、设置断点,可以方便查看到公式中的任何数值是怎样计算出来的,分支是怎样执行的,循环指定了多少次等。 2. 调试前的准备工作 当你使用专业公式编辑器写完一个公式,或者打开一个现有的公式,即可进入调试。若你的公式没有语法错误,从菜单、工具条选择调试功能,或者直接按F6即可进入调试。进入调试状态后,公式编辑窗口下面出现两个小窗口,分别是变量窗口和图形窗口。 左边的窗口是变量窗口,变量窗口显示公式中所有的变量及其属性、数值,鼠标双击变量可以弹出窗口显示该变量的详细数值,而在执行过程中若数值发生变化就会用红色来显示数值。 右边的窗口是图形窗口,它的上半部分显示待计算的股票K线图,下半部分显示变量数值曲线。在变量窗口中打勾的变量将被显示,用鼠标点击变量前的方块可以改变其显示属性。用鼠标点击图形窗口右侧的股票名称、分析周期可以改变待计算的股票或分析周期。 此时公式第一行的左侧线是一个黄色箭头,它表示当前正在准备执行该语句。我们在整个调试过程中可以看到该标志随着执行过程不断在移动。 3. 运行 调试准备好以后,按F5就可以执行了,此时公式将很快被执行完,然后停在程序的最后一行,此时你可以查看变量内容和图形。 如果按Ctrl+F5表示重新执行程序,系统将重新启动公式并且停留在第一行等待执行。 如果按Shift+F5表示停止执行,这对于跳出一个长时间的循环非常有用。 4. 单步运行 从菜单、工具条选择单步执行,或者按F11可以单步执行,此时每按一次执行一条语句,在执行过程中可以方便地了解到变量的计算过程,程序的执行流程等。我们还可以选择连续单步执行来让电脑自动进行单步运行,此是可以将双手解放出来。 我们会发现,当公式执行到最后一行以后,它有跳回到第一行执行,这和一般的程序可不一样!细心的你可能已经发现,在右下角图形成口中的红色箭头已经悄悄地向右移动了一天,这就是我们所说的隐含循环。程序从第一行执行到最后一行,然后计算第二天的数据,又从程序第一行开始执行了。 5. 执行到指定目标 有时候程序比较长,或者循环太多,使用单步太慢,可以使用执行到指定目标,移动光标到你需要的程序行,然后按F7,公式将执行到该行后停下。 6. 设置断点 断点就是程序每次执行到该行就停下,与F5连续执行配合可以提高工作效率。将光标移到需要设定断点的位置,按F9可以设定或取消断点。断点所在行的左边会有一个紫红色的圆形,表示该行被设置了断点。 7. 查看变量内容 当程序运行到某处停下来后,鼠标双击变量窗口的某变量,可以查看变量内容。对于简单变量,变量窗口中已经显示了它的数值,但对于序列数、数组等变量,可以使用本功能详细了解变量的每一个元素的内容。 8. 运行到指定时间 我们说过,公式中存在一个隐含循环,公式是一天一天执行的。当我们需要执行到时间相对靠后的数据时,可能需要的循环次数就很多,此时可以有鼠标右键点击图形窗口中的你所需要的K线的位置,从弹出菜单中选择执行到该K线或者指定到指定日期就可以跳过前面不必要的循环。 十一. 综合举例 1. 均线系统 在以往均线系统的编制需要用到函数MA(X,N),该函数表示求X的N日内平均值。在新公式系统中,没有函数照样可以实现MA(CLOSE,N)。 INPUT:N(5,1,300); {参数申明} VARIABLE:K=0; {变量申明} FOR I=0 TO N-1 DO K:=K+REF(CLOSE,I);{把最近 N 天的收盘价累加} MA1:K/N; {实现MA(C,N)} K:=0; 2. 指数平滑移动平均线 指数平滑移动平均线与上面的简单均线系统相比,主要在于均线的算法略有区别,简单均线只是将N日内的收盘价相加然后平均,而指数平滑移动平均线中包含昨日的该数值,因此理论上比简单平均更有价值。 指数平均的算法为: 若Y=EMA(X,N), 则Y=[2*X+(N-1)*Y']/(N+1),其中Y'表示上一周期Y值。 如果不使用EMA函数, EMA(CLOSE,N)在新公式系统中可以这样书写: INPUT:N(5,1,300); VARIABLE:EMA1=0; {初始化变量} EMA1:(2*C+(N-1)*EMA1)/(N+1); {新公式系统中可以直接迭代,表示指标EMA1由昨天的EMA1的一种算法得到} 3. 宝塔线(鬼变脸) 如果昨天宝塔线是红的,以“昨顶端”为“今开端”,以“昨底端”为“今敏感”; 如果昨天宝塔线是绿的,以“昨底端”为“今开端”,以“昨顶端”为“今敏感”; 如果昨天宝塔线是变色的,则以“昨敏感”为“今敏感”,以强化宝塔线的“隔日纠错功能”。 要实现上面的功能,需要根据昨天宝塔线的状态来画今天的宝塔线,在老公式系统中无法实现这样的功能。在新公式系统中,可以通过分支语句和迭代的方式实现: VARIABLE:SENSITIVY=-1,TOWERO=0,TOWERC=0,DIRECTION=1; IF BARSCOUNT(C)=0 THEN BEGIN TOWERO:=O; TOWERC:=C; END; IF TOWERC>TOWERO AND NOT(BETWEEN(SENSITIVY,TOWERO,TOWERC)) THEN DIRECTION:=1; ELSE IF TOWERC< TOWERO AND NOT(BETWEEN(SENSITIVY,TOWERO,TOWERC)) THEN DIRECTION:=0; ELSE DIRECTION:=REF(DIRECTION,1); IF NOT(REF(BETWEEN(SENSITIVY,TOWERO,TOWERC),1)) THEN BEGIN TOWERO:=REF(TOWERC,1);TOWERC:=C; SENSITIVY:=REF(TOWERO,1); END ELSE BEGIN TOWERO:=REF(TOWERC,1);TOWERC:=C; SENSITIVY:=REF(SENSITIVY,1); END; IF BETWEEN(SENSITIVY,TOWERO,TOWERC) THEN BEGIN STICKLINE(BETWEEN(SENSITIVY,TOWERO,TOWERC),MAX(TOWERO,TOWERC),SENSITIVY,7,0), COLORRED; STICKLINE(BETWEEN(SENSITIVY,TOWERO,TOWERC),MIN(TOWERO,TOWERC),SENSITIVY,7,0), COLORGREEN; END ELSE BEGIN STICKLINE(SENSITIVY< TOWERC,TOWERO,TOWERC,7,0), COLORRED; STICKLINE(SENSITIVY>TOWERC,TOWERO,TOWERC,7,0), COLORGREEN; END; STICKLINE((TOWERC=TOWERO OR SENSITIVY=TOWERC) AND DIRECTION=1,TOWERO,TOWERC,7,0),COLORRED; STICKLINE((TOWERC=TOWERO OR SENSITIVY=TOWERC) AND DIRECTION=0,TOWERO,TOWERC,7,0),COLORGREEN; 4. 自动在MACD指标图上标注现在是处于0轴以下的第几次金叉] INPUT:LONG(26,20,100,1),SHORT(12,5,40,1),M(9,2,60); VARIABLE:I=0; DIFF : EMA(CLOSE,SHORT) - EMA(CLOSE,LONG); DEA : EMA(DIFF,M); MACD : 2*(DIFF-DEA), COLORSTICK; JC:=CROSS(DIFF,DEA); SC:=CROSS(DEA,DIFF); JCCOUNT:=COUNT(JC,BARSLAST(DEA>0)); TEXT:=NUMTOSTR(JCCOUNT); DRAWTEXT(DEA<0 AND JC,DEA*0.8,TEXT); 十二. 新增函数列表 1. 相关性函数 1. BETA 贝塔系数 BETA(N); 贝塔系数表示当前股票的收益与大盘收益相比的放大系数,该系数表明大盘每变动1%,则该股票将变动多少。该函数有一个参数N,表示在多少个周期中计算。 例如:BETA(10)表示10周期贝塔系数 2. BETA2 贝塔系数2 BETA2(X,Y,N) 贝塔系数2表示第一个参数X相对于第二个参数Y的收益的放大系数,该系数表明参数Y每变动1%,则参数X将变动多少。该函数的第三个参数N表示在多少个周期中计算。 例如:BETA2(CLOSE,INDEXC,10)就完全等同于BETA(10) 3. BETADOWN 下跌贝塔系数 BETADOWN(N) 为当前股票收益与大盘收益相比的下跌贝塔系数,该系数表明大盘每下跌1%,则该股票将下跌N%。它的计算方法是只计算股票下跌时的贝塔系数。 例如:BETADOWN(10)表示10周期下跌贝塔系数 4. BETAUP 上涨贝塔系数 BETAUP(N) 为当前股票收益与大盘收益相比的上涨贝塔系数,该系数表明大盘每上涨1%,则该股票将上涨N%。它的计算方法是只计算股票上涨时的贝塔系数。 例如:BETAUP(10)表示10周期上涨贝塔系数 5. COVAR 两样本的协方差 COVAR(X,Y,N); 计算X与Y的N周期协方差。协方差的计算方法是: 例如:COVAR(CLOSE,INDEXC,10)表示收盘价与大盘指数之间的10周期协方差 6. RELATE 两样本的相关系数 RELATE(X,Y,N) 为X与Y的N周期相关系数,其有效值范围在-1 — 1之间 例如:RELATE(CLOSE,INDEXC,10)表示收盘价与大盘指数之间的10周期相关系数 2. 除权除息 1. DIVIDENDBARS 上次派息到现在的周期数 DIVIDENDBARS(N) 取得之前第N次派息到当前的周期数。 例如:DIVIDENDBARS(0)=0表示当天发生派息。 2. DIVIDEND 每股派息数量 DIVIDEND(N), 取得之前第N次每股派息数量, 例如:DIVIDEND(0)表示最近一次派息的数量。 3. SPLIT 除权比例 SPLIT(N), 取得之前第N次除权(送股或配股)的除权比例,表示除权后股价将下跌该比例 例如:SPLIT(0)=0.5表示最近一次除权可能是10送10,股价下跌一半。 4. SPLITVARS 除权到现在的周期数 SPLITBARS(N), 取得之前第N次除权到当前的周期数, 例如:SPLITBARS(0)=0表示当天发生除权。 3. 行情函数 1. DISPSTATUS 数据显示状态 DISPSTATUS返回数据显示信息,1表示显示区域的第一根K线,2表示显示区域最后一根K线,0表示其它位置。 例如:DISPSTATUS=1表示当天是图形显示中的第一个周期。 4. 时间函数 1. BARPOS 数据位置 函数返回当前是第几根K线。特别的,对于日线数据就表示从上市到现在总共有多少交易日。 2. DAYS1970 取得该周期从1970以来的天数 函数返回自从1970年1月1日以来的天数,例如在1971年1月1日返回365,它与DAY函数不同,前者表示的是天数间隔,后者表示的是日期。 3. D1970TODATE 1970日转换为日期 D1970TODATE(X), 得到1970日期X的日期值。 4. DATETOD1970 日期转换为1970日 DATETOD1970(X),得到日期X距离1970年1月1日以来的天数 例如:DATETOD1970(DATE)就返回今天距离1970年1月1日的天数。 5. TIME0 取得该周期从当日0点以来的秒数 函数返回自从当日0点以来的秒数,对于日线以上的分析周期,返回0 6. T0TOTIME 秒数转换为时间 T0TOTIME(X),得到从0点开始X秒后的时间值。 7. TIMETOT0 时间转化为秒数 TIMETOT0(X),得到时间X距离当日0点的秒数。 5. 引用函数 1. ALL 一直满足条件 ALL(X,N), 统计N周期中是否一直都满足X条件,若N=0则从第一个有效值开始。 例如:ALL(CLOSE>OPEN,20)表示是否20周期内全部都收阳线。 2. ANY 至少一次满足条件 ANY(X,N), 统计N周期中是否至少有一次满足X条件,若N=0则从第一个有效值开始。 例如:ANY(CLOSE>OPEN,20)表示是否20周期内是否存在一根阳线。 6. 常数函数 1. CATEGORY 证券类型 证券类型,指数=0,股票=1,基金=2,债券=3,其它=4,期权=5,外汇=6,期货=7。 2. CURRENTDATE 计算当时的日期。 返回计算时的日期,该日期是从1900年开始的日期,例如2003年1月1日表示为1030101。 注意:该函数返回常数 3. CURRENTTIME 计算当时的时间 返回计算时的时间,格式为时分秒,有效范围(000000-235959)。 注意:该函数返回常数 4. DATATYPE 当前分析的数据类型 返回数据分析周期,分时线=1,分笔成交=2,1分钟线=3,5分钟线=4,15分钟线=5,30分钟线=6,60分钟线=7,日线=8,周线=9,月线=10,多日线=11,年线=12。 注意:该函数返回常数 5. MINDIFF 最小价格变动 返回当前股票价格最小变动量,对于股票是0.01元,基金是0.001。 注意:该函数返回常数 6. PRODUCTID 取得软件序列号 返回软件的序列号(加密狗号)。 注意:该函数返回字符串常数 7. 绘图函数 1. DRAWBMP 画位图 DRAWBMP(COND,PRICE,BMPFILE), 当COND条件满足时,在PRICE位置画BMPFILE文件名指定的BMP位图(缺省路径为分析家目录\USERDATA\BMP)。 例如:DRAWBMP(CLOSE>OPEN,LOW,'SUN')表示当收阳时在最低价位置画Superstk\UserData\Bmp\Sun.BMP位图。 2. DRAWGBK 条件填充背景 DRAWGBK(COND,COLOR), 填充满足COND条件的背景区域。COLOR可以为渐变颜色STRIP,也可以为BMP图形文件名(缺省路径为分析家目录\USERDATA\BMP),若省略COLOR则使用指标线颜色填充(可以使用COLORRED等描述符设定)。 例如:DRAWGBK(CLOSE>OPEN),COLORRED;表示收阳时用红色填充背景。 DRAWGBK(CLOSE>OPEN,'MyBMP');表示收阳时用USERDATA\BMP\MyBMP.BMP填充背景。 3. DRAWGBKLAST 最后条件填充背景 DRAWGBKLAST(COND,COLOR), 若图形中最后一根K线满足条件COND,则设定背景COLOR。COLOR可以为渐变颜色STRIP,也可以为BMP图形文件名(缺省路径为分析家目录\USERDATA\BMP),若省略则使用指标线颜色填充(可以使用COLORRED等描述符设定)。 例如:DRAWGBKLAST(CLOSE>OPEN),COLORRED;表示最后一根K线收阳时用红色填充背景。 DRAWGBKLAST(CLOSE>OPEN,STRIP(RGB(255,0,0),RGB(0,255,0),1));表示图形中最后一根K线收阳时红绿过渡色沿水平方向填充背景。 4. FILLRGN 条件填充区域 FILLRGN(PRICE1,PRICE2,COND1,COLOR1,COND2,COLOR2...), 填充PRICE1到PRICE2之间的区域,当COND1条件满足时,用COLOR1颜色,当COND2条件满足时,用COLOR2颜色,否则不填充,从COLOR1之后的参数均可以省略,最多可以有15组条件。 例如:FILLRGN(CLOSE,OPEN,CLOSE>OPEN,RGB(255,0,0),CLOSE< OPEN,RGB(0,255,0))表示填充开盘价和收盘价之间的区域,阳线时用红色,阴线时用绿色,平盘不绘制。 5. PARTLINE 条件画线 PARTLINE(PRICE,COND1,COLOR1,COND2,COLOR2...), 绘制PRICE线,当COND1条件满足时,用COLOR1颜色,当COND2条件满足时,用COLOR2颜色,否则不绘制,从COLOR1之后的参数均可以省略,最多可以有15组条件。 例如:PARTLINE(CLOSE,CLOSE>OPEN,RGB(255,0,0),CLOSE< OPEN,RGB(0,255,0),1,RGB(0,0,255))表示画收盘价线,阳线时用红色,阴线时用绿色,平盘用蓝色。注意最后一个条件为1,表示前面都不满足时必然满足这个条件。 6. RGB 指定颜色 RGB(R,G,B), 表示用三原色红(R)绿(G)蓝(B)混合组成指定颜色,每种颜色值可以设定为0-255。 例如RGB(255,0,0)表示红色,RGB(0,0,255)表示蓝色 7. STRIP 描述渐变色 STRIP(RGB1,RGB2,DIR), 表示生成RGB1色到RGB2色的渐变区域,DIR=1表示沿水平方向,否则表示沿垂直方向,其中RGB1,RGB2必须用RGB函数描述。 例如STRIP(RGB(255,0,0),RGB(0,255,0),0)表示由红色到绿色的垂直渐变色。 8. TIPTEXT 在图形上显示图标及文字 TIPTEXT(COND,PRICE,TEXT), 当COND条件满足时,在PRICE位置显示图标,鼠标移近时显示文字。 例如:TIPTEXT(CLOSE/OPEN>1.08,LOW,'大阳线,股价为:'+close)表示当日涨幅大于8%时在最低价位置显示图标,鼠标移近时显示文字'大阳线,股价为:15.88'字样。 9. VERTLINE 画垂直线 VERTLINE(COND,TYPE), 当COND条件满足时,沿垂直方向绘制TYPE类型的线段,TYPE=0表示实线,1表示虚线'---',2表示点线'...',3表示点划线'-.-.-',4表示点点划线'-..-..-'。 例如:VERTLINE(HIGH>=HHV(HIGH,20),1)表示在创20天新高画垂直虚线。 8. 字符串函数 1. F10FIND 当前F10资料中查找字符串 F10FIND(S,N), 将从当前股票的F10资料的第N个字符开始查找字符串S,返回找到的位置,返回值为负数表示未找到。 例如:F10FIND('发行价',1),将从F10资料的第1个字符开始查找字符串'发行价',返回找到的位置。 2. F10TEXT 取得F10资料中指定范围的字符串 F10TEXT(N,M),将得到当前股票的F10资料中从第N个字符开使的M个字节长的字符串,M=0表示一直取到行尾,M<0表示取得之后的全部字符。 例如:F10TEXT(30,10),将得到F10资料中从第30个字符开使的10个字节长的字符串。 3. INBLOCK 判断本股票是否板块成员 INBLOCK(S), 若本股票是板块S的成员将返回1,否则返回0。 例如:INBLOCK('工业板块'),若本股票属于工业板块则返回1。 4. LOWERSTR 将字符串转换为小写 LOWERSTR(STR), 将返回STR对应的小写字符串。 例如:LOWERSTR('EFgh')将返回'efgh'。 5. MARKETLABEL 取得当前股票的市场代码 将返回当前股票的市场代码, 例如:沪市返回'SH',深市返回'SZ'。 6. MARKETNAME 取得当前股票的市场名称 将返回当前股票的市场名称, 例如:沪市返回'上海证券交易所',深市返回'深圳证券交易所'。 7. NUMTOSTR 将数字转化为字符串 NUMTOSTR(N), 将N转化为字符串返回,精确到小数点后三位,但小数点后的结尾为0将被删除。 例如:NUMTOSTR(close)将返回收盘价对应的字符串,例如'15.78'。 8. NUMTOSTRN 将数字转化为字符串 NUMTOSTRN(N,M), 将N转化为字符串返回,精确到小数点后M位。 例如:NUMTOSTRN(close,5)将返回收盘价对应的字符串,例如'15.78000'。 9. SELFSTRING 自定义字符串数据 SELFSTRING(S), 取得名为S的自定义字符串数据 10. STKLABEL 取得股票代码 将返回当前股票的代码, 例如深发展A将返回'000001'。 11. STKNAME 取得股票名称 将返回当前股票的名称。 12. STRCMP 字符串比较 STRCMP(STR1,STR2), 若STR1>STR2则返回1,STR1< STR2返回-1,相等则返回0。 例如:STRCMP('abcdef','abc')返回1。 13. STRFIND 在字符串中查找另一个字符串 STRFIND(STR,S1,N), 从字符串STR的第N个字符开始查找字符串S1,返回找到的位置,若没有找到就返回0。 例如:STRFIND('abcdefgh','cde',1)返回3。 14. STRLEFT 取得字符串的左边部分 STRLEFT(STR,N), 返回字符串STR的左边N个字符。 例如:STRLEFT('abcdef',3)得到'abc'。 15. STRMID 取得字符串的中间部分 STRMID(STR,N,M), 返回字符串STR的第N个字符开始的长度为M个字符的字符串。 例如:STRMID('abcdef',3,3)得到'cde'。 16. STRRIGHT 取得字符串的右边部分 STRRIGHT(STR,N), 返回字符串STR的右边N个字符。 例如:STRRIGHT('abcdef',3)得到'def'。 17. STRTONUM 将字符串转化为数字 STRTONUM(STR),将STR转化为数字返回。 例如:STRTONUM('12.5')将返回数值12.5。 18. UPPERSTR 将字符串转换为大写 UPPERSTR(STR), 将返回STR对应的大写字符串。 例如:UPPERSTR('abcd')将返回'ABCD'。 9. 指标函数 1. FLATZIG 归一化之字转向 FLATZIG(K,N), 它与ZIG函数非常相似,不同的是本函数返回值在0-1之间,也就是说在峰顶时返回1,峰谷时返回0。K表示0:开盘价,1:最高价,2:最低价,3:收盘价,4:低点采用最低价、高点采用最高价。 例如:FLATZIG(3,5)表示收盘价的5%的归一化ZIG转向 10. 数据函数 1. SELFDATA 取得自定义数据 SELFDATA(S), 取得名为S的自定义数据,(本函数仅在日线分析周期有效) 例如,SELFDATA(‘每股收益’)表示取得名为每股收益的自定义数据的数值。 2. SELFSTRING 取得自定义字符串数据 SELFSTRING(S), 取得名为S的自定义字符串数据,(本函数仅在日线分析周期有效) 11. 专业财务数据 1. PROFFIN 专业财务数据。 PROFFIN(N,M) 表示取得M个报告期之前的第N号专业财务数据, 例如PROFFIN(1001,0)表示最近一期总股本,N的取值请参阅下表 2. PROFSTR 专业财务字符串数据 PROFSTR(N,M) 表示取得M个报告期之前的第N号专业财务字符串数据, 例如PROFSTR(4001,0)表示最近一期第一大股东名称,N的取值请参阅下表 3. PROFFINLAST 专业财务数据截止期位置 PROFFINLAST(N) 表示最近报告期的第N号专业财务数据距离现在的周期数,N的取值请参阅下表 4. PROFFINON 指定日期的专业财务数据 PROFFINON(N,Y,MD) 表示取得Y年M月D日的第N号专业财务数据, 如PROFFINON(1001,2000,0101)取得2000年1月1日的总股本,N的取值请参阅下表 5. PROFSTRON 指定日期的专业字符串财务数据 PROFFINON(N,Y,MD) 表示取得Y年M月D日的第N号专业财务数据, 如PROFSTRON(5001,2000,0101)取得2000年1月1日的第一大股东名称,N的取值请参阅下表 6. PROFFINTERM 专业财务数据报告期 PROFFINTERM(M) 表示取得M个报告期之前的财务报表是年报、中报还是季报 返回1:第一季度季报,2:中报,3:第三季度季报,4:年报 例如:若PROFFINTERM(0)等于4,则表示最近一期财务报表是年报。 7. SETPROFFIN 设置专业财务数据 SETPROFFIN(X) 在本函数后的其它专业财务函数将受到本次属性设置的影响,表示将专业财务数据属性设定为X,X从低到高每一位表示一个含义 第1位:包含年报, 第2位:包含中报, 第3位:包含季报, 第4位:包含最新财务指标, 第5位:调整中报、季报财务指标, 例如SETPROFFIN(01011)表示取得年报、中报,最新一期数据,无论是那个报告期都要包括在内,中报不作调整 如果不调用本函数,系统默认值为01111 12. 专业财务数据代码内容对照表 股本结构 1001 总股本 1002 国家股 1003 发起人股 1004 法人股 1005 一般法人配售 1006 内部职工股 1007 流通A股 1008 战略投资A股 1009 转配股 1010 基金配售 1011 H股 1012 B股 1013 优先股 1014 高级管理人员持股 1015 股本变动原因 1016 股本变动原因类别 1017 股本变动报告期 1018 截止日期 分红送配 2001 送股比例 2002 送股股权登记日 2003 送股除权日 2004 红股上市日 2005 转增比例 2006 转增股权登记日 2007 转增除权日 2008 转增上市日 2009 派现比例 2010 派现股权登记日 2011 派现除息日 2012 派现派息日 2013 配股比例 2014 配股股权登记日 2015 配股除权基准日 2016 配股缴款起始日 2017 配股缴款终止日 2018 配股可流通上市日 2019 配股价 2020 公众股受让法人股配股比例 2021 认购法人股配股每股转让费 2022 配股主承销商 2023 除权日期 2024 报告日期 2025 董事会日期 2026 股东会日期 2027 分红公告日期 2028 总股本基数 2029 送股数量 2030 转增总数量 2031 实际配股总数 2032 除权后总股本 财务数据 3001 短期投资净额 3002 应收帐款净额 3003 存货净额 3004 流动资产 3005 长期投资净额 3006 固定资产 3007 无形及其他资产 3008 总资产 3009 短期借款 3010 应付帐款 3011 流动负债 3012 长期负债 3013 负债合计 3014 股本 3015 少数股东权益 3016 股东权益 3017 资本公积 3018 盈余公积 3019 主营业务收入净额 3020 主营业务成本 3021 主营业务利润 3022 其它业务利润 3023 营业费用 3024 管理费用 3025 财务费用 3026 投资收益 3027 利润总额 3028 所得税 3029 净利润 3030 扣除经常性损益后的净利润 3031 未分配利润 3032 经营活动现金收入 3033 经营活动现金流出 3034 经营活动现金净额 3035 投资现金流入 3036 投资现金流出 3037 投资现金净额 3038 筹措现金流入 3039 筹措现金流出 3040 筹措现金净额 3041 现金及现金等价物净增额 3042 销售商品收到的现金 3043 每股收益 3044 每股净资产 3045 调整后每股净资产 3046 每股资本公积金 3047 每股未分配利润 3048 每股经营活动产生的现金流量净额 3049 每股现金及现金等价物增加净额 3050 毛利率 3051 主营业务利润率 3052 净利率 3053 总资产报酬率 3054 净资产收益率 3055 销售商品收到的现金占主营收入比例 3056 应收帐周转率 3057 存货周转率 3058 固定资产周转率 3059 主营业务增长率 3060 净利润增长率 3061 总资产增长率 3062 净资产增长率 3063 流动比率 3064 速动比率 3065 资产负债比率 3066 负债比率 3067 股东权益比率 3068 固定资产比率 3069 扣除非经常性损益后每股净利润 3070 报告日期 3071 截止日期 增发回购 4001 增发发行方式 4002 增发发行时间 4003 增发发行价格 4004 增发资产置换折股数 4005 增发发行总数量 4006 增发配售给基金数量 4007 增发公众股配售数量 4008 增发公众股配售比例 4009 增发公众股配售缴款日期 4010 增发每一账号申购上限 4011 增发上网发行数量 4012 增发发行市盈率 4013 增发发行中签率 4014 增发发行募集资金 4015 增发上市日期 4016 增发主承销商 4017 协调人 4018 增发上市推荐 4019 增发发行副主承销商 4020 回购数量 4021 回购比例 4022 回购价格 4023 回购支付资金总额 4024 回购支付资金来源 4025 回购支付资金方式 4026 回购对象 4027 回购股份名称 4028 回购期限开始日期 4029 报告日期 4030 截止日期 十大股东 5001 第一股东名称 5002 股东持股数量 5003 股东持股比例 5004 备注 5005 法人 5006 经营范围 5007 第二股东名称 5008 股东持股数量 5009 股东持股比例 5010 备注 5011 法人 5012 经营范围 5013 第三股东名称 5014 股东持股数量 5015 股东持股比例 5016 备注 5017 法人 5018 经营范围 5019 第四股东名称 5020 股东持股数量 5021 股东持股比例 5022 备注 5023 法人 5024 经营范围 5025 第五股东名称 5026 股东持股数量 5027 股东持股比例 5028 备注 5029 法人 5030 经营范围 5031 第六股东名称 5032 股东持股数量 5033 股东持股比例 5034 备注 5035 法人 5036 经营范围 5037 第七股东名称 5038 股东持股数量 5039 股东持股比例 5040 备注 5041 法人 5042 经营范围 5043 第八股东名称 5044 股东持股数量 5045 股东持股比例 5046 备注 5047 法人 5048 经营范围 5049 第九股东名称 5050 股东持股数量 5051 股东持股比例 5052 备注 5053 法人 5054 经营范围 5055 第十股东名称 5056 股东持股数量 5057 股东持股比例 5058 备注 5059 法人 5060 经营范围 5061 股东总数 5062 国家股法人股股东数 5063 流通股A股股东数 5064 流通股B股股东数 5065 报告日期 5066 截止日期 基金周报 6001 基金设立日期 6002 基金管理人 6003 基金托管人 6004 基金规模 6005 基金净值总额 6006 基金单位净值 6007 基金单位初值 6008 基金调整后净值 6009 基金调整后初值 6010 基金增长率 6011 基金累计净值 6012 报告日期 6013 截止日期 基金持股情况 7001 第一名称代码 7002 市值 7003 占净值比例 7004 第二名称代码 7005 市值 7006 占净值比例 7007 第三名称代码 7008 市值 7009 占净值比例 7010 第四名称代码 7011 市值 7012 占净值比例 7013 第五名称代码 7014 市值 7015 占净值比例 7016 第六名称代码 7017 市值 7018 占净值比例 7019 第七名称代码 7020 市值 7021 占净值比例 7022 第八名称代码 7023 市值 7024 占净值比例 7025 第九名称代码 7026 市值 7027 占净值比例 7028 第十名称代码 7029 市值 7030 占净值比例 7031 报告日期 7032 截止日期 13. 交易系统函数 1. AVGENTERPRICE 平均买入成本 交易系统中当前持有股票的平均买入成本 该函数仅在使用Buy,Sell新交易函数的交易系统中有效. 2. BESTPERCENT 最大利润率 交易系统中当前位置之前所有交易中利润率最大一次的利润率 该函数仅在使用Buy,Sell新交易函数的交易系统中有效. 3. BESTTRADE 最大盈利 交易系统中当前位置之前所有交易中盈利最大一次的利润额 该函数仅在使用Buy,Sell新交易函数的交易系统中有效. 4. BUY 买入 本函数仅能用于交易系统。 BUY(V,Type,P); 表示买入V股当前股票,Type表示买入类型,P表示买入价格,所有参数均可以省略。 V:买入股数或买入资金百分比(N%),省略表示100%; Type:可以是本周期收盘(THISCLOSE),次周期开盘(MARKET),次周期限价单(LIMIT),次周期停损单(STOP); P:对于限价单、停损单需要指定的买入价格 例如: IF CLOSE>OPEN THEN BUY(1000,CLOSE);表示收阳线则在本周期收盘价上买入1000股。 BUY(50%,LIMIT,CLOSE-0.2);表示在次周期CLOSE-0.2元位置下买入限价单,若价格达到或低于该价格则用50%资金买入。 5. BUYSHORT 空头买入 本函数仅能用于交易系统。 BUYSHORT(V,Type,P); 表示空头买入V股当前股票,Type表示买入类型,P表示买入价格,所有参数均可以省略。 V:买入股数或买入资金百分比(N%),省略表示100%; Type:可以是本周期收盘(THISCLOSE),次周期开盘(MARKET),次周期限价单(LIMIT),次周期停损单(STOP); P:对于限价单、停损单需要指定的买入价格 例如: IF CLOSE>OPEN THEN BUYSHORT(1000,CLOSE);表示收阳线则在本周期收盘价上空头买入1000股。 BUYSHORT(50%,LIMIT,CLOSE-0.2);表示在次周期CLOSE-0.2元位置下空头买入限价单,若价格达到或高于该价格则用50%资金空头买入。 6. CASH 现金存量 交易系统中当前的现金存量 该函数仅在使用Buy,Sell新交易函数的交易系统中有效. 7. ENTERBARS 买入位置 交易系统中上次买入到当前的周期数 该函数仅在使用Buy,Sell新交易函数的交易系统中有效. 8. ENTERPRICE 买入价格 交易系统中上次交易的买入价格 该函数仅在使用Buy,Sell新交易函数的交易系统中有效. 9. EXITBARS 卖出位置 交易系统中上次卖出到当前的周期数 该函数仅在使用Buy,Sell新交易函数的交易系统中有效. 10. EXITPRICE 卖出价格 交易系统中上次交易的卖出价格 该函数仅在使用Buy,Sell新交易函数的交易系统中有效. 11. HOLDING 当前持仓量 交易系统中当前持有的股票股数 该函数仅在使用Buy,Sell新交易函数的交易系统中有效. 12. MAXSEQLOSS 最大连续亏损次数 交易系统中当前位置之前连续亏损交易的最大次数 该函数仅在使用Buy,Sell新交易函数的交易系统中有效. 13. MAXSEQWIN 最大连续盈利次数 交易系统中当前位置之前连续盈利交易的最大次数 该函数仅在使用Buy,Sell新交易函数的交易系统中有效. 14. NUMLOSSTRADE 亏损交易次数 交易系统中当前位置之前总共有多少次亏损的交易,注意每次卖出算一次交易,而买入不算 该函数仅在使用Buy,Sell新交易函数的交易系统中有效. 15. NUMSEQLOSS 当前连续亏损次数 交易系统中当前位置之前连续有多少次亏损的交易,注意每次卖出算一次交易,而买入不算 该函数仅在使用Buy,Sell新交易函数的交易系统中有效. 16. NUMSEQWIN 当前连续盈利次数 交易系统中当前位置之前连续有多少次盈利的交易,注意每次卖出算一次交易,而买入不算 该函数仅在使用Buy,Sell新交易函数的交易系统中有效. 17. NUMTRADEWIN 盈利交易次数 交易系统中当前位置之前总共有多少次盈利的交易,注意每次卖出算一次交易,而买入不算 该函数仅在使用Buy,Sell新交易函数的交易系统中有效. 18. OPENPROFIT 浮动盈亏 交易系统中当前浮动盈亏(当前持仓市值与持仓成本之差) 该函数仅在使用Buy,Sell新交易函数的交易系统中有效. 19. PERCENTWIN 交易胜率 交易系统中当前位置之前盈利交易占总交易次数的比例,其数值在0—1之间 该函数仅在使用Buy,Sell新交易函数的交易系统中有效. 20. SELL 卖出 本函数仅能用于交易系统。 SELL(V,Type,P); 表示卖出V股当前股票,Type表示卖出类型,P表示卖出价格,所有参数均可以省略。 V:卖出股数或卖出持仓百分比(N%),省略表示100%; Type:可以是本周期收盘(THISCLOSE),次周期开盘(MARKET),次周期限价单(LIMIT),次周期停损单(STOP); P:对于限价单、停损单需要指定的卖出价格 例如: IF CLOSE>OPEN THEN SELL(1000,CLOSE);表示收阳线则在本周期收盘价上卖出1000股。 SELL(100%,LIMIT,CLOSE+0.2);表示在次周期CLOSE+0.2元位置下卖出限价单,若价格达到或高于该价格则卖出全部持仓。 21. SELLSHORT 空头卖出 本函数仅能用于交易系统。 SELLSHORT(V,Type,P); 表示空头卖出V股当前股票,Type表示卖出类型,P表示卖出价格,所有参数均可以省略。 V:卖出股数或卖出持仓百分比(N%),省略表示100%; Type:可以是本周期收盘(THISCLOSE),次周期开盘(MARKET),次周期限价单(LIMIT),次周期停损单(STOP); P:对于限价单、停损单需要指定的卖出价格 例如: IF CLOSE>OPEN THEN SELLSHORT(1000,CLOSE);表示收阳线则在本周期收盘价上空头卖出1000股。 SELLSHORT(100%,LIMIT,CLOSE+0.2);表示在次周期CLOSE+0.2元位置下空头卖出限价单,若价格达到或低于该价格则卖出全部空头持仓。 22. TOTALTRADE 交易次数 交易系统中当前位置之前总共有多少次交易,注意每次卖出算一次交易,而买入不算 该函数仅在使用Buy,Sell新交易函数的交易系统中有效. 23. WORSTPERCENT 最大亏损率 交易系统中当前位置之前所有交易中亏损率最大一次的利润率 该函数仅在使用Buy,Sell新交易函数的交易系统中有效. 24. WORSTTRADE 最大亏损 交易系统中当前位置之前所有交易中亏损最大一次的亏损额 该函数仅在使用Buy,Sell新交易函数的交易系统中有效. 14. 输出修饰符 1. ALIGN 水平对齐方式 ALIGNx,用逗号隔开放置在DrawIcon,DrawBmp,DrawText语句后,用于设定对齐方式,x=0表示左对齐,1表示中对齐,2表示右对齐,缺省左对齐。 例如: DrawIcon(CLOSE>OPEN,LOW,6),ALIGN1;表示绘制6号图标,采用中对齐 2. COLOR 输出颜色 COLORbbggrr,用逗号隔开放置在输出语句后,用于设定绘制指标线的颜色,rr、gg、bb分别表示红绿蓝三色的份量,用十六进制表示,00表示最小,FF表示最大。 例如: CLOSE,COLOR0000FF;表示用红色绘制收盘价线 3. LIMIT 限价买入 交易方式控制符 LIMIT,加入限价单,次周期达到限价即操作,否则放弃。 所谓限价就是股价优于设定的价格,具体说来对于买入或卖空就是低于设定价格,对于卖出或买空就是高于设定价格 4. LINETHICK 输出线宽 LINETHICKx,用逗号隔开放置在输出语句后,用于设定绘制指标线宽度,x可以为0-7,若设为0则表示不显示。 例如: CLOSE,LINETHICK6;表示用6点粗线绘制收盘价线 5. MARKET 市价买入 交易方式控制符 MARKET,按照次周期开盘价操作 6. MOVE 向后平移 MOVEx,用逗号隔开放置在输出语句后,用于设定输出线向后平移x周期,x=0—255 例如: CLOSE,MOVE10;表示绘制收盘价线向后移动10周期 7. PRECIS 输出精度 PRECISx,用逗号隔开放置在输出语句后,用于设定指标数值精确到小数点后多少位,x可以为0-6。 例如: CLOSE,PRECIS6;表示收盘价线显示6位小数精度 8. STOP 停损买入 STOP,加入停损单,次周期达到设定价格即操作买入,否则放弃。 所谓停损就是股价比设定的价格要差,具体说来对于买入或卖空就是高于设定价格,对于卖出或买空就是低于设定价格 9. THISCLOSE 收盘价买入 CLOSED,按照本周期收盘价操作 10. VALIGN 垂直对其方式 ALIGNx,用逗号隔开放置在DrawIcon,DrawBmp,DrawText语句后,用于设定对齐方式,x=0表示上对齐,1表示中对齐,2表示下对齐,缺省上对齐。 例如: DrawIcon(CLOSE>OPEN,LOW,6),ALIGN1,VALIGN0;表示绘制6号图标,采用中对齐和上对齐 15. 其它函数 STKINDI 引用指定股票的指标数值 STKINDI('STKNAME','INDINAME',PARAMs),STKNAME是股票代码,INDINAME是指标及其指标线名称,其语法和双引号引用指标数值相同,PARAM是可选参数,其数量应当等于被应用指标的参数数量,否则将使用缺省参数数值。例如: STKINDI('SZ000001','MA.MA1',5,10,15,20)表示引用深发展的MA指标的MA1指标线,计算参数5,10,15,20。 STKINDI('000001','KDJ.K#WEEK',9,4,4,)表示引用深发展的周线KDJ指标的K指标线,计算参数9,4,4。 STKINDI('SH600000','EXPLORER.KDJ#MONTH')表示引用浦发银行的KDJ条件选股月线公式,计算使用默认值。 |