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

标题: 疑似TB数据中心问题 [打印本页]

作者: TRANS-AM    时间: 2013-2-13 16:55:14     标题: 疑似TB数据中心问题

本帖最后由 TRANS-AM 于 2013-2-28 00:53 编辑

问题已解决
作者: 帅牛    时间: 2013-2-13 22:49:57

这种情况我在模拟交易多次遇到,问题出在TB回报延迟,亦即后台(交易柜台)已经成交,但是结果不能正常反馈到客户端,导致客户端重复发单,这个问题在用户的客户端程序中无解!希望TB公司能彻底根治这个顽疾 否则实盘中可能导致客户爆仓。。。
作者: lmxy202    时间: 2013-2-17 17:47:22

看起来你是虽然用全局变量控制下单,但出现这种情况时仍然每个tick都会促发下单动作,你可以在下单前先check一下有没有未成交单,如果有,就先撤掉未成交单,只有在没有未成交单的情况下才下单,这样出现这种情况就只下一次单,然后每个tick可能只会下撤单的指令
作者: 小米    时间: 2013-2-22 15:45:52

TRANS-AM 发表于 2013-2-22 15:28
今天实盘又出现了一次重复发单,挂在同一个软件账号下的模拟盘反而是正常的,实盘到交易服务器延迟是0,模 ...

首先,你所说的听到声音,TB看不到成交,而其它软件能看到。这个是成交回报的情况。可以据体说一下是哪个公司的帐号吗?是否是恒生的柜台??

其次,使用a_sendorder发单 ,仅用A_GetOpenOrderCount==0以及持仓数等来判断是肯定不够的。在报单回报没有回到本地前,再来行情就有可能触发再次委托 。所以,使用a_sendorder要使用全局变量配合控制发单 。
F1帮助文档的策略进阶里有相关的模板,可以参考一下。
作者: 小米    时间: 2013-2-22 23:03:35

TRANS-AM 发表于 2013-2-22 19:51
首先感谢管理员回答,全局变量SetGlobalVar肯定是有的,这是写A函数第一点要做的事情,不然A函数不可能模 ...

恒生接口,是会偶有成交回报不及时的问题,退出重登录不仍不行的话,可致电公司。

不太清楚你的全局变量控制20个tick计数是用于什么?或者方便的话将发单 这一段代码贴一下。
作者: 小米    时间: 2013-2-23 00:56:22

TRANS-AM 发表于 2013-2-22 23:27
Params
        Numeric OrderTicks(20);
Vars


这样的写法,在20个TICK后,委托单的状态仍不能回到本地,就会再发单了。
换一个控制方法吧。恒生柜台以及模拟帐户联通线路都偶有状态不能及时回到本地的情况发生。从而导致控制不住
作者: 帅牛    时间: 2013-2-23 18:22:24

我之前说过,这个“回报延迟”的问题在用户客户端程序中无解!好比无法去证明公理一样。这个问题既和用户的程序无关,也和用户的网络环境无关(假使不是因为网络太慢,换句话说,即使用户的网络环境延迟是0,这个问题依旧存在)。

请TB同仁相信大家的能力,尤其是已经用过TB几个月,并动手写过数千行TB程序的人,断不会不知道通过全局变量来控制重复发单问题。并不是出了什么问题缺省就怀疑客户的程序是否写得有问题。

回到这个问题,我第一次发现重复发单,也猜测是不是自己程序有什么问题。尝试过无数的方法,最终发现是TB的机制问题 -- 即可能出现后台成交了,但无法正常将成交信息返回到客户端,从而导致重复发单。

我再来梳理下思路:在所有TB的函数中,A_GetOpenOrderCount(有无未成交的委托单)是最重要的函数,只有通过它(注意是“只有”),才能判断是否开仓或平仓成功。但现在的问题是,客户端程序开仓后,在A_GetOpenOrderCount==0时,持仓数却可以为0,这在逻辑上是矛盾的,从而会导致重复发单。而重复发单的问题,TB会按照客户当前最大资金量开仓,一旦行情瞬间逆转,而且幅度很大,直接爆仓。。。!!比如股指期货模拟交易,100万资金量,TB经常能开7个单。这点想到实盘我就害怕。

