?Bar數據
在介紹Bar數據之前,首先,我們需要討論一下TradeBlazer公式的計算方法,針對上面介紹的各種公式類型,包含公式應用,在公式進行計算時,都是建立在基本數據源(Bar數據)之上,我們這里所謂的Bar數據,是指商品在不同周期下形成的序列數據,在單獨的每個Bar上面包含開盤價、收盤價、最高價、最低價、成交量及時間。期貨等品種還有持倉量等數據。
所有的Bar按照不同周期組合,并按照時間從先到后進行排列,由此形成為序列數據,整個序列稱之為Bar數據。
以下列出所有的Bar數據系統函數:
函數名 | 簡寫 | 描述 |
Date | D | 當前Bar的日期。 |
Time | T | 當前Bar的時間。 |
Open | O | 當前Bar的開盤價。 |
High | H | 當前Bar的最高價,Tick時為當時的委賣價。 |
Low | L | 當前Bar的最低價,Tick時為當時的委買價。 |
Close | C | 當前Bar的收盤價。 |
Vol | V | 當前Bar的成交量。 |
OpenInt | 無 | 當前Bar的持倉量。 |
CurrentBar | 無 | 當前Bar的索引值,從0開始計數。 |
BarStatus | 無 | 當前Bar的狀態值,0表示為第一個Bar,1表示為中間的普通Bar,2表示最后一個Bar。 |
計算方法
TradeBlazer公式在計算時按照Bar數據的Bar數目,從第一個Bar到最后一個Bar,依次進行計算,如果公式中出現了調用Bar數據函數的,則取出當前Bar的相應值,進行運算。如下圖箭頭所示,公式執行從上至下,Bar從左到右執行。
例如,現在有如下語句需要執行,Bar數據如下表所示:
Value1 = Close - Open;
CurrentBar | Date | Time | Open | High | Low | Close | Vol | OpenInt | Value1 |
0 | 2005/04/04 | 15:00 | 2970 | 2979 | 2951 | 2974 | 18 | 78 | 4 |
1 | 2005/04/05 | 15:00 | 2960 | 2960 | 2946 | 2960 | 14 | 76 | 0 |
2 | 2005/04/06 | 15:00 | 2951 | 2980 | 2951 | 2963 | 30 | 74 | 12 |
3 | 2005/04/07 | 15:00 | 3048 | 3048 | 2968 | 2995 | 120 | 84 | -53 |
4 | 2005/04/08 | 15:00 | 2985 | 2987 | 2985 | 2987 | 10 | 80 | 2 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
如上表所示,從CurrentBar = 0 開始,依次計算每個Bar進行計算;
在公式的編寫中,經常會遇到當前Bar的數據和上一個Bar,上N個Bar數據進行比較,計算的情況,針對這種情況,TradeBlazer公式提供了一種處理機制:回溯。即對數據的向前引用,比如,獲取上一個Bar的收盤價:Close[1],獲取10天前的成交量:Vol[10]。以下提供一個簡單的例子來說明如何進行回溯處理。
假定有如下語句:
If (Close > Close[1]) {Buy(1,Close); }
以上公式執行一個簡單的操作,當前Bar的收盤價大于上一個Bar的收盤價,即執行按照當前收盤價買入1手的動作。根據上表的數據,公式將在CurrentBar為2和3的時候調用Buy指令。
如果您足夠仔細的話,您會發現:對于上面的一段公式的執行,有一個小小的問題,當第一次計算公式時,即CurrentBar = 0時,這個時候需要獲取上一個Bar的數據,但是當前Bar已經是第一個Bar,這個時候就存在著問題,如何來獲取此時的Close[1]呢,TradeBlazer公式將默認Close[1]為無效值,即系統函數中的InvalidNumeric,Close > Close[1]的表達式計算結果是一個Bool值,其結果也是一個無效值,對于Bool值,我們將False作為其無效值。因此,第一個Bar計算時,Buy指令不會被執行。
對于技術分析這類公式來說,假定Bar數據的總數共有100,相同的代碼將從CurrentBar = 0到CurrentBar = 99 共執行100遍,分別輸出公式中的結果值。