搜索
查看: 11728|回复: 13

〓〓 飞狐交易师 公式系统,循环、分支语句入门一 〓〓

[复制链接]

签到天数: 103 天

发表于 2004-8-1 09:53 | 显示全部楼层

〓〓 飞狐交易师 公式系统,循环、分支语句入门一 〓〓

来自:MACD论坛(bbs.shudaoyoufang.com) 作者:冰火岛坐看云起 浏览:11728 回复:13

飞狐公式系统,循环、分支语句入门一

感谢南客老师!

序:

  飞狐内嵌的VBS(或JS)脚本语言,功能已经非常强大,可以真正在编程的意义上编制各种强大的公式,不比DLL弱,甚至某些无法用DLL实现的功能,亦可在VBS(或JS)中实现,但比较明显的弱点是,VBS(或JS)语言是解释执行的,速度比DLL慢。

  为此,飞狐在3.7以上版本中,开发了内置的循环、判断语句,提供字符串处理函数等功能,可以把飞狐中的序列变量等同于数组处理,任意访问序列变量,进一步加强了飞狐的公式系统。


  下面以入门的形式,分若干专题并配以适当的示例、练习、思考,与大家一起共同学习。

  由于涉及编程的许多概念比较复杂,因此在讲述的过程,假定大家已经有了一定的编公式的基础,对许多编一般公式的细节不再详述。

  网络论坛上开设互动专题,受到诸多条件的局限,不知道大家的学习效果如何,希望能够在专题的贴子后,提出建议、问题,以便下一专题能够及时调整难易程度。此外,我也会尽量抽时间回答贴子中的问题。同时也请高手们帮助解答,并指出专题中的错误!谢谢大家!

一、序列变量与数组:

  在飞狐的新公式系统的增加部分中,需要大量运用并区分数组、单值变量及序列变量的概念,这些概念也是进一步学习编程(比如编DLL)所必需的,因此有必要简单描述并初步掌握这些概念。

  1、常数与单值变量:

  常数,在飞狐中,就是不允许改变的数值,在我们平常写公式时,为了公式更加灵活,大量使用了参数,这些参数就是常数,不允许在公式中改变,比如参数n(1,1,25),表示参数n最小值是1、最大值是25、默认值是1,如果在公式中再写一行“n:=30;”就是非法的。

  单值变量,即只有一个数值,不随时间而改变,比如“x:100;”,就是定义了一个单值变量x=100,这个值不随时间而改变,做成副图指标看,今天是100明天也是100,直到最后1根K线也是100,即副图指标是一条数值为100的水平直线



[ 本帖最后由 冰火岛坐看云起 于 2007-8-10 19:26 编辑 ]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
金币:
奖励:
热心:
注册时间:
2003-10-8

回复 使用道具 举报

签到天数: 103 天

 楼主| 发表于 2004-8-1 09:55 | 显示全部楼层
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;

  例4:把{1,5}和{'a','b','c'}定义为数组

  分析:variable语句,可以同时定义多个变量、数组,之间用逗号隔开。公式代码如下:
variable:A[2]=0,B[3]='';
A[1]:=1;
A[2]:=5;
B[1]:='a';
B[2]:='b';
B[3]:='c';

  前面所举的关于数组例子,都是概念性的,单纯数组的应用一般都比较复杂,比如,从每天的分笔成交中统计,各个成交价位成交的笔数。等到后面讲完循环时再写具体的代码。

  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;
fc[1];
fc[2];
fc[5];



fc[datacount];



[ 本帖最后由 冰火岛坐看云起 于 2007-8-10 19:28 编辑 ]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
金币:
奖励:
热心:
注册时间:
2003-10-8

回复 使用道具 举报

签到天数: 103 天

 楼主| 发表于 2004-8-1 09:55 | 显示全部楼层
再看一例“fm:ma(c,5)”,这里的5日均价fm也是一个序列变量,可以看成下标从5开始直到datacount的数组。想想看,为什么起始下标不是从1开始,而是从5开始?我想知道K线图上倒数第2根K线对应的5日均价怎么写公式代码?


  今天就说这些,下面提供一些练习与思考:

  思考1:如何知道当前股票的K线数?使用什么函数?

  思考2:如果“fv:=vol”,那么fv[9]表示什么?

  思考3:“fmh:ma(h,5)”,fmh[datacount]表示什么?

  试试:在飞狐中新建一个公式,编一段下面的公式代码:
LL:=MA(Low,10);
A:LL[9];

  这段代码想表达什么?可以通过吗?为什么?

  练习1:根据序列变量可以看成一个数组,编一个公式,求出当前股票的上市日期。
  练习2:函数barpos返回当前是第几根K线,由此,设计一个公式,在最后1根K线和倒数第10根K线处,用函数drawicon做一标记。
  练习3:画一条从上市第1天开始的水平直线,其高度等于当前股票的历史最高价。
  练习4:画一条从上市第1天开始的水平直线,其高度位于当前股票历史最高、最低价的一半位置。
  练习5:当前股票,2003年最高价是多少?首次出现该最高价的日期是哪天?

