[TS懶人包] [保險服務]

2010年2月21日 星期日

函數講解 - ADX

接下來的幾篇文章會是函數的程式碼講解…看懂了別人的程式碼…對自己寫程式的功力也會有進步的。所以這篇先來講解 ADX 函數的程式碼。一開始就先看看 ADX 這個函數吧。


Inputs: Length(NumericSimple);
Variables: Counter(0), CummDMI(0), Return(0);

Return = 0;

If CurrentBar >= 1 AND Length > 0 Then Begin
If CurrentBar < Length Then begin
CummDMI = 0;
for Counter = 0 To CurrentBar - 1 Begin
CummDMI = CummDMI + DMI(Length)[Counter];
End;
Return = CummDMI / CurrentBar;
End
Else
Return = (ADX[1] * (Length - 1) + DMI(Length)) / Length;
End;

ADX = Return;


這個函數一開始是變數宣告。有 input 和 vars,input 代表要傳遞進去的參數…這邊是一個 Length 代表著要計算的 ADX 週期。

接下來程式把 Return 這個變數歸零。

接著就是一個 If 的判斷,在這邊用到了個 CurrentBar >= 1 代表著目前的 K 線是大於或等於第一根 K 線,假如你開出了 500 根 K 線,那第一根 K 線的 CurrentBar 就會等於 1。這邊是一個計算上的錯誤預防…避免沒有 K 線資料程式還進到運算式裡面。

接下來是另一個 If 判斷,這邊寫下了 CurrentBar < Length ,假如目前的 Length 是使用 9 的話,那前 9 根 K 線就會進到這個判斷式裡面。

這邊我利用均線的方式說明一下…如果你今天要計算的是 20 日線均的話,那表示你必需最少需要有 20 根 K 線的資料才能計算,也就是說如果 CurrentBar < 20 的話…你必需要有另外的計算方式,或是直接跳過這 20 根 K 線,計算出來的值才會正確。

所以這邊是表示如果 CurrentBar < Length ,也就是說目前的 K 線是在你要計算的週期之內的話…就用下面的方式計算。

而這邊的計算方式是先把 CummDMI 歸零後,進到一個 For 的迴圈裡面。

在這個 For 迴圈裡,用了一個 Counter,Counter 從 0 一直到 CurrentBar - 1,假如目前的 CurrentBar 是 5 的話…那 Counter 就會是從 0 到 4,並計算 CummDMI 這個值。

這邊就用到了 CummDMI = CummDMI + DMI(Length)[Counter]; 大家應該還記得盒子裡的東西和盒子的名字這個例子。

不過這邊又用到另一個函數,也就是 DMI,先暫時把它放到一邊,下一篇文章我們再來看 DMI 這個函數在作什麼。

接下來回到如果 CurrentBar 是 5 的話,那個 For 迴圈的計算,就會是 CummDMI = CummDMI + DMI(Length)[0] 一直到 CummDMI = CummDMI + DMI(Length)[4]。在 For 迴圈計算完之後,有個 Return = CummDMI / CurrentBar;

這邊就算計算完成後。而最後的 Return 值就會回傳到你呼叫這個 ADX 函數的地方了。

如果 CurrentBar >= Length 的話…就是另外的計算方式。也就是:

Return = (ADX[1] * (Length - 1) + DMI(Length)) / Length;

這個部份。可以看出來他相對比較簡單一點…沒有用到 For 迴圈了。這邊是直接把上一根的 ADX 值拿出來運用。有一點遞迴的想法在裡面…比較常見的遞迴是費波南希係數,大概的想法是這樣:

A = 1
B = 1
C = A + B

也就是除了第一個和第二個數之外,其餘的數都是前二個數值相加,所以可以得到 1, 1, 2, 3, 5, 8, ... 這樣的數列。

而這邊則是用到了上一根的 ADX 數值,再去計算出目前的 DMI 數值,兩個相加再去除以 Length 來得到目前的 ADX。

最後就是 ADX = Return ,把計算得到的 Return 值回傳到 ADX 去囉。

下一篇就來說說 DMI 吧。

沒有留言:

張貼留言

請留下您的大名…匿名者恕不回應…

Related Posts Plugin for WordPress, Blogger...