@ch20026103/anysis 0.0.19-alpha → 0.0.19-beta

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/umd/index.js CHANGED
@@ -1214,7 +1214,7 @@
1214
1214
  };
1215
1215
  return __assign$3.apply(this, arguments);
1216
1216
  };
1217
- var __spreadArray$1 = (undefined && undefined.__spreadArray) || function (to, from, pack) {
1217
+ var __spreadArray = (undefined && undefined.__spreadArray) || function (to, from, pack) {
1218
1218
  if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
1219
1219
  if (ar || !(i in from)) {
1220
1220
  if (!ar) ar = Array.prototype.slice.call(from, 0, i);
@@ -1254,7 +1254,7 @@
1254
1254
  obv -= currentVolume;
1255
1255
  }
1256
1256
  return {
1257
- dataset: __spreadArray$1(__spreadArray$1([], preList.dataset, true), [data], false),
1257
+ dataset: __spreadArray(__spreadArray([], preList.dataset, true), [data], false),
1258
1258
  obv: obv,
1259
1259
  preClose: currentClose,
1260
1260
  };
@@ -1869,59 +1869,98 @@
1869
1869
  return Mfi;
1870
1870
  }());
1871
1871
 
1872
- var __spreadArray = (undefined && undefined.__spreadArray) || function (to, from, pack) {
1873
- if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
1874
- if (ar || !(i in from)) {
1875
- if (!ar) ar = Array.prototype.slice.call(from, 0, i);
1876
- ar[i] = from[i];
1877
- }
1878
- }
1879
- return to.concat(ar || Array.prototype.slice.call(from));
1880
- };
1881
- var Ad = /** @class */ (function () {
1882
- function Ad() {
1872
+ var Ichimoku = /** @class */ (function () {
1873
+ function Ichimoku() {
1883
1874
  }
1884
- Object.defineProperty(Ad.prototype, "init", {
1875
+ Object.defineProperty(Ichimoku.prototype, "init", {
1885
1876
  enumerable: false,
1886
1877
  configurable: true,
1887
1878
  writable: true,
1888
1879
  value: function (data) {
1889
- // AD 初始值
1890
- var ad = this.calcAD(data);
1880
+ var dataset = [data];
1891
1881
  return {
1892
- dataset: [data],
1893
- ad: ad,
1894
- preClose: data.c,
1882
+ dataset: dataset,
1883
+ ichimoku: this.calcIchimoku(dataset, dataset.length - 1),
1895
1884
  };
1896
1885
  }
1897
1886
  });
1898
- Object.defineProperty(Ad.prototype, "next", {
1887
+ /**
1888
+ * 優化說明:
1889
+ * 如果 preList.dataset 是一個可變陣列,我們直接 push 以達到最佳效能 O(1)。
1890
+ * 如果你的框架 (如 React state) 強制要求 immutable,則需要改回 [...prev, data] 的寫法。
1891
+ * 下面的寫法假設可以 Mutation (這在 Class 內部運算或 Backend 處理很常見)。
1892
+ */
1893
+ Object.defineProperty(Ichimoku.prototype, "next", {
1899
1894
  enumerable: false,
1900
1895
  configurable: true,
1901
1896
  writable: true,
1902
1897
  value: function (data, preList) {
1903
- // AD 累加
1904
- var ad = preList.ad + this.calcAD(data);
1898
+ // 強制轉型以進行 push (避免 typescript 報錯 readonly)
1899
+ var mutableDataset = preList.dataset;
1900
+ mutableDataset.push(data);
1901
+ // 只需要計算最後一筆
1902
+ var currentResult = this.calcIchimoku(mutableDataset, mutableDataset.length - 1);
1905
1903
  return {
1906
- dataset: __spreadArray(__spreadArray([], preList.dataset, true), [data], false),
1907
- ad: ad,
1908
- preClose: data.c,
1904
+ dataset: mutableDataset,
1905
+ ichimoku: currentResult,
1909
1906
  };
1910
1907
  }
1911
1908
  });
1912
- // AD 計算公式
1913
- Object.defineProperty(Ad.prototype, "calcAD", {
1909
+ // 核心計算邏輯
1910
+ Object.defineProperty(Ichimoku.prototype, "calcIchimoku", {
1914
1911
  enumerable: false,
1915
1912
  configurable: true,
1916
1913
  writable: true,
1917
- value: function (data) {
1918
- var h = data.h, l = data.l, c = data.c, v = data.v;
1919
- if (h === l)
1920
- return 0; // 避免除以零
1921
- return ((c - l - (h - c)) / (h - l)) * v;
1914
+ value: function (dataList, i) {
1915
+ var currentData = dataList[i];
1916
+ // 優化:直接傳入 index 與 list,不產生新陣列
1917
+ var tenkanVal = this.getMidPrice(dataList, i, 9);
1918
+ var kijunVal = this.getMidPrice(dataList, i, 26);
1919
+ var senkouBVal = this.getMidPrice(dataList, i, 52);
1920
+ var senkouAVal = null;
1921
+ if (tenkanVal !== null && kijunVal !== null) {
1922
+ senkouAVal = (tenkanVal + kijunVal) / 2;
1923
+ }
1924
+ return {
1925
+ tenkan: tenkanVal,
1926
+ kijun: kijunVal,
1927
+ senkouA: senkouAVal,
1928
+ senkouB: senkouBVal,
1929
+ chikou: currentData.c,
1930
+ };
1931
+ }
1932
+ });
1933
+ /**
1934
+ * 優化:
1935
+ * 1. 移除 .slice(),避免產生 Garbage Collection。
1936
+ * 2. 使用反向迴圈 (i--),通常在 JS 引擎中微幅快一點,且語意上是「從現在往回看」。
1937
+ */
1938
+ Object.defineProperty(Ichimoku.prototype, "getMidPrice", {
1939
+ enumerable: false,
1940
+ configurable: true,
1941
+ writable: true,
1942
+ value: function (list, currentIndex, periods) {
1943
+ if (currentIndex < periods - 1) {
1944
+ return null;
1945
+ }
1946
+ // 計算視窗的起始 index
1947
+ var start = currentIndex - (periods - 1);
1948
+ // 初始化最大最小
1949
+ // 小技巧:直接拿第一個值當初始值,避免 Infinity 的比較
1950
+ var maxH = list[start].h;
1951
+ var minL = list[start].l;
1952
+ // 從 start + 1 開始遍歷到 currentIndex
1953
+ for (var j = start + 1; j <= currentIndex; j++) {
1954
+ var _a = list[j], h = _a.h, l = _a.l;
1955
+ if (h > maxH)
1956
+ maxH = h;
1957
+ if (l < minL)
1958
+ minL = l;
1959
+ }
1960
+ return (maxH + minL) / 2;
1922
1961
  }
1923
1962
  });
1924
- return Ad;
1963
+ return Ichimoku;
1925
1964
  }());
1926
1965
 
1927
1966
  function add(a, b) {
@@ -1960,11 +1999,11 @@
1960
1999
  return devices;
1961
2000
  }
1962
2001
 
1963
- exports.Ad = Ad;
1964
2002
  exports.Angle = TwoPointAngle;
1965
2003
  exports.Boll = Boll;
1966
2004
  exports.Ema = Ema;
1967
2005
  exports.Gold = Gold;
2006
+ exports.Ichimoku = Ichimoku;
1968
2007
  exports.Kd = Kd;
1969
2008
  exports.Ma = Ma;
1970
2009
  exports.Macd = MACD;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ch20026103/anysis",
3
- "version": "0.0.19-alpha",
3
+ "version": "0.0.19-beta",
4
4
  "description": "provide many analyze methods in the library.",
5
5
  "keywords": [],
6
6
  "bugs": "git@github.com:cosmic1330/anysis/issues",
@@ -1,17 +0,0 @@
1
- import { StockListType, StockType } from "./types";
2
- type NewStockType = Required<Pick<StockType, "v">> & StockType;
3
- export type AdResType = {
4
- dataset: StockListType;
5
- ad: number;
6
- preClose: number;
7
- };
8
- interface AdType {
9
- init: (data: NewStockType) => AdResType;
10
- next: (data: NewStockType, preList: AdResType) => AdResType;
11
- }
12
- export default class Ad implements AdType {
13
- init(data: NewStockType): AdResType;
14
- next(data: NewStockType, preList: AdResType): AdResType;
15
- private calcAD;
16
- }
17
- export {};
@@ -1,57 +0,0 @@
1
- "use strict";
2
- var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
3
- if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
4
- if (ar || !(i in from)) {
5
- if (!ar) ar = Array.prototype.slice.call(from, 0, i);
6
- ar[i] = from[i];
7
- }
8
- }
9
- return to.concat(ar || Array.prototype.slice.call(from));
10
- };
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- var Ad = /** @class */ (function () {
13
- function Ad() {
14
- }
15
- Object.defineProperty(Ad.prototype, "init", {
16
- enumerable: false,
17
- configurable: true,
18
- writable: true,
19
- value: function (data) {
20
- // AD 初始值
21
- var ad = this.calcAD(data);
22
- return {
23
- dataset: [data],
24
- ad: ad,
25
- preClose: data.c,
26
- };
27
- }
28
- });
29
- Object.defineProperty(Ad.prototype, "next", {
30
- enumerable: false,
31
- configurable: true,
32
- writable: true,
33
- value: function (data, preList) {
34
- // AD 累加
35
- var ad = preList.ad + this.calcAD(data);
36
- return {
37
- dataset: __spreadArray(__spreadArray([], preList.dataset, true), [data], false),
38
- ad: ad,
39
- preClose: data.c,
40
- };
41
- }
42
- });
43
- // AD 計算公式
44
- Object.defineProperty(Ad.prototype, "calcAD", {
45
- enumerable: false,
46
- configurable: true,
47
- writable: true,
48
- value: function (data) {
49
- var h = data.h, l = data.l, c = data.c, v = data.v;
50
- if (h === l)
51
- return 0; // 避免除以零
52
- return ((c - l - (h - c)) / (h - l)) * v;
53
- }
54
- });
55
- return Ad;
56
- }());
57
- exports.default = Ad;
@@ -1,17 +0,0 @@
1
- import { StockListType, StockType } from "./types";
2
- type NewStockType = Required<Pick<StockType, "v">> & StockType;
3
- export type AdResType = {
4
- dataset: StockListType;
5
- ad: number;
6
- preClose: number;
7
- };
8
- interface AdType {
9
- init: (data: NewStockType) => AdResType;
10
- next: (data: NewStockType, preList: AdResType) => AdResType;
11
- }
12
- export default class Ad implements AdType {
13
- init(data: NewStockType): AdResType;
14
- next(data: NewStockType, preList: AdResType): AdResType;
15
- private calcAD;
16
- }
17
- export {};
@@ -1,55 +0,0 @@
1
- var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
2
- if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
3
- if (ar || !(i in from)) {
4
- if (!ar) ar = Array.prototype.slice.call(from, 0, i);
5
- ar[i] = from[i];
6
- }
7
- }
8
- return to.concat(ar || Array.prototype.slice.call(from));
9
- };
10
- var Ad = /** @class */ (function () {
11
- function Ad() {
12
- }
13
- Object.defineProperty(Ad.prototype, "init", {
14
- enumerable: false,
15
- configurable: true,
16
- writable: true,
17
- value: function (data) {
18
- // AD 初始值
19
- var ad = this.calcAD(data);
20
- return {
21
- dataset: [data],
22
- ad: ad,
23
- preClose: data.c,
24
- };
25
- }
26
- });
27
- Object.defineProperty(Ad.prototype, "next", {
28
- enumerable: false,
29
- configurable: true,
30
- writable: true,
31
- value: function (data, preList) {
32
- // AD 累加
33
- var ad = preList.ad + this.calcAD(data);
34
- return {
35
- dataset: __spreadArray(__spreadArray([], preList.dataset, true), [data], false),
36
- ad: ad,
37
- preClose: data.c,
38
- };
39
- }
40
- });
41
- // AD 計算公式
42
- Object.defineProperty(Ad.prototype, "calcAD", {
43
- enumerable: false,
44
- configurable: true,
45
- writable: true,
46
- value: function (data) {
47
- var h = data.h, l = data.l, c = data.c, v = data.v;
48
- if (h === l)
49
- return 0; // 避免除以零
50
- return ((c - l - (h - c)) / (h - l)) * v;
51
- }
52
- });
53
- return Ad;
54
- }());
55
- export default Ad;