@oanda/labs-crowd-view-widget 1.0.43 → 1.0.44
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/CHANGELOG.md +180 -0
- package/dist/main/CrowdViewWidget/CrowdViewWidget.js +3 -3
- package/dist/main/CrowdViewWidget/CrowdViewWidget.js.map +1 -1
- package/dist/main/CrowdViewWidget/Main.js +8 -9
- package/dist/main/CrowdViewWidget/Main.js.map +1 -1
- package/dist/main/CrowdViewWidget/components/Chart/Chart.js +11 -8
- package/dist/main/CrowdViewWidget/components/Chart/Chart.js.map +1 -1
- package/dist/main/CrowdViewWidget/components/Chart/ChartWithData.js +16 -13
- package/dist/main/CrowdViewWidget/components/Chart/ChartWithData.js.map +1 -1
- package/dist/main/CrowdViewWidget/components/Chart/{getOption.js → chartOptions.js} +53 -51
- package/dist/main/CrowdViewWidget/components/Chart/chartOptions.js.map +1 -0
- package/dist/main/CrowdViewWidget/components/Chart/index.js +44 -0
- package/dist/main/CrowdViewWidget/components/Chart/index.js.map +1 -1
- package/dist/main/CrowdViewWidget/components/Chart/types.js.map +1 -1
- package/dist/main/CrowdViewWidget/components/Chart/useCrowdViewData.js +170 -0
- package/dist/main/CrowdViewWidget/components/Chart/useCrowdViewData.js.map +1 -0
- package/dist/main/CrowdViewWidget/components/Chart/utils/chartUtils.js +70 -0
- package/dist/main/CrowdViewWidget/components/Chart/utils/chartUtils.js.map +1 -0
- package/dist/main/CrowdViewWidget/components/Legend/Legend.js +3 -2
- package/dist/main/CrowdViewWidget/components/Legend/Legend.js.map +1 -1
- package/dist/main/CrowdViewWidget/components/Legend/LegendBar.js +9 -11
- package/dist/main/CrowdViewWidget/components/Legend/LegendBar.js.map +1 -1
- package/dist/main/CrowdViewWidget/constants.js +30 -0
- package/dist/main/CrowdViewWidget/constants.js.map +1 -0
- package/dist/main/CrowdViewWidget/render.js +1 -0
- package/dist/main/CrowdViewWidget/render.js.map +1 -1
- package/dist/main/CrowdViewWidget/selectConfig.js +121 -0
- package/dist/main/CrowdViewWidget/selectConfig.js.map +1 -0
- package/dist/main/CrowdViewWidget/types/index.js +17 -0
- package/dist/main/CrowdViewWidget/types/index.js.map +1 -0
- package/dist/main/CrowdViewWidget/types/instruments.js +45 -0
- package/dist/main/CrowdViewWidget/types/instruments.js.map +1 -0
- package/dist/main/CrowdViewWidget/types.js +0 -44
- package/dist/main/CrowdViewWidget/types.js.map +1 -1
- package/dist/main/CrowdViewWidget/utils/instrumentUtils.js +13 -0
- package/dist/main/CrowdViewWidget/utils/instrumentUtils.js.map +1 -0
- package/dist/main/gql/getOrderPositionBooks.js +1 -1
- package/dist/main/gql/getOrderPositionBooks.js.map +1 -1
- package/dist/main/gql/getPriceCandles.js +11 -0
- package/dist/main/gql/getPriceCandles.js.map +1 -0
- package/dist/main/gql/types/gql.js +2 -3
- package/dist/main/gql/types/gql.js.map +1 -1
- package/dist/main/gql/types/graphql.js +161 -160
- package/dist/main/gql/types/graphql.js.map +1 -1
- package/dist/module/CrowdViewWidget/CrowdViewWidget.js +3 -3
- package/dist/module/CrowdViewWidget/CrowdViewWidget.js.map +1 -1
- package/dist/module/CrowdViewWidget/Main.js +6 -7
- package/dist/module/CrowdViewWidget/Main.js.map +1 -1
- package/dist/module/CrowdViewWidget/components/Chart/Chart.js +9 -6
- package/dist/module/CrowdViewWidget/components/Chart/Chart.js.map +1 -1
- package/dist/module/CrowdViewWidget/components/Chart/ChartWithData.js +16 -12
- package/dist/module/CrowdViewWidget/components/Chart/ChartWithData.js.map +1 -1
- package/dist/module/CrowdViewWidget/components/Chart/{getOption.js → chartOptions.js} +51 -48
- package/dist/module/CrowdViewWidget/components/Chart/chartOptions.js.map +1 -0
- package/dist/module/CrowdViewWidget/components/Chart/index.js +4 -0
- package/dist/module/CrowdViewWidget/components/Chart/index.js.map +1 -1
- package/dist/module/CrowdViewWidget/components/Chart/types.js.map +1 -1
- package/dist/module/CrowdViewWidget/components/Chart/useCrowdViewData.js +163 -0
- package/dist/module/CrowdViewWidget/components/Chart/useCrowdViewData.js.map +1 -0
- package/dist/module/CrowdViewWidget/components/Chart/utils/chartUtils.js +59 -0
- package/dist/module/CrowdViewWidget/components/Chart/utils/chartUtils.js.map +1 -0
- package/dist/module/CrowdViewWidget/components/Legend/Legend.js +3 -2
- package/dist/module/CrowdViewWidget/components/Legend/Legend.js.map +1 -1
- package/dist/module/CrowdViewWidget/components/Legend/LegendBar.js +9 -11
- package/dist/module/CrowdViewWidget/components/Legend/LegendBar.js.map +1 -1
- package/dist/module/CrowdViewWidget/constants.js +24 -0
- package/dist/module/CrowdViewWidget/constants.js.map +1 -0
- package/dist/module/CrowdViewWidget/render.js +1 -0
- package/dist/module/CrowdViewWidget/render.js.map +1 -1
- package/dist/module/CrowdViewWidget/selectConfig.js +116 -0
- package/dist/module/CrowdViewWidget/selectConfig.js.map +1 -0
- package/dist/module/CrowdViewWidget/types/index.js +2 -0
- package/dist/module/CrowdViewWidget/types/index.js.map +1 -0
- package/dist/module/CrowdViewWidget/types/instruments.js +39 -0
- package/dist/module/CrowdViewWidget/types/instruments.js.map +1 -0
- package/dist/module/CrowdViewWidget/types.js +1 -43
- package/dist/module/CrowdViewWidget/types.js.map +1 -1
- package/dist/module/CrowdViewWidget/utils/instrumentUtils.js +6 -0
- package/dist/module/CrowdViewWidget/utils/instrumentUtils.js.map +1 -0
- package/dist/module/gql/getOrderPositionBooks.js +1 -1
- package/dist/module/gql/getOrderPositionBooks.js.map +1 -1
- package/dist/module/gql/getPriceCandles.js +6 -0
- package/dist/module/gql/getPriceCandles.js.map +1 -0
- package/dist/module/gql/types/gql.js +2 -3
- package/dist/module/gql/types/gql.js.map +1 -1
- package/dist/module/gql/types/graphql.js +160 -159
- package/dist/module/gql/types/graphql.js.map +1 -1
- package/dist/types/CrowdViewWidget/CrowdViewWidget.d.ts +1 -1
- package/dist/types/CrowdViewWidget/components/Chart/ChartWithData.d.ts +1 -1
- package/dist/types/CrowdViewWidget/components/Chart/index.d.ts +4 -0
- package/dist/types/CrowdViewWidget/components/Chart/types.d.ts +19 -16
- package/dist/types/CrowdViewWidget/components/Chart/useCrowdViewData.d.ts +2 -0
- package/dist/types/CrowdViewWidget/components/Chart/{utils.d.ts → utils/chartUtils.d.ts} +4 -11
- package/dist/types/CrowdViewWidget/components/Legend/Legend.d.ts +3 -3
- package/dist/types/CrowdViewWidget/constants.d.ts +23 -0
- package/dist/types/CrowdViewWidget/selectConfig.d.ts +19 -0
- package/dist/types/CrowdViewWidget/types/index.d.ts +1 -0
- package/dist/types/CrowdViewWidget/types/instruments.d.ts +36 -0
- package/dist/types/CrowdViewWidget/types.d.ts +2 -50
- package/dist/types/CrowdViewWidget/utils/instrumentUtils.d.ts +8 -0
- package/dist/types/gql/types/gql.d.ts +10 -14
- package/dist/types/gql/types/graphql.d.ts +71 -63
- package/package.json +6 -4
- package/src/CrowdViewWidget/CrowdViewWidget.tsx +2 -2
- package/src/CrowdViewWidget/Main.tsx +10 -16
- package/src/CrowdViewWidget/components/Chart/Chart.tsx +15 -5
- package/src/CrowdViewWidget/components/Chart/ChartWithData.tsx +12 -12
- package/src/CrowdViewWidget/components/Chart/{getOption.ts → chartOptions.ts} +51 -70
- package/src/CrowdViewWidget/components/Chart/index.ts +4 -0
- package/src/CrowdViewWidget/components/Chart/types.ts +25 -23
- package/src/CrowdViewWidget/components/Chart/useCrowdViewData.ts +263 -0
- package/src/CrowdViewWidget/components/Chart/utils/chartUtils.ts +93 -0
- package/src/CrowdViewWidget/components/Legend/Legend.tsx +7 -3
- package/src/CrowdViewWidget/components/Legend/LegendBar.tsx +16 -20
- package/src/CrowdViewWidget/constants.ts +27 -0
- package/src/CrowdViewWidget/render.tsx +1 -0
- package/src/CrowdViewWidget/{config.ts → selectConfig.ts} +65 -43
- package/src/CrowdViewWidget/types/index.ts +1 -0
- package/src/CrowdViewWidget/types/instruments.ts +37 -0
- package/src/CrowdViewWidget/types.ts +4 -55
- package/src/CrowdViewWidget/utils/instrumentUtils.ts +11 -0
- package/src/gql/getOrderPositionBooks.ts +9 -4
- package/src/gql/{mock/getPriceCandles.ts → getPriceCandles.ts} +5 -5
- package/src/gql/types/gql.ts +6 -14
- package/src/gql/types/graphql.ts +170 -160
- package/test/Main.test.tsx +1 -1
- package/test/components/Legend.test.tsx +3 -6
- package/test/components/LegendBar.test.tsx +7 -8
- package/test/utils/instrumentUtils.test.ts +52 -0
- package/dist/main/CrowdViewWidget/components/Chart/constants.js +0 -14
- package/dist/main/CrowdViewWidget/components/Chart/constants.js.map +0 -1
- package/dist/main/CrowdViewWidget/components/Chart/getOption.js.map +0 -1
- package/dist/main/CrowdViewWidget/components/Chart/getOrderPositionDataMock.js +0 -47
- package/dist/main/CrowdViewWidget/components/Chart/getOrderPositionDataMock.js.map +0 -1
- package/dist/main/CrowdViewWidget/components/Chart/getPriceCandlesMock.js +0 -36
- package/dist/main/CrowdViewWidget/components/Chart/getPriceCandlesMock.js.map +0 -1
- package/dist/main/CrowdViewWidget/components/Chart/utils.js +0 -166
- package/dist/main/CrowdViewWidget/components/Chart/utils.js.map +0 -1
- package/dist/main/CrowdViewWidget/config.js +0 -107
- package/dist/main/CrowdViewWidget/config.js.map +0 -1
- package/dist/main/gql/mock/getPriceCandles.js +0 -11
- package/dist/main/gql/mock/getPriceCandles.js.map +0 -1
- package/dist/main/gql/mock/schema.graphqls +0 -62
- package/dist/main/gql/validateInstruments.js +0 -11
- package/dist/main/gql/validateInstruments.js.map +0 -1
- package/dist/module/CrowdViewWidget/components/Chart/constants.js +0 -8
- package/dist/module/CrowdViewWidget/components/Chart/constants.js.map +0 -1
- package/dist/module/CrowdViewWidget/components/Chart/getOption.js.map +0 -1
- package/dist/module/CrowdViewWidget/components/Chart/getOrderPositionDataMock.js +0 -40
- package/dist/module/CrowdViewWidget/components/Chart/getOrderPositionDataMock.js.map +0 -1
- package/dist/module/CrowdViewWidget/components/Chart/getPriceCandlesMock.js +0 -29
- package/dist/module/CrowdViewWidget/components/Chart/getPriceCandlesMock.js.map +0 -1
- package/dist/module/CrowdViewWidget/components/Chart/utils.js +0 -156
- package/dist/module/CrowdViewWidget/components/Chart/utils.js.map +0 -1
- package/dist/module/CrowdViewWidget/config.js +0 -102
- package/dist/module/CrowdViewWidget/config.js.map +0 -1
- package/dist/module/gql/mock/getPriceCandles.js +0 -6
- package/dist/module/gql/mock/getPriceCandles.js.map +0 -1
- package/dist/module/gql/mock/schema.graphqls +0 -62
- package/dist/module/gql/validateInstruments.js +0 -5
- package/dist/module/gql/validateInstruments.js.map +0 -1
- package/dist/types/CrowdViewWidget/components/Chart/constants.d.ts +0 -7
- package/dist/types/CrowdViewWidget/components/Chart/getOrderPositionDataMock.d.ts +0 -14
- package/dist/types/CrowdViewWidget/components/Chart/getPriceCandlesMock.d.ts +0 -2
- package/dist/types/CrowdViewWidget/config.d.ts +0 -22
- package/dist/types/gql/validateInstruments.d.ts +0 -1
- package/src/CrowdViewWidget/components/Chart/constants.tsx +0 -8
- package/src/CrowdViewWidget/components/Chart/getOrderPositionDataMock.ts +0 -66
- package/src/CrowdViewWidget/components/Chart/getPriceCandlesMock.ts +0 -43
- package/src/CrowdViewWidget/components/Chart/utils.ts +0 -191
- package/src/gql/mock/schema.graphqls +0 -62
- package/src/gql/validateInstruments.ts +0 -10
- /package/dist/types/CrowdViewWidget/components/Chart/{getOption.d.ts → chartOptions.d.ts} +0 -0
- /package/dist/types/gql/{mock/getPriceCandles.d.ts → getPriceCandles.d.ts} +0 -0
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import chroma from 'chroma-js';
|
|
2
|
+
|
|
3
|
+
import { Granularity, TimeSpan } from '../../../../gql/types/graphql';
|
|
4
|
+
import {
|
|
5
|
+
BOOKS_THRESHOLDS,
|
|
6
|
+
CHART_CONFIG,
|
|
7
|
+
COLOR_MAP,
|
|
8
|
+
TIME_THRESHOLDS,
|
|
9
|
+
} from '../../../constants';
|
|
10
|
+
import type { GetLabelsDataProps } from '../types';
|
|
11
|
+
|
|
12
|
+
export const getLabelData = ({
|
|
13
|
+
xAxisData,
|
|
14
|
+
isGreaterThanTwoWeeks,
|
|
15
|
+
}: GetLabelsDataProps) =>
|
|
16
|
+
xAxisData
|
|
17
|
+
.filter((record, index, arr) => {
|
|
18
|
+
if (index === 0) {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
const previousTimestamp = arr[index - 1];
|
|
22
|
+
const currentDate = new Date(record);
|
|
23
|
+
const previousDate = new Date(previousTimestamp);
|
|
24
|
+
|
|
25
|
+
return isGreaterThanTwoWeeks
|
|
26
|
+
? currentDate.getDate() !== previousDate.getDate()
|
|
27
|
+
: currentDate.getMonth() !== previousDate.getMonth();
|
|
28
|
+
})
|
|
29
|
+
.map((item) => ({
|
|
30
|
+
name: new Date(item).toLocaleDateString(undefined, {
|
|
31
|
+
month: 'short',
|
|
32
|
+
day: isGreaterThanTwoWeeks ? 'numeric' : undefined,
|
|
33
|
+
}),
|
|
34
|
+
xAxis: item,
|
|
35
|
+
y: CHART_CONFIG.HEIGHT - 22,
|
|
36
|
+
silent: true,
|
|
37
|
+
emphasis: {
|
|
38
|
+
disabled: true,
|
|
39
|
+
},
|
|
40
|
+
label: {
|
|
41
|
+
fontFamily: 'Sofia W03',
|
|
42
|
+
fontSize: 10,
|
|
43
|
+
position: 'bottom',
|
|
44
|
+
align: 'center',
|
|
45
|
+
formatter: '{b}',
|
|
46
|
+
},
|
|
47
|
+
}));
|
|
48
|
+
|
|
49
|
+
export const isDifferenceGreaterThanTwoWeeks = (
|
|
50
|
+
startDate: string,
|
|
51
|
+
endDate: string
|
|
52
|
+
) => {
|
|
53
|
+
const date1 = new Date(startDate);
|
|
54
|
+
const date2 = new Date(endDate);
|
|
55
|
+
|
|
56
|
+
const differenceInMs = Math.abs(date2.getTime() - date1.getTime());
|
|
57
|
+
|
|
58
|
+
return differenceInMs < TIME_THRESHOLDS.TWO_WEEKS_MS;
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
export const getTimeSpanForGranularity = (
|
|
62
|
+
granularity: Granularity
|
|
63
|
+
): TimeSpan => {
|
|
64
|
+
const granularityTimeSpanMap: Record<Granularity, TimeSpan> = {
|
|
65
|
+
[Granularity.M5]: TimeSpan.TwoDays,
|
|
66
|
+
[Granularity.M15]: TimeSpan.FiveDays,
|
|
67
|
+
[Granularity.H1]: TimeSpan.TwentyDays,
|
|
68
|
+
[Granularity.H4]: TimeSpan.NinetyDays,
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
return granularityTimeSpanMap[granularity] || TimeSpan.TwoDays;
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
const getGradientColor = (
|
|
75
|
+
value: number,
|
|
76
|
+
startColor: string,
|
|
77
|
+
targetColor: string
|
|
78
|
+
): string => {
|
|
79
|
+
const startThreshold = BOOKS_THRESHOLDS.MIN;
|
|
80
|
+
const endThreshold = BOOKS_THRESHOLDS.MAX;
|
|
81
|
+
|
|
82
|
+
const colorScale = chroma
|
|
83
|
+
.scale([startColor, targetColor])
|
|
84
|
+
.domain([startThreshold, endThreshold])
|
|
85
|
+
.mode('rgb');
|
|
86
|
+
|
|
87
|
+
return colorScale(value).hex();
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
export const getRectColor = (sentiment: number) =>
|
|
91
|
+
sentiment < 0
|
|
92
|
+
? getGradientColor(sentiment * -1, COLOR_MAP.short[0], COLOR_MAP.short[1])
|
|
93
|
+
: getGradientColor(sentiment, COLOR_MAP.long[0], COLOR_MAP.long[1]);
|
|
@@ -1,14 +1,18 @@
|
|
|
1
1
|
import { useLocale } from '@oanda/mono-i18n';
|
|
2
2
|
import React from 'react';
|
|
3
3
|
|
|
4
|
+
import { BOOKS_THRESHOLDS } from '../../constants';
|
|
4
5
|
import { LegendBar } from './LegendBar';
|
|
5
6
|
|
|
6
7
|
interface LegendProps {
|
|
7
|
-
longValues
|
|
8
|
-
shortValues
|
|
8
|
+
longValues?: [number, number];
|
|
9
|
+
shortValues?: [number, number];
|
|
9
10
|
}
|
|
10
11
|
|
|
11
|
-
export const Legend = ({
|
|
12
|
+
export const Legend = ({
|
|
13
|
+
longValues = [BOOKS_THRESHOLDS.MIN, BOOKS_THRESHOLDS.MAX],
|
|
14
|
+
shortValues = [BOOKS_THRESHOLDS.MIN, BOOKS_THRESHOLDS.MAX],
|
|
15
|
+
}: LegendProps) => {
|
|
12
16
|
const { lang } = useLocale();
|
|
13
17
|
|
|
14
18
|
return (
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
|
|
3
|
-
import {
|
|
3
|
+
import { COLOR_MAP } from '../../constants';
|
|
4
4
|
|
|
5
5
|
export type LegendType = 'long' | 'short';
|
|
6
6
|
|
|
@@ -11,31 +11,27 @@ interface LegendBarProps {
|
|
|
11
11
|
}
|
|
12
12
|
|
|
13
13
|
export const LegendBar = ({ values, type, label }: LegendBarProps) => {
|
|
14
|
-
const colors =
|
|
14
|
+
const colors = COLOR_MAP[type];
|
|
15
15
|
|
|
16
16
|
return (
|
|
17
17
|
<div className="lw-flex lw-w-full lw-flex-col lw-space-y-1 lw-border-border-primary">
|
|
18
18
|
<div className="lw-flex lw-h-2 lw-w-full lw-overflow-hidden lw-border lw-border-border-primary">
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
}}
|
|
27
|
-
/>
|
|
28
|
-
))}
|
|
19
|
+
<div
|
|
20
|
+
className="lw-h-full lw-flex-1"
|
|
21
|
+
data-testid="legend-bar-segment"
|
|
22
|
+
style={{
|
|
23
|
+
background: `linear-gradient(90deg,${colors[0]} 0%, ${colors[1]} 100%)`,
|
|
24
|
+
}}
|
|
25
|
+
/>
|
|
29
26
|
</div>
|
|
30
27
|
|
|
31
|
-
<div className="lw-flex lw-w-full">
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
))}
|
|
28
|
+
<div className="lw-flex lw-w-full lw-justify-between">
|
|
29
|
+
<span className="lw-whitespace-nowrap lw-font-sans lw-text-xs lw-text-text-primary">
|
|
30
|
+
{values[0].toFixed(2)}% {label}
|
|
31
|
+
</span>
|
|
32
|
+
<span className="lw-whitespace-nowrap lw-font-sans lw-text-xs lw-text-text-primary">
|
|
33
|
+
{values[1].toFixed(2)}% {label}
|
|
34
|
+
</span>
|
|
39
35
|
</div>
|
|
40
36
|
</div>
|
|
41
37
|
);
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export const BOOKS_THRESHOLDS = {
|
|
2
|
+
MIN: 0.15,
|
|
3
|
+
MAX: 0.55,
|
|
4
|
+
} as const;
|
|
5
|
+
|
|
6
|
+
export const BUCKET_CONFIG = {
|
|
7
|
+
DEFAULT_WIDTH: 0.0005,
|
|
8
|
+
PRICE_PADDING_MULTIPLIER: 2,
|
|
9
|
+
} as const;
|
|
10
|
+
|
|
11
|
+
export const TIME_THRESHOLDS = {
|
|
12
|
+
TWO_WEEKS_MS: 14 * 24 * 60 * 60 * 1000,
|
|
13
|
+
} as const;
|
|
14
|
+
|
|
15
|
+
export const CHART_CONFIG = {
|
|
16
|
+
HEIGHT: 425,
|
|
17
|
+
WIDTH: 9999,
|
|
18
|
+
X_LABEL_SIZE: 40,
|
|
19
|
+
Y_LABEL_SIZE_DESKTOP: 60,
|
|
20
|
+
INITIAL_START_ZOOM: 80,
|
|
21
|
+
INITIAL_END_ZOOM: 100,
|
|
22
|
+
} as const;
|
|
23
|
+
|
|
24
|
+
export const COLOR_MAP = {
|
|
25
|
+
long: ['#ffffff', '#fdb833'],
|
|
26
|
+
short: ['#ffffff', '#0096c7'],
|
|
27
|
+
} as const;
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import { BookType } from '../gql/types/graphql';
|
|
2
|
-
import
|
|
3
|
-
import { GranularityId, InstrumentId } from './types';
|
|
1
|
+
import { BookType, Granularity } from '../gql/types/graphql';
|
|
2
|
+
import { InstrumentId, InstrumentIdOC } from './types/instruments';
|
|
4
3
|
|
|
5
4
|
const navigationConfig = [
|
|
6
5
|
{
|
|
@@ -14,6 +13,65 @@ const navigationConfig = [
|
|
|
14
13
|
];
|
|
15
14
|
|
|
16
15
|
const instrumentSelectConfigOC = [
|
|
16
|
+
{
|
|
17
|
+
id: InstrumentIdOC.EUR_AUD,
|
|
18
|
+
label: 'EUR/AUD',
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
id: InstrumentIdOC.EUR_GBP,
|
|
22
|
+
label: 'EUR/GBP',
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
id: InstrumentIdOC.EUR_JPY,
|
|
26
|
+
label: 'EUR/JPY',
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
id: InstrumentIdOC.EUR_USD,
|
|
30
|
+
label: 'EUR/USD',
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
id: InstrumentIdOC.EUR_CHF,
|
|
34
|
+
label: 'EUR/CHF',
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
id: InstrumentIdOC.USD_CHF,
|
|
38
|
+
label: 'USD/CHF',
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
id: InstrumentIdOC.USD_JPY,
|
|
42
|
+
label: 'USD/JPY',
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
id: InstrumentIdOC.USD_CAD,
|
|
46
|
+
label: 'USD/CAD',
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
id: InstrumentIdOC.GBP_USD,
|
|
50
|
+
label: 'GBP/USD',
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
id: InstrumentIdOC.GBP_JPY,
|
|
54
|
+
label: 'GBP/JPY',
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
id: InstrumentIdOC.GBP_CHF,
|
|
58
|
+
label: 'GBP/CHF',
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
id: InstrumentIdOC.AUD_JPY,
|
|
62
|
+
label: 'AUD/JPY',
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
id: InstrumentIdOC.AUD_USD,
|
|
66
|
+
label: 'AUD/USD',
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
id: InstrumentIdOC.NZD_USD,
|
|
70
|
+
label: 'NZD/USD',
|
|
71
|
+
},
|
|
72
|
+
];
|
|
73
|
+
|
|
74
|
+
const instrumentSelectConfig = [
|
|
17
75
|
{
|
|
18
76
|
id: InstrumentId.EUR_AUD,
|
|
19
77
|
label: 'EUR/AUD',
|
|
@@ -70,10 +128,6 @@ const instrumentSelectConfigOC = [
|
|
|
70
128
|
id: InstrumentId.NZD_USD,
|
|
71
129
|
label: 'NZD/USD',
|
|
72
130
|
},
|
|
73
|
-
];
|
|
74
|
-
|
|
75
|
-
const instrumentSelectConfig = [
|
|
76
|
-
...instrumentSelectConfigOC,
|
|
77
131
|
{
|
|
78
132
|
id: InstrumentId.XAU_USD,
|
|
79
133
|
label: 'XAU/USD',
|
|
@@ -84,60 +138,28 @@ const instrumentSelectConfig = [
|
|
|
84
138
|
},
|
|
85
139
|
];
|
|
86
140
|
|
|
87
|
-
const instrumentPrecisionConfig: Record<InstrumentId, number> = {
|
|
88
|
-
[InstrumentId.EUR_AUD]: 5,
|
|
89
|
-
[InstrumentId.EUR_GBP]: 5,
|
|
90
|
-
[InstrumentId.EUR_JPY]: 3,
|
|
91
|
-
[InstrumentId.EUR_USD]: 5,
|
|
92
|
-
[InstrumentId.EUR_CHF]: 5,
|
|
93
|
-
[InstrumentId.USD_CHF]: 5,
|
|
94
|
-
[InstrumentId.USD_JPY]: 3,
|
|
95
|
-
[InstrumentId.USD_CAD]: 5,
|
|
96
|
-
[InstrumentId.GBP_USD]: 5,
|
|
97
|
-
[InstrumentId.GBP_JPY]: 3,
|
|
98
|
-
[InstrumentId.GBP_CHF]: 5,
|
|
99
|
-
[InstrumentId.AUD_JPY]: 3,
|
|
100
|
-
[InstrumentId.AUD_USD]: 5,
|
|
101
|
-
[InstrumentId.NZD_USD]: 5,
|
|
102
|
-
[InstrumentId.XAU_USD]: 3,
|
|
103
|
-
[InstrumentId.XAG_USD]: 5,
|
|
104
|
-
};
|
|
105
|
-
|
|
106
141
|
const granularitySelectConfig = [
|
|
107
142
|
{
|
|
108
|
-
id:
|
|
143
|
+
id: Granularity.M5,
|
|
109
144
|
label: '5_minutes',
|
|
110
145
|
},
|
|
111
146
|
{
|
|
112
|
-
id:
|
|
147
|
+
id: Granularity.M15,
|
|
113
148
|
label: '15_minutes',
|
|
114
149
|
},
|
|
115
150
|
{
|
|
116
|
-
id:
|
|
117
|
-
label: '30_minutes',
|
|
118
|
-
},
|
|
119
|
-
{
|
|
120
|
-
id: GranularityId.HOUR_1,
|
|
151
|
+
id: Granularity.H1,
|
|
121
152
|
label: '1_hour',
|
|
122
153
|
},
|
|
123
154
|
{
|
|
124
|
-
id:
|
|
155
|
+
id: Granularity.H4,
|
|
125
156
|
label: '4_hours',
|
|
126
157
|
},
|
|
127
|
-
{
|
|
128
|
-
id: GranularityId.DAY_1,
|
|
129
|
-
label: '1_day',
|
|
130
|
-
},
|
|
131
158
|
];
|
|
132
159
|
|
|
133
160
|
export {
|
|
134
161
|
granularitySelectConfig,
|
|
135
|
-
instrumentPrecisionConfig,
|
|
136
162
|
instrumentSelectConfig,
|
|
137
163
|
instrumentSelectConfigOC,
|
|
138
164
|
navigationConfig,
|
|
139
165
|
};
|
|
140
|
-
export const colorMap: Record<LegendType, string[]> = {
|
|
141
|
-
long: ['#00857333', '#00715F99', '#00857399', '#008573CC'],
|
|
142
|
-
short: ['#DA632566', '#DA632599', '#DA6325CC', '#DA6325'],
|
|
143
|
-
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './instruments';
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export enum InstrumentId {
|
|
2
|
+
EUR_AUD = 'EURAUD',
|
|
3
|
+
EUR_GBP = 'EURGBP',
|
|
4
|
+
EUR_JPY = 'EURJPY',
|
|
5
|
+
EUR_USD = 'EURUSD',
|
|
6
|
+
EUR_CHF = 'EURCHF',
|
|
7
|
+
USD_CHF = 'USDCHF',
|
|
8
|
+
USD_JPY = 'USDJPY',
|
|
9
|
+
USD_CAD = 'USDCAD',
|
|
10
|
+
GBP_USD = 'GBPUSD',
|
|
11
|
+
GBP_JPY = 'GBPJPY',
|
|
12
|
+
GBP_CHF = 'GBPCHF',
|
|
13
|
+
AUD_JPY = 'AUDJPY',
|
|
14
|
+
AUD_USD = 'AUDUSD',
|
|
15
|
+
NZD_USD = 'NZDUSD',
|
|
16
|
+
XAU_USD = 'XAUUSD',
|
|
17
|
+
XAG_USD = 'XAGUSD',
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export enum InstrumentIdOC {
|
|
21
|
+
EUR_AUD = 'EUR_AUD',
|
|
22
|
+
EUR_GBP = 'EUR_GBP',
|
|
23
|
+
EUR_JPY = 'EUR_JPY',
|
|
24
|
+
EUR_USD = 'EUR_USD',
|
|
25
|
+
EUR_CHF = 'EUR_CHF',
|
|
26
|
+
USD_CHF = 'USD_CHF',
|
|
27
|
+
USD_JPY = 'USD_JPY',
|
|
28
|
+
USD_CAD = 'USD_CAD',
|
|
29
|
+
GBP_USD = 'GBP_USD',
|
|
30
|
+
GBP_JPY = 'GBP_JPY',
|
|
31
|
+
GBP_CHF = 'GBP_CHF',
|
|
32
|
+
AUD_JPY = 'AUD_JPY',
|
|
33
|
+
AUD_USD = 'AUD_USD',
|
|
34
|
+
NZD_USD = 'NZD_USD',
|
|
35
|
+
XAU_USD = 'XAU_USD',
|
|
36
|
+
XAG_USD = 'XAG_USD',
|
|
37
|
+
}
|
|
@@ -1,64 +1,13 @@
|
|
|
1
1
|
import type { WidgetConfig } from '@oanda/labs-widget-common';
|
|
2
2
|
|
|
3
3
|
import type { Division } from '../gql/types/graphql';
|
|
4
|
+
import type { InstrumentId } from './types/instruments';
|
|
4
5
|
|
|
5
|
-
export interface CrowdViewConfig extends WidgetConfig {
|
|
6
|
+
export interface CrowdViewConfig extends WidgetConfig {
|
|
7
|
+
division: Division;
|
|
8
|
+
}
|
|
6
9
|
|
|
7
10
|
export interface MainProps {
|
|
8
11
|
instrument?: InstrumentId;
|
|
9
12
|
division: Division;
|
|
10
13
|
}
|
|
11
|
-
|
|
12
|
-
export enum InstrumentId {
|
|
13
|
-
EUR_AUD = 'EURAUD',
|
|
14
|
-
EUR_GBP = 'EURGBP',
|
|
15
|
-
EUR_JPY = 'EURJPY',
|
|
16
|
-
EUR_USD = 'EURUSD',
|
|
17
|
-
EUR_CHF = 'EURCHF',
|
|
18
|
-
USD_CHF = 'USDCHF',
|
|
19
|
-
USD_JPY = 'USDJPY',
|
|
20
|
-
USD_CAD = 'USDCAD',
|
|
21
|
-
GBP_USD = 'GBPUSD',
|
|
22
|
-
GBP_JPY = 'GBPJPY',
|
|
23
|
-
GBP_CHF = 'GBPCHF',
|
|
24
|
-
AUD_JPY = 'AUDJPY',
|
|
25
|
-
AUD_USD = 'AUDUSD',
|
|
26
|
-
NZD_USD = 'NZDUSD',
|
|
27
|
-
XAU_USD = 'XAUUSD',
|
|
28
|
-
XAG_USD = 'XAGUSD',
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
export enum GranularityId {
|
|
32
|
-
MINUTE_5 = 'MINUTE_5',
|
|
33
|
-
MINUTE_15 = 'MINUTE_15',
|
|
34
|
-
MINUTE_30 = 'MINUTE_30',
|
|
35
|
-
HOUR_1 = 'HOUR_1',
|
|
36
|
-
HOUR_4 = 'HOUR_4',
|
|
37
|
-
DAY_1 = 'DAY_1',
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
export enum TimeSpanId {
|
|
41
|
-
HOUR_1 = 'HOUR_1',
|
|
42
|
-
HOUR_12 = 'HOUR_12',
|
|
43
|
-
DAY_1 = 'DAY_1',
|
|
44
|
-
DAY_2 = 'DAY_2',
|
|
45
|
-
WEEK_1 = 'WEEK_1',
|
|
46
|
-
WEEK_2 = 'WEEK_2',
|
|
47
|
-
WEEK_3 = 'WEEK_3',
|
|
48
|
-
MONTH_1 = 'MONTH_1',
|
|
49
|
-
MONTH_3 = 'MONTH_3',
|
|
50
|
-
MONTH_6 = 'MONTH_6',
|
|
51
|
-
YEAR_1 = 'YEAR_1',
|
|
52
|
-
YEAR_5 = 'YEAR_5',
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
export interface OrdersPositionsData {
|
|
56
|
-
price: number;
|
|
57
|
-
buckets: {
|
|
58
|
-
price: number;
|
|
59
|
-
longCountPercent: number;
|
|
60
|
-
shortCountPercent: number;
|
|
61
|
-
}[];
|
|
62
|
-
bucketWidth: number;
|
|
63
|
-
timestamp: number;
|
|
64
|
-
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Division } from '../../gql/types/graphql';
|
|
2
|
+
import {
|
|
3
|
+
instrumentSelectConfig,
|
|
4
|
+
instrumentSelectConfigOC,
|
|
5
|
+
} from '../selectConfig';
|
|
6
|
+
|
|
7
|
+
export const getInstrumentConfigForDivision = (division: Division) => {
|
|
8
|
+
return division === Division.Oc
|
|
9
|
+
? instrumentSelectConfigOC
|
|
10
|
+
: instrumentSelectConfig;
|
|
11
|
+
};
|
|
@@ -4,20 +4,25 @@ const getOrderPositionBooks = gql`
|
|
|
4
4
|
query GetOrderPositionBooks(
|
|
5
5
|
$instrument: String!
|
|
6
6
|
$bookType: BookType!
|
|
7
|
-
$
|
|
7
|
+
$timeSpan: TimeSpan!
|
|
8
|
+
$granularity: Granularity!
|
|
9
|
+
$maxBookPrice: Float
|
|
10
|
+
$minBookPrice: Float
|
|
8
11
|
) {
|
|
9
12
|
orderPositionBooks(
|
|
10
13
|
instrument: $instrument
|
|
11
14
|
bookType: $bookType
|
|
12
|
-
|
|
15
|
+
timeSpan: $timeSpan
|
|
16
|
+
granularity: $granularity
|
|
17
|
+
maxBookPrice: $maxBookPrice
|
|
18
|
+
minBookPrice: $minBookPrice
|
|
13
19
|
) {
|
|
14
20
|
bucketWidth
|
|
15
21
|
price
|
|
16
22
|
time
|
|
17
23
|
buckets {
|
|
18
24
|
price
|
|
19
|
-
|
|
20
|
-
shortCountPercent
|
|
25
|
+
sentiment
|
|
21
26
|
}
|
|
22
27
|
}
|
|
23
28
|
}
|
|
@@ -2,26 +2,26 @@ import { gql } from '@apollo/client';
|
|
|
2
2
|
|
|
3
3
|
const getPriceCandles = gql`
|
|
4
4
|
query GetPriceCandles(
|
|
5
|
-
$
|
|
5
|
+
$dataSource: DataSource!
|
|
6
|
+
$division: Division!
|
|
6
7
|
$instrument: String!
|
|
7
8
|
$granularity: Granularity!
|
|
8
9
|
$timeSpan: TimeSpan!
|
|
9
10
|
) {
|
|
10
|
-
|
|
11
|
+
priceCandles(
|
|
12
|
+
dataSource: $dataSource
|
|
11
13
|
division: $division
|
|
12
14
|
instrument: $instrument
|
|
13
15
|
granularity: $granularity
|
|
14
16
|
timeSpan: $timeSpan
|
|
15
17
|
) {
|
|
16
|
-
time
|
|
17
|
-
unixTime
|
|
18
18
|
candle {
|
|
19
|
+
point
|
|
19
20
|
high
|
|
20
21
|
low
|
|
21
22
|
open
|
|
22
23
|
close
|
|
23
24
|
}
|
|
24
|
-
timeSpan
|
|
25
25
|
}
|
|
26
26
|
}
|
|
27
27
|
`;
|
package/src/gql/types/gql.ts
CHANGED
|
@@ -13,12 +13,10 @@ import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/
|
|
|
13
13
|
* Therefore it is highly recommended to use the babel or swc plugin for production.
|
|
14
14
|
*/
|
|
15
15
|
const documents = {
|
|
16
|
-
'\n query GetOrderPositionBooks(\n $instrument: String!\n $bookType: BookType!\n $
|
|
16
|
+
'\n query GetOrderPositionBooks(\n $instrument: String!\n $bookType: BookType!\n $timeSpan: TimeSpan!\n $granularity: Granularity!\n $maxBookPrice: Float\n $minBookPrice: Float\n ) {\n orderPositionBooks(\n instrument: $instrument\n bookType: $bookType\n timeSpan: $timeSpan\n granularity: $granularity\n maxBookPrice: $maxBookPrice\n minBookPrice: $minBookPrice\n ) {\n bucketWidth\n price\n time\n buckets {\n price\n sentiment\n }\n }\n }\n':
|
|
17
17
|
types.GetOrderPositionBooksDocument,
|
|
18
|
-
'\n query GetPriceCandles(\n $division: Division
|
|
18
|
+
'\n query GetPriceCandles(\n $dataSource: DataSource!\n $division: Division!\n $instrument: String!\n $granularity: Granularity!\n $timeSpan: TimeSpan!\n ) {\n priceCandles(\n dataSource: $dataSource\n division: $division\n instrument: $instrument\n granularity: $granularity\n timeSpan: $timeSpan\n ) {\n candle {\n point\n high\n low\n open\n close\n }\n }\n }\n':
|
|
19
19
|
types.GetPriceCandlesDocument,
|
|
20
|
-
'\n query validateInstruments($instruments: [String]!, $division: Division) {\n mapInstrumentNames(instruments: $instruments, division: $division) {\n name\n displayName\n }\n }\n':
|
|
21
|
-
types.ValidateInstrumentsDocument,
|
|
22
20
|
};
|
|
23
21
|
|
|
24
22
|
/**
|
|
@@ -39,20 +37,14 @@ export function graphql(source: string): unknown;
|
|
|
39
37
|
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
|
|
40
38
|
*/
|
|
41
39
|
export function graphql(
|
|
42
|
-
source: '\n query GetOrderPositionBooks(\n $instrument: String!\n $bookType: BookType!\n $
|
|
43
|
-
): (typeof documents)['\n query GetOrderPositionBooks(\n $instrument: String!\n $bookType: BookType!\n $
|
|
40
|
+
source: '\n query GetOrderPositionBooks(\n $instrument: String!\n $bookType: BookType!\n $timeSpan: TimeSpan!\n $granularity: Granularity!\n $maxBookPrice: Float\n $minBookPrice: Float\n ) {\n orderPositionBooks(\n instrument: $instrument\n bookType: $bookType\n timeSpan: $timeSpan\n granularity: $granularity\n maxBookPrice: $maxBookPrice\n minBookPrice: $minBookPrice\n ) {\n bucketWidth\n price\n time\n buckets {\n price\n sentiment\n }\n }\n }\n'
|
|
41
|
+
): (typeof documents)['\n query GetOrderPositionBooks(\n $instrument: String!\n $bookType: BookType!\n $timeSpan: TimeSpan!\n $granularity: Granularity!\n $maxBookPrice: Float\n $minBookPrice: Float\n ) {\n orderPositionBooks(\n instrument: $instrument\n bookType: $bookType\n timeSpan: $timeSpan\n granularity: $granularity\n maxBookPrice: $maxBookPrice\n minBookPrice: $minBookPrice\n ) {\n bucketWidth\n price\n time\n buckets {\n price\n sentiment\n }\n }\n }\n'];
|
|
44
42
|
/**
|
|
45
43
|
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
|
|
46
44
|
*/
|
|
47
45
|
export function graphql(
|
|
48
|
-
source: '\n query GetPriceCandles(\n $division: Division
|
|
49
|
-
): (typeof documents)['\n query GetPriceCandles(\n $division: Division
|
|
50
|
-
/**
|
|
51
|
-
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
|
|
52
|
-
*/
|
|
53
|
-
export function graphql(
|
|
54
|
-
source: '\n query validateInstruments($instruments: [String]!, $division: Division) {\n mapInstrumentNames(instruments: $instruments, division: $division) {\n name\n displayName\n }\n }\n'
|
|
55
|
-
): (typeof documents)['\n query validateInstruments($instruments: [String]!, $division: Division) {\n mapInstrumentNames(instruments: $instruments, division: $division) {\n name\n displayName\n }\n }\n'];
|
|
46
|
+
source: '\n query GetPriceCandles(\n $dataSource: DataSource!\n $division: Division!\n $instrument: String!\n $granularity: Granularity!\n $timeSpan: TimeSpan!\n ) {\n priceCandles(\n dataSource: $dataSource\n division: $division\n instrument: $instrument\n granularity: $granularity\n timeSpan: $timeSpan\n ) {\n candle {\n point\n high\n low\n open\n close\n }\n }\n }\n'
|
|
47
|
+
): (typeof documents)['\n query GetPriceCandles(\n $dataSource: DataSource!\n $division: Division!\n $instrument: String!\n $granularity: Granularity!\n $timeSpan: TimeSpan!\n ) {\n priceCandles(\n dataSource: $dataSource\n division: $division\n instrument: $instrument\n granularity: $granularity\n timeSpan: $timeSpan\n ) {\n candle {\n point\n high\n low\n open\n close\n }\n }\n }\n'];
|
|
56
48
|
|
|
57
49
|
export function graphql(source: string) {
|
|
58
50
|
return (documents as any)[source] ?? {};
|