oakscriptjs 0.10.1 → 0.11.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/dist/cjs/array/index.d.ts +8 -2
- package/dist/cjs/array/index.d.ts.map +1 -1
- package/dist/cjs/array/index.js +2 -1
- package/dist/cjs/array/index.js.map +2 -2
- package/dist/cjs/box/index.d.ts.map +1 -1
- package/dist/cjs/box/index.js +7 -1
- package/dist/cjs/box/index.js.map +2 -2
- package/dist/cjs/callsite/index.d.ts +73 -32
- package/dist/cjs/callsite/index.d.ts.map +1 -1
- package/dist/cjs/callsite/index.js +69 -65
- package/dist/cjs/callsite/index.js.map +2 -2
- package/dist/cjs/drawing/registry.d.ts +84 -0
- package/dist/cjs/drawing/registry.d.ts.map +1 -1
- package/dist/cjs/drawing/registry.js +153 -6
- package/dist/cjs/drawing/registry.js.map +2 -2
- package/dist/cjs/index.d.ts +8 -2
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +33 -1
- package/dist/cjs/index.js.map +2 -2
- package/dist/cjs/input.d.ts +9 -1
- package/dist/cjs/input.d.ts.map +1 -1
- package/dist/cjs/input.js +16 -0
- package/dist/cjs/input.js.map +2 -2
- package/dist/cjs/label/index.d.ts.map +1 -1
- package/dist/cjs/label/index.js +3 -0
- package/dist/cjs/label/index.js.map +2 -2
- package/dist/cjs/line/index.d.ts +10 -27
- package/dist/cjs/line/index.d.ts.map +1 -1
- package/dist/cjs/line/index.js +11 -22
- package/dist/cjs/line/index.js.map +2 -2
- package/dist/cjs/linefill/index.d.ts +3 -0
- package/dist/cjs/linefill/index.d.ts.map +1 -1
- package/dist/cjs/linefill/index.js +15 -1
- package/dist/cjs/linefill/index.js.map +3 -3
- package/dist/cjs/math/index.d.ts.map +1 -1
- package/dist/cjs/math/index.js +2 -0
- package/dist/cjs/math/index.js.map +2 -2
- package/dist/cjs/polyline/index.d.ts.map +1 -1
- package/dist/cjs/polyline/index.js +3 -0
- package/dist/cjs/polyline/index.js.map +2 -2
- package/dist/cjs/runtime/adapters/SimpleInputAdapter.js +1 -1
- package/dist/cjs/runtime/adapters/SimpleInputAdapter.js.map +2 -2
- package/dist/cjs/runtime/index.d.ts +1 -1
- package/dist/cjs/runtime/index.d.ts.map +1 -1
- package/dist/cjs/runtime/index.js +1 -0
- package/dist/cjs/runtime/index.js.map +2 -2
- package/dist/cjs/runtime/inputs.d.ts +9 -0
- package/dist/cjs/runtime/inputs.d.ts.map +1 -1
- package/dist/cjs/runtime/inputs.js +8 -0
- package/dist/cjs/runtime/inputs.js.map +2 -2
- package/dist/cjs/runtime/types.d.ts +1 -1
- package/dist/cjs/runtime/types.d.ts.map +1 -1
- package/dist/cjs/runtime/types.js.map +1 -1
- package/dist/cjs/script/index.d.ts +91 -21
- package/dist/cjs/script/index.d.ts.map +1 -1
- package/dist/cjs/script/index.js +207 -19
- package/dist/cjs/script/index.js.map +3 -3
- package/dist/cjs/security/other.d.ts +92 -0
- package/dist/cjs/security/other.d.ts.map +1 -0
- package/dist/cjs/security/other.js +164 -0
- package/dist/cjs/security/other.js.map +7 -0
- package/dist/cjs/session/bars.d.ts +24 -1
- package/dist/cjs/session/bars.d.ts.map +1 -1
- package/dist/cjs/session/bars.js +56 -7
- package/dist/cjs/session/bars.js.map +3 -3
- package/dist/cjs/session/calendar.d.ts +13 -2
- package/dist/cjs/session/calendar.d.ts.map +1 -1
- package/dist/cjs/session/calendar.js +39 -9
- package/dist/cjs/session/calendar.js.map +2 -2
- package/dist/cjs/session/context.d.ts +76 -0
- package/dist/cjs/session/context.d.ts.map +1 -0
- package/dist/cjs/session/context.js +114 -0
- package/dist/cjs/session/context.js.map +7 -0
- package/dist/cjs/str/floatingdecimal.d.ts +31 -0
- package/dist/cjs/str/floatingdecimal.d.ts.map +1 -0
- package/dist/cjs/str/floatingdecimal.js +298 -0
- package/dist/cjs/str/floatingdecimal.js.map +7 -0
- package/dist/cjs/str/index.d.ts +4 -1
- package/dist/cjs/str/index.d.ts.map +1 -1
- package/dist/cjs/str/index.js +2 -1
- package/dist/cjs/str/index.js.map +2 -2
- package/dist/cjs/str/numberformat.d.ts +7 -3
- package/dist/cjs/str/numberformat.d.ts.map +1 -1
- package/dist/cjs/str/numberformat.js +4 -3
- package/dist/cjs/str/numberformat.js.map +2 -2
- package/dist/cjs/ta/index.d.ts +67 -34
- package/dist/cjs/ta/index.d.ts.map +1 -1
- package/dist/cjs/ta/index.js +202 -145
- package/dist/cjs/ta/index.js.map +2 -2
- package/dist/cjs/ta/limits.d.ts +35 -0
- package/dist/cjs/ta/limits.d.ts.map +1 -0
- package/dist/cjs/ta/limits.js +64 -0
- package/dist/cjs/ta/limits.js.map +7 -0
- package/dist/cjs/ta/running-sum.d.ts +0 -16
- package/dist/cjs/ta/running-sum.d.ts.map +1 -1
- package/dist/cjs/ta/running-sum.js +2 -0
- package/dist/cjs/ta/running-sum.js.map +2 -2
- package/dist/cjs/ta-series.d.ts +8 -8
- package/dist/cjs/ta-series.d.ts.map +1 -1
- package/dist/cjs/ta-series.js +10 -8
- package/dist/cjs/ta-series.js.map +2 -2
- package/dist/cjs/table/index.d.ts +3 -1
- package/dist/cjs/table/index.d.ts.map +1 -1
- package/dist/cjs/table/index.js +1 -0
- package/dist/cjs/table/index.js.map +3 -3
- package/dist/cjs/time/index.d.ts +5 -2
- package/dist/cjs/time/index.d.ts.map +1 -1
- package/dist/cjs/time/index.js +2 -2
- package/dist/cjs/time/index.js.map +2 -2
- package/dist/cjs/time/session.d.ts +26 -1
- package/dist/cjs/time/session.d.ts.map +1 -1
- package/dist/cjs/time/session.js +94 -12
- package/dist/cjs/time/session.js.map +3 -3
- package/dist/cjs/time/timezone.d.ts +6 -1
- package/dist/cjs/time/timezone.d.ts.map +1 -1
- package/dist/cjs/time/timezone.js +2 -2
- package/dist/cjs/time/timezone.js.map +2 -2
- package/dist/cjs/types/metadata.d.ts +28 -4
- package/dist/cjs/types/metadata.d.ts.map +1 -1
- package/dist/cjs/types/metadata.js.map +1 -1
- package/dist/esm/array/index.d.ts +8 -2
- package/dist/esm/array/index.d.ts.map +1 -1
- package/dist/esm/array/index.js +12 -3
- package/dist/esm/array/index.js.map +1 -1
- package/dist/esm/box/index.d.ts.map +1 -1
- package/dist/esm/box/index.js +8 -2
- package/dist/esm/box/index.js.map +1 -1
- package/dist/esm/callsite/index.d.ts +73 -32
- package/dist/esm/callsite/index.d.ts.map +1 -1
- package/dist/esm/callsite/index.js +143 -106
- package/dist/esm/callsite/index.js.map +1 -1
- package/dist/esm/drawing/registry.d.ts +84 -0
- package/dist/esm/drawing/registry.d.ts.map +1 -1
- package/dist/esm/drawing/registry.js +260 -6
- package/dist/esm/drawing/registry.js.map +1 -1
- package/dist/esm/index.d.ts +8 -2
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +13 -2
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/input.d.ts +9 -1
- package/dist/esm/input.d.ts.map +1 -1
- package/dist/esm/input.js +16 -0
- package/dist/esm/input.js.map +1 -1
- package/dist/esm/label/index.d.ts.map +1 -1
- package/dist/esm/label/index.js +4 -1
- package/dist/esm/label/index.js.map +1 -1
- package/dist/esm/line/index.d.ts +10 -27
- package/dist/esm/line/index.d.ts.map +1 -1
- package/dist/esm/line/index.js +22 -60
- package/dist/esm/line/index.js.map +1 -1
- package/dist/esm/linefill/index.d.ts +3 -0
- package/dist/esm/linefill/index.d.ts.map +1 -1
- package/dist/esm/linefill/index.js +20 -1
- package/dist/esm/linefill/index.js.map +1 -1
- package/dist/esm/math/index.d.ts.map +1 -1
- package/dist/esm/math/index.js +3 -0
- package/dist/esm/math/index.js.map +1 -1
- package/dist/esm/polyline/index.d.ts.map +1 -1
- package/dist/esm/polyline/index.js +5 -1
- package/dist/esm/polyline/index.js.map +1 -1
- package/dist/esm/runtime/adapters/SimpleInputAdapter.js +1 -1
- package/dist/esm/runtime/adapters/SimpleInputAdapter.js.map +1 -1
- package/dist/esm/runtime/index.d.ts +1 -1
- package/dist/esm/runtime/index.d.ts.map +1 -1
- package/dist/esm/runtime/index.js +1 -1
- package/dist/esm/runtime/index.js.map +1 -1
- package/dist/esm/runtime/inputs.d.ts +9 -0
- package/dist/esm/runtime/inputs.d.ts.map +1 -1
- package/dist/esm/runtime/inputs.js +15 -0
- package/dist/esm/runtime/inputs.js.map +1 -1
- package/dist/esm/runtime/types.d.ts +1 -1
- package/dist/esm/runtime/types.d.ts.map +1 -1
- package/dist/esm/script/index.d.ts +91 -21
- package/dist/esm/script/index.d.ts.map +1 -1
- package/dist/esm/script/index.js +259 -28
- package/dist/esm/script/index.js.map +1 -1
- package/dist/esm/security/other.d.ts +92 -0
- package/dist/esm/security/other.d.ts.map +1 -0
- package/dist/esm/security/other.js +211 -0
- package/dist/esm/security/other.js.map +1 -0
- package/dist/esm/session/bars.d.ts +24 -1
- package/dist/esm/session/bars.d.ts.map +1 -1
- package/dist/esm/session/bars.js +75 -6
- package/dist/esm/session/bars.js.map +1 -1
- package/dist/esm/session/calendar.d.ts +13 -2
- package/dist/esm/session/calendar.d.ts.map +1 -1
- package/dist/esm/session/calendar.js +54 -10
- package/dist/esm/session/calendar.js.map +1 -1
- package/dist/esm/session/context.d.ts +76 -0
- package/dist/esm/session/context.d.ts.map +1 -0
- package/dist/esm/session/context.js +124 -0
- package/dist/esm/session/context.js.map +1 -0
- package/dist/esm/str/floatingdecimal.d.ts +31 -0
- package/dist/esm/str/floatingdecimal.d.ts.map +1 -0
- package/dist/esm/str/floatingdecimal.js +272 -0
- package/dist/esm/str/floatingdecimal.js.map +1 -0
- package/dist/esm/str/index.d.ts +4 -1
- package/dist/esm/str/index.d.ts.map +1 -1
- package/dist/esm/str/index.js +9 -2
- package/dist/esm/str/index.js.map +1 -1
- package/dist/esm/str/numberformat.d.ts +7 -3
- package/dist/esm/str/numberformat.d.ts.map +1 -1
- package/dist/esm/str/numberformat.js +11 -5
- package/dist/esm/str/numberformat.js.map +1 -1
- package/dist/esm/ta/index.d.ts +67 -34
- package/dist/esm/ta/index.d.ts.map +1 -1
- package/dist/esm/ta/index.js +284 -240
- package/dist/esm/ta/index.js.map +1 -1
- package/dist/esm/ta/limits.d.ts +35 -0
- package/dist/esm/ta/limits.d.ts.map +1 -0
- package/dist/esm/ta/limits.js +67 -0
- package/dist/esm/ta/limits.js.map +1 -0
- package/dist/esm/ta/running-sum.d.ts +0 -16
- package/dist/esm/ta/running-sum.d.ts.map +1 -1
- package/dist/esm/ta/running-sum.js +2 -0
- package/dist/esm/ta/running-sum.js.map +1 -1
- package/dist/esm/ta-series.d.ts +8 -8
- package/dist/esm/ta-series.d.ts.map +1 -1
- package/dist/esm/ta-series.js +11 -8
- package/dist/esm/ta-series.js.map +1 -1
- package/dist/esm/table/index.d.ts +3 -1
- package/dist/esm/table/index.d.ts.map +1 -1
- package/dist/esm/table/index.js +6 -1
- package/dist/esm/table/index.js.map +1 -1
- package/dist/esm/time/index.d.ts +5 -2
- package/dist/esm/time/index.d.ts.map +1 -1
- package/dist/esm/time/index.js +6 -3
- package/dist/esm/time/index.js.map +1 -1
- package/dist/esm/time/session.d.ts +26 -1
- package/dist/esm/time/session.d.ts.map +1 -1
- package/dist/esm/time/session.js +141 -16
- package/dist/esm/time/session.js.map +1 -1
- package/dist/esm/time/timezone.d.ts +6 -1
- package/dist/esm/time/timezone.d.ts.map +1 -1
- package/dist/esm/time/timezone.js +8 -2
- package/dist/esm/time/timezone.js.map +1 -1
- package/dist/esm/types/metadata.d.ts +28 -4
- package/dist/esm/types/metadata.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/array/index.ts +11 -3
- package/src/box/index.ts +8 -2
- package/src/callsite/index.ts +150 -100
- package/src/drawing/registry.ts +278 -5
- package/src/index.ts +44 -1
- package/src/input.ts +18 -1
- package/src/label/index.ts +4 -1
- package/src/line/index.ts +22 -64
- package/src/linefill/index.ts +20 -1
- package/src/math/index.ts +2 -0
- package/src/polyline/index.ts +3 -1
- package/src/runtime/adapters/SimpleInputAdapter.ts +1 -1
- package/src/runtime/index.ts +1 -0
- package/src/runtime/inputs.ts +16 -0
- package/src/runtime/types.ts +1 -1
- package/src/script/index.ts +355 -34
- package/src/security/other.ts +269 -0
- package/src/session/bars.ts +70 -6
- package/src/session/calendar.ts +60 -10
- package/src/session/context.ts +162 -0
- package/src/str/floatingdecimal.ts +268 -0
- package/src/str/index.ts +8 -2
- package/src/str/numberformat.ts +13 -6
- package/src/ta/index.ts +304 -248
- package/src/ta/limits.ts +74 -0
- package/src/ta/running-sum.ts +2 -0
- package/src/ta-series.ts +19 -16
- package/src/table/index.ts +4 -1
- package/src/time/index.ts +6 -3
- package/src/time/session.ts +137 -15
- package/src/time/timezone.ts +9 -2
- package/src/types/metadata.ts +28 -4
package/dist/cjs/ta/index.js
CHANGED
|
@@ -91,15 +91,18 @@ __export(ta_exports, {
|
|
|
91
91
|
module.exports = __toCommonJS(ta_exports);
|
|
92
92
|
var import_compare = require("../compare/index.js");
|
|
93
93
|
var import_running_sum = require("./running-sum.js");
|
|
94
|
+
var import_limits = require("./limits.js");
|
|
94
95
|
function sma(source, length) {
|
|
95
96
|
if (typeof length !== "number") {
|
|
96
97
|
const sums = (0, import_running_sum.runningSumSeries)(source, length, "ta.sma");
|
|
97
98
|
return sums.map((sum, i) => sum / Math.floor(length[i]));
|
|
98
99
|
}
|
|
99
100
|
const len = Math.floor(length);
|
|
101
|
+
(0, import_limits.checkSumLength)("ta.sma", len, 0);
|
|
100
102
|
return (0, import_running_sum.runningSum)(source, len).map((sum) => sum / len);
|
|
101
103
|
}
|
|
102
104
|
function ema(source, length) {
|
|
105
|
+
(0, import_limits.checkPositiveLength)("ema", length, 0);
|
|
103
106
|
const result = [];
|
|
104
107
|
const len = Math.floor(length);
|
|
105
108
|
const multiplier = 2 / (len + 1);
|
|
@@ -132,6 +135,17 @@ function ema(source, length) {
|
|
|
132
135
|
return result;
|
|
133
136
|
}
|
|
134
137
|
function rsi(source, length) {
|
|
138
|
+
if (typeof length !== "number") {
|
|
139
|
+
return Array.from(source, (xv, i) => {
|
|
140
|
+
const x = xv ?? NaN;
|
|
141
|
+
const y = length[i] ?? NaN;
|
|
142
|
+
if ((0, import_compare.eq)(y, 0)) return 100;
|
|
143
|
+
if ((0, import_compare.eq)(x, 0)) return 0;
|
|
144
|
+
const r = 100 - 100 / (1 + x / y);
|
|
145
|
+
return Number.isFinite(r) ? r : NaN;
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
(0, import_limits.checkPositiveLength)("rsi", length, 0, "y");
|
|
135
149
|
const result = [];
|
|
136
150
|
const changes = [];
|
|
137
151
|
for (let i = 1; i < source.length; i++) {
|
|
@@ -169,6 +183,7 @@ function macd(source, fastLength, slowLength, signalLength) {
|
|
|
169
183
|
return [macdLine, signalLine, histogram];
|
|
170
184
|
}
|
|
171
185
|
function bb(series, length, mult) {
|
|
186
|
+
(0, import_limits.checkSumLength)("ta.bb", length, 0);
|
|
172
187
|
const basis = sma(series, length);
|
|
173
188
|
const dev2 = stdev(series, length);
|
|
174
189
|
const upper = [];
|
|
@@ -190,9 +205,9 @@ function lastValues(source, i, length) {
|
|
|
190
205
|
}
|
|
191
206
|
return values.length === length ? values : null;
|
|
192
207
|
}
|
|
193
|
-
function windowExtremes(source, length, lowest2) {
|
|
208
|
+
function windowExtremes(source, length, lowest2, newest = false) {
|
|
194
209
|
const n = source.length;
|
|
195
|
-
const span = length > 0 ? Math.
|
|
210
|
+
const span = length > 0 ? Math.trunc(length) : 0;
|
|
196
211
|
const at = new Int32Array(n).fill(-1);
|
|
197
212
|
const zeros = new Uint8Array(n);
|
|
198
213
|
const queue = new Int32Array(n);
|
|
@@ -210,7 +225,9 @@ function windowExtremes(source, length, lowest2) {
|
|
|
210
225
|
zeroCount = 0;
|
|
211
226
|
continue;
|
|
212
227
|
}
|
|
213
|
-
while (tail > head
|
|
228
|
+
while (tail > head) {
|
|
229
|
+
const last = source[queue[tail - 1]];
|
|
230
|
+
if (!(lowest2 ? last > x : last < x) && !(newest && last === x)) break;
|
|
214
231
|
if (isPreferredZero(queue[--tail])) zeroCount--;
|
|
215
232
|
}
|
|
216
233
|
queue[tail++] = i;
|
|
@@ -226,16 +243,57 @@ function windowExtremes(source, length, lowest2) {
|
|
|
226
243
|
}
|
|
227
244
|
return { at, zeros };
|
|
228
245
|
}
|
|
246
|
+
function keptValues(source) {
|
|
247
|
+
const values = [];
|
|
248
|
+
const bars = [];
|
|
249
|
+
const last = new Int32Array(source.length);
|
|
250
|
+
for (let i = 0; i < source.length; i++) {
|
|
251
|
+
const x = source[i];
|
|
252
|
+
if (!Number.isNaN(x)) {
|
|
253
|
+
values.push(x);
|
|
254
|
+
bars.push(i);
|
|
255
|
+
}
|
|
256
|
+
last[i] = values.length - 1;
|
|
257
|
+
}
|
|
258
|
+
return { values, bars, last };
|
|
259
|
+
}
|
|
260
|
+
function extremeSeriesLength(source, lengths, lowest2, offsets) {
|
|
261
|
+
const name = (lowest2 ? "lowest" : "highest") + (offsets ? "bars" : "");
|
|
262
|
+
const { values, bars, last } = keptValues(source);
|
|
263
|
+
return Array.from(source, (_, i) => {
|
|
264
|
+
const len = Math.trunc(lengths[i]);
|
|
265
|
+
(0, import_limits.checkWindowLength)(name, len, i);
|
|
266
|
+
const k = last[i];
|
|
267
|
+
if (!(len >= 1) || i < len - 1 || k < 0) return NaN;
|
|
268
|
+
let best = k;
|
|
269
|
+
for (let j = k - 1; j >= 0 && j > k - len; j--) {
|
|
270
|
+
if (lowest2 ? values[j] < values[best] : values[j] > values[best]) best = j;
|
|
271
|
+
}
|
|
272
|
+
return offsets ? -(i - bars[best]) : values[best];
|
|
273
|
+
});
|
|
274
|
+
}
|
|
229
275
|
function extremeOffset(source, length, lowest2) {
|
|
230
|
-
|
|
231
|
-
|
|
276
|
+
if (typeof length !== "number") return extremeSeriesLength(source, length, lowest2, true);
|
|
277
|
+
(0, import_limits.checkWindowLength)(lowest2 ? "lowestbars" : "highestbars", length, 0);
|
|
278
|
+
const { values, bars, last } = keptValues(source);
|
|
279
|
+
const { at } = windowExtremes(values, length, lowest2, true);
|
|
280
|
+
const len = Math.trunc(length);
|
|
281
|
+
return source.map((_, i) => {
|
|
282
|
+
const k = last[i];
|
|
283
|
+
return i < len - 1 || k < 0 || at[k] < 0 ? NaN : -(i - bars[at[k]]);
|
|
284
|
+
});
|
|
232
285
|
}
|
|
233
286
|
function extremeValue(source, length, lowest2) {
|
|
234
|
-
|
|
287
|
+
if (typeof length !== "number") return extremeSeriesLength(source, length, lowest2, false);
|
|
288
|
+
(0, import_limits.checkWindowLength)(lowest2 ? "lowest" : "highest", length, 0);
|
|
289
|
+
const { values, last } = keptValues(source);
|
|
290
|
+
const { at, zeros } = windowExtremes(values, length, lowest2);
|
|
291
|
+
const len = Math.trunc(length);
|
|
235
292
|
return source.map((_, i) => {
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
293
|
+
const k = last[i];
|
|
294
|
+
if (i < len - 1 || k < 0 || at[k] < 0) return NaN;
|
|
295
|
+
const v = values[at[k]];
|
|
296
|
+
return v === 0 && zeros[k] ? lowest2 ? -0 : 0 : v;
|
|
239
297
|
});
|
|
240
298
|
}
|
|
241
299
|
function crossTest(series1, series2, test) {
|
|
@@ -260,6 +318,7 @@ function crossunder(series1, series2) {
|
|
|
260
318
|
return crossTest(series1, series2, (a, b, pa, pb) => a < b && pa >= pb);
|
|
261
319
|
}
|
|
262
320
|
function change(source, length = 1) {
|
|
321
|
+
(0, import_limits.checkPositiveLength)("change", length, 0);
|
|
263
322
|
const result = [];
|
|
264
323
|
for (let i = 0; i < source.length; i++) {
|
|
265
324
|
if (i < length) {
|
|
@@ -301,6 +360,7 @@ function tr(handle_na = false, high, low, close) {
|
|
|
301
360
|
return result;
|
|
302
361
|
}
|
|
303
362
|
function atr(length, high, low, close) {
|
|
363
|
+
(0, import_limits.checkPositiveLength)("atr->rma", length, 0);
|
|
304
364
|
if (!high || !low || !close) {
|
|
305
365
|
throw new Error(
|
|
306
366
|
"ta.atr() requires high, low, and close series. Either pass them explicitly or use createContext({ chart: { high, low, close } }) for implicit data."
|
|
@@ -356,6 +416,7 @@ function supertrend(factor, atrPeriod, high, low, close, wicks = false) {
|
|
|
356
416
|
return [supertrendValues, directions];
|
|
357
417
|
}
|
|
358
418
|
function rma(source, length) {
|
|
419
|
+
(0, import_limits.checkPositiveLength)("rma", length, 0);
|
|
359
420
|
const result = [];
|
|
360
421
|
const len = Math.floor(length);
|
|
361
422
|
let firstValidIndex = -1;
|
|
@@ -392,7 +453,8 @@ function wmaAdd(a, b) {
|
|
|
392
453
|
}
|
|
393
454
|
function wma(source, length) {
|
|
394
455
|
const result = [];
|
|
395
|
-
const
|
|
456
|
+
const fixed = typeof length === "number" ? Math.floor(length) : NaN;
|
|
457
|
+
if (typeof length === "number") (0, import_limits.checkPositiveLength)("wma", fixed, 0);
|
|
396
458
|
const filled = [];
|
|
397
459
|
let last = NaN;
|
|
398
460
|
let count = 0;
|
|
@@ -404,7 +466,9 @@ function wma(source, length) {
|
|
|
404
466
|
count++;
|
|
405
467
|
}
|
|
406
468
|
filled.push(last);
|
|
407
|
-
|
|
469
|
+
const len = typeof length === "number" ? fixed : Math.floor(length[i]);
|
|
470
|
+
if (typeof length !== "number") (0, import_limits.checkPositiveLength)("wma", len, i);
|
|
471
|
+
if (isNa || !(len >= 1) || count < len) {
|
|
408
472
|
result.push(NaN);
|
|
409
473
|
continue;
|
|
410
474
|
}
|
|
@@ -461,12 +525,15 @@ function monotonic(source, length, step) {
|
|
|
461
525
|
return result;
|
|
462
526
|
}
|
|
463
527
|
function rising(source, length) {
|
|
528
|
+
(0, import_limits.checkPositiveLength)("rising", length, 0);
|
|
464
529
|
return monotonic(source, length, import_compare.gt);
|
|
465
530
|
}
|
|
466
531
|
function falling(source, length) {
|
|
532
|
+
(0, import_limits.checkPositiveLength)("falling", length, 0);
|
|
467
533
|
return monotonic(source, length, import_compare.lt);
|
|
468
534
|
}
|
|
469
535
|
function roc(source, length) {
|
|
536
|
+
(0, import_limits.checkPositiveLength)("roc", length, 0);
|
|
470
537
|
const result = [];
|
|
471
538
|
for (let i = 0; i < source.length; i++) {
|
|
472
539
|
if (i < length) {
|
|
@@ -484,6 +551,7 @@ function roc(source, length) {
|
|
|
484
551
|
return result;
|
|
485
552
|
}
|
|
486
553
|
function mom(source, length) {
|
|
554
|
+
(0, import_limits.checkPositiveLength)("mom", length, 0);
|
|
487
555
|
const result = [];
|
|
488
556
|
for (let i = 0; i < source.length; i++) {
|
|
489
557
|
if (i < length) {
|
|
@@ -499,6 +567,7 @@ function mom(source, length) {
|
|
|
499
567
|
return result;
|
|
500
568
|
}
|
|
501
569
|
function dev(source, length) {
|
|
570
|
+
(0, import_limits.checkPositiveLength)("dev", length, 0);
|
|
502
571
|
const len = Math.floor(length);
|
|
503
572
|
return sma(source, len).map((mean, i) => {
|
|
504
573
|
if (i < len - 1 || Number.isNaN(mean)) return NaN;
|
|
@@ -516,10 +585,12 @@ function varianceOf(source, length, biased, name) {
|
|
|
516
585
|
return biased ? result : result.map((v, i) => Math.floor(length[i]) > 1 ? v : NaN);
|
|
517
586
|
}
|
|
518
587
|
const len = Math.floor(length);
|
|
588
|
+
(0, import_limits.checkSumLength)(name, len, 0);
|
|
519
589
|
if ((biased ? len : len - 1) <= 0) return source.map(() => NaN);
|
|
520
590
|
return (0, import_running_sum.runningVariance)(source, len, biased);
|
|
521
591
|
}
|
|
522
592
|
function median(source, length) {
|
|
593
|
+
(0, import_limits.checkPositiveLength)("median", length, 0);
|
|
523
594
|
const len = Math.floor(length);
|
|
524
595
|
const n = source.length;
|
|
525
596
|
const out = new Array(n).fill(NaN);
|
|
@@ -556,6 +627,7 @@ function swma(source) {
|
|
|
556
627
|
);
|
|
557
628
|
}
|
|
558
629
|
function vwma(source, length, volume) {
|
|
630
|
+
(0, import_limits.checkPositiveLength)("vwma->sma", length, 0);
|
|
559
631
|
if (!volume) {
|
|
560
632
|
throw new Error(
|
|
561
633
|
"ta.vwma() requires volume series. Either pass it explicitly or use createContext({ chart: { ..., volume } }) for implicit data."
|
|
@@ -578,6 +650,7 @@ function vwma(source, length, volume) {
|
|
|
578
650
|
return result;
|
|
579
651
|
}
|
|
580
652
|
function linreg(source, length, offset = 0) {
|
|
653
|
+
(0, import_limits.checkPositiveLength)("linreg", length, 0);
|
|
581
654
|
const result = [];
|
|
582
655
|
const len = Math.floor(length);
|
|
583
656
|
for (let i = 0; i < source.length; i++) {
|
|
@@ -615,6 +688,7 @@ function linreg(source, length, offset = 0) {
|
|
|
615
688
|
return result;
|
|
616
689
|
}
|
|
617
690
|
function correlation(source1, source2, length) {
|
|
691
|
+
(0, import_limits.checkPositiveLength)("correlation", length, 0);
|
|
618
692
|
const product = Array.from({ length: source1.length }, (_, i) => {
|
|
619
693
|
const v1 = source1[i];
|
|
620
694
|
const v2 = source2[i];
|
|
@@ -634,10 +708,11 @@ function correlation(source1, source2, length) {
|
|
|
634
708
|
});
|
|
635
709
|
}
|
|
636
710
|
function percentrank(source, length) {
|
|
711
|
+
(0, import_limits.checkPositiveLength)("percentrank", length, 0);
|
|
637
712
|
const result = [];
|
|
638
713
|
for (let i = 0; i < source.length; i++) {
|
|
639
714
|
const currentValue = source[i];
|
|
640
|
-
if (i < length
|
|
715
|
+
if (i < length) {
|
|
641
716
|
result.push(NaN);
|
|
642
717
|
continue;
|
|
643
718
|
}
|
|
@@ -650,6 +725,7 @@ function percentrank(source, length) {
|
|
|
650
725
|
return result;
|
|
651
726
|
}
|
|
652
727
|
function cci(source, length) {
|
|
728
|
+
(0, import_limits.checkPositiveLength)("cci", length, 0);
|
|
653
729
|
const smaValues = sma(source, length);
|
|
654
730
|
const devValues = dev(source, length);
|
|
655
731
|
let last = 0;
|
|
@@ -661,6 +737,7 @@ function cci(source, length) {
|
|
|
661
737
|
});
|
|
662
738
|
}
|
|
663
739
|
function stoch(source, high, low, length) {
|
|
740
|
+
(0, import_limits.checkPositiveLength)("stoch->highest", length, 0);
|
|
664
741
|
const result = [];
|
|
665
742
|
const lowestValues = lowest(low, length);
|
|
666
743
|
const highestValues = highest(high, length);
|
|
@@ -675,6 +752,7 @@ function stoch(source, high, low, length) {
|
|
|
675
752
|
return result;
|
|
676
753
|
}
|
|
677
754
|
function mfi(source, length, volume) {
|
|
755
|
+
(0, import_limits.checkPositiveLength)("mfi", length, 0);
|
|
678
756
|
if (!volume) {
|
|
679
757
|
throw new Error(
|
|
680
758
|
"ta.mfi() requires volume series. Either pass it explicitly or use createContext({ chart: { ..., volume } }) for implicit data."
|
|
@@ -701,6 +779,7 @@ function mfi(source, length, volume) {
|
|
|
701
779
|
});
|
|
702
780
|
}
|
|
703
781
|
function hma(source, length) {
|
|
782
|
+
(0, import_limits.checkPositiveLength)("hma", length, 0);
|
|
704
783
|
const halfLength = Math.floor(length / 2);
|
|
705
784
|
const sqrtLength = Math.floor(Math.sqrt(length));
|
|
706
785
|
const wmaHalf = wma(source, halfLength);
|
|
@@ -789,24 +868,17 @@ function sar(start, inc, max2, high, low, close) {
|
|
|
789
868
|
return result;
|
|
790
869
|
}
|
|
791
870
|
function pivot(source, leftbars, rightbars, isHigh) {
|
|
792
|
-
const
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
const
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
for (let j = 1; j
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
}
|
|
804
|
-
for (let j = 1; j <= rightbars; j++) {
|
|
805
|
-
const x = source[center + j];
|
|
806
|
-
if (Number.isNaN(x)) break;
|
|
807
|
-
if (beatsRight(x, v)) return NaN;
|
|
808
|
-
}
|
|
809
|
-
return v;
|
|
871
|
+
const { values, bars, last } = keptValues(source);
|
|
872
|
+
return Array.from(source, (_, i) => {
|
|
873
|
+
const left = Math.trunc(typeof leftbars === "number" ? leftbars : leftbars[i]);
|
|
874
|
+
const right = Math.trunc(typeof rightbars === "number" ? rightbars : rightbars[i]);
|
|
875
|
+
const k = last[i];
|
|
876
|
+
if (!(i >= left + right) || k < 0) return NaN;
|
|
877
|
+
let best = k;
|
|
878
|
+
for (let j = k - 1; j >= 0 && j >= k - left - right; j--) {
|
|
879
|
+
if (isHigh ? values[j] > values[best] : values[j] < values[best]) best = j;
|
|
880
|
+
}
|
|
881
|
+
return bars[best] === i - right ? values[best] : NaN;
|
|
810
882
|
});
|
|
811
883
|
}
|
|
812
884
|
function pivothigh(sourceOrLeftbars, leftbarsOrRightbars, rightbars, high) {
|
|
@@ -891,6 +963,7 @@ function dmi(diLength, adxSmoothing, high, low, close) {
|
|
|
891
963
|
return [plusDI, minusDI, adx];
|
|
892
964
|
}
|
|
893
965
|
function tsi(source, shortLength, longLength) {
|
|
966
|
+
(0, import_limits.checkPositiveLength)("tsi->ema", shortLength, 0);
|
|
894
967
|
const momentum = [];
|
|
895
968
|
for (let i = 0; i < source.length; i++) {
|
|
896
969
|
if (i === 0) {
|
|
@@ -908,6 +981,7 @@ function tsi(source, shortLength, longLength) {
|
|
|
908
981
|
});
|
|
909
982
|
}
|
|
910
983
|
function cmo(source, length) {
|
|
984
|
+
(0, import_limits.checkPositiveLength)("cmo", length, 0);
|
|
911
985
|
const up = [];
|
|
912
986
|
const down = [];
|
|
913
987
|
for (let i = 0; i < source.length; i++) {
|
|
@@ -920,6 +994,7 @@ function cmo(source, length) {
|
|
|
920
994
|
return sm1.map((s1, i) => 100 * (s1 - sm2[i]) / (s1 + sm2[i]));
|
|
921
995
|
}
|
|
922
996
|
function kc(source, length, mult, useTrueRange = true, high, low, close) {
|
|
997
|
+
(0, import_limits.checkPositiveLength)("kc", length, 0);
|
|
923
998
|
const middle = ema(source, length);
|
|
924
999
|
let range2;
|
|
925
1000
|
if (useTrueRange) {
|
|
@@ -946,6 +1021,7 @@ function kc(source, length, mult, useTrueRange = true, high, low, close) {
|
|
|
946
1021
|
return [middle, upper, lower];
|
|
947
1022
|
}
|
|
948
1023
|
function bbw(source, length, mult) {
|
|
1024
|
+
(0, import_limits.checkPositiveLength)("bbw", length, 0);
|
|
949
1025
|
const [basis, upper, lower] = bb(source, length, mult);
|
|
950
1026
|
const result = [];
|
|
951
1027
|
for (let i = 0; i < source.length; i++) {
|
|
@@ -959,6 +1035,7 @@ function bbw(source, length, mult) {
|
|
|
959
1035
|
return result;
|
|
960
1036
|
}
|
|
961
1037
|
function wpr(high, low, close, length = 14) {
|
|
1038
|
+
(0, import_limits.checkPositiveLength)("wpr", length, 0);
|
|
962
1039
|
const highs = highest(high, length);
|
|
963
1040
|
const lows = lowest(low, length);
|
|
964
1041
|
return Array.from({ length: close.length }, (_, i) => {
|
|
@@ -1000,6 +1077,7 @@ function vwap(source, volume, anchor, stdev_mult) {
|
|
|
1000
1077
|
return stdev_mult === void 0 ? mid : [mid, upper, lower];
|
|
1001
1078
|
}
|
|
1002
1079
|
function alma(source, length = 9, offset = 0.85, sigma = 6, floor = false) {
|
|
1080
|
+
(0, import_limits.checkPositiveLength)("alma", length, 0);
|
|
1003
1081
|
const result = [];
|
|
1004
1082
|
const m = floor ? Math.floor(offset * (length - 1)) : offset * (length - 1);
|
|
1005
1083
|
const s = length / sigma;
|
|
@@ -1039,6 +1117,7 @@ function kcw(source, length = 20, mult = 2, useTrueRange = true, high, low, clos
|
|
|
1039
1117
|
return result;
|
|
1040
1118
|
}
|
|
1041
1119
|
function range(source, length) {
|
|
1120
|
+
(0, import_limits.checkPositiveLength)("range", length, 0);
|
|
1042
1121
|
return source.map((_, i) => {
|
|
1043
1122
|
const values = lastValues(source, i, length);
|
|
1044
1123
|
return values ? Math.max(...values) - Math.min(...values) : NaN;
|
|
@@ -1065,6 +1144,7 @@ function min(source) {
|
|
|
1065
1144
|
});
|
|
1066
1145
|
}
|
|
1067
1146
|
function cog(source, length = 10) {
|
|
1147
|
+
(0, import_limits.checkPositiveLength)("cog", length, 0);
|
|
1068
1148
|
const len = Math.floor(length);
|
|
1069
1149
|
return (0, import_running_sum.runningSum)(source, len).map((sum, i) => {
|
|
1070
1150
|
if (i < len - 1 || Number.isNaN(sum) || sum === 0) return NaN;
|
|
@@ -1074,6 +1154,7 @@ function cog(source, length = 10) {
|
|
|
1074
1154
|
});
|
|
1075
1155
|
}
|
|
1076
1156
|
function mode(source, length) {
|
|
1157
|
+
(0, import_limits.checkPositiveLength)("mode", length, 0);
|
|
1077
1158
|
const result = [];
|
|
1078
1159
|
const len = Math.floor(length);
|
|
1079
1160
|
const seen = [];
|
|
@@ -1106,6 +1187,7 @@ function mode(source, length) {
|
|
|
1106
1187
|
return result;
|
|
1107
1188
|
}
|
|
1108
1189
|
function percentile_linear_interpolation(source, length, percentage) {
|
|
1190
|
+
(0, import_limits.checkPositiveLength)("percentile_linear_interpolation", length, 0);
|
|
1109
1191
|
return sortedWindow(source, length, (s) => {
|
|
1110
1192
|
const pos = percentage / 100 * length - 0.5;
|
|
1111
1193
|
if (pos <= 0) return s[0];
|
|
@@ -1134,10 +1216,12 @@ function sortedWindow(source, length, fn) {
|
|
|
1134
1216
|
return result;
|
|
1135
1217
|
}
|
|
1136
1218
|
function percentile_nearest_rank(source, length, percentage) {
|
|
1219
|
+
(0, import_limits.checkPositiveLength)("percentile_nearest_rank", length, 0);
|
|
1137
1220
|
const rank = Math.min(length, Math.max(1, Math.ceil(percentage / 100 * length)));
|
|
1138
1221
|
return sortedWindow(source, length, (s) => s[rank - 1]);
|
|
1139
1222
|
}
|
|
1140
1223
|
function rci(source, length) {
|
|
1224
|
+
(0, import_limits.checkPositiveLength)("rci", length, 0);
|
|
1141
1225
|
const len = Math.floor(length);
|
|
1142
1226
|
const result = [];
|
|
1143
1227
|
const ring = new Array(len + 1).fill(0);
|
|
@@ -1191,132 +1275,105 @@ function rci(source, length) {
|
|
|
1191
1275
|
}
|
|
1192
1276
|
function pivot_point_levels(type, anchor, developing = false, high, low, close, open) {
|
|
1193
1277
|
const typeStr = typeof type === "string" ? type : String(type[0]);
|
|
1194
|
-
const isDeveloping = typeof developing === "boolean" ? developing : developing[0];
|
|
1278
|
+
const isDeveloping = typeof developing === "boolean" ? developing : Boolean(developing[0]);
|
|
1195
1279
|
if (typeStr === "Woodie" && isDeveloping) {
|
|
1196
|
-
throw new Error(
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
if (isDeveloping && lastAnchorIndex >= 0) {
|
|
1216
|
-
h = high ? Math.max(...high.slice(lastAnchorIndex, i + 1).filter((v) => !isNaN(v))) : NaN;
|
|
1217
|
-
l = low ? Math.min(...low.slice(lastAnchorIndex, i + 1).filter((v) => !isNaN(v))) : NaN;
|
|
1218
|
-
c = close ? close[i] : NaN;
|
|
1219
|
-
o = open && lastAnchorIndex >= 0 ? open[lastAnchorIndex] : NaN;
|
|
1220
|
-
} else {
|
|
1221
|
-
h = lastH;
|
|
1222
|
-
l = lastL;
|
|
1223
|
-
c = lastC;
|
|
1224
|
-
o = lastO;
|
|
1225
|
-
}
|
|
1226
|
-
const levels = calculatePivotLevels(typeStr, h, l, c, o);
|
|
1227
|
-
for (let j = 0; j < 11; j++) {
|
|
1228
|
-
results[j].push(levels[j]);
|
|
1280
|
+
throw new Error(
|
|
1281
|
+
'Error on bar 0: The `developing` parameter of the `ta.pivot_point_levels()` cannot be `true` when `type` is "Woodie".'
|
|
1282
|
+
);
|
|
1283
|
+
}
|
|
1284
|
+
const n = anchor.length;
|
|
1285
|
+
for (const [s, name] of [[high, "High"], [low, "Low"], [close, "Close"], [open, "Open"]]) {
|
|
1286
|
+
if (s && s.length !== n) throw new Error(`${name} series length mismatch`);
|
|
1287
|
+
}
|
|
1288
|
+
const at = (s, i) => s ? s[i] ?? NaN : NaN;
|
|
1289
|
+
const results = Array.from({ length: 11 }, () => new Array(n));
|
|
1290
|
+
let curH = NaN, curL = NaN, curO = NaN;
|
|
1291
|
+
let prevH = NaN, prevL = NaN, prevC = NaN, prevO = NaN;
|
|
1292
|
+
let anchored = false;
|
|
1293
|
+
for (let i = 0; i < n; i++) {
|
|
1294
|
+
const h = at(high, i), l = at(low, i);
|
|
1295
|
+
if (i === 0) {
|
|
1296
|
+
curH = h;
|
|
1297
|
+
curL = l;
|
|
1298
|
+
curO = at(open, i);
|
|
1229
1299
|
}
|
|
1300
|
+
if (anchor[i]) {
|
|
1301
|
+
prevH = curH;
|
|
1302
|
+
prevL = curL;
|
|
1303
|
+
prevC = i > 0 ? at(close, i - 1) : NaN;
|
|
1304
|
+
prevO = curO;
|
|
1305
|
+
curH = h;
|
|
1306
|
+
curL = l;
|
|
1307
|
+
curO = at(open, i);
|
|
1308
|
+
anchored = true;
|
|
1309
|
+
} else if (i > 0) {
|
|
1310
|
+
if (h > curH || Number.isNaN(curH)) curH = h;
|
|
1311
|
+
if (l < curL || Number.isNaN(curL)) curL = l;
|
|
1312
|
+
}
|
|
1313
|
+
const levels = isDeveloping ? pivotLevels(typeStr, curH, curL, at(close, i), curO, at(close, i)) : anchored ? pivotLevels(typeStr, prevH, prevL, prevC, prevO, curO) : NA_LEVELS;
|
|
1314
|
+
for (let k = 0; k < 11; k++) results[k][i] = levels[k];
|
|
1230
1315
|
}
|
|
1231
1316
|
return results;
|
|
1232
1317
|
}
|
|
1233
|
-
|
|
1234
|
-
|
|
1235
|
-
|
|
1236
|
-
|
|
1237
|
-
const levels = Array(11).fill(NaN);
|
|
1238
|
-
let P;
|
|
1239
|
-
switch (type) {
|
|
1240
|
-
case "Traditional":
|
|
1241
|
-
case "Fibonacci":
|
|
1242
|
-
case "Classic":
|
|
1243
|
-
P = (h + l + c) / 3;
|
|
1244
|
-
break;
|
|
1245
|
-
case "Woodie":
|
|
1246
|
-
P = (h + l + 2 * c) / 4;
|
|
1247
|
-
break;
|
|
1248
|
-
case "DM":
|
|
1249
|
-
P = (h + l + c) / 3;
|
|
1250
|
-
break;
|
|
1251
|
-
case "Camarilla":
|
|
1252
|
-
P = (h + l + c) / 3;
|
|
1253
|
-
break;
|
|
1254
|
-
default:
|
|
1255
|
-
P = (h + l + c) / 3;
|
|
1256
|
-
}
|
|
1257
|
-
levels[0] = P;
|
|
1318
|
+
const NA_LEVELS = new Array(11).fill(NaN);
|
|
1319
|
+
function pivotLevels(type, h, l, c, o, wo) {
|
|
1320
|
+
const N = NaN;
|
|
1321
|
+
const r = h - l;
|
|
1258
1322
|
switch (type) {
|
|
1259
|
-
case "Traditional":
|
|
1260
|
-
|
|
1261
|
-
|
|
1262
|
-
|
|
1263
|
-
|
|
1264
|
-
|
|
1265
|
-
|
|
1266
|
-
|
|
1267
|
-
|
|
1268
|
-
|
|
1269
|
-
|
|
1270
|
-
|
|
1271
|
-
|
|
1272
|
-
|
|
1273
|
-
|
|
1274
|
-
|
|
1275
|
-
|
|
1276
|
-
|
|
1277
|
-
|
|
1278
|
-
|
|
1279
|
-
|
|
1280
|
-
|
|
1281
|
-
|
|
1282
|
-
|
|
1283
|
-
|
|
1284
|
-
|
|
1285
|
-
|
|
1286
|
-
|
|
1287
|
-
|
|
1288
|
-
|
|
1289
|
-
levels[5] = h + 2 * (P - l);
|
|
1290
|
-
levels[6] = l - 2 * (h - P);
|
|
1291
|
-
levels[7] = levels[5] + (h - l);
|
|
1292
|
-
levels[8] = levels[6] - (h - l);
|
|
1293
|
-
levels[9] = levels[7] + (h - l);
|
|
1294
|
-
levels[10] = levels[8] - (h - l);
|
|
1295
|
-
break;
|
|
1323
|
+
case "Traditional": {
|
|
1324
|
+
const p = (h + l + c) / 3;
|
|
1325
|
+
return [
|
|
1326
|
+
p,
|
|
1327
|
+
2 * p - l,
|
|
1328
|
+
2 * p - h,
|
|
1329
|
+
p + r,
|
|
1330
|
+
p - r,
|
|
1331
|
+
p * 2 + (h - 2 * l),
|
|
1332
|
+
p * 2 - (2 * h - l),
|
|
1333
|
+
p * 3 + (h - 3 * l),
|
|
1334
|
+
p * 3 - (3 * h - l),
|
|
1335
|
+
p * 4 + (h - 4 * l),
|
|
1336
|
+
p * 4 - (4 * h - l)
|
|
1337
|
+
];
|
|
1338
|
+
}
|
|
1339
|
+
case "Fibonacci": {
|
|
1340
|
+
const p = (h + l + c) / 3;
|
|
1341
|
+
return [p, p + 0.382 * r, p - 0.382 * r, p + 0.618 * r, p - 0.618 * r, p + 1 * r, p - 1 * r, N, N, N, N];
|
|
1342
|
+
}
|
|
1343
|
+
case "Classic": {
|
|
1344
|
+
const p = (h + l + c) / 3;
|
|
1345
|
+
return [p, 2 * p - l, 2 * p - h, p + r, p - r, p + 2 * r, p - 2 * r, p + 3 * r, p - 3 * r, N, N];
|
|
1346
|
+
}
|
|
1347
|
+
case "Woodie": {
|
|
1348
|
+
const p = (h + l + 2 * wo) / 4;
|
|
1349
|
+
const r3 = h + 2 * (p - l);
|
|
1350
|
+
const s3 = l - 2 * (h - p);
|
|
1351
|
+
return [p, 2 * p - l, 2 * p - h, p + r, p - r, r3, s3, r3 + r, s3 - r, N, N];
|
|
1352
|
+
}
|
|
1296
1353
|
case "DM": {
|
|
1297
|
-
const x = h + l + c
|
|
1298
|
-
|
|
1299
|
-
levels[0] = newP;
|
|
1300
|
-
levels[1] = x / 2 - l;
|
|
1301
|
-
levels[2] = x / 2 - h;
|
|
1302
|
-
break;
|
|
1354
|
+
const x = c < o ? h + 2 * l + c : c > o ? 2 * h + l + c : h + l + 2 * c;
|
|
1355
|
+
return [x / 4, x / 2 - l, x / 2 - h, N, N, N, N, N, N, N, N];
|
|
1303
1356
|
}
|
|
1304
1357
|
case "Camarilla": {
|
|
1305
|
-
const
|
|
1306
|
-
|
|
1307
|
-
|
|
1308
|
-
|
|
1309
|
-
|
|
1310
|
-
|
|
1311
|
-
|
|
1312
|
-
|
|
1313
|
-
|
|
1314
|
-
|
|
1315
|
-
|
|
1316
|
-
|
|
1358
|
+
const p = (h + l + c) / 3;
|
|
1359
|
+
const r5 = h / l * c;
|
|
1360
|
+
return [
|
|
1361
|
+
p,
|
|
1362
|
+
c + r * 1.1 / 12,
|
|
1363
|
+
c - r * 1.1 / 12,
|
|
1364
|
+
c + r * 1.1 / 6,
|
|
1365
|
+
c - r * 1.1 / 6,
|
|
1366
|
+
c + r * 1.1 / 4,
|
|
1367
|
+
c - r * 1.1 / 4,
|
|
1368
|
+
c + r * 1.1 / 2,
|
|
1369
|
+
c - r * 1.1 / 2,
|
|
1370
|
+
r5,
|
|
1371
|
+
2 * c - r5
|
|
1372
|
+
];
|
|
1317
1373
|
}
|
|
1374
|
+
default:
|
|
1375
|
+
return NA_LEVELS;
|
|
1318
1376
|
}
|
|
1319
|
-
return levels;
|
|
1320
1377
|
}
|
|
1321
1378
|
function ichimoku(conversionPeriods, basePeriods, laggingSpan2Periods, displacement, high, low, close) {
|
|
1322
1379
|
const length = high.length;
|