@tradingaction/indicators 2.0.1

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.
Files changed (219) hide show
  1. package/LICENSE +24 -0
  2. package/README.md +5 -0
  3. package/lib/calculator/atr.d.ts +18 -0
  4. package/lib/calculator/atr.js +51 -0
  5. package/lib/calculator/atr.js.map +1 -0
  6. package/lib/calculator/bollingerband.d.ts +14 -0
  7. package/lib/calculator/bollingerband.js +72 -0
  8. package/lib/calculator/bollingerband.js.map +1 -0
  9. package/lib/calculator/change.d.ts +14 -0
  10. package/lib/calculator/change.js +30 -0
  11. package/lib/calculator/change.js.map +1 -0
  12. package/lib/calculator/compare.d.ts +10 -0
  13. package/lib/calculator/compare.js +50 -0
  14. package/lib/calculator/compare.js.map +1 -0
  15. package/lib/calculator/defaultOptionsForComputation.d.ts +91 -0
  16. package/lib/calculator/defaultOptionsForComputation.js +100 -0
  17. package/lib/calculator/defaultOptionsForComputation.js.map +1 -0
  18. package/lib/calculator/elderRay.d.ts +23 -0
  19. package/lib/calculator/elderRay.js +69 -0
  20. package/lib/calculator/elderRay.js.map +1 -0
  21. package/lib/calculator/ema.d.ts +12 -0
  22. package/lib/calculator/ema.js +73 -0
  23. package/lib/calculator/ema.js.map +1 -0
  24. package/lib/calculator/forceIndex.d.ts +12 -0
  25. package/lib/calculator/forceIndex.js +27 -0
  26. package/lib/calculator/forceIndex.js.map +1 -0
  27. package/lib/calculator/heikinAshi.d.ts +4 -0
  28. package/lib/calculator/heikinAshi.js +30 -0
  29. package/lib/calculator/heikinAshi.js.map +1 -0
  30. package/lib/calculator/index.d.ts +19 -0
  31. package/lib/calculator/index.js +20 -0
  32. package/lib/calculator/index.js.map +1 -0
  33. package/lib/calculator/kagi.d.ts +11 -0
  34. package/lib/calculator/kagi.js +200 -0
  35. package/lib/calculator/kagi.js.map +1 -0
  36. package/lib/calculator/macd.d.ts +18 -0
  37. package/lib/calculator/macd.js +57 -0
  38. package/lib/calculator/macd.js.map +1 -0
  39. package/lib/calculator/pointAndFigure.d.ts +10 -0
  40. package/lib/calculator/pointAndFigure.js +215 -0
  41. package/lib/calculator/pointAndFigure.js.map +1 -0
  42. package/lib/calculator/renko.d.ts +12 -0
  43. package/lib/calculator/renko.js +170 -0
  44. package/lib/calculator/renko.js.map +1 -0
  45. package/lib/calculator/rsi.d.ts +12 -0
  46. package/lib/calculator/rsi.js +87 -0
  47. package/lib/calculator/rsi.js.map +1 -0
  48. package/lib/calculator/sar.d.ts +12 -0
  49. package/lib/calculator/sar.js +87 -0
  50. package/lib/calculator/sar.js.map +1 -0
  51. package/lib/calculator/sma.d.ts +12 -0
  52. package/lib/calculator/sma.js +27 -0
  53. package/lib/calculator/sma.js.map +1 -0
  54. package/lib/calculator/smoothedForceIndex.d.ts +13 -0
  55. package/lib/calculator/smoothedForceIndex.js +40 -0
  56. package/lib/calculator/smoothedForceIndex.js.map +1 -0
  57. package/lib/calculator/sto.d.ts +19 -0
  58. package/lib/calculator/sto.js +91 -0
  59. package/lib/calculator/sto.js.map +1 -0
  60. package/lib/calculator/tma.d.ts +12 -0
  61. package/lib/calculator/tma.js +66 -0
  62. package/lib/calculator/tma.js.map +1 -0
  63. package/lib/calculator/wma.d.ts +12 -0
  64. package/lib/calculator/wma.js +33 -0
  65. package/lib/calculator/wma.js.map +1 -0
  66. package/lib/index.d.ts +1 -0
  67. package/lib/index.js +2 -0
  68. package/lib/index.js.map +1 -0
  69. package/lib/indicator/algorithm.d.ts +10 -0
  70. package/lib/indicator/algorithm.js +35 -0
  71. package/lib/indicator/algorithm.js.map +1 -0
  72. package/lib/indicator/atr.d.ts +26 -0
  73. package/lib/indicator/atr.js +27 -0
  74. package/lib/indicator/atr.js.map +1 -0
  75. package/lib/indicator/baseIndicator.d.ts +16 -0
  76. package/lib/indicator/baseIndicator.js +59 -0
  77. package/lib/indicator/baseIndicator.js.map +1 -0
  78. package/lib/indicator/bollingerBand.d.ts +24 -0
  79. package/lib/indicator/bollingerBand.js +27 -0
  80. package/lib/indicator/bollingerBand.js.map +1 -0
  81. package/lib/indicator/change.d.ts +24 -0
  82. package/lib/indicator/change.js +25 -0
  83. package/lib/indicator/change.js.map +1 -0
  84. package/lib/indicator/compare.d.ts +24 -0
  85. package/lib/indicator/compare.js +29 -0
  86. package/lib/indicator/compare.js.map +1 -0
  87. package/lib/indicator/defaultOptionsForAppearance.d.ts +105 -0
  88. package/lib/indicator/defaultOptionsForAppearance.js +77 -0
  89. package/lib/indicator/defaultOptionsForAppearance.js.map +1 -0
  90. package/lib/indicator/elderImpulse.d.ts +7 -0
  91. package/lib/indicator/elderImpulse.js +61 -0
  92. package/lib/indicator/elderImpulse.js.map +1 -0
  93. package/lib/indicator/elderRay.d.ts +24 -0
  94. package/lib/indicator/elderRay.js +29 -0
  95. package/lib/indicator/elderRay.js.map +1 -0
  96. package/lib/indicator/ema.d.ts +24 -0
  97. package/lib/indicator/ema.js +29 -0
  98. package/lib/indicator/ema.js.map +1 -0
  99. package/lib/indicator/forceIndex.d.ts +24 -0
  100. package/lib/indicator/forceIndex.js +29 -0
  101. package/lib/indicator/forceIndex.js.map +1 -0
  102. package/lib/indicator/heikinAshi.d.ts +3 -0
  103. package/lib/indicator/heikinAshi.js +28 -0
  104. package/lib/indicator/heikinAshi.js.map +1 -0
  105. package/lib/indicator/index.d.ts +23 -0
  106. package/lib/indicator/index.js +24 -0
  107. package/lib/indicator/index.js.map +1 -0
  108. package/lib/indicator/kagi.d.ts +11 -0
  109. package/lib/indicator/kagi.js +13 -0
  110. package/lib/indicator/kagi.js.map +1 -0
  111. package/lib/indicator/macd.d.ts +24 -0
  112. package/lib/indicator/macd.js +32 -0
  113. package/lib/indicator/macd.js.map +1 -0
  114. package/lib/indicator/pointAndFigure.d.ts +10 -0
  115. package/lib/indicator/pointAndFigure.js +13 -0
  116. package/lib/indicator/pointAndFigure.js.map +1 -0
  117. package/lib/indicator/renko.d.ts +12 -0
  118. package/lib/indicator/renko.js +13 -0
  119. package/lib/indicator/renko.js.map +1 -0
  120. package/lib/indicator/rsi.d.ts +24 -0
  121. package/lib/indicator/rsi.js +29 -0
  122. package/lib/indicator/rsi.js.map +1 -0
  123. package/lib/indicator/sar.d.ts +24 -0
  124. package/lib/indicator/sar.js +29 -0
  125. package/lib/indicator/sar.js.map +1 -0
  126. package/lib/indicator/sma.d.ts +24 -0
  127. package/lib/indicator/sma.js +29 -0
  128. package/lib/indicator/sma.js.map +1 -0
  129. package/lib/indicator/stochasticOscillator.d.ts +24 -0
  130. package/lib/indicator/stochasticOscillator.js +27 -0
  131. package/lib/indicator/stochasticOscillator.js.map +1 -0
  132. package/lib/indicator/tma.d.ts +24 -0
  133. package/lib/indicator/tma.js +29 -0
  134. package/lib/indicator/tma.js.map +1 -0
  135. package/lib/indicator/wma.d.ts +24 -0
  136. package/lib/indicator/wma.js +29 -0
  137. package/lib/indicator/wma.js.map +1 -0
  138. package/lib/utils/functor.d.ts +1 -0
  139. package/lib/utils/functor.js +4 -0
  140. package/lib/utils/functor.js.map +1 -0
  141. package/lib/utils/identity.d.ts +1 -0
  142. package/lib/utils/identity.js +2 -0
  143. package/lib/utils/identity.js.map +1 -0
  144. package/lib/utils/index.d.ts +8 -0
  145. package/lib/utils/index.js +9 -0
  146. package/lib/utils/index.js.map +1 -0
  147. package/lib/utils/mappedSlidingWindow.d.ts +15 -0
  148. package/lib/utils/mappedSlidingWindow.js +77 -0
  149. package/lib/utils/mappedSlidingWindow.js.map +1 -0
  150. package/lib/utils/merge.d.ts +11 -0
  151. package/lib/utils/merge.js +70 -0
  152. package/lib/utils/merge.js.map +1 -0
  153. package/lib/utils/path.d.ts +1 -0
  154. package/lib/utils/path.js +15 -0
  155. package/lib/utils/path.js.map +1 -0
  156. package/lib/utils/rebind.d.ts +1 -0
  157. package/lib/utils/rebind.js +18 -0
  158. package/lib/utils/rebind.js.map +1 -0
  159. package/lib/utils/slidingWindow.d.ts +19 -0
  160. package/lib/utils/slidingWindow.js +111 -0
  161. package/lib/utils/slidingWindow.js.map +1 -0
  162. package/lib/utils/zipper.d.ts +7 -0
  163. package/lib/utils/zipper.js +36 -0
  164. package/lib/utils/zipper.js.map +1 -0
  165. package/package.json +49 -0
  166. package/src/calculator/atr.ts +88 -0
  167. package/src/calculator/bollingerband.ts +102 -0
  168. package/src/calculator/change.ts +53 -0
  169. package/src/calculator/compare.ts +68 -0
  170. package/src/calculator/defaultOptionsForComputation.ts +117 -0
  171. package/src/calculator/elderRay.ts +90 -0
  172. package/src/calculator/ema.ts +92 -0
  173. package/src/calculator/forceIndex.ts +43 -0
  174. package/src/calculator/heikinAshi.ts +38 -0
  175. package/src/calculator/index.ts +19 -0
  176. package/src/calculator/kagi.ts +249 -0
  177. package/src/calculator/macd.ts +90 -0
  178. package/src/calculator/pointAndFigure.ts +255 -0
  179. package/src/calculator/renko.ts +227 -0
  180. package/src/calculator/rsi.ts +114 -0
  181. package/src/calculator/sar.ts +117 -0
  182. package/src/calculator/sma.ts +41 -0
  183. package/src/calculator/smoothedForceIndex.ts +53 -0
  184. package/src/calculator/sto.ts +118 -0
  185. package/src/calculator/tma.ts +82 -0
  186. package/src/calculator/wma.ts +49 -0
  187. package/src/index.ts +1 -0
  188. package/src/indicator/algorithm.ts +53 -0
  189. package/src/indicator/atr.ts +58 -0
  190. package/src/indicator/baseIndicator.ts +97 -0
  191. package/src/indicator/bollingerBand.ts +55 -0
  192. package/src/indicator/change.ts +51 -0
  193. package/src/indicator/compare.ts +57 -0
  194. package/src/indicator/defaultOptionsForAppearance.ts +77 -0
  195. package/src/indicator/elderImpulse.ts +73 -0
  196. package/src/indicator/elderRay.ts +56 -0
  197. package/src/indicator/ema.ts +58 -0
  198. package/src/indicator/forceIndex.ts +57 -0
  199. package/src/indicator/heikinAshi.ts +35 -0
  200. package/src/indicator/index.ts +25 -0
  201. package/src/indicator/kagi.ts +18 -0
  202. package/src/indicator/macd.ts +60 -0
  203. package/src/indicator/pointAndFigure.ts +18 -0
  204. package/src/indicator/renko.ts +18 -0
  205. package/src/indicator/rsi.ts +58 -0
  206. package/src/indicator/sar.ts +56 -0
  207. package/src/indicator/sma.ts +57 -0
  208. package/src/indicator/stochasticOscillator.ts +56 -0
  209. package/src/indicator/tma.ts +57 -0
  210. package/src/indicator/wma.ts +58 -0
  211. package/src/utils/functor.ts +3 -0
  212. package/src/utils/identity.ts +1 -0
  213. package/src/utils/index.ts +8 -0
  214. package/src/utils/mappedSlidingWindow.ts +95 -0
  215. package/src/utils/merge.ts +93 -0
  216. package/src/utils/path.ts +16 -0
  217. package/src/utils/rebind.ts +19 -0
  218. package/src/utils/slidingWindow.ts +142 -0
  219. package/src/utils/zipper.ts +45 -0
