大伊人青草狠狠久久-大伊香蕉精品视频在线-大伊香蕉精品一区视频在线-大伊香蕉在线精品不卡视频-大伊香蕉在线精品视频75-大伊香蕉在线精品视频人碰人

您現在的位置:程序化交易>> 期貨公式>> 交易開拓者(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  點擊在線交流進行 有償 編寫!不貴!點擊查看價格!


【字體: 】【打印文章】【查看評論

相關文章

    沒有相關內容
主站蜘蛛池模板: 欧美男女爱爱视频 | 色老头成人免费视频天天综合 | 大片刺激免费播放视频 | 三级a做爰大乳在线观看 | 99久久精品免费看国产交换 | 91资源在线 | 四虎影视永久在线观看 | 日本久久精品免视看国产成人 | 精彩视频一区二区 | 欧美日韩在线成人免费视频大全 | 成年女人视频播放免费观看 | 成人久久18免费网站游戏 | 欧美一级毛片免费看高清 | 国内精品免费网站牛牛 | 国产一区二区免费福利片 | 久久精品青草社区 | 精品久久久久久国产91 | 久久久久久久九九九九 | 国产乱人伦偷精品视频不卡 | 国产精品二区三区 | jizz丝袜| 美女视频黄a视频免费全过程在线 | 成熟的女性强烈交性视频 | 欧美性猛交99久久久久99 | 外国一级黄色毛片 | 99久久精品在免费线18 | 欧美精品成人一区二区视频一 | 色黄网站成年女人色毛片 | 色一情一乱一伦麻豆 | 国产午夜精品尤物福利视频 | 国产精品99久久久久久小说 | 国产一级特黄a大片99 | 五月天婷婷网站 | 男人天堂日韩 | 久久久夜夜夜 | 91热久久免费频精品动漫99 | 99久久久免费精品免费 | 草久影院| 毛片aa| 亚洲国产片 | 成人一级网站 |