您现在的位置:程序化交易>> 期货公式>> 交易开拓者(TB)>> 开拓者知识>>正文内容

TB持仓信号和真实账户持仓不同步的调整模块 [开拓者 TB]

  • 咨询内容: 本人开发了一套策略,历史数据回测什么都很好,接下来要做到计算机自动交易。现在万里长征还差最后一步,就是TB持仓信号和真实账户持仓不同步的调整模块,由于都是A_函数只有在实时行情的时候才能测试,从上周到现在花了好几个交易日,也改了好几次代码但还是有重复发单或者持仓不足等情况,今天收盘后针对发生的问题又改进了一下,也不知道明天能不能顺利通过。心里没底所以把这部分代码公开出来,希望管理员或有自动交易实盘经验的高手指点一下。

    If((BarInterval==1 And Time!=0.1514) Or (BarInterval==5 And Time!=0.1510) Or (BarInterval==15 And Time!=0.1500))
    {
            TickCnt1=15;        //等待TickCnt1次后如不成交采取相应措施
           
            If(GetGlobalVar(2)==InvalidNumeric)                        //对全局变量初始赋值(包括意外网络中断、账户断开等情况后的初始化赋值)
            {
                    SetGlobalVar(2,0);
            }
           
            If(MarketPosition==1)
            {
                    If(OrderWaitCounts!=TickCnt1 And A_GetOpenOrderCount==0)        //没有未成交委托单时计数器归零
                    {
                            SetGlobalVar(2,0);
                    }
                           
                    If(A_BuyPosition>0)
                    {
                            If(A_BuyPosition>Abs(CurrentContracts))                                //真实账户相对TB信号有多余持仓
                            {
                                    If(A_GetOpenOrderCount!=0)
                                    {
                                            OrderWaitCounts=GetGlobalVar(2)+1;                        //计数器记录未成交委托单存在的Tick数
                                            SetGlobalVar(2,OrderWaitCounts);
                                    }else if(A_GetOpenOrderCount==0 And GetGlobalVar(2)==0)                //没有委托单时直接发单平掉多余持仓
                                    {
                                            A_SendOrder(Enum_Sell,Enum_Exit,A_BuyPosition-Abs(CurrentContracts),Q_BidPrice);
                                            SetGlobalVar(2,0);
                                    }
                                   
                                    If(OrderWaitCounts==TickCnt1)                                        //如果委托单持续TickCnt1个Tick数后仍没成交
                                    {
                                            A_DeleteOrder();                                                        //撤所有委托单
                                            A_SendOrder(Enum_Sell,Enum_Exit,A_BuyPosition-Abs(CurrentContracts),Q_BidPrice);        //重新发单平掉多余持仓
                                            SetGlobalVar(2,0);                                                        //重置全局变量
                                    }
                            }else if(A_BuyPosition<Abs(CurrentContracts))
                            {
                                    If(A_GetOpenOrderCount!=0)
                                    {
                                            OrderWaitCounts=GetGlobalVar(2)+1;                        //计数器记录未成交委托单存在的Tick数
                                            SetGlobalVar(2,OrderWaitCounts);
                                    }else if(A_GetOpenOrderCount==0 And GetGlobalVar(2)==0)
                                    {
                                            A_SendOrder(Enum_Buy,Enum_Entry,Abs(CurrentContracts)-A_BuyPosition,Q_AskPrice);
                                            SetGlobalVar(2,0);
                                    }
                                   
                                    If(OrderWaitCounts==TickCnt1)
                                    {
                                            A_DeleteOrder();
                                            A_SendOrder(Enum_Buy,Enum_Entry,Abs(CurrentContracts)-A_BuyPosition,Q_AskPrice);
                                            SetGlobalVar(2,0);
                                    }
                            }else if(A_BuyPosition==Abs(CurrentContracts))                //真实账户和TB信号持仓同步的时候
                            {
                                    If(A_GetOpenOrderCount!=0)                                                //如果还有未成交委托单全部撤单,重置全局变量
                                    {
                                            A_DeleteOrder();
                                            SetGlobalVar(2,0);
                                    }else if(GetGlobalVar(2)!=0)
                                    {
                                            SetGlobalVar(2,0);
                                    }
                            }
                    }else if(A_SellPosition>0)
                    {
                            If(A_GetOpenOrderCount!=0)
                            {
                                    OrderWaitCounts=GetGlobalVar(2)+1;
                                    SetGlobalVar(2,OrderWaitCounts);
                            }else if(A_GetOpenOrderCount==0 And GetGlobalVar(2)==0)
                            {
                                    A_SendOrder(Enum_Buy,Enum_Exit,A_SellPosition,Q_AskPrice);
                                    SetGlobalVar(2,0);
                            }
                                   
                            If(OrderWaitCounts==TickCnt1)
                            {
                                    A_DeleteOrder();
                                    A_SendOrder(Enum_Buy,Enum_Exit,A_SellPosition,Q_AskPrice);
                                    SetGlobalVar(2,0);
                            }
                    }else if(A_BuyPosition==0 And A_SellPosition==0)
                    {
                            If(A_GetOpenOrderCount!=0)
                            {
                                    OrderWaitCounts=GetGlobalVar(2)+1;
                                    SetGlobalVar(2,OrderWaitCounts);
                            }else if(A_GetOpenOrderCount==0 And GetGlobalVar(2)==0)
                            {
                                    A_SendOrder(Enum_Buy,Enum_Entry,Abs(CurrentContracts),Q_AskPrice);
                                    SetGlobalVar(2,0);
                            }
                                   
                            If(OrderWaitCounts==TickCnt1)
                            {
                                    A_DeleteOrder();
                                    A_SendOrder(Enum_Buy,Enum_Entry,Abs(CurrentContracts),Q_AskPrice);
                                    SetGlobalVar(2,0);
                            }
                    }
            }else if(MarketPosition==-1)
            {
                    If(OrderWaitCounts!=TickCnt1 And A_GetOpenOrderCount==0)                //没有未成交委托单时计数器归零
                    {
                            SetGlobalVar(2,0);
                    }
                           
                    If(A_BuyPosition>0)
                    {
                            If(A_GetOpenOrderCount!=0)
                            {
                                    OrderWaitCounts=GetGlobalVar(2)+1;
                                    SetGlobalVar(2,OrderWaitCounts);
                            }else if(A_GetOpenOrderCount==0 And GetGlobalVar(2)==0)
                            {
                                    A_SendOrder(Enum_Sell,Enum_Exit,A_BuyPosition,Q_BidPrice);
                                    SetGlobalVar(2,0);
                            }
                                   
                            If(OrderWaitCounts==TickCnt1)
                            {
                                    A_DeleteOrder();
                                    A_SendOrder(Enum_Sell,Enum_Exit,A_BuyPosition,Q_BidPrice);
                                    SetGlobalVar(2,0);
                            }
                    }else if(A_SellPosition>0)
                    {
                            If(A_SellPosition>Abs(CurrentContracts))
                            {
                                    If(A_GetOpenOrderCount!=0)
                                    {
                                            OrderWaitCounts=GetGlobalVar(2)+1;                        //计数器记录未成交委托单存在的Tick数
                                            SetGlobalVar(2,OrderWaitCounts);
                                    }else if(A_GetOpenOrderCount==0 And GetGlobalVar(2)==0)
                                    {
                                            A_SendOrder(Enum_Buy,Enum_Exit,A_SellPosition-Abs(CurrentContracts),Q_AskPrice);
                                            SetGlobalVar(2,0);
                                    }
                                   
                                    If(OrderWaitCounts==TickCnt1)
                                    {
                                            A_DeleteOrder();
                                            A_SendOrder(Enum_Buy,Enum_Exit,A_SellPosition-Abs(CurrentContracts),Q_AskPrice);
                                            SetGlobalVar(2,0);
                                    }
                            }else if(A_SellPosition<Abs(CurrentContracts))
                            {
                                    If(A_GetOpenOrderCount!=0)
                                    {
                                            OrderWaitCounts=GetGlobalVar(2)+1;                        //计数器记录未成交委托单存在的Tick数
                                            SetGlobalVar(2,OrderWaitCounts);
                                    }else if(A_GetOpenOrderCount==0 And GetGlobalVar(2)==0)
                                    {
                                            A_SendOrder(Enum_Sell,Enum_Entry,Abs(CurrentContracts)-A_SellPosition,Q_BidPrice);
                                            SetGlobalVar(2,0);
                                    }
                                   
                                    If(OrderWaitCounts==TickCnt1)
                                    {
                                            A_DeleteOrder();
                                            A_SendOrder(Enum_Sell,Enum_Entry,Abs(CurrentContracts)-A_SellPosition,Q_BidPrice);
                                            SetGlobalVar(2,0);
                                    }
                            }else if(A_SellPosition==Abs(CurrentContracts))
                            {
                                    If(A_GetOpenOrderCount!=0)
                                    {
                                            A_DeleteOrder();
                                            SetGlobalVar(2,0);
                                    }else if(GetGlobalVar(2)!=0)
                                    {
                                            SetGlobalVar(2,0);
                                    }
                            }
                    }else if(A_BuyPosition==0 And A_SellPosition==0)
                    {
                            If(A_GetOpenOrderCount!=0)
                            {
                                    OrderWaitCounts=GetGlobalVar(2)+1;
                                    SetGlobalVar(2,OrderWaitCounts);
                            }else if(A_GetOpenOrderCount==0 And GetGlobalVar(2)==0)
                            {
                                    A_SendOrder(Enum_Sell,Enum_Entry,Abs(CurrentContracts),Q_BidPrice);
                                    SetGlobalVar(2,0);
                            }
                                   
                            If(OrderWaitCounts==TickCnt1)
                            {
                                    A_DeleteOrder();
                                    A_SendOrder(Enum_Sell,Enum_Entry,Abs(CurrentContracts),Q_BidPrice);
                                    SetGlobalVar(2,0);
                            }
                    }
            }else if(MarketPosition==0)
            {
                    If(OrderWaitCounts!=TickCnt1 And A_GetOpenOrderCount==0)                //没有未成交委托单时计数器归零
                    {
                            SetGlobalVar(2,0);
                    }
                           
                    If(A_BuyPosition>0)
                    {
                            If(A_GetOpenOrderCount!=0)
                            {
                                    OrderWaitCounts=GetGlobalVar(2)+1;
                                    SetGlobalVar(2,OrderWaitCounts);
                            }else if(A_GetOpenOrderCount==0 And GetGlobalVar(2)==0)
                            {
                                    A_SendOrder(Enum_Sell,Enum_Exit,A_BuyPosition,Q_BidPrice);
                                    SetGlobalVar(2,0);
                            }
                                   
                            If(OrderWaitCounts==TickCnt1)
                            {
                                    A_DeleteOrder();
                                    A_SendOrder(Enum_Sell,Enum_Exit,A_BuyPosition,Q_BidPrice);
                                    SetGlobalVar(2,0);
                            }
                    }else if(A_SellPosition>0)
                    {
                            If(A_GetOpenOrderCount!=0)
                            {
                                    OrderWaitCounts=GetGlobalVar(2)+1;
                                    SetGlobalVar(2,OrderWaitCounts);
                            }else if(A_GetOpenOrderCount==0 And GetGlobalVar(2)==0)
                            {
                                    A_SendOrder(Enum_Buy,Enum_Exit,A_SellPosition,Q_AskPrice);
                                    SetGlobalVar(2,0);
                            }
                                   
                            If(OrderWaitCounts==TickCnt1)
                            {
                                    A_DeleteOrder();
                                    A_SendOrder(Enum_Buy,Enum_Exit,A_SellPosition,Q_AskPrice);
                                    SetGlobalVar(2,0);
                            }
                    }else if(A_BuyPosition==0 And A_SellPosition==0)
                    {
                            If(A_GetOpenOrderCount!=0)
                            {
                                    A_DeleteOrder();
                                    SetGlobalVar(2,0);
                            }else if(GetGlobalVar(2)!=0)
                            {
                                    SetGlobalVar(2,0);
                            }
                    }
            }
    }

    前面部分在MarketPosition==1情况下做了些注释,后面逻辑是一致的。基本思路就是发觉TB信号与实际持仓不一致的时候,先检查是不是已有委托单(可能是其他模块用Buy Sell命令发送的),如果已有委托单等待TickCnt1时间,如果该时间后没有成交则撤单用A_SendOrder发送。同时继续用OrderWaitCounts记录委托单发出未成的时间,如果过了TickCnt1时间还是没成交,继续撤单重发,直至实际持仓与TB信号同步。同步后检查是否还有未成交的委托单,如果有全部撤单并重置全局变量。

    不同步的问题测试起来实在很麻烦,所以恳请高手回复,看看以上代码有无逻辑错误,会不会导致重复发单或其他问题。多谢了,加急!!!

     

  • TB技术人员: 不是有数据回放吗?可以多试试的现在,以前没有回放的时候我也很纠结。。。

     

  • TB客服: 回放只显示行情,对实际账户持仓测试没用的

     

  • 网友回复: 额,好吧,忘记自己没用A函数了。。

     

  • 网友回复: 今天实时行情继续测试中,问题比之前少了些,不过还是有很多警告,而且都是连续发出的警告,持仓不足、资金不足和相应委托不能撤销这三类都有。我分析了一下代码,选前一段一起看一下:
    If(A_BuyPosition>0)
                    {
                            If(A_BuyPosition>Abs(CurrentContracts))                                //真实账户相对TB信号有多余持仓
                            {
                                    If(A_GetOpenOrderCount!=0)
                                    {
                                            OrderWaitCounts=GetGlobalVar(2)+1;                        //计数器记录未成交委托单存在的Tick数
                                            SetGlobalVar(2,OrderWaitCounts);
                                    }else if(A_GetOpenOrderCount==0 And GetGlobalVar(2)==0)                //没有委托单时直接发单平掉多余持仓
                                    {
                                            A_SendOrder(Enum_Sell,Enum_Exit,A_BuyPosition-Abs(CurrentContracts),Q_BidPrice);
                                            SetGlobalVar(2,0);
                                    }
                                   
                                    If(OrderWaitCounts==TickCnt1)                                        //如果委托单持续TickCnt1个Tick数后仍没成交
                                    {
                                            A_DeleteOrder();                                                        //撤所有委托单
                                            A_SendOrder(Enum_Sell,Enum_Exit,A_BuyPosition-Abs(CurrentContracts),Q_BidPrice);        //重新发单平掉多余持仓
                                            SetGlobalVar(2,0);                                                        //重置全局变量
                                    }
                            }

    我估计问题出在
    If(OrderWaitCounts==TickCnt1)                                        //如果委托单持续TickCnt1个Tick数后仍没成交
                                    {
                                            A_DeleteOrder();                                                        //撤所有委托单
                                            A_SendOrder(Enum_Sell,Enum_Exit,A_BuyPosition-Abs(CurrentContracts),Q_BidPrice);        //重新发单平掉多余持仓
                                            SetGlobalVar(2,0);                                                        //重置全局变量
                                    }
    这段里,因为里面有撤销委托操作和发单操作,如果是开仓单频繁发单就会导致资金不足警告,如果是平仓单就会导致持仓不足警告。我设计的思路是当OrderWaitCounts==TickCnt1的时候只要求发送一次,因为发送完全局变量就被重置为0了,这样即使不成交再进入该条件OrderWaitCounts又要重新开始计数等待,如果等到TickCnt1时再撤单重发。但实际情况是这段代码并没有只发送一次,还是频繁在发送,百思不其解,请管理员或诸位高手帮忙解答,谢谢了!

 

有思路,想编写各种指标公式,程序化交易模型,选股公式,预警公式的朋友

可联系技术人员 QQ: 262069696  点击在线交流进行 有偿 编写!不贵!点击查看价格!


【字体: 】【打印文章】【查看评论

相关文章

    没有相关内容