@oanda/labs-crowd-view-widget 1.0.36 → 1.0.37
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 +152 -0
- package/dist/main/CrowdViewWidget/components/Chart/Chart.js +38 -74
- package/dist/main/CrowdViewWidget/components/Chart/Chart.js.map +1 -1
- package/dist/main/CrowdViewWidget/components/Chart/ChartWithData.js +3 -18
- package/dist/main/CrowdViewWidget/components/Chart/ChartWithData.js.map +1 -1
- package/dist/main/CrowdViewWidget/components/Chart/getOption.js +29 -53
- package/dist/main/CrowdViewWidget/components/Chart/getOption.js.map +1 -1
- package/dist/main/CrowdViewWidget/components/Chart/getOrderPositionDataMock.js +47 -0
- package/dist/main/CrowdViewWidget/components/Chart/getOrderPositionDataMock.js.map +1 -0
- package/dist/main/CrowdViewWidget/components/Chart/types.js.map +1 -1
- package/dist/main/CrowdViewWidget/components/Chart/utils.js +24 -22
- package/dist/main/CrowdViewWidget/components/Chart/utils.js.map +1 -1
- package/dist/module/CrowdViewWidget/components/Chart/Chart.js +39 -76
- package/dist/module/CrowdViewWidget/components/Chart/Chart.js.map +1 -1
- package/dist/module/CrowdViewWidget/components/Chart/ChartWithData.js +3 -18
- package/dist/module/CrowdViewWidget/components/Chart/ChartWithData.js.map +1 -1
- package/dist/module/CrowdViewWidget/components/Chart/getOption.js +29 -52
- package/dist/module/CrowdViewWidget/components/Chart/getOption.js.map +1 -1
- package/dist/module/CrowdViewWidget/components/Chart/getOrderPositionDataMock.js +40 -0
- package/dist/module/CrowdViewWidget/components/Chart/getOrderPositionDataMock.js.map +1 -0
- package/dist/module/CrowdViewWidget/components/Chart/types.js.map +1 -1
- package/dist/module/CrowdViewWidget/components/Chart/utils.js +24 -22
- package/dist/module/CrowdViewWidget/components/Chart/utils.js.map +1 -1
- package/dist/types/CrowdViewWidget/components/Chart/getOption.d.ts +1 -114
- package/dist/types/CrowdViewWidget/components/Chart/getOrderPositionDataMock.d.ts +14 -0
- package/dist/types/CrowdViewWidget/components/Chart/types.d.ts +1 -6
- package/package.json +3 -3
- package/src/CrowdViewWidget/components/Chart/Chart.tsx +32 -90
- package/src/CrowdViewWidget/components/Chart/ChartWithData.tsx +5 -22
- package/src/CrowdViewWidget/components/Chart/getOption.ts +45 -70
- package/src/CrowdViewWidget/components/Chart/getOrderPositionDataMock.ts +66 -0
- package/src/CrowdViewWidget/components/Chart/types.ts +4 -6
- package/src/CrowdViewWidget/components/Chart/utils.ts +23 -20
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
export const getOrderPositionDataMock = _ref => {
|
|
2
|
+
let {
|
|
3
|
+
min = 1.3,
|
|
4
|
+
max = 2.1,
|
|
5
|
+
bucketWidth = 0.005,
|
|
6
|
+
baseValue,
|
|
7
|
+
crossoverValue = baseValue
|
|
8
|
+
} = _ref;
|
|
9
|
+
const results = [];
|
|
10
|
+
const maxDistance = Math.max(baseValue - min, max - baseValue);
|
|
11
|
+
for (let currentPrice = min; currentPrice < max; currentPrice += bucketWidth) {
|
|
12
|
+
const distance = Math.abs(currentPrice - baseValue);
|
|
13
|
+
const proximityFactor = 1 - distance / maxDistance;
|
|
14
|
+
const strongProximityFactor = Math.pow(proximityFactor, 2);
|
|
15
|
+
let shortCountPercent;
|
|
16
|
+
let longCountPercent;
|
|
17
|
+
if (currentPrice === baseValue) {
|
|
18
|
+
shortCountPercent = Math.random() * 0.5;
|
|
19
|
+
longCountPercent = Math.random() * 0.5;
|
|
20
|
+
} else {
|
|
21
|
+
const maxDifference = 0.5;
|
|
22
|
+
const targetDifference = Math.random() * maxDifference * strongProximityFactor;
|
|
23
|
+
const baseRandom = Math.random() * (0.5 - targetDifference);
|
|
24
|
+
if (currentPrice < crossoverValue) {
|
|
25
|
+
shortCountPercent = baseRandom;
|
|
26
|
+
longCountPercent = baseRandom + targetDifference;
|
|
27
|
+
} else {
|
|
28
|
+
longCountPercent = baseRandom;
|
|
29
|
+
shortCountPercent = baseRandom + targetDifference;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
results.push({
|
|
33
|
+
shortCountPercent: Math.round(shortCountPercent * 10000) / 10000,
|
|
34
|
+
longCountPercent: Math.round(longCountPercent * 10000) / 10000,
|
|
35
|
+
price: currentPrice
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
return results;
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=getOrderPositionDataMock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getOrderPositionDataMock.js","names":["getOrderPositionDataMock","_ref","min","max","bucketWidth","baseValue","crossoverValue","results","maxDistance","Math","currentPrice","distance","abs","proximityFactor","strongProximityFactor","pow","shortCountPercent","longCountPercent","random","maxDifference","targetDifference","baseRandom","push","round","price"],"sources":["../../../../../src/CrowdViewWidget/components/Chart/getOrderPositionDataMock.ts"],"sourcesContent":["export interface OrderPositionData {\n shortCountPercent: number;\n longCountPercent: number;\n price: number;\n}\n\ninterface GetOrderPositionDataMockParams {\n min?: number;\n max?: number;\n bucketWidth?: number;\n baseValue: number;\n crossoverValue?: number;\n}\n\nexport const getOrderPositionDataMock = ({\n min = 1.3,\n max = 2.1,\n bucketWidth = 0.005,\n baseValue,\n crossoverValue = baseValue,\n}: GetOrderPositionDataMockParams): OrderPositionData[] => {\n const results: OrderPositionData[] = [];\n\n const maxDistance = Math.max(baseValue - min, max - baseValue);\n\n for (\n let currentPrice = min;\n currentPrice < max;\n currentPrice += bucketWidth\n ) {\n const distance = Math.abs(currentPrice - baseValue);\n\n const proximityFactor = 1 - distance / maxDistance;\n const strongProximityFactor = Math.pow(proximityFactor, 2);\n\n let shortCountPercent: number;\n let longCountPercent: number;\n\n if (currentPrice === baseValue) {\n shortCountPercent = Math.random() * 0.5;\n longCountPercent = Math.random() * 0.5;\n } else {\n const maxDifference = 0.5;\n const targetDifference =\n Math.random() * maxDifference * strongProximityFactor;\n\n const baseRandom = Math.random() * (0.5 - targetDifference);\n\n if (currentPrice < crossoverValue) {\n shortCountPercent = baseRandom;\n longCountPercent = baseRandom + targetDifference;\n } else {\n longCountPercent = baseRandom;\n shortCountPercent = baseRandom + targetDifference;\n }\n }\n\n results.push({\n shortCountPercent: Math.round(shortCountPercent * 10000) / 10000,\n longCountPercent: Math.round(longCountPercent * 10000) / 10000,\n price: currentPrice,\n });\n }\n\n return results;\n};\n"],"mappings":"AAcA,OAAO,MAAMA,wBAAwB,GAAGC,IAAA,IAMmB;EAAA,IANlB;IACvCC,GAAG,GAAG,GAAG;IACTC,GAAG,GAAG,GAAG;IACTC,WAAW,GAAG,KAAK;IACnBC,SAAS;IACTC,cAAc,GAAGD;EACa,CAAC,GAAAJ,IAAA;EAC/B,MAAMM,OAA4B,GAAG,EAAE;EAEvC,MAAMC,WAAW,GAAGC,IAAI,CAACN,GAAG,CAACE,SAAS,GAAGH,GAAG,EAAEC,GAAG,GAAGE,SAAS,CAAC;EAE9D,KACE,IAAIK,YAAY,GAAGR,GAAG,EACtBQ,YAAY,GAAGP,GAAG,EAClBO,YAAY,IAAIN,WAAW,EAC3B;IACA,MAAMO,QAAQ,GAAGF,IAAI,CAACG,GAAG,CAACF,YAAY,GAAGL,SAAS,CAAC;IAEnD,MAAMQ,eAAe,GAAG,CAAC,GAAGF,QAAQ,GAAGH,WAAW;IAClD,MAAMM,qBAAqB,GAAGL,IAAI,CAACM,GAAG,CAACF,eAAe,EAAE,CAAC,CAAC;IAE1D,IAAIG,iBAAyB;IAC7B,IAAIC,gBAAwB;IAE5B,IAAIP,YAAY,KAAKL,SAAS,EAAE;MAC9BW,iBAAiB,GAAGP,IAAI,CAACS,MAAM,CAAC,CAAC,GAAG,GAAG;MACvCD,gBAAgB,GAAGR,IAAI,CAACS,MAAM,CAAC,CAAC,GAAG,GAAG;IACxC,CAAC,MAAM;MACL,MAAMC,aAAa,GAAG,GAAG;MACzB,MAAMC,gBAAgB,GACpBX,IAAI,CAACS,MAAM,CAAC,CAAC,GAAGC,aAAa,GAAGL,qBAAqB;MAEvD,MAAMO,UAAU,GAAGZ,IAAI,CAACS,MAAM,CAAC,CAAC,IAAI,GAAG,GAAGE,gBAAgB,CAAC;MAE3D,IAAIV,YAAY,GAAGJ,cAAc,EAAE;QACjCU,iBAAiB,GAAGK,UAAU;QAC9BJ,gBAAgB,GAAGI,UAAU,GAAGD,gBAAgB;MAClD,CAAC,MAAM;QACLH,gBAAgB,GAAGI,UAAU;QAC7BL,iBAAiB,GAAGK,UAAU,GAAGD,gBAAgB;MACnD;IACF;IAEAb,OAAO,CAACe,IAAI,CAAC;MACXN,iBAAiB,EAAEP,IAAI,CAACc,KAAK,CAACP,iBAAiB,GAAG,KAAK,CAAC,GAAG,KAAK;MAChEC,gBAAgB,EAAER,IAAI,CAACc,KAAK,CAACN,gBAAgB,GAAG,KAAK,CAAC,GAAG,KAAK;MAC9DO,KAAK,EAAEd;IACT,CAAC,CAAC;EACJ;EAEA,OAAOH,OAAO;AAChB,CAAC","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","names":[],"sources":["../../../../../src/CrowdViewWidget/components/Chart/types.ts"],"sourcesContent":["import type {
|
|
1
|
+
{"version":3,"file":"types.js","names":[],"sources":["../../../../../src/CrowdViewWidget/components/Chart/types.ts"],"sourcesContent":["import type { EChartsOption } from 'echarts';\n\nimport type { BookType } from '../../../gql/types/graphql';\nimport type { GranularityId } from '../../types';\n\ninterface ChartOptionsProps {\n xAxisData: string[];\n ordersPositionsChartData: [\n // timestamp\n string,\n // price\n number,\n // orders-positions sentiment\n number,\n ][];\n ordersPositionsBucketWidth: number;\n candlesSeriesData: [number, number, number, number][];\n}\n\nexport type GetOptionType = (\n props: ChartOptionsProps,\n isDark: boolean\n) => EChartsOption;\n\nexport interface ChartProps {\n data: ChartOptionsProps;\n}\n\nexport interface ChartWithDataProps {\n bookType: BookType;\n instrument: string;\n granularity: GranularityId;\n}\n\ninterface TransformDataForChartTypeProps {\n granularity: GranularityId;\n}\n\nexport type TransformDataForChartType = (\n props: TransformDataForChartTypeProps\n) => ChartOptionsProps;\n\nexport interface GetLabelsDataProps {\n xAxisData: string[];\n isGreaterThanTwoWeeks: boolean;\n}\n"],"mappings":"","ignoreList":[]}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { colorMap } from '../../config';
|
|
2
2
|
import { TimeSpanId } from '../../types';
|
|
3
3
|
import { CHART_HEIGHT } from './constants';
|
|
4
|
+
import { getOrderPositionDataMock } from './getOrderPositionDataMock';
|
|
4
5
|
import { getPriceCandlesMock } from './getPriceCandlesMock';
|
|
5
6
|
export const getRectColor = sentiment => {
|
|
6
7
|
const colors = sentiment < 0 ? colorMap.short : colorMap.long;
|
|
@@ -58,19 +59,15 @@ const temporaryGranularityTimeSpanMap = {
|
|
|
58
59
|
[GranularityId.HOUR_4]: TimeSpanId.MONTH_3,
|
|
59
60
|
[GranularityId.DAY_1]: TimeSpanId.MONTH_6
|
|
60
61
|
};
|
|
61
|
-
const
|
|
62
|
+
const mockXAxisData = granularityId => {
|
|
62
63
|
const granularity = granularityInMilliseconds[granularityId];
|
|
63
64
|
const timeSpan = timeSpansInMilliseconds[temporaryGranularityTimeSpanMap[granularityId]];
|
|
64
|
-
const currentTime =
|
|
65
|
-
const startDate =
|
|
65
|
+
const currentTime = new Date();
|
|
66
|
+
const startDate = currentTime;
|
|
66
67
|
const totalSteps = timeSpan / granularity;
|
|
67
68
|
const orderPositionDataForHistorical = new Array(totalSteps).fill(null).map((_, index) => {
|
|
68
69
|
const newDate = new Date(startDate.getTime() - index * granularity);
|
|
69
|
-
return {
|
|
70
|
-
time: `${newDate.toISOString().slice(0, 19)}Z`,
|
|
71
|
-
buckets: data.orderPositionBooks[0].buckets,
|
|
72
|
-
bucketWidth: data.orderPositionBooks[0].bucketWidth
|
|
73
|
-
};
|
|
70
|
+
return `${newDate.toISOString().slice(0, 19)}Z`;
|
|
74
71
|
}).reverse();
|
|
75
72
|
return orderPositionDataForHistorical;
|
|
76
73
|
};
|
|
@@ -116,37 +113,42 @@ export const isDifferenceGreaterThanTwoWeeks = (startDate, endDate) => {
|
|
|
116
113
|
};
|
|
117
114
|
export const transformDataForChart = _ref2 => {
|
|
118
115
|
let {
|
|
119
|
-
data,
|
|
120
116
|
granularity
|
|
121
117
|
} = _ref2;
|
|
122
|
-
const
|
|
123
|
-
const
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
118
|
+
const bucketWidth = 0.005;
|
|
119
|
+
const mockedXAxisData = mockXAxisData(granularity);
|
|
120
|
+
const mockedCandles = getPriceCandlesMock(mockedXAxisData.length);
|
|
121
|
+
const orderPositionData = mockedCandles.map((item, index) => {
|
|
122
|
+
return {
|
|
123
|
+
time: mockedXAxisData[index],
|
|
124
|
+
buckets: getOrderPositionDataMock({
|
|
125
|
+
baseValue: item.high,
|
|
126
|
+
bucketWidth,
|
|
127
|
+
crossoverValue: item.high + (Math.random() - 0.5) * 0.3
|
|
128
|
+
}),
|
|
129
|
+
bucketWidth: 0.005
|
|
130
|
+
};
|
|
128
131
|
});
|
|
129
|
-
const ordersPositionsChartData =
|
|
132
|
+
const ordersPositionsChartData = orderPositionData.flatMap(_ref3 => {
|
|
130
133
|
let {
|
|
131
134
|
buckets,
|
|
132
135
|
time
|
|
133
|
-
} =
|
|
136
|
+
} = _ref3;
|
|
134
137
|
return buckets.map(bucket => [time, bucket.price, bucket.longCountPercent - bucket.shortCountPercent]);
|
|
135
138
|
}).filter(item => Math.abs(item[2]) > 0.15);
|
|
136
|
-
const
|
|
137
|
-
const candlesSeriesData = mockedCandles.map(_ref5 => {
|
|
139
|
+
const candlesSeriesData = mockedCandles.map(_ref4 => {
|
|
138
140
|
let {
|
|
139
141
|
close,
|
|
140
142
|
open,
|
|
141
143
|
low,
|
|
142
144
|
high
|
|
143
|
-
} =
|
|
145
|
+
} = _ref4;
|
|
144
146
|
return [+close.toFixed(5), +open.toFixed(5), +low.toFixed(5), +high.toFixed(5)];
|
|
145
147
|
});
|
|
146
148
|
return {
|
|
147
|
-
xAxisData,
|
|
149
|
+
xAxisData: mockedXAxisData,
|
|
148
150
|
ordersPositionsChartData,
|
|
149
|
-
ordersPositionsBucketWidth:
|
|
151
|
+
ordersPositionsBucketWidth: bucketWidth,
|
|
150
152
|
candlesSeriesData,
|
|
151
153
|
granularity
|
|
152
154
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","names":["colorMap","TimeSpanId","CHART_HEIGHT","getPriceCandlesMock","getRectColor","sentiment","colors","short","long","absSentiment","Math","abs","GranularityId","timeSpansInMilliseconds","HOUR_1","HOUR_12","DAY_1","DAY_2","WEEK_1","WEEK_2","WEEK_3","MONTH_1","MONTH_3","MONTH_6","YEAR_1","YEAR_5","granularityInMilliseconds","MINUTE_5","MINUTE_15","MINUTE_30","HOUR_4","temporaryGranularityTimeSpanMap","mockOrderPositionDataForHistoricalData","data","granularityId","granularity","timeSpan","currentTime","orderPositionBooks","time","startDate","Date","totalSteps","orderPositionDataForHistorical","Array","fill","map","_","index","newDate","getTime","toISOString","slice","buckets","bucketWidth","reverse","getLabelData","_ref","xAxisData","isGreaterThanTwoWeeks","filter","record","arr","previousTimestamp","currentDate","previousDate","getDate","getMonth","item","name","toLocaleDateString","undefined","month","day","xAxis","y","silent","emphasis","disabled","label","fontFamily","fontSize","position","align","formatter","isDifferenceGreaterThanTwoWeeks","endDate","date1","date2","TWO_WEEKS_IN_MS","differenceInMs","transformDataForChart","_ref2","mockedData","_ref3","ordersPositionsChartData","flatMap","_ref4","bucket","price","longCountPercent","shortCountPercent","mockedCandles","length","candlesSeriesData","_ref5","close","open","low","high","toFixed","ordersPositionsBucketWidth"],"sources":["../../../../../src/CrowdViewWidget/components/Chart/utils.ts"],"sourcesContent":["import type { GetOrderPositionBooksQuery } from '../../../gql/types/graphql';\nimport { colorMap } from '../../config';\nimport { TimeSpanId } from '../../types';\nimport { CHART_HEIGHT } from './constants';\nimport { getPriceCandlesMock } from './getPriceCandlesMock';\nimport type { GetLabelsDataProps, TransformDataForChartType } from './types';\n\nexport const getRectColor = (sentiment: number) => {\n const colors = sentiment < 0 ? colorMap.short : colorMap.long;\n const absSentiment = Math.abs(sentiment);\n\n if (absSentiment < 0.15) {\n return colors[3];\n }\n\n if (absSentiment < 0.25) {\n return colors[2];\n }\n\n if (absSentiment < 0.4) {\n return colors[1];\n }\n\n if (absSentiment >= 0.4) {\n return colors[0];\n }\n\n return 'transparent';\n};\n\nexport enum GranularityId {\n MINUTE_5 = 'MINUTE_5',\n MINUTE_15 = 'MINUTE_15',\n MINUTE_30 = 'MINUTE_30',\n HOUR_1 = 'HOUR_1',\n HOUR_4 = 'HOUR_4',\n DAY_1 = 'DAY_1',\n}\n\nconst timeSpansInMilliseconds: Record<TimeSpanId, number> = {\n [TimeSpanId.HOUR_1]: 60 * 60 * 1000,\n [TimeSpanId.HOUR_12]: 12 * 60 * 60 * 1000,\n [TimeSpanId.DAY_1]: 24 * 60 * 60 * 1000,\n [TimeSpanId.DAY_2]: 2 * 24 * 60 * 60 * 1000,\n [TimeSpanId.WEEK_1]: 7 * 24 * 60 * 60 * 1000,\n [TimeSpanId.WEEK_2]: 14 * 24 * 60 * 60 * 1000,\n [TimeSpanId.WEEK_3]: 21 * 24 * 60 * 60 * 1000,\n [TimeSpanId.MONTH_1]: 30 * 24 * 60 * 60 * 1000, // Approximation\n [TimeSpanId.MONTH_3]: 3 * 30 * 24 * 60 * 60 * 1000, // Approximation\n [TimeSpanId.MONTH_6]: 6 * 30 * 24 * 60 * 60 * 1000, // Approximation\n [TimeSpanId.YEAR_1]: 365 * 24 * 60 * 60 * 1000, // Approximation\n [TimeSpanId.YEAR_5]: 5 * 365 * 24 * 60 * 60 * 1000, // Approximation\n};\n\nconst granularityInMilliseconds: Record<GranularityId, number> = {\n [GranularityId.MINUTE_5]: 5 * 60 * 1000,\n [GranularityId.MINUTE_15]: 15 * 60 * 1000,\n [GranularityId.MINUTE_30]: 30 * 60 * 1000,\n [GranularityId.HOUR_1]: 60 * 60 * 1000,\n [GranularityId.HOUR_4]: 4 * 60 * 60 * 1000,\n [GranularityId.DAY_1]: 24 * 60 * 60 * 1000,\n};\n\nconst temporaryGranularityTimeSpanMap: Record<GranularityId, TimeSpanId> = {\n [GranularityId.MINUTE_5]: TimeSpanId.DAY_2,\n [GranularityId.MINUTE_15]: TimeSpanId.WEEK_1,\n [GranularityId.MINUTE_30]: TimeSpanId.WEEK_2,\n [GranularityId.HOUR_1]: TimeSpanId.MONTH_1,\n [GranularityId.HOUR_4]: TimeSpanId.MONTH_3,\n [GranularityId.DAY_1]: TimeSpanId.MONTH_6,\n};\n\nconst mockOrderPositionDataForHistoricalData = (\n data: GetOrderPositionBooksQuery,\n granularityId: GranularityId\n) => {\n const granularity = granularityInMilliseconds[granularityId];\n const timeSpan =\n timeSpansInMilliseconds[temporaryGranularityTimeSpanMap[granularityId]];\n\n const currentTime = data.orderPositionBooks[0]!.time;\n\n const startDate = new Date(currentTime as string);\n const totalSteps = timeSpan / granularity;\n\n const orderPositionDataForHistorical = new Array(totalSteps)\n .fill(null)\n .map((_, index) => {\n const newDate = new Date(startDate.getTime() - index * granularity);\n\n return {\n time: `${newDate.toISOString().slice(0, 19)}Z`,\n buckets: data.orderPositionBooks[0]!.buckets,\n bucketWidth: data.orderPositionBooks[0]!.bucketWidth,\n };\n })\n .reverse();\n\n return orderPositionDataForHistorical;\n};\n\nexport const getLabelData = ({\n xAxisData,\n isGreaterThanTwoWeeks,\n}: GetLabelsDataProps) =>\n xAxisData\n .filter((record, index, arr) => {\n if (index === 0) {\n return false;\n }\n const previousTimestamp = arr[index - 1];\n const currentDate = new Date(record);\n const previousDate = new Date(previousTimestamp);\n\n return isGreaterThanTwoWeeks\n ? currentDate.getDate() !== previousDate.getDate()\n : currentDate.getMonth() !== previousDate.getMonth();\n })\n .map((item) => ({\n name: new Date(item).toLocaleDateString(undefined, {\n month: 'short',\n day: isGreaterThanTwoWeeks ? 'numeric' : undefined,\n }),\n xAxis: item,\n y: CHART_HEIGHT - 22,\n silent: true,\n emphasis: {\n disabled: true,\n },\n label: {\n fontFamily: 'Sofia W03',\n fontSize: 10,\n position: 'bottom',\n align: 'center',\n formatter: '{b}',\n },\n }));\n\nexport const isDifferenceGreaterThanTwoWeeks = (\n startDate: string,\n endDate: string\n) => {\n const date1 = new Date(startDate);\n const date2 = new Date(endDate);\n\n const TWO_WEEKS_IN_MS = 14 * 24 * 60 * 60 * 1000;\n\n const differenceInMs = Math.abs(date2.getTime() - date1.getTime());\n\n return differenceInMs < TWO_WEEKS_IN_MS;\n};\n\nexport const transformDataForChart: TransformDataForChartType = ({\n data,\n granularity,\n}) => {\n const mockedData = mockOrderPositionDataForHistoricalData(data, granularity);\n\n const xAxisData = mockedData.map(({ time }) => time);\n const ordersPositionsChartData = mockedData\n .flatMap(\n ({ buckets, time }) =>\n buckets.map((bucket) => [\n time,\n bucket!.price,\n bucket!.longCountPercent - bucket!.shortCountPercent,\n ]) as [string, number, number][]\n )\n .filter((item) => Math.abs(item[2]) > 0.15);\n\n const mockedCandles = getPriceCandlesMock(xAxisData.length);\n\n const candlesSeriesData: [number, number, number, number][] =\n mockedCandles.map(({ close, open, low, high }) => [\n +close.toFixed(5),\n +open.toFixed(5),\n +low.toFixed(5),\n +high.toFixed(5),\n ]);\n\n return {\n xAxisData,\n ordersPositionsChartData,\n ordersPositionsBucketWidth: mockedData[0]!.bucketWidth,\n candlesSeriesData,\n granularity,\n };\n};\n"],"mappings":"AACA,SAASA,QAAQ,QAAQ,cAAc;AACvC,SAASC,UAAU,QAAQ,aAAa;AACxC,SAASC,YAAY,QAAQ,aAAa;AAC1C,SAASC,mBAAmB,QAAQ,uBAAuB;AAG3D,OAAO,MAAMC,YAAY,GAAIC,SAAiB,IAAK;EACjD,MAAMC,MAAM,GAAGD,SAAS,GAAG,CAAC,GAAGL,QAAQ,CAACO,KAAK,GAAGP,QAAQ,CAACQ,IAAI;EAC7D,MAAMC,YAAY,GAAGC,IAAI,CAACC,GAAG,CAACN,SAAS,CAAC;EAExC,IAAII,YAAY,GAAG,IAAI,EAAE;IACvB,OAAOH,MAAM,CAAC,CAAC,CAAC;EAClB;EAEA,IAAIG,YAAY,GAAG,IAAI,EAAE;IACvB,OAAOH,MAAM,CAAC,CAAC,CAAC;EAClB;EAEA,IAAIG,YAAY,GAAG,GAAG,EAAE;IACtB,OAAOH,MAAM,CAAC,CAAC,CAAC;EAClB;EAEA,IAAIG,YAAY,IAAI,GAAG,EAAE;IACvB,OAAOH,MAAM,CAAC,CAAC,CAAC;EAClB;EAEA,OAAO,aAAa;AACtB,CAAC;AAED,WAAYM,aAAa,aAAbA,aAAa;EAAbA,aAAa;EAAbA,aAAa;EAAbA,aAAa;EAAbA,aAAa;EAAbA,aAAa;EAAbA,aAAa;EAAA,OAAbA,aAAa;AAAA;AASzB,MAAMC,uBAAmD,GAAG;EAC1D,CAACZ,UAAU,CAACa,MAAM,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;EACnC,CAACb,UAAU,CAACc,OAAO,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;EACzC,CAACd,UAAU,CAACe,KAAK,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;EACvC,CAACf,UAAU,CAACgB,KAAK,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;EAC3C,CAAChB,UAAU,CAACiB,MAAM,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;EAC5C,CAACjB,UAAU,CAACkB,MAAM,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;EAC7C,CAAClB,UAAU,CAACmB,MAAM,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;EAC7C,CAACnB,UAAU,CAACoB,OAAO,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;EAC9C,CAACpB,UAAU,CAACqB,OAAO,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;EAClD,CAACrB,UAAU,CAACsB,OAAO,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;EAClD,CAACtB,UAAU,CAACuB,MAAM,GAAG,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;EAC9C,CAACvB,UAAU,CAACwB,MAAM,GAAG,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG;AAChD,CAAC;AAED,MAAMC,yBAAwD,GAAG;EAC/D,CAACd,aAAa,CAACe,QAAQ,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI;EACvC,CAACf,aAAa,CAACgB,SAAS,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;EACzC,CAAChB,aAAa,CAACiB,SAAS,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;EACzC,CAACjB,aAAa,CAACE,MAAM,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;EACtC,CAACF,aAAa,CAACkB,MAAM,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;EAC1C,CAAClB,aAAa,CAACI,KAAK,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG;AACxC,CAAC;AAED,MAAMe,+BAAkE,GAAG;EACzE,CAACnB,aAAa,CAACe,QAAQ,GAAG1B,UAAU,CAACgB,KAAK;EAC1C,CAACL,aAAa,CAACgB,SAAS,GAAG3B,UAAU,CAACiB,MAAM;EAC5C,CAACN,aAAa,CAACiB,SAAS,GAAG5B,UAAU,CAACkB,MAAM;EAC5C,CAACP,aAAa,CAACE,MAAM,GAAGb,UAAU,CAACoB,OAAO;EAC1C,CAACT,aAAa,CAACkB,MAAM,GAAG7B,UAAU,CAACqB,OAAO;EAC1C,CAACV,aAAa,CAACI,KAAK,GAAGf,UAAU,CAACsB;AACpC,CAAC;AAED,MAAMS,sCAAsC,GAAGA,CAC7CC,IAAgC,EAChCC,aAA4B,KACzB;EACH,MAAMC,WAAW,GAAGT,yBAAyB,CAACQ,aAAa,CAAC;EAC5D,MAAME,QAAQ,GACZvB,uBAAuB,CAACkB,+BAA+B,CAACG,aAAa,CAAC,CAAC;EAEzE,MAAMG,WAAW,GAAGJ,IAAI,CAACK,kBAAkB,CAAC,CAAC,CAAC,CAAEC,IAAI;EAEpD,MAAMC,SAAS,GAAG,IAAIC,IAAI,CAACJ,WAAqB,CAAC;EACjD,MAAMK,UAAU,GAAGN,QAAQ,GAAGD,WAAW;EAEzC,MAAMQ,8BAA8B,GAAG,IAAIC,KAAK,CAACF,UAAU,CAAC,CACzDG,IAAI,CAAC,IAAI,CAAC,CACVC,GAAG,CAAC,CAACC,CAAC,EAAEC,KAAK,KAAK;IACjB,MAAMC,OAAO,GAAG,IAAIR,IAAI,CAACD,SAAS,CAACU,OAAO,CAAC,CAAC,GAAGF,KAAK,GAAGb,WAAW,CAAC;IAEnE,OAAO;MACLI,IAAI,EAAE,GAAGU,OAAO,CAACE,WAAW,CAAC,CAAC,CAACC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG;MAC9CC,OAAO,EAAEpB,IAAI,CAACK,kBAAkB,CAAC,CAAC,CAAC,CAAEe,OAAO;MAC5CC,WAAW,EAAErB,IAAI,CAACK,kBAAkB,CAAC,CAAC,CAAC,CAAEgB;IAC3C,CAAC;EACH,CAAC,CAAC,CACDC,OAAO,CAAC,CAAC;EAEZ,OAAOZ,8BAA8B;AACvC,CAAC;AAED,OAAO,MAAMa,YAAY,GAAGC,IAAA;EAAA,IAAC;IAC3BC,SAAS;IACTC;EACkB,CAAC,GAAAF,IAAA;EAAA,OACnBC,SAAS,CACNE,MAAM,CAAC,CAACC,MAAM,EAAEb,KAAK,EAAEc,GAAG,KAAK;IAC9B,IAAId,KAAK,KAAK,CAAC,EAAE;MACf,OAAO,KAAK;IACd;IACA,MAAMe,iBAAiB,GAAGD,GAAG,CAACd,KAAK,GAAG,CAAC,CAAC;IACxC,MAAMgB,WAAW,GAAG,IAAIvB,IAAI,CAACoB,MAAM,CAAC;IACpC,MAAMI,YAAY,GAAG,IAAIxB,IAAI,CAACsB,iBAAiB,CAAC;IAEhD,OAAOJ,qBAAqB,GACxBK,WAAW,CAACE,OAAO,CAAC,CAAC,KAAKD,YAAY,CAACC,OAAO,CAAC,CAAC,GAChDF,WAAW,CAACG,QAAQ,CAAC,CAAC,KAAKF,YAAY,CAACE,QAAQ,CAAC,CAAC;EACxD,CAAC,CAAC,CACDrB,GAAG,CAAEsB,IAAI,KAAM;IACdC,IAAI,EAAE,IAAI5B,IAAI,CAAC2B,IAAI,CAAC,CAACE,kBAAkB,CAACC,SAAS,EAAE;MACjDC,KAAK,EAAE,OAAO;MACdC,GAAG,EAAEd,qBAAqB,GAAG,SAAS,GAAGY;IAC3C,CAAC,CAAC;IACFG,KAAK,EAAEN,IAAI;IACXO,CAAC,EAAEzE,YAAY,GAAG,EAAE;IACpB0E,MAAM,EAAE,IAAI;IACZC,QAAQ,EAAE;MACRC,QAAQ,EAAE;IACZ,CAAC;IACDC,KAAK,EAAE;MACLC,UAAU,EAAE,WAAW;MACvBC,QAAQ,EAAE,EAAE;MACZC,QAAQ,EAAE,QAAQ;MAClBC,KAAK,EAAE,QAAQ;MACfC,SAAS,EAAE;IACb;EACF,CAAC,CAAC,CAAC;AAAA;AAEP,OAAO,MAAMC,+BAA+B,GAAGA,CAC7C7C,SAAiB,EACjB8C,OAAe,KACZ;EACH,MAAMC,KAAK,GAAG,IAAI9C,IAAI,CAACD,SAAS,CAAC;EACjC,MAAMgD,KAAK,GAAG,IAAI/C,IAAI,CAAC6C,OAAO,CAAC;EAE/B,MAAMG,eAAe,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;EAEhD,MAAMC,cAAc,GAAGhF,IAAI,CAACC,GAAG,CAAC6E,KAAK,CAACtC,OAAO,CAAC,CAAC,GAAGqC,KAAK,CAACrC,OAAO,CAAC,CAAC,CAAC;EAElE,OAAOwC,cAAc,GAAGD,eAAe;AACzC,CAAC;AAED,OAAO,MAAME,qBAAgD,GAAGC,KAAA,IAG1D;EAAA,IAH2D;IAC/D3D,IAAI;IACJE;EACF,CAAC,GAAAyD,KAAA;EACC,MAAMC,UAAU,GAAG7D,sCAAsC,CAACC,IAAI,EAAEE,WAAW,CAAC;EAE5E,MAAMuB,SAAS,GAAGmC,UAAU,CAAC/C,GAAG,CAACgD,KAAA;IAAA,IAAC;MAAEvD;IAAK,CAAC,GAAAuD,KAAA;IAAA,OAAKvD,IAAI;EAAA,EAAC;EACpD,MAAMwD,wBAAwB,GAAGF,UAAU,CACxCG,OAAO,CACNC,KAAA;IAAA,IAAC;MAAE5C,OAAO;MAAEd;IAAK,CAAC,GAAA0D,KAAA;IAAA,OAChB5C,OAAO,CAACP,GAAG,CAAEoD,MAAM,IAAK,CACtB3D,IAAI,EACJ2D,MAAM,CAAEC,KAAK,EACbD,MAAM,CAAEE,gBAAgB,GAAGF,MAAM,CAAEG,iBAAiB,CACrD,CAAC;EAAA,CACN,CAAC,CACAzC,MAAM,CAAEQ,IAAI,IAAK1D,IAAI,CAACC,GAAG,CAACyD,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;EAE7C,MAAMkC,aAAa,GAAGnG,mBAAmB,CAACuD,SAAS,CAAC6C,MAAM,CAAC;EAE3D,MAAMC,iBAAqD,GACzDF,aAAa,CAACxD,GAAG,CAAC2D,KAAA;IAAA,IAAC;MAAEC,KAAK;MAAEC,IAAI;MAAEC,GAAG;MAAEC;IAAK,CAAC,GAAAJ,KAAA;IAAA,OAAK,CAChD,CAACC,KAAK,CAACI,OAAO,CAAC,CAAC,CAAC,EACjB,CAACH,IAAI,CAACG,OAAO,CAAC,CAAC,CAAC,EAChB,CAACF,GAAG,CAACE,OAAO,CAAC,CAAC,CAAC,EACf,CAACD,IAAI,CAACC,OAAO,CAAC,CAAC,CAAC,CACjB;EAAA,EAAC;EAEJ,OAAO;IACLpD,SAAS;IACTqC,wBAAwB;IACxBgB,0BAA0B,EAAElB,UAAU,CAAC,CAAC,CAAC,CAAEvC,WAAW;IACtDkD,iBAAiB;IACjBrE;EACF,CAAC;AACH,CAAC","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"utils.js","names":["colorMap","TimeSpanId","CHART_HEIGHT","getOrderPositionDataMock","getPriceCandlesMock","getRectColor","sentiment","colors","short","long","absSentiment","Math","abs","GranularityId","timeSpansInMilliseconds","HOUR_1","HOUR_12","DAY_1","DAY_2","WEEK_1","WEEK_2","WEEK_3","MONTH_1","MONTH_3","MONTH_6","YEAR_1","YEAR_5","granularityInMilliseconds","MINUTE_5","MINUTE_15","MINUTE_30","HOUR_4","temporaryGranularityTimeSpanMap","mockXAxisData","granularityId","granularity","timeSpan","currentTime","Date","startDate","totalSteps","orderPositionDataForHistorical","Array","fill","map","_","index","newDate","getTime","toISOString","slice","reverse","getLabelData","_ref","xAxisData","isGreaterThanTwoWeeks","filter","record","arr","previousTimestamp","currentDate","previousDate","getDate","getMonth","item","name","toLocaleDateString","undefined","month","day","xAxis","y","silent","emphasis","disabled","label","fontFamily","fontSize","position","align","formatter","isDifferenceGreaterThanTwoWeeks","endDate","date1","date2","TWO_WEEKS_IN_MS","differenceInMs","transformDataForChart","_ref2","bucketWidth","mockedXAxisData","mockedCandles","length","orderPositionData","time","buckets","baseValue","high","crossoverValue","random","ordersPositionsChartData","flatMap","_ref3","bucket","price","longCountPercent","shortCountPercent","candlesSeriesData","_ref4","close","open","low","toFixed","ordersPositionsBucketWidth"],"sources":["../../../../../src/CrowdViewWidget/components/Chart/utils.ts"],"sourcesContent":["import { colorMap } from '../../config';\nimport { TimeSpanId } from '../../types';\nimport { CHART_HEIGHT } from './constants';\nimport { getOrderPositionDataMock } from './getOrderPositionDataMock';\nimport { getPriceCandlesMock } from './getPriceCandlesMock';\nimport type { GetLabelsDataProps, TransformDataForChartType } from './types';\n\nexport const getRectColor = (sentiment: number) => {\n const colors = sentiment < 0 ? colorMap.short : colorMap.long;\n const absSentiment = Math.abs(sentiment);\n\n if (absSentiment < 0.15) {\n return colors[3];\n }\n\n if (absSentiment < 0.25) {\n return colors[2];\n }\n\n if (absSentiment < 0.4) {\n return colors[1];\n }\n\n if (absSentiment >= 0.4) {\n return colors[0];\n }\n\n return 'transparent';\n};\n\nexport enum GranularityId {\n MINUTE_5 = 'MINUTE_5',\n MINUTE_15 = 'MINUTE_15',\n MINUTE_30 = 'MINUTE_30',\n HOUR_1 = 'HOUR_1',\n HOUR_4 = 'HOUR_4',\n DAY_1 = 'DAY_1',\n}\n\nconst timeSpansInMilliseconds: Record<TimeSpanId, number> = {\n [TimeSpanId.HOUR_1]: 60 * 60 * 1000,\n [TimeSpanId.HOUR_12]: 12 * 60 * 60 * 1000,\n [TimeSpanId.DAY_1]: 24 * 60 * 60 * 1000,\n [TimeSpanId.DAY_2]: 2 * 24 * 60 * 60 * 1000,\n [TimeSpanId.WEEK_1]: 7 * 24 * 60 * 60 * 1000,\n [TimeSpanId.WEEK_2]: 14 * 24 * 60 * 60 * 1000,\n [TimeSpanId.WEEK_3]: 21 * 24 * 60 * 60 * 1000,\n [TimeSpanId.MONTH_1]: 30 * 24 * 60 * 60 * 1000, // Approximation\n [TimeSpanId.MONTH_3]: 3 * 30 * 24 * 60 * 60 * 1000, // Approximation\n [TimeSpanId.MONTH_6]: 6 * 30 * 24 * 60 * 60 * 1000, // Approximation\n [TimeSpanId.YEAR_1]: 365 * 24 * 60 * 60 * 1000, // Approximation\n [TimeSpanId.YEAR_5]: 5 * 365 * 24 * 60 * 60 * 1000, // Approximation\n};\n\nconst granularityInMilliseconds: Record<GranularityId, number> = {\n [GranularityId.MINUTE_5]: 5 * 60 * 1000,\n [GranularityId.MINUTE_15]: 15 * 60 * 1000,\n [GranularityId.MINUTE_30]: 30 * 60 * 1000,\n [GranularityId.HOUR_1]: 60 * 60 * 1000,\n [GranularityId.HOUR_4]: 4 * 60 * 60 * 1000,\n [GranularityId.DAY_1]: 24 * 60 * 60 * 1000,\n};\n\nconst temporaryGranularityTimeSpanMap: Record<GranularityId, TimeSpanId> = {\n [GranularityId.MINUTE_5]: TimeSpanId.DAY_2,\n [GranularityId.MINUTE_15]: TimeSpanId.WEEK_1,\n [GranularityId.MINUTE_30]: TimeSpanId.WEEK_2,\n [GranularityId.HOUR_1]: TimeSpanId.MONTH_1,\n [GranularityId.HOUR_4]: TimeSpanId.MONTH_3,\n [GranularityId.DAY_1]: TimeSpanId.MONTH_6,\n};\n\nconst mockXAxisData = (granularityId: GranularityId) => {\n const granularity = granularityInMilliseconds[granularityId];\n const timeSpan =\n timeSpansInMilliseconds[temporaryGranularityTimeSpanMap[granularityId]];\n\n const currentTime = new Date();\n\n const startDate = currentTime;\n const totalSteps = timeSpan / granularity;\n\n const orderPositionDataForHistorical = new Array(totalSteps)\n .fill(null)\n .map((_, index) => {\n const newDate = new Date(startDate.getTime() - index * granularity);\n\n return `${newDate.toISOString().slice(0, 19)}Z`;\n })\n .reverse();\n\n return orderPositionDataForHistorical;\n};\n\nexport const getLabelData = ({\n xAxisData,\n isGreaterThanTwoWeeks,\n}: GetLabelsDataProps) =>\n xAxisData\n .filter((record, index, arr) => {\n if (index === 0) {\n return false;\n }\n const previousTimestamp = arr[index - 1];\n const currentDate = new Date(record);\n const previousDate = new Date(previousTimestamp);\n\n return isGreaterThanTwoWeeks\n ? currentDate.getDate() !== previousDate.getDate()\n : currentDate.getMonth() !== previousDate.getMonth();\n })\n .map((item) => ({\n name: new Date(item).toLocaleDateString(undefined, {\n month: 'short',\n day: isGreaterThanTwoWeeks ? 'numeric' : undefined,\n }),\n xAxis: item,\n y: CHART_HEIGHT - 22,\n silent: true,\n emphasis: {\n disabled: true,\n },\n label: {\n fontFamily: 'Sofia W03',\n fontSize: 10,\n position: 'bottom',\n align: 'center',\n formatter: '{b}',\n },\n }));\n\nexport const isDifferenceGreaterThanTwoWeeks = (\n startDate: string,\n endDate: string\n) => {\n const date1 = new Date(startDate);\n const date2 = new Date(endDate);\n\n const TWO_WEEKS_IN_MS = 14 * 24 * 60 * 60 * 1000;\n\n const differenceInMs = Math.abs(date2.getTime() - date1.getTime());\n\n return differenceInMs < TWO_WEEKS_IN_MS;\n};\n\nexport const transformDataForChart: TransformDataForChartType = ({\n granularity,\n}) => {\n const bucketWidth = 0.005;\n const mockedXAxisData = mockXAxisData(granularity);\n const mockedCandles = getPriceCandlesMock(mockedXAxisData.length);\n\n const orderPositionData = mockedCandles.map((item, index) => {\n return {\n time: mockedXAxisData[index],\n buckets: getOrderPositionDataMock({\n baseValue: item.high,\n bucketWidth,\n crossoverValue: item.high + (Math.random() - 0.5) * 0.3,\n }),\n bucketWidth: 0.005,\n };\n });\n\n const ordersPositionsChartData = orderPositionData\n .flatMap(\n ({ buckets, time }) =>\n buckets.map((bucket) => [\n time,\n bucket!.price,\n bucket!.longCountPercent - bucket!.shortCountPercent,\n ]) as [string, number, number][]\n )\n .filter((item) => Math.abs(item[2]) > 0.15);\n\n const candlesSeriesData: [number, number, number, number][] =\n mockedCandles.map(({ close, open, low, high }) => [\n +close.toFixed(5),\n +open.toFixed(5),\n +low.toFixed(5),\n +high.toFixed(5),\n ]);\n\n return {\n xAxisData: mockedXAxisData,\n ordersPositionsChartData,\n ordersPositionsBucketWidth: bucketWidth,\n candlesSeriesData,\n granularity,\n };\n};\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,115 +1,2 @@
|
|
|
1
|
-
import type { GetOptionType
|
|
2
|
-
export declare const getDesktopOption: ({ isDark }: GetResponsiveOptionsProps) => {
|
|
3
|
-
yAxis: {
|
|
4
|
-
nameTextStyle: {
|
|
5
|
-
align: string;
|
|
6
|
-
padding: number[];
|
|
7
|
-
};
|
|
8
|
-
axisLabel: {
|
|
9
|
-
margin: number;
|
|
10
|
-
};
|
|
11
|
-
};
|
|
12
|
-
grid: {
|
|
13
|
-
name: string;
|
|
14
|
-
top: string;
|
|
15
|
-
left: string;
|
|
16
|
-
right: string;
|
|
17
|
-
bottom: string;
|
|
18
|
-
}[];
|
|
19
|
-
graphic: ({
|
|
20
|
-
top: number | undefined;
|
|
21
|
-
bottom: number | undefined;
|
|
22
|
-
left: number | undefined;
|
|
23
|
-
right: number | undefined;
|
|
24
|
-
shape: {
|
|
25
|
-
x1: number;
|
|
26
|
-
y1: number;
|
|
27
|
-
x2: number;
|
|
28
|
-
y2: number;
|
|
29
|
-
};
|
|
30
|
-
type: string;
|
|
31
|
-
silent: boolean;
|
|
32
|
-
z: number;
|
|
33
|
-
style: {
|
|
34
|
-
stroke: string;
|
|
35
|
-
lineWidth: number;
|
|
36
|
-
};
|
|
37
|
-
} | {
|
|
38
|
-
top: number;
|
|
39
|
-
shape: {
|
|
40
|
-
x1: number;
|
|
41
|
-
y1: number;
|
|
42
|
-
x2: number;
|
|
43
|
-
y2: number;
|
|
44
|
-
};
|
|
45
|
-
type: string;
|
|
46
|
-
silent: boolean;
|
|
47
|
-
z: number;
|
|
48
|
-
style: {
|
|
49
|
-
stroke: string;
|
|
50
|
-
lineWidth: number;
|
|
51
|
-
};
|
|
52
|
-
} | {
|
|
53
|
-
right: number;
|
|
54
|
-
shape: {
|
|
55
|
-
x1: number;
|
|
56
|
-
y1: number;
|
|
57
|
-
x2: number;
|
|
58
|
-
y2: number;
|
|
59
|
-
};
|
|
60
|
-
type: string;
|
|
61
|
-
silent: boolean;
|
|
62
|
-
z: number;
|
|
63
|
-
style: {
|
|
64
|
-
stroke: string;
|
|
65
|
-
lineWidth: number;
|
|
66
|
-
};
|
|
67
|
-
} | {
|
|
68
|
-
bottom: number;
|
|
69
|
-
shape: {
|
|
70
|
-
x1: number;
|
|
71
|
-
y1: number;
|
|
72
|
-
x2: number;
|
|
73
|
-
y2: number;
|
|
74
|
-
};
|
|
75
|
-
type: string;
|
|
76
|
-
silent: boolean;
|
|
77
|
-
z: number;
|
|
78
|
-
style: {
|
|
79
|
-
stroke: string;
|
|
80
|
-
lineWidth: number;
|
|
81
|
-
};
|
|
82
|
-
} | {
|
|
83
|
-
left: number;
|
|
84
|
-
shape: {
|
|
85
|
-
x1: number;
|
|
86
|
-
y1: number;
|
|
87
|
-
x2: number;
|
|
88
|
-
y2: number;
|
|
89
|
-
};
|
|
90
|
-
type: string;
|
|
91
|
-
silent: boolean;
|
|
92
|
-
z: number;
|
|
93
|
-
style: {
|
|
94
|
-
stroke: string;
|
|
95
|
-
lineWidth: number;
|
|
96
|
-
};
|
|
97
|
-
} | {
|
|
98
|
-
top: number;
|
|
99
|
-
right: number;
|
|
100
|
-
shape: {
|
|
101
|
-
x1: number;
|
|
102
|
-
y1: number;
|
|
103
|
-
x2: number;
|
|
104
|
-
y2: number;
|
|
105
|
-
};
|
|
106
|
-
type: string;
|
|
107
|
-
silent: boolean;
|
|
108
|
-
z: number;
|
|
109
|
-
style: {
|
|
110
|
-
stroke: string;
|
|
111
|
-
lineWidth: number;
|
|
112
|
-
};
|
|
113
|
-
})[];
|
|
114
|
-
};
|
|
1
|
+
import type { GetOptionType } from './types';
|
|
115
2
|
export declare const getOption: GetOptionType;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface OrderPositionData {
|
|
2
|
+
shortCountPercent: number;
|
|
3
|
+
longCountPercent: number;
|
|
4
|
+
price: number;
|
|
5
|
+
}
|
|
6
|
+
interface GetOrderPositionDataMockParams {
|
|
7
|
+
min?: number;
|
|
8
|
+
max?: number;
|
|
9
|
+
bucketWidth?: number;
|
|
10
|
+
baseValue: number;
|
|
11
|
+
crossoverValue?: number;
|
|
12
|
+
}
|
|
13
|
+
export declare const getOrderPositionDataMock: ({ min, max, bucketWidth, baseValue, crossoverValue, }: GetOrderPositionDataMockParams) => OrderPositionData[];
|
|
14
|
+
export {};
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import type { GetOrderPositionBooksQuery } from '@oanda/labs-order-book-widget/src/gql/types/graphql';
|
|
2
1
|
import type { EChartsOption } from 'echarts';
|
|
3
2
|
import type { BookType } from '../../../gql/types/graphql';
|
|
4
3
|
import type { GranularityId } from '../../types';
|
|
@@ -12,10 +11,7 @@ interface ChartOptionsProps {
|
|
|
12
11
|
ordersPositionsBucketWidth: number;
|
|
13
12
|
candlesSeriesData: [number, number, number, number][];
|
|
14
13
|
}
|
|
15
|
-
export type GetOptionType = (props: ChartOptionsProps) => EChartsOption;
|
|
16
|
-
export interface GetResponsiveOptionsProps {
|
|
17
|
-
isDark: boolean;
|
|
18
|
-
}
|
|
14
|
+
export type GetOptionType = (props: ChartOptionsProps, isDark: boolean) => EChartsOption;
|
|
19
15
|
export interface ChartProps {
|
|
20
16
|
data: ChartOptionsProps;
|
|
21
17
|
}
|
|
@@ -25,7 +21,6 @@ export interface ChartWithDataProps {
|
|
|
25
21
|
granularity: GranularityId;
|
|
26
22
|
}
|
|
27
23
|
interface TransformDataForChartTypeProps {
|
|
28
|
-
data: GetOrderPositionBooksQuery;
|
|
29
24
|
granularity: GranularityId;
|
|
30
25
|
}
|
|
31
26
|
export type TransformDataForChartType = (props: TransformDataForChartTypeProps) => ChartOptionsProps;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@oanda/labs-crowd-view-widget",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.37",
|
|
4
4
|
"description": "Labs Crowd View Widget",
|
|
5
5
|
"main": "dist/main/index.js",
|
|
6
6
|
"module": "dist/module/index.js",
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
"author": "OANDA",
|
|
13
13
|
"license": "UNLICENSED",
|
|
14
14
|
"dependencies": {
|
|
15
|
-
"@oanda/labs-widget-common": "^1.0.
|
|
15
|
+
"@oanda/labs-widget-common": "^1.0.219",
|
|
16
16
|
"@oanda/mono-i18n": "10.0.1",
|
|
17
17
|
"graphql": "16.8.1"
|
|
18
18
|
},
|
|
@@ -20,5 +20,5 @@
|
|
|
20
20
|
"@graphql-codegen/cli": "5.0.0",
|
|
21
21
|
"@graphql-codegen/client-preset": "4.1.0"
|
|
22
22
|
},
|
|
23
|
-
"gitHead": "
|
|
23
|
+
"gitHead": "39a4ba7320ad2596a931ebc3b19cda09da14f9de"
|
|
24
24
|
}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import type { BaseChartRef } from '@oanda/labs-widget-common';
|
|
2
1
|
import {
|
|
3
2
|
BaseChart,
|
|
4
3
|
getChartTheme,
|
|
5
4
|
Theme,
|
|
6
5
|
useLayoutProvider,
|
|
7
6
|
} from '@oanda/labs-widget-common';
|
|
7
|
+
import type { EChartsType } from 'echarts';
|
|
8
8
|
import { BarChart, CandlestickChart, CustomChart } from 'echarts/charts';
|
|
9
9
|
import {
|
|
10
10
|
DataZoomInsideComponent,
|
|
@@ -15,10 +15,10 @@ import {
|
|
|
15
15
|
} from 'echarts/components';
|
|
16
16
|
import * as echarts from 'echarts/core';
|
|
17
17
|
import { CanvasRenderer } from 'echarts/renderers';
|
|
18
|
-
import React
|
|
18
|
+
import React from 'react';
|
|
19
19
|
|
|
20
|
-
import { CHART_HEIGHT
|
|
21
|
-
import {
|
|
20
|
+
import { CHART_HEIGHT } from './constants';
|
|
21
|
+
import { getOption } from './getOption';
|
|
22
22
|
import type { ChartProps } from './types';
|
|
23
23
|
import { getLabelData, isDifferenceGreaterThanTwoWeeks } from './utils';
|
|
24
24
|
|
|
@@ -39,77 +39,33 @@ echarts.registerTheme('light_theme', getChartTheme(Theme.Light));
|
|
|
39
39
|
|
|
40
40
|
const Chart = ({ data }: ChartProps) => {
|
|
41
41
|
const { isDark } = useLayoutProvider();
|
|
42
|
-
const echartRef = useRef<BaseChartRef | null>(null);
|
|
43
42
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
dataZoom
|
|
54
|
-
// @ts-ignore
|
|
55
|
-
title: { text },
|
|
56
|
-
} = echartInstance.getOption();
|
|
57
|
-
|
|
58
|
-
const { start, end } = (
|
|
59
|
-
dataZoom as { start: number; end: number }[]
|
|
60
|
-
)[0];
|
|
61
|
-
const prevInterval = Number((text as string).split(',')[0]);
|
|
62
|
-
const prevIsGreaterThanTwoWeeks = Boolean(
|
|
63
|
-
Number((text as string).split(',')[1])
|
|
64
|
-
);
|
|
65
|
-
|
|
66
|
-
const visibleItemsCount = Math.round(
|
|
67
|
-
(data.xAxisData.length * (end - start)) / 100
|
|
68
|
-
);
|
|
69
|
-
|
|
70
|
-
const interval =
|
|
71
|
-
visibleItemsCount > MAX_LABELS_COUNT
|
|
72
|
-
? Math.floor(visibleItemsCount / MAX_LABELS_COUNT)
|
|
73
|
-
: 0;
|
|
74
|
-
|
|
75
|
-
if (interval !== prevInterval) {
|
|
76
|
-
echartInstance.setOption({
|
|
77
|
-
xAxis: {
|
|
78
|
-
axisLabel: {
|
|
79
|
-
interval,
|
|
80
|
-
},
|
|
81
|
-
},
|
|
82
|
-
});
|
|
83
|
-
}
|
|
43
|
+
return (
|
|
44
|
+
<BaseChart
|
|
45
|
+
chartHeight={CHART_HEIGHT}
|
|
46
|
+
echarts={echarts}
|
|
47
|
+
isDark={isDark}
|
|
48
|
+
lazyUpdate={true}
|
|
49
|
+
option={getOption(data, isDark)}
|
|
50
|
+
onEvents={{
|
|
51
|
+
datazoom: (_params: unknown, instance: EChartsType) => {
|
|
52
|
+
const { dataZoom } = instance.getOption();
|
|
84
53
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
);
|
|
54
|
+
const { startValue, endValue } = (
|
|
55
|
+
dataZoom as { startValue: number; endValue: number }[]
|
|
56
|
+
)[0];
|
|
89
57
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
58
|
+
const isGreaterThanTwoWeeks = isDifferenceGreaterThanTwoWeeks(
|
|
59
|
+
data.xAxisData[startValue],
|
|
60
|
+
data.xAxisData[endValue]
|
|
61
|
+
);
|
|
94
62
|
|
|
95
|
-
if (isGreaterThanTwoWeeks !== prevIsGreaterThanTwoWeeks) {
|
|
96
63
|
const labelsData = getLabelData({
|
|
97
64
|
xAxisData: data.xAxisData,
|
|
98
65
|
isGreaterThanTwoWeeks,
|
|
99
66
|
});
|
|
100
67
|
|
|
101
|
-
|
|
102
|
-
series: [
|
|
103
|
-
{
|
|
104
|
-
id: 'candlestick',
|
|
105
|
-
markPoint: {
|
|
106
|
-
data: labelsData,
|
|
107
|
-
},
|
|
108
|
-
},
|
|
109
|
-
],
|
|
110
|
-
});
|
|
111
|
-
|
|
112
|
-
echartInstance.setOption({
|
|
68
|
+
instance.setOption({
|
|
113
69
|
xAxis: {
|
|
114
70
|
axisLabel: {
|
|
115
71
|
formatter: (value: string) => {
|
|
@@ -125,31 +81,17 @@ const Chart = ({ data }: ChartProps) => {
|
|
|
125
81
|
},
|
|
126
82
|
},
|
|
127
83
|
},
|
|
84
|
+
series: [
|
|
85
|
+
{
|
|
86
|
+
id: 'candlestick',
|
|
87
|
+
markPoint: {
|
|
88
|
+
data: labelsData,
|
|
89
|
+
},
|
|
90
|
+
},
|
|
91
|
+
],
|
|
128
92
|
});
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
if (
|
|
132
|
-
interval !== prevInterval ||
|
|
133
|
-
isGreaterThanTwoWeeks !== prevIsGreaterThanTwoWeeks
|
|
134
|
-
) {
|
|
135
|
-
echartInstance.setOption({
|
|
136
|
-
title: {
|
|
137
|
-
text: `${interval},${isGreaterThanTwoWeeks ? 1 : 0}`,
|
|
138
|
-
},
|
|
139
|
-
});
|
|
140
|
-
}
|
|
141
|
-
});
|
|
142
|
-
}
|
|
143
|
-
}, [echartRef, isDark, data]);
|
|
144
|
-
|
|
145
|
-
return (
|
|
146
|
-
<BaseChart
|
|
147
|
-
ref={echartRef}
|
|
148
|
-
chartHeight={CHART_HEIGHT}
|
|
149
|
-
echarts={echarts}
|
|
150
|
-
isDark={isDark}
|
|
151
|
-
lazyUpdate={true}
|
|
152
|
-
option={getOption(data)}
|
|
93
|
+
},
|
|
94
|
+
}}
|
|
153
95
|
/>
|
|
154
96
|
);
|
|
155
97
|
};
|
|
@@ -1,8 +1,3 @@
|
|
|
1
|
-
import { useQuery } from '@apollo/client';
|
|
2
|
-
import type {
|
|
3
|
-
GetOrderPositionBooksQuery,
|
|
4
|
-
GetOrderPositionBooksQueryVariables,
|
|
5
|
-
} from '@oanda/labs-order-book-widget/src/gql/types/graphql';
|
|
6
1
|
import {
|
|
7
2
|
ChartError,
|
|
8
3
|
Size,
|
|
@@ -13,7 +8,6 @@ import {
|
|
|
13
8
|
import classnames from 'classnames';
|
|
14
9
|
import React, { useMemo } from 'react';
|
|
15
10
|
|
|
16
|
-
import { getOrderPositionBooks } from '../../../gql/getOrderPositionBooks';
|
|
17
11
|
import { Chart } from './Chart';
|
|
18
12
|
import type { ChartWithDataProps } from './types';
|
|
19
13
|
import { transformDataForChart } from './utils';
|
|
@@ -26,24 +20,13 @@ const ChartWithData = ({
|
|
|
26
20
|
const { size } = useLayoutProvider();
|
|
27
21
|
const isDesktop = size === Size.DESKTOP;
|
|
28
22
|
|
|
29
|
-
const
|
|
30
|
-
|
|
31
|
-
GetOrderPositionBooksQueryVariables
|
|
32
|
-
>(getOrderPositionBooks, {
|
|
33
|
-
variables: {
|
|
34
|
-
instrument,
|
|
35
|
-
bookType,
|
|
36
|
-
recentHours: 1,
|
|
37
|
-
},
|
|
38
|
-
fetchPolicy: 'network-only',
|
|
39
|
-
});
|
|
40
|
-
|
|
41
|
-
const isError = !!error;
|
|
23
|
+
const isError = false;
|
|
24
|
+
const loading = false;
|
|
42
25
|
|
|
43
26
|
const transformedData = useMemo(() => {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
}, [
|
|
27
|
+
return transformDataForChart({ granularity });
|
|
28
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
29
|
+
}, [instrument, granularity, bookType]);
|
|
47
30
|
|
|
48
31
|
return (
|
|
49
32
|
<>
|