自制简单火铳:《飞狐公式编写基础》和《通达信公式教程》(一)A

来源:百度文库 编辑:九乡新闻网 时间:2024/04/29 22:58:44
《飞狐公式编写基础》和《通达信公式教程》(一)
2008-12-20 09:39:02


五、引用其它公式、引用其它周期、引用其它个股数据:

  1、摘录飞狐帮助文件中的相关内容如下,其中选股公式、交易公式将在后面陆续讲解:


  ㈠引用指标公式/交易系统/条件选股公式
  1、引用指标公式,可以写成:
   "公式名称.指标线名称"(参数表), 其中参数表中的参数个数应该与该公式的实际参数数量一致,若不写参数表,则表示使用缺省参数。
  例如:"MACD.DIFF",表示引用根据缺省参数,引用MACD指标中DIFF指标线数值。

  2、引用交易系统公式,可以写为:
   "SYSTEM.公式名称.交易类型"(参数表), 交易类型可以为ENTERLONG、EXITLONG、ENTERSHORT或者 EXITSHORT,分别表示引用多头买入、多头卖出、空头买入、空头卖出。
  例如:"SYSTEM.MACD.ENTERLONG",表示根据缺省参数,引用MACD交易系统的多头买入条件。

  3、用条件选股公式,可以写为:
   "EXPLORER.公式名称"(参数表)
   例如:"EXPLORER.MACD",表示根据缺省参数,引用MACD条件选股条件。

  ㈡跨周期引用公式  
  下面举例说明跨周期引用的书写方法:

  例1."MACD.DIFF#WEEK"(26,10,5)

  表示引用MACD指标公式DIFF指标线的数值,在计算指标线值时,参数取(26,10,5),计算周期取周线。

  例2."SYSTEM.MACD.ENTERLONG#MONTH"

  表示引用MACD交易系统的多头买入信号,参数取缺省值,计算周期取月线。


  注意:跨周期引用只能从较短周期引用较长周期,不允许反方向的引用。

  可供引用的周期类型有:MIN1,MIN5,MIN15,MIN30,MIN60,DAY,WEEK,MONTH等八种,分别表示1、5、15、30、60分钟线,以及日线、周线、月线。


  ㈢引用任意股票的数据
  在公式中可以引用其它任何股票的数据,方法为:

  "股票代码$数据名称"

  数据名称可以是OPEN、HIGH、LOW、CLOSE、VOL、AMOUNT,分别表示包括开盘价、最高价、最低价、收盘价、成交量、成交额。

  例如,"000001$CLOSE",表示引用深发展A的收盘价。


  2、举例说明:其实上面已经有例子了,这里再举一个综合性的例子:

  例1:在分笔周期的主图,显示价位线(即PRICE主图),按下面要求设计主图指标,设为SL005:
  ⑴显示最新价;
  ⑵显示均价线;
  ⑶显示昨收盘,以红色线表示;
  求解:(请回顾一下,什么是主图指标、主图叠加指标)
  ⑴显示最新价,就是最新的收盘价。公式代码很简单,即

最新价:close;

  ⑵所谓均价,就是今天的平均成交价,等于“当前”的总成交金额除以“当前”的总成交量。在分笔周期,显示的主图,仅显示当天的数据,它的有效起始周期,是当天的开盘时间,结束于当天收盘。
  “当前”的总成交金额,等于从开盘到“当前”的成交金额总和,需用“引用函数”类中的求和函数即SUM(X,N),经查询,其注释为

{求总和。
用法: SUM(X,N),统计N周期中X的总和,N=0则从第一个有效值开始。
例如: SUM(VOL,0)表示统计从上市第一天以来的成交量总和}

成交金额的函数是amount,因此,“当前”的总成交金额为
sum(amount,0)
同理,“当前”的总成交量为
sum(vol,0)

这样,我们就得到均价的公式代码为

均价:sum(amount,0)/sum(vol,0);

  ⑶昨收盘,是日周期,现在我们是设计分笔周期的公式,这就是说,现在要从分笔周期引用日周期的昨收盘价。怎么办?当然要设计一个被引用的指标公式,设为yy001(意为“引用001”),只需一行代码

zsp:ref(c,1);

有了被引用的公式yy001,设计引用昨收盘的公式如下

昨收盘:"yy001.zsp#day",colorred;{意思是,引用公式yy001的变量(即指标线)zsp,被引用的周期是日线}

综合起来,本题的主公式代码如下(另有一个被引用公式yy001),