想想看,为什么起始下标不是从1开始,而是从5开始?我想知道K线图上倒数第2根K线对应的5日均价怎么写公式代码?

因为五天均线,到第五天(之后)才有返回值。
ma5:=ma(c,5);
ma5[datacount-1];

[ 本帖最后由 冰火岛坐看云起 于 2007-8-10 19:29 编辑 ]
金币:
奖励:
热心:
注册时间:
2003-10-8

回复 使用道具 举报

签到天数: 103 天

 楼主| 发表于 2004-8-1 09:56 | 显示全部楼层
datacount;
{
思考1:如何知道当前股票的K线数?使用什么函数?
可以用BARSCOUNT(C),也可以用BARPOS在最后一根K线上的返回值。一般用datacount。
思考2:如果“fv:=vol”,那么fv[9]表示什么?
第九根K线上的成交量。
思考3:“fmh:ma(h,5)”,fmh[datacount]表示什么?
最后一根K线上最高价的五天算术均价,在所有K线上输出。
试试:在飞狐中新建一个公式,编一段下面的公式代码:
LL:=MA(Low,10);
A:LL[9];
//这段代码想表达什么?可以通过吗?为什么?
//通不过,因为在第九根K线上,MA(L,10)没有返回值。如果修改如下就可以通过:}
LL:=MA(Low,10);
A:LL[10];

练习1:根据序列变量可以看成一个数组,编一个公式,求出当前股票的上市日期。
D:=DATE; D[1];
练习2:函数barpos返回当前是第几根K线,由此,设计一个公式,在最后1根K线和倒数第10根K线处,
用函数drawicon做一标记。
A:=BARPOS; B:=DATACOUNT;
DRAWICON(A=B OR A=B-9,L,10),ALIGN1;
练习3:画一条从上市第1天开始的水平直线,其高度等于当前股票的历史最高价。
A:=HHV(H,0); A[DATACOUNT]
练习4:画一条从上市第1天开始的水平直线,其高度位于当前股票历史最高、最高(应该是低吧?)价的一半位置。
A:=(HHV(H,0)+LLV(L,0))/2; A[DATACOUNT]
练习5:当前股票,2003年最高价是多少?首次出现该最高价的日期是哪天?
A:=HHV(H*(YEAR=2003),0); A[DATACOUNT];
D:=REF(DATE,HHVBARS(H*(YEAR=2003),0)); D[DATACOUNT]

请问:
A:=BARPOS;
A[DATACOUNT]=DATACOUNT;
这样写为什么通不过调试?
金币:
奖励:
热心:
注册时间:
2003-10-8

回复 使用道具 举报

发表于 2004-8-2 15:37 | 显示全部楼层
xiexie!
金币:
奖励:
热心:
注册时间:
2004-6-2

回复 使用道具 举报

发表于 2004-11-6 01:12 | 显示全部楼层
楼主,你的贴子是从哪里来的呀,你写的A[DATACOUNT]=DATACOUNT;
只是一个判断,本身没有什么意义呀,再有
练习5:当前股票,2003年最高价是多少?首次出现该最高价的日期是哪天?
A:=HHV(H*(YEAR=2003),0); A[DATACOUNT];
D:=REF(DATE,HHVBARS(H*(YEAR=2003),0)); D[DATACOUNT]
就是个错误的程序呀
金币:
奖励:
热心:
注册时间:
2004-11-2

回复 使用道具 举报

签到天数: 1 天

发表于 2005-7-2 11:57 | 显示全部楼层
感谢各位老师!
_____
下载过的学生留言顶一下.
金币:
奖励:
热心:
注册时间:
2005-6-12

回复 使用道具 举报

发表于 2005-12-8 21:32 | 显示全部楼层
顶!谢谢!
金币:
奖励:
热心:
注册时间:
2005-11-28

回复 使用道具 举报

签到天数: 3 天

发表于 2006-6-28 13:57 | 显示全部楼层
谢谢。
金币:
奖励:
热心:
注册时间:
2002-7-6

回复 使用道具 举报

发表于 2007-1-31 09:22 | 显示全部楼层
--> 谢谢。
金币:
奖励:
热心:
注册时间:
2003-3-11

回复 使用道具 举报

发表于 2008-2-23 23:30 | 显示全部楼层
感谢冰主的转载
金币:
奖励:
热心:
注册时间:
2003-4-29

回复 使用道具 举报

签到天数: 1 天

发表于 2008-12-25 01:38 | 显示全部楼层
谢谢vv
金币:
奖励:
热心:
注册时间:
2006-9-5

回复 使用道具 举报

发表于 2009-11-2 19:27 | 显示全部楼层
严重支持
金币:
奖励:
热心:
注册时间:
2006-8-26

回复 使用道具 举报

发表于 2011-4-3 22:55 | 显示全部楼层
感谢老师!学生下载过,顶一下.
金币:
奖励:
热心:
注册时间:
2010-9-23

回复 使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

本站声明:MACD仅提供交流平台,请交流人员遵守法律法规。
值班电话:18209240771   微信:35550268

举报|意见反馈|手机版|MACD俱乐部

GMT+8, 2025-4-15 15:14 , Processed in 0.039789 second(s), 12 queries , Redis On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表