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