以文本方式查看主题

-  金字塔客服中心 - 专业程序化交易软件提供商  (http://222.73.7.161/bbs/index.asp)
--  公式模型编写问题提交  (http://222.73.7.161/bbs/list.asp?boardid=4)
----  能不能帮助编写一个远月和近月价差的选股公式?  (http://222.73.7.161/bbs/dispbbs.asp?boardid=4&id=183933)

--  作者:lqsh
--  发布时间:2021/1/15 16:47:26
--  能不能帮助编写一个远月和近月价差的选股公式?
选股范围主力合约
远月合约价格高于当前主力合约的归入上涨板块

远月合约价格低于当前主力合约的归入下跌板块

--  作者:FireScript
--  发布时间:2021/1/15 17:21:10
--  
远月合约是你自己指定的,还是有具体确定的规则来判定,如果有请说明下判断逻辑。
[此贴子已经被作者于2021/1/15 17:21:29编辑过]

--  作者:lqsh
--  发布时间:2021/1/16 14:14:42
--  
远月合约里头持仓量最大的就可以了。
--  作者:lqsh
--  发布时间:2021/1/16 14:16:45
--  回复:(FireScript)远月合约是你自己指定的,还是有...
远月合约选择几个远期里头持仓量最大的。
--  作者:lqsh
--  发布时间:2021/1/25 11:48:12
--  
公式能编出来吗?
--  作者:lqsh
--  发布时间:2021/1/26 16:23:53
--  远月里头持仓量最大的就可以
近月合约和远月合约选持仓量最大的比就可以。
--  作者:lqsh
--  发布时间:2021/1/26 16:26:32
--  近月合约和远月合约选持仓量最大的比就可以。
近月合约和远月合约选持仓量最大的比就可以。也就是按照期限结构Contango和Backwardation分为两个大板块就可以了。
--  作者:FireScript
--  发布时间:2021/1/26 16:41:04
--  
所以是以主力合约所在月份后面 持仓量最大月份作为远月?如果是这样的话,就要写循环遍历了。但是还要构建后面月份合约的代码字符串。会比较麻烦。我试试看。

--  作者:FireScript
--  发布时间:2021/1/28 14:27:44
--  
//不可以用在原油上,原油代码特殊。
//只能在连续合约上操作
VARIABLE:codeArr[12]:=\'\',optArr[12]:=0,sortArr[4]:=0;

code:=DYNAINFO2(210,STKLABEL);//连续对应的具体品种代码
index:STRTONUM(STRRIGHT(code,2));//主力品种月份的数字
STR:=STRTRIMRIGHT( code, \'0123456789\');//获取品种代码前缀



//生成每个月的合约代码 并存入到数组中。这个只在第一个K上运行下。字符串相关操作比较消耗资源,没必要每个分笔来都进行一次。
if BARPOS=1 then
begin
for i=index+1 to 12 do //从主力开始往后的月份,这其中有些月份是没有对应合约的,这里不做处理。因为需要下标和月份对应。
begin
codeArr[i]:= STRCAT(str,STRRIGHT(NUMTOSTR(i/100,2),2));   
end
end

isAllhas:=0;
if ISLASTBAR then //将昨日成交量填充到数组里面去
begin
for j=index+1 to 12 do
begin
code:=codeArr[j];//code就是合约代码   
temp:=CALLSTOCK(code,vtOPENINT,6,0);
if temp then isAllhas:=1;//有些垃圾合约除了主力都没有数据。所以这里判断下,如果除了主力都没有数据,那么这个变量值为0。
optArr[j]:=if(not(temp),0,temp);
end       
end


//利用线性函数取最大持仓量的索引(就是月份数值)

if ISLASTBAR and isAllhas=1  then  Maxindex:MFAMAX(optArr,12);






图片点击可在新窗口打开查看此主题相关图片如下:temp.png
图片点击可在新窗口打开查看
当前主力之后最大持仓量的合约就是下图的04:


图片点击可在新窗口打开查看此主题相关图片如下:temp.png
图片点击可在新窗口打开查看

基本逻辑就是这样了。剩下的就是拼接处一个品种合约 然后调用下数据做下判断。你理解了上面的代码这个问题也不大。你自行尝试下吧。


--  作者:lqsh
--  发布时间:2021/2/9 16:25:50
--  帮着改一下,调用选出合约的收盘价为何没输出?
//不可以用在原油上,原油代码特殊。
//只能在连续合约上操作
VARIABLE:codeArr[12]:=\'\',optArr[12]:=0,sortArr[4]:=0;

code:DYNAINFO2(210,STKLABEL),nodraw;//连续对应的具体品种代码????210事啥意思??
index:STRTONUM(STRRIGHT(code,2)),nodraw;//主力品种月份的数字
STR:STRTRIMRIGHT( code, \'0123456789\'),nodraw;//获取品种代码前缀



//生成每个月的合约代码 并存入到数组中。这个只在第一个K上运行下。字符串相关操作比较消耗资源,没必要每个分笔来都进行一次。
if BARPOS=1 then
begin
for i=index+1 to 12 do //从主力开始往后的月份,这其中有些月份是没有对应合约的,这里不做处理。因为需要下标和月份对应。
begin
codeArr[i]:= STRCAT(str,STRRIGHT(NUMTOSTR(i/100,2),2));   
end
end

isAllhas:=0;
if ISLASTBAR then //将昨日成交量填充到数组里面去
begin
for j=index+1 to 12 do
begin
code:=codeArr[j];//code就是合约代码   
temp:=CALLSTOCK(code,vtOPENINT,6,0);
if temp then isAllhas:=1;//有些垃圾合约除了主力都没有数据。所以这里判断下,如果除了主力都没有数据,那么这个变量值为0。
optArr[j]:=if(not(temp),0,temp);
end       
end


//利用线性函数取最大持仓量的索引(就是月份数值)

if ISLASTBAR and isAllhas=1  then  Maxindex:MFAMAX(optArr,12),nodraw;
//if ISLASTBAR and isAllhas=1  then  Maxindex:STRRIGHT(NUMTOSTR(MFAMAX(optArr,12)/100,2),2);
cdmvol:=STRCAT(str,05),nodraw;//主力之后成交量最大合约代码
cx:"cdmvol$CLOSE",nodraw;//主力之后成交量最大合约收盘价