查看完整版本: 救助:同类品种中只选出成交笔数最大的品种

fox888 2007-10-30 01:43

救助:同类品种中只选出成交笔数最大的品种

如图动态显示列表中有多种期货品种,希望选出每个品种中成交笔数最大的品种。选股的结果如图标注。(注意:同一类品种只能选一个品种)

[[i] 本帖最后由 fox888 于 2007-10-30 01:45 编辑 [/i]]

bajatje 2007-10-30 12:36

大概只能分别选

fox888 2007-10-30 13:24

常用的公式函数可能无法实现,可能只能通过脚本语言才能完成。请高手解决该问题。

fox888 2007-10-30 16:58

看了南客的教学文章善于PHP的案例,只是本人不会PHP,如果普通公式写法无法解决本人的问题,希望高手能用脚本写出本公式。

以下是南客的PHP案例,希望有所启发。
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;

fox888 2007-11-1 11:12

顶起来,请高手出手!

bajatje 2007-11-2 08:17

即便用循环也要多次排序和输出

不如用组合方式

fox888 2007-11-2 12:35

[quote]原帖由 [i]bajatje[/i] 于 2007-11-2 08:17 发表 [url=http://bbs.fjfox.com/redirect.php?goto=findpost&pid=371498&ptid=41775][img]http://bbs.fjfox.com/images/common/back.gif[/img][/url]
即便用循环也要多次排序和输出

不如用组合方式 [/quote]
老师,如何用组合方式?

bajatje 2007-11-3 17:59

想了想,按你的要求还是能写出

分两个公式。只写了三种,其它的你自己添加[code]1、公式名:m
D1:STRFIND(STKNAME,'油',1)>0;
D2:STRFIND(STKNAME,'豆',1)>0;
D3:STRFIND(STKNAME,'铜',1)>0;
D:qt;//成交笔数。你针对期货自己改
2、
BK:='包含所有期货的 板块名称';//自己改
BKs:=STKCOUNT(BK);
P:=datacount;
variable:DM[BKs]='';
for k=1 to BKs do  begin
   码:=STKFROMBLK(BK,k);
   Dm[k]:=码;
   Yx:=STKINDI(码,'m.d',0,6);//式中的6,是调用日线数据。如要调用分笔改为0
   Y[k]:=Yx[p];
Yx1:=STKINDI(码,'m.d1',0,6);
Y1:=if(Yx1,Yx,0);
序1[k]:=Y1[P];

Yx2:=STKINDI(码,'m.d2',0,6);
Y2:=if(Yx2,Yx,0);
序2[k]:=Y2[P];

Yx3:=STKINDI(码,'m.d3',0,6);
Y3:=if(Yx3,Yx,0);
序3[k]:=Y3[P];
end;
PX1:=SORTPOS(序1,1,1,BKs);
PX2:=SORTPOS(序2,1,1,BKs);
PX3:=SORTPOS(序3,1,1,BKs);
for i=1 to BKs do begin
if i=1 then
E:='选出的代码 \n'+','+
STRRIGHT(Dm[序1[i]],4)+'\n,'+
STRRIGHT(Dm[序2[i]],4)+'\n,'+
STRRIGHT(Dm[序3[i]],4);
end;
选股:STRFIND(E,','+STKLABEL,1)>0,LINETHICK;
PARTLINE(1,0),COLORBLACK;
DRAWTEXT(SYSPARAM(2)=BARPOS,8,E);[/code]

[[i] 本帖最后由 bajatje 于 2007-11-3 18:06 编辑 [/i]]

fox888 2007-11-5 22:37

非常感谢!按照这个方案,结果只能在10个期货品种中选出二个,且速度较慢。我的思路是:建立一个"主力期货“的公式,运用条件选股,选股范围设定为系统自带的“期货板块”。
特将二个公式传上来,看一下不知错在何处?(为什么只选出二个品种?)
(1)公式:M
//--------------------------------------------
D1:STRFIND(STKNAME,'黄豆',1)>0;
D2:STRFIND(STKNAME,'玉米',1)>0;
D3:STRFIND(STKNAME,'燃油',1)>0;
D4:STRFIND(STKNAME,'白糖',1)>0;
D5:STRFIND(STKNAME,'强麦',1)>0;
D6:STRFIND(STKNAME,'沪胶',1)>0;
D7:STRFIND(STKNAME,'沪锌',1)>0;
D8:STRFIND(STKNAME,'沪铝',1)>0;
D9:STRFIND(STKNAME,'PTA',1)>0;
D10:STRFIND(STKNAME,'LLDPE',1)>0;
DD:DYNAINFO(51);//成交笔数。
======================================================================================
(2)主力期货公式
=======================================================================================
BK:='期货板块';//
BKs:=STKCOUNT(BK);
P:=datacount;
variable:DM[BKs]='';
for k=1 to BKs do  begin
   码:=STKFROMBLK(BK,k);
   Dm[k]:=码;
   Yx:=STKINDI(码,'m.dd',0,6);//式中的6,是调用日线数据。如要调用分笔改为0
   Y[k]:=Yx[p];
Yx1:=STKINDI(码,'m.d1',0,6);
Y1:=if(Yx1,Yx,0);
序1[k]:=Y1[P];

Yx2:=STKINDI(码,'m.d2',0,6);
Y2:=if(Yx2,Yx,0);
序2[k]:=Y2[P];

Yx3:=STKINDI(码,'m.d3',0,6);
Y3:=if(Yx3,Yx,0);
序3[k]:=Y3[P];

Yx4:=STKINDI(码,'m.d4',0,6);
Y4:=if(Yx4,Yx,0);
序4[k]:=Y4[P];

Yx5:=STKINDI(码,'m.d5',0,6);
Y5:=if(Yx5,Yx,0);
序5[k]:=Y5[P];

Yx6:=STKINDI(码,'m.d6',0,6);
Y6:=if(Yx6,Yx,0);
序6[k]:=Y6[P];

Yx7:=STKINDI(码,'m.d7',0,6);
Y7:=if(Yx7,Yx,0);
序7[k]:=Y7[P];

Yx8:=STKINDI(码,'m.d8',0,6);
Y8:=if(Yx8,Yx,0);
序8[k]:=Y8[P];

Yx9:=STKINDI(码,'m.d9',0,6);
Y9:=if(Yx9,Yx,0);
序9[k]:=Y9[P];

Yx10:=STKINDI(码,'m.d10',0,6);
Y10:=if(Yx10,Yx,0);
序10[k]:=Y10[P];
end;
PX1:=SORTPOS(序1,1,1,BKs);
PX2:=SORTPOS(序2,1,1,BKs);
PX3:=SORTPOS(序3,1,1,BKs);
for i=1 to BKs do begin
if i=1 then
E:='选出的代码 \n'+','+
STRRIGHT(Dm[序1[i]],4)+'\n,'+
STRRIGHT(Dm[序2[i]],4)+'\n,'+
STRRIGHT(Dm[序3[i]],4);
end;
选股:STRFIND(E,','+STKLABEL,1)>0;

====================================================================================
选股速度奇慢,是否能优化?

[[i] 本帖最后由 fox888 于 2007-11-5 22:42 编辑 [/i]]

bajatje 2007-11-6 00:10

那就用组合方式选股方式吧
在选股器中[code]1、公式名:m
D1:=STRFIND(STKNAME,'油',1)>0;
D2:=STRFIND(STKNAME,'豆',1)>0;
D3:=STRFIND(STKNAME,'铜',1)>0;
//根据需要自己增加
D:qt;//成交笔数。你针对期货自己改
2、
INPUT:N(3,1,99);
BK:=if(N=1,'油类板块名',if(N=2,'豆类板块名',if(N=3,'铜类板块名','')));//先建立各类板块。根据需要自己增加
d0:=if(N=1,'m.d1',if(N=2,'m.d2',if(N=3,'m.d3','');//根据需要自己增加
BKs:=STKCOUNT(BK);
P:=datacount;
variable:DM[BKs]='';
for k=1 to BKs do  begin
   码:=STKFROMBLK(BK,k);
   Dm[k]:=码;
   Yx:=STKINDI(码,'m.d',0,6);//式中的6,是调用日线数据。如要调用分笔改为0
   Y[k]:=Yx[p];
Yx1:=STKINDI(码,D0,0,6);
Y1:=if(Yx1,Yx,0);
序1[k]:=Y1[P];
end;
PX1:=SORTPOS(序1,1,1,BKs);
for i=1 to BKs do begin
if i=1 then
E:=','+STRRIGHT(Dm[序1[i]],4);
end;
选股:STRFIND(E,','+STKLABEL,1)>0;[/code]

fox888 2007-11-6 05:55

由于飞孤内置“期货板块”自动更新代码,所以,自建各类板块的方式非常不可行。为此,”主力期货“的选股公式只能设定为系统内置的”期货板块“而不可自建。能否有更好的解决方案呢?再次感谢!

bajatje 2007-11-6 08:06

fox888 2007-11-6 12:35

:p: 无论如何都非常感谢!bajatje老师,可能真是比较困难,要完成这个比较难的选股看来只能用DLL解决了。:crying: :crying: :crying: :crying: :crying:
页: [1]
查看完整版本: 救助:同类品种中只选出成交笔数最大的品种