本帖最后由 技术009 于 2022-8-29 16:18 编辑
[PEL] 复制代码 //以下代码对非双年份合约有效(SC,AY,SRY,BUY等是双年份合约)
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[i]:= STRCAT(str,STRRIGHT(NUMTOSTR(i/100,2),2));
end
end
if ISLASTBAR then //将成交量填充到数组里面去. 这里可以自行调整,可以是成交量也可以是其他的什么值,自行选择处理即可。
begin
for j=1 to 12 do
begin
code:=codeArr[j];//code就是合约代码
vox:=CALLSTOCK(code,vtvol,6,0);
volArr[j]:=if(vox>=0,vox,0);//不活跃品种,获取到的成交量可能是负值,这里处理下确保没有负值。
end
end
if ISLASTBAR then //利用线性函数取最大成交量的索引(就是月份数值),每次取值完成后 可以把这个最大值重置为0,这样可以依次获取成交量最大的前几名了。
begin
for j=1 to N do
begin
index:=MFAMAX(volArr,12);
sortArr[j]:=index;
volArr[index]:=0;
end
end
x1:sortArr[1];//第一的月份
x2:sortArr[2];//第二的月份
x3:sortArr[3];
x4:sortArr[4];
只提供思路参考的代码,具体代码你自行实现吧。此外上面代码仅对非双年份合约有效。
上面是按照成交量排名的代码。你可以再写一套持仓量排序的代码。对比下最终结果。看2个排名如果不一致那就是你要的东西了。 |