DMI 지표의 계산 및 적용
지표 소개
DMI指标又叫动向指标或趋向指标,其全称叫“Directional Movement Index,简称DMI”,
也是由美国技术分析大师威尔斯·威尔德(Wells Wilder)所创造的,是一种中长期股市技术分析(Technical Analysis)方法。
DMI指标是通过分析股票价格在涨跌过程中买卖双方力量均衡点的变化情况,
即多空双方的力量的变化受价格波动的影响而发生由均衡到失衡的循环过程,从而提供对趋势判断依据的一种技术指标。
-
지표 계산
최근, 양적 분석 분야의 많은 친구들이 Inventor Quantitative Trading Platform에서 DMI 지표를 사용하는 방법에 대해 상담해 주셨습니다. 처음에는 간단한 질문인 줄 알고 API 문서를 열어서 이 지표 함수를 찾아보았습니다. 이 지표가 범용 Talib 지표 라이브러리에 포함되어 있지 않은 것을 발견했습니다. 저는 바이두와 지후에서 재빨리 검색했고... 많은 노력 끝에 지표에 대한 정보를 찾을 수 있었습니다.
이 지표는 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와 비교하는 것이 매우 쉽습니다.
여러 Kbar의 지표 값을 비교해보면, 값은 기본적으로 일관성이 있습니다(약간의 반올림 편차 있음).
-
사용
DMI 함수를 직접 사용합니다(예시의 main 함수에서 호출되는 메서드와 같음). K-라인 데이터를 전달하고 일반적으로 14인 지표 매개변수를 설정합니다.
이 함수에서 반환되는 데이터는 4개의 줄을 나타내는 2차원 배열입니다.- DI- : m_di,
- DI+ : p_di,
- ADX : adx,
- ADXR: adxr,
DMI 지표의 4개 선 중 DI-와 DI+는 롱(long)과 숏(short) 지표로, 롱(long)과 숏(short) 측면의 강도를 반영합니다.
ADX와 ADXR은 함께 사용되는 한 쌍의 지표 선입니다. 이들은 현재 시장의 추세와 방향을 반영하는 추세 지표입니다.DI+의 경우, 지표 값이 높을수록 현재 시장의 강세가 강함을 의미하며, 그 반대의 경우도 마찬가지입니다.
DI-, 표시기는 반대입니다.
DI+와 DI-는 종종 서로 얽혀 있으며, 값이 가까울수록 시장이 통합 교착 상태에 빠질 가능성이 높습니다. 오히려 그 경향이 강화되고 있음을 나타낸다.-
신호
- 바닥을 찾으세요
장기간의 하락 이후 단기적으로 다음과 같은 조건이 충족된다면 단기 바닥이 발견되었으며 매도 과열 반등이나 반전이 발생할 수 있음을 의미합니다.
-
- 강세 추세를 나타내는 DI+선이 10 이하로 매도 과열 상태에서 상승 전환하고 있으며, DI-선은 높은 수준에 있습니다.
-
- 추세를 나타내는 ADX선은 65 위의 높은 위치에 있으며, 하락하여 ADXR선과 데드크로스를 형성합니다.
- 피크 탐험
장기 상승 이후 단기적으로 다음과 같은 조건이 충족된다면 단기 고점이 발견되었으며 단기 조정이나 반전이 발생할 수 있음을 의미합니다.
-
- 공매도 세력을 나타내는 DI-선은 10보다 낮은 저수준에서 상승 전환하는 반면, DI+선은 고수준에 있습니다.
-
- 추세를 나타내는 ADX선은 65 위의 높은 위치에 있으며, 하락하여 ADXR선과 데드크로스를 형성합니다.
- 시작
일정 기간의 변동 후, 4개의 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



