注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

我是大海中的一朵浪花

我为天下人 天下人为我

 
 
 

日志

 
 
关于我

当过兵,站过岗,上过处女入过党。 打过枪,玩过炮,还和拉登拍过照。 走过南,闯过北,拉着死神跳过舞。 挨过刀,中过弹,枕着鳄鱼睡过觉。 翻过山,游过海,搂着死人嗥过歌。

飞狐公式编写教程——选股公式  

2010-04-05 21:02:46|  分类: 期货股票大家说 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

一、选股公式:

  显然选股公式,就是用于选出符合条件的股票,由若干中间语句组成,并且其中不含绘图函数。只有一行输出语句,位于最后一条语句,且必须是条件表达式。

  例1:设计一个公式,选出N周期内涨幅大于或等于5%的股票。

  求解:公式代码如下,其中N为参数:

--------------------------------------------------------------------------------

收盘价:=close;

N日前收盘:=ref(close,N);

选股条件:收盘价/N日前收盘>=1.05;--------------------------------------------------------------------------------

例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,就可以看到我们所需要的结果了。

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

例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(ts0<n,ts0,ts1);{上市时间短于参数N,调整叠加的基准日}

bl:=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<n DO  

   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线的位置上,它都是同一个数值。

新增函数应用:如何遍历板块股票代码

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

bk:='深圳A股';

variable:j=1,k=0,dm_len=0,lstr[6]='00000',blksum:=STKCOUNT(bk),dmstr[blksum]='';

lstr[2]:='0000';lstr[3]:='000';lstr[4]:='00';lstr[5]:='0';lstr[6]:='';

while j<=blksum do begin

   dm:=NumToStr(k,0);

   dm_len:=strlen(dm);

   dm:=lstr[dm_len]+dm;

   if stkinblock(dm,bk) then begin

dmstr[j]:=dm;

j:=j+1;

   end;

   k:=k+1;

end;

//以下是一些字符串函数及运算的综合应用

EXPLAIN(1,dmstr[1]);   //在解盘中,输出深圳A股第1只股票的代码

EXPLAIN(1,stknameex(dmstr[2]));//第2只股票的名称

EXPLAIN(1,dmstr[3]+stknameex(dmstr[3]));//第3只股票的代码及名称

EXPLAIN(1,'深圳A股第4只股票的代码是:'+dmstr[4]);

EXPLAIN(1,dmstr[5]+'最后收盘价:'+numtostr(close,2));

EXPLAIN(1,'深圳A股共有股票:'+numtostr(blksum,0)+'只');--------------------------------------------------------------------------------

  如果您有编程的功底,上面代码一看就明白,但对没有编程经验的狐友们来说就不容易了。下面尽量详细地对思路和公式代码做一些解说,并对代码进行适当扩展。

  1、所谓遍历股票代码,就是能够访问某板块中所有的股票代码,如果连访问都不能实现,怎么做一些更加强大的诸如横向统计、排序的功能?

  2、上面的公式代码是以深圳A股板块为例,我们看看深圳A股的股票代码,它们都是很有规律的,000001、000002、...、000999、001696、001896,请注意这些代码的特征:

  ①股票代码要理解成字符串,而不是数值,如果是数值的话,股票代码就成了1、2、...、999、1696、1896。

  ②这些代码如果转换成数值,大体集中在某个数的范围,如上面所示,深圳A股代码的数值目前都小于1896,代码的数值大多都是呈递增1的规律,少量有跳跃的情况,比如000040跳到000042,000041不存在。

  因此,我们初步可以设计一个循环

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

j:=0;

while j<=1896 do

begin

   j:=j+1;

end;--------------------------------------------------------------------------------

  上面这段代码,是个循环,每次循环都执行一次由begin和end所包围起来的语句,这里只有一条语句即j:=j+1,目的让变量j从1每次循环都递增1,直到j=1896为止。

  j:=j+1这条赋值语句,初次接触的话不大好理解,大意是这样,右边的j比如现在等于2,这条语句是让右边的j现有的数值加上1,然后再送回到变量j之中,执行完这条语句后,j就由2递增1变成了等于3。

  j:=j+1,看起来有点象计数器的功能吧?每循环一次,计数器就增加1,因此也可以称变量j为计数器(变量)。

  好了,思路敏捷的狐友,马上就能想到,这个计数器会生成从0到1896总共1897个数值,如果进行转换,也就是把数值转换成字符串,则深圳A股所有的股票代码都包含在里面了。

  呵呵,的确是这样,因此我们设计下面一个稍加改进的循环,来逼近我们要完成的任务:

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

j:=0;

while j<=1896 do

begin

   dm:=NumToStr(j,0);   //把数值j转换成字符串并赋值给变量dm,保留小数位数0

   j:=j+1;

end;

EXPLAIN(islastbar,dm); //当处在最后一根K线位置时,输出字符串dm的内容--------------------------------------------------------------------------------

  最后一行代码,是用解盘函数输出字符串变量dm的结果,我们可以在“解”中观察,不过这里由于dm是单值变量,不是序列变量,只能保存最后的一次结果,因此只能观察到结果是1896。

如果想观察其它的结果,只好改循环首语句,比如:

while j<=1 do

 大家可以发现这些结果,还有一点小问题,没有前导的0,即我们要的是000001、0001896,而不是1、1896这样的字符串,怎么办呢?

  给它们的前面加上0就可以了,但加上0的个数有讲究的,比如1在前面要加上5个0,1896前面只需加上2个0,很明显,要加的0的个数,等于6减字符串的字符个数。因此,设计公式代码如下:

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

variable:lstr[6]='00000';//定义一个数组lstr[6],共6个元素,并让所有6个元素初始都等于字符串'00000'

//下面对字符串数组lstr[]第2至第6个元素重新进行赋值,以便巧妙应用

lstr[2]:='0000';lstr[3]:='000';lstr[4]:='00';lstr[5]:='0';lstr[6]:='';

j:=0;

while j<=1896 do

begin

   dm:=NumToStr(j,0);   //把数值j转换成字符串并赋值给变量dm,保留小数位数0

   dm_len:=strlen(dm); //求出dm的长度,并赋值给变量dm_len

   dm:=lstr[dm_len]+dm;   //由dm的长度,确定应该给dm的前面加上多少个字符0

   j:=j+1;

end;

EXPLAIN(islastbar,dm); //当处在最后一根K线位置时,输出字符串dm的内容--------------------------------------------------------------------------------  对这行代码稍加解释:dm:=lstr[dm_len]+dm,如果某次循环右边的dm等于'19',则它的字符串长度为dm_len等于2,则这行代码此时等价于dm:=lstr[2]+dm,而lstr[2]等于'0000',结果就是在'19'的前面加上4个字符'0'即成了'000019',然后再把'000019'赋值给dm,于是左边的dm就等于'000019'

  到此为止,我们只是实现了所生成的字符串,可以让深圳A股的代码全部被包含在其中,但还有大量的“废”字符串,我们要把没用的字符串过滤掉。取出我们真正需要的。  要用到的函数  ①stkinblock(dm,bk),函数注释:如果股票代码dm从属于板块bk,则函数返回数值1,否则返回数值0  ②条件控制语句IF cond THEN expr1 ELSE expr2,意思是:当满足 cond 条件的时候,执行语句 expr1,否则执行 expr2 语句  设计代码如下:PHP代码:--------------------------------------------------------------------------------

variable:lstr[6]='00000';

lstr[2]:='0000';lstr[3]:='000';lstr[4]:='00';lstr[5]:='0';lstr[6]:='';

j:=0;

bk:='深圳A股'; //bk赋值为字符串'深圳A股'

while j<=1896 do

begin

   dm:=NumToStr(j,0);   //把数值j转换成字符串并赋值给变量dm,保留小数位数0

   dm_len:=strlen(dm); //求出dm的长度,并赋值给变量dm_len

   dm:=lstr[dm_len]+dm;   //由dm的长度,确定应该给dm的前面加上多少个字符0

   if stkinblock(dm,bk) then //如果股票代码dm属于bk,则执行下面由begin、end包含的语句

   begin

dm1:=dm;   //真正需要的股票代码是这里的dm1

   end;

   j:=j+1;

end;

EXPLAIN(islastbar,dm1); //当处在最后一根K线位置时,输出字符串dm1的内容--------------------------------------------------------------------------------

公式代码设计到这里似乎可以结束了,因为我们要的结果都可以生成了。其实还有改进的余地:  ①dm1只是个单值的字符串变量,它只能保存最后的结果,而不能保存所有的结果。这里考虑使用数组,数组可以自行定义很多个元素,让每个元素保存一个结果。  ②循环首的j<1896总觉得不对劲,不够智能化,比如将来“深圳A股”板块最后的代码不是0001896,则这段公式代码的结果就不对了。  针对以上问题,设计公式代码如下: PHP代码:--------------------------------------------------------------------------------

variable:lstr[6]='00000';

lstr[2]:='0000';lstr[3]:='000';lstr[4]:='00';lstr[5]:='0';lstr[6]:='';

j:=0;   //记录循环次数的计数器

k:=1;   //记录股票代码的个数的计数器

bk:='深圳A股'; //bk赋值为字符串'深圳A股'

blksum:=STKCOUNT(bk); //板块所包含证券数量

variable:dmstr[blksum]='';   //定义一个字符串数组用于记录股票代码,元素个数为blksum,初始值为空

while k<=blksum do   //当计数器k<=blksum时,执行以下循环

begin

   dm:=NumToStr(j,0);   //把数值j转换成字符串并赋值给变量dm,保留小数位数0

   dm_len:=strlen(dm); //求出dm的长度,并赋值给变量dm_len

   dm:=lstr[dm_len]+dm;   //由dm的长度,确定应该给dm的前面加上多少个字符0

   if stkinblock(dm,bk) then //如果股票代码dm属于bk,则执行下面由begin、end包含的语句

   begin

dmstr[k]:=dm;   //真正需要的股票代码,记录到字符串数组dmstr的第k个元素中

k:=k+1;   //记录找到的股票代码的个数

   end;

   j:=j+1;   //记录循环的次数

end;

EXPLAIN(islastbar,dmstr[1]); //当处在最后一根K线位置时,输出深圳A股第1只股票的代码--------------------------------------------------------------------------------

  有了以上公式,我们就可以把范围扩大,比如遍历'A股板块'的所有股票代码,很简单,只需改一条语句,即把 bk:='深圳A股' 改成 bk:='A股板块'。  公式代码如下(且慢执行,等下面的解说):PHP代码:--------------------------------------------------------------------------------

variable:lstr[6]='00000';

lstr[2]:='0000';lstr[3]:='000';lstr[4]:='00';lstr[5]:='0';lstr[6]:='';

j:=0;   //记录循环次数的计数器

k:=1;   //记录股票代码的个数的计数器

bk:='A股板块'; //bk赋值为字符串'深圳A股'

blksum:=STKCOUNT(bk); //板块所包含证券数量

variable:dmstr[blksum]='';   //定义一个字符串数组用于记录股票代码,元素个数为blksum,初始值为空

while k<=blksum do   //当计数器k<=blksum时,执行以下循环

