开拓者期货期权程序化系统交易论坛

标题: 利用全局变量也会出现重复发单的问题 [打印本页]

作者: jiushiceshi    时间: 2017-9-21 10:25:51     标题: 利用全局变量也会出现重复发单的问题

代码示例如下:
                if(GetGlobalVar(97) == 0 && con1   ){  
                        if(A_BuyPosition==0 ){
                                A_sendorder开仓
                        }
                        SetGlobalVar(97, 1);       
                }
按理只要进入第一个if,全局变量97应该已经被置1,但是实盘中还是有重复了2次的情况,记录的日志如下:
20170921        0.092939        20170921        0.0929        27921                空开        8678        10        成功:委托
20170921        0.092939        20170921        0.0929        27921                空开        8678        10        成功:委托
第一个时间戳是currenttime,第二个时间戳是time。
实盘中确实发送了两次委托,并且都成功了,TB的当日交易如下:
合同号                类型        状态        开平标志        数量        委托价格        委托时间        成交数量
30839289                卖出        全部成交        开仓        10        8678        2017/9/21 9:29        10
30839285                卖出        全部成交        开仓        10        8678        2017/9/21 9:29        10

请问为什么全局变量没有控制成功。另请问为什么time函数返回的不是毫秒级的时间戳。

谢谢


作者: 小米    时间: 2017-9-21 11:27:11

检查代码其它地方,是否有将97号全局变量给初始为0的语句
作者: jiushiceshi    时间: 2017-9-21 12:00:45

小米 发表于 2017-9-21 11:27
检查代码其它地方,是否有将97号全局变量给初始为0的语句

感谢回答。我确认代码里没有类似逻辑或者bug。

您的意思,本tick内,97确实会被置1,并且不会有延迟,是吧。

另请问,还有没有更保险的,避免重复发单的手段呢?

感谢。
作者: jiushiceshi    时间: 2017-9-21 12:05:36

小米 发表于 2017-9-21 11:27
检查代码其它地方,是否有将97号全局变量给初始为0的语句

全代码写操作97并置1的,的只有两处了:
        if(CurrentBar==0){
                SetGlobalVar(97, 0);
        }


        if(Time == 0.09 || time == 0.21){
                SetGlobalVar(97, 0);
        }

子函数里也没有。
作者: 小米    时间: 2017-9-21 15:34:47