@@ -0,0 +1,215 @@
1
+ import { PointAndFigure as defaultOptions } from "./defaultOptionsForComputation";
2
+ function createBox(d, dateAccessor, dateMutator) {
3
+ const box = {
4
+ open: d.open,
5
+ fromDate: dateAccessor(d),
6
+ toDate: dateAccessor(d),
7
+ startOfYear: d.startOfYear,
8
+ startOfQuarter: d.startOfQuarter,
9
+ startOfMonth: d.startOfMonth,
10
+ startOfWeek: d.startOfWeek,
11
+ };
12
+ dateMutator(box, dateAccessor(d));
13
+ return box;
14
+ }
15
+ function updateColumns(columnData, dateAccessor, dateMutator) {
16
+ columnData.forEach(function (d) {
17
+ d.startOfYear = false;
18
+ d.startOfQuarter = false;
19
+ d.startOfMonth = false;
20
+ d.startOfWeek = false;
21
+ d.boxes.forEach(function (eachBox) {
22
+ if (d.open === undefined) {
23
+ d.open = eachBox.open;
24
+ }
25
+ d.close = eachBox.close;
26
+ d.high = Math.max(d.open, d.close);
27
+ d.low = Math.min(d.open, d.close);
28
+ if (d.fromDate === undefined) {
29
+ d.fromDate = eachBox.fromDate;
30
+ }
31
+ if (d.date === undefined) {
32
+ d.date = eachBox.date;
33
+ }
34
+ d.toDate = eachBox.toDate;
35
+ if (eachBox.startOfYear) {
36
+ d.startOfYear = d.startOfYear || eachBox.startOfYear;
37
+ d.startOfQuarter = eachBox.startOfQuarter;
38
+ d.startOfMonth = eachBox.startOfMonth;
39
+ d.startOfWeek = eachBox.startOfWeek;
40
+ dateMutator(d, dateAccessor(eachBox));
41
+ }
42
+ if (d.startOfQuarter !== true && eachBox.startOfQuarter) {
43
+ d.startOfQuarter = eachBox.startOfQuarter;
44
+ d.startOfMonth = eachBox.startOfMonth;
45
+ d.startOfWeek = eachBox.startOfWeek;
46
+ dateMutator(d, dateAccessor(eachBox));
47
+ }
48
+ if (d.startOfMonth !== true && eachBox.startOfMonth) {
49
+ d.startOfMonth = eachBox.startOfMonth;
50
+ d.startOfWeek = eachBox.startOfWeek;
51
+ dateMutator(d, dateAccessor(eachBox));
52
+ }
53
+ if (d.startOfWeek !== true && eachBox.startOfWeek) {
54
+ d.startOfWeek = eachBox.startOfWeek;
55
+ dateMutator(d, dateAccessor(eachBox));
56
+ }
57
+ });
58
+ });
59
+ return columnData;
60
+ }
61
+ export default function () {
62
+ let options = defaultOptions;
63
+ let dateAccessor = (d) => d.date;
64
+ let dateMutator = (d, date) => {
65
+ d.date = date;
66
+ };
67
+ const calculator = (rawData) => {
68
+ const { reversal, boxSize, sourcePath } = options;
69
+ const source =
70
+ // eslint-disable-next-line prettier/prettier
71
+ sourcePath === "high/low" ? ((d) => ({ high: d.high, low: d.low })) : ((d) => ({ high: d.close, low: d.close }));
72
+ const pricingMethod = source;
73
+ const columnData = [];
74
+ // @ts-ignore
75
+ let column = {
76
+ boxes: [],
77
+ open: rawData[0].open,
78
+ };
79
+ let box = createBox(rawData[0], dateAccessor, dateMutator);
80
+ columnData.push(column);
81
+ rawData.forEach(function (d) {
82
+ // @ts-ignore
83
+ column.volume = (column.volume || 0) + d.volume;
84
+ if (!box.startOfYear) {
85
+ box.startOfYear = d.startOfYear;
86
+ if (box.startOfYear) {
87
+ dateMutator(box, dateAccessor(d));
88
+ }
89
+ }
90
+ if (!box.startOfYear && !box.startOfQuarter) {
91
+ box.startOfQuarter = d.startOfQuarter;
92
+ if (box.startOfQuarter && !box.startOfYear) {
93
+ dateMutator(box, dateAccessor(d));
94
+ }
95
+ }
96
+ if (!box.startOfQuarter && !box.startOfMonth) {
97
+ box.startOfMonth = d.startOfMonth;
98
+ if (box.startOfMonth && !box.startOfQuarter) {
99
+ dateMutator(box, dateAccessor(d));
100
+ }
101
+ }
102
+ if (!box.startOfMonth && !box.startOfWeek) {
103
+ box.startOfWeek = d.startOfWeek;
104
+ if (box.startOfWeek && !box.startOfMonth) {
105
+ dateMutator(box, dateAccessor(d));
106
+ }
107
+ }
108
+ if (columnData.length === 1 && column.boxes.length === 0) {
109
+ const upwardMovement = Math.max(pricingMethod(d).high - column.open, 0); // upward movement
110
+ const downwardMovement = Math.abs(Math.min(column.open - pricingMethod(d).low, 0)); // downward movement
111
+ column.direction = upwardMovement > downwardMovement ? 1 : -1;
112
+ if (boxSize * reversal < upwardMovement || boxSize * reversal < downwardMovement) {
113
+ // enough movement to trigger a reversal
114
+ box.toDate = dateAccessor(d);
115
+ box.open = column.open;
116
+ const noOfBoxes = column.direction > 0
117
+ ? Math.floor(upwardMovement / boxSize)
118
+ : Math.floor(downwardMovement / boxSize);
119
+ for (let i = 0; i < noOfBoxes; i++) {
120
+ // @ts-ignore
121
+ box.close = box.open + column.direction * boxSize;
122
+ // @ts-ignore
123
+ const prevBoxClose = box.close;
124
+ column.boxes.push(box);
125
+ box = createBox(box, dateAccessor, dateMutator);
126
+ // box = cloneMe(box);
127
+ box.open = prevBoxClose;
128
+ }
129
+ box.fromDate = dateAccessor(d);
130
+ // @ts-ignore
131
+ box.date = dateAccessor(d);
132
+ }
133
+ }
134
+ else {
135
+ // one or more boxes already formed in the current column
136
+ const upwardMovement = Math.max(pricingMethod(d).high - box.open, 0); // upward movement
137
+ const downwardMovement = Math.abs(Math.min(pricingMethod(d).low - box.open, 0)); // downward movement
138
+ if ((column.direction > 0 && upwardMovement > boxSize) /* rising column AND box can be formed */ ||
139
+ (column.direction < 0 && downwardMovement > boxSize) /* falling column AND box can be formed */) {
140
+ // form another box
141
+ // @ts-ignore
142
+ box.close = box.open + column.direction * boxSize;
143
+ box.toDate = dateAccessor(d);
144
+ // @ts-ignore
145
+ const prevBoxClose = box.close;
146
+ column.boxes.push(box);
147
+ box = createBox(d, dateAccessor, dateMutator);
148
+ box.open = prevBoxClose;
149
+ box.fromDate = dateAccessor(d);
150
+ dateMutator(box, dateAccessor(d));
151
+ }
152
+ else if (
153
+ /* rising column and there is downward movement to trigger a reversal */
154
+ (column.direction > 0 && downwardMovement > boxSize * reversal) ||
155
+ /* falling column and there is downward movement to trigger a reversal */
156
+ (column.direction < 0 && upwardMovement > boxSize * reversal)) {
157
+ // reversal
158
+ box.open = box.open + -1 * column.direction * boxSize;
159
+ box.toDate = dateAccessor(d);
160
+ // box.displayDate = d.displayDate;
161
+ dateMutator(box, dateAccessor(d));
162
+ // box.startOfYear = d.startOfYear;
163
+ // box.startOfQuarter = d.startOfQuarter;
164
+ // box.startOfMonth = d.startOfMonth;
165
+ // box.startOfWeek = d.startOfWeek;
166
+ // var idx = index + 1;
167
+ column = {
168
+ boxes: [],
169
+ // @ts-ignore
170
+ volume: 0,
171
+ direction: -1 * column.direction,
172
+ };
173
+ const noOfBoxes = column.direction > 0
174
+ ? Math.floor(upwardMovement / boxSize)
175
+ : Math.floor(downwardMovement / boxSize);
176
+ for (let i = 0; i < noOfBoxes; i++) {
177
+ // @ts-ignore
178
+ box.close = box.open + column.direction * boxSize;
179
+ // @ts-ignore
180
+ const prevBoxClose = box.close;
181
+ column.boxes.push(box);
182
+ box = createBox(d, dateAccessor, dateMutator);
183
+ box.open = prevBoxClose;
184
+ }
185
+ columnData.push(column);
186
+ }
187
+ }
188
+ });
189
+ updateColumns(columnData, dateAccessor, dateMutator);
190
+ return columnData;
191
+ };
192
+ calculator.options = (newOptions) => {
193
+ if (newOptions === undefined) {
194
+ return options;
195
+ }
196
+ options = Object.assign(Object.assign({}, defaultOptions), newOptions);
197
+ return calculator;
198
+ };
199
+ calculator.dateMutator = (newDateMutator) => {
200
+ if (newDateMutator === undefined) {
201
+ return dateMutator;
202
+ }
203
+ dateMutator = newDateMutator;
204
+ return calculator;
205
+ };
206
+ calculator.dateAccessor = (newDateAccessor) => {
207
+ if (newDateAccessor === undefined) {
208
+ return dateAccessor;
209
+ }
210
+ dateAccessor = newDateAccessor;
211
+ return calculator;
212
+ };
213
+ return calculator;
214
+ }
215
+ //# sourceMappingURL=pointAndFigure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pointAndFigure.js","sourceRoot":"","sources":["../../src/calculator/pointAndFigure.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export default function (): {
2
+ (rawData: any[]): any[];
3
+ options(newOptions?: any): {
4
+ reversalType: string;
5
+ windowSize: number;
6
+ fixedBrickSize: number;
7
+ sourcePath: string;
8
+ percentage: number;
9
+ } | any;
10
+ dateMutator(newDateMutator?: any): ((d: any, date: any) => void) | any;
11
+ dateAccessor(newDateAccessor?: any): ((d: any) => any) | any;
12
+ };
@@ -0,0 +1,170 @@
1
+ import { functor, merge } from "../utils";
2
+ import atr from "./atr";
3
+ import { Renko as defaultOptions } from "./defaultOptionsForComputation";
4
+ export default function () {
5
+ let options = defaultOptions;
6
+ let dateAccessor = (d) => d.date;
7
+ let dateMutator = (d, date) => {
8
+ d.date = date;
9
+ };
10
+ const calculator = (rawData) => {
11
+ const { reversalType, fixedBrickSize, sourcePath, windowSize, percentage } = options;
12
+ const source = sourcePath === "high/low"
13
+ ? (d) => ({ high: d.high, low: d.low })
14
+ : (d) => ({ high: d.close, low: d.close });
15
+ const pricingMethod = source;
16
+ let brickSize;
17
+ if (reversalType === "ATR") {
18
+ const atrAlgorithm = atr().options({ windowSize });
19
+ const atrCalculator = merge()
20
+ .algorithm(atrAlgorithm)
21
+ .merge((d, c) => {
22
+ d["atr" + windowSize] = c;
23
+ });
24
+ atrCalculator(rawData);
25
+ brickSize = (d) => d["atr" + windowSize];
26
+ }
27
+ else if (reversalType === "Percentage LTP") {
28
+ // Calculate brick size as a percentage of the last price
29
+ brickSize = (d) => d.close * (percentage / 100);
30
+ }
31
+ else {
32
+ brickSize = functor(fixedBrickSize);
33
+ }
34
+ const renkoData = [];
35
+ let index = 0;
36
+ let prevBrickClose = rawData[index].open;
37
+ let prevBrickOpen = rawData[index].open;
38
+ let brick = {};
39
+ let direction = 0;
40
+ rawData.forEach(function (d, idx) {
41
+ if (brick.from === undefined) {
42
+ brick.high = d.high;
43
+ brick.low = d.low;
44
+ brick.startOfYear = d.startOfYear;
45
+ brick.startOfQuarter = d.startOfQuarter;
46
+ brick.startOfMonth = d.startOfMonth;
47
+ brick.startOfWeek = d.startOfWeek;
48
+ brick.from = idx;
49
+ brick.fromDate = dateAccessor(d);
50
+ dateMutator(brick, dateAccessor(d));
51
+ }
52
+ brick.volume = (brick.volume || 0) + d.volume;
53
+ const prevCloseToHigh = prevBrickClose - pricingMethod(d).high;
54
+ const prevCloseToLow = prevBrickClose - pricingMethod(d).low;
55
+ const prevOpenToHigh = prevBrickOpen - pricingMethod(d).high;
56
+ const prevOpenToLow = prevBrickOpen - pricingMethod(d).low;
57
+ const priceMovement = Math.min(Math.abs(prevCloseToHigh), Math.abs(prevCloseToLow), Math.abs(prevOpenToHigh), Math.abs(prevOpenToLow));
58
+ // @ts-ignore
59
+ brick.high = Math.max(brick.high, d.high);
60
+ // @ts-ignore
61
+ brick.low = Math.min(brick.low, d.low);
62
+ if (!brick.startOfYear) {
63
+ brick.startOfYear = d.startOfYear;
64
+ if (brick.startOfYear) {
65
+ dateMutator(brick, dateAccessor(d));
66
+ }
67
+ }
68
+ if (!brick.startOfQuarter) {
69
+ brick.startOfQuarter = d.startOfQuarter;
70
+ if (brick.startOfQuarter && !brick.startOfYear) {
71
+ dateMutator(brick, dateAccessor(d));
72
+ }
73
+ }
74
+ if (!brick.startOfMonth) {
75
+ brick.startOfMonth = d.startOfMonth;
76
+ if (brick.startOfMonth && !brick.startOfQuarter) {
77
+ dateMutator(brick, dateAccessor(d));
78
+ }
79
+ }
80
+ if (!brick.startOfWeek) {
81
+ brick.startOfWeek = d.startOfWeek;
82
+ if (brick.startOfWeek && !brick.startOfMonth) {
83
+ dateMutator(brick, dateAccessor(d));
84
+ }
85
+ }
86
+ if (brickSize(d)) {
87
+ const noOfBricks = Math.floor(priceMovement / brickSize(d));
88
+ brick.open =
89
+ Math.abs(prevCloseToHigh) < Math.abs(prevOpenToHigh) ||
90
+ Math.abs(prevCloseToLow) < Math.abs(prevOpenToLow)
91
+ ? prevBrickClose
92
+ : prevBrickOpen;
93
+ if (noOfBricks >= 1) {
94
+ let j = 0;
95
+ for (j = 0; j < noOfBricks; j++) {
96
+ brick.close =
97
+ // @ts-ignore
98
+ brick.open < pricingMethod(d).high
99
+ ? // if brick open is less than current price it means it is green/hollow brick
100
+ brick.open + brickSize(d)
101
+ : // @ts-ignore
102
+ brick.open - brickSize(d);
103
+ // @ts-ignore
104
+ direction = brick.close > brick.open ? 1 : -1;
105
+ brick.direction = direction;
106
+ brick.to = idx;
107
+ brick.toDate = dateAccessor(d);
108
+ // brick.diff = brick.open - brick.close;
109
+ // brick.atr = d.atr;
110
+ brick.fullyFormed = true;
111
+ renkoData.push(brick);
112
+ prevBrickClose = brick.close;
113
+ prevBrickOpen = brick.open;
114
+ const newBrick = {
115
+ high: brick.high,
116
+ low: brick.low,
117
+ open: brick.close,
118
+ startOfYear: false,
119
+ startOfMonth: false,
120
+ startOfQuarter: false,
121
+ startOfWeek: false,
122
+ };
123
+ brick = newBrick;
124
+ brick.from = idx;
125
+ brick.fromDate = dateAccessor(d);
126
+ // indexMutator(brick, index + j);
127
+ dateMutator(brick, dateAccessor(d));
128
+ brick.volume = (brick.volume || 0) + d.volume;
129
+ }
130
+ index = index + j - 1;
131
+ brick = {};
132
+ }
133
+ else {
134
+ if (idx === rawData.length - 1) {
135
+ brick.close = direction > 0 ? pricingMethod(d).high : pricingMethod(d).low;
136
+ brick.to = idx;
137
+ brick.toDate = dateAccessor(d);
138
+ dateMutator(brick, dateAccessor(d));
139
+ brick.fullyFormed = false;
140
+ renkoData.push(brick);
141
+ }
142
+ }
143
+ }
144
+ });
145
+ return renkoData;
146
+ };
147
+ calculator.options = (newOptions) => {
148
+ if (newOptions === undefined) {
149
+ return options;
150
+ }
151
+ options = Object.assign(Object.assign({}, defaultOptions), newOptions);
152
+ return calculator;
153
+ };
154
+ calculator.dateMutator = (newDateMutator) => {
155
+ if (newDateMutator === undefined) {
156
+ return dateMutator;
157
+ }
158
+ dateMutator = newDateMutator;
159
+ return calculator;
160
+ };
161
+ calculator.dateAccessor = (newDateAccessor) => {
162
+ if (newDateAccessor === undefined) {
163
+ return dateAccessor;
164
+ }
165
+ dateAccessor = newDateAccessor;
166
+ return calculator;
167
+ };
168
+ return calculator;
169
+ }
170
+ //# sourceMappingURL=renko.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renko.js","sourceRoot":"","sources":["../../src/calculator/renko.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export interface RSIOptions {
2
+ windowSize: number;
3
+ sourcePath?: string;
4
+ }
5
+ export default function (): {
6
+ (data: any[]): any[];
7
+ undefinedLength(): number;
8
+ options(newOptions?: RSIOptions): {
9
+ windowSize: number;
10
+ sourcePath: string;
11
+ } | any;
12
+ };
@@ -0,0 +1,87 @@
1
+ /*
2
+ https://github.com/ScottLogic/d3fc/blob/master/src/indicator/algorithm/calculator/relativeStrengthIndex.js
3
+
4
+ The MIT License (MIT)
5
+
6
+ Copyright (c) 2014-2015 Scott Logic Ltd.
7
+
8
+ Permission is hereby granted, free of charge, to any person obtaining a copy
9
+ of this software and associated documentation files (the "Software"), to deal
10
+ in the Software without restriction, including without limitation the rights
11
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12
+ copies of the Software, and to permit persons to whom the Software is
13
+ furnished to do so, subject to the following conditions:
14
+
15
+ The above copyright notice and this permission notice shall be included in
16
+ all copies or substantial portions of the Software.
17
+
18
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24
+ THE SOFTWARE.
25
+ */
26
+ import { mean } from "d3-array";
27
+ import { path, slidingWindow } from "../utils";
28
+ import { RSI as defaultOptions } from "./defaultOptionsForComputation";
29
+ export default function () {
30
+ let options = defaultOptions;
31
+ const calculator = (data) => {
32
+ const { windowSize, sourcePath } = options;
33
+ // @ts-ignore
34
+ const source = path(sourcePath);
35
+ let prevAvgGain;
36
+ let prevAvgLoss;
37
+ const rsiAlgorithm = slidingWindow()
38
+ .windowSize(windowSize)
39
+ .accumulator((values) => {
40
+ const avgGain = prevAvgGain !== undefined
41
+ ? (prevAvgGain * (windowSize - 1) + values[values.length - 1].gain) / windowSize
42
+ : mean(values, (each) => each.gain);
43
+ if (avgGain === undefined) {
44
+ return undefined;
45
+ }
46
+ const avgLoss = prevAvgLoss !== undefined
47
+ ? (prevAvgLoss * (windowSize - 1) + values[values.length - 1].loss) / windowSize
48
+ : mean(values, (each) => each.loss);
49
+ if (avgLoss === undefined) {
50
+ return undefined;
51
+ }
52
+ const relativeStrength = avgGain / avgLoss;
53
+ const rsi = 100 - 100 / (1 + relativeStrength);
54
+ prevAvgGain = avgGain;
55
+ prevAvgLoss = avgLoss;
56
+ return rsi;
57
+ });
58
+ const gainsAndLossesCalculator = slidingWindow()
59
+ .windowSize(2)
60
+ .undefinedValue(() => [0, 0])
61
+ .accumulator((tuple) => {
62
+ const prev = tuple[0];
63
+ const now = tuple[1];
64
+ const change = source(now) - source(prev);
65
+ return {
66
+ gain: Math.max(change, 0),
67
+ loss: Math.abs(Math.min(change, 0)),
68
+ };
69
+ });
70
+ const gainsAndLosses = gainsAndLossesCalculator(data);
71
+ const rsiData = rsiAlgorithm(gainsAndLosses);
72
+ return rsiData;
73
+ };
74
+ calculator.undefinedLength = () => {
75
+ const { windowSize } = options;
76
+ return windowSize - 1;
77
+ };
78
+ calculator.options = (newOptions) => {
79
+ if (newOptions === undefined) {
80
+ return options;
81
+ }
82
+ options = Object.assign(Object.assign({}, defaultOptions), newOptions);
83
+ return calculator;
84
+ };
85
+ return calculator;
86
+ }
87
+ //# sourceMappingURL=rsi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rsi.js","sourceRoot":"","sources":["../../src/calculator/rsi.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export interface SAROptions {
2
+ readonly accelerationFactor: number;
3
+ readonly maxAccelerationFactor: number;
4
+ }
5
+ export default function (): {
6
+ (data: any[]): any;
7
+ undefinedLength(): number;
8
+ options(newOptions?: SAROptions): {
9
+ accelerationFactor: number;
10
+ maxAccelerationFactor: number;
11
+ } | any;
12
+ };
@@ -0,0 +1,87 @@
1
+ import { mappedSlidingWindow } from "../utils";
2
+ import { SAR as defaultOptions } from "./defaultOptionsForComputation";
3
+ function calc(prev, now) {
4
+ const risingSar = prev.risingSar + prev.af * (prev.risingEp - prev.risingSar);
5
+ const fallingSar = prev.fallingSar - prev.af * (prev.fallingSar - prev.fallingEp);
6
+ const risingEp = Math.max(prev.risingEp, now.high);
7
+ const fallingEp = Math.min(prev.fallingEp, now.low);
8
+ return {
9
+ risingSar,
10
+ fallingSar,
11
+ risingEp,
12
+ fallingEp,
13
+ };
14
+ }
15
+ export default function () {
16
+ let options = defaultOptions;
17
+ const calculator = (data) => {
18
+ const { accelerationFactor, maxAccelerationFactor } = options;
19
+ const algorithm = mappedSlidingWindow()
20
+ .windowSize(2)
21
+ // @ts-ignore
22
+ .undefinedValue(({ high, low }) => {
23
+ return {
24
+ risingSar: low,
25
+ risingEp: high,
26
+ fallingSar: high,
27
+ fallingEp: low,
28
+ af: accelerationFactor,
29
+ };
30
+ })
31
+ .accumulator(([prev, now]) => {
32
+ const { risingSar, fallingSar, risingEp, fallingEp } = calc(prev, now);
33
+ if (prev.use === undefined && risingSar > now.low && fallingSar < now.high) {
34
+ return {
35
+ risingSar,
36
+ fallingSar,
37
+ risingEp,
38
+ fallingEp,
39
+ };
40
+ }
41
+ const use = prev.use !== undefined
42
+ ? prev.use === "rising"
43
+ ? risingSar > now.low
44
+ ? "falling"
45
+ : "rising"
46
+ : fallingSar < now.high
47
+ ? "rising"
48
+ : "falling"
49
+ : risingSar > now.low
50
+ ? "falling"
51
+ : "rising";
52
+ const current = prev.use === use
53
+ ? {
54
+ af: Math.min(maxAccelerationFactor, prev.af + accelerationFactor),
55
+ fallingEp,
56
+ risingEp,
57
+ fallingSar,
58
+ risingSar,
59
+ }
60
+ : {
61
+ af: accelerationFactor,
62
+ fallingEp: now.low,
63
+ risingEp: now.high,
64
+ fallingSar: Math.max(prev.risingEp, now.high),
65
+ risingSar: Math.min(prev.fallingEp, now.low),
66
+ };
67
+ const { date, high, low } = now;
68
+ return Object.assign(Object.assign({ date,
69
+ high,
70
+ low }, current), { use, sar: use === "falling" ? current.fallingSar : current.risingSar });
71
+ });
72
+ const calculatedData = algorithm(data).map((d) => d.sar);
73
+ return calculatedData;
74
+ };
75
+ calculator.undefinedLength = () => {
76
+ return 1;
77
+ };
78
+ calculator.options = (newOptions) => {
79
+ if (newOptions === undefined) {
80
+ return options;
81
+ }
82
+ options = Object.assign(Object.assign({}, defaultOptions), newOptions);
83
+ return calculator;
84
+ };
85
+ return calculator;
86
+ }
87
+ //# sourceMappingURL=sar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sar.js","sourceRoot":"","sources":["../../src/calculator/sar.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export interface SMAOptions {
2
+ readonly sourcePath?: string;
3
+ readonly windowSize: number;
4
+ }
5
+ export default function (): {
6
+ (data: any[]): any[];
7
+ undefinedLength(): number;
8
+ options(newOptions?: SMAOptions): {
9
+ sourcePath: string;
10
+ windowSize: number;
11
+ } | any;
12
+ };