UNPKG

@dickyindra/klinecharts

Version:

Lightweight k-line chart built with html5 canvas

146 lines (131 loc) 3.92 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; /** * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * DMI * * MTR:=EXPMEMA(MAX(MAX(HIGH-LOW,ABS(HIGH-REF(CLOSE,1))),ABS(REF(CLOSE,1)-LOW)),N) * HD :=HIGH-REF(HIGH,1); * LD :=REF(LOW,1)-LOW; * DMP:=EXPMEMA(IF(HD>0&&HD>LD,HD,0),N); * DMM:=EXPMEMA(IF(LD>0&&LD>HD,LD,0),N); * * PDI: DMP*100/MTR; * MDI: DMM*100/MTR; * ADX: EXPMEMA(ABS(MDI-PDI)/(MDI+PDI)*100,MM); * ADXR:EXPMEMA(ADX,MM); * 公式含义: * MTR赋值:最高价-最低价和最高价-昨收的绝对值的较大值和昨收-最低价的绝对值的较大值的N日指数平滑移动平均 * HD赋值:最高价-昨日最高价 * LD赋值:昨日最低价-最低价 * DMP赋值:如果HD>0并且HD>LD,返回HD,否则返回0的N日指数平滑移动平均 * DMM赋值:如果LD>0并且LD>HD,返回LD,否则返回0的N日指数平滑移动平均 * 输出PDI:DMP*100/MTR * 输出MDI:DMM*100/MTR * 输出ADX:MDI-PDI的绝对值/(MDI+PDI)*100的MM日指数平滑移动平均 * 输出ADXR:ADX的MM日指数平滑移动平均 * */ var _default = { name: 'DMI', shortName: 'DMI', calcParams: [14, 6], plots: [{ key: 'pdi', title: 'PDI: ', type: 'line' }, { key: 'mdi', title: 'MDI: ', type: 'line' }, { key: 'adx', title: 'ADX: ', type: 'line' }, { key: 'adxr', title: 'ADXR: ', type: 'line' }], calcTechnicalIndicator: function calcTechnicalIndicator(dataList, _ref) { var params = _ref.params; var trSum = 0; var hSum = 0; var lSum = 0; var mtr = 0; var dmp = 0; var dmm = 0; var dxSum = 0; var adx = 0; var result = []; dataList.forEach(function (kLineData, i) { var dmi = {}; var preKLineData = dataList[i - 1] || kLineData; var preClose = preKLineData.close; var high = kLineData.high; var low = kLineData.low; var hl = high - low; var hcy = Math.abs(high - preClose); var lcy = Math.abs(preClose - low); var hhy = high - preKLineData.high; var lyl = preKLineData.low - low; var tr = Math.max(Math.max(hl, hcy), lcy); var h = hhy > 0 && hhy > lyl ? hhy : 0; var l = lyl > 0 && lyl > hhy ? lyl : 0; trSum += tr; hSum += h; lSum += l; if (i >= params[0] - 1) { if (i > params[0] - 1) { mtr = mtr - mtr / params[0] + tr; dmp = dmp - dmp / params[0] + h; dmm = dmm - dmm / params[0] + l; } else { mtr = trSum; dmp = hSum; dmm = lSum; } var pdi = 0; var mdi = 0; if (mtr !== 0) { pdi = dmp * 100 / mtr; mdi = dmm * 100 / mtr; } dmi.pdi = pdi; dmi.mdi = mdi; var dx = 0; if (mdi + pdi !== 0) { dx = Math.abs(mdi - pdi) / (mdi + pdi) * 100; } dxSum += dx; if (i >= params[0] * 2 - 2) { if (i > params[0] * 2 - 2) { adx = (adx * (params[0] - 1) + dx) / params[0]; } else { adx = dxSum / params[0]; } dmi.adx = adx; if (i >= params[0] * 2 + params[1] - 3) { dmi.adxr = (result[i - (params[1] - 1)].adx + adx) / 2; } } } result.push(dmi); }); return result; } }; exports.default = _default;