A:
天软关于期货合约代码的编码规则
商品期货的编码规则:“品种”+合约到期年份+合约到期月份;
为什么存在天软代码与交易所代码不一致?
1、AP103如果该期货品种较早上市的话,用三位数字“103”并不能很直观明确地表示是哪一年的合约,可能是2011年的AP1103,也可能是2021年AP2103;
2、各交易所规范可能也不一样,像中金所,就是IF2102这种,与天软这边表现规范一致了
具体可查看FAQ:
Q:期货代码、名称(连续合约、主力合约、指数合约)编制规则
转换一:如何把天软合约代码转成交易所代码(SM2603->SM603)
范例一:用stockname获取
// 获取'AP2103'的交易所代码
return stockname('AP2103');
// 返回:AP103
注:只有盘口的名称才有保留交易所的这个原始代码,已经退市的则取不到)
范例二:按郑商所规则,封装函数进行转换
比如先封装一个函数getJYSCode:
Function getJYSCode(stockID);
Begin
//-只郑商所 有区别
if spec(base(703027),stockID)='郑州商品交易所' then
return stockID[1:length(stockID)-4]+stockID[length(stockID)-2:];
else return stockID;
End;
再在使用时进行调用该函数:
// 获取国内商品期货的交易所代码
stocks:=getbk('国内商品期货'); //当前正在交易的
//加入已退市的商品期货
stocks:=stocks union2 sselect thisrow from getbk('退市期货') where spec(base(703028),thisrow)='商品期货' end;
return select thisrow as 'TSCode',getJYSCode(thisrow) as '交易所代码'
from stocks end;
返回结果:
转换二:如何将外部输入的交易所代码转换成天软合约代码进行取数(SM603->SM2603)
第一步:封装转换函数,如futureTrueid(stock):
Function futureTrueid(stock); //期货代码
begin
stock:=trim(stock);
if isstock(stock) then return stock;
s:='(^[A-Z]{1,2})([0-9]+)$';
if ParseRegExpr(s,stock,"",r,mp,ml) then
begin
qz:=r[0,1];sz:=r[0,2];
//处理一:郑商所代码为3位数字时,补今天的年份后返回
if length(sz)=3 then begin
stock_:=qz$(yearof(today())%100 div 10)$sz;
if spec(base(703027),stock_)='郑州商品交易所' then stock:=stock_;
end
end
return stock;
end
第二步:对传入的交易所期货代码进行转换
//单个代码
stock:=futureTrueid("SM606");
//stock结果为SM2602
//组合代码
stocks:=array("CU2606","SM606","AP605");
stocks::=futureTrueid(mcell);
return stocks;
//返回array("CU2606","SM2606","AP2605")