:《飞狐公式编写基础》《通达信公式教程》--2-- 指标公...
来源:百度文库 编辑:神马文学网 时间:2024/04/27 17:30:21
一、STKINDI示例代码
函数注释如下:
引用任意证券任意周期的任意指标输出
用法 :
STKINDI(STKLABEL,INDINAME,INDITYPE,PERIOD)
INDITYPE为指标类型,有效值范围为(0-2),依次表示技术指标、条件选股、交易系统公式;
PERIOD为周期类型,有效值范围为(-1-11),依次表示:
当前周期、分笔成交、1分钟、5分钟、15分钟、30分钟、60分钟、日、周、月、年、多日、多分钟
例如:STKINDI('1A0001','MA.MA1',0,DATAPERIOD);
例1:引用大盘的涨跌家数。
①被引用公式,设被引用的公式名称为“涨跌家数”,其公式代码如下:
A:ADVANCE;
D:DECLINE;
②引用大盘的涨跌家数,示例代码如下:
fStkName:=if(STRCMP(STKMARKET, 'SH'),'399301','1A0001');
fAdvance:=STKINDI(fStkName,'涨跌家数.A',0,6);
fDecline:=STKINDI(fStkName,'涨跌家数.D',0,6);
说明:大盘函数advance、decline只能被大盘所使用,不能在个股中直接使用,这段代码,示范了如何利用STKINDI函数达到在个股中引用的目的。
例2:在日k线中引用本股票5分钟的obv该怎么写?
求解:代码如下
StkIndi(StkLabel,'OBV',0,2);{注意,公式的名称应使用大写字母}
二、横向统计相关函数的用法简介:
1、横向统计数据函数 ESTDATA(N),取得横向统计日线数据(1-N),仅在日线分析周期有效;
2、用法举例:
例:设计一个公式,统计当日A股板块涨停板的股票数。
3、方法如下:
①设计一个公式,判断个股是否涨停,代码如下,设公式名称是“涨停判断”:
bl:=if(STKINBLOCK('ST板块'),1.05,1.1);{如果为ST涨停为5%,否则为10%}
ztb:abs(c-intpart(ref(c,1)*bl*100+0.5)/100)<0.0001;{如果涨停返回1,否则返回0}
{注:对新股的涨停未做判断,另外个股因历史的原因,是否被ST或PT处理无法判断,因此对历史数据的判断并不准确}
②建立横向统计数据项:鼠标点菜单“管理/横向统计管理”,在“横向统计管理”对话框中,点“新增”,找到刚才设计的公式“涨停判断”。
⑴数据名称改为“涨停板”
⑵选择技术指标“涨停判断”,计算周期“日线”、指标线“ztb”为默认,不作修改。
⑶横向统计方法选“全部累加”。
⑷“计算时选择除权后的数据”不选即前面不打勾。
⑸点“设置范围”按钮,选择统计范围。
⑹置好范围后,点确定。
至此,我们就设计了一个横向统计数据项“涨停板”,在图中序号是1,则引用时是estdata(1)。
③设计一个引用“涨停板”的公式,公式代码如下,设公式的名称是zttj:
涨停板统计:estdata(1);
在K线图中,调用公式zttj,就可以看到我们所需要的结果了。
练习:如果对横向统计有兴趣的话,可以仿此,做一个跌停板统计公式。当然可以把涨停、跌停做成二合一公式。
三、如何计算当日交易分钟数:
T定义为1分钟周期图上,开盘后的交易分钟数,
1、代码之一
--------------------------------------------------------------------------------
T:=IF(BETWEEN(HOUR,9,11),(HOUR-9.5)*60+MINUTE,
IF(BETWEEN(HOUR,13,15),(HOUR-9.5-1.5)*60+MINUTE,240));
--------------------------------------------------------------------------------
稍加优化:
--------------------------------------------------------------------------------
T:=IF(BETWEEN(HOUR,9,11),(HOUR-9.5)*60+MINUTE,
IF(BETWEEN(HOUR,13,15),(HOUR-11)*60+MINUTE,240));
--------------------------------------------------------------------------------
代码解释:
如果小时数介于9和11间,返回值(HOUR-9.5)*60+MINUTE
否则
如果小时数介于13和15之间,返回值(HOUR-9.5-1.5)*60+MINUTE
否则返回值240
2、观察所有的股票一天的1分钟周期图,可以发现,都是起始于9:31,结束于15:00,并且中午休市不显示,因此代码一可以简化为如下公式代码二,请自行解释代码。
公式代码二:
--------------------------------------------------------------------------------
T:=IF(HOUR<=11,(HOUR-9.5)*60+MINUTE,
IF(HOUR>=11,(HOUR-11)*60+MINUTE,240));
--------------------------------------------------------------------------------
3、公式代码二,在1分钟周期中,其实返回240的情况可以合并如下(为什么?)
公式代码三:
T:=IF(HOUR<=11,(HOUR-9.5)*60+MINUTE,(HOUR-11)*60+MINUTE);
整理后得到,公式代码四:
T:=IF(HOUR<12,HOUR*60+MINUTE-570,HOUR*60+MINUTE-660);
4、公式代码四,可以改写如下的公式代码五:
T1:=IF(HOUR<12,570,660);
T:=HOUR*60+MINUTE-T1;
呵呵,570就是9.5小时对应的分钟数,660是11小时对应的分钟数。其实一开始我们就可以写出这个公式了。我在飞狐公式入门五的答贴中,提示了“用时间类的函数,例如现在是10:30的话,怎么算交易时间呢?如果‘现在’是14:00,又怎么算交易时间?”
公式代码五,是南客喜欢的表达方式,比公式代码四要多写一行,但更灵活、易于变化。
好了,问题解决了,也该给喜欢思考的弟兄一点问题。
问题1:在5--60分钟周期图上,设计一个计算当日交易分钟数的公式,进一步设计出量比公式。
问题2:国内A、B股等的交易分2个时段,即上午和下午各交易2小时,在中午休市1.5小时,如果设想一个股市,一天之中,交易3个或更多个时段,当日交易分钟数的公式,又该怎么写?为了方便写公式,假设为3个时段:上午为9:30--11:30,下午为13:00--15:00,晚上为19:00--21:00。
提示:公式改写为适用于5--60分钟周期,还需考虑当日是否停牌。为了减少难度,先不考虑停牌的情况,等公式调试成功后,再考虑如何加入判断是否停牌的条件。
四、相关系数函数CORR简单介绍及示例代码:
相关系数函数CORR,可以比较两只个股或个股与大盘的指标或价格在N周期内走势的相似程度,函数返回的数值越大,相似程序越高。
下面是最后N周期内,个股与大盘收盘价走势相似程度的示例代码:
ts0:=barssince(c);
ts1:=barslast(barssince(backset(islastbar,N+1))=0);
ts:=if(ts0bl:=ref(IndexC/C,Ts);{确定基准日压缩比率}
fc:c*bl/bl;
fIndexC:IndexC/bl;{按比率压缩大盘指数,以便跟个股收盘比较}
相似程度:CORR(fc,fIndexC,N),linethick0;
简单的应用方法:
1、指标作为副图指标,可通过对“相似程度”排序,找出近期走势跟大盘相似程度较高的个股。
2、也可以把代码中的IndexC换成其它作为样本的个股,找出同类走势的个股。
转贴《教育统计学》中,对相关系数的描述:
相关系数
在教育研究中,常涉及到两个事物(变量)的相互关系问题,例如,学习成绩与非智力因素的关系,数学成绩与物理成绩的关系,男女生学习成绩的关系,等等。其关系表现为以下三种变化;第一,正相关:一个变量增加或减少时,另一个变量也相应增加或减少;第二,负相关:一个变量增加或减少时,另一个变量却减少或增加;第三,无相关:说明两个变量是独立的,即由一个变量值,无法预测另一个变量值。统计学中,就用“相关系数"来从数量上描述两个变量之间的相关程度,用符号“r"来表示。
相关系数取值范围限于:-1≤r≤+1
相关系数表示的意义
相关系数(r) 0.00 0.00-±0.3 ±0.30-±0.50 ±0.50-±0.80 ±0.80-±1.00
相关程度 无相关 微正负相关 实正负相关 显著正负相关 高度正负相关
五、不同股票(证券)引用不同大盘指数的参考代码:
对于indexc替换成如下的index_c:
--------------------------------------------------------------------------------
index_sh_c:=
if(STKTYPE=1,"1A0002$close",
if(STKTYPE=2,"1A0003$close",
if(STKTYPE=3,"1B0008$close",indexc)));{对A股、B股及基金引用不同指数}
index_sz_c:=
if(STKTYPE=1,"399002$close",
if(STKTYPE=2,"399003$close",
if(STKTYPE=3,"399305$close",indexc)));
index_c:if(STRCMP(STKMARKET, 'SH')=0,index_sh_c,index_sz_c);
--------------------------------------------------------------------------------
以上代码仅考虑了A股、B股、基金,其它未作区分,可根据自己的需要进行修改。
对于indexo替换成如下的index_o:
--------------------------------------------------------------------------------index_sh_o:=
if(STKTYPE=1,"1A0002$open",
if(STKTYPE=2,"1A0003$open",
if(STKTYPE=3,"1B0008$open",indexo)));
index_sz_o:=
if(STKTYPE=1,"399002$open",
if(STKTYPE=2,"399003$open",
if(STKTYPE=3,"399305$open",indexo)));
index_o:if(STRCMP(STKMARKET, 'SH')=0,index_sh_o,index_sz_o);--------------------------------------------------------------------------------
对于indexh替换成如下的index_h:
--------------------------------------------------------------------------------
index_sh_h:=
if(STKTYPE=1,"1A0002$high",
if(STKTYPE=2,"1A0003$high",
if(STKTYPE=3,"1B0008$high",indexh)));
index_sz_h:=
if(STKTYPE=1,"399002$high",
if(STKTYPE=2,"399003$high",
if(STKTYPE=3,"399305$high",indexh)));
index_h:if(STRCMP(STKMARKET, 'SH')=0,index_sh_h,index_sz_h);
--------------------------------------------------------------------------------
对于indexl替换成如下的index_l:
--------------------------------------------------------------------------------
index_sh_l:=
if(STKTYPE=1,"1A0002$low",
if(STKTYPE=2,"1A0003$low",
if(STKTYPE=3,"1B0008$low",indexl)));
index_sz_l:=
if(STKTYPE=1,"399002$low",
if(STKTYPE=2,"399003$low",
if(STKTYPE=3,"399305$low",indexl)));
index_l:if(STRCMP(STKMARKET, 'SH')=0,index_sh_l,index_sz_l);
--------------------------------------------------------------------------------
对于indexa替换成如下的index_A:
--------------------------------------------------------------------------------
index_sh_A:=
if(STKTYPE=1,"1A0002$Amount",
if(STKTYPE=2,"1A0003$Amount",
if(STKTYPE=3,"1B0008$Amount",indexA)));
index_sz_A:=
if(STKTYPE=1,"399002$Amount",
if(STKTYPE=2,"399003$Amount",
if(STKTYPE=3,"399305$Amount",indexA)));
index_A:if(STRCMP(STKMARKET, 'SH')=0,index_sh_A,index_sz_A);
--------------------------------------------------------------------------------
对于indexv替换成如下的index_V:
--------------------------------------------------------------------------------
index_sh_V:=
if(STKTYPE=1,"1A0002$Vol",
if(STKTYPE=2,"1A0003$Vol",
if(STKTYPE=3,"1B0008$Vol",indexV)));
index_sz_V:=
if(STKTYPE=1,"399002$Vol",
if(STKTYPE=2,"399003$Vol",
if(STKTYPE=3,"399305$Vol",indexV)));
index_V:if(STRCMP(STKMARKET, 'SH')=0,index_sh_V,index_sz_V);
--------------------------------------------------------------------------------
六、控制语句if...then...else示例
通过参数N,控制调整均线数,代码参考如下:
input:p1(5,0,300),p2(10,0,300),p3(20,0,300),p4(30,0,300),n(4,1,4);{参数定义}
IF n>0 then MA1:MA(CLOSE,P1);{如果n>=1则输出ma1指标线}
IF n>1 then MA2:MA(CLOSE,P2);{如果n>=2则输出ma1指标线}
IF n>2 then MA3:MA(CLOSE,P3);{如果n>=3则输出ma1指标线}
IF n>3 then MA4:MA(CLOSE,P4);{如果n>=4则输出ma1指标线}
由于目前IF cond THEN expr1 ELSE expr2 中条件cond暂时只能用常数,因此,可配合主要是参数、常数函数
例2:修改成交量公式VOL,当流通盘不为零且当前周期为日以上周期时,显示换手率,代码参考如下(仿此,大家绕过指标模组,可以自行设计,“绑定”到周期、券种等的公式)
VOL,VOLSTICK;
MA1:MA(VOL,M1);
MA2:MA(VOL,M2);
MA3:MA(VOL,M3);
if capital>0 and DATAPERIOD>=6 then 换手率:vol/capital;
当切换到60分钟及以下周期,或者切换到大盘(此时流通盘=0),会发现“换手率”指标线、名称及数值都不显示。
稍加改进,使用复合语句,可适用于任意周期:
例3,修改成交量公式,流通盘不为0时,显示换手率(60分钟及以下周期,计算当日最新的换手率),代码参考如下:
PHP代码:--------------------------------------------------------------------------------
VOL,VOLSTICK;
MA1:MA(VOL,M1);
MA2:MA(VOL,M2);
MA3:MA(VOL,M3);
IF CAPITAL>0 then //如果换手率>0,则
IF DATATYPE>=6 then //如果周期为日及以上的较长周期,则
b:=VOL/CAPITAL*100
else //否则
begin //复合语句开始,即以下3条语句,视为1条语句,end表示复合语句结束
tj:=DAY>REF(DAY,1) or BARSSINCE(CLOSE)=0;
ts:=BARSLAST(tj)+1;
b:=SUM(VOL,ts)/CAPITAL*100;
end;
换手率:b;--------------------------------------------------------------------------------
修改或创建这个公式后,大家会发现,只要流通盘=0,则换手率指标线就不会被显示,例如切换到大盘观察。
七、循环语句示例:移动平均线的N种写法
移动平均线的N种写法(V3.5.30828 以上版本支持)
PHP代码:
--------------------------------------------------------------------------------
INPUT:n(5,1,300); //参数申明
VARIABLE:k=0; //变量申明
FOR i=0 TO n-1 DO
k:=k+ref(close,i); //把最近 n 天的收盘价累加
MA1:k/n; //实现MA(C,N)
///////////////////////////////////////////
INPUT:N(5,1,300); //参数申明
VARIABLE:i=0,k=0,j=0; //变量申明
VAR1:=C;
FOR j=1 TO DATACOUNT DO
BEGIN
IF j>=n THEN
BEGIN
WHILE i BEGIN
k:=k+VAR1[j-i];
i:=i+1;
END;
MA2[j]:k/n; //实现MA(C,N)
i:=0;
k:=0;
END;
END;
///////////////////////////////////////////
INPUT:N(5,1,300); //参数申明
VARIABLE:i=0,k=0,VAR1:=C; //变量申明
FOR j=1 TO DATACOUNT DO
BEGIN
k:=k+VAR1[j];
IF j>=n THEN
BEGIN
IF j>n THEN
k:=k-VAR1[j-n];
MA3[j]:k/n; //实现MA(C,N)
i:=0;
END;
END;
/////////////////////////////
--------------------------------------------------------------------------------
还有很多写法
还可以只计算最后1个有效数值,比如用于提高预警速度,大家练习试试
//////////////////////////////////////////////////////////
南客再附上一段历史流通盘的代码:
//说明:本公式,无法计算增发、职工股上市等情形,公式原型为原子兄用VBS设计的代码
var1:=splitdata(1)+splitdata(2);
cap:=c;
cap[datacount]:=1;
for i=datacount downto 2 do cap[i-1]:=cap /(1+var1/10);
capi:=cap*capital/100;
历史流通盘∥万股:capi;
drawnumber(cap>ref(cap,1) or barscount(c)=1,capi,capi,0);
八、序列数据量
所属类别: 常数函数 参数数量: 0
序列数据量。
用法:
DATACOUNT,返回序列数据数量
注意:该函数返回常数
解说:以日周期为例,我们知道,个股的收盘价就是一个序列变量,每天都有一个数值,总共有很多个数值,到底有多少个数值?如果个股数据是完整的,数值的个数就是上市后总的有效交易天数(即K线的数量)。显然人工去点不现实,这里提供的函数,就是计算这个数据的。
代码示例:
K线数:datacount;
②在飞狐新开发的公式系统中,序列变量可以用数组表示,比如:
fc:=close;
定义了一个序列变量fc,它等于个股所有的收盘价。请看下面代码:
fc:=c;
第1天收盘价:fc[1];
最后1天收盘价:fc[datacount];
图示如下
想想看1:如何表示第1根K线的日期(通常是上市的日期),如果想将股票按上市日期先后排序,这个公式会很有用。
想想看2:编写一个选股公式,选出上市天数少于N的公式。
与barscount的区别:显然,这是一个序列变量,随K线的位置不同而不同。而datacount是一个常量,不管在哪个K线的位置上,它都是同一个数值。 新增函数应用:如何遍历板块股票代码
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]等于多少吗?这个数列是很有名的,许多股票预测都会用到它。 呵呵,具体我也记不住了,谁能告诉我它叫什么?
条件语句是程序中的最基本、最重要的语句之一,今天通过一个简单实例学习条件语句。
问题:设计一个指标,除首日外,如果当日涨停(设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时也一样。
颜色的种类应该够用了。至于各指标线(柱)之间的颜色搭配,实在是一种很艺术性的事。既要有美感,又要不触目惊心,我只能凭感觉挑选,其它也没有什么招数了。要是有学过美术的人来指点几招就好了。
枫叶秋雨兄提供的“飞狐色彩值吸取器”,实在是好东西,给我们挑选颜色提供了很大的方便。
函数注释如下:
引用任意证券任意周期的任意指标输出
用法 :
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
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
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
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时也一样。
颜色的种类应该够用了。至于各指标线(柱)之间的颜色搭配,实在是一种很艺术性的事。既要有美感,又要不触目惊心,我只能凭感觉挑选,其它也没有什么招数了。要是有学过美术的人来指点几招就好了。
枫叶秋雨兄提供的“飞狐色彩值吸取器”,实在是好东西,给我们挑选颜色提供了很大的方便。
:《飞狐公式编写基础》《通达信公式教程》--2-- 指标公...
《飞狐公式编写基础》和《通达信公式教程》--3-- 指标公...
《飞狐公式编写基础》和《通达信公式教程》--4-- 指标公...
《飞狐公式编写基础》和《通达信公式教程》(五)
《飞狐公式编写基础》和《通达信公式教程》(二)
《飞狐公式编写基础》和《通达信公式教程》(一)
《飞狐公式编写基础》和《通达信公式教程》
《通达信公式教程》--2-- 指标公...
通达信公式编写(教程2)
通达信指标公式编写教程:绘图函数(DRAWLINE、DRAWTEXT 等)
飞狐公式编写教程——选股公式
通达信公式编写入门(一) - 指标公式 1
通达信公式教程2
通达信公式教程2
通达信与飞狐公式相互转换2
编写大智慧指标公式教程(2)
编写大智慧指标公式教程
通达信公式编写1
通达信公式编写知识
分享通达信公式,,并请哪位老师编写“见好就收”的预警公式 - 【指标公式及技...
飞狐公式编写教程——选股公式 - 莲花的博客 - 敏思博客
同花顺公式编写教程
(转) 编写指标公式技巧全集2
大智慧指标公式编写(2)