飞狐公式编写教程——选股公式 如何编写选股公式
分类:股票
一、选股公式:
显然选股公式,就是用于选出符合条件的股票,由若干中间语句组成,并且其中不含绘图函数。只有一行输出语句,位于最后一条语句,且必须是条件表达式。
例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(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,100N2:12,2,100N3: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);
飞狐基本函数简介之算术函数
这组函数用于算术运算,相对简单,例子就不多举了。
一、
函数: MAX(A,B)
参数: A、B为数组或常数
返回: A、B都为常数则返回常数,否则返回数组
说明: 返回A和B中的较大值
示例: MAX(CLOSE-OPEN,0)
表示若收盘价大于开盘价返回它们的差值,否则返回0
MAX.,MAXIMUM,最大值。
相当于IF(A>B,A,B);
二、
函数: MIN(A,B)
参数: A、B为数组或常数
返回: A、B都为常数则返回常数,否则返回数组
说明: 返回A和B中的较小值
示例: MIN(CLOSE,OPEN)
返回开盘价和收盘价中的较小值
MIN.,MINIMUM,MINISTER,小的,迷你的。
相当于IF(A>B,B,A);
三、
函数: ABS(X)
参数: X为数组或常数
返回: X为常数则返回常数,否则返回数组
说明: 返回X的绝对值
示例: ABS(CLOSE-OPEN)
返回开盘价和收盘价的价差
ABSOLUTE VALUE,绝对值。
相当于IF(A>B,A-B,B-A);
四、
函数: SGN(X)
参数: X为数组或常数
返回: X为常数则返回常数,否则返回数组
说明: 当X>0,X=0,X<0分别返回1,0,-1
示例: ABS(-34) 返回34
SIGN,符号,标记。
相当于
A1:=IF(X>0,1,0);
A2:=IF(X=0,0,0);
A3:=IF(X<0,-1,0);
A:=A1+A2+A3;
写成IF嵌套,就是IF(X>0,1,IF(X<0,-1,0));
五、
函数: REVERSE(X)
参数: X为数组或常数
返回: X为常数则返回常数,否则返回数组
说明: 返回的X相反数-X
示例: REVERSE(CLOSE)
返回-CLOSE
REVERSE,相反(数)。
相当于-X;
六、
函数: MOD(A,B)
参数: A、B为数组或常数
返回: A、B都为常数则返回常数,否则返回数组
说明: 返回A对B求模
示例: MOD(26,10)返回6
MODULUS,模数。
相当于整数A除以整数B后所得的余数。支持负数。
七、
函数: CEILING(A)
参数: A、B为数组或常数
返回: A、B都为常数则返回常数,否则返回数组
说明: 向上舍入,向数值增大方向舍入
示例: CEILING(12.3)求得13,CEILING(-3.5)求得-3
CEILING,最高限度。
八、
函数: FLOOR(A)
参数: A、B为数组或常数
返回: A、B都为常数则返回常数,否则返回数组
说明: 向下舍入,向数值减小方向舍入
示例: FLOOR(12.3)求得12,FLOOR(-3.5)求得-4 向下舍入
FLOOR,地板,基底。也可理解为最低限度。
九、
函数: INTPART(A)
参数: A为数组或常数
返回: A为常数则返回常数,否则返回数组
说明: 取得数据的整数部分,返回沿A绝对值减小方向最接近的整数
示例: INTPART(12.3)求得12,INTPART(-3.5)求得-3
INTEGER,整数。PART,部分。INTPART就是整数部分了。
不管是正数还是负数,INTPART之后,留下的就只有整数部分。
我们很奇怪地发现,有向上舍入、向下舍入和取整的基本函数,但没有发现四舍五入的基本函数。可能是因为四舍五入是人为的一种粗略习惯,进不了精确算术的殿堂。那么用基本函数可以解决四舍五入么?
以小数点后第二位的数,四舍五入到小数点后第一位的数为例:
A:=C*100;
B:=MOD(A,10);
D:=IF(B>=5,1,0);
E:=INTPART(C*10)+D;
四舍五入:E/10;
收盘价:C;
飞狐基本函数简介之数学函数
飞狐的数学函数,主要支持三角函数、对数、和幂的运算。
先回忆一下。如图,
sin(X)=a/c,cos(X)=b/c,tg(X)=a/b,ctg(X)=b/a。这里没有提供ctg(X)函数,是因为正切和余切互为倒数关系。
实际上正弦值的平方加上余弦值的平方等于1,有正弦函数之后,余弦函数也可以求出来了。
图中的角度X,一般有两种表达方式,一种是一个圆周为360度,还有一种是一个圆周为2π弧度。
这里的三角函数中的数组或常数X,取的都是弧度。
一、
函数: SIN(X)
参数: X为数组或常数
返回: 数组或常数
说明: 返回X的正弦值
函数: COS(X)
参数: X为数组或常数
返回: 数组或常数
说明: 返回X的余弦值
正弦波是自然界最常见的波形。正弦波和余弦波的波形是一样的,无非是相差π/2弧度(90度)的相位。
主要应用在技术分析中的周期分析上。
那么在指标中画出正弦波应该是很容易了吧。
A:=COUNT(C,0)=1;
B:=BARSLAST(A);{1,2,3,4,.....}
正弦值:SIN(B);
余弦值:COS(B);
正余平方和:POW(正弦值,2)+POW(余弦值,2);
正弦180度:SIN(3.1415926);
但是看起来不太光滑:(
究其原因,是因为正弦波的周期是2π,当X取值较大时(1,2,3,...)时,返回值就不太“精密”了,也就是说构成波形的点数不够。
这个就好办了,我们可以把数列的值都减小N倍,再来看看效果。
A:=COUNT(C,0)=1;
B:=BARSLAST(A)/N;
正弦值:SIN(B);
余弦值:COS(B);{参数N:10.1.999}
调整参数N,就可以发现,N取值越大,波形就越光滑。当N取3时,就有不错的光滑度。当N取10时,就非常光滑了。
N调整得越大,在2π周期中的点数就越多,一个完整波形的周期内所含的日期差(在日K线中)就越大了。
二、
函数: TAN(X)
参数: X为数组或常数
返回: 数组或常数
说明: 返回X的正切值
TANGENT,正切。
正切值的绝对值,最小是0,最大趋向于无穷大。
当正弦值接近1时,正切值接近于无穷大。
A:=COUNT(C,0)=1;
B:=BARSLAST(A)/N;
正弦值:SIN(B);
余弦值:COS(B);{参数N:10.1.999}
TAN(B);
三、
函数: ASIN(X)
参数: X为数组或常数
返回: 数组或常数
说明: 返回X的反正弦值
函数: ACOS(X)
参数: X为数组或常数
返回: 数组或常数
说明: 返回X的反余弦值
函数: ATAN(X)
参数: X为数组或常数
返回: 数组或常数
说明: 返回X的反正切值
Y=SIN(X),是已经知道X的弧度值求正弦值。反正弦值是已经知道正弦值,去求弧度是多少。其它类推。
ASIN(1);
返回1.57080弧度,相当于是π/2。
四、
函数: LOG(X)
参数: X为数组或常数
返回: 数组或常数
说明: 取得X的10为底对数
示例: LOG(100) 等于2
Y是10的N次方值,那么LOG(Y)=N。
五、
函数: LN(X)
参数: X为数组或常数
返回: 数组或常数
说明: 以e为底的对数
示例: LN(CLOSE) 求收盘价的对数
函数: EXP(X)
返回: X为数组或常数
参数: 数组或常数
说明: 为e的X次幂
示例: EXP(CLOSE) 返回e的CLOSE次幂
LN(X)是取自然对数。自然数e=2.718281828...
呵呵,连自然数都到股市中来了。
EXP(X)在正态分布中要用到,可。。。晕,不说了。
六、
函数: POW(A,B)
参数: A、B为数组或常数
返回: 数组或常数
说明: 返回A的B次幂
示例: POW(CLOSE,3)
求得收盘价的3次方
函数: SQRT(X)
参数: X为数组或常数
返回: 数组或常数
说明: 为X的平方根
示例: SQRT(CLOSE) 收盘价的平方根
POWER,幂。SQUARE ROOT,平方根。
POWER(A,B)中的B支持小数,即可用0.5,那么POW(A,0.5)=SQRT(A)了。
POW(C,0.5);
SQRT(C);
这两根线是一样的。
飞狐基本函数简介之统计函数
这组函数,是统计学中的最典型的几个指标,在基本函数中提供了算法。有几个是可以相互转换的,看似众多,实际上没有几个。
“统计学理论划分成描述统计学和推导统计学两部分。描述统计学指用图表达资料数据,比如用一张标准的线图展示价格历史。推导统计学则指从资料推导出概括的、预测的或推延性的结论。所以价格图表属于前者的范畴,而针对价格图表进行的技术分析则属于推导统计学的范畴。
综合起来,技术分析以过去的价格数据预测未来,有充分的统计学根据。”<期货市场技术分析>P16
实际上,我们常用的技术指标,都自觉或不自觉地利用了统计学中的相关原理。比如均线指标MA(C,N),是N个周期中收盘价的算术平均值,就利用了统计学中集中趋势度量法的原理。
先回忆一下统计学中几个指标的算法。
统计对象可以看成是一个数列,数列中数据的总个数为N,以今天(2002.11.22)五天内的600036招商银行收盘价为例,N就为5。数列的内容为:{9.17,9.24,9.11,8.85,8.87}。
1、算术平均值:数据总和除以总个数N。
(9.17+9.24+9.11+8.85+8.87)/5=9.048。
可以用公式MA(C,5),从今天的值上看出。
2、偏差:每个数据,减去算术平均值的结果。
9.17-9.048=0.122,
9.24-9.048=0.192,
9.11-9.048=0.062,
8.85-9.048=-0.198,
8.87-9.048=-0.178,
各偏差相加,应该是等于0的。
3、平均绝对偏差:将偏差的绝对值相加,除以总个数N。
(0.122+0.192+0.062+0.198+0.178)/5=0.150
4、(总体样本)方差:将偏差的平方相加,总和除以总个数N。用公式可以这样算:
(POW(0.122,2)+POW(0.192,2)+POW(0.062,2)+POW(0.198,2)+POW(0.178,2))/5=0.025
方差的算法,经过化简,也可以这样算:每个数据的平方的平均数,减去平均数的平方。
在公式里就可以这样编了:
MA(POW(C,2),5)-POW(MA(C,5),2);{0.025}
5、估算样本方差:是总体方差的N/(N-1)倍。
0.025*5/(5-1)=0.031
估算样本方差,总比总体样本方差大一点,当N够大时,两者趋于相等。
6、(总体)标准差:方差的开方。
POW(0.025,0.5);{0.158}
7、估算标准差:估算样本方差的开方。
POW(0.031,0.5);{0.176}
同样,估算标准差也比总体标准差大一点,当N够大时,两者趋于相等。
8、最小二乘法求回归直线方程:放在后面讲。
以下的例子,也以在今天(2002.11.22)五天内的600036招商银行收盘价为例。
一、
函数: AVEDEV(X,N)
参数: X为数组,N为统计周期
返回: 返回数组
说明: 平均绝对偏差
AVEDEV(C,5);{0.150}
二、
函数: DEVSQ(X,N)
参数: X为数组,N为统计周期
返回: 返回数组
说明: 数据偏差平方和DEVSQ
数据偏差平方和,除以N,即为方差。
DEVSQ(C,5)/5;{0.025}
DEVSQ(C,5);{0.126}
三、
函数: VARP(X,N)
参数: X为数组,N为统计周期
返回: 返回数组
说明: X的N日总体样本方差
总体样本方差用数据偏差平方和,已经求出了,看看一样吗?
DEVSQ(C,5)/5;{0.025}
VARP(C,5);{0.025}
四、
函数: VAR(X,N)
参数: X为数组,N为统计周期
返回: 返回数组
说明: X的N日估算样本方差
估算样本方差是总体方差的N/(N-1)倍,看看一样吗?
VARP(C,5)*(5/(5-1));{0.032}
VAR(C,5);{0.032}
五、
函数: STDP(X,N)
参数: X为数组,N为统计周期
返回: 返回数组
说明: X的N日总体标准差
总体标准差,即为总体样本方差的开方,看看一样吗?
POW(VARP(C,5),0.5);{0.159}
STDP(C,5);{0.159}
六、
函数: STD(X,N)
参数: X为数组,N为统计周期
返回: 返回数组
说明: X的N日估算标准差
估算标准差,即为估算样本方差的开方,看看一样吗?
POW(VAR(C,5),0.5);{0.178}
STD(C,5);{0.178}
好了,以上六个统计函数,除了第一个,其它五个,只要求出方差,就可以找到相应关系,全部求出来。而方差,可以用公式MA(POW(C,2),5)-POW(MA(C,5),2);求出,所以说,新东西只有一个:平均绝对偏差。
以上六个函数中的N,目前均不支持序列变量,但可以用参数来调整。
下面介绍线性回归的概念,仍以前例为例。
如图,坐标中的各点不存在明确的关系,它们不在同一直线上,也不在同一曲线上。但仔细观察可以看到,它们还是存在着一定的相关关系,图a中的点分布在一根直线附近,图b中的点分布在一根曲线(抛物线)附近。
在图a中,如果能够画出一根直线,使各点到直线的垂直距离总和达到最小,那么这根直线无疑是很有参考价值的,用股市中的行话说,就是这根直线代表了点以后的发展趋势。这种分析方法,就是统计学中的回归分析法。
图a中的X轴,相当于K线图中的时间轴,Y轴相当于价格轴,一个点相当于是由两个变量决定位置。
两个变量之间的回归分析称为简单回归或一元回归,三个以上变量之间的回归分析称为复回归或多元回归。如果变量间相关关系表现为线性相关的回归称为线性回归,表现为曲线相关的回归称为非线性回归。所谓一元线性回归,则是指两个变量之间表现为线性相关关系的回归。
一元线性回归的方法,就是在众多的点中,找到一根直线,而这根直线,最能代表众多点的平均“趋势”。
直线的表达方程是:y=a+bx。只要两个参数a、b定下来,直线的位置就定了。
求参数a、b的方法一般有两种,一种较为简便,但精度不够,称为平均数法。还有一种精度较高,应用也最多,叫最小二乘法。可想而知,飞狐中的线性回归预测值,是根据最小二乘法求出来的。这里就只介绍最小二乘法。
设在众多点中穿过的回归直线的方程是y'=a+bx。而每个点的垂直高度为y。那么对应于每个点,都可得到类似于偏差的值y-y'。这些值的平方的总和达到最小,而求出参数a、b,就是最小二乘法的基本原理。
y-y'=y-a-bx。每个点,都有对应的x、y值,那么将这些值,分别代入(y-a-bx),求平方,最后进行累计。最终的表达式Q中,就只有a和b两个变量了。为使Q具有最小值,必须使其对a,b的偏导数等于0。由这两个等式中,就可以求出a、b的值了。
同例,x:{0,1,2,3,4}, y:{9.17,9.24,9.11,8.85,8.87}
xy:{0,9.24,18.22,26.55,35.48}
x的平均值是:(0+1+2+3+4)/5=2,x的平均值的平方是:4,y的平均值是:9.048
x平方{0,1,4,9,16},x平方总和是:30
b=(89.49-5*2*9.048)/(30-5*4)=-0.99/10=-0.099
a=9.048-(-0.099*2)=9.246
y=9.246-0.099*x。这就是我们求出的回归直线方程。
在前四天,y值为9.246,在今天,y=9.246-0.099*4=8.85。
有了这两个值,就可以在主图上画线了:
A:=BACKSET(ISLASTBAR,5);
B:=A>REF(A,1);
DRAWICON(A,C,10);
DRAWLINE(B,9.246,ISLASTBAR,8.85,0);
{主图、主图叠加}
各位看到,计算过程比较麻烦,一般只要了解回归线的意义即可。具体计算,也有以下两个基本函数帮忙。
七、
函数: FORCAST(X,N)
参数: X为数组,N为统计周期
返回: 返回数组
说明: X的N周期线性回归预测值
示例: FORCAST(CLOSE,10) 表示求10周期线性回归预测
用最小二乘法,求出N周期内,X的一元线性回归线上的当天的值。与以上介绍的a值不同,a值是(N-1)周期前的回归线上的值。N取值为1时没有意义。
FORCAST(C,5);{8.85}
八、
函数: SLOPE(X,N)
参数: X为数组,N为统计周期
返回: 返回数组
说明: 为X的N周期线性回归线的斜率
示例: SLOPE(CLOSE,10) 表示求10周期线性回归线的斜率
用最小二乘法,求出N周期内,X的一元线性回归线的斜率,相当于以上介绍的b值。在K线图上是(价差/时间差)的关系,与角度没有任何关系。N取值为1时没有意义。
SLOPE(C,5);{-0.099}
那么有了这两个函数,要画出回归线还是不容易。今天的回归线的值和斜率知道了,可(N-1)天之前的回归线上的值(相当于前面说的a值)还是不知道,因为指标均为序列变量,无法倒推。
一般来说,有两种方法,一种是全用基本函数,用起来有点麻烦,要调整参数。还有一种是借用VBS来倒推数据。
留作思考题吧。
九、
函数: CORR(X1,X2,N)
参数: X为数组,N为统计周期
返回: 返回数组
说明: 求2个序列间的相关系数。
示例: CORR(CLOSE,HIGH,10)表示求10周期VAR1与VAR2的相关系数
转贴《教育统计学》中,对相关系数的描述:
相关系数
在教育研究中,常涉及到两个事物(变量)的相互关系问题,例如,学习成绩与非智力因素的关系,数学成绩与物理成绩的关系,男女生学习成绩的关系,等等。其关系表现为以下三种变化;第一,正相关:一个变量增加或减少时,另一个变量也相应增加或减少;第二,负相关:一个变量增加或减少时,另一个变量却减少或增加;第三,无相关:说明两个变量是独立的,即由一个变量值,无法预测另一个变量值。统计学中,就用“相关系数"来从数量上描述两个变量之间的相关程度,用符号“r"来表示。
相关系数取值范围限于:-1≤r≤+1
PHP代码:--------------------------------------------------------------------------------
相关系数表示的意义
相关系数(r) 0.00 0.00-±0.3 ±0.30-±0.50
相关程度 无相关微正负相关 实正负相关
相关系数(r) ±0.50-±0.80 ±0.80-±1.00
相关程度 显著正负相关 高度正负相关
--------------------------------------------------------------------------------
相关系数函数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换成其它作为样本的个股,找出同类走势的个股。
代码中,有一行:
fc:c*bl/bl;
大家可能会有疑问,“bl/bl”不是等于1吗?乘以1那不是多此一举?
不妨在代码中删除“*bl/bl”,再试试效果。
您理解了吗?这是一个小技巧:)
十、
函数: CORRTPL(TPLNAME,X,D,N)
参数: X为数组,N为统计周期
返回: 返回数组
说明: CORRTPL(TPLNAME,X,D,N),求与模板相关系数。
D为常数,表示0:开盘价,1:最高价,2:最低价,3:收盘价,4:成交量,5:成交额
N表示计算最后多少组,为0表示计算所有,用于当前选股时设为1可大大减小计算量
示例: CORRTPL('一马平川',CLOSE,3,1)表示求收盘价线与一马平川收盘价线的最后一组的相关系数
飞狐基本函数简介之指标函数
所谓指标函数,就是头疼函数。一些指标的算法极为繁琐,做成基本函数,用起来就方便了。
我自己也是摸着石头过河。
一、
函数: ZIG(K,N)
参数: N为常数,参数K可为序列或常数,K取0--3,表示0:开盘价,1:最高价,2:最低价,3:收盘价;也可为ma(close,5)等。
返回: 返回数组
说明: 当价格变化量超过N%时转向
示例: ZIG(3,5) 表示收盘价的5%的ZIG转向
ZIG(MA(C,20),5)表示均线的5%的ZIG转向
ZIG,之字形。
1、K可以作为参数调整,也可以直接写其它的指标线,如"kd.k"。N也可以做成参数调整。
2、在K线中,ZIG只能对一根指标线进行转向处理。要想高点在H位置,低点在L位置,ZIG是做不到的。
3、ZIG到底是如何体现“未来”的?即它是怎么画出来的?见最后的说明。
4、ZIG输出的是数值,不是直线。
5、ZIG一般使用在看波浪、看形态上。
ZIG函数是未来函数之第二大嫌疑。在交易系统中用未来函数,就是用BACKSET或ZIG,可以使许多人“梦想成真”。
由于“未来函数”在交易系统中可以大大作弊,才使其在指标和选股公式中也一起“臭名昭著”。
二、
函数: PEAK(K,N,M)
参数: N为常数,参数K可为序列或常数,K取0--3,表示0:开盘价,1:最高价,2:最低价,3:收盘价;也可为ma(close,5)等,M为大于等于1的整数
返回: 返回数组
说明: 表示之字转向ZIG(K,N)的前M个波峰的数值
示例: PEAK(1,5,1) 表示%5最高价ZIG转向的上一个波峰的数值
PEAK(MA(C,20),5,1) 表示均线的5%的ZIG转向的上一个波峰的数值
PEAK,高峰。
这个函数可以取到ZIG波峰的数值。如果K取1,波峰取的是H。如果K取3,波峰是C的波峰,可不是H。
三、
函数: PEAKBARS(K,N,M)
参数: N为常数,参数K可为序列或常数,K取0--3,表示0:开盘价,1:最高价,2:最低价,3:收盘价;也可为ma(close,5)等,M为大于等于1的整数
返回: 返回数组
说明: 表示之字转向ZIG(K,N)的前M个波峰到当前的周期数
示例: PEAKBARS(1,5,1)
表示%5开盘价ZIG转向的上一个波峰到当前的周期数
PEAKBARS(MA(C,20),5,1)表示均线的5%的ZIG转向的上一个波峰到当前的周期数
这个函数用来定波峰的位置的。有了位置,画两根线试试。
ZIG(1,N);
A1:=BACKSET(ISLASTBAR,PEAKBARS(1,N,1)+1);
A2:=A1>REF(A1,1);
B1:=BACKSET(ISLASTBAR,PEAKBARS(1,N,2)+1);
B2:=B1>REF(B1,1);
C1:=BACKSET(ISLASTBAR,PEAKBARS(1,N,3)+1);
C2:=C1>REF(C1,1);
DRAWLINE(B2,H,A2,H,1);
DRAWLINE(C2,H,B2,H,1);{N:3.1.99,主图叠加}
四、
函数: TROUGH(K,N,M)
参数: N为常数,参数K可为序列或常数,K取0--3,表示0:开盘价,1:最高价,2:最低价,3:收盘价;也可为ma(close,5)等,M为大于等于1的整数
返回: 返回数组
说明: 表示之字转向ZIG(K,N)的前M个波谷的数值
示例: TROUGH(2,5,2) 表示%5最低价ZIG转向的前2个波谷的数值
TROUGH(MA(C,20),5,2) 表示均线的5%的ZIG转向的前2个波谷的数值
TROUGH,水槽,波谷。
与PEAK对应。
五、
函数: TROUGHBARS(K,N,M)
参数: N为常数,参数K可为序列或常数,K取0--3,表示0:开盘价,1:最高价,2:最低价,3:收盘价;也可为ma(close,5)等,M为大于等于1的整数
返回: 返回数组
说明: 表示之字转向ZIG(K,N)的前M个波谷到当前的周期数
示例: TROUGHBARS(2,5,2) 表示%5最低价ZIG转向的前2个波谷到当前的周期数
TROUGHBARS(MA(C,20),5,2) 表示均线的5%的ZIG转向的前2个波谷到当前的周期数
对应于PEAKBARS。
这样在应用时,ZIG的各点的数值是知道的,波峰和波谷的数值和位置也可以引用到了。
“综合运用”:
ZIG(3,N),CROSSDOT;{主图叠加}
ZIG(3,N),CIRCLEDOT,COLORMAGENTA;
A:=PEAKBARS(3,N,1);
B:=TROUGHBARS(3,N,1);
B>A,COLORGREEN;
A>B,COLORRED;{五彩K线}
六、
函数: SAR(N,S,M)
参数: N为计算周期,S为步长,M为极值
返回: 返回数组
说明: 计算抛物转向点
示例: SAR(10,2,20)
表示计算10日抛物转向,步长为2%,极限值为20%
STOP AND REVERSE,转向点指标,停顿指标,又称抛物线指标,全称为抛物线转向指标。
SAR指标,也是王尔德(RSI的发明人)发明的,主要用于与趋向指标DMI(DIRECTION MOVEMENT INDEX)结合使用。
SAR一般以圆圈的形式输出,实际上也是输出数值的,形式可以用描述函数进行改变。
说是抛物转向,输出的并不是标准的抛物线。
目前的转向指标,典型的有三个,ZIG、SAR(因为做成基本函数了,所以有数值输出),还有一个是结构波浪,可以用基本函数做出,但只能输出直线,不能输出完整的数值。
SAR的画法,在众多的股票软件中,是一种百花齐放的局面。由于飞狐提供了开放可定制的公式平台,所以,只要有明确思路的SAR画法,都可以在飞狐实现。飞狐中基本函数SAR的具体画法在最后介绍。
SAR的画法,矛盾集中在数个方面,所以没有一种方法能够一统江山。
1、起算点,是从看涨开始还是从看跌开始?怎么判断画前的看涨和看跌?
2、转向条件满足时,是迟一个周期跳转还是迟两个周期跳转?
3、跳转后的第二个周期,以0步长计算,还是以STEP步长计算?
4、当N取1时,应不应该有输出?等等
飞狐的主要问题是在起算点就满足跳转条件时,会延迟一个周期跳转,而后面的就不延迟跳转了。分析家的问题是起算点有时是找不准前期极值的。这些都不是大问题,因为后面的计算是趋向于统一的,起算点附近的SAR问题,一般无人问津。
七、
函数: SARTURN(N,S,M)
参数: N为计算周期,S为步长,M为极值
返回: 返回数组
说明: 若发生向上转向则返回1,若发生向下转向则返回-1,否则为0
由于可以返回三个值,就可以判断是向上的跳转还是向下的跳转。
SA:=SAR(3,2,20);
A:=SARTURN(3,2,20);
B:=A=1;
D:=A=-1;
E:=BARSLAST(B)>BARSLAST(D);
F:=NOT(E);
DRAWICON(E,SA,10);
DRAWICON(F,SA,11);{主图叠加}
如果想颜色更鲜艳一些,可调用BMP文件,把最后两句改为:
DRAWICON(E,SA,'S31');
DRAWICON(F,SA,'S28');
八、
函数: COST(N)
参数: N为常数,表示百分比
返回: 返回数组
说明: 计算成本分布情况,该函数仅对日线分析周期有效
示例: COST(10)
表示10%获利盘的价格是多少,即有10%的持仓量在该价格以下,其余90%在该价格以上,为套牢盘
函数: WINNER(A)
参数: A为数组或常数
返回: 返回数组
说明: 计算获利盘比例,该函数仅对日线分析周期有效
示例: WINNER(CLOSE)
表示以当前收市价卖出的获利盘比例,例如返回0.1表示10%获利盘
WINNER(10.5)
表示10.5元价格的获利盘比例
COST,成本。WINNER,优胜者,获利。
两者互相换算。COST是根据获利盘估算价格,WINNER是根据价格估算获利盘。
之所以说估算,是因为要精确算,必须把每笔成交的价格和成交量都记录下来,一般这是很难做到的。
就算能做到,筹码分布方面的技术分析有效么?这就看各人自己的取舍了,股市中目前还没有发现包赚不赔的技术指标。
COST(WINNER(C)*100);
C;
此两者趋于相等。也说明这两个函数支持序列变量。
平均成本价的计算。将刚好完全换手的每笔成交量和成交价格相乘,然后除以这期间总的成交量,即为平均成本价。
平均成本价格:COST(50);
AA:=SUMBARS(VOL,CAPITAL);
平均成本价:SUM(C*V,AA)/SUM(V,AA);
实际上这两种方法都是估算出来的,后者的误差可能更大一些。
相当于一箱苹果是2元一斤,另两箱苹果是5元一斤。三箱苹果的平均价格就是(2*1+5*2)/(1+2)=4元。
这有点统计学中的调和平均值的味道了。筹码分布,要搞得复杂,可以计算中位值、众位值,研究正态分布、偏态分布,还有集中度、穿透力,当真是花样繁多,只能留给有兴趣的朋友自己研究了。
筹码分布的峰位在哪个价格区域,是筹码分布爱好者很想知道的一个指标。用COST可以估算出来,留作思考题吧。
九、
函数: PPART(N)
参数: N为常数
返回: 返回数组
说明: 远期成本比例,表示N周期前的成本占总成本的比例,如返回0.3表示30%
示例: PPART(20); 20天前的成本占总成本的比例
远期成本比例,只要把近N天之成本比例算出来,远期的自然就出来的。因为总成本为百分之百的换手率。
远期成本比例:PPART(N)*100;
A:=100*V/CAPITAL;
远期成本:100-SUM(A,N);{参数N:10.1.999}
两者基本相等。
十、
函数: PWINNER(N,X)
参数: N为常数,X为数组或常数
返回: 返回数组
说明: 远期获利盘比例
示例: PWINNER(20,CLOSE);表示20天前的那部分成本以当前收市价卖出的获利盘比例,例如返回0.2表示20%获利盘
以上几个筹码指标,在飞狐中,目前已经支持多周期分析,即在分笔、五分钟、周等周期上都有输出。
附一、ZIG线的画法。
假设在手工画线年代,ZIG线是怎么画出来的,实际上也介绍了算法。
以zig(3,5),即收盘价转向,转向要求5%,在600036招商银行上为例。
从第一根K线上的收盘价,慢慢往后看。直到当天的C,和以前的K线的最低C值相比的涨幅,或与最高C值相比的跌幅超过5%时,才在当天作出记号,称之为拐点。涨幅超过5%的,称为向上的拐点,跌幅超过5%的,称为向下的拐点。
例中,先有向下的拐点,于是第一根K线上的C值,就是高点了。在向下的拐点出现之后的每根K线上,相比较记录最低之C值。然后把当天的C值,与记录的最低C值比较,看有没有涨幅超过5%。例中,到6月24日,才产生满足条件之向上的拐点。向上的拐点出现之后,回过头,在与上一个向下的拐点之间,找到一个最低的C,作为ZIG的低点。
产生向上拐点之后,就在之后的K线中记录C的最大值。当出现当天的C值,与最大C值相比,跌幅超过5%时,记为向下的拐点。例中,到7月12日,产生向下的拐点。于是从向下的拐点回过头来,在与上一个向上的拐点之间,找到一个最高的C,作为ZIG的高点。如此循环。也就是说,ZIG的高点和低点,是根据向上和向下的拐点出来之后,回溯过去才找到的。这就是ZIG未来数据的实质所在。
在最近期间,ZIG的未来数据,要追溯到最近的一个拐点之前的一个峰点。且看最近期间的ZIG线是怎么画出的。
从最后一根K线往前,如果先出现向下的拐点,则在此拐点到目前的K线中求出最小收盘价所在的K线,为低点。这个低点可能与目前的K线重合。重合的话目前的K线为低点,不重合的话目前K线为高点。
如果先出现向上的拐点,则在此拐点到目前的K线中求出最高收盘价所在的K线,为高点。此高点与目前的K线重合,则目前的K线为高点,否则为低点。
附二、SAR的画法。
SAR(N,S,M),参数:N为计算天数,STEP=调整系数×100,MAXP=调整系数上限×100。
以sar(5,2,20),circledot;用在日线中为例。
SAR只跟K线中的H、L有关,与O、C无关。
一、起画点
当N取5时,起画点就在第六根K线上。第一步要做的事,就是由第一根K线到第五根K线判断是看涨还是看跌。如是看涨,就要把起画点画成看涨SAR,如是看跌,就要把起画点画成看跌SAR。
A:(H-REF(H,1)+L-REF(L,1))>0 AND BARSCOUNT(C)=2;
如果A成立,则先画看跌SAR(SAR在K线之上);如果A不成立,则先画看涨SAR(SAR在K线之下)。这是我的观察所得,各位不妨去看看是不是如此。就是说不管N取多少,起画点是根据第一、二根K线上的H、L决定的。
二、看涨SAR
第一个看涨SAR的值,是前五天的最低价,即REF(LLV(L,5),1);然后看看SAR值是不是比L小,是的话继续,否则在下一天跳转。
第二个看涨SAR的值,是
SAR(2)=SAR(1)+AF1*(REF(HHV(H,5),1)-SAR(1)),
SAR(1)即为第一个看涨SAR的值。AF1是调整系数,如果当天的H比前五天的最高H大,则要+0.02(得0.04),否则还是取0.02。然后看看SAR值是不是比L小,是的话继续,否则在下一天跳转。
第三个看涨SAR的值,是
SAR(3)=SAR(2)+AF2*(REF(HHV(H,5),1)-SAR(2)),
计算方法与求第二个看涨SAR类同,只是当天的H是否比前五天的最高H大还要判断,是的话AF2=AF1+0.02,否则取AF1。
然后看看SAR值是不是比L小,是的话继续,否则在下一天跳转。
因为没有跳转的话,REF(HHV(H,5),1)-SAR(2)的值肯定大于0,所以看涨SAR一直是向上升的。
如此循环往复,直到跳转条件成立就跳转,去画看跌SAR了。而调整系数AF的值,经过反复累积的话,最大是不能超过0.2的。
三、看跌SAR
第一个看跌SAR的值,是前五天的最高价,即REF(HHV(H,5),1);然后看看SAR值是不是比H大,是的话继续,否则要在下一天跳转。
第二个看跌SAR的值,是
SAR(2)=SAR(1)+AF1*(REF(LLV(L,5),1)-SAR(1)),
SAR(1)即为第一个看跌SAR的值。AF1是调整系数,如果当天的L比前五天的最低L小,则要+0.02(得0.04),否则还是取0.02。然后看看SAR值是不是比H大,是的话继续,否则在下一天跳转。
第三个看跌SAR的值,是
SAR(3)=SAR(2)+AF2*(REF(LLV(L,5),1)-SAR(2)),
计算方法与求第二个看跌SAR类同,只是当天的L是否比前五天的最低L小还要判断,是的话AF2=AF1+0.02,否则取AF1。
然后看看SAR值是不是比H大,是的话继续,否则在下一天跳转。
因为没有跳转的话,REF(LLV(L,5),1)-SAR(2)的值肯定小于0,所以看跌SAR一直是向下跌的。
如此循环往复,直到跳转条件成立就跳转,去画看涨SAR了。而调整系数AF的值,经过反复累积的话,最大是不能超过0.2的。
SAR没有未来之嫌,但是N、S、M的调整对SAR影响都很大,感觉灵敏性过大。
飞狐基本函数简介之大盘函数和常数函数
大盘函数,就是公式应用于个股中时,可以引用相应大盘的相应数据。
常数函数用于取得一些常数数据。
一、
函数: INDEXO
参数: 无
返回: 数组
说明: 表示对应大盘同期的开盘价。(该函数对分笔成交分析周期无效)
函数: INDEXH
参数: 无
返回: 数组
说明: 表示对应大盘同期的最高价。(该函数对分笔成交分析周期无效)
函数: INDEXL
参数: 无
返回: 数组
说明: 表示对应大盘同期的最低价。(该函数对分笔成交分析周期无效)
函数: INDEXC
参数: 无
返回: 数组
说明: 表示对应大盘同期的收盘价。(该函数对分笔成交分析周期无效)
函数: INDEXV
参数: 无
返回: 数组
说明: 表示对应大盘同期的成交量。(该函数对分笔成交分析周期无效)
函数: INDEXA
参数: 无
返回: 数组
说明: 表示对应大盘同期的成交额。(该函数对分笔成交分析周期无效)
当主图显示的是沪个股时,取INDEXC就是上证指数的收盘价,其它类推。
当主图显示的是深个股时,取INDEXC等就是深成指的收盘价,其它类推。
这对引用大盘相应数据是很方便的。
如果你想引用0号指数的相应数据,就要先建立0号指数(自定义指数),比如0号指数的代码是“ 宋体'>BI01”,引用时就用
"BI01$CLOSE";
"BI01$VOL";
等。
二、
函数: INDEXADV
参数: 无
返回: 数组
说明: 表示对应大盘同期的上涨家数。(该函数对分笔成交分析周期无效)
函数: INDEXDEC
参数: 无
返回: 数组
说明: 表示对应大盘同期的下跌家数。(该函数对分笔成交分析周期无效)
当主图显示的是沪个股时,取INDEXADV就是沪A股中的上涨家数。
当主图显示的是深个股时,取INDEXADV就是深A股中的上涨家数。
INDEXDEC的用法一样。
这与以前在行情函数中介绍的ADVANCE和DECLINE有点类似,不过ADVANCE、DECLINE只能用于大盘,在主图为个股时不会有输出。
三、
函数: CAPITAL
参数: 无
返回: 返回常数
说明: 返回流通盘大小,单位为手。对于A股得到流通A股,B股得到B股总股本,指数为0
前面已经用过很多次了。
流通盘万股:CAPITAL/100,LINETHICK0;
换手率:100*V/CAPITAL,LINETHICK0;
四、
函数: VOLUNIT
参数: 无
返回: 返回常数
说明: 返回每手股数,对于股票值为100,债券为1000
这样也可据此识别股票和债券了。
五、
函数: FINANCE(N)
返回: 返回常数
说明: 取得参数对应的基本财务数据 N 含义单位N 含义单位
1 总股本 万股 29 税后利润 千元
2 国家股 万股 30 净利润 千元
3 发起人法人股 万股 31 未分配利润 千元
4 法人股 万股 32 每股未分配 元
5 B股 万股 33 每股收益 元
6 H股 万股 34 每股净资 元
7 流通A股 万股 35 调整每股净资 元
8 职工股 万股 36 股东权益比率 %
9 A2转配股 万股 37 净资收益率 %
10 总资产 千元 38 经营现金流入 千元
11 流动资产 千元 39 经营现金流出 千元
12 固定资产 千元 40 经营现金流量 千元
13 无形资产 千元 41 投资现金流入 千元
14 长期投资 千元 42 投资现金流出 千元
15 流动负债 千元 43 投资现金流量 千元
16 长期负债 千元 44 筹资现金流入 千元
17 资本公积金 千元 45 筹资现金流出 千元
18 每股公积金 千元 46 筹资现金流量 千元
19 股东权益 千元 47 现金及等价物 千元
20 主营收入 千元 48 应收帐款周转率 %
21 主营利润 千元 49 存货周转率 %
22 其他利润 千元 50 总资产周转率 %
23 营业利润 千元 51 流动比率 %
24 投资收益 千元 52 速动比率 %
25 补贴收入 千元 53 主营业务增长率 %
26 营业外收支 千元 54 税后利润增长率 %
27 上年损益调整 千元 55 净资产增长率 %
28 利润总额 千元 56 总资产增长率 %
六、
函数: DYNAINFO(N)
返回: 返回常数
说明: 取得参数对应的动态行情数据
N 含义N 含义
3 前收 31 卖一量
4 今开 32 卖二量
5 最高 33 卖三量
6 最低 34 卖一价
7 最新 35 卖二价
8 总手 36 卖三价
9 现手 37 换手率
10 总额(持仓) 38 5日均量
11 均价 39 市盈率
12 涨跌 40 成交方向
13 振幅 41 总市值
14 涨幅 42 流通市值
15 委比 43 买四量
16 委差 44 买五量
17 量比 45 买四价
18 委买 46 买五价
19 委卖 47 卖四量
20 委买价 48 卖五量
21 委卖价 49 卖四价
22 内盘 50 卖五价
23 外盘 51 成交笔数
24 涨速 52 每笔均量
25 买一量
26 买二量
27 买三量
28 买一价
29 买二价
30 买三价
七、
函数: SPLITDATA(N)
返回: 返回常数
说明: 除权数据函数
示例: SPLITDATA(N) 取得对应除权数据
N参数表示取那种分红数据
N=0 有除权时为1,否则为0
N=1 红股,得到当时每十股送几股
N=2 配股,得到当时每十股配几股
N=3 配股价,得到当时配股价格
N=4 红利,得到当时每十股派息几元
这些常数函数,完全没有必要记忆,在公式编辑器中,点一下插入函数,马上可以查到相关的说明。
飞狐基本函数简介之扩展数据函数
一、横向统计函数
函数: ESTDATA(N)
参数: 1-13
用法: ESTDATA(N)
在[横向统计管理]中定义并计算数据。
(本函数仅在日线分析周期有效)。
说明:取得横向统计日线数据(1-N)。
用法举例:
例:设计一个公式,统计当日A股板块涨停板的股票数。
建立方法如下:
①设计一个公式,判断个股是否涨停,代码如下,设公式名称是“涨停判断”:
bl:=if(STKINBLOCK('ST板块'),1.05,1.1);{如果为ST涨停为5%,否则为10%}
ztb:(c>=intpart(ref(c,1)*bl*100+0.5)/100);{如果涨停返回1,否则返回0}
{注:对新股的涨停未做判断,另外个股因历史的原因,是否被ST或PT处理无法判断,因此对历史数据的判断并不准确}
②建立横向统计数据项:鼠标点菜单“管理/横向统计管理”,在“横向统计管理”对话框中,点“新增”,找到刚才设计的公式“涨停判断”,如下图所示进行设置。
图中,不选除权处理更加合理。应去掉该项选择。
至此,我们就设计了一个横向统计数据项“涨停板”,在图中序号是3,则引用时是estdata(3)。
二、扩展数据库
函数: EXTDATA(N)
参数: 1-13
用法: EXTDATA(N),N取1--13
在[扩展数据管理]中定义并计算数据。
(本函数仅在日线分析周期有效)
说明:取得日线扩展数据(1-13)
飞狐扩展数据简介及示例
飞狐扩展数据库:
一、 扩展数据库的功效:
1、 在公式设计时,由于系统的限制,无法在公式中直接实现横向排名的功能,例如,在公式中无法知道某股票的涨幅的排名,这时可将涨幅数据放入扩展数据库中,让飞狐自动对涨幅数据进行排序,从而获得股票的涨幅排名数据。
2、 由于考虑到磁盘空间及系统的效率,飞狐收盘时,保存的数据并未包含实时接收的全部数据,出于研究股票的需要,您可能需要其中的某些数据,这时可以把这些数据存入扩展数据库,以供调用。
3、 由于系统及磁盘空间的限制,一般保存的短周期的数据有时段的限制,例如设置了只保存10天的分笔数据,超过10天的分笔数据将被自动删除,此时若想对分笔数据进行统计研究,将无法进行,这时可将分笔统计数据存入扩展数据库。
4、 由于系统的限制,公式中无法从长周期引用短周期的指标数据,这时可将短周期的指标数据存入扩展数据库。
二、扩展数据库的调用:
飞狐的扩展数据库,最多可以保存13组数据,保存在扩展数据库中的数据,使用函数EXTDATA(n)来调用,其中n表示第n组数据。
三、 使用扩展数据库示例:
例:如何知道股票在A股板块中的涨幅排名:
1、设计一个公式,设公式名称为“涨幅”,公式代码如下:
zf::(c/ref(c,1)-1)*100;
2、鼠标点菜单“管理/管理扩展数据”,弹出如图1所示扩展数据管理框,
由于是新增的一组数据,双击其中某组尚未设置的数据名称,如图2所示,步骤如下:
① 选择我们刚才设计的“涨幅”公式
② 修改数据名称为“涨幅排名”
③ 选择“生成排名数据(从大到小排)”
④ 去掉“使用除权后的数据”选项(避免涨幅失真)
⑤ “排序方法”选“0-n自然排序”
⑥ “设置范围”选A股板块。
⑦ 图中,“涨幅排名”的扩展数据,是第2组数据,因此调用的函数为EXTDATA(2)
3、设计一个调用涨幅排名数据的公式,调公式名称为“调用涨幅排名”,参考代码如下:
zfpm:extdata(2);
在K线图中,调用“调用涨幅排名”公式,即可获知该股票的当日在A股板块中排列第几名。
说明:在第1步设计的公式中,由于本例中仅需要计算排序的结果,因此公式可以简化(优化),以便减少运算量。
zf::c/ref(c,1);
飞狐基本函数简介之其他函数
一、
函数: FFT(X,N)
参数: N为常数,X为数组.
返回: 返回数组
说明: 傅立叶变换,对序列X进行傅立叶变换或变换处理后反变换
示例: 当N=0时对序列X进行傅立叶变换
当N=1时对序列X进行傅立叶变换并反变换回来,与原X一致
当N>1时对序列X进行傅立叶变换并略去周期小于N的成分再反变换回来
FFT(CLOSE,30)
傅立叶变换是最常用的积分变换。原理和对数变换等差不多,无非是变换复杂为简单,广泛应用于工程技术领域。可傅立叶变换的算法,涉及高等数学的微积分知识,非三言两语说得清楚,也超过了本人的能力范围,这里只能从略了。
傅立叶变换的应用方面,见过的有二:
1、比如把FFT(CLOSE,30),在主图中上移下移之后,可以构成非常光滑的通道。
2、用在周期分析上。语见<期货市场技术分析>P407。
aa:=FFT(c,30);
aa*1.05;
aa*0.95
二、
函数: CHECKUSER(n)
参数: N为常数1或0
返回: 返回数组
说明: 限制公式使用。
示例: check:=CHECKUSER(0)
注册用户返回1,否则返回0
check:=CHECKUSER(1)
对非注册用户不可用该公式
三、
函数: COLORRGB(R,G,B)
参数: N为常数,X为数组.
返回: 返回RGB颜色值(常数)
示例: DRAWGBK(C>O, COLORRGB(255,0,0), COLORRGB(255,255,0),0);
表示图形上最后一组C>O时从左到右从红色到黄色渐变填充子图。效果如下图:
四、
函数: LINEVALUE(COND1,PRICE1,COND2,PRICE2,EXPAND,LOG)
参数:COND为数组,PRICE为数组或常数,LOG为1表示按对数计算,EXPAND为1表示向左延长.
返回: 返回数组
说明: LINEVALUE(COND1,PRICE1,COND2,PRICE2,EXPAND,LOG)
计算(COND1,PRICE1)和(COND2,PRICE2)2点决定的直线的数值
COND为数组,PRICE为数组或常数,LOG为1表示按对数计算,EXPAND为1表示向左延长.可用于趋势线预警、选股等
计算方式:先得到COND2条件满足的后点,再向左求COND1条件满足的前点,仅根据此2点计算
示例: LINEVALUE(DATE=1020129,LOW,DATE=1020606,LOW,0,1);{表示计算连接2002年1月29日低点和2002年6月6日低点的以对数方式计算的趋势线}
五、
函数: USERNAME
参数: N为常数,X为数组.
返回: 返回数组
说明: 取用户注册名。
示例: check:=STRCMP(USERNAME, 'userid')
为0表示用户注册名为userid,可用于公式只给指定用户使用。
六、
函数: USERNAME
参数: 无
返回: 返回值范围为0-11
说明: 当前证券类型。
示例: STKTYPE
返回值范围为0-11,
分别表示指数、A股、B股、基金、债券、其它、外汇、期货、其它股票、商品现货、期权、权证
七、
函数: DATAPERIOD
参数: 无
返回: 返回值范围为0-11
说明: 当前数据周期类型。
示例:DATAPERIOD
返回值范围为0-11,分别表示
分笔成交、1分钟、5分钟、15分钟、30分钟、60分钟、日、周、月、年、多日、多分钟
更多阅读
Word教程-在Word中如何使用通配符快速查找 word快速查找
Word教程-在Word中如何使用通配符快速查找——简介若要想在Word中使用通配符来调整搜索条件,依次单击“编辑→查找”,或者可以按组合键Ctrl+H弹出“查找和替换”对话窗口进行设置,下面我跟大家说说在Word中如何使用通配
ANSYS入门教程,我是如何ANSYS的。 ansys如何入门
ANSYS入门教程,我是如何ANSYS的。——简介ANSYS有限元分析软件是一个多用途的有限元法软件,可以用来求解结构、流体、电力、电磁场及碰撞等问题,在许多领域中都得到了广泛应用,如航空航天、汽车工业、生物医学、桥梁、建筑、电子产品、
淘宝视频上传教程 淘宝详情如何上传视频
淘宝视频上传教程——简介 如何提高转化率,如何让消费者进入你的宝贝页面的时候能停了更多时间选择乃至产生购买,成了当下卖家的主要核心问题。消费者浏览数十家店铺的宝贝,如何让他更亲睐于你。 一个宝贝页面不管有多长,对于消费者
Mac使用教程Dashboard篇 mac如何关闭dashboard
不是所有 Mac 上的工作都需要使用大型应用程式,有些简单的工作不妨让 [tiger] 上的新功能 Dashboard 来为您完成。只要按下一个键,半透明的 Dashboard 就会浮现在电脑桌面上,供您快速取用多种有趣又实用的迷你应用程式 widget。需要加
最为详细的教程,教你如何反编译与回编译 精 java 反编译
最为详细的教程,教你如何反编译与回编译 精——简介学会反编译比较关键,也是我们美化必须掌握技术,学会反编译也是实现制作ROM的起步,ROM高手必然是反编译高手这里有必要说一下,教程只是给你一个动手的那一个跷板,教程不是万能的,给了你基