以文本方式查看主题

-  金字塔客服中心 - 专业程序化交易软件提供商  (http://www.weistock.com/bbs/index.asp)
--  金字塔软件问题提交  (http://www.weistock.com/bbs/list.asp?boardid=2)
----  一些无法解释的现象,还有什么方法查找问题原因?  (http://www.weistock.com/bbs/dispbbs.asp?boardid=2&id=98528)

--  作者:a141027
--  发布时间:2016/6/14 15:43:13
--  一些无法解释的现象,还有什么方法查找问题原因?
实盘交易不时碰到这样那样无法解释的问题,有些很难举证,因为没有规律,不常发生,监控变量值又是对的,你甚至无法查找问题,你总不能把所有变量在所有过程里的值的变化全部都输出到文件里一直监控吧?这里我列举一些这样的问题

1. 公式运行中,看指标当时应该有数个品种触发下单了但是没有任何动作,打开日志,每个周期都运行结束,没有信号发出。中止公式,过几秒再重新开始,公式立即全部触发下单了。把信号各个变量放进监控窗口里观察,又没有发现异常。怎解释?怎举证?怎解决?

2. 公式有时莫名其妙出现一些动作,当然了,不是很经常,偶有发生,不得已我在每个指令后都添加msgout,输出当时的变量值和时间值,发现有些条件判断本应通不过,但当时通过了,我把变量放上图表检查,一直都是0,不知道为什么判断可以通过。比如:

if islastbar then
begin
cond:=todaybar=1 or aa[barpos-1]=1;
if cond then
begin
tbuy...
msgout(1,\'todaybar:\'&numtostr(todaybar,0)&\'aa:\'&numtostr(aa[barpos-1],0)&\'time:\'&numtostr(time,0));
end;

出现问题后按照时间查找变量值,aa是个常用指标,计算简单没有什么复杂的引用,用于图表显示一直都用得很正常,该变量在图表上一直都是0,当时todaybar已经大于300了,但这个条件判断当时就通过了!我还怎么找问题?怎么解决问题?

我不是想要在这里发牢骚发泄,要是可以举证我也把问题的证据现在都列举出来便于解决,但又无法举证,总不能就这么样无视它吧,你们能有什么其他方法查找问题原因?盼指点一二。

--  作者:yukizzc
--  发布时间:2016/6/14 15:59:22
--  
没有信号发出,这种你可以用debugfile去做,如果代码不是很复杂,可以这么去做查证
debugfile(D:text);
if cond then
begin
tbuy();
debugfile(E:text);
end

类似这样,如果信号没执行那么e:text里面是没有输出项目的,如果的确如此那么肯定是cond条件没满足(不然if里面的两个内容不会都不触发)。
此时就看下条件外层的d:text里面记录是怎么样的。

--  作者:a141027
--  发布时间:2016/6/14 16:04:14
--  
您说这个我知道,它要是重复发生的问题就容易办多了,问题是它不经常发生,公式那么多地方,我总不能全部都用这个方法吧。
--  作者:yukizzc
--  发布时间:2016/6/14 16:38:35
--  
是不是一根k线报过单了,所以后面条件再次满足后不再保单,产生这种条件满足有输出变量都正常但是不下单的现象??
同一条语句在单根k内只会执行一次的。

这个如果不调试的话,只能灵光乍现一样想到一些可能的猜想然后在求证了

--  作者:a141027
--  发布时间:2016/6/14 16:48:44
--  
不是您上面说的那种情况。我是在调试,但对于这种不常出、偶尔发生的问题就不知怎么下手。
--  作者:王锋
--  发布时间:2016/6/14 17:35:42
--  

如果是软件BUG,那么一定会重复出现的


--  作者:a141027
--  发布时间:2016/6/22 18:27:31
--  
为了检查奇怪现象的问题原因,我最近在公式每个指令之后添加了msgout,每一个指令用一个唯一的编号标识,以便准确知道是哪个指令被触发,然后输出当时的变量值,并留下时间戳。昨日公式又出现一次奇怪的动作,这次我在当时的数据快照中找到了证据,快照应该能够证明这是个不应该出现的动作,为什么公式当时通过了条件判断?

以下是信号触发后msgout留下的记录
2016/06/21 09:35:17  XXXX/action2/volume:2/orderprice:694.50/time:133600
2016/06/21 09:35:17  XXXX/action2/volume:4/orderprice:702.00/time:133600
2016/06/21 09:35:17  XXXX/action2/aa:702.00/.../time:133600
2016/06/21 09:35:18  XXXX/action2/volume:2/orderprice:694.50/time:133600
2016/06/21 09:35:18  XXXX/action2/volume:4/orderprice:702.00/time:133600
2016/06/21 09:35:18  XXXX/action2/aa:702.00/.../time:133600

上面的记录显示,公式在17、18秒触发了编号为action2的系列指令,以下是该时段的交易日志
2016-06-21 09:35:17.856    【后台】XXXX TBuyShort 第 295 行出现信号
2016-06-21 09:35:17.872    【后台】XXXX TBuyShort 已成功触发下单操作 价格:694.500000 数量:2 类型:0 账户: 品种:XXXX
2016-06-21 09:35:17.872    【后台】下单已发送
2016-06-21 09:35:17.887    【后台】XXXX TBuyShort 第 295 行出现信号
2016-06-21 09:35:17.903    【后台】XXXX TBuyShort 已成功触发下单操作 价格:702.000000 数量:4 类型:0 账户: 品种:XXXX
2016-06-21 09:35:17.903    【后台】下单已发送
2016-06-21 09:35:17.919    【后台】XXXX 运行结束
2016-06-21 09:35:17.919    【下单】XXXX 价694.500000 量2 买卖1 类型0 开平0 账户xxxxxxxxxxxx Formula 1
2016-06-21 09:35:17.919    【下单】XXXX 价702.000000 量4 买卖1 类型0 开平0 账户xxxxxxxxxxxx Formula 1
2016-06-21 09:35:17.919    当前尚有未处理完事件 - 6021
2016-06-21 09:35:18.130    当前尚有未处理完事件 - 6012
2016-06-21 09:35:18.138    【回报】xxxxxxxxxxxx : XXXX - 正在申报 2 价格:694.5000 开仓 卖出
2016-06-21 09:35:18.457    【回报】xxxxxxxxxxxx : XXXX - 正在申报 4 价格:702.0000 开仓 卖出
2016-06-21 09:35:18.877    【后台】XXXX TBuyShort 第 295 行出现信号
2016-06-21 09:35:18.882    【后台】XXXX TBuyShort 已成功触发下单操作 价格:694.500000 数量:2 类型:0 账户: 品种:XXXX
2016-06-21 09:35:18.882    【后台】下单已发送
2016-06-21 09:35:18.907    【后台】XXXX TBuyShort 第 295 行出现信号
2016-06-21 09:35:18.911    【后台】XXXX TBuyShort 已成功触发下单操作 价格:702.000000 数量:4 类型:0 账户: 品种:XXXX
2016-06-21 09:35:18.916    【后台】下单已发送
2016-06-21 09:35:18.922    【后台】XXXX 运行结束
2016-06-21 09:35:18.924    【下单】XXXX 价694.500000 量2 买卖1 类型0 开平0 账户xxxxxxxxxxxx Formula 1
2016-06-21 09:35:18.929    【下单】XXXX 价702.000000 量4 买卖1 类型0 开平0 账户xxxxxxxxxxxx Formula 1
2016-06-21 09:35:18.934    当前尚有未处理完事件 - 6021
2016-06-21 09:35:19.126    当前尚有未处理完事件 - 6012
2016-06-21 09:35:19.143    【回报】xxxxxxxxxxxx : XXXX - 正在申报 2 价格:694.5000 开仓 卖出
2016-06-21 09:35:19.441    【回报】xxxxxxxxxxxx : XXXX - 正在申报 4 价格:702.0000 开仓 卖出

日志没有异常,与公式的指令一致。

以下是编号为action2的指令代码。
globalvariable:cc=15;
...
action2:=... and (aa-high)/mindiff<=cc and...;//省略部分全部都是and,没有or,因此这个条件必须通过才可能触发action2
if action2 then
begin
for j4a=1 to j4 do 
begin
tbuyshort(1,bb,lmt,j4b,0),allowrepeat;
msgout(1,stklabel&\'/action2\'&\'/volume:\'&numtostr(bb,0)&\'/orderprice:\'&numtostr(j4b,2)&\'/time:\'&numtostr(time,0)),allowrepeat;
end;
aa:=j4b;
msgout(1,stklabel&\'/action2\'&\'/aa:\'&numtostr(aa,2)&...&\'/time:\'&numtostr(time,0));
end;

公式固定1秒轮询。

msgout留下的记录可见,17秒执行完公式后,aa的值为702,时间133600的high是686.50(见下面附图),mindiff是0.5,因此(aa-high)/mindiff<=cc条件应该无法通过,为什么18秒可以通过?

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


上述问题出现没有规律性,公式一天交易大概10笔左右,一两个星期才出现一次奇怪的动作,也不是固定某个动作,每次都不同。请帮助找原因。谢谢。

--  作者:yukizzc
--  发布时间:2016/6/22 21:25:03
--  
你cc的值不变的吗?还有哪个品种,打开交易-合约信息设置
看下该品种的最小变动是否是0.5。
从这段输出只好看到aa是702,至于high无法确定是686.5的,就好比日线的最高价会是今天每一分钟的high吗?

如果您认为是条件不满足却通过,这种一定要其中可能变量都给输出才好确定。即使是k线数据,这种假设你当时网络或者程序运行卡住这种都会造成数据没有及时刷新


--  作者:a141027
--  发布时间:2016/6/22 21:45:22
--  
cc值不变,公式没有地方对它赋值。

mindiff也不会变的吧,我没改过里面的设置,再说公式绝大部分的指令都是对的,这说明这个变量也没问题。

至于high无法确定是686.5,你意思是当时分笔里可能有比它更高的值?

msgout输出了所有的变量的,我只是没有都贴出来,省略了,上面那个判断是关键,从数据看它的确是通不过啊。

--  作者:a141027
--  发布时间:2016/6/22 21:58:52
--  
我刚才看了那个品种的日线,当日最高价与分钟线的最高价是一样的,因此,可以排除分钟线低于日线最高价的可能。当日日线的最高价也就是688.5(见下图),就算用这个价,上面的条件也应该通不过的。

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