
等级: 标准版
- 注册:
- 2023-2-16
- 曾用名:
|

楼主 |
发表于 2024-3-22 09:36
|
显示全部楼层
INPUT:N(4,1,12,1);//需要获取的排序位数,如N=4,默认最终获取前四名的数值结果。
VARIABLE:codeArr[12]:='',volArr[12]:=0,sortArr[N]:=0;//codeArr 品种代码数组;volArr 成交量数组;sortArr 排序结果数组,默认长度是4
STR:=STRTRIMRIGHT( STKLABEL, '0123456789');
//生成每个月的合约代码 并存入到数组中。这个只在第一个K上运行下。字符串相关操作比较消耗资源,没必要每个分笔来都进行一次。
if BARPOS=1 then
begin
for i=1 to 12 do //默认按照该品种有12个月份的合约。
begin
codeArr:= STRCAT(str,STRRIGHT(NUMTOSTR(i/100,2),2));
end
end
for j=1 to 12 do
begin
code:=codeArr[j];//code就是合约代码
vox:=CALLSTOCK(code,vtOPENINT,6,0);
volArr[j]:=if(vox>=0,vox,0);//不活跃品种,获取到的成交量可能是负值,这里处理下确保没有负值。
end
for j=1 to N do
begin
index:=MFAMAX(volArr,12);
sortArr[j]:=index;
volArr[index]:=0;
end
老师 以上代码在运行中会把12个月份的数据全部拿来循环选取,就会出现我昨天说的会把2502的数据选进去,而2502是2月合约,刚交割的保留的记录,那么就会让最后的结果可能出错的。
那么我如果现在在循环的月份只在当前月份往后的5个月之内。(05下个主力基本是09,我就最多在06-10合约进行选取)这个要怎么变代码 帮我写下 我最终的结果是要进行自动选取的,所以这步不能错
|
|