最新价:c;
均价:sum(amount,0)/sum(vol,0)/100;
昨收盘:"yy001.zsp#day",colorred;

最后公式编辑器中,设定公式的默认周期为分笔,其它周期全部禁用。

前面学习了公式设计的基本知识,利用所学知识已经自行可以编制技术指标,这些知识配合飞狐提供的各类函数可以解决日常的大多问题。
  在飞狐的公式系统中,技术指标占地很重要的地位,但也有许多缺陷,比如用于选股、用于指示交易信号、指示K线形态,功能就不够强大了。因此飞狐的公式系统共分为四类,即技术指标、条件选股、交易系统、五彩K线。

 今天我们就来学习最后一讲,飞狐的选股公式、交易公式、五彩K线公式。
  一、选股公式:
  显然选股公式,就是用于选出符合条件的股票,由若干中间语句组成,并且其中不含绘图函数。只有一行输出语句,位于最后一条语句,且必须是条件表达式。
  例1:设计一个公式,选出N周期内涨幅大于或等于5%的股票。
  求解:公式代码如下,其中N为参数:


--------------------------------------------------------------------------------
收盘价:=close;
N日前收盘:=ref(close,N);
选股条件:收盘价/N日前收盘>=1.05;--------------------------------------------------------------------------------

  代码解释:公式由我们所熟悉的代码组成,共3行,前2行是中间语句,最后一行是选股的条件,其中最后一行“选股条件:”,也可以不写。
  操作简介:在飞狐中,按F7,弹出如图界面。图中①可以调整参数。②可以选择在什么分析周期下选股。③可以改变选股范围,默认为A股市场。④可以让选出的股票输出到指定的板块,并将该板块设为自动板块。⑤可以指定时段进行选股,默认是对最后一天进行选股。⑥对某些公式,还可以进行成功率测试。

  在选股的操作过程中,大家可以发现,利用技术指标也可以进行选股。
  练习1:编制一个选股公式,选出RSI突破80的股票。
  思考1:建立如下选股公式,该公式的意义是什么?实际操作一下,看看有什么问题?为什么?

--------------------------------------------------------------------------------
spj:close;
zsp:=ref(c,1);
spj/zsp<0.95;--------------------------------------------------------------------------------

  思考2:选股操作时,当选择输出到板块时,有个自动板块的选择,起什么作用?
  思考与操作1:利用例1的选股公式,想选出最近10天,所有2天内涨幅超过5的A股板块股票。
  解疑1:某股友选股时,发现500001符合选股条件,但却选不出来,你能帮他分析一下原因吗?

  二、交易系统:
  交易系统公式(简称交易公式),用于指示满足特定条件时的买入信号和卖出信号。公式的由若干中间语句,加上指定的最后4行条件表达式代码组成,最后4行分别由“ENTERLONG: ”“EXITLONG: ”、“ENTERSHORT:”、“EXITSHORT:”开始,表示多头买入、多头卖出及空头买入、空头卖出的条件。这4行也可以删去若干行,但至少保留其中的一行,表示只指示其中一种信号。
  例2:我们来看看飞狐交易系统中的“RSI 相对强弱指标交易系统”公式,其中LL、LH是参数:

--------------------------------------------------------------------------------
LC:=REF(CLOSE,1);{LC为中间变量}
RSI:=SMA(MAX(CLOSE-LC,0),N,1)/SMA(ABS(CLOSE-LC),N,1)*100;{RSI为中间变量}
ENTERLONG:CROSS(RSI,LL);{多头买入条件表达式,RSI上穿LL时发出买入信号}
EXITLONG:CROSS(LH,RSI);{多头卖出条件表达,RSI下穿LH时发出卖出信号}--------------------------------------------------------------------------------

  在新建或编辑修改交易公式时,可以设定介入点的位置,如次周期中价等。设置止损条件,如目标利润止盈、最大损失止损等。
  交易公式的使用:①在K线图中,按Ctrl+F6,可以选择交易公式指示买卖信号。②在选股操作时,也可以选择交易公式进行选股。③在菜单“工具”中,还可以对交易进行“交易系统评价”、“探索最佳参数”操作。在菜单“查看”中,可以“优选交易系统”。
  此外,按Shift+W,调出公式树,可以通过鼠标把交易公式拖到K线窗口的方法,使用交易公式。试试把选股公式也拖到K线窗口,看看有何变化?说明了什么?
  当想删除在K线图上显示的各种买卖信号时,可以按Ctrl+Del或工具栏上的相应按钮实现。

  练习2:设计一个均线交易公式,当收盘价上穿5日均线时,发出多头买入信号,收盘价下穿5日均线时发出多头卖出信号。并观察设置不同的介入点介入时,指示的信号有什么变化。
  练习3:观察飞狐系统内置的各个交易公式,领会各交易公式的意义。

  三、五彩K线:
  用于表示各种K线模式。比如早晨之星、黄昏之星等。五彩K线,阳线用实心表示,阴线用空心表示。默认的五彩K线均为绿色。当出现指定的K线模式时,默认用红色表示,除非使用了颜色描述符。表达五彩K线由若干中间语句和最多六条独立的条件语句,跟选股公式不同的是,选股公式只能有一个条件表达式语句。
  例1、用五彩K线描述涨幅超过9%的K线,代码如下:

