MyKit.js 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. class MyKit {}
  2. /**
  3. * 条件处理器
  4. *
  5. * @param rst
  6. * @param condition
  7. * @returns {*}
  8. */
  9. MyKit.conditionHandler = function (rst, condition) {
  10. return rst && condition
  11. }
  12. /**
  13. * 豪秒级时间戳转换
  14. *
  15. * @param timestamp
  16. * @returns {*}
  17. */
  18. MyKit.getTimeByMillisecond = function (timestamp) {
  19. // 组织日期格式并返回
  20. return MyKit.dateFormat('YYYY-mm-dd HH:MM:SS', new Date(timestamp))
  21. }
  22. /**
  23. * 秒级时间戳转换
  24. *
  25. * @param timestamp
  26. * @returns {*}
  27. */
  28. MyKit.getTimeBySecond = function (timestamp) {
  29. // 组织日期格式并返回
  30. return MyKit.dateFormat('YYYY-mm-dd HH:MM:SS', new Date(timestamp * 1000))
  31. }
  32. /**
  33. * 格式化日期
  34. *
  35. * @param fmt 日期格式
  36. * @param date 日期对象
  37. * @returns {*}
  38. */
  39. MyKit.dateFormat = function (fmt, date) {
  40. let ret
  41. const opt = {
  42. "Y+": date.getFullYear().toString(), // 年
  43. "m+": (date.getMonth() + 1).toString(), // 月
  44. "d+": date.getDate().toString(), // 日
  45. "H+": date.getHours().toString(), // 时
  46. "M+": date.getMinutes().toString(), // 分
  47. "S+": date.getSeconds().toString(), // 秒
  48. "s+": date.getMilliseconds().toString() // 毫秒
  49. // 有其他格式化字符需求可以继续添加,必须转化成字符串
  50. }
  51. for (let k in opt) {
  52. ret = new RegExp("(" + k + ")").exec(fmt)
  53. if (ret) {
  54. fmt = fmt.replace(ret[1], (ret[1].length === 1) ? (opt[k]) : (opt[k].padStart(ret[1].length, "0")))
  55. }
  56. }
  57. return fmt
  58. }
  59. /**
  60. * 截取小数位工具
  61. * @param num 需要截取的小数
  62. * @param n 截取位数
  63. * @returns {number}
  64. * @private
  65. */
  66. MyKit._N = function (num, n) {
  67. if (!num) {
  68. return 0
  69. }
  70. let rst = num.toString()
  71. if (rst.indexOf('e') !== -1) {
  72. return 0
  73. }
  74. if (rst.indexOf('.') !== -1) {
  75. rst = rst.substring(0, rst.indexOf('.') + n + 1)
  76. }
  77. return parseFloat(rst)
  78. }
  79. /**
  80. * 转成非科学计数法
  81. * @param num
  82. * @returns {string}
  83. */
  84. MyKit.toNonExponential = function (num) {
  85. const m = num.toExponential().match(/\d(?:\.(\d*))?e([+-]\d+)/)
  86. return num.toFixed(Math.max(0, (m[1] || '').length - m[2]))
  87. }
  88. /**
  89. * 睡眠工具
  90. * @param time 单位:毫秒
  91. * @returns {Promise<unknown>}
  92. */
  93. MyKit.sleep = function (time) {
  94. return new Promise(function (resolve) {
  95. setTimeout(function () {
  96. resolve(true)
  97. }, time)
  98. })
  99. }
  100. /**
  101. * EMA计算器
  102. * @param lastEma 上一个EMA
  103. * @param closePrice 收盘价
  104. * @param units 数据条数
  105. * @returns {number}
  106. */
  107. MyKit.EMA = function (lastEma, closePrice, units) {
  108. return (lastEma * (units - 1) + closePrice * 2) / (units + 1)
  109. }
  110. /**
  111. *
  112. * 计算移动平均线指标, ma的周期为days
  113. *
  114. * @method MA
  115. * @param {Array} ticks 一维数组类型,每个元素为当前Tick的收盘价格
  116. * @param {Integer} day
  117. * @return {Array} mas
  118. */
  119. MyKit.MA = function (ticks, day) {
  120. const mas = []
  121. for (let i = 0; i < ticks.length; i++) {
  122. if (i < day - 1) {
  123. mas.push(ticks[i])
  124. } else {
  125. let valueSum = 0
  126. for (let j = i; j > i - day; j--) {
  127. valueSum += ticks[j]
  128. if (i === ticks.length - 1) {
  129. // console.log(day, ticks[j])
  130. }
  131. }
  132. if (i === ticks.length - 1) {
  133. // console.log(day, valueSum)
  134. }
  135. mas.push(valueSum / day)
  136. }
  137. }
  138. return mas
  139. }
  140. /**
  141. *
  142. * 计算macd指标,快速和慢速移动平均线的周期分别取12和26
  143. *
  144. * @method MACD
  145. * @param {Array} ticks
  146. * 一维数组类型,每个元素为tick的收盘价格
  147. * @param {Integer} N1
  148. * 整数类型,是为快线
  149. * @param {Integer} N2
  150. * 整数类型,是为慢线
  151. * @param {Integer} N3
  152. * 整数类型,是为信号长度
  153. * @return {Object} 返回一个包含diffs deas bars属性的对象,每个属性对应的类型为{Array[Number]}
  154. */
  155. MyKit.MACD = function (ticks, N1, N2, N3) {
  156. const emaN1 = []
  157. const emaN2 = []
  158. const diffs = []
  159. const deas = []
  160. const bars = []
  161. for (let i = 0; i < ticks.length; i++) {
  162. const c = ticks[i]
  163. if (i === 0) {
  164. emaN1.push(c)
  165. emaN2.push(c)
  166. deas.push(0)
  167. } else {
  168. emaN1.push(MyKit.EMA(emaN1[i - 1], c, N1))
  169. emaN2.push(MyKit.EMA(emaN2[i - 1], c, N2))
  170. }
  171. // 计算离差值
  172. diffs.push(emaN1[i] - emaN2[i])
  173. if (i !== 0) {
  174. deas.push(MyKit.EMA(deas[i - 1], diffs[i], N3))
  175. }
  176. // bars.push((diffs[i]-deas[i]) * 2);
  177. bars.push(diffs[i] - deas[i])
  178. }
  179. return { diffs: diffs, deas: deas, bars: bars }
  180. }
  181. module.exports = MyKit