@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.
Files changed (174) hide show
  1. package/CHANGELOG.md +180 -0
  2. package/dist/main/CrowdViewWidget/CrowdViewWidget.js +3 -3
  3. package/dist/main/CrowdViewWidget/CrowdViewWidget.js.map +1 -1
  4. package/dist/main/CrowdViewWidget/Main.js +8 -9
  5. package/dist/main/CrowdViewWidget/Main.js.map +1 -1
  6. package/dist/main/CrowdViewWidget/components/Chart/Chart.js +11 -8
  7. package/dist/main/CrowdViewWidget/components/Chart/Chart.js.map +1 -1
  8. package/dist/main/CrowdViewWidget/components/Chart/ChartWithData.js +16 -13
  9. package/dist/main/CrowdViewWidget/components/Chart/ChartWithData.js.map +1 -1
  10. package/dist/main/CrowdViewWidget/components/Chart/{getOption.js → chartOptions.js} +53 -51
  11. package/dist/main/CrowdViewWidget/components/Chart/chartOptions.js.map +1 -0
  12. package/dist/main/CrowdViewWidget/components/Chart/index.js +44 -0
  13. package/dist/main/CrowdViewWidget/components/Chart/index.js.map +1 -1
  14. package/dist/main/CrowdViewWidget/components/Chart/types.js.map +1 -1
  15. package/dist/main/CrowdViewWidget/components/Chart/useCrowdViewData.js +170 -0
  16. package/dist/main/CrowdViewWidget/components/Chart/useCrowdViewData.js.map +1 -0
  17. package/dist/main/CrowdViewWidget/components/Chart/utils/chartUtils.js +70 -0
  18. package/dist/main/CrowdViewWidget/components/Chart/utils/chartUtils.js.map +1 -0
  19. package/dist/main/CrowdViewWidget/components/Legend/Legend.js +3 -2
  20. package/dist/main/CrowdViewWidget/components/Legend/Legend.js.map +1 -1
  21. package/dist/main/CrowdViewWidget/components/Legend/LegendBar.js +9 -11
  22. package/dist/main/CrowdViewWidget/components/Legend/LegendBar.js.map +1 -1
  23. package/dist/main/CrowdViewWidget/constants.js +30 -0
  24. package/dist/main/CrowdViewWidget/constants.js.map +1 -0
  25. package/dist/main/CrowdViewWidget/render.js +1 -0
  26. package/dist/main/CrowdViewWidget/render.js.map +1 -1
  27. package/dist/main/CrowdViewWidget/selectConfig.js +121 -0
  28. package/dist/main/CrowdViewWidget/selectConfig.js.map +1 -0
  29. package/dist/main/CrowdViewWidget/types/index.js +17 -0
  30. package/dist/main/CrowdViewWidget/types/index.js.map +1 -0
  31. package/dist/main/CrowdViewWidget/types/instruments.js +45 -0
  32. package/dist/main/CrowdViewWidget/types/instruments.js.map +1 -0
  33. package/dist/main/CrowdViewWidget/types.js +0 -44
  34. package/dist/main/CrowdViewWidget/types.js.map +1 -1
  35. package/dist/main/CrowdViewWidget/utils/instrumentUtils.js +13 -0
  36. package/dist/main/CrowdViewWidget/utils/instrumentUtils.js.map +1 -0
  37. package/dist/main/gql/getOrderPositionBooks.js +1 -1
  38. package/dist/main/gql/getOrderPositionBooks.js.map +1 -1
  39. package/dist/main/gql/getPriceCandles.js +11 -0
  40. package/dist/main/gql/getPriceCandles.js.map +1 -0
  41. package/dist/main/gql/types/gql.js +2 -3
  42. package/dist/main/gql/types/gql.js.map +1 -1
  43. package/dist/main/gql/types/graphql.js +161 -160
  44. package/dist/main/gql/types/graphql.js.map +1 -1
  45. package/dist/module/CrowdViewWidget/CrowdViewWidget.js +3 -3
  46. package/dist/module/CrowdViewWidget/CrowdViewWidget.js.map +1 -1
  47. package/dist/module/CrowdViewWidget/Main.js +6 -7
  48. package/dist/module/CrowdViewWidget/Main.js.map +1 -1
  49. package/dist/module/CrowdViewWidget/components/Chart/Chart.js +9 -6
  50. package/dist/module/CrowdViewWidget/components/Chart/Chart.js.map +1 -1
  51. package/dist/module/CrowdViewWidget/components/Chart/ChartWithData.js +16 -12
  52. package/dist/module/CrowdViewWidget/components/Chart/ChartWithData.js.map +1 -1
  53. package/dist/module/CrowdViewWidget/components/Chart/{getOption.js → chartOptions.js} +51 -48
  54. package/dist/module/CrowdViewWidget/components/Chart/chartOptions.js.map +1 -0
  55. package/dist/module/CrowdViewWidget/components/Chart/index.js +4 -0
  56. package/dist/module/CrowdViewWidget/components/Chart/index.js.map +1 -1
  57. package/dist/module/CrowdViewWidget/components/Chart/types.js.map +1 -1
  58. package/dist/module/CrowdViewWidget/components/Chart/useCrowdViewData.js +163 -0
  59. package/dist/module/CrowdViewWidget/components/Chart/useCrowdViewData.js.map +1 -0
  60. package/dist/module/CrowdViewWidget/components/Chart/utils/chartUtils.js +59 -0
  61. package/dist/module/CrowdViewWidget/components/Chart/utils/chartUtils.js.map +1 -0
  62. package/dist/module/CrowdViewWidget/components/Legend/Legend.js +3 -2
  63. package/dist/module/CrowdViewWidget/components/Legend/Legend.js.map +1 -1
  64. package/dist/module/CrowdViewWidget/components/Legend/LegendBar.js +9 -11
  65. package/dist/module/CrowdViewWidget/components/Legend/LegendBar.js.map +1 -1
  66. package/dist/module/CrowdViewWidget/constants.js +24 -0
  67. package/dist/module/CrowdViewWidget/constants.js.map +1 -0
  68. package/dist/module/CrowdViewWidget/render.js +1 -0
  69. package/dist/module/CrowdViewWidget/render.js.map +1 -1
  70. package/dist/module/CrowdViewWidget/selectConfig.js +116 -0
  71. package/dist/module/CrowdViewWidget/selectConfig.js.map +1 -0
  72. package/dist/module/CrowdViewWidget/types/index.js +2 -0
  73. package/dist/module/CrowdViewWidget/types/index.js.map +1 -0
  74. package/dist/module/CrowdViewWidget/types/instruments.js +39 -0
  75. package/dist/module/CrowdViewWidget/types/instruments.js.map +1 -0
  76. package/dist/module/CrowdViewWidget/types.js +1 -43
  77. package/dist/module/CrowdViewWidget/types.js.map +1 -1
  78. package/dist/module/CrowdViewWidget/utils/instrumentUtils.js +6 -0
  79. package/dist/module/CrowdViewWidget/utils/instrumentUtils.js.map +1 -0
  80. package/dist/module/gql/getOrderPositionBooks.js +1 -1
  81. package/dist/module/gql/getOrderPositionBooks.js.map +1 -1
  82. package/dist/module/gql/getPriceCandles.js +6 -0
  83. package/dist/module/gql/getPriceCandles.js.map +1 -0
  84. package/dist/module/gql/types/gql.js +2 -3
  85. package/dist/module/gql/types/gql.js.map +1 -1
  86. package/dist/module/gql/types/graphql.js +160 -159
  87. package/dist/module/gql/types/graphql.js.map +1 -1
  88. package/dist/types/CrowdViewWidget/CrowdViewWidget.d.ts +1 -1
  89. package/dist/types/CrowdViewWidget/components/Chart/ChartWithData.d.ts +1 -1
  90. package/dist/types/CrowdViewWidget/components/Chart/index.d.ts +4 -0
  91. package/dist/types/CrowdViewWidget/components/Chart/types.d.ts +19 -16
  92. package/dist/types/CrowdViewWidget/components/Chart/useCrowdViewData.d.ts +2 -0
  93. package/dist/types/CrowdViewWidget/components/Chart/{utils.d.ts → utils/chartUtils.d.ts} +4 -11
  94. package/dist/types/CrowdViewWidget/components/Legend/Legend.d.ts +3 -3
  95. package/dist/types/CrowdViewWidget/constants.d.ts +23 -0
  96. package/dist/types/CrowdViewWidget/selectConfig.d.ts +19 -0
  97. package/dist/types/CrowdViewWidget/types/index.d.ts +1 -0
  98. package/dist/types/CrowdViewWidget/types/instruments.d.ts +36 -0
  99. package/dist/types/CrowdViewWidget/types.d.ts +2 -50
  100. package/dist/types/CrowdViewWidget/utils/instrumentUtils.d.ts +8 -0
  101. package/dist/types/gql/types/gql.d.ts +10 -14
  102. package/dist/types/gql/types/graphql.d.ts +71 -63
  103. package/package.json +6 -4
  104. package/src/CrowdViewWidget/CrowdViewWidget.tsx +2 -2
  105. package/src/CrowdViewWidget/Main.tsx +10 -16
  106. package/src/CrowdViewWidget/components/Chart/Chart.tsx +15 -5
  107. package/src/CrowdViewWidget/components/Chart/ChartWithData.tsx +12 -12
  108. package/src/CrowdViewWidget/components/Chart/{getOption.ts → chartOptions.ts} +51 -70
  109. package/src/CrowdViewWidget/components/Chart/index.ts +4 -0
  110. package/src/CrowdViewWidget/components/Chart/types.ts +25 -23
  111. package/src/CrowdViewWidget/components/Chart/useCrowdViewData.ts +263 -0
  112. package/src/CrowdViewWidget/components/Chart/utils/chartUtils.ts +93 -0
  113. package/src/CrowdViewWidget/components/Legend/Legend.tsx +7 -3
  114. package/src/CrowdViewWidget/components/Legend/LegendBar.tsx +16 -20
  115. package/src/CrowdViewWidget/constants.ts +27 -0
  116. package/src/CrowdViewWidget/render.tsx +1 -0
  117. package/src/CrowdViewWidget/{config.ts → selectConfig.ts} +65 -43
  118. package/src/CrowdViewWidget/types/index.ts +1 -0
  119. package/src/CrowdViewWidget/types/instruments.ts +37 -0
  120. package/src/CrowdViewWidget/types.ts +4 -55
  121. package/src/CrowdViewWidget/utils/instrumentUtils.ts +11 -0
  122. package/src/gql/getOrderPositionBooks.ts +9 -4
  123. package/src/gql/{mock/getPriceCandles.ts → getPriceCandles.ts} +5 -5
  124. package/src/gql/types/gql.ts +6 -14
  125. package/src/gql/types/graphql.ts +170 -160
  126. package/test/Main.test.tsx +1 -1
  127. package/test/components/Legend.test.tsx +3 -6
  128. package/test/components/LegendBar.test.tsx +7 -8
  129. package/test/utils/instrumentUtils.test.ts +52 -0
  130. package/dist/main/CrowdViewWidget/components/Chart/constants.js +0 -14
  131. package/dist/main/CrowdViewWidget/components/Chart/constants.js.map +0 -1
  132. package/dist/main/CrowdViewWidget/components/Chart/getOption.js.map +0 -1
  133. package/dist/main/CrowdViewWidget/components/Chart/getOrderPositionDataMock.js +0 -47
  134. package/dist/main/CrowdViewWidget/components/Chart/getOrderPositionDataMock.js.map +0 -1
  135. package/dist/main/CrowdViewWidget/components/Chart/getPriceCandlesMock.js +0 -36
  136. package/dist/main/CrowdViewWidget/components/Chart/getPriceCandlesMock.js.map +0 -1
  137. package/dist/main/CrowdViewWidget/components/Chart/utils.js +0 -166
  138. package/dist/main/CrowdViewWidget/components/Chart/utils.js.map +0 -1
  139. package/dist/main/CrowdViewWidget/config.js +0 -107
  140. package/dist/main/CrowdViewWidget/config.js.map +0 -1
  141. package/dist/main/gql/mock/getPriceCandles.js +0 -11
  142. package/dist/main/gql/mock/getPriceCandles.js.map +0 -1
  143. package/dist/main/gql/mock/schema.graphqls +0 -62
  144. package/dist/main/gql/validateInstruments.js +0 -11
  145. package/dist/main/gql/validateInstruments.js.map +0 -1
  146. package/dist/module/CrowdViewWidget/components/Chart/constants.js +0 -8
  147. package/dist/module/CrowdViewWidget/components/Chart/constants.js.map +0 -1
  148. package/dist/module/CrowdViewWidget/components/Chart/getOption.js.map +0 -1
  149. package/dist/module/CrowdViewWidget/components/Chart/getOrderPositionDataMock.js +0 -40
  150. package/dist/module/CrowdViewWidget/components/Chart/getOrderPositionDataMock.js.map +0 -1
  151. package/dist/module/CrowdViewWidget/components/Chart/getPriceCandlesMock.js +0 -29
  152. package/dist/module/CrowdViewWidget/components/Chart/getPriceCandlesMock.js.map +0 -1
  153. package/dist/module/CrowdViewWidget/components/Chart/utils.js +0 -156
  154. package/dist/module/CrowdViewWidget/components/Chart/utils.js.map +0 -1
  155. package/dist/module/CrowdViewWidget/config.js +0 -102
  156. package/dist/module/CrowdViewWidget/config.js.map +0 -1
  157. package/dist/module/gql/mock/getPriceCandles.js +0 -6
  158. package/dist/module/gql/mock/getPriceCandles.js.map +0 -1
  159. package/dist/module/gql/mock/schema.graphqls +0 -62
  160. package/dist/module/gql/validateInstruments.js +0 -5
  161. package/dist/module/gql/validateInstruments.js.map +0 -1
  162. package/dist/types/CrowdViewWidget/components/Chart/constants.d.ts +0 -7
  163. package/dist/types/CrowdViewWidget/components/Chart/getOrderPositionDataMock.d.ts +0 -14
  164. package/dist/types/CrowdViewWidget/components/Chart/getPriceCandlesMock.d.ts +0 -2
  165. package/dist/types/CrowdViewWidget/config.d.ts +0 -22
  166. package/dist/types/gql/validateInstruments.d.ts +0 -1
  167. package/src/CrowdViewWidget/components/Chart/constants.tsx +0 -8
  168. package/src/CrowdViewWidget/components/Chart/getOrderPositionDataMock.ts +0 -66
  169. package/src/CrowdViewWidget/components/Chart/getPriceCandlesMock.ts +0 -43
  170. package/src/CrowdViewWidget/components/Chart/utils.ts +0 -191
  171. package/src/gql/mock/schema.graphqls +0 -62
  172. package/src/gql/validateInstruments.ts +0 -10
  173. /package/dist/types/CrowdViewWidget/components/Chart/{getOption.d.ts → chartOptions.d.ts} +0 -0
  174. /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: number[];
