@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.
- package/LICENSE +24 -0
- package/README.md +5 -0
- package/lib/calculator/atr.d.ts +18 -0
- package/lib/calculator/atr.js +51 -0
- package/lib/calculator/atr.js.map +1 -0
- package/lib/calculator/bollingerband.d.ts +14 -0
- package/lib/calculator/bollingerband.js +72 -0
- package/lib/calculator/bollingerband.js.map +1 -0
- package/lib/calculator/change.d.ts +14 -0
- package/lib/calculator/change.js +30 -0
- package/lib/calculator/change.js.map +1 -0
- package/lib/calculator/compare.d.ts +10 -0
- package/lib/calculator/compare.js +50 -0
- package/lib/calculator/compare.js.map +1 -0
- package/lib/calculator/defaultOptionsForComputation.d.ts +91 -0
- package/lib/calculator/defaultOptionsForComputation.js +100 -0
- package/lib/calculator/defaultOptionsForComputation.js.map +1 -0
- package/lib/calculator/elderRay.d.ts +23 -0
- package/lib/calculator/elderRay.js +69 -0
- package/lib/calculator/elderRay.js.map +1 -0
- package/lib/calculator/ema.d.ts +12 -0
- package/lib/calculator/ema.js +73 -0
- package/lib/calculator/ema.js.map +1 -0
- package/lib/calculator/forceIndex.d.ts +12 -0
- package/lib/calculator/forceIndex.js +27 -0
- package/lib/calculator/forceIndex.js.map +1 -0
- package/lib/calculator/heikinAshi.d.ts +4 -0
- package/lib/calculator/heikinAshi.js +30 -0
- package/lib/calculator/heikinAshi.js.map +1 -0
- package/lib/calculator/index.d.ts +19 -0
- package/lib/calculator/index.js +20 -0
- package/lib/calculator/index.js.map +1 -0
- package/lib/calculator/kagi.d.ts +11 -0
- package/lib/calculator/kagi.js +200 -0
- package/lib/calculator/kagi.js.map +1 -0
- package/lib/calculator/macd.d.ts +18 -0
- package/lib/calculator/macd.js +57 -0
- package/lib/calculator/macd.js.map +1 -0
- package/lib/calculator/pointAndFigure.d.ts +10 -0
- package/lib/calculator/pointAndFigure.js +215 -0
- package/lib/calculator/pointAndFigure.js.map +1 -0
- package/lib/calculator/renko.d.ts +12 -0
- package/lib/calculator/renko.js +170 -0
- package/lib/calculator/renko.js.map +1 -0
- package/lib/calculator/rsi.d.ts +12 -0
- package/lib/calculator/rsi.js +87 -0
- package/lib/calculator/rsi.js.map +1 -0
- package/lib/calculator/sar.d.ts +12 -0
- package/lib/calculator/sar.js +87 -0
- package/lib/calculator/sar.js.map +1 -0
- package/lib/calculator/sma.d.ts +12 -0
- package/lib/calculator/sma.js +27 -0
- package/lib/calculator/sma.js.map +1 -0
- package/lib/calculator/smoothedForceIndex.d.ts +13 -0
- package/lib/calculator/smoothedForceIndex.js +40 -0
- package/lib/calculator/smoothedForceIndex.js.map +1 -0
- package/lib/calculator/sto.d.ts +19 -0
- package/lib/calculator/sto.js +91 -0
- package/lib/calculator/sto.js.map +1 -0
- package/lib/calculator/tma.d.ts +12 -0
- package/lib/calculator/tma.js +66 -0
- package/lib/calculator/tma.js.map +1 -0
- package/lib/calculator/wma.d.ts +12 -0
- package/lib/calculator/wma.js +33 -0
- package/lib/calculator/wma.js.map +1 -0
- package/lib/index.d.ts +1 -0
- package/lib/index.js +2 -0
- package/lib/index.js.map +1 -0
- package/lib/indicator/algorithm.d.ts +10 -0
- package/lib/indicator/algorithm.js +35 -0
- package/lib/indicator/algorithm.js.map +1 -0
- package/lib/indicator/atr.d.ts +26 -0
- package/lib/indicator/atr.js +27 -0
- package/lib/indicator/atr.js.map +1 -0
- package/lib/indicator/baseIndicator.d.ts +16 -0
- package/lib/indicator/baseIndicator.js +59 -0
- package/lib/indicator/baseIndicator.js.map +1 -0
- package/lib/indicator/bollingerBand.d.ts +24 -0
- package/lib/indicator/bollingerBand.js +27 -0
- package/lib/indicator/bollingerBand.js.map +1 -0
- package/lib/indicator/change.d.ts +24 -0
- package/lib/indicator/change.js +25 -0
- package/lib/indicator/change.js.map +1 -0
- package/lib/indicator/compare.d.ts +24 -0
- package/lib/indicator/compare.js +29 -0
- package/lib/indicator/compare.js.map +1 -0
- package/lib/indicator/defaultOptionsForAppearance.d.ts +105 -0
- package/lib/indicator/defaultOptionsForAppearance.js +77 -0
- package/lib/indicator/defaultOptionsForAppearance.js.map +1 -0
- package/lib/indicator/elderImpulse.d.ts +7 -0
- package/lib/indicator/elderImpulse.js +61 -0
- package/lib/indicator/elderImpulse.js.map +1 -0
- package/lib/indicator/elderRay.d.ts +24 -0
- package/lib/indicator/elderRay.js +29 -0
- package/lib/indicator/elderRay.js.map +1 -0
- package/lib/indicator/ema.d.ts +24 -0
- package/lib/indicator/ema.js +29 -0
- package/lib/indicator/ema.js.map +1 -0
- package/lib/indicator/forceIndex.d.ts +24 -0
- package/lib/indicator/forceIndex.js +29 -0
- package/lib/indicator/forceIndex.js.map +1 -0
- package/lib/indicator/heikinAshi.d.ts +3 -0
- package/lib/indicator/heikinAshi.js +28 -0
- package/lib/indicator/heikinAshi.js.map +1 -0
- package/lib/indicator/index.d.ts +23 -0
- package/lib/indicator/index.js +24 -0
- package/lib/indicator/index.js.map +1 -0
- package/lib/indicator/kagi.d.ts +11 -0
- package/lib/indicator/kagi.js +13 -0
- package/lib/indicator/kagi.js.map +1 -0
- package/lib/indicator/macd.d.ts +24 -0
- package/lib/indicator/macd.js +32 -0
- package/lib/indicator/macd.js.map +1 -0
- package/lib/indicator/pointAndFigure.d.ts +10 -0
- package/lib/indicator/pointAndFigure.js +13 -0
- package/lib/indicator/pointAndFigure.js.map +1 -0
- package/lib/indicator/renko.d.ts +12 -0
- package/lib/indicator/renko.js +13 -0
- package/lib/indicator/renko.js.map +1 -0
- package/lib/indicator/rsi.d.ts +24 -0
- package/lib/indicator/rsi.js +29 -0
- package/lib/indicator/rsi.js.map +1 -0
- package/lib/indicator/sar.d.ts +24 -0
- package/lib/indicator/sar.js +29 -0
- package/lib/indicator/sar.js.map +1 -0
- package/lib/indicator/sma.d.ts +24 -0
- package/lib/indicator/sma.js +29 -0
- package/lib/indicator/sma.js.map +1 -0
- package/lib/indicator/stochasticOscillator.d.ts +24 -0
- package/lib/indicator/stochasticOscillator.js +27 -0
- package/lib/indicator/stochasticOscillator.js.map +1 -0
- package/lib/indicator/tma.d.ts +24 -0
- package/lib/indicator/tma.js +29 -0
- package/lib/indicator/tma.js.map +1 -0
- package/lib/indicator/wma.d.ts +24 -0
- package/lib/indicator/wma.js +29 -0
- package/lib/indicator/wma.js.map +1 -0
- package/lib/utils/functor.d.ts +1 -0
- package/lib/utils/functor.js +4 -0
- package/lib/utils/functor.js.map +1 -0
- package/lib/utils/identity.d.ts +1 -0
- package/lib/utils/identity.js +2 -0
- package/lib/utils/identity.js.map +1 -0
- package/lib/utils/index.d.ts +8 -0
- package/lib/utils/index.js +9 -0
- package/lib/utils/index.js.map +1 -0
- package/lib/utils/mappedSlidingWindow.d.ts +15 -0
- package/lib/utils/mappedSlidingWindow.js +77 -0
- package/lib/utils/mappedSlidingWindow.js.map +1 -0
- package/lib/utils/merge.d.ts +11 -0
- package/lib/utils/merge.js +70 -0
- package/lib/utils/merge.js.map +1 -0
- package/lib/utils/path.d.ts +1 -0
- package/lib/utils/path.js +15 -0
- package/lib/utils/path.js.map +1 -0
- package/lib/utils/rebind.d.ts +1 -0
- package/lib/utils/rebind.js +18 -0
- package/lib/utils/rebind.js.map +1 -0
- package/lib/utils/slidingWindow.d.ts +19 -0
- package/lib/utils/slidingWindow.js +111 -0
- package/lib/utils/slidingWindow.js.map +1 -0
- package/lib/utils/zipper.d.ts +7 -0
- package/lib/utils/zipper.js +36 -0
- package/lib/utils/zipper.js.map +1 -0
- package/package.json +49 -0
- package/src/calculator/atr.ts +88 -0
- package/src/calculator/bollingerband.ts +102 -0
- package/src/calculator/change.ts +53 -0
- package/src/calculator/compare.ts +68 -0
- package/src/calculator/defaultOptionsForComputation.ts +117 -0
- package/src/calculator/elderRay.ts +90 -0
- package/src/calculator/ema.ts +92 -0
- package/src/calculator/forceIndex.ts +43 -0
- package/src/calculator/heikinAshi.ts +38 -0
- package/src/calculator/index.ts +19 -0
- package/src/calculator/kagi.ts +249 -0
- package/src/calculator/macd.ts +90 -0
- package/src/calculator/pointAndFigure.ts +255 -0
- package/src/calculator/renko.ts +227 -0
- package/src/calculator/rsi.ts +114 -0
- package/src/calculator/sar.ts +117 -0
- package/src/calculator/sma.ts +41 -0
- package/src/calculator/smoothedForceIndex.ts +53 -0
- package/src/calculator/sto.ts +118 -0
- package/src/calculator/tma.ts +82 -0
- package/src/calculator/wma.ts +49 -0
- package/src/index.ts +1 -0
- package/src/indicator/algorithm.ts +53 -0
- package/src/indicator/atr.ts +58 -0
- package/src/indicator/baseIndicator.ts +97 -0
- package/src/indicator/bollingerBand.ts +55 -0
- package/src/indicator/change.ts +51 -0
- package/src/indicator/compare.ts +57 -0
- package/src/indicator/defaultOptionsForAppearance.ts +77 -0
- package/src/indicator/elderImpulse.ts +73 -0
- package/src/indicator/elderRay.ts +56 -0
- package/src/indicator/ema.ts +58 -0
- package/src/indicator/forceIndex.ts +57 -0
- package/src/indicator/heikinAshi.ts +35 -0
- package/src/indicator/index.ts +25 -0
- package/src/indicator/kagi.ts +18 -0
- package/src/indicator/macd.ts +60 -0
- package/src/indicator/pointAndFigure.ts +18 -0
- package/src/indicator/renko.ts +18 -0
- package/src/indicator/rsi.ts +58 -0
- package/src/indicator/sar.ts +56 -0
- package/src/indicator/sma.ts +57 -0
- package/src/indicator/stochasticOscillator.ts +56 -0
- package/src/indicator/tma.ts +57 -0
- package/src/indicator/wma.ts +58 -0
- package/src/utils/functor.ts +3 -0
- package/src/utils/identity.ts +1 -0
- package/src/utils/index.ts +8 -0
- package/src/utils/mappedSlidingWindow.ts +95 -0
- package/src/utils/merge.ts +93 -0
- package/src/utils/path.ts +16 -0
- package/src/utils/rebind.ts +19 -0
- package/src/utils/slidingWindow.ts +142 -0
- 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
|
+
};
|