DMI指標の計算と応用
指標の紹介
DMI指标又叫动向指标或趋向指标,其全称叫“Directional Movement Index,简称DMI”,
也是由美国技术分析大师威尔斯·威尔德(Wells Wilder)所创造的,是一种中长期股市技术分析(Technical Analysis)方法。
DMI指标是通过分析股票价格在涨跌过程中买卖双方力量均衡点的变化情况,
即多空双方的力量的变化受价格波动的影响而发生由均衡到失衡的循环过程,从而提供对趋势判断依据的一种技术指标。
-
指標計算
最近、定量分析サークルの多くの友人から、Inventor Quantitative Trading Platform で DMI インジケーターを使用する方法について相談を受けました。最初は単純な質問だと思ったので、API ドキュメントを開いてこのインジケーター関数を探しました。このインジケーターはユニバーサル talib インジケーター ライブラリに含まれていないことがわかりました。私はすぐにBaiduとZhihuで検索しました...そして大変な努力の末、指標に関する情報をいくつか見つけました。
このインジケーターは4つのインジケーターで構成されていることがわかりました。アルゴリズムはそれほど複雑ではないので、資料のアルゴリズムに従って単純に記述しました。 -
インジケーターのソースコードを投稿してください
// 指标函数 function ADX(MDI, PDI, adx_period) { if(typeof(MDI) == "undefined" || typeof(PDI) == "undefined"){ return false } if(MDI.length < 10 || PDI.length < 10){ return false } /* DX = abs(DIPlus-DIMinus) / (DIPlus+DIMinus)*100 ADX = sma(DX, len) */ var dx = [] for(var i = 0; i < MDI.length; i++){ if(!MDI[i] || !PDI[i]){ continue } var dxValue = Math.abs((PDI[i] - MDI[i])) / (PDI[i] + MDI[i]) * 100 var obj = { Close : dxValue, } dx.push(obj) } if(dx.length < adx_period){ return false } var adx = talib.SMA(dx, adx_period) return adx } function DMI(records, pdi_period, mdi_period, adxr_period, adx_period) { var recordsHLC = [] for(var i = 0; i < records.length ; i++){ var bar = { High : records[i].High, Low : records[i].Low, Close : records[i].Close, } recordsHLC.push(bar) } var m_di = talib.MINUS_DI(recordsHLC, mdi_period) var p_di = talib.PLUS_DI(recordsHLC, pdi_period) var adx = ADX(m_di, p_di, adx_period) // ADXR=(当日的ADX+前n日的ADX)÷2 var n = 0 var adxr = [] for (var j = 0 ; j < adx.length; j++) { if (typeof(adx[j]) == "number") { n++ } if (n >= adxr_period) { var currAdxr = (adx[j] + adx[j - adxr_period]) / 2 adxr.push(currAdxr) } else { adxr.push(NaN) } } return [m_di, p_di, adx, adxr] } -
対比
Inventor Quantitative Line Drawing Libraryを使用すると、チャートを描画して他のチャートのDMIと比較することが非常に簡単になります。
複数のKbarsでインジケーターの値を比較すると、値は基本的に一致しています(わずかな丸め偏差あり)。
-
使用
DMI 関数 (例のメイン関数で呼び出されるメソッドなど) を直接使用し、K ライン データを渡し、インジケーター パラメータ (通常は 14) を設定します。
関数によって返されるデータは、4 行を表す 2 次元配列です。- DI- : m_di,
- DI+ : p_di,
- ADX : adx,
- ADXR: adxr,
DMI インジケーターの 4 つの線のうち、DI- と DI+ はロングとショートのインジケーターであり、ロング側とショート側の両方の強さを反映します。
ADX と ADXR は、一緒に使用されるインジケーター ラインのペアです。これらは、現在の市場の傾向と方向を反映するトレンド インジケーターです。DI+、指標値が高いほど、現在の市場の強気傾向が強いことを意味し、逆もまた同様です。
DI-、インジケーターは反対です。
DI+とDI-は絡み合っていることが多く、値が近いほど、市場が統合膠着状態にある可能性が高くなります。それどころか、傾向が強まっていることを示しています。-
信号
- 底を見つける
長期にわたる下落の後、短期的に以下の条件が満たされた場合、短期的な底が見つかったことを意味し、売られ過ぎの反発や反転が起こる可能性があります。
-
- 強気の強さを表すDI+ラインが10を下回り、売られ過ぎの状態で上向きに転じており、DI-ラインは高い水準にあります。
-
- トレンドを表す ADX ラインは 65 以上の高い位置にあり、下向きに転じて ADXR ラインとデッドクロスを形成します。
- 山頂探検
長期上昇後、短期的に以下の条件が満たされた場合、短期的な天井が見つかったことを意味し、短期的な調整または反転が発生する可能性があります。
-
- 空売り勢力を表すDI-ラインは10を下回り、低水準から上昇傾向にある一方、DI+ラインは高水準にある。
-
- トレンドを表す ADX ラインは 65 以上の高い位置にあり、下向きに転じて ADXR ラインとデッドクロスを形成します。
- 開始
一定期間の変動の後、4 つの DMI インジケーター ラインが低いレベルで絡み合い、その後突然、ボリュームが 5% 以上増加した長い正のローソク足が現れました。
DI+ ラインが 2 日以内に DI- ライン、ADX ライン、ADXR ラインを連続的に交差し、新たな上昇トレンドが形成されようとしていることを示しています。 DI+ ラインが最後のインジケーター ラインを横切ったときに購入できます。
for (var j = 0 ; j < adx.length; j++)语法检查会报错,因为adx也可能返回bool值,bool不能使用.length,可以添加条件过滤检查ADX函数返回值
if (typeof adx === 'boolean' && adx === false) {
Log("ADX计算失败,数据不足或参数错误");
return null;
}
if (!adx || !Array.isArray(adx)) {
Log("ADX返回值类型异常:", typeof adx);
return null;
}
if (adx.length === 0) {
Log("ADX返回空数组");
return null;
}
- 1