和TB公司电话、网络沟通过多次,希望TB公司能彻底解决这个问题。即为什么开仓成功了,客户端却无法获知?(再次说明,这和网络无关)从理论上讲,不应该出现这个问题。问题根源还是在TB客户端底层通讯上!希望TB资深研发同事看下TB Datacenter底层代码。早日彻底解决这个问题。

写了这么多,是帮助TB同事深刻认识到这个问题的严重性,而无半点责骂抱怨之意,我是希望一辈子在TB这条大船上啊。。,衷心希望TB公司茁壮发展!

谢谢!!


帅牛
2013.2.23

作者: 小米    时间: 2013-2-24 09:45:34

TRANS-AM 发表于 2013-2-23 09:22
求指点思路,换什么控制方法比较好,感谢小米

可参考F1策略进阶里的方法,只要发过委托就改变全局变量的值以控制同一条件下只发单 一次。
作者: 小米    时间: 2013-2-24 10:38:59

帅牛 发表于 2013-2-23 18:22
我之前说过,这个“回报延迟”的问题在用户客户端程序中无解!好比无法去证明公理一样。这个问题既和用户的 ...


谢谢您对TB的支持与理解,也谢谢您给出的建议,我会转交开发人员的。

首先,我们从来没有怀疑或是说过大家对编程不懂或不精通这样的话。如果在我以往的回复言辞中表现出这样的意思,那我向您道歉。

在客户以往的问题中,我常常是根据自己的经验来给出回复的。当然,所谓我的经验,仍有不对的地方。有发现不对的,我过后也会回贴说明自己的错误之处。当然,如果大家发现了也可以给我指出。谢谢。
就拿这个贴子来说。我从头到尾并没有说过楼主没有编写公式的的能力。无非是指出我认为可能导致问题的地方。先强调使用全局变量这一点没有错吧??在楼主说有全局变量了我要求看这部分的代码,这一点上应该也没有错吧? 在看完楼主的代码之后,我也没有说楼主的代码有误过吧?相反,我个人认为楼主的这个20tick的控制的想法很有新意,是值得我学习的。同时,我有说到,在因为恒生柜台接口的特殊性,才建议楼主换其它的控制方法。这一点上,应该也没有错吧?

我们再来讨论一下a_getopenordercount.  此函数表示的是帐户里当前合约的“已报”状态的单子。只有委托单 提交到了交易所,没有成交,才返回到本地为“已报”状态 。并不是一下委托 ,本地就有一个a_getopenorder>0的。一个委托单从客户端提交,通过网络到达柜台 ,交易所,得到状态再返回到客户端,这一过程都是需要一定时间 的,无论客户端本地的延迟是否为0,并不能保证一个tick之内一定可以返回到本地的。如果不能保证,就那必然需要全局变量来控制同一条件下的委托只下一次。那么由此,“在A_GetOpenOrderCount==0时,持仓数却可以为0”这句应该不矛盾吧。。。

有关恒生偶尔的状态回报慢或不回报的问题,我们与恒生的工作人员沟通过多次仍无果。目前暂时的处理方法只能客户发现情况,我通知我们,我们再转达期货公司技术人员去处理服务器。
模拟柜台,目前只架在电信线路上,联通上是通过一前置机转发,当遇到前置机出错或是南北互通不好时,使用联通的模拟帐户就会表现为登录帐号困难或是成效交回报慢。
此问题,技术人员已经在想办法改进中。谢谢!

作者: 小米    时间: 2013-2-24 12:55:14

TRANS-AM 发表于 2013-2-24 12:44
因为要在公式里实现很多功能,比如发单以后,不成交怎么处理(A_DeleteOrder等等),部分成交怎么处理, ...


