1. 程式人生 > >量化投資_TB交易開拓者A函式和Q函式常見組合應用

量化投資_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);
}