test01.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. // arguments={
  2. // "0": {
  3. // "type": "Spot",
  4. // "action": "Kline",
  5. // "value": [
  6. // {
  7. // "BeginTime": 1741859520,
  8. // "ClosePrice": 83351.9,
  9. // "LastPrice": "83351.9",
  10. // "HighestPrice": 83430.7,
  11. // "InstrumentID": "BTC/USDT",
  12. // "LowestPrice": 83351.9,
  13. // "OpenPrice": 83430.7,
  14. // "PeriodID": "1m",
  15. // "Volume": 5.41126194,
  16. // "isFirst": true
  17. // },
  18. // {
  19. // "BeginTime": 1741859580,
  20. // "ClosePrice": 83325,
  21. // "LastPrice": "83325.0",
  22. // "HighestPrice": 83389.9,
  23. // "InstrumentID": "BTC/USDT",
  24. // "LowestPrice": 83324.9,
  25. // "OpenPrice": 83351.9,
  26. // "PeriodID": "1m",
  27. // "Volume": 4.86852206,
  28. // "isFirst": true
  29. // }
  30. // }
  31. let date = new Date(Date.now())
  32. console.info(date.toISOString(), date.toLocaleString('en-US', {
  33. timeZone: 'Asia/Shanghai',
  34. hour12: false,
  35. }).substring(11, 16)) // 转换为 HH:MM 格式
  36. // ================================================
  37. let _fun = {
  38. name: 'EMA', // 指标名称
  39. shortName: 'EMA', // 指标简称
  40. series: 'price', // 指标应用于哪个数据系列(这里是价格)
  41. calcParams: [6, 12, 20], // 计算参数,即 EMA 的周期
  42. precision: 2, // 数值精度,保留两位小数
  43. shouldOhlc: true, // 是否需要 OHLC 数据(Open, High, Low, Close)
  44. figures: [ // 图形配置
  45. {
  46. key: 'ema1',
  47. title: 'EMA6: ',
  48. type: 'line',
  49. }, // EMA6 线
  50. {
  51. key: 'ema2',
  52. title: 'EMA12: ',
  53. type: 'line',
  54. }, // EMA12 线
  55. {
  56. key: 'ema3',
  57. title: 'EMA20: ',
  58. type: 'line',
  59. }, // EMA20 线
  60. ],
  61. regenerateFigures: function(params) { // 动态生成图形配置
  62. return params.map(function(param) {
  63. return {
  64. key: 'ema' + param,
  65. title: 'EMA' + param + ': ',
  66. type: 'line',
  67. }
  68. })
  69. },
  70. calc: function(data, indicator) { // 计算 EMA 值
  71. const params = indicator.calcParams // 获取计算参数
  72. const figures = indicator.figures // 获取图形配置
  73. let sum = 0 // 总和
  74. const emaValues = [] // EMA 值数组
  75. return data.map(function(item, index) {
  76. const result = {} // 存储计算结果
  77. const close = item.C // 收盘价
  78. sum += close // 累加收盘价
  79. params.forEach(function(param, paramIndex) {
  80. if (param - 1 > index) {
  81. return // 数据不足,无法计算
  82. }
  83. if (index > param - 1) {
  84. // 计算 EMA
  85. emaValues[paramIndex] = (2 * close + (param - 1) * emaValues[paramIndex]) / (param + 1)
  86. } else {
  87. // 计算初始 EMA
  88. emaValues[paramIndex] = sum / param
  89. }
  90. result[figures[paramIndex].key] = emaValues[paramIndex] // 存储 EMA 值
  91. })
  92. return result // 返回计算结果
  93. })
  94. },
  95. }
  96. _pm = postMessage
  97. _cp = []
  98. _times = []
  99. postMessage = function() {
  100. let kl = arguments[0]
  101. if (kl.action === 'Kline') {
  102. let map = kl.value.map((v) => {
  103. let ti = new Date(v.BeginTime * 1000).toLocaleString('en-US', {
  104. timeZone: 'Asia/Shanghai',
  105. hour12: false,
  106. }).substring(11, 16)
  107. _times.push(ti)
  108. return {
  109. C: v.ClosePrice,
  110. T: ti,
  111. }
  112. })
  113. console.info('====================')
  114. _cp = [..._cp, ...map]
  115. console.info('ClosePrice', _cp)
  116. console.info('BeginTime', _times)
  117. let ema = _fun.calc(_cp, _fun)
  118. let ema3 = ema.filter(item => item.ema3).map(function(item, index) {
  119. return item.ema3
  120. })
  121. console.info('ema3', ema3)
  122. console.info('最小值:', Math.min.apply(null, ema3))
  123. console.info('最大值:', Math.max.apply(null, ema3))
  124. }
  125. return _pm.apply(null, arguments)
  126. }