前段时间的菜油和焦炭因为金字塔没有及时推送除权数据,导致连续合约在换月的时候大幅跳空,造成空单的无端止损。金字塔技术人员建议采用指数合约,并映射连续合约的方法进行交易,但此方法有2个弊端。第一:指数合约是金字塔服务器计算后推送给客户端的,而连续合约数据是CTP订阅的,势必在响应速度方面指数合约会慢于连续合约,我初步对照了一下,可能会慢0.5秒到1秒,因此在交易中会造成不必要的滑点.
第二:因为交易的是连续合约,而测试的是指数合约并通过映射连续合约交易,势必会造成回测结果跟实际交易结果的一定误差,虽然可能不大。
初步询问了一下金字塔技术人员,据说除权数据是人工计算好推送的,对技术力量强大的金字塔公司而言,实在难以想象。我个人觉的实现自动计算除权并自动推送的技术应该不难实现。
下面提供一些个人的思路,仅供金字塔技术人员参考。
第一步:开盘获取当月合约,代码如下(以pta为例,其他品种类同)
if time=090300 and ISLASTBAR then begin
连续量:=CALLSTOCK(STKLABEL,vtVOL,6,-1);
量1:=CALLSTOCK('TA01',vtvol,6,-1);
量3:=CALLSTOCK('TA02',vtvol,6,-1);
量5:=CALLSTOCK('TA03',vtvol,6,-1);
量7:=CALLSTOCK('TA04',vtvol,6,-1);
量9:=CALLSTOCK('TA05',vtvol,6,-1);
量11:=CALLSTOCK('TA06',vtvol,6,-1);
y量1:=CALLSTOCK('TA07',vtvol,6,-1);
y量3:=CALLSTOCK('TA08',vtvol,6,-1);
y量5:=CALLSTOCK('TA09',vtvol,6,-1);
y量7:=CALLSTOCK('TA10',vtvol,6,-1);
y量9:=CALLSTOCK('TA11',vtvol,6,-1);
y量11:=CALLSTOCK('TA12',vtvol,6,-1);
if 连续量=量1 then
WRITEINIFILESTRING('d:\商品.ini','pta','当月','TA01');
if 连续量=量3 then
WRITEINIFILESTRING('d:\商品.ini','pta','当月','TA02');
if 连续量=量5 then
WRITEINIFILESTRING('d:\商品.ini','pta','当月','TA03');
if 连续量=量7 then
WRITEINIFILESTRING('d:\商品.ini','pta','当月','TA04');
if 连续量=量9 then WRITEINIFILESTRING('d:\商品.ini','pta','当月','TA05');
if 连续量=量11 then
WRITEINIFILESTRING('d:\商品.ini','pta','当月','TA06');
if 连续量=y量1 then
WRITEINIFILESTRING('d:\商品.ini','pta','当月','TA07');
if 连续量=y量3 then
WRITEINIFILESTRING('d:\商品.ini','pta','当月','TA08');
if 连续量=y量5 then
WRITEINIFILESTRING('d:\商品.ini','pta','当月','TA09');
if 连续量=y量7 then
WRITEINIFILESTRING('d:\商品.ini','pta','当月','TA10');
if 连续量=y量9 then WRITEINIFILESTRING('d:\商品.ini','pta','当月','TA11');
if 连续量=y量11 then
WRITEINIFILESTRING('d:\商品.ini','pta','当月','TA12');
end;
第二步:尾盘获取当日换月的合约
换月:=getINIFILE('d:\商品.ini','pta','换月');
if 换月=0 and CURRENTTIME>145800 and time=150000 and islastbar then BEGIN
量1:=CALLSTOCK('TA01',vtvol,6,0);
量2:=CALLSTOCK('TA02',vtvol,6,0);
量3:=CALLSTOCK('TA03',vtvol,6,0);
量4:=CALLSTOCK('TA04',vtvol,6,0);
量5:=CALLSTOCK('TA05',vtvol,6,0);
量6:=CALLSTOCK('TA06',vtvol,6,0);
量7:=CALLSTOCK('TA07',vtvol,6,0);
量8:=CALLSTOCK('TA08',vtvol,6,0);
量9:=CALLSTOCK('TA09',vtvol,6,0);
量10:=CALLSTOCK('TA10',vtvol,6,0);
量11:=CALLSTOCK('TA11',vtvol,6,0);
量12:=CALLSTOCK('TA12',vtvol,6,0);
连续量:=CALLSTOCK(STKLABEL,vtVOL,6,0);
if 量1>连续量 and valid(连续量) and valid(量1) then begin
WRITEINIFILE('d:\商品.ini','pta','换月',1);
WRITEINIFILESTRING('d:\商品.ini','pta','下月','TA01');
end;
if 量2>连续量 and valid(连续量) and valid(量2) then begin
WRITEINIFILE('d:\商品.ini','pta','换月',1);
WRITEINIFILESTRING('d:\商品.ini','pta','下月','TA02');
end;
if 量3>连续量 and valid(连续量) and valid(量3) then begin
WRITEINIFILE('d:\商品.ini','pta','换月',1);
WRITEINIFILESTRING('d:\商品.ini','pta','下月','TA03');
end;
if 量4>连续量 and valid(连续量) and valid(量4) then begin
WRITEINIFILE('d:\商品.ini','pta','换月',1);
WRITEINIFILESTRING('d:\商品.ini','pta','下月','TA04');
end;
if 量5>连续量 and valid(连续量) and valid(量5) then begin
WRITEINIFILE('d:\商品.ini','pta','换月',1);
WRITEINIFILESTRING('d:\商品.ini','pta','下月','TA05');
end;
if 量6>连续量 and valid(连续量) and valid(量6) then begin
WRITEINIFILE('d:\商品.ini','pta','换月',1);
WRITEINIFILESTRING('d:\商品.ini','pta','下月','TA06');
end;
if 量7>连续量 and valid(连续量) and valid(量7) then begin
WRITEINIFILE('d:\商品.ini','pta','换月',1);
WRITEINIFILESTRING('d:\商品.ini','pta','下月','TA07');
end;
if 量8>连续量 and valid(连续量) and valid(量8) then begin
WRITEINIFILE('d:\商品.ini','pta','换月',1);
WRITEINIFILESTRING('d:\商品.ini','pta','下月','TA08');
end;
if 量9>连续量 and valid(连续量) and valid(量9) then begin
WRITEINIFILE('d:\商品.ini','pta','换月',1);
WRITEINIFILESTRING('d:\商品.ini','pta','下月','TA09');
end;
if 量10>连续量 and valid(连续量) and valid(量10) then begin
WRITEINIFILE('d:\商品.ini','pta','换月',1);
WRITEINIFILESTRING('d:\商品.ini','pta','下月','TA10');
end;
if 量11>连续量 and valid(连续量) and valid(量11) then begin
WRITEINIFILE('d:\商品.ini','pta','换月',1);
WRITEINIFILESTRING('d:\商品.ini','pta','下月','TA11');
end;
if 量12>连续量 and valid(连续量) and valid(量12) then begin
WRITEINIFILE('d:\商品.ini','pta','换月',1);
WRITEINIFILESTRING('d:\商品.ini','pta','下月','TA12');
end;
end;
第三:此上面两步已经获取了当月合约和下月合约的代码,只要在第二天开盘时候处理好前一天当月合约和下月合约收盘价差,就可以自动计算除权数据 :代码如下
换月:=getINIFILE('d:\商品.ini','pta','换月');
if 换月 then BEGIN
当月:=getINIFILESTRING('d:\商品.ini','pta','当月');
下月:=getINIFILESTRING('d:\商品.ini','pta','下月');
当月收:=CALLSTOCKEX(当月,vtclose,6,-1,5);
下月收:=CALLSTOCKEX(下月,vtclose,6,-1,5);
除权价差:=下月收-当月收;
end;
以上是个人的一点愚见,希望金字塔技术人员为用户着想,早日实现自动推送除权数据。祝金字塔越来越强大。