begin

   dm:=NumToStr(j,0);   //把数值j转换成字符串并赋值给变量dm,保留小数位数0

   dm_len:=strlen(dm); //求出dm的长度,并赋值给变量dm_len

   dm:=lstr[dm_len]+dm;   //由dm的长度,确定应该给dm的前面加上多少个字符0

   if stkinblock(dm,bk) then //如果股票代码dm属于bk,则执行下面由begin、end包含的语句

   begin

dmstr[k]:=dm;   //真正需要的股票代码,记录到字符串数组dmstr的第k个元素中

k:=k+1;   //记录找到的股票代码的个数

   end;

   j:=j+1;   //记录循环的次数

end;

EXPLAIN(islastbar,dmstr[1]); //当处在最后一根K线位置时,输出字符串深圳A股第1只股票的代码--------------------------------------------------------------------------------  假如你试图执行这段代码,你会发现好慢哦~~  为何会这样?因为从深圳A股切换到上海A股的股票代码时,是从1896跳跃到600000,中间有508104次空循环,这中间没有一个代码是真正的股票代码,因此可以这样来提高循环的执行效率,在公式代码中插入如下几行代码:if j=1896 then j:=599999;if j=600999 then break;  优化后的代码如下: PHP代码:--------------------------------------------------------------------------------

variable:lstr[6]='00000';

lstr[2]:='0000';lstr[3]:='000';lstr[4]:='00';lstr[5]:='0';lstr[6]:='';

j:=0;   //记录循环次数的计数器

k:=1;   //记录股票代码的个数的计数器

bk:='A股板块'; //bk赋值为字符串'深圳A股'

blksum:=STKCOUNT(bk); //板块所包含证券数量

variable:dmstr[blksum]='';   //定义一个字符串数组用于记录股票代码,元素个数为blksum,初始值为空

while k<=blksum do   //当计数器k<=blksum时,执行以下循环

begin

   dm:=NumToStr(j,0);   //把数值j转换成字符串并赋值给变量dm,保留小数位数0

   dm_len:=strlen(dm); //求出dm的长度,并赋值给变量dm_len

   dm:=lstr[dm_len]+dm;   //由dm的长度,确定应该给dm的前面加上多少个字符0

   if stkinblock(dm,bk) then //如果股票代码dm属于bk,则执行下面由begin、end包含的语句

   begin

dmstr[k]:=dm;   //真正需要的股票代码,记录到字符串数组dmstr的第k个元素中

k:=k+1;   //记录找到的股票代码的个数

   end;

   if j=1896 then j:=599999;   //计数器j直接跳到到上海A股对应的最小代码

   if j=600999 then break;   //如果记录到这个代码则跳出循环

   j:=j+1;   //记录循环的次数

end;

//以下是一些字符串函数及运算的综合应用

EXPLAIN(1,dmstr[1]);   //在解盘中,输出深圳A股第1只股票的代码

EXPLAIN(1,stknameex(dmstr[2]));//第2只股票的名称

EXPLAIN(1,dmstr[3]+stknameex(dmstr[3]));//第3只股票的代码及名称

EXPLAIN(1,'深圳A股第4只股票的代码是:'+dmstr[4]);

EXPLAIN(1,dmstr[5]+'最后收盘价:'+numtostr(close,2));

EXPLAIN(1,'深圳A股共有股票:'+numtostr(blksum,0)+'只');--------------------------------------------------------------------------------  这行代码 if j=600999 then break 有什么用?以防万一,如果有人改了市场规则,把500001之类的股票计入上海A股的话,这里的循环会出不来的,会造成电脑死循环,飞狐长时间没有响应。 以上公式代码,只是个示例,效率不太高,如果能有个方法,直接给出板块中所有的股票代码,那就不需要这段公式代码。  给出这个示例,是想通过大致解剖整个公式代码的设计过程,让大家对循环、条件语句有个初步的认识。  最后,给大家个练习的机会:  1、修改上述代码,计算“A股板块”的成交量(这就是横向统计了)  2、以上公式代码,使用的是while循环,有办法改成fox循环吗?(当心,在修改代码的过程中,如果不慎的话,有可能造成死循环,对于win9x操作系统,也许很难退出,对于NT以上操作系统,可以强行退出)  3、高级问题:通过以上代码,可以做出横向排序,不过建议不要用代码本身来实现排序(会很慢的),应使用今天发布的新函数SORTPOS(X,D,N1,N2)来实现。  4、借用论坛的一个问题:ff:=barslast(date=1030107);周期:=5;VERTLInE(ff=0 or ff=周期*1 or ff=周期*2 or ff=周期*3 or ff=周期*4 or ff=周期*5or ff=周期*6 or ff=周期*7 or ff=周期*8 or ff=周期*9 or ff=周期*10or ff=周期*11 or ff=周期*12 or ff=周期*13 or ff=周期*14 or ff=周期*15or ff=周期*16 or ff=周期*17 or ff=周期*18 or ff=周期*19 or ff=周期*20or ff=周期*21 or ff=周期*22 or ff=周期*23 or ff=周期*24 or ff=周期*25or ff=周期*26 or ff=周期*27 or ff=周期*28 or ff=周期*29 or ff=周期*30or ff=周期*31 or ff=周期*32 or ff=周期*33 or ff=周期*34 or ff=周期*35or ff=周期*36 or ff=周期*37 or ff=周期*38 or ff=周期*39 or ff=周期*40),POInTDOT;  把以上代码,改成用循环表示。  5、一个数列定义如下:f[1]=1,f[2]=1,f[n]=f[n-1]+f[n-2],你能用循环计算出f[10]等于多少吗?这个数列是很有名的,许多股票预测都会用到它。  呵呵,具体我也记不住了,谁能告诉我它叫什

 

 

 

VBS入门续:条件语句VBS入门续:条件语句

条件语句是程序中的最基本、最重要的语句之一,今天通过一个简单实例学习条件语句。

问题:设计一个指标,除首日外,如果当日涨停(设10%为涨停),则公式输出1,否则输出0。

公式代码:

fc:=c;

n=1.099;

<%

vc=ffl.vardata("fc")

vn=ffl.vardata("n")

vs=ffl.vardata("js")

last=ubound(vc)

vc(0)=0

for i=last to 1 step -1

if vc(i)>=vn*vc(i-1) then

   vc(i)=1

else

   vc(i)=0

end if

next

ffl.vardata("fc")=vc

%>

fc

VBS程序条件语句部分解释,参阅VBS帮助文件,如下代码为条件语句:

if vc(i)>=vn*vc(i-1) then   ----如果...则,这里的条件是判断当日涨停否

vc(i)=1                             ----vc(i)赋值1

else                                      ----否则

vc(i)=0                             ----vc(i)赋值0

end if                                   ----条件语句结束

飞狐基本函数简介之指标线形描述函数这一组中的函数,全部不能单独使用,一定要和其它指标一起用才能发挥效力,因为它们都是描述其它指标的。

指标在主图或副图中的显示,主要分为棒状(柱状)和线状两种。这一组中的函数,全部是为了指挥指标的显示而设计的。

掌握好这组函数,可以使指标输出显示丰富多彩,色彩缤纷。

使用的一般形式:

指标,描述函数1,描述函数2,...;

一、

函数: STICK

参数: 无

返回: 无

说明: 画棒状线

示例:

STICK的英文是棍、棒的意思。

一般指标的显示,在软件中默认是线状的。即如果不加指标线形描述函数,则指标以线状的形式输出显示。

如公式:

0.98*L;{主图叠加}

如加上棒状线的描述,则变成这样了:

0.98*L,STICK;{主图叠加}

一般的信号,不加描述函数,会成箭头状。加了STICK之后,就成棒状了。

副图1公式:  C>REF(C,1) AND C>REF(C,2);

副图2公式:  C>REF(C,1) AND C>REF(C,2),STICK;

我个人调试公式的体会,还是副图1的显示清楚,因为可以看到连续信号的出现。

二、

函数: COLORSTICK

参数: 无

返回: 无

说明: 以零轴为中心画彩色棒状线,零轴下为阴线颜色,零轴上为阳线颜色

示例:

这样零轴就如楚汉交界,泾渭分明了。

C-REF(C,1),COLORSTICK;{副图指标}

三、

函数: LINESTICK

参数: 无

返回: 无

说明: 同时画棒状线与指标线。

示例:

LINE是线,STICK是棒,LINESTICK自然是线棒一起显示了。

A:=C-REF(C,1);

A,LINESTICK;{不作说明,都认为是副图指标}

那么,即想显示指标线和棒状线,又想以零轴为中心显示彩色棒状线,怎么写公式呢?这样行吗?

A:=C-REF(C,1);

A,LINESTICK,COLORSTICK;

各位可以自己试一下,结论是否定的。结果是只有彩色柱,没有指标线了。

这样我们初步可以得出一个结论:在同一个指标中,有多个相同性质的描述函数时,软件只认最后一个描述函数。

即想显示指标线和棒状线,又想以零轴为中心显示彩色棒状线,可以用分开的两句语句来达成目标:

A:=C-REF(C,1);

A,LINESTICK;

A,COLORSTICK;

四、

函数: VOLSTICK

参数: 无

返回: 无

说明: 画成交量柱状线。

示例:

这是专门为显示成交量设计的。

股票软件不同,显示成交量的阴阳线是很不同的。总的来说,是根据价来定的,具体方法各有不同,很难说哪种方法就好了,哪种方法就不好了。

飞狐中的方法是这样的:今天的收盘价大于昨天的收盘价,显示阳柱;小于等于则显示阴柱。

五、

函数: CROSSDOT

参数: 无

返回: 无

说明: 画叉状线或x状线。

示例:

呵呵,叉状线和X状线有什么区别?应该是一样的吧。

CROSS是交叉,DOT是点。

当指标线连续性较好时,显示交叉点比较顺眼。连续性不好时,看起来比较凌乱。

0.98*L,CROSSDOT;

MA(C,30),CROSSDOT;{主图叠加}

六、

函数: CIRCLEDOT

参数: 无

返回: 无

说明: 画小圆圈线

示例:

CIRCLE,圆圈。把CROSSDOT的X显示换成圆圈的样子。如果结合后面的COLOR函数一起用,可以画出不同颜色的圈圈,有时也比较实用。

七、

函数: POINTDOT

参数: 无

返回: 无

说明: 画点状线

示例:

POINT是点、加点的意思。这个点状线,在K线显示数不多的情况下,看起来太小了。正因如此,在K线显示数较多的情况下,就可以弥补CIRCLEDOT显示太大的缺陷。

0.98*L,CIRCLEDOT;

MA(C,30),POINTDOT;{主图叠加}

八、

函数: SHIFT

参数: 1--127

返回: 无

说明: 指标线向后(向右)偏移x个周期

示例: ma1:ma(close,5),shift3;将MA1指标线向后偏移3个周期

SHIFT,移位。这是个飞狐比较有特色的的特色函数。

以以下公式为例子:

MA(C,30);

MA(C,30),POINTDOT,SHIFT5;{主图叠加}

要注意两个问题:

