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

标题: 如何复核A函数取帐户持仓是否正确 [打印本页]

作者: laofu602    时间: 2016-7-24 11:48:18     标题: 如何复核A函数取帐户持仓是否正确

本帖最后由 laofu602 于 2016-7-24 13:15 编辑

昨天的实盘交易时,有一个品种在有前日持仓的情况下,又莫名其妙多发一次买单,经反复检查后,确认程序本身没有问题,重复发单问题很可能出在某一时刻,柜台传来的帐户信息有误,导致A_BuyPosition取持仓为0,从而再发买单。

为避免再出类似情况,有必要设立一个持仓复核机制,开仓后单独做个记录,平仓后清零。每次系统判断开仓条件时,要将A_BuyPosition与持仓记录作比较,一致时方允许开仓,不一致时发警告,提示人工检查。
现在就是怎么作这个记录,有点迷糊,采用全局变量肯定不行,因为昨持仓有可能因为重起程序等被清零,考虑采用FileAppend建立一个文档,可是怎么再把文档读出来呢?或者各位有其他什么好的思路办法,望赐教.

作者: tlxmkgld2013    时间: 2016-7-24 14:34:20

不是有监控器吗?就是判断行情信号和实际持仓是不是相同的
作者: laofu602    时间: 2016-7-25 06:12:42

A函数写的代码没有图表信号,监控器用不了.
作者: wwr_5817    时间: 2016-7-25 08:56:38

TB机制:最后Bar首Tick按BarStatus==1自动执行一遍程序。这种多一单,无法避免,除非BarStatus==1时的下单手数极大而废单!
作者: 小米    时间: 2016-7-25 09:34:31

帐户函数是读取本地的数据信息。。
如果不是在刚下单且成交回报还没有及时回到本地前,只有数据库损坏这个可能性会导致读取持仓出错。
但这个可能性的概率并不高,建议还是从判断条件上进去排查问题。
可以将下单条件的代码贴 出来,大家帮你看一下是否能找到重复发单 的问题原因所在。
作者: laofu602    时间: 2016-7-25 18:11:50

小米 发表于 2016-7-25 09:34
帐户函数是读取本地的数据信息。。
如果不是在刚下单且成交回报还没有及时回到本地前,只有数据库损坏这个 ...

我正在跑一个日线组合,有10来个品种,基本策略就是当日最新价突破昨日高点就立即开仓。基本都有持仓,而且运行多日都正常。出现重复发单的品种是RU1609,在上周三(7月20日)开仓,周四上午开盘后不久行情又突破昨日高点,期间多次超越昨日高点,程序运行很正常。直到11:03分,突然又发一次买单。从分钟图看,当时行情已经从高点在向下回落,当然也有符合最新价大于昨日最高价的时候,这个买单发的的确让人莫名其妙。附开仓部分代码如下:

Begin

        qC = c[1];
        qH = h[1];
        qL = l[1];
        wtpyl= offSet*MinMove*PriceScale;        //委托偏移量

//-------------------始化全局变量-----------------------------       
        if ( BarStatus==0 )
    {
                HasSendbuy = 0;        //委托发送标志,0无委托 1 已委托
                HasSendsell = 0;
                HasSendSellShort = 0;
                HasSendBuyToCover = 0;
                SetGlobalVar(1,HasSendbuy);        //设置为第二个全局变量
                SetGlobalVar(2,HasSendsell);
                SetGlobalVar(3,HasSendSellShort);
                SetGlobalVar(4,HasSendBuyToCover);

    }

