@oanda/labs-crowd-view-widget 1.0.57 → 1.0.59
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 +476 -0
- package/dist/main/CrowdViewWidget/components/Chart/chartOptions/getYAxisConfig.js +2 -1
- package/dist/main/CrowdViewWidget/components/Chart/chartOptions/getYAxisConfig.js.map +1 -1
- package/dist/main/CrowdViewWidget/components/Chart/chartUtils/formatYAxisLabel.js +16 -0
- package/dist/main/CrowdViewWidget/components/Chart/chartUtils/formatYAxisLabel.js.map +1 -0
- package/dist/main/CrowdViewWidget/components/Chart/chartUtils/getTooltipFormatter.js +1 -1
- package/dist/main/CrowdViewWidget/components/Chart/chartUtils/getTooltipFormatter.js.map +1 -1
- package/dist/main/CrowdViewWidget/components/Chart/chartUtils/index.js +11 -0
- package/dist/main/CrowdViewWidget/components/Chart/chartUtils/index.js.map +1 -1
- package/dist/main/CrowdViewWidget/components/Chart/dataUtils/getBucketWidthMultiplayer.js +22 -0
- package/dist/main/CrowdViewWidget/components/Chart/dataUtils/getBucketWidthMultiplayer.js.map +1 -0
- package/dist/main/CrowdViewWidget/components/Chart/dataUtils/index.js +8 -8
- package/dist/main/CrowdViewWidget/components/Chart/dataUtils/index.js.map +1 -1
- package/dist/main/CrowdViewWidget/components/Chart/useCrowdViewData.js +11 -7
- package/dist/main/CrowdViewWidget/components/Chart/useCrowdViewData.js.map +1 -1
- package/dist/main/CrowdViewWidget/constants.js +4 -2
- package/dist/main/CrowdViewWidget/constants.js.map +1 -1
- package/dist/module/CrowdViewWidget/components/Chart/chartOptions/getYAxisConfig.js +2 -1
- package/dist/module/CrowdViewWidget/components/Chart/chartOptions/getYAxisConfig.js.map +1 -1
- package/dist/module/CrowdViewWidget/components/Chart/chartUtils/formatYAxisLabel.js +9 -0
- package/dist/module/CrowdViewWidget/components/Chart/chartUtils/formatYAxisLabel.js.map +1 -0
- package/dist/module/CrowdViewWidget/components/Chart/chartUtils/getTooltipFormatter.js +1 -1
- package/dist/module/CrowdViewWidget/components/Chart/chartUtils/getTooltipFormatter.js.map +1 -1
- package/dist/module/CrowdViewWidget/components/Chart/chartUtils/index.js +1 -0
- package/dist/module/CrowdViewWidget/components/Chart/chartUtils/index.js.map +1 -1
- package/dist/module/CrowdViewWidget/components/Chart/dataUtils/getBucketWidthMultiplayer.js +15 -0
- package/dist/module/CrowdViewWidget/components/Chart/dataUtils/getBucketWidthMultiplayer.js.map +1 -0
- package/dist/module/CrowdViewWidget/components/Chart/dataUtils/index.js +1 -1
- package/dist/module/CrowdViewWidget/components/Chart/dataUtils/index.js.map +1 -1
- package/dist/module/CrowdViewWidget/components/Chart/useCrowdViewData.js +13 -9
- package/dist/module/CrowdViewWidget/components/Chart/useCrowdViewData.js.map +1 -1
- package/dist/module/CrowdViewWidget/constants.js +3 -1
- package/dist/module/CrowdViewWidget/constants.js.map +1 -1
- package/dist/types/CrowdViewWidget/components/Chart/chartUtils/formatYAxisLabel.d.ts +1 -0
- package/dist/types/CrowdViewWidget/components/Chart/chartUtils/index.d.ts +1 -0
- package/dist/types/CrowdViewWidget/components/Chart/dataUtils/getBucketWidthMultiplayer.d.ts +8 -0
- package/dist/types/CrowdViewWidget/components/Chart/dataUtils/index.d.ts +1 -1
- package/dist/types/CrowdViewWidget/constants.d.ts +2 -0
- package/package.json +3 -3
- package/src/CrowdViewWidget/components/Chart/chartOptions/getYAxisConfig.ts +2 -1
- package/src/CrowdViewWidget/components/Chart/chartUtils/formatYAxisLabel.ts +13 -0
- package/src/CrowdViewWidget/components/Chart/chartUtils/getTooltipFormatter.ts +5 -4
- package/src/CrowdViewWidget/components/Chart/chartUtils/index.ts +1 -0
- package/src/CrowdViewWidget/components/Chart/dataUtils/getBucketWidthMultiplayer.ts +25 -0
- package/src/CrowdViewWidget/components/Chart/dataUtils/index.ts +1 -1
- package/src/CrowdViewWidget/components/Chart/useCrowdViewData.ts +17 -16
- package/src/CrowdViewWidget/constants.ts +3 -0
- package/test/components/Chart/dataUtils/getBucketWidthMultiplayer.test.ts +33 -0
- package/test/components/Chart/utils/chartUtils.test.ts +65 -0
- package/dist/main/CrowdViewWidget/components/Chart/dataUtils/getMultiplayerForTimeSpan.js +0 -19
- package/dist/main/CrowdViewWidget/components/Chart/dataUtils/getMultiplayerForTimeSpan.js.map +0 -1
- package/dist/module/CrowdViewWidget/components/Chart/dataUtils/getMultiplayerForTimeSpan.js +0 -12
- package/dist/module/CrowdViewWidget/components/Chart/dataUtils/getMultiplayerForTimeSpan.js.map +0 -1
- package/dist/types/CrowdViewWidget/components/Chart/dataUtils/getMultiplayerForTimeSpan.d.ts +0 -2
- package/src/CrowdViewWidget/components/Chart/dataUtils/getMultiplayerForTimeSpan.ts +0 -13
|
@@ -3,9 +3,9 @@ import { useMemo } from 'react';
|
|
|
3
3
|
import { getOrderPositionBooks } from '../../../gql/getOrderPositionBooks';
|
|
4
4
|
import { getPriceCandles } from '../../../gql/getPriceCandles';
|
|
5
5
|
import { getSentiments } from '../../../gql/getSentiments';
|
|
6
|
-
import {
|
|
6
|
+
import { DataSource } from '../../../gql/types/graphql';
|
|
7
7
|
import { BUCKET_CONFIG, INSTRUMENTS_CONFIG } from '../../constants';
|
|
8
|
-
import {
|
|
8
|
+
import { getBucketWidthMultiplayer, getTimeSpanForGranularity, processOrderPositionBooks, processPriceCandles, processSentiments, validateData } from './dataUtils';
|
|
9
9
|
export const useCrowdViewData = _ref => {
|
|
10
10
|
let {
|
|
11
11
|
instrument,
|
|
@@ -13,16 +13,15 @@ export const useCrowdViewData = _ref => {
|
|
|
13
13
|
division,
|
|
14
14
|
granularity
|
|
15
15
|
} = _ref;
|
|
16
|
-
const dataSource = division === Division.Ogm || division === Division.Oj ? DataSource.Mt5 : DataSource.V20;
|
|
17
16
|
const {
|
|
18
17
|
loading: priceCandlesLoading,
|
|
19
18
|
data: priceCandlesData,
|
|
20
19
|
error: priceCandlesError
|
|
21
20
|
} = useQuery(getPriceCandles, {
|
|
22
21
|
variables: {
|
|
23
|
-
dataSource,
|
|
22
|
+
dataSource: DataSource.V20,
|
|
24
23
|
division,
|
|
25
|
-
instrument:
|
|
24
|
+
instrument: INSTRUMENTS_CONFIG[instrument].v20name,
|
|
26
25
|
granularity,
|
|
27
26
|
timeSpan: getTimeSpanForGranularity(granularity)
|
|
28
27
|
},
|
|
@@ -39,6 +38,11 @@ export const useCrowdViewData = _ref => {
|
|
|
39
38
|
candlesHigh,
|
|
40
39
|
pipsLocation
|
|
41
40
|
} = useMemo(() => processPriceCandles(priceCandlesData), [priceCandlesData]);
|
|
41
|
+
const bucketWidthMultiplayer = useMemo(() => getBucketWidthMultiplayer({
|
|
42
|
+
minPrice,
|
|
43
|
+
maxPrice,
|
|
44
|
+
instrument
|
|
45
|
+
}), [minPrice, maxPrice, instrument]);
|
|
42
46
|
const {
|
|
43
47
|
loading: orderPositionLoading,
|
|
44
48
|
data: orderPositionData,
|
|
@@ -46,12 +50,12 @@ export const useCrowdViewData = _ref => {
|
|
|
46
50
|
} = useQuery(getOrderPositionBooks, {
|
|
47
51
|
variables: {
|
|
48
52
|
instrument: INSTRUMENTS_CONFIG[instrument].v20name,
|
|
49
|
-
bookType
|
|
53
|
+
bookType,
|
|
50
54
|
timeSpan: getTimeSpanForGranularity(granularity),
|
|
51
55
|
granularity,
|
|
52
56
|
maxBookPrice: maxPrice,
|
|
53
57
|
minBookPrice: minPrice,
|
|
54
|
-
bucketMultiplier:
|
|
58
|
+
bucketMultiplier: bucketWidthMultiplayer,
|
|
55
59
|
bucketMargin: BUCKET_CONFIG.PRICE_MARGIN_MULTIPLIER
|
|
56
60
|
},
|
|
57
61
|
fetchPolicy: 'no-cache',
|
|
@@ -117,7 +121,7 @@ export const useCrowdViewData = _ref => {
|
|
|
117
121
|
sentimentLongs
|
|
118
122
|
},
|
|
119
123
|
additionalData: {
|
|
120
|
-
bucketWidth: bucketWidth || INSTRUMENTS_CONFIG[instrument].defaultBucketWidth *
|
|
124
|
+
bucketWidth: bucketWidth || INSTRUMENTS_CONFIG[instrument].defaultBucketWidth * bucketWidthMultiplayer,
|
|
121
125
|
buckets,
|
|
122
126
|
displayPrecision: pipsLocation,
|
|
123
127
|
bookType,
|
|
@@ -125,7 +129,7 @@ export const useCrowdViewData = _ref => {
|
|
|
125
129
|
sentimentThresholdMax
|
|
126
130
|
}
|
|
127
131
|
};
|
|
128
|
-
}, [priceCandlesData, error, dates, candlesOpen, candlesClose, candlesLow, candlesHigh, bookPrices, bookIndexes, sentimentShorts, sentimentLongs, bucketWidth,
|
|
132
|
+
}, [priceCandlesData, error, dates, candlesOpen, candlesClose, candlesLow, candlesHigh, bookPrices, bookIndexes, sentimentShorts, sentimentLongs, bucketWidth, instrument, bucketWidthMultiplayer, buckets, pipsLocation, bookType, sentimentThresholdMin, sentimentThresholdMax]);
|
|
129
133
|
return {
|
|
130
134
|
mainData: data === null || data === void 0 ? void 0 : data.mainData,
|
|
131
135
|
additionalData: data === null || data === void 0 ? void 0 : data.additionalData,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useCrowdViewData.js","names":["useQuery","useMemo","getOrderPositionBooks","getPriceCandles","getSentiments","BookType","DataSource","Division","BUCKET_CONFIG","INSTRUMENTS_CONFIG","getMultiplayerForTimeSpan","getTimeSpanForGranularity","processOrderPositionBooks","processPriceCandles","processSentiments","validateData","useCrowdViewData","_ref","instrument","bookType","division","granularity","dataSource","Ogm","Oj","Mt5","V20","loading","priceCandlesLoading","data","priceCandlesData","error","priceCandlesError","variables","mt5name","v20name","timeSpan","fetchPolicy","minPrice","maxPrice","hasValidCandles","dates","candlesOpen","candlesClose","candlesLow","candlesHigh","pipsLocation","orderPositionLoading","orderPositionData","orderPositionError","Order","maxBookPrice","minBookPrice","bucketMultiplier","bucketMargin","PRICE_MARGIN_MULTIPLIER","skip","bookPrices","bookIndexes","buckets","bucketWidth","sentimentThresholdMin","sentimentThresholdMax","hasValidBooks","sentimentsLoading","sentimentsData","sentimentsError","sentimentLongs","sentimentShorts","hasValidSentiments","Error","concat","message","mainData","additionalData","defaultBucketWidth","displayPrecision"],"sources":["../../../../../src/CrowdViewWidget/components/Chart/useCrowdViewData.ts"],"sourcesContent":["import { useQuery } from '@apollo/client';\nimport { useMemo } from 'react';\n\nimport { getOrderPositionBooks } from '../../../gql/getOrderPositionBooks';\nimport { getPriceCandles } from '../../../gql/getPriceCandles';\nimport { getSentiments } from '../../../gql/getSentiments';\nimport type {\n GetOrderPositionBooksQuery,\n GetOrderPositionBooksQueryVariables,\n GetPriceCandlesQuery,\n GetPriceCandlesQueryVariables,\n GetSentimentsQuery,\n GetSentimentsQueryVariables,\n} from '../../../gql/types/graphql';\nimport { BookType, DataSource, Division } from '../../../gql/types/graphql';\nimport { BUCKET_CONFIG, INSTRUMENTS_CONFIG } from '../../constants';\nimport {\n getMultiplayerForTimeSpan,\n getTimeSpanForGranularity,\n processOrderPositionBooks,\n processPriceCandles,\n processSentiments,\n validateData,\n} from './dataUtils';\nimport type { UseCrowdViewDataProps, UseCrowdViewDataReturn } from './types';\n\nexport const useCrowdViewData = ({\n instrument,\n bookType,\n division,\n granularity,\n}: UseCrowdViewDataProps): UseCrowdViewDataReturn => {\n const dataSource =\n division === Division.Ogm || division === Division.Oj\n ? DataSource.Mt5\n : DataSource.V20;\n\n // Get price candles data\n const {\n loading: priceCandlesLoading,\n data: priceCandlesData,\n error: priceCandlesError,\n } = useQuery<GetPriceCandlesQuery, GetPriceCandlesQueryVariables>(\n getPriceCandles,\n {\n variables: {\n dataSource,\n division,\n instrument:\n dataSource === DataSource.Mt5\n ? INSTRUMENTS_CONFIG[instrument].mt5name\n : INSTRUMENTS_CONFIG[instrument].v20name,\n granularity,\n timeSpan: getTimeSpanForGranularity(granularity),\n },\n fetchPolicy: 'no-cache',\n }\n );\n\n const {\n minPrice,\n maxPrice,\n hasValidCandles,\n dates,\n candlesOpen,\n candlesClose,\n candlesLow,\n candlesHigh,\n pipsLocation,\n } = useMemo(() => processPriceCandles(priceCandlesData), [priceCandlesData]);\n\n // Get order position books data\n const {\n loading: orderPositionLoading,\n data: orderPositionData,\n error: orderPositionError,\n } = useQuery<GetOrderPositionBooksQuery, GetOrderPositionBooksQueryVariables>(\n getOrderPositionBooks,\n {\n variables: {\n instrument: INSTRUMENTS_CONFIG[instrument].v20name,\n bookType: bookType || BookType.Order,\n timeSpan: getTimeSpanForGranularity(granularity),\n granularity,\n maxBookPrice: maxPrice,\n minBookPrice: minPrice,\n bucketMultiplier: getMultiplayerForTimeSpan(granularity),\n bucketMargin: BUCKET_CONFIG.PRICE_MARGIN_MULTIPLIER,\n },\n fetchPolicy: 'no-cache',\n skip: priceCandlesLoading || !!priceCandlesError,\n }\n );\n\n const {\n bookPrices,\n bookIndexes,\n buckets,\n bucketWidth,\n sentimentThresholdMin,\n sentimentThresholdMax,\n hasValidBooks,\n } = useMemo(\n () => processOrderPositionBooks(orderPositionData, dates),\n [orderPositionData, dates]\n );\n\n // Get sentiments data\n const {\n loading: sentimentsLoading,\n data: sentimentsData,\n error: sentimentsError,\n } = useQuery<GetSentimentsQuery, GetSentimentsQueryVariables>(getSentiments, {\n variables: {\n instrument: INSTRUMENTS_CONFIG[instrument].v20name,\n granularity,\n timeSpan: getTimeSpanForGranularity(granularity),\n },\n fetchPolicy: 'no-cache',\n skip: priceCandlesLoading || !!priceCandlesError,\n });\n\n const { sentimentLongs, sentimentShorts, hasValidSentiments } = useMemo(\n () => processSentiments(sentimentsData, dates),\n [sentimentsData, dates]\n );\n\n // Gather all results\n const loading =\n priceCandlesLoading || orderPositionLoading || sentimentsLoading;\n\n const error = useMemo((): Error | null => {\n if (priceCandlesError) {\n return new Error(`Price candles error: ${priceCandlesError.message}`);\n }\n if (orderPositionError) {\n return new Error(`Order position error: ${orderPositionError.message}`);\n }\n if (sentimentsError) {\n return new Error(`Sentiments error: ${sentimentsError.message}`);\n }\n if (loading) {\n return null;\n }\n return validateData(\n priceCandlesData,\n orderPositionData,\n hasValidCandles,\n hasValidBooks,\n hasValidSentiments\n );\n }, [\n priceCandlesError,\n orderPositionError,\n sentimentsError,\n loading,\n priceCandlesData,\n orderPositionData,\n hasValidCandles,\n hasValidBooks,\n hasValidSentiments,\n ]);\n\n const data = useMemo(() => {\n if (!priceCandlesData || error) {\n return null;\n }\n\n return {\n mainData: {\n dates,\n candlesOpen,\n candlesClose,\n candlesLow,\n candlesHigh,\n bookPrices,\n bookIndexes,\n sentimentShorts,\n sentimentLongs,\n },\n additionalData: {\n bucketWidth:\n bucketWidth ||\n INSTRUMENTS_CONFIG[instrument].defaultBucketWidth *\n getMultiplayerForTimeSpan(granularity),\n buckets,\n displayPrecision: pipsLocation,\n bookType,\n sentimentThresholdMin,\n sentimentThresholdMax,\n },\n };\n }, [\n priceCandlesData,\n error,\n dates,\n candlesOpen,\n candlesClose,\n candlesLow,\n candlesHigh,\n bookPrices,\n bookIndexes,\n sentimentShorts,\n sentimentLongs,\n bucketWidth,\n granularity,\n instrument,\n buckets,\n pipsLocation,\n bookType,\n sentimentThresholdMin,\n sentimentThresholdMax,\n ]);\n\n return {\n mainData: data?.mainData,\n additionalData: data?.additionalData,\n priceCandlesLoading,\n orderPositionLoading,\n sentimentsLoading,\n loading,\n error: !!error,\n };\n};\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"useCrowdViewData.js","names":["useQuery","useMemo","getOrderPositionBooks","getPriceCandles","getSentiments","DataSource","BUCKET_CONFIG","INSTRUMENTS_CONFIG","getBucketWidthMultiplayer","getTimeSpanForGranularity","processOrderPositionBooks","processPriceCandles","processSentiments","validateData","useCrowdViewData","_ref","instrument","bookType","division","granularity","loading","priceCandlesLoading","data","priceCandlesData","error","priceCandlesError","variables","dataSource","V20","v20name","timeSpan","fetchPolicy","minPrice","maxPrice","hasValidCandles","dates","candlesOpen","candlesClose","candlesLow","candlesHigh","pipsLocation","bucketWidthMultiplayer","orderPositionLoading","orderPositionData","orderPositionError","maxBookPrice","minBookPrice","bucketMultiplier","bucketMargin","PRICE_MARGIN_MULTIPLIER","skip","bookPrices","bookIndexes","buckets","bucketWidth","sentimentThresholdMin","sentimentThresholdMax","hasValidBooks","sentimentsLoading","sentimentsData","sentimentsError","sentimentLongs","sentimentShorts","hasValidSentiments","Error","concat","message","mainData","additionalData","defaultBucketWidth","displayPrecision"],"sources":["../../../../../src/CrowdViewWidget/components/Chart/useCrowdViewData.ts"],"sourcesContent":["import { useQuery } from '@apollo/client';\nimport { useMemo } from 'react';\n\nimport { getOrderPositionBooks } from '../../../gql/getOrderPositionBooks';\nimport { getPriceCandles } from '../../../gql/getPriceCandles';\nimport { getSentiments } from '../../../gql/getSentiments';\nimport type {\n GetOrderPositionBooksQuery,\n GetOrderPositionBooksQueryVariables,\n GetPriceCandlesQuery,\n GetPriceCandlesQueryVariables,\n GetSentimentsQuery,\n GetSentimentsQueryVariables,\n} from '../../../gql/types/graphql';\nimport { DataSource } from '../../../gql/types/graphql';\nimport { BUCKET_CONFIG, INSTRUMENTS_CONFIG } from '../../constants';\nimport {\n getBucketWidthMultiplayer,\n getTimeSpanForGranularity,\n processOrderPositionBooks,\n processPriceCandles,\n processSentiments,\n validateData,\n} from './dataUtils';\nimport type { UseCrowdViewDataProps, UseCrowdViewDataReturn } from './types';\n\nexport const useCrowdViewData = ({\n instrument,\n bookType,\n division,\n granularity,\n}: UseCrowdViewDataProps): UseCrowdViewDataReturn => {\n // Get price candles data\n const {\n loading: priceCandlesLoading,\n data: priceCandlesData,\n error: priceCandlesError,\n } = useQuery<GetPriceCandlesQuery, GetPriceCandlesQueryVariables>(\n getPriceCandles,\n {\n variables: {\n dataSource: DataSource.V20,\n division,\n instrument: INSTRUMENTS_CONFIG[instrument].v20name,\n granularity,\n timeSpan: getTimeSpanForGranularity(granularity),\n },\n fetchPolicy: 'no-cache',\n }\n );\n\n const {\n minPrice,\n maxPrice,\n hasValidCandles,\n dates,\n candlesOpen,\n candlesClose,\n candlesLow,\n candlesHigh,\n pipsLocation,\n } = useMemo(() => processPriceCandles(priceCandlesData), [priceCandlesData]);\n\n const bucketWidthMultiplayer = useMemo(\n () =>\n getBucketWidthMultiplayer({\n minPrice,\n maxPrice,\n instrument,\n }),\n [minPrice, maxPrice, instrument]\n );\n // Get order position books data\n const {\n loading: orderPositionLoading,\n data: orderPositionData,\n error: orderPositionError,\n } = useQuery<GetOrderPositionBooksQuery, GetOrderPositionBooksQueryVariables>(\n getOrderPositionBooks,\n {\n variables: {\n instrument: INSTRUMENTS_CONFIG[instrument].v20name,\n bookType,\n timeSpan: getTimeSpanForGranularity(granularity),\n granularity,\n maxBookPrice: maxPrice,\n minBookPrice: minPrice,\n bucketMultiplier: bucketWidthMultiplayer,\n bucketMargin: BUCKET_CONFIG.PRICE_MARGIN_MULTIPLIER,\n },\n fetchPolicy: 'no-cache',\n skip: priceCandlesLoading || !!priceCandlesError,\n }\n );\n\n const {\n bookPrices,\n bookIndexes,\n buckets,\n bucketWidth,\n sentimentThresholdMin,\n sentimentThresholdMax,\n hasValidBooks,\n } = useMemo(\n () => processOrderPositionBooks(orderPositionData, dates),\n [orderPositionData, dates]\n );\n\n // Get sentiments data\n const {\n loading: sentimentsLoading,\n data: sentimentsData,\n error: sentimentsError,\n } = useQuery<GetSentimentsQuery, GetSentimentsQueryVariables>(getSentiments, {\n variables: {\n instrument: INSTRUMENTS_CONFIG[instrument].v20name,\n granularity,\n timeSpan: getTimeSpanForGranularity(granularity),\n },\n fetchPolicy: 'no-cache',\n skip: priceCandlesLoading || !!priceCandlesError,\n });\n\n const { sentimentLongs, sentimentShorts, hasValidSentiments } = useMemo(\n () => processSentiments(sentimentsData, dates),\n [sentimentsData, dates]\n );\n\n // Gather all results\n const loading =\n priceCandlesLoading || orderPositionLoading || sentimentsLoading;\n\n const error = useMemo((): Error | null => {\n if (priceCandlesError) {\n return new Error(`Price candles error: ${priceCandlesError.message}`);\n }\n if (orderPositionError) {\n return new Error(`Order position error: ${orderPositionError.message}`);\n }\n if (sentimentsError) {\n return new Error(`Sentiments error: ${sentimentsError.message}`);\n }\n if (loading) {\n return null;\n }\n return validateData(\n priceCandlesData,\n orderPositionData,\n hasValidCandles,\n hasValidBooks,\n hasValidSentiments\n );\n }, [\n priceCandlesError,\n orderPositionError,\n sentimentsError,\n loading,\n priceCandlesData,\n orderPositionData,\n hasValidCandles,\n hasValidBooks,\n hasValidSentiments,\n ]);\n\n const data = useMemo(() => {\n if (!priceCandlesData || error) {\n return null;\n }\n\n return {\n mainData: {\n dates,\n candlesOpen,\n candlesClose,\n candlesLow,\n candlesHigh,\n bookPrices,\n bookIndexes,\n sentimentShorts,\n sentimentLongs,\n },\n additionalData: {\n bucketWidth:\n bucketWidth ||\n INSTRUMENTS_CONFIG[instrument].defaultBucketWidth *\n bucketWidthMultiplayer,\n buckets,\n displayPrecision: pipsLocation,\n bookType,\n sentimentThresholdMin,\n sentimentThresholdMax,\n },\n };\n }, [\n priceCandlesData,\n error,\n dates,\n candlesOpen,\n candlesClose,\n candlesLow,\n candlesHigh,\n bookPrices,\n bookIndexes,\n sentimentShorts,\n sentimentLongs,\n bucketWidth,\n instrument,\n bucketWidthMultiplayer,\n buckets,\n pipsLocation,\n bookType,\n sentimentThresholdMin,\n sentimentThresholdMax,\n ]);\n\n return {\n mainData: data?.mainData,\n additionalData: data?.additionalData,\n priceCandlesLoading,\n orderPositionLoading,\n sentimentsLoading,\n loading,\n error: !!error,\n };\n};\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -16,6 +16,7 @@ export const BUCKET_CONFIG = {
|
|
|
16
16
|
export const TIME_THRESHOLDS = {
|
|
17
17
|
TWO_WEEKS_MS: 14 * 24 * 60 * 60 * 1000
|
|
18
18
|
};
|
|
19
|
+
export const DISPLAYED_BUCKETS_COUNT = 40;
|
|
19
20
|
const CHART_CONFIG_STATIC = {
|
|
20
21
|
MAIN_HEIGHT_DESKTOP: 410,
|
|
21
22
|
MAIN_HEIGHT_MOBILE: 330,
|
|
@@ -37,7 +38,8 @@ const CHART_CONFIG_STATIC = {
|
|
|
37
38
|
TOP_LABEL_SPACE_MOBILE: 24,
|
|
38
39
|
TOOLTIP_HEIGHT_MOBILE: 85,
|
|
39
40
|
TOOLTIP_HEIGHT_DESKTOP: 46,
|
|
40
|
-
TOOLTIP_OFFSET: 8
|
|
41
|
+
TOOLTIP_OFFSET: 8,
|
|
42
|
+
TARGET_DIGIT_COUNT: 5
|
|
41
43
|
};
|
|
42
44
|
const CHART_CONFIG_CALCULATED = {
|
|
43
45
|
HEIGHT_DESKTOP: CHART_CONFIG_STATIC.MAIN_HEIGHT_DESKTOP + CHART_CONFIG_STATIC.TOP_LABEL_SPACE_DESKTOP + CHART_CONFIG_STATIC.X_LABEL_SIZE + CHART_CONFIG_STATIC.TOOLTIP_HEIGHT_DESKTOP,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","names":["colorPalette","chroma","InstrumentId","BUCKET_CONFIG","MULTIPLIER_5M","MULTIPLIER_15M","MULTIPLIER_1H","MULTIPLIER_4H","PRICE_MARGIN_MULTIPLIER","TIME_THRESHOLDS","TWO_WEEKS_MS","CHART_CONFIG_STATIC","MAIN_HEIGHT_DESKTOP","MAIN_HEIGHT_MOBILE","MARGIN_BETWEEN","SENTIMENT_HEIGHT","WIDTH","X_LABEL_SIZE","Y_LABEL_SIZE_DESKTOP","Y_LABEL_SIZE_MOBILE","Y_SENTIMENT_LABEL_DESKTOP_SIZE","Y_SENTIMENT_LABEL_MOBILE_SIZE","INITIAL_START_ZOOM_DESKTOP","INITIAL_START_ZOOM_MOBILE","INITIAL_END_ZOOM","X_AXIS_DATE_PADDING","SENTIMENT_MIN","SENTIMENT_MAX","TOP_LABEL_SPACE_DESKTOP","TOP_LABEL_SPACE_MOBILE","TOOLTIP_HEIGHT_MOBILE","TOOLTIP_HEIGHT_DESKTOP","TOOLTIP_OFFSET","CHART_CONFIG_CALCULATED","HEIGHT_DESKTOP","HEIGHT_MOBILE","CHART_CONFIG","_objectSpread","COLOR_MAP","dark","long","darkBlue10","shade","hex","darkBlue90","short","darkYellow10","darkYellow90","backgroundColor","black","light","lightBlue10","tint","lightBlue90","lightYellow10","lightYellow90","white","INSTRUMENTS_CONFIG","EUR_AUD","mt5name","v20name","precision","defaultBucketWidth","EUR_GBP","EUR_JPY","EUR_USD","EUR_CHF","USD_CHF","USD_JPY","USD_CAD","GBP_USD","GBP_JPY","GBP_CHF","AUD_JPY","AUD_USD","NZD_USD","XAU_USD","XAG_USD"],"sources":["../../../src/CrowdViewWidget/constants.ts"],"sourcesContent":["import { colorPalette } from '@oanda/labs-widget-common';\nimport chroma from 'chroma-js';\n\nimport { InstrumentId } from './types';\n\nexport const BUCKET_CONFIG = {\n MULTIPLIER_5M: 1,\n MULTIPLIER_15M: 1,\n MULTIPLIER_1H: 2,\n MULTIPLIER_4H: 4,\n PRICE_MARGIN_MULTIPLIER: 2,\n} as const;\n\nexport const TIME_THRESHOLDS = {\n TWO_WEEKS_MS: 14 * 24 * 60 * 60 * 1000,\n} as const;\n\nconst CHART_CONFIG_STATIC = {\n MAIN_HEIGHT_DESKTOP: 410,\n MAIN_HEIGHT_MOBILE: 330,\n MARGIN_BETWEEN: 50,\n SENTIMENT_HEIGHT: 120,\n WIDTH: 9999,\n X_LABEL_SIZE: 40,\n Y_LABEL_SIZE_DESKTOP: 50,\n Y_LABEL_SIZE_MOBILE: 40,\n Y_SENTIMENT_LABEL_DESKTOP_SIZE: 40,\n Y_SENTIMENT_LABEL_MOBILE_SIZE: 30,\n INITIAL_START_ZOOM_DESKTOP: 70,\n INITIAL_START_ZOOM_MOBILE: 85,\n INITIAL_END_ZOOM: 100,\n X_AXIS_DATE_PADDING: ' ',\n SENTIMENT_MIN: 0,\n SENTIMENT_MAX: 100,\n TOP_LABEL_SPACE_DESKTOP: 0,\n TOP_LABEL_SPACE_MOBILE: 24,\n TOOLTIP_HEIGHT_MOBILE: 85,\n TOOLTIP_HEIGHT_DESKTOP: 46,\n TOOLTIP_OFFSET: 8,\n};\n\nconst CHART_CONFIG_CALCULATED = {\n HEIGHT_DESKTOP:\n CHART_CONFIG_STATIC.MAIN_HEIGHT_DESKTOP +\n CHART_CONFIG_STATIC.TOP_LABEL_SPACE_DESKTOP +\n CHART_CONFIG_STATIC.X_LABEL_SIZE +\n CHART_CONFIG_STATIC.TOOLTIP_HEIGHT_DESKTOP,\n HEIGHT_MOBILE:\n CHART_CONFIG_STATIC.MAIN_HEIGHT_MOBILE +\n CHART_CONFIG_STATIC.X_LABEL_SIZE +\n CHART_CONFIG_STATIC.TOP_LABEL_SPACE_MOBILE +\n CHART_CONFIG_STATIC.TOOLTIP_HEIGHT_MOBILE,\n};\nexport const CHART_CONFIG = {\n ...CHART_CONFIG_STATIC,\n ...CHART_CONFIG_CALCULATED,\n} as const;\n\nexport const COLOR_MAP = {\n dark: {\n long: [\n chroma(colorPalette.darkBlue10).shade(0.5).hex(),\n chroma(colorPalette.darkBlue90).shade(0.5).hex(),\n ],\n short: [\n chroma(colorPalette.darkYellow10).shade(0.5).hex(),\n chroma(colorPalette.darkYellow90).shade(0.5).hex(),\n ],\n backgroundColor: colorPalette.black,\n },\n light: {\n long: [\n chroma(colorPalette.lightBlue10).tint(0.5).hex(),\n chroma(colorPalette.lightBlue90).tint(0.5).hex(),\n ],\n short: [\n chroma(colorPalette.lightYellow10).tint(0.5).hex(),\n chroma(colorPalette.lightYellow90).tint(0.5).hex(),\n ],\n backgroundColor: colorPalette.white,\n },\n} as const;\n\nexport const INSTRUMENTS_CONFIG: Record<\n InstrumentId,\n {\n precision: number;\n defaultBucketWidth: number;\n v20name: string;\n mt5name: string;\n }\n> = {\n [InstrumentId.EUR_AUD]: {\n mt5name: 'EURAUD',\n v20name: 'EUR_AUD',\n precision: 5,\n defaultBucketWidth: 0.0005,\n },\n [InstrumentId.EUR_GBP]: {\n mt5name: 'EURGBP',\n v20name: 'EUR_GBP',\n precision: 5,\n defaultBucketWidth: 0.0005,\n },\n [InstrumentId.EUR_JPY]: {\n mt5name: 'EURJPY',\n v20name: 'EUR_JPY',\n precision: 3,\n defaultBucketWidth: 0.05,\n },\n [InstrumentId.EUR_USD]: {\n mt5name: 'EURUSD',\n v20name: 'EUR_USD',\n precision: 5,\n defaultBucketWidth: 0.0005,\n },\n [InstrumentId.EUR_CHF]: {\n mt5name: 'EURCHF',\n v20name: 'EUR_CHF',\n precision: 5,\n defaultBucketWidth: 0.0005,\n },\n [InstrumentId.USD_CHF]: {\n mt5name: 'USDCHF',\n v20name: 'USD_CHF',\n precision: 5,\n defaultBucketWidth: 0.0005,\n },\n [InstrumentId.USD_JPY]: {\n mt5name: 'USDJPY',\n v20name: 'USD_JPY',\n precision: 3,\n defaultBucketWidth: 0.05,\n },\n [InstrumentId.USD_CAD]: {\n mt5name: 'USDCAD',\n v20name: 'USD_CAD',\n precision: 5,\n defaultBucketWidth: 0.0005,\n },\n [InstrumentId.GBP_USD]: {\n mt5name: 'GBPUSD',\n v20name: 'GBP_USD',\n precision: 5,\n defaultBucketWidth: 0.0005,\n },\n [InstrumentId.GBP_JPY]: {\n mt5name: 'GBPJPY',\n v20name: 'GBP_JPY',\n precision: 3,\n defaultBucketWidth: 0.05,\n },\n [InstrumentId.GBP_CHF]: {\n mt5name: 'GBPCHF',\n v20name: 'GBP_CHF',\n precision: 5,\n defaultBucketWidth: 0.0005,\n },\n [InstrumentId.AUD_JPY]: {\n mt5name: 'AUDJPY',\n v20name: 'AUD_JPY',\n precision: 3,\n defaultBucketWidth: 0.05,\n },\n [InstrumentId.AUD_USD]: {\n mt5name: 'AUDUSD',\n v20name: 'AUD_USD',\n precision: 5,\n defaultBucketWidth: 0.0005,\n },\n [InstrumentId.NZD_USD]: {\n mt5name: 'NZDUSD',\n v20name: 'NZD_USD',\n precision: 5,\n defaultBucketWidth: 0.0005,\n },\n [InstrumentId.XAU_USD]: {\n mt5name: 'XAUUSD',\n v20name: 'XAU_USD',\n precision: 3,\n defaultBucketWidth: 0.5,\n },\n [InstrumentId.XAG_USD]: {\n mt5name: 'XAGUSD',\n v20name: 'XAG_USD',\n precision: 5,\n defaultBucketWidth: 0.0005,\n },\n};\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"constants.js","names":["colorPalette","chroma","InstrumentId","BUCKET_CONFIG","MULTIPLIER_5M","MULTIPLIER_15M","MULTIPLIER_1H","MULTIPLIER_4H","PRICE_MARGIN_MULTIPLIER","TIME_THRESHOLDS","TWO_WEEKS_MS","DISPLAYED_BUCKETS_COUNT","CHART_CONFIG_STATIC","MAIN_HEIGHT_DESKTOP","MAIN_HEIGHT_MOBILE","MARGIN_BETWEEN","SENTIMENT_HEIGHT","WIDTH","X_LABEL_SIZE","Y_LABEL_SIZE_DESKTOP","Y_LABEL_SIZE_MOBILE","Y_SENTIMENT_LABEL_DESKTOP_SIZE","Y_SENTIMENT_LABEL_MOBILE_SIZE","INITIAL_START_ZOOM_DESKTOP","INITIAL_START_ZOOM_MOBILE","INITIAL_END_ZOOM","X_AXIS_DATE_PADDING","SENTIMENT_MIN","SENTIMENT_MAX","TOP_LABEL_SPACE_DESKTOP","TOP_LABEL_SPACE_MOBILE","TOOLTIP_HEIGHT_MOBILE","TOOLTIP_HEIGHT_DESKTOP","TOOLTIP_OFFSET","TARGET_DIGIT_COUNT","CHART_CONFIG_CALCULATED","HEIGHT_DESKTOP","HEIGHT_MOBILE","CHART_CONFIG","_objectSpread","COLOR_MAP","dark","long","darkBlue10","shade","hex","darkBlue90","short","darkYellow10","darkYellow90","backgroundColor","black","light","lightBlue10","tint","lightBlue90","lightYellow10","lightYellow90","white","INSTRUMENTS_CONFIG","EUR_AUD","mt5name","v20name","precision","defaultBucketWidth","EUR_GBP","EUR_JPY","EUR_USD","EUR_CHF","USD_CHF","USD_JPY","USD_CAD","GBP_USD","GBP_JPY","GBP_CHF","AUD_JPY","AUD_USD","NZD_USD","XAU_USD","XAG_USD"],"sources":["../../../src/CrowdViewWidget/constants.ts"],"sourcesContent":["import { colorPalette } from '@oanda/labs-widget-common';\nimport chroma from 'chroma-js';\n\nimport { InstrumentId } from './types';\n\nexport const BUCKET_CONFIG = {\n MULTIPLIER_5M: 1,\n MULTIPLIER_15M: 1,\n MULTIPLIER_1H: 2,\n MULTIPLIER_4H: 4,\n PRICE_MARGIN_MULTIPLIER: 2,\n} as const;\n\nexport const TIME_THRESHOLDS = {\n TWO_WEEKS_MS: 14 * 24 * 60 * 60 * 1000,\n} as const;\n\nexport const DISPLAYED_BUCKETS_COUNT = 40;\n\nconst CHART_CONFIG_STATIC = {\n MAIN_HEIGHT_DESKTOP: 410,\n MAIN_HEIGHT_MOBILE: 330,\n MARGIN_BETWEEN: 50,\n SENTIMENT_HEIGHT: 120,\n WIDTH: 9999,\n X_LABEL_SIZE: 40,\n Y_LABEL_SIZE_DESKTOP: 50,\n Y_LABEL_SIZE_MOBILE: 40,\n Y_SENTIMENT_LABEL_DESKTOP_SIZE: 40,\n Y_SENTIMENT_LABEL_MOBILE_SIZE: 30,\n INITIAL_START_ZOOM_DESKTOP: 70,\n INITIAL_START_ZOOM_MOBILE: 85,\n INITIAL_END_ZOOM: 100,\n X_AXIS_DATE_PADDING: ' ',\n SENTIMENT_MIN: 0,\n SENTIMENT_MAX: 100,\n TOP_LABEL_SPACE_DESKTOP: 0,\n TOP_LABEL_SPACE_MOBILE: 24,\n TOOLTIP_HEIGHT_MOBILE: 85,\n TOOLTIP_HEIGHT_DESKTOP: 46,\n TOOLTIP_OFFSET: 8,\n TARGET_DIGIT_COUNT: 5,\n};\n\nconst CHART_CONFIG_CALCULATED = {\n HEIGHT_DESKTOP:\n CHART_CONFIG_STATIC.MAIN_HEIGHT_DESKTOP +\n CHART_CONFIG_STATIC.TOP_LABEL_SPACE_DESKTOP +\n CHART_CONFIG_STATIC.X_LABEL_SIZE +\n CHART_CONFIG_STATIC.TOOLTIP_HEIGHT_DESKTOP,\n HEIGHT_MOBILE:\n CHART_CONFIG_STATIC.MAIN_HEIGHT_MOBILE +\n CHART_CONFIG_STATIC.X_LABEL_SIZE +\n CHART_CONFIG_STATIC.TOP_LABEL_SPACE_MOBILE +\n CHART_CONFIG_STATIC.TOOLTIP_HEIGHT_MOBILE,\n};\nexport const CHART_CONFIG = {\n ...CHART_CONFIG_STATIC,\n ...CHART_CONFIG_CALCULATED,\n} as const;\n\nexport const COLOR_MAP = {\n dark: {\n long: [\n chroma(colorPalette.darkBlue10).shade(0.5).hex(),\n chroma(colorPalette.darkBlue90).shade(0.5).hex(),\n ],\n short: [\n chroma(colorPalette.darkYellow10).shade(0.5).hex(),\n chroma(colorPalette.darkYellow90).shade(0.5).hex(),\n ],\n backgroundColor: colorPalette.black,\n },\n light: {\n long: [\n chroma(colorPalette.lightBlue10).tint(0.5).hex(),\n chroma(colorPalette.lightBlue90).tint(0.5).hex(),\n ],\n short: [\n chroma(colorPalette.lightYellow10).tint(0.5).hex(),\n chroma(colorPalette.lightYellow90).tint(0.5).hex(),\n ],\n backgroundColor: colorPalette.white,\n },\n} as const;\n\nexport const INSTRUMENTS_CONFIG: Record<\n InstrumentId,\n {\n precision: number;\n defaultBucketWidth: number;\n v20name: string;\n mt5name: string;\n }\n> = {\n [InstrumentId.EUR_AUD]: {\n mt5name: 'EURAUD',\n v20name: 'EUR_AUD',\n precision: 5,\n defaultBucketWidth: 0.0005,\n },\n [InstrumentId.EUR_GBP]: {\n mt5name: 'EURGBP',\n v20name: 'EUR_GBP',\n precision: 5,\n defaultBucketWidth: 0.0005,\n },\n [InstrumentId.EUR_JPY]: {\n mt5name: 'EURJPY',\n v20name: 'EUR_JPY',\n precision: 3,\n defaultBucketWidth: 0.05,\n },\n [InstrumentId.EUR_USD]: {\n mt5name: 'EURUSD',\n v20name: 'EUR_USD',\n precision: 5,\n defaultBucketWidth: 0.0005,\n },\n [InstrumentId.EUR_CHF]: {\n mt5name: 'EURCHF',\n v20name: 'EUR_CHF',\n precision: 5,\n defaultBucketWidth: 0.0005,\n },\n [InstrumentId.USD_CHF]: {\n mt5name: 'USDCHF',\n v20name: 'USD_CHF',\n precision: 5,\n defaultBucketWidth: 0.0005,\n },\n [InstrumentId.USD_JPY]: {\n mt5name: 'USDJPY',\n v20name: 'USD_JPY',\n precision: 3,\n defaultBucketWidth: 0.05,\n },\n [InstrumentId.USD_CAD]: {\n mt5name: 'USDCAD',\n v20name: 'USD_CAD',\n precision: 5,\n defaultBucketWidth: 0.0005,\n },\n [InstrumentId.GBP_USD]: {\n mt5name: 'GBPUSD',\n v20name: 'GBP_USD',\n precision: 5,\n defaultBucketWidth: 0.0005,\n },\n [InstrumentId.GBP_JPY]: {\n mt5name: 'GBPJPY',\n v20name: 'GBP_JPY',\n precision: 3,\n defaultBucketWidth: 0.05,\n },\n [InstrumentId.GBP_CHF]: {\n mt5name: 'GBPCHF',\n v20name: 'GBP_CHF',\n precision: 5,\n defaultBucketWidth: 0.0005,\n },\n [InstrumentId.AUD_JPY]: {\n mt5name: 'AUDJPY',\n v20name: 'AUD_JPY',\n precision: 3,\n defaultBucketWidth: 0.05,\n },\n [InstrumentId.AUD_USD]: {\n mt5name: 'AUDUSD',\n v20name: 'AUD_USD',\n precision: 5,\n defaultBucketWidth: 0.0005,\n },\n [InstrumentId.NZD_USD]: {\n mt5name: 'NZDUSD',\n v20name: 'NZD_USD',\n precision: 5,\n defaultBucketWidth: 0.0005,\n },\n [InstrumentId.XAU_USD]: {\n mt5name: 'XAUUSD',\n v20name: 'XAU_USD',\n precision: 3,\n defaultBucketWidth: 0.5,\n },\n [InstrumentId.XAG_USD]: {\n mt5name: 'XAGUSD',\n v20name: 'XAG_USD',\n precision: 5,\n defaultBucketWidth: 0.0005,\n },\n};\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const formatYAxisLabel: (value: number) => string;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { InstrumentId } from '../../../types';
|
|
2
|
+
interface GetBucketWidthMultiplayerParams {
|
|
3
|
+
minPrice: number;
|
|
4
|
+
maxPrice: number;
|
|
5
|
+
instrument: InstrumentId;
|
|
6
|
+
}
|
|
7
|
+
export declare const getBucketWidthMultiplayer: ({ minPrice, maxPrice, instrument, }: GetBucketWidthMultiplayerParams) => number;
|
|
8
|
+
export {};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
+
export * from './getBucketWidthMultiplayer';
|
|
1
2
|
export * from './getInstrumentConfigForDivision';
|
|
2
|
-
export * from './getMultiplayerForTimeSpan';
|
|
3
3
|
export * from './getTimeSpanForGranularity';
|
|
4
4
|
export * from './processOrderPositionBooks';
|
|
5
5
|
export * from './processPriceCandles';
|
|
@@ -9,6 +9,7 @@ export declare const BUCKET_CONFIG: {
|
|
|
9
9
|
export declare const TIME_THRESHOLDS: {
|
|
10
10
|
readonly TWO_WEEKS_MS: number;
|
|
11
11
|
};
|
|
12
|
+
export declare const DISPLAYED_BUCKETS_COUNT = 40;
|
|
12
13
|
export declare const CHART_CONFIG: {
|
|
13
14
|
readonly HEIGHT_DESKTOP: number;
|
|
14
15
|
readonly HEIGHT_MOBILE: number;
|
|
@@ -33,6 +34,7 @@ export declare const CHART_CONFIG: {
|
|
|
33
34
|
readonly TOOLTIP_HEIGHT_MOBILE: number;
|
|
34
35
|
readonly TOOLTIP_HEIGHT_DESKTOP: number;
|
|
35
36
|
readonly TOOLTIP_OFFSET: number;
|
|
37
|
+
readonly TARGET_DIGIT_COUNT: number;
|
|
36
38
|
};
|
|
37
39
|
export declare const COLOR_MAP: {
|
|
38
40
|
readonly dark: {
|
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.59",
|
|
4
4
|
"description": "Labs Crowd View Widget",
|
|
5
5
|
"main": "dist/main/index.js",
|
|
6
6
|
"module": "dist/module/index.js",
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"author": "OANDA",
|
|
14
14
|
"license": "UNLICENSED",
|
|
15
15
|
"dependencies": {
|
|
16
|
-
"@oanda/labs-widget-common": "^1.0.
|
|
16
|
+
"@oanda/labs-widget-common": "^1.0.241",
|
|
17
17
|
"@oanda/mono-i18n": "10.0.1",
|
|
18
18
|
"chroma-js": "^3.1.2",
|
|
19
19
|
"decimal.js": "^10.6.0",
|
|
@@ -24,5 +24,5 @@
|
|
|
24
24
|
"@graphql-codegen/client-preset": "4.1.0",
|
|
25
25
|
"@types/chroma-js": "^3.1.2"
|
|
26
26
|
},
|
|
27
|
-
"gitHead": "
|
|
27
|
+
"gitHead": "1a8471ad158713f1ee4e6fdde61ac31416d8f34d"
|
|
28
28
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { YAXisComponentOption } from 'echarts';
|
|
2
2
|
|
|
3
3
|
import { CHART_CONFIG } from '../../../constants';
|
|
4
|
+
import { formatYAxisLabel } from '../chartUtils';
|
|
4
5
|
|
|
5
6
|
interface GetYAxisConfigParams {
|
|
6
7
|
bucketWidth: number;
|
|
@@ -33,7 +34,7 @@ export const getYAxisConfig = ({
|
|
|
33
34
|
margin: 4,
|
|
34
35
|
verticalAlignMinLabel: 'bottom',
|
|
35
36
|
verticalAlignMaxLabel: 'top',
|
|
36
|
-
formatter:
|
|
37
|
+
formatter: formatYAxisLabel,
|
|
37
38
|
},
|
|
38
39
|
axisPointer: {
|
|
39
40
|
label: {
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { CHART_CONFIG } from '../../../constants';
|
|
2
|
+
|
|
3
|
+
export const formatYAxisLabel = (value: number): string => {
|
|
4
|
+
const absValue = Math.abs(value);
|
|
5
|
+
const integerPart = Math.floor(absValue);
|
|
6
|
+
const integerDigits =
|
|
7
|
+
integerPart === 0 ? 1 : Math.floor(Math.log10(integerPart)) + 1;
|
|
8
|
+
const axisLabelDisplayPrecision = Math.max(
|
|
9
|
+
0,
|
|
10
|
+
CHART_CONFIG.TARGET_DIGIT_COUNT - integerDigits
|
|
11
|
+
);
|
|
12
|
+
return value.toFixed(axisLabelDisplayPrecision);
|
|
13
|
+
};
|
|
@@ -70,15 +70,16 @@ const formatCandleData = (
|
|
|
70
70
|
? `<div><b>${candleLabel}:</b></div>
|
|
71
71
|
<div style="display: flex; gap: 4px; margin-right: 4px;">
|
|
72
72
|
<div>${openLabel}: ${open} </div>
|
|
73
|
-
<div>${closeLabel}: ${close} </div>
|
|
74
|
-
<div>${lowLabel}: ${low} </div>
|
|
75
73
|
<div>${highLabel}: ${high} </div>
|
|
74
|
+
<div>${lowLabel}: ${low} </div>
|
|
75
|
+
<div>${closeLabel}: ${close} </div>
|
|
76
76
|
</div>`
|
|
77
77
|
: `<div><b>${candleLabel}:</b></div>
|
|
78
78
|
<div>${openLabel}: ${open} </div>
|
|
79
|
-
<div>${
|
|
79
|
+
<div>${highLabel}: ${high} </div>
|
|
80
80
|
<div>${lowLabel}: ${low} </div>
|
|
81
|
-
<div>${
|
|
81
|
+
<div>${closeLabel}: ${close} </div>
|
|
82
|
+
`;
|
|
82
83
|
};
|
|
83
84
|
|
|
84
85
|
const formatBookData = ({
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import {
|
|
2
|
+
DISPLAYED_BUCKETS_COUNT,
|
|
3
|
+
INSTRUMENTS_CONFIG,
|
|
4
|
+
} from '../../../constants';
|
|
5
|
+
import type { InstrumentId } from '../../../types';
|
|
6
|
+
|
|
7
|
+
interface GetBucketWidthMultiplayerParams {
|
|
8
|
+
minPrice: number;
|
|
9
|
+
maxPrice: number;
|
|
10
|
+
instrument: InstrumentId;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export const getBucketWidthMultiplayer = ({
|
|
14
|
+
minPrice,
|
|
15
|
+
maxPrice,
|
|
16
|
+
instrument,
|
|
17
|
+
}: GetBucketWidthMultiplayerParams): number => {
|
|
18
|
+
const { defaultBucketWidth } = INSTRUMENTS_CONFIG[instrument];
|
|
19
|
+
const priceRange = maxPrice - minPrice;
|
|
20
|
+
|
|
21
|
+
const calculatedMultiplier =
|
|
22
|
+
priceRange / (defaultBucketWidth * DISPLAYED_BUCKETS_COUNT);
|
|
23
|
+
|
|
24
|
+
return Math.max(1, Math.ceil(calculatedMultiplier));
|
|
25
|
+
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
+
export * from './getBucketWidthMultiplayer';
|
|
1
2
|
export * from './getInstrumentConfigForDivision';
|
|
2
|
-
export * from './getMultiplayerForTimeSpan';
|
|
3
3
|
export * from './getTimeSpanForGranularity';
|
|
4
4
|
export * from './processOrderPositionBooks';
|
|
5
5
|
export * from './processPriceCandles';
|
|
@@ -12,10 +12,10 @@ import type {
|
|
|
12
12
|
GetSentimentsQuery,
|
|
13
13
|
GetSentimentsQueryVariables,
|
|
14
14
|
} from '../../../gql/types/graphql';
|
|
15
|
-
import {
|
|
15
|
+
import { DataSource } from '../../../gql/types/graphql';
|
|
16
16
|
import { BUCKET_CONFIG, INSTRUMENTS_CONFIG } from '../../constants';
|
|
17
17
|
import {
|
|
18
|
-
|
|
18
|
+
getBucketWidthMultiplayer,
|
|
19
19
|
getTimeSpanForGranularity,
|
|
20
20
|
processOrderPositionBooks,
|
|
21
21
|
processPriceCandles,
|
|
@@ -30,11 +30,6 @@ export const useCrowdViewData = ({
|
|
|
30
30
|
division,
|
|
31
31
|
granularity,
|
|
32
32
|
}: UseCrowdViewDataProps): UseCrowdViewDataReturn => {
|
|
33
|
-
const dataSource =
|
|
34
|
-
division === Division.Ogm || division === Division.Oj
|
|
35
|
-
? DataSource.Mt5
|
|
36
|
-
: DataSource.V20;
|
|
37
|
-
|
|
38
33
|
// Get price candles data
|
|
39
34
|
const {
|
|
40
35
|
loading: priceCandlesLoading,
|
|
@@ -44,12 +39,9 @@ export const useCrowdViewData = ({
|
|
|
44
39
|
getPriceCandles,
|
|
45
40
|
{
|
|
46
41
|
variables: {
|
|
47
|
-
dataSource,
|
|
42
|
+
dataSource: DataSource.V20,
|
|
48
43
|
division,
|
|
49
|
-
instrument:
|
|
50
|
-
dataSource === DataSource.Mt5
|
|
51
|
-
? INSTRUMENTS_CONFIG[instrument].mt5name
|
|
52
|
-
: INSTRUMENTS_CONFIG[instrument].v20name,
|
|
44
|
+
instrument: INSTRUMENTS_CONFIG[instrument].v20name,
|
|
53
45
|
granularity,
|
|
54
46
|
timeSpan: getTimeSpanForGranularity(granularity),
|
|
55
47
|
},
|
|
@@ -69,6 +61,15 @@ export const useCrowdViewData = ({
|
|
|
69
61
|
pipsLocation,
|
|
70
62
|
} = useMemo(() => processPriceCandles(priceCandlesData), [priceCandlesData]);
|
|
71
63
|
|
|
64
|
+
const bucketWidthMultiplayer = useMemo(
|
|
65
|
+
() =>
|
|
66
|
+
getBucketWidthMultiplayer({
|
|
67
|
+
minPrice,
|
|
68
|
+
maxPrice,
|
|
69
|
+
instrument,
|
|
70
|
+
}),
|
|
71
|
+
[minPrice, maxPrice, instrument]
|
|
72
|
+
);
|
|
72
73
|
// Get order position books data
|
|
73
74
|
const {
|
|
74
75
|
loading: orderPositionLoading,
|
|
@@ -79,12 +80,12 @@ export const useCrowdViewData = ({
|
|
|
79
80
|
{
|
|
80
81
|
variables: {
|
|
81
82
|
instrument: INSTRUMENTS_CONFIG[instrument].v20name,
|
|
82
|
-
bookType
|
|
83
|
+
bookType,
|
|
83
84
|
timeSpan: getTimeSpanForGranularity(granularity),
|
|
84
85
|
granularity,
|
|
85
86
|
maxBookPrice: maxPrice,
|
|
86
87
|
minBookPrice: minPrice,
|
|
87
|
-
bucketMultiplier:
|
|
88
|
+
bucketMultiplier: bucketWidthMultiplayer,
|
|
88
89
|
bucketMargin: BUCKET_CONFIG.PRICE_MARGIN_MULTIPLIER,
|
|
89
90
|
},
|
|
90
91
|
fetchPolicy: 'no-cache',
|
|
@@ -182,7 +183,7 @@ export const useCrowdViewData = ({
|
|
|
182
183
|
bucketWidth:
|
|
183
184
|
bucketWidth ||
|
|
184
185
|
INSTRUMENTS_CONFIG[instrument].defaultBucketWidth *
|
|
185
|
-
|
|
186
|
+
bucketWidthMultiplayer,
|
|
186
187
|
buckets,
|
|
187
188
|
displayPrecision: pipsLocation,
|
|
188
189
|
bookType,
|
|
@@ -203,8 +204,8 @@ export const useCrowdViewData = ({
|
|
|
203
204
|
sentimentShorts,
|
|
204
205
|
sentimentLongs,
|
|
205
206
|
bucketWidth,
|
|
206
|
-
granularity,
|
|
207
207
|
instrument,
|
|
208
|
+
bucketWidthMultiplayer,
|
|
208
209
|
buckets,
|
|
209
210
|
pipsLocation,
|
|
210
211
|
bookType,
|
|
@@ -15,6 +15,8 @@ export const TIME_THRESHOLDS = {
|
|
|
15
15
|
TWO_WEEKS_MS: 14 * 24 * 60 * 60 * 1000,
|
|
16
16
|
} as const;
|
|
17
17
|
|
|
18
|
+
export const DISPLAYED_BUCKETS_COUNT = 40;
|
|
19
|
+
|
|
18
20
|
const CHART_CONFIG_STATIC = {
|
|
19
21
|
MAIN_HEIGHT_DESKTOP: 410,
|
|
20
22
|
MAIN_HEIGHT_MOBILE: 330,
|
|
@@ -37,6 +39,7 @@ const CHART_CONFIG_STATIC = {
|
|
|
37
39
|
TOOLTIP_HEIGHT_MOBILE: 85,
|
|
38
40
|
TOOLTIP_HEIGHT_DESKTOP: 46,
|
|
39
41
|
TOOLTIP_OFFSET: 8,
|
|
42
|
+
TARGET_DIGIT_COUNT: 5,
|
|
40
43
|
};
|
|
41
44
|
|
|
42
45
|
const CHART_CONFIG_CALCULATED = {
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { getBucketWidthMultiplayer } from '../../../../src/CrowdViewWidget/components/Chart/dataUtils/getBucketWidthMultiplayer';
|
|
2
|
+
import { InstrumentId } from '../../../../src/CrowdViewWidget/types';
|
|
3
|
+
|
|
4
|
+
describe('getBucketWidthMultiplayer', () => {
|
|
5
|
+
describe('happy path', () => {
|
|
6
|
+
it('should calculate multiplier correctly for EUR_USD with standard price range', () => {
|
|
7
|
+
const result = getBucketWidthMultiplayer({
|
|
8
|
+
minPrice: 1.05,
|
|
9
|
+
maxPrice: 1.1,
|
|
10
|
+
instrument: InstrumentId.EUR_USD,
|
|
11
|
+
});
|
|
12
|
+
expect(result).toBe(3);
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
it('should calculate multiplier correctly for EUR_JPY with standard price range', () => {
|
|
16
|
+
const result = getBucketWidthMultiplayer({
|
|
17
|
+
minPrice: 140.0,
|
|
18
|
+
maxPrice: 150.0,
|
|
19
|
+
instrument: InstrumentId.EUR_JPY,
|
|
20
|
+
});
|
|
21
|
+
expect(result).toBe(5);
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
it('should return 1 when calculated multiplier is less than 1', () => {
|
|
26
|
+
const result = getBucketWidthMultiplayer({
|
|
27
|
+
minPrice: 1.0,
|
|
28
|
+
maxPrice: 1.01,
|
|
29
|
+
instrument: InstrumentId.EUR_USD,
|
|
30
|
+
});
|
|
31
|
+
expect(result).toBe(1);
|
|
32
|
+
});
|
|
33
|
+
});
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
formatXAxisLabel,
|
|
3
|
+
formatYAxisLabel,
|
|
3
4
|
getLabelData,
|
|
4
5
|
getRectColor,
|
|
5
6
|
getTooltipFormatter,
|
|
@@ -123,6 +124,70 @@ describe('chartUtils', () => {
|
|
|
123
124
|
});
|
|
124
125
|
});
|
|
125
126
|
|
|
127
|
+
describe('formatYAxisLabel', () => {
|
|
128
|
+
describe('happy path', () => {
|
|
129
|
+
it('formats value with 2 integer digits to 5 digits total', () => {
|
|
130
|
+
expect(formatYAxisLabel(50.4)).toBe('50.400');
|
|
131
|
+
expect(formatYAxisLabel(12.34)).toBe('12.340');
|
|
132
|
+
expect(formatYAxisLabel(99.9)).toBe('99.900');
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
it('formats value with 3 integer digits to 5 digits total', () => {
|
|
136
|
+
expect(formatYAxisLabel(182)).toBe('182.00');
|
|
137
|
+
expect(formatYAxisLabel(123.4)).toBe('123.40');
|
|
138
|
+
expect(formatYAxisLabel(999.9)).toBe('999.90');
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
it('formats value with 1 integer digit to 5 digits total', () => {
|
|
142
|
+
expect(formatYAxisLabel(5.4)).toBe('5.4000');
|
|
143
|
+
expect(formatYAxisLabel(1.23)).toBe('1.2300');
|
|
144
|
+
expect(formatYAxisLabel(9.99)).toBe('9.9900');
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
it('formats value with 4 integer digits to 5 digits total', () => {
|
|
148
|
+
expect(formatYAxisLabel(1234)).toBe('1234.0');
|
|
149
|
+
expect(formatYAxisLabel(5678.9)).toBe('5678.9');
|
|
150
|
+
expect(formatYAxisLabel(9999)).toBe('9999.0');
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
it('formats value with 5 or more integer digits to 5 digits total', () => {
|
|
154
|
+
expect(formatYAxisLabel(12345)).toBe('12345');
|
|
155
|
+
expect(formatYAxisLabel(123456)).toBe('123456');
|
|
156
|
+
expect(formatYAxisLabel(99999)).toBe('99999');
|
|
157
|
+
});
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
describe('edge cases', () => {
|
|
161
|
+
it('formats zero correctly', () => {
|
|
162
|
+
expect(formatYAxisLabel(0)).toBe('0.0000');
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
it('formats negative values correctly', () => {
|
|
166
|
+
expect(formatYAxisLabel(-50.4)).toBe('-50.400');
|
|
167
|
+
expect(formatYAxisLabel(-182)).toBe('-182.00');
|
|
168
|
+
expect(formatYAxisLabel(-5.4)).toBe('-5.4000');
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
it('formats very small decimal values correctly', () => {
|
|
172
|
+
expect(formatYAxisLabel(0.123)).toBe('0.1230');
|
|
173
|
+
expect(formatYAxisLabel(0.5)).toBe('0.5000');
|
|
174
|
+
expect(formatYAxisLabel(0.01)).toBe('0.0100');
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
it('formats values with no decimal part correctly', () => {
|
|
178
|
+
expect(formatYAxisLabel(10)).toBe('10.000');
|
|
179
|
+
expect(formatYAxisLabel(100)).toBe('100.00');
|
|
180
|
+
expect(formatYAxisLabel(1000)).toBe('1000.0');
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
it('formats values with many decimal places correctly', () => {
|
|
184
|
+
expect(formatYAxisLabel(50.123456)).toBe('50.123');
|
|
185
|
+
expect(formatYAxisLabel(182.987654)).toBe('182.99');
|
|
186
|
+
expect(formatYAxisLabel(1.23456789)).toBe('1.2346');
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
});
|
|
190
|
+
|
|
126
191
|
describe('getLabelData', () => {
|
|
127
192
|
const dates = [
|
|
128
193
|
'2025-03-01T00:00:00Z',
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.getMultiplayerForTimeSpan = void 0;
|
|
7
|
-
var _graphql = require("../../../../gql/types/graphql");
|
|
8
|
-
var _constants = require("../../../constants");
|
|
9
|
-
const getMultiplayerForTimeSpan = granularity => {
|
|
10
|
-
const timeSpanMultiplierMap = {
|
|
11
|
-
[_graphql.Granularity.M5]: _constants.BUCKET_CONFIG.MULTIPLIER_5M,
|
|
12
|
-
[_graphql.Granularity.M15]: _constants.BUCKET_CONFIG.MULTIPLIER_15M,
|
|
13
|
-
[_graphql.Granularity.H1]: _constants.BUCKET_CONFIG.MULTIPLIER_1H,
|
|
14
|
-
[_graphql.Granularity.H4]: _constants.BUCKET_CONFIG.MULTIPLIER_4H
|
|
15
|
-
};
|
|
16
|
-
return timeSpanMultiplierMap[granularity] || _constants.BUCKET_CONFIG.MULTIPLIER_5M;
|
|
17
|
-
};
|
|
18
|
-
exports.getMultiplayerForTimeSpan = getMultiplayerForTimeSpan;
|
|
19
|
-
//# sourceMappingURL=getMultiplayerForTimeSpan.js.map
|
package/dist/main/CrowdViewWidget/components/Chart/dataUtils/getMultiplayerForTimeSpan.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"getMultiplayerForTimeSpan.js","names":["_graphql","require","_constants","getMultiplayerForTimeSpan","granularity","timeSpanMultiplierMap","Granularity","M5","BUCKET_CONFIG","MULTIPLIER_5M","M15","MULTIPLIER_15M","H1","MULTIPLIER_1H","H4","MULTIPLIER_4H","exports"],"sources":["../../../../../../src/CrowdViewWidget/components/Chart/dataUtils/getMultiplayerForTimeSpan.ts"],"sourcesContent":["import { Granularity } from '../../../../gql/types/graphql';\nimport { BUCKET_CONFIG } from '../../../constants';\n\nexport const getMultiplayerForTimeSpan = (granularity: Granularity): number => {\n const timeSpanMultiplierMap: Record<Granularity, number> = {\n [Granularity.M5]: BUCKET_CONFIG.MULTIPLIER_5M,\n [Granularity.M15]: BUCKET_CONFIG.MULTIPLIER_15M,\n [Granularity.H1]: BUCKET_CONFIG.MULTIPLIER_1H,\n [Granularity.H4]: BUCKET_CONFIG.MULTIPLIER_4H,\n };\n\n return timeSpanMultiplierMap[granularity] || BUCKET_CONFIG.MULTIPLIER_5M;\n};\n"],"mappings":";;;;;;AAAA,IAAAA,QAAA,GAAAC,OAAA;AACA,IAAAC,UAAA,GAAAD,OAAA;AAEO,MAAME,yBAAyB,GAAIC,WAAwB,IAAa;EAC7E,MAAMC,qBAAkD,GAAG;IACzD,CAACC,oBAAW,CAACC,EAAE,GAAGC,wBAAa,CAACC,aAAa;IAC7C,CAACH,oBAAW,CAACI,GAAG,GAAGF,wBAAa,CAACG,cAAc;IAC/C,CAACL,oBAAW,CAACM,EAAE,GAAGJ,wBAAa,CAACK,aAAa;IAC7C,CAACP,oBAAW,CAACQ,EAAE,GAAGN,wBAAa,CAACO;EAClC,CAAC;EAED,OAAOV,qBAAqB,CAACD,WAAW,CAAC,IAAII,wBAAa,CAACC,aAAa;AAC1E,CAAC;AAACO,OAAA,CAAAb,yBAAA,GAAAA,yBAAA","ignoreList":[]}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { Granularity } from '../../../../gql/types/graphql';
|
|
2
|
-
import { BUCKET_CONFIG } from '../../../constants';
|
|
3
|
-
export const getMultiplayerForTimeSpan = granularity => {
|
|
4
|
-
const timeSpanMultiplierMap = {
|
|
5
|
-
[Granularity.M5]: BUCKET_CONFIG.MULTIPLIER_5M,
|
|
6
|
-
[Granularity.M15]: BUCKET_CONFIG.MULTIPLIER_15M,
|
|
7
|
-
[Granularity.H1]: BUCKET_CONFIG.MULTIPLIER_1H,
|
|
8
|
-
[Granularity.H4]: BUCKET_CONFIG.MULTIPLIER_4H
|
|
9
|
-
};
|
|
10
|
-
return timeSpanMultiplierMap[granularity] || BUCKET_CONFIG.MULTIPLIER_5M;
|
|
11
|
-
};
|
|
12
|
-
//# sourceMappingURL=getMultiplayerForTimeSpan.js.map
|
package/dist/module/CrowdViewWidget/components/Chart/dataUtils/getMultiplayerForTimeSpan.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"getMultiplayerForTimeSpan.js","names":["Granularity","BUCKET_CONFIG","getMultiplayerForTimeSpan","granularity","timeSpanMultiplierMap","M5","MULTIPLIER_5M","M15","MULTIPLIER_15M","H1","MULTIPLIER_1H","H4","MULTIPLIER_4H"],"sources":["../../../../../../src/CrowdViewWidget/components/Chart/dataUtils/getMultiplayerForTimeSpan.ts"],"sourcesContent":["import { Granularity } from '../../../../gql/types/graphql';\nimport { BUCKET_CONFIG } from '../../../constants';\n\nexport const getMultiplayerForTimeSpan = (granularity: Granularity): number => {\n const timeSpanMultiplierMap: Record<Granularity, number> = {\n [Granularity.M5]: BUCKET_CONFIG.MULTIPLIER_5M,\n [Granularity.M15]: BUCKET_CONFIG.MULTIPLIER_15M,\n [Granularity.H1]: BUCKET_CONFIG.MULTIPLIER_1H,\n [Granularity.H4]: BUCKET_CONFIG.MULTIPLIER_4H,\n };\n\n return timeSpanMultiplierMap[granularity] || BUCKET_CONFIG.MULTIPLIER_5M;\n};\n"],"mappings":"AAAA,SAASA,WAAW,QAAQ,+BAA+B;AAC3D,SAASC,aAAa,QAAQ,oBAAoB;AAElD,OAAO,MAAMC,yBAAyB,GAAIC,WAAwB,IAAa;EAC7E,MAAMC,qBAAkD,GAAG;IACzD,CAACJ,WAAW,CAACK,EAAE,GAAGJ,aAAa,CAACK,aAAa;IAC7C,CAACN,WAAW,CAACO,GAAG,GAAGN,aAAa,CAACO,cAAc;IAC/C,CAACR,WAAW,CAACS,EAAE,GAAGR,aAAa,CAACS,aAAa;IAC7C,CAACV,WAAW,CAACW,EAAE,GAAGV,aAAa,CAACW;EAClC,CAAC;EAED,OAAOR,qBAAqB,CAACD,WAAW,CAAC,IAAIF,aAAa,CAACK,aAAa;AAC1E,CAAC","ignoreList":[]}
|