Расчет и применение показателя DMI
Введение в индикатор
DMI指标又叫动向指标或趋向指标,其全称叫“Directional Movement Index,简称DMI”,
也是由美国技术分析大师威尔斯·威尔德(Wells Wilder)所创造的,是一种中长期股市技术分析(Technical Analysis)方法。
DMI指标是通过分析股票价格在涨跌过程中买卖双方力量均衡点的变化情况,
即多空双方的力量的变化受价格波动的影响而发生由均衡到失衡的循环过程,从而提供对趋势判断依据的一种技术指标。
-
Расчет показателя
Недавно многие друзья из круга любителей количественного анализа консультировались со мной по поводу того, как использовать индикатор DMI на платформе количественной торговли Inventor. Сначала я подумал, что это простой вопрос, поэтому открыл документацию API, чтобы найти эту функцию индикатора. Я обнаружил, что этот индикатор не включен в универсальную библиотеку индикаторов талибов. Я быстро поискал на Baidu и Zhihu... и после долгих трудов нашел некоторую информацию об индикаторах.
Я обнаружил, что этот индикатор состоит из четырех индикаторов. Алгоритм не очень сложный, поэтому я просто написал его по алгоритму в материале.Пример адреса: https://www.fmz.com/strategy/154050
-
Пожалуйста, выложите исходный код индикатора
// 指标函数 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 на других диаграммах.
Сравнивая значения индикатора на нескольких кбарах, можно сказать, что значения в целом совпадают (с небольшим отклонением округления).
-
использовать
Непосредственно используйте функцию DMI (например, метод, вызываемый в основной функции в примере), передайте данные K-линии и задайте параметры индикатора, которые обычно равны 14.
Данные, возвращаемые функцией, представляют собой двумерный массив, представляющий четыре строки.- DI- : m_di,
- DI+ : p_di,
- ADX : adx,
- ADXR: adxr,
Среди четырех линий индикатора DMI DI- и DI+ являются длинными и короткими индикаторами, отражающими силу как длинных, так и коротких сторон.
ADX и ADXR — это пара индикаторных линий, используемых вместе. Это трендовые индикаторы, которые отражают тренд и направление текущего рынка.DI+, чем выше значение индикатора, тем сильнее текущие рыночные «быки», и наоборот.
DI-, показатель противоположный.
DI+ и DI- часто переплетаются, и чем ближе значения, тем больше вероятность того, что рынок находится в тупике консолидации. Напротив, это свидетельствует об усилении тенденции.-
Сигнал
- Найдите дно
Если после длительного периода спада в краткосрочной перспективе выполняются следующие условия, это означает, что достигнуто краткосрочное дно и может произойти отскок или разворот от перепроданности.
-
- Линия DI+, которая представляет силу быков, находится ниже 10, поворачивая вверх в позиции перепроданности, а линия DI- находится на высоком уровне.
-
- Линия ADX, представляющая тренд, находится выше 65, поворачивает вниз и образует смертельный крест с линией ADXR.
- Пик разведки
Если после длительного подъема в краткосрочной перспективе выполняются следующие условия, это означает, что найдена краткосрочная вершина и может произойти краткосрочная корректировка или разворот.
-
- Линия DI-, которая отображает силу коротких продаж, находится ниже 10, на низком уровне и поворачивает вверх, в то время как линия DI+ находится на высоком уровне.
-
- Линия ADX, представляющая тренд, находится выше 65, поворачивает вниз и образует смертельный крест с линией ADXR.
- Старт
После периода колебаний четыре линии индикатора DMI переплелись на низком уровне, а затем внезапно появилась длинная положительная свеча с увеличением объема более чем на 5%.
Линия DI+ непрерывно пересекает линию 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



