股友量 发表于 2022-1-14 00:19

指标编写问答148学习的宝藏

659.问:
      取得深沪两市成交笔数及成交均量的排名位次,且可以在副图或主图中显示
   答(bajatje):
      用扩展数据中的横向排序功能就能解决问题 只是扩展数据资源有限 
      下面是南客老师写的帖子 你看看
      飞狐新增函数应用:股票代码遍历与横向排序
         一、如何进行板块股票代码遍历:
bk:='A股板块'; //bk赋值为字符串'A股板块'
stksum:=STKCOUNT(bk); //板块所包含证券数量
variable:dmstr='';//定义一个字符串数组用于记录股票代码,元素个数为stksum,初始值为空
for k=1 to stksum do//以下循环,循环计数器k从1开始每次递增1,直到stksum
begin
    dm:=stkfromblk(bk,k);//板块bk中第k只证券的证券代码,赋值到字符串变量dm
    dmstr:=dm;//股票代码,记录到字符串数组dmstr的第k个元素中
end;

//以下是一些字符串函数及运算的综合应用
EXPLAIN(1,dmstr);//在解盘中,输出深圳A股第1只股票的代码
EXPLAIN(1,stknameex(dmstr));//第2只股票的名称
EXPLAIN(1,dmstr+stknameex(dmstr));//第3只股票的代码及名称
EXPLAIN(1,bk+'第4只股票的代码是:'+dmstr);
EXPLAIN(1,stkname+'最后收盘价:'+numtostr(close,2));
EXPLAIN(1,bk+'共有股票:'+numtostr(stksum,0)+'只');
      二、横向排序:
//本公式输出结果,请在解盘中查看,由于大量引用了其它指标,因此运算时间会稍长   
   bk:='A股板块'; //bk赋值为字符串'A股板块'
yygs:='macd.diff';//引用的指标,此处可修改为引用其它的指标

stksum:=STKCOUNT(bk); //板块所包含证券数量
dcount:=datacount; //K线图上,最后一根K线的位置
variable:dmstr='',var_px=0,var_indi=0;//定义一个字符串数组用于记录股票代码,元素个数为stksum,初始值为空
for k=1 to stksum do//以下循环,循环计数器k从1开始每次递增1,直到stksum
begin
    dm:=stkfromblk(bk,k);//板块bk中第k只证券的证券代码,赋值到字符串变量dm
    dmstr:=dm;//股票代码,记录到字符串数组dmstr的第k个元素中
    temp1:=stkindi(dm,yygs,0,-1);//引用其它个股的指标
    var_px:=temp1;//记录最后一个周期的指标值,此处可以使用参数,以便得到其它周期的排序
    var_indi:=temp1;//同上,但准备用于记录排序后的位置
end;

Num1:=sortpos(var_indi,1,1,stksum);//计算排序后,按大小排列的位置
dm_max1:=var_indi;//最大值的对应位置
dm_max2:=var_indi;//次大值的对应位置
dm_max3:=var_indi;
dm_max4:=var_indi;
dm_max5:=var_indi;
dm_max6:=var_indi;
dm_min1:=var_indi;//最小值的对应位置
dm_min2:=var_indi;

max1:=var_px;
max2:=var_px;
max3:=var_px;
max4:=var_px;
max5:=var_px;
max6:=var_px;
min1:=var_px;
min2:=var_px;

explain(islastbar,yygs+'前6名:'),colorred;
EXPLAINex(islastbar,'1:'+dmstr+STKNAMEEX(dmstr)+':',max1,2,0),colorred;
EXPLAINex(islastbar,'2:'+dmstr+STKNAMEEX(dmstr)+':',max2,2,0),colorred;
EXPLAINex(islastbar,'3:'+dmstr+STKNAMEEX(dmstr)+':',max3,2,0),colorred;
EXPLAINex(islastbar,'4:'+dmstr+STKNAMEEX(dmstr)+':',max4,2,0),colorred;
EXPLAINex(islastbar,'5:'+dmstr+STKNAMEEX(dmstr)+':',max5,2,0),colorred;
EXPLAINex(islastbar,'6:'+dmstr+STKNAMEEX(dmstr)+':',max6,2,1),colorred;

explain(islastbar,yygs+'后2名:'),colorgreen;
EXPLAINex(islastbar,'2:'+dmstr+STKNAMEEX(dmstr)+':',min2,2,0),colorgreen;
EXPLAINex(islastbar,'1:'+dmstr+STKNAMEEX(dmstr)+':',min1,2,0),colorgreen;
这里给出的代码示例,请下载飞狐0916测试版后使用,否则将会出现语法等错误。
  从上面代码示例可以看出,板块股票代码的遍历是基础,有了这个横向遍历,就可以实现横向排序、横向统计。
  上面未给出横向统计的示例,大家可以参照上面示例,根据自己的需要进行设计。
  几个关键函数:stkfromblk(),sortpos(),可进入公式编辑器,查看函数注释。
  飞狐的循环、条件控制语句,可以任意访问的数据,将给处理问题带来极大的方便。
  下面,再给一段代码,是利用循环、判断语句,设计一个鬼变脸的公式代码:
sensitivy:=-c;
direction:=c;
towero:=o;
towerc:=c;
fc:=c;
i:=2;
while i<=datacount do begin
if towerc>towero and not(between(sensitivy,towero,towerc)) then
    direction:=1;
else if towerc<towero and not(between(sensitivy,towero,towerc)) then
         direction:=0;
       else direction:=direction;
if not(between(sensitivy,towero,towerc)) then begin
    towero:=towerc;towerc:=fc;
    sensitivy:=towero;
end else begin
    towero:=towerc;towerc:=fc;
    sensitivy:=sensitivy;
end;
i:=i+1;
end;
tj:=between(sensitivy,towero,towerc);
stickline(tj,max(towero,towerc),sensitivy,7,0), colorred;
stickline(tj,min(towero,towerc),sensitivy,7,0), colorgreen;
stickline(sensitivy<towerc and not(tj),towero,towerc,7,0), colorred;
stickline(sensitivy>towerc and not(tj),towero,towerc,7,0), colorgreen;
stickline((towerc=towero or sensitivy=towerc) and direction=1,towero,towerc,7,0),colorred;
stickline((towerc=towero or sensitivy=towerc) and direction=0,towero,towerc,7,0),colorgreen;


李平西 发表于 2022-1-14 08:25

:):):):):):):):)

沈建福 发表于 2022-1-14 08:48

学习学习再学习!
页: [1]
查看完整版本: 指标编写问答148学习的宝藏