// 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)
}