1、移位后的指标显示数值和不移位时的数值是不一样了。移位了五个时间单位,就显示五个时间单位之前的原数值。

2、所移位的周期数,不能设为参数来调整。移位的最大周期数是127。如果写成SHIFT666,调试公式也能通过,不过软件自动取了127来移位。

另外说点题外话。

用SHIFT10之后,当前日的指标显示的就是原10天前的指标数值。也就是说,把最近十天的K线数据,置之不理了。

从人的记忆的特征来看,越近发生的事,对目前的影响力就越大。这样看,用SHIFT就一无是处了,因为它抛弃了最近的数据,而去找较早的数据。

从混沌学牵一发就能动全身的观点看,SHIFT就大有道理了。佛教中说前世的因,后世的果,相差时间就长得不好说了。

这些讨论一般难得见到。易股论坛中有位台--湾的老兄,发了两帖,来讨论K线左移(或者说是指标线右移),我才留心了一下。巫山的朋友有体会的,不妨说说。

九、

函数: LINETHICK

参数: 0--7

返回: 无

说明: 改变指标线粗细,LINETHICK0 表示不画出指标线,不影响坐标,但可在顶部显示数值。  

示例: ma1:ma(close,5),linethick3;

ma1:ma(close,5),linethick0;表示不画出ma1指标线,不影响坐标,但可在顶部显示ma1数值

THICK,厚的。LINETHICK就可以理解为线(棒)的粗细了。

V,STICK,LINETHICKN;

N分别取1、2、3、4、5、6、7,做七个副图公式。

这个N也不能做成参数调整的。

LINETHICK0是非常常用的,因为一个公式中指标一多,显示会很乱,把有些显示去掉,就用这一招。

有时会碰到相反的情况,指标线(柱)显示不多,而顶部数值的显示太多了,那么怎么画出指标线,而又在顶部不显示数值呢?

一般用STICKLINE(画柱),PARTLINE(画线)等绘图函数来解决。

PARTLINE(1,MA(C,30));{主图叠加}

十、

函数: COLOR

参数: 000000--FFFFFF

返回: 无

说明: 改变指标线颜色。

常用: 黑色:colorblack 红色:colorred   绿色:colorgreen 蓝色:colorblue

    白色:colorwhite 灰色:colorgray 黄色:coloryellow 青色:colorcyan

    晶红色:colormagenta 棕色:colorbrown

示例: ma1:ma(close,5),coloryellow; 或 ma1:ma(close,5),colorff0000;

附录: 238种常用颜色代码速查表

COLOR,颜色,色彩。是这组函数中最常用的一个。不但能定义指标线(柱)的颜色,而且能定义顶部指标文字的颜色--用LINETHICK0时也一样。

颜色的种类应该够用了。至于各指标线(柱)之间的颜色搭配,实在是一种很艺术性的事。既要有美感,又要不触目惊心,我只能凭感觉挑选,其它也没有什么招数了。要是有学过美术的人来指点几招就好了。

枫叶秋雨兄提供的“飞狐色彩值吸取器”,实在是好东西,给我们挑选颜色提供了很大的方便。

飞狐基本函数简介之行情函数这些行情函数所取得的数据,是我们所编写的公式的原材料。

如果说公式是衣服,这些行情函数就是布。

有人会说做衣服不一定要布,野草树皮也可以做。对,一个公式中不一定非有行情函数不可,但总感觉透风,缺点什么。

一、

函数: OPEN

说明: 取得该周期开盘价,也可简写为 O.

函数: HIGH

说明: 取得该周期最高价,也可简写为 H.

函数: LOW

说明: 取得该周期最低价,也可简写为 L.

函数: CLOSE

说明: 取得该周期收盘价,也可简写为 C.

OPEN,打开。HIGH,高度。LOW,低的。CLOSE,关闭、结束。

常言道,巧妇难为无米之炊。此四者,就是我们做价格指标的“米”了。不同周期的K线,均由此四者为原材料画出。

(有人说,家里的米没有味道,于是去割野菜,采野花,日子一长,又说还是家里的米能填饱肚子。)

有人说,价、量、时、人是技术分析的四大要素,那么O、H、L、C便构成了“价”的四大要素。

道氏理论,主要关注的是长期趋势,所以,一般以CLOSE线为主要参考指标。所取前期高、低点,也是CLOSE线的高、低点。

人的心理,常以成败论英雄。所以CLOSE作为一根K线中的“结局”,被视为价格四大要素中的最关键因素。此论似成通论,但有些短线炒手认为,OPEN要比CLOSE更重要。股市本是无定论的地方,仁者见仁,智者见智,故不敢多作妄论。

这里随便谈些本人对未来函数和未来数据的看法。关于未来也者,在较为经典的书上很少直接见到这种说法,只是在网上见得多了,便有了些想法,说出与大家共同探讨。

如图,一般带公式平台的股票软件,有“公式检测”这一项,用来判断公式中是否含有未来函数。

目前的信号的产生和保持,如果全依赖于之前的数据,则可认为产生信号的公式中,不含有未来函数和未来数据。

目前的信号的产生和保持,如果部分依赖于之后的数据,则可认为产生信号的公式中,含有未来函数和未来数据。

换句话说,如果公式中产生的信号,随着行情的发展,信号永远不变,则此公式就绝无“未来”之嫌疑;信号可能要逃、要变,则此公式中就有“未来”。

如果此定义成立,则可将“未来”分为两种情况:

1、在一根K线(即时行情)中;

2、在多根K线(盘后)中。

在第一种情况中,以即时行情中的当前日K线为例,除了O之外,其它H、L、C全有未来之嫌。因为在收盘之前,拉高、打压是司空见惯的事,谁也不能保证H、L不会创出当天的新高和新低,更不用说C了。比如日线周期公式“C>REF(C,1);”,前一分钟信号成立,后一分钟可能信号就不成立了。这样说的话,在日K中包括H、L、C的指标,就全有“未来”之嫌疑了。

还有就是引用进来的信号,比如引用了周K和月K指标,因为当前周K和月K还在变动之中,所以也是未来数据。

在第二种情况中,因为在盘后,日K中的四大要素就没有未来之可能了。在多K线中,典型的未来函数有两个:BACKSET、ZIG。这两个未来函数到底未来到什么程度,到以后介绍时再说。就算在盘后,除了周五之外,引用的周K指标也是未来数据;除了在月末,引用的月K指标也是未来数据。

这样说的话,到处是“未来”,我们何处适从?

实际上未来也者,并不是新问题,而是老问题,从有技术分析之日起,这个问题就存在了,只是在经典著作中,并不是以“未来”的字眼出现。

“我们所采取的交易风格越保守,那么,耐心地等待趋势反转的验证信号就越为重要。到底需要等待多久呢?这就得从风险与报偿两个方面来权衡。如果我们选择较为保守的交易风格,宁愿等待趋势反转的验证信号,那么,确实可能承担较少的风险;但是另一方面,我们从交易中取得的报偿也可能减少了。等到趋势反转信号得到确认的时候,获利的空间也许已经缩小了。”

(<日本蜡烛图技术>P.159)

所以说即时行情中的“未来”也一样,体现的是技术分析中最古老的一个问题。

而多K线中的未来数据,是要好好注意的。如果在ZIG的低点买进,在ZIG的高点卖出,则是全世界最好的交易系统了--可惜是马后炮,因为当时谁也做不到这一点。但也不能说BACKSET、ZIG就一无是处了,有时甚至是不可或缺的。刀剑可能自伤,也可用于杀敌。只要我们熟悉了BACKSET和ZIG的本质,就可以了解它们“未来”到什么程度,拿来用也是不妨的。至于不熟悉的,还是少用为妙。

二、

函数: VOL

参数: 无

说明: 取得该周期成交量,也可简写为 V.

函数: AMOUNT

参数: 无

说明: 取得该周期成交额

VOLUME,量。AMOUNT,数量、总计。

成交量系统默认单位是手(一百股)。成交额系统默认单位是元(A股和基金是人民币、沪B股是美元、深B股是港元)。

成交量是仅次于价格的技术分析要素。成交额因为里面有价量因素,有些高手应用时喜欢用之代替成交量。

成交金额万元:AMOUNT/10000,LINETHICK0;

成交量手:VOL,VOLSTICK;

流通盘万股:CAPITAL/100,LINETHICK0;

换手率:100*V/CAPITAL,LINETHICK0;

三、

函数: ADVANCE

参数: 无

说明: 取得该周期上涨家数。(本函数仅对大盘有效)。

参数: DECLINE

参数: 无

说明: 取得该周期下跌家数。(本函数仅对大盘有效)。

ADVANCE,前进。DECLINE,下降。

用于上证指数和深圳成指。

A:=ADVANCE-DECLINE;

SUM(A,50);

这个线形状与指数C线有些不同,反映的是不加权的情况。

四、

函数: BUYVOL

参数: 无

说明: 取得主动性买单量。 当本笔成交为主动性买盘时,其数值等于成交量,否则为0. (本函数仅个股在分笔成交分析周期有效)  

函数: SELLVOL

参数: 无

说明: 取得主动性卖单量。当本笔成交为主动性卖盘时,其数值等于成交量,否则为0. (本函数仅个股在分笔成交分析周期有效)  

BUY,买。SELL,卖。VOL,VOLUME,量。

在分笔成交分析周期中看:

主动性买单量:BUYVOL;

主动性卖单量:SELLVOL;

之和:BUYVOL+SELLVOL;

总成交量:V;

两者之和必然为总成交量。所以说每笔之成交量,不是主动性买单量,就是主动性之卖单量。

主动性买单量代表多方的力量,主动将挂在卖盘档位的单子吃进,主动性卖单量则反之,代表的是空方的力量。

至于庄家对倒诱空诱多之动作,长期看另当别论,但在当时,确实也代表了多空之一方。

每日之SUM(BUYVOL,0)之类的数据,不能在其它周期中引用,要做成扩展数据才可。

五、

函数: ISBUYORDER

参数: 无

说明: 取得该成交是否为主动性买单。当本笔成交为主动性买盘时,返回1,否则为0. (本函数仅个股在分笔成交分析周期有效)  

ORDER,定单。BUYORDER,买单(不是请客吃饭后的买单!)。

在分笔成交分析周期中可以看到,任一笔成交的单子,不是主动买单,就是主动卖单。

主动买单:ISBUYORDER;

主动卖单:NOT(ISBUYORDER)*0.5;

这也就是没有ISSELLORDER函数的原因,因为用NOT(ISBUYORDER)就可以取得相同功能。

六、

函数: BIDPRICE(N)

参数: N取1--3,表示买盘档位。

说明: 取得委买1--委买3价格。(本函数仅个股在分笔成交分析周期有效)

示例: BIDPRICE(1)

    表示最高叫买价。

函数: BIDVOL(N)

参数: N取1--3,表示买盘档位。

说明: 取得委买1--委买3量。(本函数仅个股在分笔成交分析周期有效)

示例: BIDVOL(1)

    表示最高叫买量。

BID,出价、投标,这里是买进报价的意思。PRICE,价格。

有人可能会说:图中不是有委买8的单子么?呵呵,那是推算出来的,撤单了亦未可知。

