// arguments={ // "0": { // "type": "Spot", // "action": "Kline", // "value": [ // { // "BeginTime": 1741859520, // "ClosePrice": 83351.9, // "LastPrice": "83351.9", // "HighestPrice": 83430.7, // "InstrumentID": "BTC/USDT", // "LowestPrice": 83351.9, // "OpenPrice": 83430.7, // "PeriodID": "1m", // "Volume": 5.41126194, // "isFirst": true // }, // { // "BeginTime": 1741859580, // "ClosePrice": 83325, // "LastPrice": "83325.0", // "HighestPrice": 83389.9, // "InstrumentID": "BTC/USDT", // "LowestPrice": 83324.9, // "OpenPrice": 83351.9, // "PeriodID": "1m", // "Volume": 4.86852206, // "isFirst": true // } // } let date = new Date(Date.now()) console.info(date.toISOString(), date.toLocaleString('en-US', { timeZone: 'Asia/Shanghai', hour12: false, }).substring(11, 16)) // 转换为 HH:MM 格式 // ================================================ let _fun = { name: 'EMA', // 指标名称 shortName: 'EMA', // 指标简称 series: 'price', // 指标应用于哪个数据系列(这里是价格) calcParams: [6, 12, 20], // 计算参数,即 EMA 的周期 precision: 2, // 数值精度,保留两位小数 shouldOhlc: true, // 是否需要 OHLC 数据(Open, High, Low, Close) figures: [ // 图形配置 { key: 'ema1', title: 'EMA6: ', type: 'line', }, // EMA6 线 { key: 'ema2', title: 'EMA12: ', type: 'line', }, // EMA12 线 { key: 'ema3', title: 'EMA20: ', type: 'line', }, // EMA20 线 ], regenerateFigures: function(params) { // 动态生成图形配置 return params.map(function(param) { return { key: 'ema' + param, title: 'EMA' + param + ': ', type: 'line', } }) }, calc: function(data, indicator) { // 计算 EMA 值 const params = indicator.calcParams // 获取计算参数 const figures = indicator.figures // 获取图形配置 let sum = 0 // 总和 const emaValues = [] // EMA 值数组 return data.map(function(item, index) { const result = {} // 存储计算结果 const close = item.C // 收盘价 sum += close // 累加收盘价 params.forEach(function(param, paramIndex) { if (param - 1 > index) { return // 数据不足,无法计算 } if (index > param - 1) { // 计算 EMA emaValues[paramIndex] = (2 * close + (param - 1) * emaValues[paramIndex]) / (param + 1) } else { // 计算初始 EMA emaValues[paramIndex] = sum / param } result[figures[paramIndex].key] = emaValues[paramIndex] // 存储 EMA 值 }) return result // 返回计算结果 }) }, } _pm = postMessage _cp = [] _times = [] postMessage = function() { let kl = arguments[0] if (kl.action === 'Kline') { let map = kl.value.map((v) => { let ti = new Date(v.BeginTime * 1000).toLocaleString('en-US', { timeZone: 'Asia/Shanghai', hour12: false, }).substring(11, 16) _times.push(ti) return { C: v.ClosePrice, T: ti, } }) console.info('====================') _cp = [..._cp, ...map] console.info('ClosePrice', _cp) console.info('BeginTime', _times) let ema = _fun.calc(_cp, _fun) let ema3 = ema.filter(item => item.ema3).map(function(item, index) { return item.ema3 }) console.info('ema3', ema3) console.info('最小值:', Math.min.apply(null, ema3)) console.info('最大值:', Math.max.apply(null, ema3)) } return _pm.apply(null, arguments) }