我有强调同一个条件下只发一单 ,并非指一个交易只发一单 就完事。如需加仓等,需要另外的处理了。
现在你所提到的不止开仓,还有不成交的处理等,这些问题确实是成交状态回不来等会引发的一系列问题。但目前来说回报的问题涉及接口,并非TB公司单方面可以解决。建议或者换一个柜台的帐号吧。

进阶里的写法主要是判断了HasSendOrder ==0时放可发单 ,一旦有发单动作就赋值为1.这里的判断都与成交回报无关。我没太懂这样如何与状态回报有关?


作者: 小米    时间: 2013-2-24 19:18:26

TRANS-AM 发表于 2013-2-24 13:28
是的,是HasSendOrder,但是里面有tempPos = Data0.A_BuyPosition();If(tempPos > 0)这样的写法,当A_Buy ...


我们参考F1进阶,是想要它的控制方式,而不必要去照搬它的条件。
进阶里例子里的的条件是有读帐户信息,是有可能因为回报问题而取值不对。但是您不需要去看这个条件,您需要提看它的控制方式 。。。。。
全局变量在完成一个交易 的控制后,难道不可以通过代码来重置吗???一定要关掉公式才可以吗???
F1里的模板不是完整的代码,只是说了控制的这一部分,并没有将整个交易所需要的全部环节都例了代码,就好比它只有平仓没有开仓一样,总不能说还要得手工去开仓才行吧。。。

If(getglobalvar(0) == invalidnumeric)
    {   
        SetGlobalVar(0,0);
    }
    if(barstatus==2)
    {
         if( 开仓条件  && a_buyposition==0 && getglobalvar(0)==0)
          {
                a_sendorder(enum_buy,enum_entry,lots,price);
                setglobalvar(0,1);
          }
          if(a_buyposition>0) //或者在平仓动作时重置全局变量
          {
               setglobalvar(0,0);
         }
    }



作者: 小米    时间: 2013-2-24 19:35:54

成交回报有问题的,对使用a_xxxx肯定会有影响。前面我指出的换一个控制方法也只不过是可以控制不重复发单而已。
想要不换交易系统的情况下且从根本解决问题估计就只能是换一个柜台的交易帐号。建议换金士达的


作者: 小米    时间: 2013-2-24 21:34:27

TRANS-AM 发表于 2013-2-24 20:37
金仕达是不是会比恒生好很多,我现在担心换成金仕达,会不会也出现这个问题,按你们技术人员 ...


以您没有说出柜台前,我先询问了是否恒生柜台,后面也有强调恒生柜台接口原因会偶有成交回报不能及时返回的问题。
若金士达接口也有此问题,我的建议不是瞎扯淡嘛。只要网络稳定或本地数据不堵塞,无此问题。
测试一下。
作者: 帅牛    时间: 2013-2-25 05:30:21

小米 发表于 2013-2-24 10:38
谢谢您对TB的支持与理解,也谢谢您给出的建议,我会转交开发人员的。

首先,我们从来没有怀疑或是说过大 ...

谢谢小米周末加班忘我工作,我为TB公司有这样称职的员工倍感放心。

关于成交回报延迟的问题,的确极其严重,关键是无法在客户端程序中解决(真的是无解啊!),否则我不会赘述这么多话。

小米,不知道你是否明白我说的“如果TB软件不做调整,客户端任何程序都无解”这句话的意思?无论是延迟20个Tick,还是延迟10分钟,只要后台柜台出现延迟回报问题,在客户端是无法捕获的,必然存在重复发单问题。无论是模拟交易还是实盘,只要TB通讯机制不调整,这个问题永远存在。

其实要彻底解决这个回报延迟和重复发单问题并不难,只要TB公司将底层通讯稍作调整即可,即但凡客户端发出A_SendOrder开仓指令后,必须等到后台得到明确回应,否则再次发送A_SendOrder开仓指令无效。


再次感谢小米!


帅牛
2013.2.25

作者: 帅牛    时间: 2013-2-25 05:44:22