七、

函数: ASKPRICE(N)

参数: N取1--3,表示卖盘档位。

说明: 取得委卖1--委卖3价格。(本函数仅个股在分笔成交分析周期有效)

示例: ASKPRICE(1)

   表示最低叫卖价。

函数: ASKVOL(N)

参数: N取1--3,表示卖盘档位。

说明: 取得委买1--委买3量。(本函数仅个股在分笔成交分析周期有效)

示例: ASKVOL(1)+ASKVOL(2)+ASKVOL(3)

   表示三档卖盘量总和。  

ASK,询问、要求,这里是卖出报价的意思。

副图公式一:

委买总量:BIDVOL(1)+BIDVOL(2)+BIDVOL(3);

委卖总量:ASKVOL(1)+ASKVOL(2)+ASKVOL(3);

副图公式二:

卖一买一空档:ASKPRICE(1)-BIDPRICE(1);

编仅个股在分笔成交分析周期有效的公式时要注意,编好了之后,公式的“禁用周期”就自动设置为如图的样子。

如果以后要把这个公式修改为其它周期的公式时,不可忘记把“禁用周期”中的设置改过来,否则公式指标输出会没有显示。

飞狐基本函数简介之绘图函数这组函数的功能是在主图或副图上设定条件输出图象、图标、直线、文字、数字、指标线、指标柱等,全部可以单独使用。

个人感觉,飞狐的强大功能,在此组函数中有淋漓尽致的发挥。无论在表面(美感),还是实质(提高工作效率)上,都有良好表现。

毫无例外的是,这组函数中,都带有COND。CONDITION,条件,状态。COND在这里可作为条件理解。

为了能找到合适的COND,用于举例子,请允许我先介绍一组概念。

高点:在2N+1根K线中,中间这根K线的H,要大于等于左右N根K线的H。在N+1根K线中,有等高点出现,取最先出现的。

低点:在2N+1根K线中,中间这根K线的L,要小于等于左右N根K线的L。在N+1根K线中,有等低点出现,取最先出现的。

峰点:高点和低点,合称为峰点。

(这个定义,意合于技术分析的老祖宗道氏:“只要平均指数的最高点超过了前期的最高点,它就处于牛市时期;当最低点低于前期的最低点时,它处于熊市时期。”这里我们撇开向上、向下分形和分形峰状点等概念,以免把概念复杂化。)

也为了不让公式一来就过于复杂,我们先取N为2来做公式。简介到后面,可以看到,N是可以作为峰点公式的参数进行调整的。

公式名称:FENG2

公式说明:供引用

公式内容:

{峰点参数暂定为2}

A:=REF(H,2);{中间K线的最高价}

B:=A>=REF(H,4) AND A>=REF(H,3) AND A>=REF(H,1) AND A>=H;{中间K线的最高价大于等于两边共四根K线的最高价}

D:=BACKSET(B,3);{将当前位置和之前2个周期的数值设为1}

HD:FILTER(D,2);{找到高点后,过滤掉其后2周期内可能出现的等高点。输出高点}

A2:=REF(L,2);{中间K线的最低价}

B2:=A2<=REF(L,4) AND A2<=REF(L,3) AND A2<=REF(L,1) AND A2<=L;{中间K线的最低价小于等于两边共四根K线的最低价}

D2:=BACKSET(B2,3);{将当前位置和之前2个周期的数值设为1}

LD:FILTER(D2,2);{找到低点后,过滤掉其后2周期内可能出现的等低点。输出低点}

{后面有些例子,就从这个公式中引用信号。}

一、

函数: DRAWICON

参数: 无

用法: DRAWICON(COND,PRICE,TYPE),当COND条件满足时,在PRICE位置画TYPE号图标。

说明: 在图形上绘制小图标,其中TYPE可选7种图标,编码为1-7(1-3为小脸,4、5为上下箭头,6、7为红绿小旗)。TYPE为    字符串时可显示用户自制BMP图。

示例: DRAWICON(CLOSE>OPEN,LOW,1);表示当收阳时在最低价位置画1号图

    DRAWICON(C>O,L,'MyBMP')表示当收阳时在最低价位置画FmlDLL子目录下的自制图标MyBMP.BMP

1、COND条件,一般是指判断的结果,不是0就是1。如用其它数据,大于等于1的,条件满足;小于1,条件就不满足。

2、TYPE图标,现在已经有12种,用下面的公式,在000829上可以全部显示出来。当TYPE取大于等于12的数时,都显示黄球。

当TYPE取0时,显示的是笑脸(这个公式中没有做进去,自己可以试一下)。

B:="FENG2.HD";

D:=BACKSET(ISLASTPERIOD,BARSLAST(B)+1);

A:=D>REF(D,1);

DRAWICON(REF(A,1),1.05*H,1);

DRAWICON(REF(A,2),1.05*H,2);

DRAWICON(REF(A,3),1.05*H,3);

DRAWICON(REF(A,4),1.05*H,4);

DRAWICON(REF(A,5),1.05*H,5);

DRAWICON(REF(A,6),1.05*H,6);

DRAWICON(REF(A,7),1.05*H,7);

DRAWICON(REF(A,8),1.05*H,8);

DRAWICON(REF(A,9),1.05*H,9);

DRAWICON(REF(A,10),1.05*H,10);

DRAWICON(REF(A,11),1.05*H,11);

DRAWICON(REF(A,12),1.05*H,12);

DRAWICON(REF(A,13),1.05*H,13);

DRAWICON(REF(A,14),1.05*H,100);{主图叠加}

当红球和绿球连续显示时,立体感会强一些。

DRAWICON(C>=MA(C,30),MA(C,30),10);

DRAWICON(C<MA(C,30),MA(C,30),11);{主图叠加}

3、PRICE是用于定位图标的位置的。一般用1.01*H,或者0.99*L等。现在可用ALIGN(0-5)指定对齐位置。

用这个公式来试(主图叠加)

B:="FENG2.HD";

D:=BACKSET(ISLASTPERIOD,BARSLAST(B)+1);

A:=D>REF(D,1);

E:=REF(H,1);

DRAWICON(A,E,10),ALIGN0;

DRAWICON(A,E,11),ALIGN1;

DRAWICON(A,E,12),ALIGN2;

DRAWICON(A,E,3),ALIGN3;

DRAWICON(A,E,4),ALIGN4;

DRAWICON(A,E,5),ALIGN5;

可以初步得出结论:

ALIGN0:信号出现在PRICE的正中;

ALIGN1:信号出现在PRICE下边(十分靠近);

ALIGN2:信号出现在PRICE上边(十分靠近);

ALIGN3:信号出现在主图的中间;

ALIGN4:信号出现在主图的最上边;

ALIGN5:信号出现在主图的最下边;

在高低点上作图标,可以使高低点更明确了。

A:="FENG2.LD";

B:="FENG2.HD";

DRAWICON(A,L,11),ALIGN1;

DRAWICON(B,H,10),ALIGN2;{主图叠加}

4、可以自由调用MyBMP.BMP图到显示位置,大大增强了输出的效果。你只要看到好看的图,可以随时抓拍过来,做成BMP文件,放到FmlDLL子目录下,就可以调用了。

A:="FENG2.LD";

B:="FENG2.HD";

DRAWICON(A,L,'PIG'),ALIGN1;

DRAWICON(B,H,'PIG'),ALIGN2;{主图叠加。如果你没有PIG.BMP文件,则不可显示。}

DRAWICON(1,MA(C,5),'S28');

DRAWICON(1,MA(C,10),'S31');

DRAWICON(1,MA(C,20),'S14');

DRAWICON(1,MA(C,30),'S25');{主图叠加。如果你想要这个公式有显示,可到楼下下载,解压缩到FmlDLL子目录下}

内有40个不同颜色的小球。

二、

函数: DRAWLINE

参数: 无

用法: DRAWLINE(COND1,PRICE1,COND2,PRICE2,EXPAND),当COND1条件满足时,在PRICE1位置画直线起点,当COND2条件满足时,在PRICE2位置画直线终点,EXPAND为延长类型。  

说明: 在图形上绘制直线段。

示例: DRAWILINE(HIGH>=HHV(HIGH,20),HIGH,LOW<=LLV(LOW,20),LOW,1);表示在创20天新高与创20天新低之间画直线并且向右延长。

DRAWLINE是唯一一个一句里面用到两个COND的绘图函数。因为它需要两个点来决定一直线。

COND1相当于指定K线位置(横坐标),PRICE1相当于是指定价位(纵坐标),这样一个点在平面上的位置就决定了。

DRAWLINE是从第一点画到第二点的,即有起点与终点的顺序关系:第一点出现的时间,要在第二点之前。否则线是画不出来的。

EXPAND,扩张、发展,这里是延伸的意思吧。一般取0,不延长;取1,延长。实际上是取大于等于1的数就延长,小于1就不延长。

DRAWLINE目前支持POINTDOT、LINETHICK、COLOR、SHIFT这四个描述函数。

举个例子吧。

A:="FENG2.LD";

B:="FENG2.HD";

DRAWICON(A,L,11),ALIGN1;

DRAWICON(B,H,10),ALIGN2;

D:=BACKSET(ISLASTPERIOD,BARSLAST(B)+1);

E:=D>REF(D,1);

F:=BACKSET(E,REF(BARSLAST(B),1)+2);

G:=F>REF(F,1);

DRAWLINE(G,H,E,H,1),pointdot,linethick1,coloryellow;{主图叠加}

这根线有些趋势线的意思了。由于趋势线的主观性颇强,只有多设参数才能满足多数人的要求,以后有机会再作介绍。

DRAWLINE画出的线,应该比手工画出的线精确一些。(DRAWLINE画线的灵敏度,要比手工画线低,所以说DRAWLINE画出的线精确,就未必对。)

主要用于画斜线,水平线我们一般可以另想办法。因为在图中显示直线,并非DRAWLINE的“专利”。

比如:

A:="FENG2.LD";

B:="FENG2.HD";

D:=BACKSET(ISLASTPERIOD,BARSLAST(A)+1);

E:=D>REF(D,1);

F:=BACKSET(ISLASTPERIOD,BARSLAST(B)+1);

G:=F>REF(F,1);

前高:REF(H,BARSLAST(G));

前低:REF(L,BARSLAST(E));{主图叠加}

这里出个“难题”吧:

怎么在主图上画一根直线?直线的高度是今天收盘价。就是这个样子的:

三、

函数: DRAWTEXT

参数: 无

用法: DRAWTEXT(COND,PRICE,TEXT),当COND条件满足时,在PRICE位置书写文字TEXT,可显示多行文本,用"\"换行。

说明: 在图形上显示文字。

示例: DRAWTEXT(CLOSE/OPEN>1.08,LOW,'大阳线');表示当日涨幅大于8%时在最低价位置显示'大阳线'字样。

DRAWTEXT(CLOSE/OPEN>1.08,LOW,'好呀\大涨啦');可显示多行文本,用"\"换行;

在某些满足条件的地方直接显示文字或字符,比显示图标要更直观一些。

