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

2010年2月22日 星期一

函數講解 - DMI (DMIPlus)

在上一篇文章內提到了 ADX 這個函數,而 ADX 又使用到了 DMI 這個函數…所以這邊主要就是來講一下 DMI 這個函數的內容囉。其實打開 DMI 函數的程式碼你會發現其內容並不複雜…因為主要的計算是放在 DMIPlus 和 DMIMinus 這兩個函數裡面…這邊會順便用 DMIPlus 來說明一下。

首先是 DMI 的程式碼:

Inputs: Length(NumericSimple);
Variables: DMIP(0), DMIM(0);

DMIP = DMIPlus(Length);
DMIM = DMIMinus(Length);

If DMIP + DMIM = 0 Then
DMI = 0
Else
DMI = 100 * AbsValue(DMIP - DMIM) / (DMIP + DMIM);



同樣的在一開始用了 input 和 vars 宣告一些變數,input 的部份還是週期,而二個變數 DMIP 和 DMIM 則呼叫了另外二個函數來計算得到數值。

最後的 If 判斷,則是簡單的計算囉。所以這邊就跳過啦。直接打開 DMIPlus 來講解了。


Inputs: Length(NumericSimple) ;
Variables: Counter(0), TRange(0), MyRange(Length), PlusDM14(0), PlusDM(0), MinusDM(0);

If CurrentBar = 1 Then Begin
MyRange = Length;
DMIPlus = 0;
PlusDM14 = 0;
TRange = 0;
For Counter = 0 To MyRange - 1 Begin
If High[Counter] - High[Counter+1] < 0 Then
PlusDM = 0
Else
PlusDM = High[Counter] - High[Counter+1];
If Low[Counter+1] - Low[Counter] < 0 Then
MinusDM = 0
Else
MinusDM = Low[Counter+1] - Low[Counter];
If MinusDM >= PlusDM Then
PlusDM = 0;
{MinusDM not set to 0 because it is not used}
TRange = TRange + TrueRange[Counter];
PlusDM14 = PlusDM14 + PlusDM;
End;
If TRange <> 0 Then
DMIPlus = 100 * PlusDM14 / TRange
Else
DMIPlus = 0 ;
End
Else
If CurrentBar > 1 Then Begin
If High[0] - High[1] < 0 Then
PlusDM = 0
Else
PlusDM = High[0] - High[1];
If Low [1] - Low [0] < 0 Then
MinusDM = 0
Else
MinusDM = Low[1] - Low[0];
If MinusDM >= PlusDM Then
PlusDM = 0;
{MinusDM not set to 0 because it is not used}
If MyRange > 0 Then Begin
TRange = TRange[1] - (TRange[1] / MyRange) + TrueRange;
PlusDM14 = PlusDM14[1] - (PlusDM14[1] / MyRange) + PlusDM;
End;
If TRange <> 0 Then
DMIPlus = 100 * PlusDM14 / TRange
Else
DMIPlus = 0 ;
End ;


很長的一段程式碼…不過其實慢慢拆解起來的話…也沒什麼難懂的地方才對。

首先的 If 判斷在之前也遇到過了,主要是判斷目前的 K 線是不是圖上的第一根 k 線,如果是第一根 k 線的話就是執行那個部份的運算,不是第一根 k 線就是執行下面的 else 部份運算。

我很強烈的建議大家在寫程式的時候好好的排一下版,因為版面排的好,以後再修改程式的時候會少花很多的時間。在 blog 上貼出來的程式碼會整個縮排縮到最左邊…所以還是打開 PowerEditor 來對照程式會比較容易了解。

以一張圖來說明…首先我會先把這個程式拆成二個部份來看:



首先就是第一個大段的 If 和後面的 Else 先拆開…再接著看第一段 If 的內容。

接下來這第一個大段的 If 先執行了一些變數歸零的動作後,進到了一個 For 迴圈作運算,接下來又分為兩個 If .. Else

If High[Counter] - High[Counter+1] < 0 Then
PlusDM = 0
Else
PlusDM = High[Counter] - High[Counter+1];
If Low[Counter+1] - Low[Counter] < 0 Then
MinusDM = 0
Else
MinusDM = Low[Counter+1] - Low[Counter];

這邊可以看到他判斷了如果 High[0] - High[1] < 0 的話,PlusDM 就設為 0;那如果 High[0] - High[1] >= 0 的話,PlusDM 就會等於 High[0] - High[1]。

接著算完了 PlusDM 和 MinusDM 後,在比較這二個值。

接下來又看到了一個新函數了,就是 TrueRange,這邊也是先跳過,我們下一篇再來看這個函數。只要先知道他計算了一個值出來就行了。

接著就是運算 DMIPlus 的過程了。而另一個大區塊就是當 CurrentBar 不等於 1 的時候的運算囉。


我想整個拆解的過程並不太需要了解他背後運算的意義到底何在…因為那是一大堆數學公式,你並不需要知道為什麼 High[0] - High[1] < 0 的時候 PlusDM 會等於 0。主要我希望大家看的是程式的寫法,為什麼要這樣子寫、還有各種 If、For 的運算等等。

沒有留言:

張貼留言

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

Related Posts Plugin for WordPress, Blogger...