--------------------------------------------------------------------------------
c/ref(c,1)>1.09;--------------------------------------------------------------------------------

  例2、用五彩K线描述分维形态的K线,代码如下(借用注册用户社区中,清扬兄的研究成果):
--------------------------------------------------------------------------------
N:=2;
AA:=REF(H,N)=HHV(H,2*N+1);
AAA:=FILTER(AA,N);
BB:=BACKSET(AAA,N+1);
CC:FILTER(BB,N),COLORBLUE;

AA2:=REF(L,N)=LLV(L,2*N+1);
AAA2:=FILTER(AA2,N);
BB2:=BACKSET(AAA2,N+1);
CC2:FILTER(BB2,N),COLORMAGENTA;--------------------------------------------------------------------------------

一、STKINDI示例代码

函数注释如下:
引用任意证券任意周期的任意指标输出
用法 :
STKINDI(STKLABEL,INDINAME,INDITYPE,PERIOD)
INDITYPE为指标类型,有效值范围为(0-2),依次表示技术指标、条件选股、交易系统公式;
PERIOD为周期类型,有效值范围为(-1-11),依次表示:
当前周期、分笔成交、1分钟、5分钟、15分钟、30分钟、60分钟、日、周、月、年、多日、多分钟
例如:STKINDI('1A0001','MA.MA1',0,DATAPERIOD);

例1:引用大盘的涨跌家数。
①被引用公式,设被引用的公式名称为“涨跌家数”,其公式代码如下:
A:ADVANCE;
D:DECLINE;

②引用大盘的涨跌家数,示例代码如下:
fStkName:=if(STRCMP(STKMARKET, 'SH'),'399301','1A0001');
fAdvance:=STKINDI(fStkName,'涨跌家数.A',0,6);
fDecline:=STKINDI(fStkName,'涨跌家数.D',0,6);

说明:大盘函数advance、decline只能被大盘所使用,不能在个股中直接使用,这段代码,示范了如何利用STKINDI函数达到在个股中引用的目的。

例2:在日k线中引用本股票5分钟的obv该怎么写?
求解:代码如下
StkIndi(StkLabel,'OBV',0,2);{注意,公式的名称应使用大写字母}

二、横向统计相关函数的用法简介:

1、横向统计数据函数 ESTDATA(N),取得横向统计日线数据(1-N),仅在日线分析周期有效;
2、用法举例:
例:设计一个公式,统计当日A股板块涨停板的股票数。

3、方法如下:
①设计一个公式,判断个股是否涨停,代码如下,设公式名称是“涨停判断”:

bl:=if(STKINBLOCK('ST板块'),1.05,1.1);{如果为ST涨停为5%,否则为10%}
ztb:abs(c-intpart(ref(c,1)*bl*100+0.5)/100)<0.0001;{如果涨停返回1,否则返回0}
{注:对新股的涨停未做判断,另外个股因历史的原因,是否被ST或PT处理无法判断,因此对历史数据的判断并不准确}

②建立横向统计数据项:鼠标点菜单“管理/横向统计管理”,在“横向统计管理”对话框中,点“新增”,找到刚才设计的公式“涨停判断”。

⑴数据名称改为“涨停板”
⑵选择技术指标“涨停判断”,计算周期“日线”、指标线“ztb”为默认,不作修改。
⑶横向统计方法选“全部累加”。
⑷“计算时选择除权后的数据”不选即前面不打勾。
⑸点“设置范围”按钮,选择统计范围。
⑹置好范围后,点确定。

至此,我们就设计了一个横向统计数据项“涨停板”,在图中序号是1,则引用时是estdata(1)。