8
- shortValues: number[];
8
+ longValues?: [number, number];
9
+ shortValues?: [number, number];
9
10
  }
10
11
 
11
- export const Legend = ({ longValues, shortValues }: LegendProps) => {
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 { colorMap } from '../../config';
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 = colorMap[type];
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
- {values.map((_, index) => (
20
- <div
21
- key={`${label}_${colors[index]}__color`}
22
- className="lw-h-full lw-flex-1"
23
- data-testid="legend-bar-segment"
24
- style={{
25
- backgroundColor: colors[index],
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
- {values.map((value) => (
33
- <div key={`${value}_${type}`} className="lw-flex lw-w-1/4">
34
- <span className="lw-whitespace-nowrap lw-font-sans lw-text-xs lw-text-text-primary">
35
- {value.toFixed(2)}% {label}
36
- </span>
37
- </div>
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;
@@ -42,6 +42,7 @@ dataCrowdViewParamsElements.forEach((element) => {
42
42
 
43
43
  root.render(
44
44
  <CrowdViewWidget
45
+ division={division}
45
46
  graphqlUrl={graphqlUrl}
46
47
  isParamError={isParamError}
47
48
  locale={locale}
@@ -1,6 +1,5 @@
1
- import { BookType } from '../gql/types/graphql';
2
- import type { LegendType } from './components/Legend/LegendBar';
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: GranularityId.MINUTE_5,
143
+ id: Granularity.M5,
109
144
  label: '5_minutes',
110
145
  },
111
146
  {
112
- id: GranularityId.MINUTE_15,
147
+ id: Granularity.M15,
113
148
  label: '15_minutes',
114
149
  },
115
150
  {
116
- id: GranularityId.MINUTE_30,
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: GranularityId.HOUR_4,
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
- $recentHours: Int
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
- recentHours: $recentHours
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
- longCountPercent
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
- $division: Division
5
+ $dataSource: DataSource!
6
+ $division: Division!
6
7
  $instrument: String!
7
8
  $granularity: Granularity!
8
9
  $timeSpan: TimeSpan!
9
10
  ) {
10
- getPriceCandles(
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
  `;
@@ -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 $recentHours: Int\n ) {\n orderPositionBooks(\n instrument: $instrument\n bookType: $bookType\n recentHours: $recentHours\n ) {\n bucketWidth\n price\n time\n buckets {\n price\n longCountPercent\n shortCountPercent\n }\n }\n }\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\n $instrument: String!\n $granularity: Granularity!\n $timeSpan: TimeSpan!\n ) {\n getPriceCandles(\n division: $division\n instrument: $instrument\n granularity: $granularity\n timeSpan: $timeSpan\n ) {\n time\n unixTime\n candle {\n high\n low\n open\n close\n }\n timeSpan\n }\n }\n':
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 $recentHours: Int\n ) {\n orderPositionBooks(\n instrument: $instrument\n bookType: $bookType\n recentHours: $recentHours\n ) {\n bucketWidth\n price\n time\n buckets {\n price\n longCountPercent\n shortCountPercent\n }\n }\n }\n'
43
- ): (typeof documents)['\n query GetOrderPositionBooks(\n $instrument: String!\n $bookType: BookType!\n $recentHours: Int\n ) {\n orderPositionBooks(\n instrument: $instrument\n bookType: $bookType\n recentHours: $recentHours\n ) {\n bucketWidth\n price\n time\n buckets {\n price\n longCountPercent\n shortCountPercent\n }\n }\n }\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\n $instrument: String!\n $granularity: Granularity!\n $timeSpan: TimeSpan!\n ) {\n getPriceCandles(\n division: $division\n instrument: $instrument\n granularity: $granularity\n timeSpan: $timeSpan\n ) {\n time\n unixTime\n candle {\n high\n low\n open\n close\n }\n timeSpan\n }\n }\n'
49
- ): (typeof documents)['\n query GetPriceCandles(\n $division: Division\n $instrument: String!\n $granularity: Granularity!\n $timeSpan: TimeSpan!\n ) {\n getPriceCandles(\n division: $division\n instrument: $instrument\n granularity: $granularity\n timeSpan: $timeSpan\n ) {\n time\n unixTime\n candle {\n high\n low\n open\n close\n }\n timeSpan\n }\n }\n'];
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] ?? {};