看到网上有许多朋友问飞狐F10资料查找的问题,但F10有很多种,每人用的不同、要求也不同,任谁回答都会头痛。我的口号历来是求人不如求己。当你仔细阅读下文后,相信自己你也行……
一、常用的函数——大多属于字符串函数类:
1.主要函数:2个
(1)F10FIND(S,N)——F10资料查找
将从当前股票的F10资料的第N个字符开始查找字符串S,返回找到的位置,返回-1表示未找到
(2)F10TEXT(N,M)——F10资料子字符串
将得到当前股票的F10资料中从第N个字符开使的M个字节长的字符串,M=0表示一直取到行尾
2.辅助函数:
(1)字符串截取:
①STRLEFT(STR,N)——字符串的左部,返回字符串STR的左边N个字符
②STRMID(STR,N,M)——字符串的中部,返回字符串STR的第N个字符开始的长度为M个字符的字符串,M为0则取到末尾
③STRRIGHT(STR,N)——字符串的右部,返回字符串STR的右边N个字符
④LTRIM(STR)——除去开始空格
⑤RTRIM(STR)——除去尾部空格
(2)字符串转换:
①STRTONUM(STR)——字符串转化为数字,将STR转化为数字
②NUMTOSTR(N,M)——数字转化为字符串,将N转化为字符串返回,精确到小数点后M位
3.显示函数:
(1)绘图函数类:
①DRAWTEXT(COND,PRICE,TEXT)——在图形上显示文字,当COND条件满足时,在PRICE位置书写文字TEXT,可用'\n'换行,可ALIGN0-5定义对齐方式。
②DRAWNUMBER(COND,PRICE,NUMBER,PRECISION)——在图形上显示数字,当COND条件满足时,在PRICE位置书写数字NUMBER(可以为常数或数组序列),PRECISION为小数显示位数(取值范围0-7),可ALIGN0-5定义对齐方式。
(2)解盘函数类:也是显示文字与显示数字两种。
二、公式的编写:
由于此类公式是查找F10的资料,因此随着F10资料提供者的不同及其格式的改变,都会影响公式的使用,在编写中需要我们自己逐步进行查找、调试。
1.首先要根据自己所使用F10资料及准备查找的对象进行。假定是鹏博F10资料,准备制作查找“十大流通股东”的公式(下同):
第一步,打开F10资料,找到其所在位置,将其复制后,在公式中写下:GDW0:F10FIND('【十大流通股东】',200); 这一句的意思是找到【十大流通股东】所在位置;
注意函数中的参数S字符串要用半角字符的单引号括起来(下同),参数N可先预设一个,这里先取200。然后将公式编译保存后,选取一个新股或次新股(因其资料较少位置较为靠前,假定选择002047成霖股份)将指标调出来看一下所显示的数值,如果与前面所设的200相距较大,则在指标显示区》》 右键,选中“修改指标公式”,打开公式编辑(下同),把参数调正一下,现在改为30000,这时这一句变成:
GDW0:F10FIND('【十大流通股东】',30000);
然后根据【十大流通股东】与所需资料的位置情况,再写:GDW1:F10FIND('1',GDW0+100); 这里查找的“1”是股东情况的序号,后面的参数GDW0+100是从GDW0向后加上一个估计数,然后再观察一下查找情况,如果没有问题则把第一句的冒号后面加上等号使其成为中间变量,在第二句的尾部加上,LINETHICK使其不显示在图中,然后进行下一步;
第二步,开始查找所需资料,写下:GDT1:=F10TEXT(GDW1,26); ——参数26的确定是数出一行有13个汉字,每个汉字占两个字节的位置。这一句的冒号后面一定要加上等号(因为这时变量中是字符串而非数值),否则会造成“输出数据类型非法”的提示,在用绘图函数写下一句临时语句:DRAWTEXT(SYSPARAM(2)=BARPOS,5,GDT1); 这样再保存后就可以在图中看到所取得的字符串。
第三步,调整所取的字符串:将第二步语句中的GDW1后移3个字节,改成GDT1:=F10TEXT(GDW1+3,26)后》》 “应用于图”,可看到修改后的变化,如果仍不合适就再次调正,直到显示正确,至此第一家流通股东选取完毕。然后返回到GDW1下面,加上一行写下:GDW2:F10FIND('2',GDW1+75),LINETHICK; 在GDT1下面写下:GDT2:=F10TEXT(GDW2+3,26); 然后把DRAWTEXT(SYSPARAM(2)=BARPOS,5,GDT1)里面的GDT1改为GDT2,查看第二家股东的选取情况。
如果看到截取的流通股东名称并不完整,需要继续完善,添加语句如下:
W12:=GDW2-GDW1;
IF W12>120 THEN BEGIN
W:=F10FIND('│',GDW1+75),LINETHICK;
T:=F10TEXT(W+2,26);
GDT1:=RTRIM(GDT1)+LTRIM(T);
END;
这里使用了去除尾部和开始空格的函数,目的是为了使字符串的衔接更加严密。
此时的公式语句为:
GDW0:=F10FIND('【十大流通股东】',30000);
GDW1:F10FIND('1',GDW0+100),LINETHICK;
GDW2:F10FIND('2',GDW1+75),LINETHICK;
W1:=GDW2-GDW1;
GDT1:='1.'+F10TEXT(GDW1+3,26);
GDT2:=F10TEXT(GDW2+3,26);
IF W12>120 THEN BEGIN
W:=F10FIND('│',GDW1+75),LINETHICK;
T:=F10TEXT(W+2,26);
GDT1:=RTRIM(GDT1)+LTRIM(T);
END;
DRAWTEXT(SYSPARAM(2)=BARPOS,5,T);
DRAWTEXT(SYSPARAM(2)=BARPOS,4,GDT1);
0,COLORBLACK;
这时我们发现,如果十家流通股东的查找全部这样写,实际上有很多重复的语句,怎样简化呢?——可以使用循环语句。
在第一行前面写上VARIABLE:GDW[10]=0,GDT[10]='STR'; 将其中的部分变量设定为数组,前半部分为:
VARIABLE:GDW[10]=0,GDT[10]='STR';
GDW0:=F10FIND('【十大流通股东】',30000);
GDW[1]:=F10FIND('1',GDW0+100),LINETHICK;
GDT[1]:='1.'+F10TEXT(GDW[1]+3,26);
FOR j=2 TO 10 DO BEGIN
XH:=RTRIM(LTRIM(NUMTOSTR(j,0)));//将j转换为字符的序号
GDW[j]:=F10FIND(' '+XH+'│',GDW[1]+75);//取字符串所在位置
IF j<10 THEN GDT[j]:=XH+'.'+F10TEXT(GDW[j]+4,26);//取字符串
END;
后面的补充字符串部分变为:
//补未取全的字符串
FOR i=1 TO 9 DO BEGIN
WT:=GDW[i+1]-GDW;//计算前后股东位置的差
IF WT>120 THEN BEGIN//当差超过一定标准时执行下面语句
TW:=F10FIND('│',GDW+75),LINETHICK;//确定所差字符的起点位置
T:=F10TEXT(TW+2,26);//截取所差字符
GDT:=RTRIM(GDT)+LTRIM(T);//前后字符合并
END;
END;
并通过逐一改变DRAWTEXT(SYSPARAM(2)=BARPOS,4,GDT[10])显示语句中GDT下标的数值观察结果。
第四步,处理显示问题
将临时的显示语句改变一下,加上你喜欢的颜色标注,调正好显示的位置,一个公式就诞生了。全部公式如下:
复制内容到剪贴板
代码:
{F10十大流通股东}
VARIABLE:GDW[10]=0,GDT[10]='STR';
GDW0:=F10FIND('【十大流通股东】',30000);
IF GDW0<0 THEN EXIT;
GDW[1]:=F10FIND('1',GDW0+100),LINETHICK;
GDT[1]:='1.'+F10TEXT(GDW[1]+3,26);
FOR j=2 TO 10 DO BEGIN
XH:=RTRIM(LTRIM(NUMTOSTR(j,0)));//将j转换为字符的序号
GDW[j]:=F10FIND(' '+XH+'│',GDW[1]+75);//取字符串所在位置
IF j<10 THEN GDT[j]:=XH+'.'+F10TEXT(GDW[j]+4,26);//取字符串
END;
//补未取全的字符串
FOR i=1 TO 9 DO BEGIN
WT:=GDW[i+1]-GDW;//计算前后股东位置的差
IF WT>120 THEN BEGIN//当差超过一定标准时执行下面语句
TW:=F10FIND('│',GDW+75),LINETHICK;//确定所差字符的起点位置
T:=F10TEXT(TW+2,26);//截取所差字符
GDT:=RTRIM(GDT)+LTRIM(T);//前后字符合并
END;
END;
GDT[10]:='10.'+F10TEXT(GDW[10]+5,26);
DRAWTEXT(SYSPARAM(2)+2=BARPOS AND GDW[1]>1,10,GDT[1]),COLOR74AFFF;
DRAWTEXT(SYSPARAM(2)+2=BARPOS AND GDW[2]>1,8,GDT[2]),COLOR74AFFF;
DRAWTEXT(SYSPARAM(2)+2=BARPOS AND GDW[3]>1,6,GDT[3]),COLOR74AFFF;
DRAWTEXT(SYSPARAM(2)+2=BARPOS AND GDW[4]>1,4,GDT[4]),COLOR74AFFF;
DRAWTEXT(SYSPARAM(2)+2=BARPOS AND GDW[5]>1,2,GDT[5]),COLOR74AFFF;
DRAWTEXT(SYSPARAM(2)+55=BARPOS AND GDW[6]>1,10,GDT[6]),COLOR74AFFF;
DRAWTEXT(SYSPARAM(2)+55=BARPOS AND GDW[7]>1,8,GDT[7]),COLOR74AFFF;
DRAWTEXT(SYSPARAM(2)+55=BARPOS AND GDW[8]>1,6,GDT[8]),COLOR74AFFF;
DRAWTEXT(SYSPARAM(2)+55=BARPOS AND GDW[9]>1,4,GDT[9]),COLOR74AFFF;
DRAWTEXT(SYSPARAM(2)+55=BARPOS AND G |