③设计一个引用“涨停板”的公式,公式代码如下,设公式的名称是zttj:
涨停板统计:estdata(1);

在K线图中,调用公式zttj,就可以看到我们所需要的结果了。

练习:如果对横向统计有兴趣的话,可以仿此,做一个跌停板统计公式。当然可以把涨停、跌停做成二合一公式。

三、如何计算当日交易分钟数:

T定义为1分钟周期图上,开盘后的交易分钟数,
1、代码之一
--------------------------------------------------------------------------------
T:=IF(BETWEEN(HOUR,9,11),(HOUR-9.5)*60+MINUTE,
   IF(BETWEEN(HOUR,13,15),(HOUR-9.5-1.5)*60+MINUTE,240));
--------------------------------------------------------------------------------
稍加优化:
--------------------------------------------------------------------------------
T:=IF(BETWEEN(HOUR,9,11),(HOUR-9.5)*60+MINUTE,
   IF(BETWEEN(HOUR,13,15),(HOUR-11)*60+MINUTE,240));
--------------------------------------------------------------------------------

代码解释:
如果小时数介于9和11间,返回值(HOUR-9.5)*60+MINUTE
  否则
    如果小时数介于13和15之间,返回值(HOUR-9.5-1.5)*60+MINUTE
      否则返回值240

2、观察所有的股票一天的1分钟周期图,可以发现,都是起始于9:31,结束于15:00,并且中午休市不显示,因此代码一可以简化为如下公式代码二,请自行解释代码。
公式代码二:

--------------------------------------------------------------------------------
T:=IF(HOUR<=11,(HOUR-9.5)*60+MINUTE,
   IF(HOUR>=11,(HOUR-11)*60+MINUTE,240));
--------------------------------------------------------------------------------

3、公式代码二,在1分钟周期中,其实返回240的情况可以合并如下(为什么?)
公式代码三:
T:=IF(HOUR<=11,(HOUR-9.5)*60+MINUTE,(HOUR-11)*60+MINUTE);

整理后得到,公式代码四:
T:=IF(HOUR<12,HOUR*60+MINUTE-570,HOUR*60+MINUTE-660);

4、公式代码四,可以改写如下的公式代码五:
T1:=IF(HOUR<12,570,660);
T:=HOUR*60+MINUTE-T1;

  呵呵,570就是9.5小时对应的分钟数,660是11小时对应的分钟数。其实一开始我们就可以写出这个公式了。我在飞狐公式入门五的答贴中,提示了“用时间类的函数,例如现在是10:30的话,怎么算交易时间呢?如果‘现在’是14:00,又怎么算交易时间?”

公式代码五,是南客喜欢的表达方式,比公式代码四要多写一行,但更灵活、易于变化。

  好了,问题解决了,也该给喜欢思考的弟兄一点问题。
  问题1:在5--60分钟周期图上,设计一个计算当日交易分钟数的公式,进一步设计出量比公式。
  问题2:国内A、B股等的交易分2个时段,即上午和下午各交易2小时,在中午休市1.5小时,如果设想一个股市,一天之中,交易3个或更多个时段,当日交易分钟数的公式,又该怎么写?为了方便写公式,假设为3个时段:上午为9:30--11:30,下午为13:00--15:00,晚上为19:00--21:00。

  提示:公式改写为适用于5--60分钟周期,还需考虑当日是否停牌。为了减少难度,先不考虑停牌的情况,等公式调试成功后,再考虑如何加入判断是否停牌的条件。

四、相关系数函数CORR简单介绍及示例代码:

相关系数函数CORR,可以比较两只个股或个股与大盘的指标或价格在N周期内走势的相似程度,函数返回的数值越大,相似程序越高。

下面是最后N周期内,个股与大盘收盘价走势相似程度的示例代码:

ts0:=barssince(c);
ts1:=barslast(barssince(backset(islastbar,N+1))=0);
ts:=if(ts0bl:=ref(IndexC/C,Ts);{确定基准日压缩比率}
fc:c*bl/bl;
fIndexC:IndexC/bl;{按比率压缩大盘指数,以便跟个股收盘比较}
相似程度:CORR(fc,fIndexC,N),linethick0;

简单的应用方法:
1、指标作为副图指标,可通过对“相似程度”排序,找出近期走势跟大盘相似程度较高的个股。
2、也可以把代码中的IndexC换成其它作为样本的个股,找出同类走势的个股。


转贴《教育统计学》中,对相关系数的描述:

相关系数

在教育研究中,常涉及到两个事物(变量)的相互关系问题,例如,学习成绩与非智力因素的关系,数学成绩与物理成绩的关系,男女生学习成绩的关系,等等。其关系表现为以下三种变化;第一,正相关:一个变量增加或减少时,另一个变量也相应增加或减少;第二,负相关:一个变量增加或减少时,另一个变量却减少或增加;第三,无相关:说明两个变量是独立的,即由一个变量值,无法预测另一个变量值。统计学中,就用“相关系数"来从数量上描述两个变量之间的相关程度,用符号“r"来表示。

相关系数取值范围限于:-1≤r≤+1

相关系数表示的意义
相关系数(r) 0.00   0.00-±0.3   ±0.30-±0.50 ±0.50-±0.80  ±0.80-±1.00
相关程度       无相关  微正负相关     实正负相关        显著正负相关       高度正负相关

五、不同股票(证券)引用不同大盘指数的参考代码:

对于indexc替换成如下的index_c:
--------------------------------------------------------------------------------

index_sh_c:=
if(STKTYPE=1,"1A0002$close",
  if(STKTYPE=2,"1A0003$close",
    if(STKTYPE=3,"1B0008$close",indexc)));{对A股、B股及基金引用不同指数}

index_sz_c:=
if(STKTYPE=1,"399002$close",
  if(STKTYPE=2,"399003$close",
    if(STKTYPE=3,"399305$close",indexc)));

index_c:if(STRCMP(STKMARKET, 'SH')=0,index_sh_c,index_sz_c);

--------------------------------------------------------------------------------
以上代码仅考虑了A股、B股、基金,其它未作区分,可根据自己的需要进行修改。
对于indexo替换成如下的index_o:
--------------------------------------------------------------------------------index_sh_o:=
if(STKTYPE=1,"1A0002$open",
  if(STKTYPE=2,"1A0003$open",
    if(STKTYPE=3,"1B0008$open",indexo)));

index_sz_o:=
if(STKTYPE=1,"399002$open",
  if(STKTYPE=2,"399003$open",
    if(STKTYPE=3,"399305$open",indexo)));

index_o:if(STRCMP(STKMARKET, 'SH')=0,index_sh_o,index_sz_o);--------------------------------------------------------------------------------
对于indexh替换成如下的index_h:
--------------------------------------------------------------------------------
index_sh_h:=
if(STKTYPE=1,"1A0002$high",
  if(STKTYPE=2,"1A0003$high",
    if(STKTYPE=3,"1B0008$high",indexh)));

index_sz_h:=
if(STKTYPE=1,"399002$high",
  if(STKTYPE=2,"399003$high",
    if(STKTYPE=3,"399305$high",indexh)));

index_h:if(STRCMP(STKMARKET, 'SH')=0,index_sh_h,index_sz_h);
--------------------------------------------------------------------------------
对于indexl替换成如下的index_l:
--------------------------------------------------------------------------------
index_sh_l:=
if(STKTYPE=1,"1A0002$low",
  if(STKTYPE=2,"1A0003$low",
    if(STKTYPE=3,"1B0008$low",indexl)));

index_sz_l:=
if(STKTYPE=1,"399002$low",
  if(STKTYPE=2,"399003$low",
    if(STKTYPE=3,"399305$low",indexl)));

index_l:if(STRCMP(STKMARKET, 'SH')=0,index_sh_l,index_sz_l);
--------------------------------------------------------------------------------
对于indexa替换成如下的index_A:
--------------------------------------------------------------------------------
index_sh_A:=
if(STKTYPE=1,"1A0002$Amount",
  if(STKTYPE=2,"1A0003$Amount",
    if(STKTYPE=3,"1B0008$Amount",indexA)));

index_sz_A:=
if(STKTYPE=1,"399002$Amount",
  if(STKTYPE=2,"399003$Amount",
    if(STKTYPE=3,"399305$Amount",indexA)));

index_A:if(STRCMP(STKMARKET, 'SH')=0,index_sh_A,index_sz_A);
--------------------------------------------------------------------------------
对于indexv替换成如下的index_V:
--------------------------------------------------------------------------------
index_sh_V:=
if(STKTYPE=1,"1A0002$Vol",
  if(STKTYPE=2,"1A0003$Vol",
    if(STKTYPE=3,"1B0008$Vol",indexV)));

index_sz_V:=
if(STKTYPE=1,"399002$Vol",
  if(STKTYPE=2,"399003$Vol",
    if(STKTYPE=3,"399305$Vol",indexV)));

index_V:if(STRCMP(STKMARKET, 'SH')=0,index_sh_V,index_sz_V);
--------------------------------------------------------------------------------
六、控制语句if...then...else示例
通过参数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 expr1 ELSE expr2 中条件cond暂时只能用常数,因此,可配合主要是参数、常数函数

例2:修改成交量公式VOL,当流通盘不为零且当前周期为日以上周期时,显示换手率,代码参考如下(仿此,大家绕过指标模组,可以自行设计,“绑定”到周期、券种等的公式)

VOL,VOLSTICK;

MA1:MA(VOL,M1);
MA2:MA(VOL,M2);
MA3:MA(VOL,M3);
if capital>0 and DATAPERIOD>=6 then 换手率:vol/capital;

当切换到60分钟及以下周期,或者切换到大盘(此时流通盘=0),会发现“换手率”指标线、名称及数值都不显示。
稍加改进,使用复合语句,可适用于任意周期:

例3,修改成交量公式,流通盘不为0时,显示换手率(60分钟及以下周期,计算当日最新的换手率),代码参考如下:

PHP代码:--------------------------------------------------------------------------------
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;--------------------------------------------------------------------------------
修改或创建这个公式后,大家会发现,只要流通盘=0,则换手率指标线就不会被显示,例如切换到大盘观察。

七、循环语句示例:移动平均线的N种写法

移动平均线的N种写法(V3.5.30828 以上版本支持)

PHP代码:
--------------------------------------------------------------------------------

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)

