以文本方式查看主题

-  金字塔客服中心 - 专业程序化交易软件提供商  (http://weistock.com/bbs/index.asp)
--  金字塔软件问题提交  (http://weistock.com/bbs/list.asp?boardid=2)
----  奇怪:做空条件不成立,却有下单,但下单手数为0  (http://weistock.com/bbs/dispbbs.asp?boardid=2&id=8891)

--  作者:阿火
--  发布时间:2011/11/10 8:36:49
--  奇怪:做空条件不成立,却有下单,但下单手数为0

日志情况是这样,以下的日志从09:44 一直出现,直到10:11

2011-11-09 09:44:46.125    【后台】IF11 TBuyShort 出现信号
2011-11-09 09:44:46.125    【后台】IF11 TBuyShort 委托数量为0
2011-11-09 09:44:46.125    【后台】IF11 运行结束
2011-11-09 09:44:47.218    【后台】IF11 运行结束
2011-11-09 09:44:47.546    【后台】IF11 TBuyShort 出现信号
2011-11-09 09:44:47.562    【后台】IF11 TBuyShort 委托数量为0
2011-11-09 09:44:47.562    【后台】IF11 运行结束
2011-11-09 09:44:49.031    【后台】IF11 运行结束
……

……

2011-11-09 10:11:30.343    【后台】IF11 运行结束
2011-11-09 10:11:30.703    【后台】IF11 运行结束
2011-11-09 10:11:31.031    【后台】IF11 TBuyShort 出现信号
2011-11-09 10:11:31.046    【后台】IF11 TBuyShort 委托数量为0

 

下单语句是这样的:

kc:=abs(cc821888888)-sellhold;

if buyhold=0 and wt=0 and kc>0 and sellhold>=0 then begin//buyhold、sellhold、wt分别代表多头持仓、空头持仓、委托单数量

   tbuyshort(abb821888888 =tm,kc,mkt,0,0,\'821888888 \'),allowrepeat;
   tbuyshort(abb821888888 <=0,kc,lmt,dynainfo(21)-s*0.2,0,\'821888888 \'),allowrepeat;
   extgbdataset(\'abb821888888 \',1);
   debugfile(\'D:\\LOG\\821888888 .txt\',numtostr(cc821888888 ,0)+\'    开空    \'+numtostr(buyhold,0)+\'    \'+numtostr(sellhold,0)+\'    %.0f\',wt);

end

 

debugfile 输出的日志为(09:44——10:11,都是以下的样子):

2011-11-09 09:44:46.109    -8    开空    0    8    0
2011-11-09 09:44:47.546    -8    开空    0    8    0
……

2011-11-09 10:11:29.687    -8    开空    0    8    0
2011-11-09 10:11:31.031    -8    开空    0    8    0

 

也就是:buyhold=0、wt=0、sellhold>=0都成立,但kc=abs(-8)-8=0,并不符合“kc>0”的条件。但是会下单,这是什么原因?

难道是精度问题?

幸好tbuyshort(1,0,mkt),在手数为0时,并不表示满仓开空。呵呵

 

[此贴子已经被作者于2011-11-10 8:42:11编辑过]

--  作者:admin
--  发布时间:2011/11/10 8:41:51
--  
可能是精度问题,默认情况下的计算都是浮点的,浮点计算是有误差的,你下次可以试试与0比较时,将数值取整后再比较
--  作者:阿火
--  发布时间:2011/11/10 8:48:58
--  

那岂不是所有与0比较的变量都要取整?

比如以上条件中,buyhold=0 ,可能buyhold=0.00001 。wt也可能是 0.00001 或者 0.999999 ,都要取整?

 

也就是,如果比较的2个量 如果可能很接近的话,都要考虑精度问题

 

我最经常用的 if holding=0 and buycond then buy(1,1,limitr,c); 这里的holding需要取整吗

[此贴子已经被作者于2011-11-10 8:51:59编辑过]

--  作者:admin
--  发布时间:2011/11/10 8:56:17
--  
if holding=0 等是不需要的,因为holding返回的数值本身就是整数,与0判断要取整主要是经过数值计算后的数据
--  作者:fly
--  发布时间:2011/11/10 8:57:50
--  
本地还从来未遇到过HOLDING和0比较时会出现这种现象,个人认为holding不需要取整,得出的也都是正确的.
--  作者:阿火
--  发布时间:2011/11/10 9:12:56
--  

恩。holding应该不用

 

不过想想,还是有点不明白

sellhold:=tbuyholding(AC,stklabel,N) 这个可能出现浮点数吗,还是一定是整数?

cc821888888的整个计算过程都是整数计算,应该一直都是整数吧。

cc821888888的计算过程是: 引用其它3个模型的holding ,分别为cc1、cc2、cc3,然后乘以系数

即:cc821888888:=2*cc1 + 3*cc2 +1*cc3 ;

 

cc821888888和sellhold ,这2个变量,谁搞的鬼。把它揪出来


--  作者:董小球
--  发布时间:2011/11/10 21:05:10
--  
哈哈 这个问题只能哥来解决了,回想下上学时,有没有印象老师一般都讲过一个极端情况,那就是0=0 成立,0>0成立,0<0也成立,忘记是中学还是大学的微积分那部分了,反正我稍微有点这个印象,不知是不是这个问题~~
--  作者:董小球
--  发布时间:2011/11/10 21:16:41
--  
另外,我觉得这个判断可以修改成为KC>=1 来代替=0,肯定可以避免这种状况,我总感觉1和0在电脑世界代表的意义太多了
--  作者:阿火
--  发布时间:2011/11/10 22:15:49
--  

球哥真幽默

 

KC>=1会不会变成 0.999999>=1 不成立啊

 

看来只能这样,用kc>0.5 ,这样肯定没问题

[此贴子已经被作者于2011-11-10 22:18:23编辑过]