jiushiceshi 发表于 2017-9-21 12:05
全代码写操作97并置1的,的只有两处了:
        if(CurrentBar==0){
                SetGlobalVar(97, 0);


什么周期的图表?con1是什么赋值 ?
作者: jiushiceshi    时间: 2017-9-21 16:37:22

小米 发表于 2017-9-21 15:34
什么周期的图表?con1是什么赋值 ?

1min的图表。
con1是  low<getglobalvar(98) && high>getglobalvar(98)
会有信号闪烁吗?但是触发一次后,97就被赋值了呀。
作者: 小米    时间: 2017-9-22 08:22:29

jiushiceshi 发表于 2017-9-21 16:37
1min的图表。
con1是  lowgetglobalvar(98)
会有信号闪烁吗?但是触发一次后,97就被赋值了呀。 ...

确定你所贴出来的示例代码是也是空开的条件与语句吗?
建议将空开中使用的全局变量也用fileappend打印日志出来看吧。。
有时你的贴出来的精简后的代码与你本身使用的逻辑可能有不同的地方。。就这些代码我们也没法帮您确定问题在哪里。。

但是A函数的重复发单 ,只可能与全局变量的控制不当有关啊。。
如果说你确认代码里没有bug,那您觉得问题会在哪里呢?
作者: jiushiceshi    时间: 2017-9-22 09:20:39

小米 发表于 2017-9-22 08:22
确定你所贴出来的示例代码是也是空开的条件与语句吗?
建议将空开中使用的全局变量也用fileappend打印日 ...

感谢回复。
我怀疑的是,97置1的操作,发生了延迟,导致下一个tick来到前,97还是0,所以触发了两次。

有这个可能吗。
作者: jiushiceshi    时间: 2017-9-22 09:26:05

小米 发表于 2017-9-22 08:22
确定你所贴出来的示例代码是也是空开的条件与语句吗?
建议将空开中使用的全局变量也用fileappend打印日 ...

按您说的,我在发送委托的日志里,加入了97的值得输出。
今天再观察下,有问题我再请教。
感谢。
作者: 小米    时间: 2017-9-22 10:06:49

jiushiceshi 发表于 2017-9-22 09:20
感谢回复。
我怀疑的是,97置1的操作,发生了延迟,导致下一个tick来到前,97还是0,所以触发了两次。

没有延迟置1的可能性。。
建议还是从置1后有没有其它语句再置0这个方向去排查吧。
作者: jiushiceshi    时间: 2017-9-25 10:11:25

小米 发表于 2017-9-22 10:06
没有延迟置1的可能性。。
建议还是从置1后有没有其它语句再置0这个方向去排查吧。 ...

又发生了开仓两次的情况,我排查了代码,确实没有97置1再置0的情况,还可能是什么问题呢?

20170925T093109 send order: 8763806 pp1801 卖开 10 8648.00000000 [A_SendOrder#aaa] [OrderRef=2]
20170925T093109 send order: 8763806 pp1801 卖开 10 8648.00000000 [A_SendOrder#aaa] [OrderRef=3]
作者: 小米    时间: 2017-9-25 10:51:58

jiushiceshi 发表于 2017-9-25 10:11
又发生了开仓两次的情况,我排查了代码,确实没有97置1再置0的情况,还可能是什么问题呢?

20170925T093 ...

建议卖开的代码,写日志,将所有判断的条件的值都要用日志记录下来。这样才好排查问题啊。
作者: jiushiceshi    时间: 2017-9-25 12:16:08

本帖最后由 jiushiceshi 于 2017-9-27 10:56 编辑
小米 发表于 2017-9-25 10:51
建议卖开的代码,写日志,将所有判断的条件的值都要用日志记录下来。这样才好排查问题啊。 ...




日志是在开仓函数的最后,也就是委托发送之后。可以看到,第二个委托发送时,97的值是1。因此我怀疑是发送第二个委托时,97还没有成功置1.
作者: jiushiceshi    时间: 2017-9-25 12:18:36

本帖最后由 jiushiceshi 于 2017-9-27 10:56 编辑
小米 发表于 2017-9-25 10:51
建议卖开的代码,写日志,将所有判断的条件的值都要用日志记录下来。这样才好排查问题啊。 ...



作者: jiushiceshi    时间: 2017-9-25 12:20:41

本帖最后由 jiushiceshi 于 2017-9-27 10:56 编辑
小米 发表于 2017-9-25 10:51
建议卖开的代码,写日志,将所有判断的条件的值都要用日志记录下来。这样才好排查问题啊。 ...



作者: 小米    时间: 2017-9-25 14:14:13

jiushiceshi 发表于 2017-9-25 12:20
开仓处代码如下:
                if(GetGlobalVar(97) == 0 && low =  GetGlobalVar(99)      ){  
                        if(A_BuyPositi ...
  1. if(GetGlobalVar(97) == 0 && low <= GetGlobalVar(99) && high >=  GetGlobalVar(99)      ){  
  2.                         if(A_BuyPosition==0 ){
  3.                                 ljg_actual_open(1, GetGlobalVar(99)+ljg_actual_chaojia("dk"), GetGlobalVar(96));
  4.                         }
  5.                         SetGlobalVar(97, 1);        
  6.                 }
复制代码
这段代码里,只要第一层条件满足了,无论是否开仓都会去将97号全局变量置为1的。。
你的日志是写在哪个位置的呢?
如果是写在setgloblavar(97,1)的后面,那很明显在第一条日志根本显示的为0 是不相符的,说明没有执行到set97的这步,或者是set97为1后又有其它的语句再次set97为0了。。
你给的代码都是片段的,我们不可能从您给出的部分代码看出问题在哪一块,只能自己去写日志,一步步进行排查啊。

作者: jiushiceshi    时间: 2017-9-26 00:27:02

本帖最后由 jiushiceshi 于 2017-9-27 10:56 编辑
小米 发表于 2017-9-25 14:14
这段代码里,只要第一层条件满足了,无论是否开仓都会去将97号全局变量置为1的。。
你的日志是写在哪个位 ...


日志记录在开仓函数actual_open里。
这是一个突破的策略,当价格达到99全局变量时,进入内部、开仓、记录日志,97置1。
日志中记录的第一条,97是0,第二条,97是1。

真的好奇怪,我看了多遍,给我的感觉,就是97赋值延迟了。。。。

作者: 小米    时间: 2017-9-26 09:01:32

jiushiceshi 发表于 2017-9-26 00:27
if(GetGlobalVar(97) == 0 && low =  GetGlobalVar(99)      ){  
                        if(A_BuyPosi ...

这个也不是凭感觉呀,且也不存在全局变量赋值延迟的可能性啊。。
你使用一个简单的代码去赋值 并写日志就可以清楚了。
你的日志写在ljg_actual_open里?但你的给97赋值 为1是在这个语句之后啊。。所以你当时写的第1条为0,是正常的表现吧?
或者建议您先不要使用自己写的函数,而直接使用TB自带的函数再将这个发单 --全局变量赋值的--写日志这个逻辑实现一下,再来看看结果呢?
作者: jiushiceshi    时间: 2017-9-26 09:23:30

小米 发表于 2017-9-26 09:01
这个也不是凭感觉呀,且也不存在全局变量赋值延迟的可能性啊。。
你使用一个简单的代码去赋值 并写日志就 ...

好吧。
第一条97是0,是正常的,然后发送委托了。
不正常的是第二个委托,当时的97是1,但是逻辑是,97为1时,不发送。




欢迎光临 开拓者期货期权程序化系统交易论坛 (http://bbs.tb18.net/) Powered by Discuz! X2