//--------------------实时交易---------------------------
        If(!CallAuctionFilter()) Return;        //等待开盘
        IF (BarStatus==2&&AccountDataExist==True )//实时交易
        {
        HasSendbuy = GetGlobalVar(1);//取前一Tick全局变量值
                HasSendsell = GetGlobalVar(2);
                HasSendSellShort = GetGlobalVar(3);
                HasSendBuyToCover = GetGlobalVar(4);

                bidPosition = A_BuyPosition;//多头持仓数量
                sellbPosition=        A_SellPosition;//空头持仓数量
               
                //----------------------做多------------------------------       
                if (bidPosition==0&&HasSendbuy==0&&Q_Last>qH)//开多
                {
                        A_SendOrder(Enum_Buy,Enum_Entry,jyss,Min(Q_UpperLimit,Q_AskPrice+wtpyl));
                        HasSendbuy = 1;//开仓后,禁止重复发单
                        SetGlobalVar(1,HasSendbuy);
                        HasSendsell = 0;//开仓后,允许平仓
                        SetGlobalVar(2,HasSendsell);
                }


作者: laofu602    时间: 2016-7-25 18:20:46

本帖最后由 laofu602 于 2016-7-25 18:26 编辑

开仓条件就三个,一是最新价大于前K最高价,二是全局变量HasSendbuy 为0,代表没有开过多仓,三就是bidPosition为0,代表没有持多仓。

那天早上重启了程序,HasSendbuy 肯定被清零了,只能靠变量bidPosition来控制了,结果。。。
作者: ego90289698    时间: 2016-7-27 15:07:57

laofu602 发表于 2016-7-25 18:11
我正在跑一个日线组合,有10来个品种,基本策略就是当日最新价突破昨日高点就立即开仓。基本都有持仓,而 ...

你把2个Q函数直接改成close试试
作者: laofu602    时间: 2016-7-28 15:41:51

ego90289698 发表于 2016-7-27 15:07
你把2个Q函数直接改成close试试


实时行情中,我觉得CLOSE应该等同于Q_Last吧?
作者: superwin    时间: 2016-7-28 18:32:45

使用TB自带的数据库记录就不会担心重启清零了,参考SetTBProfileString、GetTBProfileString用法,类似A_BuyPosition在实盘过程中,确实试过有可能获取到错误值,增加A_BuyPosition==InvalidNumeric判断可以减少发生的几率,当然,最好还是开仓后把手数记录到数据库。
作者: piero66    时间: 2016-7-28 23:46:28

laofu602 发表于 2016-7-25 18:11
我正在跑一个日线组合,有10来个品种,基本策略就是当日最新价突破昨日高点就立即开仓。基本都有持仓,而 ...

初始化全局变量那一段,不是每次都会被重新执行一次?这样每次全局变量都是0?我遇到这个问题了。怎么保证初始化那一段只在第一次被调用啊?
作者: laofu602    时间: 2016-7-29 16:52:45

superwin 发表于 2016-7-28 18:32
使用TB自带的数据库记录就不会担心重启清零了,参考SetTBProfileString、GetTBProfileString用法,类似A_Bu ...

看文档SetTBProfileString、GetTBProfileString是保存在内存里的数据库,那么重启软件后会不会被清零?
作者: laofu602    时间: 2016-7-29 16:56:27

本帖最后由 laofu602 于 2016-7-30 04:23 编辑
piero66 发表于 2016-7-28 23:46
初始化全局变量那一段,不是每次都会被重新执行一次?这样每次全局变量都是0?我遇到这个问题了。怎么保 ...


每个Tick程序会从头到尾运行一次,全局变量当然会被清零,应该是在新的Tick到来后,从定义参数开始运行,运行到定义变量那里,全局变量就被初始化了(一般默认值为0),但随后运行到GetGlobalVar(),又把全局变量恢复了。我前面那段代码中的初始化全局变量,只是在打开超级图表程序刚开始运行时,在第一个BAR那里进行初始赋值,随后那段代码应该在每个Tick到来后都会跳过不会再被运行。
作者: superwin    时间: 2016-7-29 21:46:58

laofu602 发表于 2016-7-29 16:52
看文档SetTBProfileString、GetTBProfileString是保存在内存里的数据库,那么重启软件后会不会被清零? ...

这个数据库会写到硬盘上的,所以不会丢失,对了,顺便说一下,这个是基于旗舰版V5是这样的,如果用的极速版,不清楚是不是这样的规则,需要自己验证。
作者: laofu602    时间: 2016-7-30 04:26:59

本帖最后由 laofu602 于 2016-7-30 05:01 编辑
superwin 发表于 2016-7-29 21:46
这个数据库会写到硬盘上的,所以不会丢失,对了,顺便说一下,这个是基于旗舰版V5是这样的,如果用的极速 ...


非常感谢你的回答,这样就能解决我的问题了。

我的初步思路是,在启动超级图表自动运行后,第一时间读取一次帐户持仓数据并保存,随后就由开平仓操作来改变数据库内容。每次开仓前,把数据库相应数据与A_BuyPosition进行比较,二者一致时方允许开仓。当然具体写代码时还要处理许多细节问题,例如人工干预以后的处理办法等等。


作者: laofu602    时间: 2016-7-30 04:39:48

本帖最后由 laofu602 于 2016-7-30 04:43 编辑
小米 发表于 2016-7-25 09:34
帐户函数是读取本地的数据信息。。
如果不是在刚下单且成交回报还没有及时回到本地前,只有数据库损坏这个 ...


请问小米版主,你说“帐户函数是读取本地的数据信息。。”,我在程序文件夹里找了一下,是保存在“ctpdata\XXXX_用户账号\db”这个地方吗?
TB处理CTP数据的运行机制是实时写入硬盘相关文件,还是保存在内存里,定时或关机前才写入硬盘?
ctpdata这个文件夹里的CTP相关文件我们用户允许提取使用吗?如果允许的话应该采用什么方法?
作者: TB20140603    时间: 2016-7-30 07:47:28

脑残的设计,脑残的设计,脑残的设计,读取本地数据有什么意义?这个问题要根本解决,就得直接读取实时接收的数据,读取不到就无效值,这样加无效值判断才有意义。这个问题就是交易系统与账户信息实时互动的问题,你们让交易系统与交易系统自己生成的(本地)数据玩儿,呵呵,呵呵,呵呵。。。。
作者: laofu602    时间: 2016-8-1 07:20:15

本帖最后由 laofu602 于 2016-8-1 07:29 编辑

按照前面的思路,写了一个简单的测试代码,今天挂上模拟帐户用分钟线试试,但人工干预后该如何处理还没有想好方案。把代码发在下面,提请大家提提建议,如能帮忙测试一下就更好了。
  1. //------------------------------------------------------------------------
  2. // 简称: test3
  3. // 名称:
  4. // 类别: 公式应用
  5. // 类型: 用户应用
  6. //------------------------------------------------------------------------

  7. Params
  8.         Numeric        jyss(0);                //固定手数下单数量
  9.     Numeric        offSet(10);                //委托价格偏移跳数,为了保证成交


  10. Vars
  11.         Numeric        qC;
  12.         Numeric        qH;
  13.         Numeric        qL;
  14.     Numeric        HasSendbuy(0);        //发送buy标志
  15.     Numeric        HasSendsell(0);        //发送sell标志
  16.     Numeric        HasSendSellShort(0);//发送 SellShort标志
  17.     Numeric        HasSendBuyToCover(0);//发送BuyToCover标志
  18.         Numeric        wtpyl;        //委托偏移量
  19.         Numeric TickCount;//Tick计数器
  20.         Numeric NumValue;

  21. Begin

  22.         qH = h[1];
  23.         qL = l[1];
  24.         wtpyl= offSet*MinMove*PriceScale;        //委托偏移量
  25.        
  26.        
  27.        
  28.         //-------------------始化全局变量-----------------------------       
  29.                 if ( BarStatus==0 )
  30.                 {
  31.                         TickCount =0;
  32.                         HasSendbuy = 0;       
  33.                         HasSendsell = 0;
  34.                         HasSendSellShort = 0;
  35.                         HasSendBuyToCover = 0;

  36.                         SetGlobalVar(0,TickCount);        //设置为第一个全局变量
  37.                         SetGlobalVar(1,HasSendbuy);
  38.                         SetGlobalVar(2,HasSendsell);
  39.                         SetGlobalVar(3,HasSendSellShort);
  40.                         SetGlobalVar(4,HasSendBuyToCover);

  41.                 }
  42.         //--------------------实时交易---------------------------
  43.                 If(!CallAuctionFilter()) Return;        //等待开盘
  44.                 IF (BarStatus==2&&AccountDataExist==True )//实时交易
  45.                 {
  46.                         TickCount = GetGlobalVar(0);//取前一Tick全局变量值
  47.                         HasSendbuy = GetGlobalVar(1);
  48.                         HasSendsell = GetGlobalVar(2);
  49.                         HasSendSellShort = GetGlobalVar(3);
  50.                         HasSendBuyToCover = GetGlobalVar(4);
  51.                        
  52.                         if         (A_BuyPosition==InvalidNumeric)//检测账户持仓数据是否有效
  53.                         {
  54.                                 Alert("帐户多头持仓数据无效,检查原因!");
  55.                                 Return;
  56.                         }
  57.                         if         (A_SellPosition==InvalidNumeric)
  58.                         {
  59.                                 Alert("帐户空头持仓数据无效,检查原因!");
  60.                                 Return;
  61.                         }

  62.                         TickCount =TickCount+1;
  63.                         SetGlobalVar(0,TickCount);
  64.                         if (TickCount==1)//第一个tick把帐户持仓数据更新到数据库
  65.                         {
  66.                                 SetTBProfileString("TotalPosition",Symbol,Text(A_TotalPosition));
  67.                         }

  68.                         NumValue =Value(GetTBProfileString("TotalPosition",Symbol));//取数据库持仓数据
  69.                         if (NumValue<>A_TotalPosition)                                                                //与最新柜台数据比较
  70.                         {
  71.                                 Alert("账户持仓本地记录与柜台数据不符,检查原因!");
  72.                                 Return;
  73.                         }
  74.                         //----------------------做多------------------------------       
  75.                         if (A_BuyPosition==0&&HasSendbuy==0&&Q_Last>qH)//开多
  76.                         {
  77.                                 SetTBProfileString("TotalPosition",Symbol,Text(jyss));//开多手数记录到数据库
  78.                                 A_SendOrder(Enum_Buy,Enum_Entry,jyss,Min(Q_UpperLimit,Q_AskPrice+wtpyl));
  79.                                 HasSendbuy = 1;//开仓后,禁止重复发单
  80.                                 SetGlobalVar(1,HasSendbuy);
  81.                                 HasSendsell = 0;//开仓后,允许平仓
  82.                                 SetGlobalVar(2,HasSendsell);
  83.                         }
  84.                         if (A_BuyPosition>0&&HasSendsell==0&&Q_Last<qL )//跌破前低平多
  85.                         {
  86.                                 SetTBProfileString("TotalPosition",Symbol,Text(A_BuyPosition));//平多手数记录到数据库
  87.                                 A_SendOrder(Enum_Sell,Enum_Exit,A_BuyPosition,Max(Q_LowerLimit,Q_BidPrice-wtpyl));
  88.                                 HasSendsell = 1;
  89.                                 SetGlobalVar(2,HasSendsell);
  90.                                 HasSendbuy = 0;//平仓后允许开多仓
  91.                                 SetGlobalVar(1,HasSendbuy);
  92.                                
  93.                         }

  94.         //-------------------------放空-------------------------------
  95.                        
  96.                         if (A_SellPosition==0&&HasSendSellShort==0&&Q_Last<qL)//开空
  97.                         {
  98.                                 SetTBProfileString("TotalPosition",Symbol,Text(-1*jyss));//开空手数记录到数据库
  99.                                 A_SendOrder(Enum_Sell,Enum_Entry,jyss,Max(Q_LowerLimit,Q_BidPrice-wtpyl));
  100.                                 HasSendSellShort = 1;
  101.                                 SetGlobalVar(3,HasSendSellShort);
  102.                                 HasSendBuyToCover = 0;
  103.                                 SetGlobalVar(4,HasSendBuyToCover);
  104.                                
  105.                         }
  106.                         if (A_SellPosition>0&&HasSendBuyToCover==0&&Q_Last>qH )//超越前高平空
  107.                         {
  108.                                 SetTBProfileString("TotalPosition",Symbol,Text(-1*A_SellPosition));//平空手数记录到数据库
  109.                                 A_SendOrder(Enum_buy,Enum_Exit,A_SellPosition,Min(Q_UpperLimit,Q_AskPrice+wtpyl));
  110.                                 HasSendBuyToCover = 1;
  111.                                 SetGlobalVar(4,HasSendBuyToCover);
  112.                                 HasSendSellShort = 0;
  113.                                 SetGlobalVar(3,HasSendSellShort);
  114.                         }
  115.                 }

  116. End

  117. //------------------------------------------------------------------------
  118. // 编译版本        GS2015.12.25
  119. // 用户版本        2016/08/01 06:59:50
  120. // 版权所有        laofu602
  121. // 更改声明        TradeBlazer Software保留对TradeBlazer平台
  122. //                        每一版本的TradeBlazer公式修改和重写的权利
  123. //------------------------------------------------------------------------
复制代码

作者: TB20140603    时间: 2016-8-1 08:26:54

TB用户真累啊,弄得函数不能直接用,还得拐弯抹角的用,持续关注中。。
作者: TB20140603    时间: 2016-8-1 08:47:48

建议楼主用 SetTBProfileString2File 和 GetTBProfileString2File 函数记录数据到TB以外的目录,这样如果TB崩溃运行不了,可以直接彻底删除重装,不用考虑备份数据问题。
作者: 小米    时间: 2016-8-1 08:56:33

TB20140603 发表于 2016-7-30 07:47
脑残的设计,脑残的设计,脑残的设计,读取本地数据有什么意义?这个问题要根本解决,就得直接读取实时接收 ...

我想你是理解有错了。。
所谓的取本地数据是指TB有一个进程叫做数据中心。。软件程序里所有需要的数据都是从这里取,
而数据中心里的数据当然是实时更新的呀,只要帐户的任何的变化,都会从交易所第一时间将所有的数据信息取到本地,无论你用还是不用这些信息,都是准备好的。。
待到有指令需要用到这些信息时,用相应的函数去取就好了。
每一个指令,都一个数据如果都是在需要用时再向交易所去取,这样不会花更多的时间吗????
为什么要在根本就不了解的情况就用一些侮辱性的词语来做判断呢???真心搞不懂。

作者: TB20140603    时间: 2016-8-1 09:19:22

小米 发表于 2016-8-1 08:56
我想你是理解有错了。。
所谓的取本地数据是指TB有一个进程叫做数据中心。。软件程序里所有需要的数据都 ...

抱歉,是我没弄明白,不过不这样你或许不会搭理我们,甚至懒得解释。论坛好多问题都没有回复,遇到问题搜索到的多是不了了之。。。
作者: 小米    时间: 2016-8-1 10:30:40

TB20140603 发表于 2016-8-1 09:19
抱歉,是我没弄明白,不过不这样你或许不会搭理我们,甚至懒得解释。论坛好多问题都没有回复,遇到问题搜 ...


我不搭理?懒得解释?
麻烦您看了论坛再说话,摸着良心再说话。。。
在您这样说话后,我还真是不想搭理了呢。。
作者: 小米    时间: 2016-8-1 10:33:41

laofu602 发表于 2016-7-30 04:39
请问小米版主,你说“帐户函数是读取本地的数据信息。。”,我在程序文件夹里找了一下,是保存在“ctpdat ...

我不确实这些信息是存放在哪个文件位置的,据我所知,也并非在某个文件下,而是多个文件协作下的。
是写内存与写硬盘对于交易者的使用来说,有什么关系呢?
CTPDATA您是要提取什么呢?可使用的部分都是在软件界面上以及公式应用里来实现了,完全没有必要去提取层底数据文件呀。
作者: TB20140603    时间: 2016-8-1 11:11:37

小米 发表于 2016-8-1 10:30
我不搭理?懒得解释?
麻烦您看了论坛再说话,摸着良心再说话。。。
在您这样说话后,我还真是不想搭理 ...

我不知道你回复过多少问题,但我22号一个帖子就没人回复,如果我就发了这么一个帖子,对我来说就是100%没人搭理不是吗?http://bbs.tb18.net/thread-111631-1-1.html
作者: 小米    时间: 2016-8-1 11:20:05

TB20140603 发表于 2016-8-1 11:11
我不知道你回复过多少问题,但我22号一个帖子就没人回复,如果我就发了这么一个帖子,对我来说就是100%没 ...

22日开始我休假,工作十年了第一次休假,不过份吧?于您而言,是100%没有回复,确切地说那一周我也是100%地没有做任何的回复。
您可以质问我为什么不回复。而不是一来就说不搭理,懒得解释的这样的话。
论坛上没有及时回复,可以电话咨询或是QQ联系在线客服的呀。。
TB的服务通道并非只有论坛一个。
作者: TB20140603    时间: 2016-8-1 11:28:19

不过份,您休假也应该,但我并不知道您休假啊。我也并不是真对你个人,只是你回应我前面帖子而已,公司就你一人在论坛工作吗?如果是那您真是辛苦了。。
作者: laofu602    时间: 2016-8-1 20:22:35

小米 发表于 2016-8-1 10:33
我不确实这些信息是存放在哪个文件位置的,据我所知,也并非在某个文件下,而是多个文件协作下的。
是写 ...

嗯,关于这个问题,是我考虑的太多了,主要一直想着要把信息保存在硬盘上,这样才可靠的思维,所以才有那么多问题想搞明白。
其实你前面说的对,持仓信息出错的概率是很小的,那么在系统开始运行的时候做个记录,随后与实时帐户信息进行比较,预防一下基本上不会出现的错误,就已经足够了,没必要花费大量的资源在这个上面,搞得太复杂太完善。
作者: laofu602    时间: 2016-8-1 20:28:13

本帖最后由 laofu602 于 2016-8-1 20:34 编辑
TB20140603 发表于 2016-8-1 08:47
建议楼主用 SetTBProfileString2File 和 GetTBProfileString2File 函数记录数据到TB以外的目录,这样如果TB ...


今天专门中途把电脑关机重启一次,再次启动软件后,数据库的数据仍然存在,证明肯定是存在了硬盘某个文件中了,至于TB存在什么地方我们大可不必追根究底,能为我所用就可以了。

至于系统崩溃和解决本贴的问题其实没什么关系,本贴所要解决的是偶尔出现的帐户持仓数据出错的问题,很可能下个Tick就恢复正常了。只要保证在出现这种错误的情况下,不要重复发单即可。
作者: superwin    时间: 2016-8-1 21:05:22

laofu602 发表于 2016-8-1 20:28
今天专门中途把电脑关机重启一次,再次启动软件后,数据库的数据仍然存在,证明肯定是存在了硬盘某个文件 ...

TB自带的数据库在什么地方我倒是可以告诉你,因为我每隔一个星期就会拷贝一份出来备份,以防万一,虽然那么久也没出过什么问题,但是拷贝一份也还是求个安心吧,毕竟实盘是白花花的银子。

V4的是在data文件夹里的Config.db这个文件是数据库文件,V5是在cache这个文件夹里的ConfigFile这个文件。
作者: superwin    时间: 2016-8-1 21:13:07

对我来说,这个数据库不止存放仓位那么简单,还是各种交易数据,跨图表、跨周期数据,所以,定期备份还是比较好的,虽然没出过错(仅限V4.5.2和V5.3.X版)。
作者: laofu602    时间: 2016-8-1 22:46:05

superwin 发表于 2016-8-1 21:05
TB自带的数据库在什么地方我倒是可以告诉你,因为我每隔一个星期就会拷贝一份出来备份,以防万一,虽然那 ...

非常感谢前辈的无私分享,以后肯定有用到这个文件的时候。
作者: TB20140603    时间: 2016-8-2 10:16:32

小米 发表于 2016-8-1 08:56
我想你是理解有错了。。
所谓的取本地数据是指TB有一个进程叫做数据中心。。软件程序里所有需要的数据都 ...

想不明白,用户用不到的数据你们取来干嘛?而然后再去本地数据取,这不是多倒一次手吗,速度会比直接取自交易所的快吗?关键是这样倒手个人觉得只会增加不稳定,如果直接取,取不到就无效值,这多简单高效啊。
作者: superwin    时间: 2016-8-2 11:46:22

TB20140603 发表于 2016-8-2 10:16
想不明白,用户用不到的数据你们取来干嘛?而然后再去本地数据取,这不是多倒一次手吗,速度会比直接取自 ...

这有什么好喷的,你看看快期、博易大师、文华这些软件,哪个不是先把数据缓存到本地然后再给程序调用的,难道那些软件的程序员都没你聪明,他们都是傻?
作者: TB20140603    时间: 2016-8-2 11:55:25

superwin 发表于 2016-8-2 11:46
这有什么好喷的,你看看快期、博易大师、文华这些软件,哪个不是先把数据缓存到本地然后再给程序调用的, ...

什么叫喷啊,我只是自己想不明白,你如果知道可以给解释一下,我感谢你!
作者: superwin    时间: 2016-8-2 12:03:39

TB20140603 发表于 2016-8-2 11:55
什么叫喷啊,我只是自己想不明白,你如果知道可以给解释一下,我感谢你! ...

缓存到本地的原因,跟你想的恰恰相反,就是为了增加稳定性,网络有可能波动,可能丢包……验证后的数据缓存到本地,就是为了解决这个不稳定性的。
作者: TB20140603    时间: 2016-8-2 13:06:08

谢谢,有点明白了,为了解决网络不稳定问题,但如果真的网络不稳定,发单都是问题,恐怕这种方法也是徒劳。我没有冒犯谁的意思,只是个人想法而已,论坛不就是给大家交流学习的地方吗,如果前面有得罪各位的,还请多多包涵。。
作者: laofu602    时间: 2016-9-4 20:44:35

本帖最后由 laofu602 于 2016-9-4 20:51 编辑

在程序中加入附后一段监控代码,经过近一个月的实盘运行,确认TB的实时持仓数据,在帐户有持仓的时候,偶尔会出现0持仓的错误,有时2~3天,有时4~5天,会出现一次,品种、时间都是随机的。
特此反馈给米版主,看看开发人员能否找找问题所在。

NumValue =Value(GetTBProfileString("TotalPosition_Day",Symbol));
                        if (NumValue<>A_TotalPosition)
                        {
                                Alert("账户持仓本地记录与柜台数据不符,检查原因!");
                                FileAppend("D:\\Average_Test.txt",Text(100*CurrentTime)+"  "+Symbol+
                                        "  账户持仓本地记录与柜台数据不符,A_TotalPosition_Day  = "+Text(A_TotalPosition)+"  本地记录 = "+Text(NumValue)  );
                                Return;
                        }


注:数据库的值每天开盘前会重新刷新一下,盘中若有买卖也会实时更新。
作者: superwin    时间: 2016-9-4 21:43:48

laofu602 发表于 2016-9-4 20:44
在程序中加入附后一段监控代码,经过近一个月的实盘运行,确认TB的实时持仓数据,在帐户有持仓的时候,偶尔 ...

这个问题我怀疑跟期货公司柜台返回的数据有关,但是这个问题自己也很好解决,加一两个TICK验证即可,因为错的时候只会是0,而不会是其他数量(至少目前我没发现过),也就是说,要么是0,要么是正确持仓,这样用个全局变量做个计数器,如果是0,那就下一个TICK再查一次,还是0,就操作,操作完,计数器复位,如果不是0,计数器复位。

对了,我发现CTP的柜台出错的时间通常都是开盘一瞬间,而恒生柜台跟你的一样,是随机时间。
作者: superwin    时间: 2016-9-4 21:49:14

laofu602 发表于 2016-9-4 20:44
在程序中加入附后一段监控代码,经过近一个月的实盘运行,确认TB的实时持仓数据,在帐户有持仓的时候,偶尔 ...

可惜,就算开发人员找到原因,也与旗舰版无缘了,已经在多个群里听到管理员说旗舰版已经被终结了。好好的保时捷不做了,去做众泰。
作者: laofu602    时间: 2016-9-4 22:04:47

本帖最后由 laofu602 于 2016-9-4 22:07 编辑
superwin 发表于 2016-9-4 21:43
这个问题我怀疑跟期货公司柜台返回的数据有关,但是这个问题自己也很好解决,加一两个TICK验证即可,因为 ...


我连接的是CTP柜台,出现错误的时刻都不是开盘后,上午,下午,夜盘都有。

我没有用其它验证手段,只在最后用RETURN终止后续代码运行,只要下个Tick持仓数据正确,即会跳过这一段代码。现在观察到的情况是偶尔有一个Tick出错,随后就正常了。

如果不加监控,就会出现本贴开头出现的情况,所以监控是必须的,提醒各位网友注意。
作者: superwin    时间: 2016-9-4 22:20:48

laofu602 发表于 2016-9-4 22:04
我连接的是CTP柜台,出现错误的时刻都不是开盘后,上午,下午,夜盘都有。

我没有用其它验证手段,只在最后 ...

那就真有可能是期货公司柜台问题了,因为我CTP的账号确实只有开盘试过有持仓为0出现。

其实就偶尔的一个TICK是错误而已,如果是0就下个tick操作,不是0就即时操作,这样是为了防止有其它软件或者人工干预平仓等情况出现。

比如说,你数据库记录了10手,你A函数读取是0手,你就return,如果这个确实是因为返回数据错为0,那是没什么问题,如果是你真实账户被其它软件或者人工平仓了,其实真实账户确实是0手了,那你对不上数据库记录,就一直return,那就有问题了。

但是假如加一个TICK验证,就不会有这样的问题了,第一个TICK是0,不操作,第二个TICK还是0,那就更新数据库记录,还可以第二个TICK不是0,然后手数对比,更新数据库。

我弄这么多验证,其实是懒,不想远程连到服务器去看,我想通过程序自己去匹配回正确的值。没办法,懒癌晚期
作者: TB20140603    时间: 2016-9-8 22:01:57

用极速版试试,我感觉比老TB强多了,就冲行情直连就值得换掉老TB了。交易也直连就更猛了!哈哈!!!
作者: uniwin    时间: 2016-9-12 12:18:26

隔夜清0的问题,呵呵,是个坑,,。。。




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