///////////////////////////////////////////
INPUT:N(5,1,300);      //参数申明
VARIABLE:i=0,k=0,j=0; //变量申明
VAR1:=C;
FOR j=1 TO DATACOUNT DO
BEGIN
IF j>=n THEN
BEGIN
  WHILE i  BEGIN
   k:=k+VAR1[j-i];
   i:=i+1;
  END;
  MA2[j]:k/n;        //实现MA(C,N)
  i:=0;
  k:=0;
END;
END;

///////////////////////////////////////////
INPUT:N(5,1,300);      //参数申明
VARIABLE:i=0,k=0,VAR1:=C; //变量申明
FOR j=1 TO DATACOUNT DO
BEGIN
k:=k+VAR1[j];
IF j>=n THEN
BEGIN
  IF j>n THEN
    k:=k-VAR1[j-n];
  MA3[j]:k/n;        //实现MA(C,N)
  i:=0;
END;
END;

/////////////////////////////
--------------------------------------------------------------------------------
还有很多写法

还可以只计算最后1个有效数值,比如用于提高预警速度,大家练习试试

//////////////////////////////////////////////////////////

南客再附上一段历史流通盘的代码:
//说明:本公式,无法计算增发、职工股上市等情形,公式原型为原子兄用VBS设计的代码
var1:=splitdata(1)+splitdata(2);
cap:=c;
cap[datacount]:=1;
for i=datacount downto 2 do cap[i-1]:=cap
/(1+var1/10);
capi:=cap*capital/100;
历史流通盘∥万股:capi;
drawnumber(cap>ref(cap,1) or barscount(c)=1,capi,capi,0);

八、序列数据量
所属类别: 常数函数 参数数量: 0

序列数据量。
用法:
DATACOUNT,返回序列数据数量
注意:该函数返回常数

  解说:以日周期为例,我们知道,个股的收盘价就是一个序列变量,每天都有一个数值,总共有很多个数值,到底有多少个数值?如果个股数据是完整的,数值的个数就是上市后总的有效交易天数(即K线的数量)。显然人工去点不现实,这里提供的函数,就是计算这个数据的。

  代码示例:

K线数:datacount;

②在飞狐新开发的公式系统中,序列变量可以用数组表示,比如:
fc:=close;
定义了一个序列变量fc,它等于个股所有的收盘价。请看下面代码:

fc:=c;
第1天收盘价:fc[1];
最后1天收盘价:fc[datacount];

图示如下

  想想看1:如何表示第1根K线的日期(通常是上市的日期),如果想将股票按上市日期先后排序,这个公式会很有用。
  想想看2:编写一个选股公式,选出上市天数少于N的公式。

与barscount的区别:显然,这是一个序列变量,随K线的位置不同而不同。而datacount是一个常量,不管在哪个K线的位置上,它都是同一个数值。