估计很多后台交易者都是采用TBUYHOLDING和TSELLHOLDING提取实际持仓数量来实现后台持仓同步吧,使用中发现账号断线重连状况下,有时候TBUYHOLDING、TSELLHOLDING的提取值为零,导致程序对实际持仓判断有误而又开一次仓。我看了orderlog纪录,持仓同步的下单有时在登录前,有的在登录后。无论在前再后,时间很接近,有两点不明白请大家解惑:
(1)账号登录后下单,说明登录后TBUYHOLDING、TSELLHOLDING的值判断为零,而执行了持仓同步。那么账号登录后一瞬间TBUYHOLDING、TSELLHOLDING的提取值可能有误。
(2)账号登录前下单,这点奇怪了,账号没登录,怎么会执行开平仓操作?
注:用的模拟盘,后台1秒轮询,账号时有断线重连现象,发现有此问题。
1.日志贴出来看下。包含账户登录时间以及下单等信息
2.账户在断开后TBUYHOLDING等账户函数返回时0 。这个是网络问题没有好的方式,你可以在策略中中加一个条件,通过判断账户ID是否正常等录看下。
TACCOUNT(1)
[此贴子已经被作者于2017/5/11 11:57:59编辑过]
怎么判断账户ID是否正常登录?上述持仓同步,我已经用
TACCOUNT(1)>0来限定。
你这种无理环境问题造成的,想通过技术类的方式解决很费劲。
TBUYHOLDING、TSELLHOLDING在策略中,
首先策略自己本身执行到TBUYHOLDING、TSELLHOLDING该函数才能去读取仓位(内存中保留的仓位信息),其次,等录账户后,其次账户的持仓从柜台获取持仓等信息,也要在登录时向柜台发送请求。柜台响应后推送给客户端处理,
两个因素,并且两个因素之间是并行关系。
[此贴子已经被作者于2017/5/11 14:21:37编辑过]
这个不好做,本身账户断开一个月几次的概率,还要配合上你正好在断开时候去发出信号。。。。
如果要持仓同步就是用阿火那个模板
老大,不是正好断开时候去发出信号。就借用阿火模板解释一下:cc:=holding;
if holding>0 and c<ref(c,1) then sell(1,1,market);
if holding<0 and c>ref(c,1) then sellshort(1,1,market);
if holding=0 and c>ref(c,1) then buy(1,1,market);
if holding=0 and c<ref(c,1) then buyshort(1,1,market);
if not(islastbar) or workmode<>1 then exit;
tm:=30;//撤单时间
ac:='800988';//下单账户
wt:=tremainqty(0,ac,stklabel);
buyhold:=tbuyholdingex(ac,stklabel,1);
sellhold:=tsellholdingex(ac,stklabel,1);
if wt>0.5 and tsubmit(0)>tm then tcancelex(1,0,ac,stklabel);//如果用软件自带的撤单功能,这句删除。
if wt<0.5 then begin
kc1:=max(cc,0)-buyhold;
kc2:=abs(min(cc,0))-sellhold;
if kc1<-0.5 then tsell(1,abs(kc1),mkt,0,0,ac),allowrepeat;
if kc2<-0.5 then tsellshort(1,abs(kc2),mkt,0,0,ac),allowrepeat;
if sellhold<0.5 and kc1>0.5 then tbuy(1,kc1,mkt,0,0,ac),allowrepeat;
if buyhold<0.5 and kc2>0.5 then
tbuyshort(1,kc2,mkt,0,0,ac),allowrepeat;
end
如果账户断线后再登录,第一次执行到
buyhold:=tbuyholdingex(ac,stklabel,1);
sellhold:=tsellholdingex(ac,stklabel,1);是不是有可能柜台未返回正确值而等于0??如果是,那么显然下面代码会修正仓位,导致再一次开仓:
if kc1<-0.5 then tsell(1,abs(kc1),mkt,0,0,ac),allowrepeat;
if kc2<-0.5 then tsellshort(1,abs(kc2),mkt,0,0,ac),allowrepeat;
if sellhold<0.5 and kc1>0.5 then tbuy(1,kc1,mkt,0,0,ac),allowrepeat;
if buyhold<0.5 and kc2>0.5 then tbuyshort(1,kc2,mkt,0,0,ac),allowrepeat;
end
如果上述分析是对的,是不是可以这样:提取实际持仓后等待几秒,等收到柜台回报再执行开仓代码。
那你开仓代码加一个如果账户资金是大于0的条件不就好了
这样你返回0,也不会执行下面的开仓程序了