首先是 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 的運算等等。
沒有留言:
張貼留言
請留下您的大名…匿名者恕不回應…