小米 发表于 2013-2-24 09:45
可参考F1策略进阶里的方法,只要发过委托就改变全局变量的值以控制同一条件下只发单 一次。 ...

小米:“可参考F1策略进阶里的方法,只要发过委托就改变全局变量的值以控制同一条件下只发单 一次”,貌似可以解决重复发单,其实是不行的!!因为发出开仓指令后,如果不能得到明确是否成交的信息,那么将无法撤单。

很多品种抖动很大,不是一开仓就能成功,通常的做法都是发出开仓指令后,延迟多少时间去check是否还有未成交的委托单,如果还有就得撤单,然后再次开仓。

按照你的这个建议,一旦存在回报延迟,如果后台不成交,那么永远也无法再开仓,必然错失很多行情,因此不是根本解决之道。


作者: 帅牛    时间: 2013-2-25 05:53:09

小米 发表于 2013-2-24 19:18
我们参考F1进阶,是想要它的控制方式,而不必要去照搬它的条件。
进阶里例子里的的条件是有读帐户信息, ...

小米,梳理下你的案例code:

If(getglobalvar(0) == invalidnumeric)
    {   
        SetGlobalVar(0,0);
    }
    if(barstatus==2)
    {
         if( 开仓条件  && a_buyposition==0 && getglobalvar(0)==0)
          {
                a_sendorder(enum_buy,enum_entry,lots,price);
                setglobalvar(0,1);
          }
          if(a_buyposition>0) //或者在平仓动作时重置全局变量
          {
               setglobalvar(0,0);
         }
    }

上面的code核心思想是发出开仓指令后,设置一个全局变量,除非检测到持仓数发生变化,否则不调整全局变量状态,从而不能再次开仓。问题是:一旦出现回报延迟问题,持仓数为0,全局变量状态永远不会变,进而永远无法再次开仓啊(除非退出TB程序重进)!那一旦开仓失败(即因为行情剧烈发展,即使增加了N多滑点也未成交),如何撤单?如何再次开仓呢?

作者: TRANS-AM    时间: 2013-2-25 07:10:52

另外问个题外话,TB的官方邮箱还是admin@TradeBlazer.net吗?域名改tb18.net了,原来的TradeBlazer.net的邮箱不知道是否还有效
作者: 小米    时间: 2013-2-25 09:38:44

帅牛 发表于 2013-2-25 05:53
小米,梳理下你的案例code:

If(getglobalvar(0) == invalidnumeric)

关于恒生柜台成交回报的问题,我想本贴的文字中,我已经讲明白了,这里不再重复。
关于此例子,我在本贴里也多次提到是控制不做重复的发单 ,并没有说是解决根本问题。我想前面也讲清楚了吧。
对于此问题,我个人并不觉得自己的回复有错误的。
如果说一定要证明小米是错的才算此问题的完结。那好吧,小米错了。
作者: 帅牛    时间: 2013-2-25 09:47:35

小米 发表于 2013-2-25 09:38
关于恒生柜台成交回报的问题,我想本贴的文字中,我已经讲明白了,这里不再重复。
关于此例子,我在本贴 ...

晕。。, 小米同学 你可能搞错意思了 我是谈这个问题 和你的回复对错无关!

希望您将大家的建议反馈到TB研发同事,看能不能从TB底层程序fix这个bug?

谢谢!

作者: 小米    时间: 2013-2-25 09:55:40

TRANS-AM 发表于 2013-2-25 07:10
另外问个题外话,TB的官方邮箱还是吗?域名改tb18.net了,原来的TradeBlazer.net的邮箱不知道是否还有效 ...

此邮箱目前仍可用的。
作者: 小米    时间: 2013-2-25 10:08:15

帅牛 发表于 2013-2-25 09:47
晕。。, 小米同学 你可能搞错意思了 我是谈这个问题 和你的回复对错无关!

希望您将大家的建议反馈到TB ...

是否底层bug这个,我前面也有讲过,不再重复。




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