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

楼主 |
发表于 2023-9-6 09:59
|
显示全部楼层
{禁止提醒}WARNING_DISABLE:11;
{逐K模式运行}RUNMODE:0;
//以下代码对非双年份合约有效(SC,AY,SRY,BUY等是双年份合约)
INPUT:N(2,1,12,1);//需要获取的排序位数,如N=4,默认最终获取前四名的数值结果。
VARIABLE:codeArr[12]:='',ccodeArr[12]:='',volArr[12]:=0,sortArr[N]:=0,cvolArr[12]:=0,csortArr[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
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
//持仓量
if BARPOS=1 then
begin
for ic=1 to 12 do //默认按照该品种有12个月份的合约。
begin
ccodeArr[ic]:= STRCAT(str,STRRIGHT(NUMTOSTR(ic/100,2),2));
end
end
if ISLASTBAR then //将成交量填充到数组里面去. 这里可以自行调整,可以是成交量也可以是其他的什么值,自行选择处理即可。
begin
for jj=1 to 12 do
begin
ccode:=ccodeArr[jj];//code就是合约代码
cvox:=CALLSTOCK(ccode,vtOPENINT,6,0);
cvolArr[jj]:=if(cvox>=0,cvox,0);//不活跃品种,获取到的成交量可能是负值,这里处理下确保没有负值。
end
end
if ISLASTBAR then //利用线性函数取最大成交量的索引(就是月份数值),每次取值完成后 可以把这个最大值重置为0,这样可以依次获取成交量最大的前几名了。
begin
for jj=1 to N do
begin
cindex:=MFAMAX(cvolArr,12);
csortArr[jj]:=cindex;
cvolArr[cindex]:=0;
end
end
if ISLASTBAR then
begin
成交量主力月:sortArr[1];//第一的月份
成交量次主力月:sortArr[2];//第二的月份
END
if ISLASTBAR then
begin
持仓量主力月:csortArr[1];//第一的月份
持仓量次主力月:csortArr[2];//第二的月份
END
补充内容 (2023-9-6 10:00):
这样目前盘中测试是对的 你再检查一下 简化一下看看有没有哪里错了···· |
|