此函数可以用ALIGN来定位水平位置。而ALIGN用在DRAWICON上定位的是高低的位置。

从下面例子可以看到,ALIGN(0~2)定义水平位置的意义:

ALIGN0:居中;

ALIGN1:偏右;

ALIGN2:偏左。

也可以用SHIFT函数进行向右水平移位。

所显示的文字或字符,可以用COLOR函数来定义颜色。至于文字的大小,则采用系统默认的大小,在此函数中无法定义。

此函数单独使用有其用途,与DRAWNUMBER配合应用时,效果更不错。后面介绍到DRAWNUMBER时再举例子。

A:="FENG2.LD";

B:="FENG2.HD";

DRAWICON(A,L,11),ALIGN1;

DRAWICON(B,H,10),ALIGN2;

D1:=BACKSET(ISLASTPERIOD,BARSLAST(B)+1);

E1:=D1>REF(D1,1);{离目前最近的一个高点}

D2:=BACKSET(E1,REF(BARSLAST(B),1)+2);

E2:=D2>REF(D2,1);{倒数第二个高点}

D3:=BACKSET(E2,REF(BARSLAST(B),1)+2);

E3:=D3>REF(D3,1);{倒数第三个高点}

DRAWTEXT(E1,H*1.01,'☆TEXT:'),COLORRED,ALIGN0;

DRAWTEXT(E2,H*1.01,'★TEXT:'),COLORGREEN,ALIGN1;

DRAWTEXT(E3,H*1.01,'▓TEXT:'),COLORYELLOW,ALIGN2;{主图叠加}

四、

函数: POLYLINE

参数: 无

用法: POLYLINE(COND,PRICE),当COND条件满足时,以PRICE位置为顶点画折线连接。

说明: 在图形上绘制折线段。

示例: POLYLINE(HIGH>=HHV(HIGH,20),HIGH);表示在创20天新高点之间画折线。

POLY,多个的。

支持POINTDOT、LINETHICK、COLOR、SHIFT这四个描述函数。

A:="FENG2.LD";

B:="FENG2.HD";

DRAWICON(A,L,11),ALIGN1;

DRAWICON(B,H,10),ALIGN2;

POLYLINE(A,L),POINTDOT,COLORGREEN;

POLYLINE(B,H),LINETHICK2,COLORMAGENTA;{主图叠加}

五、

函数: STICKLINE

参数: 无

用法: STICKLINE(COND,PRICE1,PRICE2,WIDTH,EMPTY),当COND条件满足时,在PRICE1和PRICE2位置之间画柱状线,宽度为WIDTH可为0---100(10为标准间距),EMPTH不为0则画空心柱。

说明: 在图形上绘制柱线。  

示例: STICKLINE(CLOSE>OPEN,CLOSE,OPEN,0.8,1);表示画K线中阳线的空心柱体部分。

再说明三点:

1、PRICE1和PRICE2没有顺序关系,即何者在前何者在后都不影响语句的执行。

2、WIDTH宽度,支持小数。用1和用0.1,会有很大的差别。取7时和主图的K线宽度差不多。

以下的副图公式,画出的K线,与主图中显示的K线差不多。有些“主图叠加公式”,叠加在副图中也未尝不可了。

STICKLINE(C>O OR (C=O AND C>REF(C,1)),O,C,7,1),colorred;{画出红K实体}

STICKLINE((C>O AND C<>H) OR (C=O AND C>REF(C,1)),C,H,0.1,0),colorred;{画出红K上影线}

STICKLINE((C>O AND L<>O) OR (C=O AND C>REF(C,1)),L,O,0.1,0),colorred;{画出红K下影线}

STICKLINE(C<O OR (C=O AND C<=REF(C,1)),C,O,7,0),colorcyan;{画出青K实体}

STICKLINE(C<O OR (C=O AND C<=REF(C,1)),L,H,0.1,0),colorcyan;{画出青K影线。因为青K是实心的,所以影线从中穿过}

MA(C,5);

3、用STICKLINE可以用两种方法做出多色彩K线效果。

一种是横向的,将K线实体从O到C分为N等份,每个小格中放入不同的但比较连续的颜色。

这里随便举个例子,N取4,只对阳线加了效果。其它变化,道理是一样的。

A:=C-O;

B:=C>O;

STICKLINE(B,O,O+A/4,8,0),COLORFF99FF;

STICKLINE(B,O+A/4,O+A*2/4,8,0),COLORFF00FF;

STICKLINE(B,O+A*2/4,O+A*3/4,8,0),COLOR9900FF;

STICKLINE(B,O+A*3/4,O+A,8,0),COLOR0000FF;{主图叠加}

还有一种方法就是纵向的了。先在较宽的K线中加颜色,然后把宽度逐步收窄,再加颜色覆盖以前的的,这样从纵向看,一根K线中就有不同颜色了。效果做得好的,可以做到赏心悦目。

B:=C>O;

STICKLINE(B,O,C,8,0),COLORFF99FF;

STICKLINE(B,O,C,6,0),COLORFF00FF;

STICKLINE(B,O,C,4,0),COLOR9900FF;

STICKLINE(B,O,C,2,0),COLOR0000FF;{主图叠加}

六、

函数: DRAWNUMBER(COND,PRICE,NUMBER,PRECISION)

参数: NUMBER(可以为常数或数组序列),PRECISION为精度(取值范围0-3),即显示到小数点后PRECISION位。

用法: DRAWNUMBER(COND,PRICE,NUMBER,PRECISION),当COND条件满足时,在PRICE位置书写数字

说明: 在图形上显示数字。

示例: DRAWNUMBER(CLOSE/OPEN>1.08,HIGH,(CLOSE-OPEN)/OPEN*100,2);表示当日涨幅大于8%时在最低价位置显示涨幅(相对开盘价的百分比)。

这个函数的特色是,在NUMBER位置可以放变量。

NUMBER,数字。DRAWNUMBER是DRAWTEXT的“兄弟”,也可以用ALIGN(0~2)来定义水平位置,方法相同。

A:="FENG2.LD";

B:="FENG2.HD";

DRAWICON(A,L,11),ALIGN1;

DRAWICON(B,H,10),ALIGN2;

D1:=BACKSET(ISLASTPERIOD,BARSLAST(B)+1);

E1:=D1>REF(D1,1);{离目前最近的一个高点}

D2:=BACKSET(E1,REF(BARSLAST(B),1)+2);

E2:=D2>REF(D2,1);{倒数第二个高点}

DRAWTEXT(E1,H*1.02,'高点价:'),COLORGREEN,ALIGN2;

DRAWNUMBER(E1,H*1.02,H,2),COLORGREEN,ALIGN1;

DRAWTEXT(E2,H*1.02,'高点价:'),COLORYELLOW,ALIGN2;

DRAWNUMBER(E2,H*1.02,H,2),COLORYELLOW,ALIGN1;{主图叠加}

七、

函数: FILLRGN(COND,PRICE1,PRICE2)

参数:

用法: FILLRGN(COND,PRICE1,PRICE2),当COND条件满足时,以COLOR填充PRICE1和PRICE2的区间

说明: 绘制指标区间彩带。

示例: FILLRGN(MA1>MA2, MA1,MA2),colorred; 表示MA1>MA2时以红色填充MA1和MA2之间的区域。

FILL,充满,填充。RGN可能是REGION,地区,地域。

用这个函数,再加DRAWICON可以调用BMP图象文件的功能,可以作出象风景一样的图。

这里举个简单的例子:

A:=MA(C,5);

B:=MA(C,10);

FILLRGN(1,H*1.01,H*1.02),COLORFFFF66;

FILLRGN(A>=B,A,B),COLORMAGENTA;

FILLRGN(A<B,A,B),COLORGREEN;

FILLRGN(1,L*0.99,L*0.98),COLORFF99CC;{主图叠加}

416

八、

函数: PARTLINE(COND,PRICE)

参数:

用法: PARTLINE(COND,PRICE),满足COND条件绘制PRICE连线。

说明: 分段绘制指标线

示例: PARTLINE(C>REF(C,1),C),colorred;表示收盘大于前收以红色绘制收盘价连线。

PART,部分,局部。值得一提的是,PARTLINE支持多种描述函数,如例所见。

A:=MA(C,5);

B:=MA(C,10);

PARTLINE(A>=B,A),COLORRED,POINTDOT;

PARTLINE(A>=B,B),COLORGREEN,CIRCLEDOT;

PARTLINE(A<B,A),COLORGREEN,CROSSDOT,LINETHICK3;

PARTLINE(A<B,B),COLORRED,SHIFT2;{主图叠加}

九、

函数: VERTLINE(COND)

参数:

用法: VERTLINE(COND),在COND条件满足的周期处画垂直线

说明: 在图形上绘制垂直线段

