@devexperts/dxcharts-lite 1.0.2 → 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/README.md +2 -2
- package/dist/chart/animation/canvas-animation.js +134 -1
- package/dist/chart/animation/types/animation.js +43 -1
- package/dist/chart/animation/types/color-alpha-animation.d.ts +1 -1
- package/dist/chart/animation/types/color-alpha-animation.js +60 -1
- package/dist/chart/animation/types/color-transition-animation.d.ts +1 -1
- package/dist/chart/animation/types/color-transition-animation.js +86 -1
- package/dist/chart/animation/types/viewport-movement-animation.js +63 -1
- package/dist/chart/animation/viewport-model-animation.js +20 -1
- package/dist/chart/bootstrap.d.ts +51 -48
- package/dist/chart/bootstrap.js +449 -1
- package/dist/chart/canvas/canvas-bounds-container.d.ts +0 -5
- package/dist/chart/canvas/canvas-bounds-container.js +815 -1
- package/dist/chart/canvas/canvas-chart-html.js +16 -18
- package/dist/chart/canvas/chart-elements.d.ts +1 -4
- package/dist/chart/canvas/chart-elements.js +22 -1
- package/dist/chart/canvas/cursor.handler.js +122 -1
- package/dist/chart/canvas/layout-creator.js +34 -1
- package/dist/chart/canvas/y-axis-bounds.container.d.ts +2 -2
- package/dist/chart/canvas/y-axis-bounds.container.js +67 -1
- package/dist/chart/chart-container.js +1 -1
- package/dist/chart/chart.config.d.ts +4 -5
- package/dist/chart/chart.config.js +645 -1
- package/dist/chart/chart.d.ts +62 -0
- package/dist/chart/chart.js +106 -0
- package/dist/chart/components/chart/basic-scale.d.ts +2 -2
- package/dist/chart/components/chart/basic-scale.js +31 -1
- package/dist/chart/components/chart/candle-transformer.functions.js +15 -1
- package/dist/chart/components/chart/candle-width-calculator.functions.js +2 -1
- package/dist/chart/components/chart/candle.functions.js +44 -1
- package/dist/chart/components/chart/chart-area-pan.handler.d.ts +3 -3
- package/dist/chart/components/chart/chart-area-pan.handler.js +197 -1
- package/dist/chart/components/chart/chart-base.model.js +66 -1
- package/dist/chart/components/chart/chart.component.d.ts +7 -3
- package/dist/chart/components/chart/chart.component.js +408 -1
- package/dist/chart/components/chart/chart.model.d.ts +4 -11
- package/dist/chart/components/chart/chart.model.js +954 -1
- package/dist/chart/components/chart/data-series.high-low-provider.js +34 -1
- package/dist/chart/components/chart/fake-candles.js +97 -1
- package/dist/chart/components/chart/price.formatter.js +35 -1
- package/dist/chart/components/chart/secondary-chart-colors-pool.js +68 -1
- package/dist/chart/components/cross_tool/cross-tool.component.js +85 -1
- package/dist/chart/components/cross_tool/cross-tool.drawer.js +32 -1
- package/dist/chart/components/cross_tool/cross-tool.model.js +107 -1
- package/dist/chart/components/cross_tool/types/cross-and-labels.drawer.js +137 -1
- package/dist/chart/components/cross_tool/types/none.drawer.js +3 -1
- package/dist/chart/components/dran-n-drop_helper/drag-n-drop-x.component.js +28 -1
- package/dist/chart/components/dran-n-drop_helper/drag-n-drop-y.component.js +24 -1
- package/dist/chart/components/dran-n-drop_helper/drag-n-drop.component.js +53 -1
- package/dist/chart/components/dynamic-objects/dynamic-objects.component.d.ts +13 -0
- package/dist/chart/components/dynamic-objects/dynamic-objects.component.js +20 -0
- package/dist/chart/components/dynamic-objects/dynamic-objects.drawer.d.ts +18 -0
- package/dist/chart/components/dynamic-objects/dynamic-objects.drawer.js +23 -0
- package/dist/chart/components/dynamic-objects/dynamic-objects.model.d.ts +63 -0
- package/dist/chart/components/dynamic-objects/dynamic-objects.model.js +136 -0
- package/dist/chart/components/events/events-hit-test.drawer.js +63 -1
- package/dist/chart/components/events/events.component.js +61 -1
- package/dist/chart/components/events/events.drawer.js +195 -1
- package/dist/chart/components/events/events.model.js +69 -1
- package/dist/chart/components/grid/grid.component.d.ts +2 -2
- package/dist/chart/components/grid/grid.component.js +31 -1
- package/dist/chart/components/grid/grid.drawer.d.ts +4 -3
- package/dist/chart/components/grid/grid.drawer.js +106 -1
- package/dist/chart/components/high_low/high-low.component.js +12 -1
- package/dist/chart/components/high_low/high-low.drawer.js +126 -1
- package/dist/chart/components/highlights/highlights.component.js +46 -1
- package/dist/chart/components/highlights/highlights.drawer.js +154 -1
- package/dist/chart/components/highlights/highlights.model.js +75 -1
- package/dist/chart/components/labels_generator/numeric-axis-labels.generator.d.ts +1 -1
- package/dist/chart/components/labels_generator/numeric-axis-labels.generator.js +199 -1
- package/dist/chart/components/navigation_map/navigation-map-move.handler.d.ts +2 -2
- package/dist/chart/components/navigation_map/navigation-map-move.handler.js +108 -1
- package/dist/chart/components/navigation_map/navigation-map.component.js +112 -1
- package/dist/chart/components/navigation_map/navigation-map.drawer.js +244 -1
- package/dist/chart/components/navigation_map/navigation-map.model.js +33 -2
- package/dist/chart/components/pan/chart-pan.component.d.ts +2 -2
- package/dist/chart/components/pan/chart-pan.component.js +51 -1
- package/dist/chart/components/pane/extent/y-extent-component.d.ts +12 -18
- package/dist/chart/components/pane/extent/y-extent-component.js +120 -1
- package/dist/chart/components/pane/pane-hit-test.controller.d.ts +2 -2
- package/dist/chart/components/pane/pane-hit-test.controller.js +55 -1
- package/dist/chart/components/pane/pane-manager.component.d.ts +12 -6
- package/dist/chart/components/pane/pane-manager.component.js +149 -1
- package/dist/chart/components/pane/pane.component.d.ts +16 -32
- package/dist/chart/components/pane/pane.component.js +278 -1
- package/dist/chart/components/resizer/bar-resizer.component.js +139 -1
- package/dist/chart/components/resizer/bar-resizer.drawer.js +46 -1
- package/dist/chart/components/snapshot/snapshot.component.js +48 -1
- package/dist/chart/components/volumes/separate-volumes.component.d.ts +6 -10
- package/dist/chart/components/volumes/separate-volumes.component.js +63 -1
- package/dist/chart/components/volumes/volume-color-resolvers.functions.js +18 -1
- package/dist/chart/components/volumes/volumes.component.d.ts +6 -7
- package/dist/chart/components/volumes/volumes.component.js +94 -1
- package/dist/chart/components/volumes/volumes.drawer.d.ts +5 -12
- package/dist/chart/components/volumes/volumes.drawer.js +140 -1
- package/dist/chart/components/volumes/volumes.formatter.js +31 -1
- package/dist/chart/components/volumes/volumes.model.d.ts +2 -2
- package/dist/chart/components/volumes/volumes.model.js +43 -1
- package/dist/chart/components/watermark/water-mark.component.js +103 -1
- package/dist/chart/components/watermark/water-mark.drawer.js +187 -1
- package/dist/chart/components/x_axis/numeric-x-axis-labels.generator.js +27 -1
- package/dist/chart/components/x_axis/time/parser/time-formats-matchers.functions.js +187 -1
- package/dist/chart/components/x_axis/time/parser/time-formats-parser.functions.js +76 -1
- package/dist/chart/components/x_axis/time/parser/time-formats-validators.functions.js +79 -1
- package/dist/chart/components/x_axis/time/parser/time-formats.model.js +14 -1
- package/dist/chart/components/x_axis/time/x-axis-weights.functions.d.ts +1 -1
- package/dist/chart/components/x_axis/time/x-axis-weights.functions.js +143 -1
- package/dist/chart/components/x_axis/time/x-axis-weights.generator.js +73 -1
- package/dist/chart/components/x_axis/x-axis-draw.functions.js +49 -1
- package/dist/chart/components/x_axis/x-axis-labels.drawer.js +70 -1
- package/dist/chart/components/x_axis/x-axis-labels.generator.d.ts +2 -2
- package/dist/chart/components/x_axis/x-axis-labels.generator.js +332 -1
- package/dist/chart/components/x_axis/x-axis-labels.model.js +35 -1
- package/dist/chart/components/x_axis/x-axis-scale.handler.d.ts +2 -2
- package/dist/chart/components/x_axis/x-axis-scale.handler.js +60 -1
- package/dist/chart/components/x_axis/x-axis-time-labels.drawer.js +82 -1
- package/dist/chart/components/x_axis/x-axis.component.d.ts +2 -2
- package/dist/chart/components/x_axis/x-axis.component.js +119 -1
- package/dist/chart/components/y_axis/label-color.functions.js +53 -1
- package/dist/chart/components/y_axis/numeric-y-axis-labels.generator.d.ts +4 -4
- package/dist/chart/components/y_axis/numeric-y-axis-labels.generator.js +33 -1
- package/dist/chart/components/y_axis/price_labels/data-series-y-axis-labels.provider.d.ts +3 -3
- package/dist/chart/components/y_axis/price_labels/data-series-y-axis-labels.provider.js +67 -1
- package/dist/chart/components/y_axis/price_labels/labels-positions-calculator.js +56 -1
- package/dist/chart/components/y_axis/price_labels/last-candle-labels.provider.d.ts +4 -3
- package/dist/chart/components/y_axis/price_labels/last-candle-labels.provider.js +96 -1
- package/dist/chart/components/y_axis/price_labels/price-label.drawer.d.ts +2 -2
- package/dist/chart/components/y_axis/price_labels/price-label.drawer.js +119 -1
- package/dist/chart/components/y_axis/price_labels/y-axis-labels.model.d.ts +9 -8
- package/dist/chart/components/y_axis/price_labels/y-axis-labels.model.js +201 -1
- package/dist/chart/components/y_axis/price_labels/y-axis-price-labels.drawer.d.ts +6 -7
- package/dist/chart/components/y_axis/price_labels/y-axis-price-labels.drawer.js +58 -1
- package/dist/chart/components/y_axis/y-axis-base-labels.model.d.ts +6 -4
- package/dist/chart/components/y_axis/y-axis-base-labels.model.js +47 -1
- package/dist/chart/components/y_axis/y-axis-labels.drawer.d.ts +4 -4
- package/dist/chart/components/y_axis/y-axis-labels.drawer.js +161 -1
- package/dist/chart/components/y_axis/y-axis-scale.handler.d.ts +2 -2
- package/dist/chart/components/y_axis/y-axis-scale.handler.js +72 -1
- package/dist/chart/components/y_axis/y-axis.component.d.ts +32 -41
- package/dist/chart/components/y_axis/y-axis.component.js +220 -1
- package/dist/chart/components/y_axis/y-axis.drawer.d.ts +9 -12
- package/dist/chart/components/y_axis/y-axis.drawer.js +96 -1
- package/dist/chart/components/y_axis/y-axis.model.d.ts +10 -17
- package/dist/chart/components/y_axis/y-axis.model.js +34 -1
- package/dist/chart/drawers/chart-background.drawer.js +69 -1
- package/dist/chart/drawers/chart-type-drawers/area.drawer.js +69 -1
- package/dist/chart/drawers/chart-type-drawers/bar.drawer.js +57 -1
- package/dist/chart/drawers/chart-type-drawers/baseline.drawer.js +84 -1
- package/dist/chart/drawers/chart-type-drawers/candle.drawer.js +162 -1
- package/dist/chart/drawers/chart-type-drawers/histogram.drawer.js +57 -1
- package/dist/chart/drawers/chart-type-drawers/line.drawer.js +38 -1
- package/dist/chart/drawers/chart-type-drawers/scatter-plot.drawer.js +19 -1
- package/dist/chart/drawers/clear-canvas.drawer.js +14 -1
- package/dist/chart/drawers/composite.drawer.js +67 -1
- package/dist/chart/drawers/data-series-drawers/candle-series-wrapper.js +50 -1
- package/dist/chart/drawers/data-series-drawers/color-candle.drawer.js +35 -1
- package/dist/chart/drawers/data-series-drawers/data-series-drawers.utils.js +16 -1
- package/dist/chart/drawers/data-series-drawers/difference-cloud.drawer.js +106 -1
- package/dist/chart/drawers/data-series-drawers/histogram.drawer.js +23 -1
- package/dist/chart/drawers/data-series-drawers/linear.drawer.js +19 -1
- package/dist/chart/drawers/data-series-drawers/points.drawer.js +19 -1
- package/dist/chart/drawers/data-series-drawers/rectangular-tool.drawer.js +7 -1
- package/dist/chart/drawers/data-series-drawers/text.drawer.js +25 -1
- package/dist/chart/drawers/data-series-drawers/trend-histogram.drawer.js +35 -1
- package/dist/chart/drawers/data-series-drawers/triangle.drawer.js +22 -1
- package/dist/chart/drawers/data-series.drawer.d.ts +5 -7
- package/dist/chart/drawers/data-series.drawer.js +56 -1
- package/dist/chart/drawers/drawing-manager.d.ts +1 -1
- package/dist/chart/drawers/drawing-manager.js +177 -1
- package/dist/chart/drawers/ht-data-series.drawer.js +37 -1
- package/dist/chart/events/event-bus.js +73 -1
- package/dist/chart/events/events.js +3 -1
- package/dist/chart/inputhandlers/candle-tap.handler.js +46 -1
- package/dist/chart/inputhandlers/chart-resize.handler.js +98 -1
- package/dist/chart/inputhandlers/cross-event-producer.component.js +67 -1
- package/dist/chart/inputhandlers/hover-producer.component.d.ts +2 -2
- package/dist/chart/inputhandlers/hover-producer.component.js +228 -1
- package/dist/chart/inputhandlers/main-canvas-touch.handler.d.ts +2 -2
- package/dist/chart/inputhandlers/main-canvas-touch.handler.js +80 -1
- package/dist/chart/inputlisteners/canvas-input-listener.component.js +629 -1
- package/dist/chart/model/baseline.model.js +88 -1
- package/dist/chart/model/bounds.model.js +1 -1
- package/dist/chart/model/candle-hover.js +70 -1
- package/dist/chart/model/candle-series-high-low.provider.js +45 -1
- package/dist/chart/model/candle-series.model.d.ts +3 -3
- package/dist/chart/model/candle-series.model.js +245 -1
- package/dist/chart/model/candle.model.js +69 -1
- package/dist/chart/model/canvas.model.js +228 -1
- package/dist/chart/model/chart-base-element.js +129 -1
- package/dist/chart/model/compare-series-hover.js +25 -1
- package/dist/chart/model/data-series-view.d.ts +5 -5
- package/dist/chart/model/data-series-view.js +111 -1
- package/dist/chart/model/data-series.config.js +14 -1
- package/dist/chart/model/data-series.model.d.ts +4 -4
- package/dist/chart/model/data-series.model.js +281 -1
- package/dist/chart/model/date-time.formatter.js +151 -1
- package/dist/chart/model/hit-test-canvas.model.d.ts +1 -1
- package/dist/chart/model/hit-test-canvas.model.js +256 -1
- package/dist/chart/model/main-candle-series.model.d.ts +1 -1
- package/dist/chart/model/main-candle-series.model.js +29 -1
- package/dist/chart/model/scale.model.d.ts +3 -2
- package/dist/chart/model/scale.model.js +316 -1
- package/dist/chart/model/scaling/auto-scale.model.d.ts +2 -4
- package/dist/chart/model/scaling/auto-scale.model.js +91 -1
- package/dist/chart/model/scaling/constrait.functions.js +61 -1
- package/dist/chart/model/scaling/lock-ratio.model.js +17 -1
- package/dist/chart/model/scaling/move-chart.functions.js +22 -1
- package/dist/chart/model/scaling/viewport.model.d.ts +2 -2
- package/dist/chart/model/scaling/viewport.model.js +279 -1
- package/dist/chart/model/scaling/x-zooming.functions.js +35 -1
- package/dist/chart/model/time-zone.model.js +109 -1
- package/dist/chart/model/visual-candle.js +134 -1
- package/dist/chart/utils/__tests__/array.utils.test.js +135 -1
- package/dist/chart/utils/__tests__/math.utils.test.js +14 -1
- package/dist/chart/utils/__tests__/object.utils.test.js +11 -1
- package/dist/chart/utils/__tests__/priceIncrementsUtils.test.js +29 -1
- package/dist/chart/utils/array.utils.d.ts +1 -1
- package/dist/chart/utils/array.utils.js +269 -1
- package/dist/chart/utils/auto-period-detector.utils.js +39 -1
- package/dist/chart/utils/candles-generator-ts.utils.js +20 -1
- package/dist/chart/utils/candles-generator.utils.js +161 -1
- package/dist/chart/utils/candles.utils.js +42 -1
- package/dist/chart/utils/canvas/canvas-drawing-functions.utils.js +144 -1
- package/dist/chart/utils/canvas/canvas-font-measure-tool.utils.js +51 -1
- package/dist/chart/utils/canvas/canvas-text-functions.utils.js +156 -1
- package/dist/chart/utils/color.utils.js +31 -1
- package/dist/chart/utils/device/browser.utils.js +10 -1
- package/dist/chart/utils/device/device-detector.utils.js +24 -1
- package/dist/chart/utils/device/device-pixel-ratio.utils.js +21 -1
- package/dist/chart/utils/device/touchpad.utils.js +91 -1
- package/dist/chart/utils/dom.utils.js +15 -1
- package/dist/chart/utils/function.utils.js +16 -1
- package/dist/chart/utils/linkedList.utils.d.ts +28 -0
- package/dist/chart/utils/linkedList.utils.js +138 -0
- package/dist/chart/utils/math.utils.js +115 -1
- package/dist/chart/utils/merge.utils.js +56 -1
- package/dist/chart/utils/object.utils.js +43 -1
- package/dist/chart/utils/performance/animation-frame-cache.utils.js +77 -0
- package/dist/chart/utils/{perfomance → performance}/debounce.utils.js +7 -1
- package/dist/chart/utils/performance/memoize.utils.js +74 -0
- package/dist/chart/utils/performance/request-animation-frame-throttle.utils.js +43 -0
- package/dist/chart/utils/performance/throttle.utils.js +26 -0
- package/dist/chart/utils/price-increments.utils.d.ts +1 -0
- package/dist/chart/utils/price-increments.utils.js +127 -1
- package/dist/chart/utils/uuid.utils.js +4 -1
- package/dist/dxchart.min.js +9 -12
- package/dist/index.d.ts +3 -3
- package/dist/index.js +20 -1
- package/package.json +4 -4
- package/dist/chart/utils/perfomance/animation-frame-cache.utils.js +0 -6
- package/dist/chart/utils/perfomance/memoize.utils.js +0 -6
- package/dist/chart/utils/perfomance/request-animation-frame-throttle.utils.js +0 -6
- package/dist/chart/utils/perfomance/throttle.utils.js +0 -6
- /package/dist/chart/utils/{perfomance → performance}/animation-frame-cache.utils.d.ts +0 -0
- /package/dist/chart/utils/{perfomance → performance}/debounce.utils.d.ts +0 -0
- /package/dist/chart/utils/{perfomance → performance}/memoize.utils.d.ts +0 -0
- /package/dist/chart/utils/{perfomance → performance}/request-animation-frame-throttle.utils.d.ts +0 -0
- /package/dist/chart/utils/{perfomance → performance}/throttle.utils.d.ts +0 -0
|
@@ -3,4 +3,272 @@
|
|
|
3
3
|
* This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
|
|
4
4
|
* If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
5
5
|
*/
|
|
6
|
-
import{identity
|
|
6
|
+
import { identity } from './function.utils';
|
|
7
|
+
import { clamp, shiftRight } from './math.utils';
|
|
8
|
+
/**
|
|
9
|
+
* Intersects 2 arrays.
|
|
10
|
+
* Example:
|
|
11
|
+
* source: [1, 2, 3, 1]
|
|
12
|
+
* target: [1, 2, 4, 5, 6]
|
|
13
|
+
* result: [1, 2]
|
|
14
|
+
* result (with duplicates): [1, 1, 2]
|
|
15
|
+
* @param source
|
|
16
|
+
* @param target
|
|
17
|
+
* @param compareFn
|
|
18
|
+
* @param removeDuplicates
|
|
19
|
+
* @doc-tags fp,utility
|
|
20
|
+
*/
|
|
21
|
+
export function arrayIntersect(source, target, compareFn = eqeqeq, removeDuplicates = true) {
|
|
22
|
+
const intersection = source.filter(a => target.some(b => compareFn(a, b)));
|
|
23
|
+
if (removeDuplicates) {
|
|
24
|
+
return intersection.filter((value, index, self) => self.indexOf(value) === index);
|
|
25
|
+
}
|
|
26
|
+
return intersection;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Reorders source array according to newOrder.
|
|
30
|
+
* Returns a reorder copy of the source array.
|
|
31
|
+
* Example:
|
|
32
|
+
* source: ['1', '2', '3']
|
|
33
|
+
* newOrder: ['3', '1']
|
|
34
|
+
* result: ['3', '2', '1']
|
|
35
|
+
*/
|
|
36
|
+
export const reorderArray = (source, newOrder) => {
|
|
37
|
+
// filter out elements which are not presented in the source array
|
|
38
|
+
const order = newOrder.slice().filter(i => source.find(s => s === i));
|
|
39
|
+
return source.map(el => {
|
|
40
|
+
var _a;
|
|
41
|
+
if (newOrder.indexOf(el) >= 0) {
|
|
42
|
+
return (_a = order.shift()) !== null && _a !== void 0 ? _a : el;
|
|
43
|
+
}
|
|
44
|
+
return el;
|
|
45
|
+
});
|
|
46
|
+
};
|
|
47
|
+
export const eqeqeq = (a, b) => a === b;
|
|
48
|
+
/**
|
|
49
|
+
* Subtracts target from source array.
|
|
50
|
+
* Example:
|
|
51
|
+
* source: [1, 2, 3, 4]
|
|
52
|
+
* target: [2, 4, 6]
|
|
53
|
+
* result: [1, 3]
|
|
54
|
+
* @param source
|
|
55
|
+
* @param target
|
|
56
|
+
* @param compareFn
|
|
57
|
+
*/
|
|
58
|
+
export const arraySubtract = (source, target, compareFn) => {
|
|
59
|
+
return source.filter(a => target.filter(b => compareFn(a, b)).length === 0);
|
|
60
|
+
};
|
|
61
|
+
const eqStrict = (a, b) => a === b;
|
|
62
|
+
export const arrayCompare = (source, target, compareFn = eqStrict) => {
|
|
63
|
+
return source.length === target.length && source.every((w, i) => compareFn(w, target[i]));
|
|
64
|
+
};
|
|
65
|
+
export function moveInArray(arr, from, to) {
|
|
66
|
+
const result = arr.slice();
|
|
67
|
+
const item = result[from];
|
|
68
|
+
result.splice(from, 1);
|
|
69
|
+
result.splice(to, 0, item);
|
|
70
|
+
return result;
|
|
71
|
+
}
|
|
72
|
+
export function moveInArrayMutable(arr, _from, _to) {
|
|
73
|
+
const n = arr.length;
|
|
74
|
+
const from = clamp(_from, 0, n - 1);
|
|
75
|
+
const to = clamp(_to, 0, n - 1);
|
|
76
|
+
const item = arr[from];
|
|
77
|
+
arr.splice(from, 1);
|
|
78
|
+
arr.splice(to, 0, item);
|
|
79
|
+
return arr;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Replaces item in array with another one.
|
|
83
|
+
* @param arr
|
|
84
|
+
* @param itemFinder - predicate to find item
|
|
85
|
+
* @param replace - item to replace
|
|
86
|
+
*/
|
|
87
|
+
export function replaceInArray(arr, itemFinder, replace) {
|
|
88
|
+
const result = arr.slice();
|
|
89
|
+
const idx = result.findIndex(itemFinder);
|
|
90
|
+
if (idx !== -1) {
|
|
91
|
+
result.splice(idx, 1);
|
|
92
|
+
result.splice(idx, 0, replace);
|
|
93
|
+
}
|
|
94
|
+
return result;
|
|
95
|
+
}
|
|
96
|
+
export const uniqueArray = (arr) => {
|
|
97
|
+
const hashTable = {};
|
|
98
|
+
return arr.filter(item => (hashTable[item] ? false : (hashTable[item] = true)));
|
|
99
|
+
};
|
|
100
|
+
export const groupBy = (array, key) => {
|
|
101
|
+
return array.reduce((result, currentValue) => {
|
|
102
|
+
// If an array already present for key, push it to the array. Else create an array and push the object
|
|
103
|
+
(result[currentValue[key]] = result[currentValue[key]] || []).push(currentValue);
|
|
104
|
+
// Return the current iteration `result` value, this will be taken as next iteration `result` value and accumulate
|
|
105
|
+
return result;
|
|
106
|
+
// eslint-disable-next-line no-restricted-syntax
|
|
107
|
+
}, {}); // empty object is the initial value for result object
|
|
108
|
+
};
|
|
109
|
+
/**
|
|
110
|
+
* Inserts *something* between every two elements in the source array
|
|
111
|
+
* Example: interleave(['first', 'second', 'third'], 'bar') => ['first', 'bar', 'second', 'bar', 'third']
|
|
112
|
+
* @param arr
|
|
113
|
+
* @param something
|
|
114
|
+
*/
|
|
115
|
+
export const interleave = (arr, something) =>
|
|
116
|
+
// eslint-disable-next-line no-restricted-syntax
|
|
117
|
+
[].concat(...arr.map(n => [n, something])).slice(0, -1);
|
|
118
|
+
export const isTwoDimArray = (arr) => Array.isArray(arr[0]);
|
|
119
|
+
// @ts-ignore
|
|
120
|
+
export const create2DArray = (arr) => (Array.isArray(arr[0]) ? arr : [arr]);
|
|
121
|
+
export const slice2DArray = (arr, startIdx, endIdx) => {
|
|
122
|
+
const result = [];
|
|
123
|
+
let pointsCurrentIdx = 0;
|
|
124
|
+
for (const arr1D of arr) {
|
|
125
|
+
const localIdxStart = Math.max(startIdx - pointsCurrentIdx, 0);
|
|
126
|
+
const localEndIdx = Math.max(endIdx - pointsCurrentIdx, -1);
|
|
127
|
+
const newPoints = arr1D.slice(localIdxStart, localEndIdx + 1);
|
|
128
|
+
newPoints.length > 0 && result.push(newPoints);
|
|
129
|
+
pointsCurrentIdx += arr1D.length;
|
|
130
|
+
}
|
|
131
|
+
return result;
|
|
132
|
+
};
|
|
133
|
+
// Array.at() polyfill (as of December 2022 method is not supported on iOS <= v15)
|
|
134
|
+
export const at = (idx, arr) => (idx >= 0 ? arr[idx] : arr[arr.length + idx]);
|
|
135
|
+
// Array.flat() polyfill (support for chrome 66)
|
|
136
|
+
export const flat = (arr) => {
|
|
137
|
+
// @ts-ignore
|
|
138
|
+
if (Array.prototype.flat) {
|
|
139
|
+
return arr.flat();
|
|
140
|
+
}
|
|
141
|
+
return flatMap(arr, identity);
|
|
142
|
+
};
|
|
143
|
+
// Array.flatMap() polyfill (support for chrome 66)
|
|
144
|
+
export const flatMap = (arr, callback) => {
|
|
145
|
+
// @ts-ignore
|
|
146
|
+
if (Array.prototype.flatMap) {
|
|
147
|
+
return arr.flatMap(callback);
|
|
148
|
+
}
|
|
149
|
+
const result = [];
|
|
150
|
+
for (let i = 0; i < arr.length; i++) {
|
|
151
|
+
const item = arr[i];
|
|
152
|
+
result.push(...callback(item, i, arr));
|
|
153
|
+
}
|
|
154
|
+
return result;
|
|
155
|
+
};
|
|
156
|
+
// eslint-disable-next-line no-redeclare
|
|
157
|
+
export function binarySearch(array, what, transform) {
|
|
158
|
+
// @ts-ignore
|
|
159
|
+
const applyTransform = transform !== null && transform !== void 0 ? transform : identity;
|
|
160
|
+
if (!array.length || what !== what) {
|
|
161
|
+
return {
|
|
162
|
+
index: -1,
|
|
163
|
+
exact: true,
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
return binarySearchFn(array, what, 0, array.length, applyTransform);
|
|
167
|
+
}
|
|
168
|
+
function binarySearchFn(array, what, from, to, transform) {
|
|
169
|
+
const center = shiftRight(from + to, 1);
|
|
170
|
+
const centerValue = transform(array[center]);
|
|
171
|
+
if (what === centerValue) {
|
|
172
|
+
return {
|
|
173
|
+
index: center,
|
|
174
|
+
exact: true,
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
if (from === center) {
|
|
179
|
+
return {
|
|
180
|
+
index: from,
|
|
181
|
+
exact: false,
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
if (what < centerValue) {
|
|
186
|
+
return binarySearchFn(array, what, from, center, transform);
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
return binarySearchFn(array, what, center, to, transform);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
export function lastOf(arr) {
|
|
195
|
+
if (arr && arr.length) {
|
|
196
|
+
return arr[arr.length - 1];
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
export function arrayRemove(element) {
|
|
200
|
+
const idx = this.indexOf(element);
|
|
201
|
+
if (idx !== -1) {
|
|
202
|
+
this.splice(idx, 1);
|
|
203
|
+
}
|
|
204
|
+
return this;
|
|
205
|
+
}
|
|
206
|
+
// ... and this is how a normal person would write "arrayRemove" function
|
|
207
|
+
export function arrayRemove2(array, element) {
|
|
208
|
+
if (!array) {
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
const idx = array.indexOf(element);
|
|
212
|
+
if (idx !== -1) {
|
|
213
|
+
array.splice(idx, 1);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
export function firstOf(arr) {
|
|
217
|
+
if (arr) {
|
|
218
|
+
return arr[0];
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
@param {Function} gather - get the comparing value from the array
|
|
223
|
+
*/
|
|
224
|
+
export function maxMin(gather) {
|
|
225
|
+
function reducer(a, b) {
|
|
226
|
+
const v = gather(b);
|
|
227
|
+
if (v === null || v === undefined || !isFinite(v)) {
|
|
228
|
+
return a;
|
|
229
|
+
}
|
|
230
|
+
else {
|
|
231
|
+
return [Math.max(a[0], v), Math.min(a[1], v)];
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
return function (arr) {
|
|
235
|
+
const defaultResult = [Number.NEGATIVE_INFINITY, Number.POSITIVE_INFINITY];
|
|
236
|
+
if (arr) {
|
|
237
|
+
return arr.reduce(reducer, defaultResult);
|
|
238
|
+
}
|
|
239
|
+
return defaultResult;
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
export function getElementsInRange(array, leftBound, rightBound, transform = () => 0) {
|
|
243
|
+
const upperIndex = (arr, bound) => {
|
|
244
|
+
let l = 0;
|
|
245
|
+
let h = arr.length - 1;
|
|
246
|
+
while (h >= l) {
|
|
247
|
+
const midIndex = Math.ceil((l + h) / 2);
|
|
248
|
+
const mid = transform(arr[midIndex]);
|
|
249
|
+
if (mid <= bound) {
|
|
250
|
+
l = midIndex + 1;
|
|
251
|
+
}
|
|
252
|
+
else {
|
|
253
|
+
h = midIndex - 1;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
return h;
|
|
257
|
+
};
|
|
258
|
+
const lowerIndex = (arr, bound) => {
|
|
259
|
+
let l = 0;
|
|
260
|
+
let h = arr.length - 1;
|
|
261
|
+
while (h >= l) {
|
|
262
|
+
const midIndex = Math.ceil((l + h) / 2);
|
|
263
|
+
const mid = transform(arr[midIndex]);
|
|
264
|
+
if (mid >= bound) {
|
|
265
|
+
h = midIndex - 1;
|
|
266
|
+
}
|
|
267
|
+
else {
|
|
268
|
+
l = midIndex + 1;
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
return l;
|
|
272
|
+
};
|
|
273
|
+
return array.slice(lowerIndex(array, leftBound), upperIndex(array, rightBound) + 1);
|
|
274
|
+
}
|
|
@@ -3,4 +3,42 @@
|
|
|
3
3
|
* This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
|
|
4
4
|
* If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
5
5
|
*/
|
|
6
|
-
|
|
6
|
+
/**
|
|
7
|
+
* Automatically detect period of candle source.
|
|
8
|
+
* Cannot just take first-second candles distance because of non-trading hours.
|
|
9
|
+
* Naive approach:
|
|
10
|
+
* 1. get all time distances between candles
|
|
11
|
+
* 2. the most frequent distance = period
|
|
12
|
+
* @param candles
|
|
13
|
+
* @doc-tags tricky,period
|
|
14
|
+
*/
|
|
15
|
+
export function autoDetectPeriod(candles) {
|
|
16
|
+
if (candles.length > 1) {
|
|
17
|
+
// simply get distance between two candles
|
|
18
|
+
const periodToCount = candles.reduce((acc, candle, idx) => {
|
|
19
|
+
if (idx !== candles.length - 1) {
|
|
20
|
+
const period = candles[idx + 1].timestamp - candle.timestamp;
|
|
21
|
+
if (acc[period]) {
|
|
22
|
+
acc[period]++;
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
acc[period] = 1;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return acc;
|
|
29
|
+
}, {});
|
|
30
|
+
let maxCount = 0;
|
|
31
|
+
let naivePeriod;
|
|
32
|
+
for (const _period of Object.keys(periodToCount)) {
|
|
33
|
+
const period = parseInt(_period, 10);
|
|
34
|
+
const count = periodToCount[period];
|
|
35
|
+
if (count > maxCount && period > 0) {
|
|
36
|
+
maxCount = count;
|
|
37
|
+
naivePeriod = period;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
if (naivePeriod) {
|
|
41
|
+
return naivePeriod;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
@@ -3,4 +3,23 @@
|
|
|
3
3
|
* This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
|
|
4
4
|
* If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
5
5
|
*/
|
|
6
|
-
import
|
|
6
|
+
import generateCandlesData from './candles-generator.utils.js';
|
|
7
|
+
/**
|
|
8
|
+
* Generated mock candles data.
|
|
9
|
+
*
|
|
10
|
+
* @param config
|
|
11
|
+
* quantity - avg number of candles
|
|
12
|
+
* startY - avg candle Y to start generation with
|
|
13
|
+
* avgCandleSize - avg size of candle
|
|
14
|
+
* avgTrendLength:
|
|
15
|
+
* sw - avg length of SIDEWAYS trend
|
|
16
|
+
* down - avg length of DOWN trend
|
|
17
|
+
* up - avg length of UP trend
|
|
18
|
+
* withVolume - add random volumes or not
|
|
19
|
+
* period - specify distance between candles (60 for 1m, 3600 for 1h, 84600 for 1d)
|
|
20
|
+
* @return Array<Candle>
|
|
21
|
+
* @doc-tags tricky
|
|
22
|
+
*/
|
|
23
|
+
export function generateCandlesDataTS(config) {
|
|
24
|
+
return generateCandlesData(config);
|
|
25
|
+
}
|
|
@@ -3,4 +3,164 @@
|
|
|
3
3
|
* This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
|
|
4
4
|
* If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
5
5
|
*/
|
|
6
|
-
|
|
6
|
+
/* eslint-disable */
|
|
7
|
+
'use strict';
|
|
8
|
+
export default function generateCandlesData(config) {
|
|
9
|
+
// default generation config
|
|
10
|
+
config = config || {};
|
|
11
|
+
config.quantity = config.quantity || 200;
|
|
12
|
+
config.startY = config.startY || 50;
|
|
13
|
+
config.avgCandleSize = config.avgCandleSize || 2;
|
|
14
|
+
config.avgTrendLength = config.avgTrendLength || {};
|
|
15
|
+
config.avgTrendLength.sw = config.avgTrendLength.sw || 10;
|
|
16
|
+
config.avgTrendLength.down = config.avgTrendLength.down || 10;
|
|
17
|
+
config.avgTrendLength.up = config.avgTrendLength.up || 10;
|
|
18
|
+
config.withVolume = config.withVolume === true || false;
|
|
19
|
+
config.period = config.period || 3600;
|
|
20
|
+
var result = [];
|
|
21
|
+
var quantity = config.quantity || 200;
|
|
22
|
+
var swTrendLength = 10;
|
|
23
|
+
var downTrendLength = 10;
|
|
24
|
+
var upTrendLength = 10;
|
|
25
|
+
if (config.avgTrendLength) {
|
|
26
|
+
swTrendLength = config.avgTrendLength.sw || 10;
|
|
27
|
+
downTrendLength = config.avgTrendLength.down || 10;
|
|
28
|
+
upTrendLength = config.avgTrendLength.up || 10;
|
|
29
|
+
}
|
|
30
|
+
var startY = config.startY || 50;
|
|
31
|
+
var candleAvgSize = config.avgCandleSize || 2;
|
|
32
|
+
// generate 1st candle
|
|
33
|
+
var from = startY - candleAvgSize;
|
|
34
|
+
var to = startY + candleAvgSize;
|
|
35
|
+
var entryCandle = generateRandomCandle(from, to, candleAvgSize);
|
|
36
|
+
result.push(entryCandle);
|
|
37
|
+
// generate UP, DOWN or SW trends until quantity is filled
|
|
38
|
+
while (result.length < quantity) {
|
|
39
|
+
var r = Math.random() * 10;
|
|
40
|
+
if (r > 6) {
|
|
41
|
+
result = result.concat(generateCandlesSideways(result[result.length - 1], candleAvgSize, swTrendLength));
|
|
42
|
+
}
|
|
43
|
+
else if (r > 3) {
|
|
44
|
+
result = result.concat(generateCandlesUp(result[result.length - 1], candleAvgSize, upTrendLength));
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
result = result.concat(generateCandlesDown(result[result.length - 1], candleAvgSize, downTrendLength));
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
result = result.slice(0, config.quantity);
|
|
51
|
+
// set candle timestamps
|
|
52
|
+
let time = Math.round(new Date().getTime() / 300000) * 300000;
|
|
53
|
+
time -= quantity * 1000 * config.period;
|
|
54
|
+
for (let i = 0; i < result.length; i++) {
|
|
55
|
+
const candle = result[i];
|
|
56
|
+
Object.assign(candle, {
|
|
57
|
+
timestamp: time,
|
|
58
|
+
isVisible: true,
|
|
59
|
+
});
|
|
60
|
+
time += 1000 * config.period;
|
|
61
|
+
if (config.withVolume) {
|
|
62
|
+
candle.volume = Math.ceil(Math.random() * 1000 + 200);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return result;
|
|
66
|
+
}
|
|
67
|
+
function generateRandomCandle(from, to, candleAvgSize, type) {
|
|
68
|
+
var open = Math.random() * (to - from) + from;
|
|
69
|
+
var close;
|
|
70
|
+
if ((type && type === 'bull') || (!type && Math.random() > 0.5)) {
|
|
71
|
+
var close1 = open + candleAvgSize;
|
|
72
|
+
close = close1 < to ? close1 : to;
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
var close2 = open - candleAvgSize;
|
|
76
|
+
close = close2 > from ? close2 : from;
|
|
77
|
+
}
|
|
78
|
+
var high = Math.max(open, close) + Math.random() * candleAvgSize * 0.2;
|
|
79
|
+
var low = Math.min(open, close) - Math.random() * candleAvgSize * 0.2;
|
|
80
|
+
return {
|
|
81
|
+
hi: high,
|
|
82
|
+
lo: low,
|
|
83
|
+
open: open,
|
|
84
|
+
close: close,
|
|
85
|
+
timestamp: 0,
|
|
86
|
+
volume: 0,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
function generateCandlesUp(entryCandle, candleAvgSize, trendLength) {
|
|
90
|
+
var result = [];
|
|
91
|
+
var randomTrendLength = Math.random() * trendLength + trendLength / 2;
|
|
92
|
+
var from = entryCandle.lo;
|
|
93
|
+
var to = entryCandle.hi + candleAvgSize * 1.2;
|
|
94
|
+
for (var i = 0; i < randomTrendLength; i++) {
|
|
95
|
+
var type = Math.random() > 0.9 ? 'bear' : 'bull';
|
|
96
|
+
var candle = generateRandomCandle(from, to, candleAvgSize, type);
|
|
97
|
+
from = candle.lo - candleAvgSize * (Math.random() * 0.1 + 0.1);
|
|
98
|
+
to = candle.hi + candleAvgSize * (Math.random() * 1.3 + 0.1);
|
|
99
|
+
// spike
|
|
100
|
+
if (Math.random() > 0.9) {
|
|
101
|
+
to = candle.hi + candleAvgSize;
|
|
102
|
+
}
|
|
103
|
+
result.push(candle);
|
|
104
|
+
}
|
|
105
|
+
return result;
|
|
106
|
+
}
|
|
107
|
+
function generateCandlesDown(entryCandle, candleAvgSize, trendLength) {
|
|
108
|
+
var result = [];
|
|
109
|
+
var randomTrendLength = Math.random() * trendLength + trendLength / 2;
|
|
110
|
+
var from = entryCandle.hi - candleAvgSize * 1.2;
|
|
111
|
+
var to = entryCandle.hi;
|
|
112
|
+
for (var i = 0; i < randomTrendLength; i++) {
|
|
113
|
+
var type = Math.random() < 0.9 ? 'bear' : 'bull';
|
|
114
|
+
var candle = generateRandomCandle(from, to, candleAvgSize, type);
|
|
115
|
+
from = candle.lo - candleAvgSize * (Math.random() * 0.3 + 0.1);
|
|
116
|
+
to = candle.hi - candleAvgSize * (Math.random() * 0.1 + 0.1);
|
|
117
|
+
// spike
|
|
118
|
+
if (Math.random() > 0.9) {
|
|
119
|
+
to = candle.lo - candleAvgSize;
|
|
120
|
+
}
|
|
121
|
+
result.push(candle);
|
|
122
|
+
}
|
|
123
|
+
return result;
|
|
124
|
+
}
|
|
125
|
+
function generateCandlesSideways(entryCandle, candleAvgSize, trendLength) {
|
|
126
|
+
var result = [];
|
|
127
|
+
var randomTrendLength = Math.random() * trendLength + trendLength / 2;
|
|
128
|
+
function nextFromTo(candle) {
|
|
129
|
+
var from;
|
|
130
|
+
var to;
|
|
131
|
+
if (Math.random() > 0.5) {
|
|
132
|
+
from = candle.lo - candleAvgSize * 0.2;
|
|
133
|
+
to = candle.hi + candleAvgSize * 1.2;
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
from = candle.lo - candleAvgSize * 1.2;
|
|
137
|
+
to = candle.hi + candleAvgSize * 0.2;
|
|
138
|
+
}
|
|
139
|
+
return {
|
|
140
|
+
from: from,
|
|
141
|
+
to: to,
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
var fromTo = nextFromTo(entryCandle);
|
|
145
|
+
var from = fromTo.from;
|
|
146
|
+
var to = fromTo.to;
|
|
147
|
+
for (var i = 0; i < randomTrendLength; i++) {
|
|
148
|
+
var type = Math.random() < 0.5 ? 'bear' : 'bull';
|
|
149
|
+
var candle = generateRandomCandle(from, to, candleAvgSize, type);
|
|
150
|
+
fromTo = nextFromTo(candle);
|
|
151
|
+
from = fromTo.from;
|
|
152
|
+
to = fromTo.to;
|
|
153
|
+
// spike
|
|
154
|
+
if (Math.random() > 0.9) {
|
|
155
|
+
if (Math.random() > 0.5) {
|
|
156
|
+
from = candle.lo - candleAvgSize;
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
to = candle.hi + candleAvgSize;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
result.push(candle);
|
|
163
|
+
}
|
|
164
|
+
return result;
|
|
165
|
+
}
|
|
166
|
+
window['DXChart'] = Object.assign(Object.assign({}, window['DXChart']), { generateCandlesData });
|
|
@@ -3,4 +3,45 @@
|
|
|
3
3
|
* This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
|
|
4
4
|
* If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
5
5
|
*/
|
|
6
|
-
import{binarySearch
|
|
6
|
+
import { binarySearch, firstOf, lastOf } from './array.utils';
|
|
7
|
+
import { floor } from './math.utils';
|
|
8
|
+
export const searchCandleIndex = (timestamp, shouldExtrapolate, candles, periodMs = 1000) => {
|
|
9
|
+
var _a, _b, _c, _d;
|
|
10
|
+
const firstTimestamp = (_b = (_a = firstOf(candles)) === null || _a === void 0 ? void 0 : _a.timestamp) !== null && _b !== void 0 ? _b : 0;
|
|
11
|
+
const lastTimestamp = (_d = (_c = lastOf(candles)) === null || _c === void 0 ? void 0 : _c.timestamp) !== null && _d !== void 0 ? _d : 0;
|
|
12
|
+
if (timestamp > lastTimestamp) {
|
|
13
|
+
// TODO rework the code below, it looks very very sus ( ≖.≖)
|
|
14
|
+
if (shouldExtrapolate) {
|
|
15
|
+
// div by 1000 because periodDuration is in seconds
|
|
16
|
+
return {
|
|
17
|
+
// -1 to skip fake candle and get the last existing/visible one if reached last index
|
|
18
|
+
index: candles.length - 1 + Math.ceil((timestamp - lastTimestamp) / periodMs),
|
|
19
|
+
exact: true,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
return {
|
|
24
|
+
// -1 to skip fake candle and get the last existing/visible one if reached last index
|
|
25
|
+
index: candles.length - 1,
|
|
26
|
+
exact: true,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
else if (timestamp < firstTimestamp) {
|
|
31
|
+
if (shouldExtrapolate) {
|
|
32
|
+
return {
|
|
33
|
+
index: floor((timestamp - firstTimestamp) / periodMs),
|
|
34
|
+
exact: true,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
return {
|
|
39
|
+
index: -1,
|
|
40
|
+
exact: true,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
return binarySearch(candles, timestamp, candle => candle.timestamp);
|
|
46
|
+
}
|
|
47
|
+
};
|