DMI(ADX・ADXR)についてです。計算式、エクセルVBAコード、チャートを掲載
DMIはDirectional Movment Indexの略で、相場にトレンドがあるかどうか、どの程度方向性を持っているかを表す指標で、ロウソク足のはらみ線の判断なども使用して計算され、±DI、ADX、ADXRの4本の線からなります。
DMI(ADX・ADXR)の計算式
はらみ線の場合 +DM=0 -DM=0
はらみ線以外 ○現在の高値-直前の高値 > 直前の安値-現在の安値 なら
+DM=現在の高値-直前の高値
-DM=0
○現在の高値-直前の高値 < 直前の安値-現在の安値 なら
+DM=0
-DM=直前の安値-現在の安値
○現在の高値-直前の高値 = 直前の安値-現在の安値 なら
+DM=0
-DM=0
tr = 現在の高値-現在の安値、現在の高値-直前終値、直前の終値-現在の終値のうち一番大きいもの
+DI = 過去X本の+DMの平均/過去X本のtrの平均
-DI = 過去X本の-DMの平均/過去X本のtrの平均
ADX = DXのX本単純平均
ADXR = DXの2X 本単純移動平均
※DX = |+DI-(-DI)| / |+DI+(-DI)| (|・・・|は絶対値)
DMI(ADX・ADXR)の判断
ADX,ADXRはトレンドの大きさ、1方向への移動の大きさを表し、±DIは上昇方向、下降方向へのトレンドの強さを示します。
相場の上昇時は、+DIは上昇、ADX、ADXRはその上昇の勢いと比例し、-DIは下降、下降時は-DIが上昇しADX、ADXRはその下降の勢いと比例し、+DIは下降するという形になります。
売買の判断としては、+DIと-DIのゴールデンクロスで買い、デッドクロスで売り、またはクロス後、下降中の±DIとADXやADXRとのクロスにてより正確なポイントを探ることも可能です。
DMI(ADX・ADXR)のチャート
< ±DI:14 ADX:9 ADXR:9 >
(水色:+DI 赤:-DI 黄色:ADX 緑:ADXR)
< ±DI:26 ADX:31 ADXR:31 >
(水色:+DI 赤:-DI 黄色:ADX 緑:ADXR)
DMI(ADX・ADXR)のエクセルVBAコード
‘※ エクセルの1列目(A列)に行番号、2列目(B列)に日時、
‘※ 3列目(C列)~6列目(F列)に始値・高値・安値・終値
‘********************************
‘ di :±DIの採用本数
‘ adx :ADXの採用本数
‘ adxr :ADXRの採用本数
‘ num:現在の行
‘ cell_dmp:+DM計算値書込み列
‘ cell_dmm:-DM計算値書込み列
‘ cell_tr:tr計算値書込み列
‘ cell_dip:+DI計算値書込み列
‘ cell_dim:-DI計算値書込み列
‘ cell_dx:DX計算値書込み列
‘ cell_adx:ADX計算値書込み列
‘ cell_adxr:ADXR計算値書込み列
‘********************************
If Cells(num – 1, 4) < Cells(num, 4) Then
f1 = Cells(num, 4) – Cells(num – 1, 4)
Else
f1 = 0
End If
If Cells(num – 1, 5) > Cells(num, 5) Then
f2 = Abs(Cells(num, 5) – Cells(num – 1, 5))
Else
f2 = 0
End If
If f1 < f2 Then Cells(num, cell_dmp) = 0 Else Cells(num, cell_dmp) = f1
If f1 > f2 Then Cells(num, cell_dmm) = 0 Else Cells(num, cell_dmm) = f2
Cells(num, cell_tr) = Application.Max(Cells(num, 4) – Cells(num, 5), _
Cells(num, 4) – Cells(num – 1, 6), Cells(num – 1, 6) _
– Cells(num, 5))
If num < 2 + di Then GoTo offend
adip = Application.Average(Range(Cells(num – (di – 1), cell_dmp), _
Cells(num, cell_dmp)))
adim = Application.Average(Range(Cells(num – (di – 1), cell_dmm), _
Cells(num, cell_dmm)))
atr = Application.Average(Range(Cells(num – (di – 1), cell_tr), _
Cells(num, cell_tr)))
Cells(num, cell_dip) = adip / atr * 100
Cells(num, cell_dim) = adim / atr * 100
Cells(num, cell_dx) = Abs(Cells(num, cell_dip) – Cells(num, cell_dim)) _
/ (Cells(num, cell_dip) + Cells(num, cell_dim)) * 100
If num < 2 + di + adx Then Exit Sub
Cells(num, cell_adx) = Application.Average _
(Range(Cells(num – (adx – 1), cell_dx), Cells(num, cell_dx)))
If num < 2 + di + adx + adxr Then Exit Sub
Cells(num, cell_adxr) = (Cells(num – (adxr – 1), cell_adx) + _
Cells(num, cell_adx)) / 2
(外部リンク)テクニカル指標(Wikipedia)