示例: DVERTLINE(HIGH>=HHV(HIGH,20);表示在创20天新高时画垂直线

VERTICAL,垂直的。

VERTLINE目前可以用POINTDOT、LINETHICK、COLOR、SHIFT这四个描述函数来描述。

这个函数,主要是用于画线看时间的。费波纳契周期,可以用这个函数画出来的。

这里举个例子,把日K线中每月的第一个交易日中,画一根垂直线。

A:=MONTH>REF(MONTH,1);

VERTLINE(A),COLOR808040,POINTDOT;{主图叠加}

十、

函数: DRAWYITEXT(COND,PRICE,CODE,TYPE)

参数:       

用法: 在COND在图形上显示易学文字,可ALIGN0-3定义对齐方式。

说明: 当COND条件满足时,在PRICE位置书写TYPE类型的CODE的对应文字

TYPE为常数,取0--1,分别表示计算的是干支、64卦,CODE为对应的代码

示例: DRAWYITEXT(CLOSE/OPEN>1.05,LOW, GANZHI(DATE*100, 2),0),表示当日涨幅大于5%时在最低价位置显示日干支;

DRAWYITEXT(REF(CLOSE,2)>REF(OPEN,2) AND REF(CLOSE,1)>REF(OPEN,1) AND CLOSE>OPEN, LOW, KGUA(1, 1), 1 ),表示连二阳时在最低价位置显示K线卦象。

如下例子:K线卦

kk:=KGUA(0,6);

DRAWYITEXT(c>0,mod(BARSCOUNT(c),6),kk,1); {附图指标}

十一、

函数: DRAWBKBMP(COND,BMP)

参数:       

用法: 当图形上最后一组COND条件满足时,以MyBMP做背景:       

说明: 根据条件设置背景图

示例: 因为系统K线先画,会被后来的指标图覆盖了

这种公式K线要自己画,以下供参考

DRAWBKBMP(c>0,'mybmp');

STICKLINE(c>o or c=o and c>ref(c,1),l,h,0.1,0),colorred;

STICKLINE(c>o or c=o and c>ref(c,1),o,c,7,0),colorred;

STICKLINE(c<o or c=o and c<=ref(c,1),l,h,0.1,0),colorcyan;

STICKLINE(c<o or c=o and c<=ref(c,1),o,c,7,0),colorcyan;

把公式设为主图、主图叠加

十二、

函数: DRAWGBK(COND,COLOR1, COLOR2,D)

参数:

用法: 当COND条件满足时,以COLOR1到COLOR2渐变色填充子图区域,D=0表示从左到右,D=1表示从上到下

说明: 绘制渐变背景色

示例: DRAWGBK(C>O, COLORRGB(255,0,0), COLORRGB(255,255,0),0);

 

 

 

 

飞狐基本函数简介之时间函数基本函数全是遍历所有从前到后(从第一根到最后一根)K线的,取得每根K线上的时间,就用时间函数了。

飞狐有独有的自然日、阴阳历、节气、月相、易学相关分析,在时间函数中就有相应的体现。

时间周期分析是技术分析的一大分枝吧,江恩等人乐此不疲。不过也有不少人不相信。

一、

函数: DAY

参数: 无

返回: 返回有效值范围为(1-31).

说明: 取得该周期的日期。

函数: WEEKDAY

参数: 无

返回: 返回有效值范围为(0-6),0表示星期天

说明: 取得该周期的星期数。

函数: MONTH

参数: 无

返回: 返回有效值范围为(1-12)

说明: 取得该周期的月份。

函数: YEAR

参数: 无

返回: 返回有效值范围为(1970-2038)

说明: 取得该周期的年份。

与DATE函数不同,这些函数所输出的数值,与我们平时使用时是真实对应的,比如DAY返回3,当时就是3号。

小周期K线中使用大周期的时间函数不成问题,反之则不行。比如在分笔成交图中,也可以取得年、月等。

年:YEAR,LINETHICK0;

月:MONTH;

周:WEEKDAY;

日:DAY;

二、

函数: DATE

参数: 无

返回: 返回有效值范围为(700101-1341231),表示19700101-20341231

说明: 取得该周期从1900以来的的年月日。

为什么当时设计这个函数时,不直接取得年月日?不得而知。

后来还是给发现了一些蛛丝马迹,

年月日:DATE+19000000;

年(200)月日:DATE-1000000;

YMD:YEAR*10000+MONTH*1000+DAY;

只有第二句的输出始终是对的,其它两句,输出可能都会增1或减1。FH和FXJ一样,都有这个问题。

这就是DATE不直接取得年月日的原因。对于其它整数部分的位数达8位的数的运算,我们也可以知道,个位数的精确度是有问题的。

********************************************

DATE 函数使用的注意事项

用公式检测:

DATE+19000000;

1.有些日期结果不对;

2.DATE+19000000+1;不起作用,只有加2以上才起作用!

是浮点计算造成的误差,写公式时尽量用DATE表述。

只好“压缩”使用了。

比如大盘的成交额,不用元为单位,用万元或亿元为单位。

数据的使用,无需追求过多的位数,要看相对误差。

目前可以正确处理的整数部分的位数达8位,相对误差已经非常的小了。

本来可以显示小数的,大概是1a001提了建议后,这类数据的显示,限制了小数部分的显示了。

只好这样来处理了:

mod(YEAR,100)*10000+MONTH*100+DAY

年号只用2位数表示。

******************************************

三、

函数: HOUR

参数: 无

返回

飞狐基本函数简介之引用函数引用函数主要是向前引用数据。BACKSET可以理解为向后引用某些判断信号,并不能引用具体数据。

股市技术分析主要是根据已经发生的数据,来推测未来走向的可能,所以引用函数在公式中应用得最多,具体使用时,奥妙也最多。有些东西实在不能铺开多讲,否则篇幅会了无穷尽,只能急刹车。不当之处,请各位多多指正。

一、

函数: COUNT(X,N)

参数: X为数组,N为计算周期

返回: 返回数组

说明: 统计N周期中满足X条件的周期数,若N=0则从第一个有效值开始。

示例: COUNT(CLOSE>OPEN,20)

表示统计20周期内收阳的周期数

函数: SUM(X,N)

参数: X为数组,N为计算周期

返回: 返回数组

说明: 统计N周期中X的总和,N=0则从第一个有效值开始。

示例: SUM(VOL,0)

表示统计从上市第一天以来的成交量总和

COUNT,计数。SUM,总数、和。

当数组为逻辑运算判断的结果时,COUNT和SUM的返回值是一样的。一般习惯上,对于逻辑运算信号,用COUNT统计,返回其它数值的,用SUM统计。当COUNT统计一般数值时,数组大于等于1时,计入;小于1时,不计入。这两个函数,主要用于统计。

用COUNT(CROSS(MA(C,5),MA(C,10)),0);就可以统计出全部的五天均线上穿十天均线的金叉数。

用SUM(CROSS(MA(C,5),MA(C,10)),0);和以上得出的结果应该是一样的。

股市的不随机规律,隐藏在统计概率之中。用这两个函数,可以统计很多概率性的规律。

比如,以两天的收盘价相比,昨天是下跌的,今天的下跌的概率是多少?

A:=C<REF(C,1);

B:=REF(A,1) AND C>REF(C,1);{昨天下跌,今天上涨}

D:=REF(A,1) AND C=REF(C,1);{昨天下跌,今天平盘}

E:=REF(A,1) AND C<REF(C,1);{昨天下跌,今天下跌}

F:=COUNT(B,0)+COUNT(D,0)+COUNT(E,0);

上升概率:100*COUNT(B,0)/F;

下跌概率:100*COUNT(E,0)/F;

平盘概率:100*COUNT(D,0)/F;

从两市指数看,昨天下跌,今天下跌的概率始终大于50%。

那么连跌两天之后,第三天收盘的各种概率是多少?

A:=C<REF(C,1) and ref(c,1)<ref(c,2);

B:=REF(A,1) AND C>REF(C,1);{前两天下跌,今天上涨}

D:=REF(A,1) AND C=REF(C,1);{前两天下跌,今天平盘}

E:=REF(A,1) AND C<REF(C,1);{前两天下跌,今天下跌}

F:=COUNT(B,0)+COUNT(D,0)+COUNT(E,0);

上升概率:100*COUNT(B,0)/F;

下跌概率:100*COUNT(E,0)/F;

平盘概率:100*COUNT(D,0)/F;

从指数的输出看,概率更明显了。

连跌三天之后呢?

A:=C<REF(C,1) and ref(c,1)<ref(c,2) and ref(c,2)<ref(c,3);

B:=REF(A,1) AND C>REF(C,1);{前三天下跌,今天上涨}

D:=REF(A,1) AND C=REF(C,1);{前三天下跌,今天平盘}

E:=REF(A,1) AND C<REF(C,1);{前三天下跌,今天下跌}

F:=COUNT(B,0)+COUNT(D,0)+COUNT(E,0);

上升概率:100*COUNT(B,0)/F;

下跌概率:100*COUNT(E,0)/F;

平盘概率:100*COUNT(D,0)/F;

规律就更明显了。

不要小看这些数据。虽然没有有些“高手”做出的成功率达百分之九十左右的公式那么夸张,但很有意义的。要知道股市中的随机因素太多,平衡性很强,稍稍的统计偏向,足可作为有用的参考。

这只是简单的例子,用这两个函数,可以做出很多的有用的统计数据。

多数的交易系统的“胜率”,可以由此统计出来。

出个“难题”吧:

有个MA5金叉MA10作为买入条件,死叉为卖出条件的交易系统,试做一个副图公式,以每次买一股计算,统计出最后的交易结果(暂不考虑手续费)。买入卖出均以收盘价计算。

二、

函数: REF(X,N)

参数: X为数组,N为计算周期

返回: 返回数组

说明: 引用N周期前的X值。

示例: REF(CLOSE,1)

表示上一周期的收盘价,在日线上就是昨收

REF:REFERENCED,参考的、引用的。

N可以为变量,常用BARSLAST(X)等。

三、

函数: MA(X,N)

参数: X为数组,N为计算周期

返回: 返回数组

说明: 求X的N日移动平均值。

算法: (X1+X2+X3+...+Xn)/N

示例: MA(CLOSE,10),表示求10日均价

MA:MOVING AVERAGE,移动平均。

目前飞狐的MA(X,N)函数支持N为序列变量。

这个简单移动平均值,仅仅覆盖最近的N个周期,并且在每个周期中分配的权重是一模一样的,均为1/N。

移动平均线实质上是一种追踪趋势的工具,而且滞后于市场的变化。这些结果的原因,就是它的计算方法了。

从输出看,N所取周期越长,曲线就越平滑。

平滑和敏感是一对矛盾,请看:

A:MA(C,5);

B:MA(A,5);

D:MA(B,5);{主图叠加}

输出线越来越平滑,但敏感性越来越差。

两条简单移动平均线的交叉,何时、何地所选的参数最优,可以参考飞狐中的“探索最佳参数”功能。

线性加权移动平均值的算法函数,飞狐并未提供。

以五天的线性加权移动平均的算法为例:

五天线性加权:(C*5+REF(C,1)*4+REF(C,2)*3+REF(C,3)*2+REF(C,4)*1)/(5+4+3+2+1);

MA(C,5);{主图叠加}

由于算法的原因,线性加权移动平均线由于日子越近的权重越大,比简单移动平均线,跟随趋势要紧密一些,敏感一些。

从图上看,两者的交叉也是极为敏感的。

四、

函数: EMA(X,N)

参数: X为数组,N为计算周期

返回: 返回数组

说明: 求X的N日指数平滑移动平均。

算法: 若Y=EMA(X,N) 则Y=[2*X+(N-1)*Y']/(N+1), 其中Y'表示上一周期Y值。

示例: EMA(CLOSE,30)

表示求30日指数平滑均价

EMA中的E,可能是EXPONENT,指数、幂。

把算法写成这个样子:Y=2*X/(N+1)+(N-1)/(N+1)*Y',就可以看出,当前周期数组值所占的权重是2/(N+1),而上一周期Y值所占的权重是(N-1)/(N+1)。注意,这两个权重相加,结果为1:2/(N+1)+(N-1)/(N+1)=1。

由于一个很经典的指标指数平滑异同平均线MACD(1979年就发明出来了)里面,要用到EMA,才使EMA还在基本函数中占有一席之地。后面我们可以看到,用SMA也可以达到相同的算法。

N可以取到1,不过输出就没有加权的效果了。

五、

函数: SMA(X,N,M)

参数: X为数组,N为计算周期,M为权重

返回: 返回数组

说明: 求X的N日移动平均,M为权重。  

算法: 若Y=SMA(X,N,M) 则 Y=[M*X+(N-M)*Y')/N, 其中Y'表示上一周期Y值,N必须大于M。

示例: SMA(CLOSE,30,1)

表示求30日移动平均价

SMA中的S,不会是SIMPLE(简单)的意思吧?由于我们习惯称MA为简单移动平均线,所以称SMA为什么就大伤脑筋。

我的理解,SMA应该称为指数加权移动平均线。不对之处请方家指出。

把算法写成这个样子:Y=M/N*X+(N-M)/N*Y',就可以看出,当前周期数组值所占的权重是M/N,而上一周期Y值所占的权重是(N-M)/N。注意,这两个权重相加,结果为1:M/N+(N-M)/N=1。

看出来了吧?SMA(X,N+1,2)=EMA(X,N);

A:SMA(C,N+1,2);

B:EMA(C,N);{N:5,2,99。主图叠加}

两条线输出一样。在SMA的参数中,N必须大于M,否则没有输出。

SMA中,数组每天所占的权重,是较为复杂的。总的来说,日子越近,所占的权重越大,当天所占的权重是M/N,前一天所占的权重是M*(N-M)/(N*N);日子越远,所占的权重就越小,上市第一天的K线数据中,在目前还有权重的体现,不过已经非常非常小了。

SMA看似解决了MA的两大缺点:1、只有N天内的数据占有权重;2、N天内数据所占权重比重一样。有所得必有所失,SMA自己的缺点体现在光滑有余,敏感不足。

有一项检测系统得出的结论称:“简单移动平均值方法既胜过线性加权平均值法,也胜过指数加权平均值法。”(<期货市场技术分析>P231),当然他们不是检测中国股市。有兴趣的朋友,可以用这些移动平均函数,做出交易系统,然后进行检测。

六、

函数: DMA(X,A)

参数: X为数组,A为计算周期

返回: 返回数组

说明: 求X的动态移动平均。  

算法: 若Y=DMA(X,A) 则 Y=A*X+(1-A)*Y',其中Y'表示上一周期Y值,A必须小于1。

示例: DMA(CLOSE,VOL/CAPITAL)

表示求以换手率作平滑因子的平均价

呵呵,均线函数还有。

DMA中的D,是中文的拼音:DONG。也可能是DYNAMIC。

这个函数,与SMA是一家的,看:

Y=M/N*X+(N-M)/N*Y';

Y=A*X+(1-A)*Y';

前者说,N必须大于M,后者说,A必须小于1。然后两者就一样了:A=M/N。

说“A为计算周期”似乎不妥,A明明要取小数才行。DMA在第一根K线就开始起算,SMA要到第二根K线开始起算。

七、

函数: HHV(X,N)

参数: X为数组,N为计算周期

返回: 返回数组

说明: 求N周期内X最高值,N=0则从第一个有效值开始。

示例: HHV(HIGH,30)

表示求30日最高价

函数: HHVBARS(X,N)

返回: X为数组,N为计算周期

参数: 返回数组

说明: 求N周期内X最高值到当前周期数,N=0表示从第一个有效值开始统计

示例: HHVBARS(HIGH,0)

求得历史新高到到当前的周期数

这两个函数一起用,可以找到当前N天中的最高点。

A:=BACKSET(ISLASTPERIOD,HHVBARS(H,N)+1);

B:=COUNT(A,N)=1;{取得前N个周期内的最高点位置}

REF(H,BARSLAST(B));

DRAWICON(B,H,1),ALIGN2;{主图叠加。N:30,1,9999}

八、

函数: LLV(X,N)

参数: X为数组,N为计算周期

返回: 返回数组

说明: 求N周期内X最低值,N=0则从第一个有效值开始。  

示例: LLV(LOW,0)

表示求历史最低价

函数: LLVBARS(X,N)

参数: X为数组,N为计算周期

返回: 返回数组

说明: 求N周期内X最低值到当前周期数,N=0表示从第一个有效值开始统计

示例: LLVBARS(HIGH,20)

求得20日最低点到当前的周期数

当前N天之内的最高点和最低点就一目了然了:

A:=BACKSET(ISLASTPERIOD,HHVBARS(H,N)+1);

B:=COUNT(A,N)=1;{取得前N个周期内的最高点位置}

REF(H,BARSLAST(B));

DRAWICON(B,H,1),ALIGN2;

A2:=BACKSET(ISLASTPERIOD,LLVBARS(L,N)+1);

B2:=COUNT(A2,N)=1;{取得前N个周期内的最低点位置}

REF(L,BARSLAST(B2));

DRAWICON(B2,L,2),ALIGN1;{主图叠加。N:30,1,9999}

A:=BACKSET(ISLASTPERIOD,HHVBARS(H,N)+1);

B:=COUNT(A,N)=1;{取得前N个周期内的最高点位置}

REF(H,BARSLAST(B));

DRAWICON(B,H,1),ALIGN2;

A2:=BACKSET(ISLASTPERIOD,LLVBARS(L,N)+1);

B2:=COUNT(A2,N)=1;{取得前N个周期内的最低点位置}

REF(L,BARSLAST(B2));

DRAWICON(B2,L,2),ALIGN1;{主图叠加。N:30,1,9999}

这个公式求前期高低点,在600036等次新股上试调整参数就露马脚了,并不完善。

问题出在HHVBARS起算点等原因上。

南客刚发表了一个公式,就顺手牵羊牵过来吧。这个公式可以说是完美解决方案:

HH:HHV(H,N),LINETHICK2;

LL:LLV(L,N),LINETHICK2;{主图叠加,参数N:30,1,9999}

<%

VH=FFL.VARDATA("HH")

VL=FFL.VARDATA("LL")

VN=FFL.VARDATA("N")

LAST=UBOUND(VH)

IF VN>LAST THEN VN=LAST+1

FOR I=LAST TO LAST-VN+1 STEP-1

VH(I)=VH(LAST)

VL(I)=VL(LAST)

NEXT

FFL.VARDATA("HH")=VH

FFL.VARDATA("LL")=VL

FFL.VARSTARTINDEX("HH")=LAST-VN+1

FFL.VARSTARTINDEX("LL")=LAST-VN+1

%>

当N个周期之内,有两个最高价,即有等高的情况出现,HHVBARS会返回哪个最高价到当前的周期数呢?

用副图公式观察一下,N取10:

HHVBARS(H,N);

如图,我们可以得出结论,返回的是前一个最高价到当前的周期数。

同样,当在N个周期之内,有两个等低的最低价出现时,LLVBARS会返回前一个最低价到当前的周期数。

九、

函数: SUMBARS(X,A)

参数: X为数组

返回: 返回数组

说明: 将X向前累加直到大于等于A,返回这个区间的周期数

示例: SUMBARS(VOL,CAPITAL)

求完全换手到现在的周期数

这个函数好用,在于它不但能精确地得到统计结果,而且能得到“模糊”的结果。

就以SUMBARS(VOL,CAPITAL)为例:

日期数:SUMBARS(VOL,CAPITAL);{返回成交量累加到流通盘的日期数}

验证:SUM(V,日期数)/CAPITAL;{把返回的日期数之内的成交量累计,再除以流通盘}

运行的结果中,我们可以看到,“验证”的输出,除了SUMBARS起算点附近之外,从来没有小于1的。可见SUMBARS只往多算,不往少算,非常“精明”。

十、

函数: BARSCOUNT(X)

参数: X为数组

返回: 返回数组

说明: 第一个有效数据到当前的天数

示例: BARSCOUNT(CLOSE)

对于日线数据取得上市以来总交易日数,对于分笔成交取得当日成交笔数,对于1分钟线取得当日交易分钟数

BARS是什么?我们看到,关于取得相隔时间周期的函数中,多数以BARS开头。

查字典,BAR的意思有很多,有条、条形、酒巴、巴等。后来才恍然大悟:相隔时间周期,不就是中间相隔几根条形K线么?

BARSCOUNT(X)是第一个有效数据到当前的天数。那么什么是有效数据?

A:BACKSET(ISLASTPERIOD,10);

零:BARSCOUNT(A);

很小:BARSCOUNT(C/10000000000000);

负数:BARSCOUNT(-C);

不存在:BARSCOUNT(MA(C,10));

可见,有效数据并不是全是大于等于1的数据,只要有输出的数据,不管是零,还是负数,均为有效数据。

而MA(C,10)是从第十根K线开始起算的,所以一直要到第十根K线,BARSCOUNT(MA(C,10))才输出1。

这样找一些指标的起算点时间位置,用BARSCOUNT函数就很管用了。

一般找第一根K线的位置,就可以写为BARSCOUNT(C)=1;

十一、

函数: BARSSINCE(X)

参数: X为数组

返回: 返回数组

说明: 第一次X不为0到现在的天数

示例: BARSSINCE(HIGH>20)

表示股价第一次超过20元时到当前的周期数

SINCE,自...以后。BARSSINCE和BARSCOUNT很象,不过它找的是非零信号。

A:BACKSET(ISLASTPERIOD,10);

零:BARSsince(A);

很小:BARSsince(C/10000000000000);

负数:BARSsince(-C);

不存在:BARSsince(MA(C,10));

可见,零和无效数据,均不被计数。一般BARSSINCE是针对逻辑运算的结果的,因为逻辑运算的结果输出,不是0,就是1。

十二、

函数: BARSLAST(X)

参数: X为数组

返回: 返回数组

说明: 上一次X不为0到现在的天数

示例: BARSLAST(CLOSE/REF(CLOSE,1)>=1.1)

表示上一个涨停板到当前的周期数

条件满足的当前周期,BARSLAST返回0。

是“不为0”到现在的天数么?运行这个公式试试:

A:=C>O;

A1:=0.5*A;

A2:=3*A;

A3:=-3*A;

一:BARSLAST(A1);

二:BARSLAST(A2);

三:BARSLAST(A3);

如图,“一”根本就没有输出。初步可得出结论:其绝对值大于等于1的数组信号,BARSLAST(数组)才有输出。

十三、

函数: BACKSET(X,N)

参数: X为数组,N为正整数

返回: 返回数组

说明: 若X非0,则将当前位置到N周期前的数值设为1。

示例: BACKSET(CLOSE>OPEN,2)

若收阳则将该周期及前一周期数值设为1,否则为0

如果公式检测出来有未来数据,则BACKSET是第一个嫌疑。

BACKSET是往前倒推信号(数据1)的,仅此而已。由于所有基本函数都是序列变量,所以要用基本函数,把当前的数据(比如最高价)往前推是做不到的。所以说,基本函数要往后引用具体数据是做不到的,往后引用信号是可能用BACKSET做到的。

说BACKSET不可或缺,是因为用基本函数在找历史峰点等公式中,如果没有它将一筹莫展。

这个“说明: 若X非0,则将当前位置到N周期前的数值设为1。”有点问题,如果数组X是逻辑运算的结果是对的,如果不是就难说了,比如:

A:BACKSET(0.1*ISLASTPERIOD,10);

B:BACKSET(100*ISLASTPERIOD,20);

D:B>REF(B,1);

“A”的输出全为0,“B”的输出就正常了。

十四、

函数: FILTER(X,N)

参数: X为数组,N为正整数

返回: 返回数组

说明: 过滤连续出现的信号,X满足条件后,删除其后N周期内的数据置为0

示例: FILTER(CLOSE>OPEN,5)

查找阳线,5天内再次出现的阳线不被记录在内

如果说BACKSET能够向后引用信号,那么FILTER就能向后过滤信号--即把有效信号去掉。比如N取3,就把以后3个周期内的有效信号去掉了,所以从连续信号上看,两个信号之间的间隔不可能小于3的。用这个公式观察一下就容易明白了:

A:=C>O;

FILTER(A,3);

十五、

举两个综合运用引用函数的例子。

1、RSI(相对强弱指标(Relative Strenth Index),1978年由韦尔斯·王尔德发明)

A、飞狐的反趋向指标中的RSI是这样写的:

LC := REF(CLOSE,1);

RSI1:SMA(MAX(CLOSE-LC,0),N1,1)/SMA(ABS(CLOSE-LC),N1,1)*100;

RSI2:SMA(MAX(CLOSE-LC,0),N2,1)/SMA(ABS(CLOSE-LC),N2,1)*100;

RSI3:SMA(MAX(CLOSE-LC,0),N3,1)/SMA(ABS(CLOSE-LC),N3,1)*100;

{N1:6,2,100   N2:12,2,100   N3:24,2,100}

RSI1、RSI2、RSI3三根线是一样的算法,只是所取参数不同。

MAX,在两者之间取大者。ABS,取绝对值。以日K周期为例,LC是昨天的收盘价,C-LC即为两天之间的收盘价差值。

RSI的分母是这个差值的绝对值,进行指数加权平均处理。

RSI的分子是上涨中的差值,进行指数加权平均处理。

分子所占分母的比重的百分比,即得出RSI的值。

B、原始RSI的算法是这样的:

设A为N天内上涨收盘价的平均值,B为N天内下跌收盘价的平均值。

RSI=100-100/(1+RS),其中的RS=A/B。

经过化简,RSI=100*A/(A+B)。写成公式:

LC:=REF(C,1);

D:=IF(C>LC,C-LC,0);   E:=IF(C<LC,LC-C,0);

A:=SUM(D,N)/N;    B:=SUM(E,N)/N;

RSI:100*A/(A+B);     {N:6,2,100}

好了,将两种算法写在一起:

LC:=REF(C,1);

D:=IF(C>LC,C-LC,0);   E:=IF(C<LC,LC-C,0);

A:=SUM(D,N)/N;    B:=SUM(E,N)/N;

原始RSI:100*A/(A+B); {N:6,2,100}

飞狐RSI:SMA(MAX(C-LC,0),N,1)/SMA(ABS(C-LC),N,1)*100;

{坐标线位置:0; 20; 50; 80; 100; }

如图,原始RSI要比飞狐RSI要敏感一些,因为飞狐的RSI经过了指数加权平均处理。

我没有说指数加权平均处理就不好了,经过处理后,指标会平滑、稳定一些。

2、参数可调整的峰点公式

A:=REF(H,N)=HHV(H,2*N+1);{当前位置N天之前的最高价是最近2*N+1根K线中的最高价}

B:=FILTER(A,N); {当高点附近有等高的K线出现时,会影响后续高点的判断,所以要过滤}

D:=BACKSET(B,N+1);{将当前位置及前N周期的数值设为1,所以要用N+1}

HD:=FILTER(D,N); {当高点附近有等高的K线出现,取第一个,过滤掉后面N个周期之内出现的}

A2:=REF(L,N)=LLV(L,2*N+1);{求低点的过程与求高点的过程同理}

B2:=FILTER(A2,N);

D2:=BACKSET(B2,N+1);{参数N:1,3,999}

LD:=FILTER(D2,N);{主图叠加}

DRAWICON(HD,H,10),ALIGN2;{在高点附近显示红球}

DRAWICON(LD,L,11),ALIGN1;{在低点附近显示绿球}

可以说,这个公式用了未来函数BACKSET,但是用在日K线中,盘后是没有未来数据的,因为引用的全是已经发生过的不可变的数据了。

至于即时盘中的未来数据,那是说不到底的事,基本所有的公式,都有即时盘中未来数据,详见简介二中的探讨说明。

红球绿球作为峰点标志,在显示K线不多的情况下,还比较清楚。但当K线数较多时,因为球的大小是不变的,所以看起来比较乱。故可用以下公式:

A:=REF(H,N)=HHV(H,2*N+1); B:=FILTER(A,N); D:=BACKSET(B,N+1);   HD:=FILTER(D,N);

A2:=REF(L,N)=LLV(L,2*N+1);B2:=FILTER(A2,N); D2:=BACKSET(B2,N+1);LD:=FILTER(D2,N);

STICKLINE(REF(HD,1),REF(H,1),REF(H,1),18,0),COLORMAGENTA;

STICKLINE(REF(LD,1),REF(L,1),REF(L,1),18,0),COLORGREEN;

飞狐基本函数简介之逻辑函数这组函数全部用于逻辑判断,所得结果非0即1。

一、

函数: IF(X,A,B)

参数: X、A、B为数组或常数

返回: 返回数组

说明: 若X不为0则返回A,否则返回B

示例: IF(CLOSE>OPEN,HIGH,LOW)

表示该周期收阳则返回最高值,否则返回最低值

IF,如果。

这个函数妙用无穷,例子举不胜举。这里只提要注意的几点。

1、用以下公式来测试,发现N取10,在最后一根K线还能输出1,N取11就输出0了。说明“X不为0”的极限值是0.1。

IF(ISLASTPERIOD/N,1,0);{参数N:10,1,999}

2、A和B两者,要求是有效值。如果A是有效值,B是无效值,在X满足条件的情况下,也未必能返回A。

IF(C>O,MA(C,5),MA(C,100000000));

二、

函数: CROSS(A,B)

参数: A、B为数组或常数

返回: 返回数组

说明: 表示当A从下方向上穿过B时返回1,否则返回0

示例: CROSS(MA(CLOSE,5),MA(CLOSE,10))

表示5日均线与10日均线交金叉

CROSS,交叉。

这个“说明: 表示当A从下方向上穿过B时返回1,否则返回0 ”要咬文嚼字的话,要说成这样:

当上一个周期A<B,而当前周期A>B时,CROSS(A,B)返回1,否则返回0。

为什么要这样说呢?因为“从下方向上穿过”是个模糊说法,当两条线同时向下时,也会发生“金叉”,不信?看看以下公式的运行情况就知道了。

REF(A,1)<REF(B,1) AND A>B;

这个公式与CROSS(A,B)输出的结果应该是一样的。也可用以下公式验证。

LC:=REF(C,1);

D:=IF(C>LC,C-LC,0);   E:=IF(C<LC,LC-C,0);

A:=SUM(D,N)/N;    B:=SUM(E,N)/N;

原始RSI:100*A/(A+B); {N:6,2,100}

飞狐RSI:SMA(MAX(C-LC,0),N,1)/SMA(ABS(C-LC),N,1)*100;

DRAWICON(CROSS(飞狐RSI,原始RSI),0,10);

DRAWICON(REF(飞狐RSI,1)<REF(原始RSI,1) AND 飞狐RSI>原始RSI,10,11);

{坐标线位置:0; 20; 50; 80; 100; 参数N:6.2.100 }

三、

函数: NOT(X)

参数: X为数组或常数

返回: 数组或常数

说明: 返回非X,即当X=0时返回1,否则返回0

示例: NOT(ISUP)

表示平盘或收阴

0.1是常数么?是。0.1不等于0吧?是。那么NOT(0.1)应该返回0了?

按说明应该返回0,但实际上是返回1的。

NOT(C/N);

NOT(0.1);{参数N:10,1,999}

如图,调整N,我们可以观察到结论:当X大于等于1时,NOT(X)返回0,小于1时返回1。

四、

函数: ISUP

参数: 无

返回: 返回数组

说明: 当收盘>开盘时,返回值为1,否则为0

函数: ISEQUAL

参数: 无

返回: 返回数组

说明: 当收盘=开盘时,返回值为1,否则为0

函数: ISDOWN

参数: 无

返回: 返回数组

说明: 当收盘<开盘时,返回值为1,否则为0

ISUP相当于O<C, ISEQUAL相当于O=C, ISDOWN相当于O>C,感觉没有什么用,只是有时可以使公式简洁一点。

五、

函数: ISLASTPERIOD

参数: 无

返回: 返回数组

说明: 该周期是否最后一个周期。最后一个周期返回值为1,其余为0

ISLASTPERIOD,是最后一个周期。这个函数,可以适用于任意周期的,当周期定下来之后,就返回最后一根条形图上的值为1。所以,解释为最后一根条形图(K线)比较恰当。

飞狐最近版本中,改ISLASTPERIOD为ISLASTBAR,就是这个原因。但也带来不便,以前的公式运行没有问题,要修改时,就要把ISLASTPERIOD全改成ISLASTBAR,否则调试通不过。

这是个很实用的函数,特别是在与BACKSET同时用时,找最近的信号很方便。分析家目前好象还没有添加这个功能的基本函数,有时会觉得不便--不过可以用DLL实现。

六、

函数: BETWEEN(A,B,C)

参数: 无

返回: 返回数组

说明: 表示A处于B和C之间时返回1,否则返回0

示例: BETWEEN(CLOSE,MA(CLOSE,10),MA(CLOSE,5))表示收盘价介于5日均线和10日均线之间

函数: RANGE(A,B,C)

参数: 无

返回: 返回数组

说明: 表示A大于B同时小于C时返回1,否则返回0

示例: RANGE(CLOSE,MA(CLOSE,5),MA(CLOSE,10))表示收盘价大于5日均线并且小于10日均线

BETWEEN,在...之间。RANGE,范围、排列。

BETWEEN返回1,相当于满足条件:(A>B AND A<C) OR (A<B AND A>C)。

RANGE返回1,相当于满足条件: A>B AND A<C。

七、

函数: EXIST(X,N)

参数: N可为常数或变量

返回: 返回数组

说明: 返回N周期内是否存在满足条件X

示例: EXIST(C>O,10)表示10个周期中存在阳线

EXIST,存在。

表示判断当前周期和前N-1个周期,共N个周期中,是否存在数组X绝对值大于等于1的信号。

八、

函数: EVERY (X,N)

参数: N可为常数或变量

返回: 返回数组

说明: 返回N周期内一直满足条件X

示例: EVERY (C>O,10)表示10个周期内一直是阳线

就是EVERYDAY的EVERY了。表示信号的连续性。

EVERY(C<REF(C,1),4);{表示收盘价连跌四天,才有信号出现}

九、

函数: LAST(X,A,B)

参数:  

返回: 返回数组

说明: 返回第前A周期到第前B周期是否一直满足条件X,若A为0,表示从第一天开始,B为0,表示到最后日止

示例: LAST(C>O,10,5)表示从第前10个周期到第前5个周期内一直是阳线

LAST,最后的,最近的。这个函数使满足连续条件的信号滞后(往后移)了。

A:=MA(C,5)>MA(C,10);

LAST(A,4,2);

十、

函数: LONGCROSS(A,B,N)

参数:  

返回: 返回数组

说明: 表示A在N周期内都小于B,本周期从下方向上穿过B时返回1,否则返回0

示例: LONGCROSS(MA(CLOSE,5),MA(CLOSE,10),5)表示5日均线维持5周期后与10日均线交金叉

LONGCROSS,长交叉。就是在交叉之前,还要加上条件。如图,两者的输出是一样的。

A:=CROSS(MA(CLOSE,5),MA(CLOSE,10));

B:=LAST(MA(C,5)<MA(C,10),5,1);

条件金叉:A AND B;

长金叉:0.5*LONGCROSS(MA(CLOSE,5),MA(CLOSE,10),5);

  评论这张
 
阅读(1188)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018