量化投資_TB交易開拓者A函數和Q函數常見組合應用


1  在交易開拓者當中,關於交易的做單方式一般分為:圖表函數和A函數兩類。

   兩類的主要區別為:如果采用圖表函數的話,所有的交易內容都是以圖表上面的信號為准,當前倉位運行的實際狀態是沒有的,但是可以顯示交易圖標和圖像,並且可以進行回測;對於A函數而已,不具有顯示交易圖表和圖像和回測的功能,除了與圖表函數具有要求點位做單的功能外,倉位的實際運行狀態可以進行操作。

  舉例:比如圖表函數中,在某一個點位進行下單信號,此時運用圖表函數可在這個位置進行下單;但是如果此單並沒有成交,如果突然又遇到一個平倉信號,圖表函數認為已經成交了,會發出平倉指令。如果采用A函數,此單如果沒有成交,即使遇到平倉信號,設置條件也不會發出平倉信號。

  因此最大一個不同就是A函數考慮了單子的實際狀態,而圖表函數所有信號全部以圖像顯示的為准,忽略單子的實際狀態。

 

2  A函數的下單常用操作。

2.1  A_BuyPosition和A_SellPosition、A_TotalPosition(合計倉位)

  如果判斷多圖表上的

  Data0.A_BuyPosition 或 Data0.A_SellPosition

  Data1.A_BuyPosition 或 Data1.A_SellPosition

  其中:A_TotalPosition:正數表示多倉,負數表示空倉,0表示無持倉

2.2  以A_BuyPosition為例,A_SellPosition同理

2.3  A_BuyPosition 是當前真實賬戶,當前商品的持多倉量

  MarketPositon 是指測試過程中的持倉狀態,不會出現鎖倉的情況。在做真實交易時,盡量同步真實賬戶和測試的倉位及資金等信息。

2.4  如果當前持多單3手,返回值為3

2.5  最后一個bar,指的就是價格在跳動的那個bar

2.6  只在最后一個bar上,也就是2.5說的那根bar上才有值,其他bar都是N/A

 

2.7  關於下單函數A_SendOrder

  對應圖表函數,對應的下單函數如下:

Buy Or Sell (Enum_Buy(買入)或Enum_Sell(賣出)) Entry(開倉)/Exit(平倉)/ExitToday(平今) fLot(發送委托單量) fPrice(交易價格) 示例  
1.建多單使用buy  替換為可用參數Enum_Buy 開倉使用Entry 替換為Enum_Entry 開多倉單5手 價格可指定和使用Q函數,如Q_AskPrice() A_SendOrder(Enum_Buy,Enum_Entry,5,Q_AskPrice());  
2.平多倉使用sell  替換為可用參數Enum_Sell 平倉使用Exit /ExitToday(平今)替換為Enum_Exit(平倉),Enum_ExitToday(平今倉)之一 平多倉單5手,也可使用A_BuyPosition()獲取 價格可指定和使用Q函數,如Q_BidPrice() A_SendOrder(Enum_Sell,Enum_Exit,5,Q_BidPrice()  
3.建空單使用Sell 替換為可用參數Enum_Sell 開倉使用Entry,替換為Enum_Entry 開空倉單5手 價格可指定和使用Q函數,如Q_BidPrice() A_SendOrder(Enum_Sell,Enum_Entry,5,Q_BidPrice());  
4.平空單使用Buy 替換為可用參數Enum_Buy 平倉使用Exit /ExitToday(平今)替換為Enum_Exit(平倉),Enum_ExitToday(平今倉)之一 開空倉單5手,也可使用A_SellPosition()獲取 價格可指定和使用Q函數,如Q_AskPrice() A_SendOrder(Enum_Buy,Enum_Exit,5,Q_AskPrice());

 

2.8  該函數直接發單,不經過任何確認,並會在每次公式計算時發送,一般要配合倉位頭寸條件處理。

2.9  不能用於歷史測試,僅適用於實時行情。

2.10  持倉手數一定要寫要平或開多少。不能寫零,容易造成誤平。

 

3  用幾個實例來說明函數應用。

If(BarStatus == 0)
{ // 全局變量初始化
SetGlobalVar(1,0); // 記錄高空低多狀態 1 0
SetGlobalVar(2,0); // 記錄高多低空狀態 -1 0
SetGlobalVar(3,0); // 記錄平倉后當根不再開倉 1 0
}

 

//高空低多狀態
If(GetGlobalVar(1) == 0 And Data0.A_SellPosition() == 0 And Data1.A_BuyPosition() == 0 And Dclose[1] > st1_upperband[1] And Dclose[1] < st3_upperband[1] And Data0.Open == Data0.Close[1] And Data1.Open == Data1.Close[1] And Data0.Vol > 5 And Data1.Vol > 5) // 高空低多開倉
{
Data0.A_SendOrder(Enum_Sell,Enum_Entry,LotsA,Data0.Open); //Data0.高空開倉
Data1.A_SendOrder(Enum_Buy,Enum_Entry,LotsB,Data1.Open); //Data1.低多開倉
SetGlobalVar(1,1);
}

If (GetGlobalVar(1) == 1 And Data0.A_SellPosition() > 0 And Data1.A_BuyPosition() > 0 And Dclose[1] < mean[1] And Data0.Open == Data0.Close[1] And Data1.Open == Data1.Close[1] And Data0.Vol > 5 And Data1.Vol > 5) // 高空低多平倉
{
Data0.A_SendOrder(Enum_Buy,Enum_Exit,LotsA,Data0.Open); //Data0.高空平倉
Data1.A_SendOrder(Enum_Sell,Enum_Exit,LotsB,Data1.Open); //Data1.低多平倉
SetGlobalVar(1,0);
}

 

//高多低空狀態
If(GetGlobalVar(2) == 0 And Data0.A_BuyPosition() == 0 And Data1.A_SellPosition() == 0 And Dclose[1] < st1_downband[1] And Dclose[1] > st3_downband[1] And Data0.Open == Data0.Close[1] And Data1.Open == Data1.Close[1] And Data0.Vol > 5 And Data1.Vol > 5) // 高多低空開倉
{
Data0.A_SendOrder(Enum_Buy,Enum_Entry,LotsA,Data0.Open); //Data0.高多開倉
Data1.A_SendOrder(Enum_Sell,Enum_Entry,LotsB,Data1.Open); //Data1.低空開倉
SetGlobalVar(2,-1);
}

If (GetGlobalVar(2) == -1 And Data0.A_BuyPosition() > 0 And Data1.A_SellPosition() > 0 And Dclose[1] > mean[1] And Data0.Open == Data0.Close[1] And Data1.Open == Data1.Close[1] And Data0.Vol > 5 And Data1.Vol > 5) // 高多低空平倉
{
Data0.A_SendOrder(Enum_Sell,Enum_Exit,LotsA,Data0.Open);
Data1.A_SendOrder(Enum_Buy,Enum_Exit,LotsB,Data1.Open);
SetGlobalVar(2,0);
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM