From 19771949cb1023527db7e19416de58aba808c414 Mon Sep 17 00:00:00 2001 From: Sean Landsman Date: Tue, 23 May 2017 11:43:35 +0100 Subject: [PATCH] AG-420 Improve React implementation --- src-trader-dashboard/actions/fxDataUpdated.js | 9 + .../components/FxQuoteMatrix.jsx | 92 ++-- .../components/PriceChangesGrid.jsx | 41 +- .../components/StockHistoricalChartPanel.jsx | 2 +- .../components/StockPanel.jsx | 24 +- src-trader-dashboard/index.html | 4 + src-trader-dashboard/index.js | 8 +- src-trader-dashboard/reducers/fxData.js | 11 +- .../services/ExchangeService.jsx | 375 +--------------- .../services/FxDataService.jsx | 420 ++++++++++++++++++ src-trader-dashboard/services/StoreService.js | 8 + 11 files changed, 537 insertions(+), 457 deletions(-) create mode 100644 src-trader-dashboard/actions/fxDataUpdated.js create mode 100644 src-trader-dashboard/services/FxDataService.jsx create mode 100644 src-trader-dashboard/services/StoreService.js diff --git a/src-trader-dashboard/actions/fxDataUpdated.js b/src-trader-dashboard/actions/fxDataUpdated.js new file mode 100644 index 0000000..6f38f48 --- /dev/null +++ b/src-trader-dashboard/actions/fxDataUpdated.js @@ -0,0 +1,9 @@ +import cloneDeep from "lodash/cloneDeep"; + +export default function fxDataUpdatedAction(fxData) { + return { + type: 'FX_DATA_CHANGED', + fxData: cloneDeep(fxData) + }; +} + diff --git a/src-trader-dashboard/components/FxQuoteMatrix.jsx b/src-trader-dashboard/components/FxQuoteMatrix.jsx index a95e8d0..6637b4e 100644 --- a/src-trader-dashboard/components/FxQuoteMatrix.jsx +++ b/src-trader-dashboard/components/FxQuoteMatrix.jsx @@ -1,18 +1,22 @@ import React, {Component} from "react"; import {connect} from "react-redux"; + import {AgGridReact} from "ag-grid-react"; -import ExchangeService from "../services/ExchangeService.jsx"; +import assign from "lodash/assign"; +import uniq from "lodash/uniq"; +import cloneDeep from "lodash/cloneDeep"; + +import FxDataService from "../services/FxDataService.jsx"; class FxQuoteMatrix extends Component { constructor(props) { super(props); - this.exchangeService = new ExchangeService(); + this.fxDataService = new FxDataService(); this.state = { - columnDefs: this.exchangeService.getFxMatrixHeaderNames(), - // rowData: this.exchangeService.getFxMatrixSnapshot() + columnDefs: this.fxDataService.getFxMatrixHeaderNames() }; // grid events @@ -24,56 +28,52 @@ class FxQuoteMatrix extends Component { this.columnApi = params.columnApi; } - - // componentWillUnmount() { - // this.exchangeService.removeSubscribers(); - // } - componentWillReceiveProps(nextProps) { - console.log(props); - // if (nextProps.selectedExchange.supportedStocks !== this.props.selectedExchange.supportedStocks) { - // if (!this.gridApi) { - // return; - // } - // - // const currentSymbols = this.props.selectedExchange.supportedStocks; - // const nextSymbols = nextProps.selectedExchange.supportedStocks; - // - // // Unsubscribe to current ones that will be removed - // const symbolsRemoved = difference(currentSymbols, nextSymbols); - // forEach(symbolsRemoved, symbol => { - // this.exchangeService.removeSubscriber(this.updateQuote, symbol); - // }); - // - // // Subscribe to new ones that need to be added - // const symbolsAdded = difference(nextSymbols, currentSymbols); - // forEach(symbolsAdded, symbol => { - // this.exchangeService.addSubscriber(this.updateQuote, symbol); - // }); - // - // // Remove ag-grid nodes as necessary - // const nodesToRemove = []; - // this.gridApi.forEachNode(node => { - // const {data} = node; - // if (includes(symbolsRemoved, data.symbol)) { - // nodesToRemove.push(node); - // } - // }); - // this.gridApi.removeItems(nodesToRemove); - // - // // Insert new ag-grid nodes as necessary - // this.gridApi.addItems(map(symbolsAdded, symbol => this.exchangeService.getTicker(symbol))); - // } + if (!this.gridApi) { + return; + } + + if (!this.props.rowData || + this.props.rowData.length === 0) { + this.gridApi.setRowData(nextProps.rowData); + } else { + const newRowData = nextProps.rowData; + + const updatedNodes = []; + const updatedCols = []; + + for (let i = 0; i < newRowData.length; i++) { + // note that for this use case we assume the existing and new row data have the same + // row and column order + let node = this.gridApi.getModel().getRow(i); + let newRow = newRowData[i]; + + const {data} = node; + let updated = false; + for (const def of this.state.columnDefs) { + if (data[def.field] !== newRow[def.field]) { + updatedCols.push(def.field); + + updated = true; + } + } + if(updated) { + assign(data, newRow); + updatedNodes.push(node); + } + } + + this.gridApi.refreshCells(updatedNodes, uniq(updatedCols)); + } } render() { return ( -
{ return { - rowData: state.fxRowData + rowData: state.fxData } } )(FxQuoteMatrix); \ No newline at end of file diff --git a/src-trader-dashboard/components/PriceChangesGrid.jsx b/src-trader-dashboard/components/PriceChangesGrid.jsx index 257b2ac..8e649f8 100644 --- a/src-trader-dashboard/components/PriceChangesGrid.jsx +++ b/src-trader-dashboard/components/PriceChangesGrid.jsx @@ -1,8 +1,5 @@ import React, {Component} from "react"; -// take this line out if you do not want to use ag-Grid-Enterprise -import "ag-grid-enterprise"; - import {AgGridReact} from "ag-grid-react"; import map from "lodash/map"; @@ -61,10 +58,10 @@ export default class extends Component { // grid events this.onGridReady = this.onGridReady.bind(this); - this.onRowClicked = this.onRowClicked.bind(this); + this.onSelectionChanged = this.onSelectionChanged.bind(this); // component events - this.updateQuote = this.updateQuote.bind(this); + this.updateSymbol = this.updateSymbol.bind(this); } numberFormatter(params) { @@ -83,16 +80,20 @@ export default class extends Component { let rowData = map(this.props.selectedExchange.supportedStocks, symbol => this.exchangeService.getTicker(symbol)); this.gridApi.addItems(rowData); + // select the first symbol to show the chart + this.gridApi.getModel().getRow(0).setSelected(true); + this.gridApi.sizeColumnsToFit(); } - onRowClicked(params) { - this.props.onRowClicked(params.data.symbol); + onSelectionChanged() { + let selectedNode = this.gridApi.getSelectedNodes()[0]; + this.props.onSelectionChanged(selectedNode ? selectedNode.data.symbol : null); } componentWillMount() { this.props.selectedExchange.supportedStocks.forEach(symbol => { - this.exchangeService.addSubscriber(this.updateQuote, symbol); + this.exchangeService.addSubscriber(this.updateSymbol, symbol); }); } @@ -105,6 +106,7 @@ export default class extends Component { if (!this.gridApi) { return; } + this.gridApi.deselectAll(); const currentSymbols = this.props.selectedExchange.supportedStocks; const nextSymbols = nextProps.selectedExchange.supportedStocks; @@ -112,13 +114,13 @@ export default class extends Component { // Unsubscribe to current ones that will be removed const symbolsRemoved = difference(currentSymbols, nextSymbols); forEach(symbolsRemoved, symbol => { - this.exchangeService.removeSubscriber(this.updateQuote, symbol); + this.exchangeService.removeSubscriber(this.updateSymbol, symbol); }); // Subscribe to new ones that need to be added const symbolsAdded = difference(nextSymbols, currentSymbols); forEach(symbolsAdded, symbol => { - this.exchangeService.addSubscriber(this.updateQuote, symbol); + this.exchangeService.addSubscriber(this.updateSymbol, symbol); }); // Remove ag-grid nodes as necessary @@ -132,11 +134,15 @@ export default class extends Component { this.gridApi.removeItems(nodesToRemove); // Insert new ag-grid nodes as necessary - this.gridApi.addItems(map(symbolsAdded, symbol => this.exchangeService.getTicker(symbol))); + let rowData = map(symbolsAdded, symbol => this.exchangeService.getTicker(symbol)); + this.gridApi.addItems(rowData); + + // select the first symbol to show the chart + this.gridApi.getModel().getRow(0).setSelected(true); } } - updateQuote(quote) { + updateSymbol(symbol) { if (!this.gridApi) { // the grid isn't ready yet return; @@ -147,13 +153,13 @@ export default class extends Component { this.gridApi.forEachNode(node => { const {data} = node; - if (data.symbol === quote.symbol) { + if (data.symbol === symbol.symbol) { for (const def of this.state.columnDefs) { - if (data[def.field] !== quote[def.field]) { + if (data[def.field] !== symbol[def.field]) { updatedCols.push(def.field); } } - assign(data, quote); + assign(data, symbol); updatedNodes.push(node); } }); @@ -163,16 +169,17 @@ export default class extends Component { render() { return ( -
+ onSelectionChanged={this.onSelectionChanged}>
); diff --git a/src-trader-dashboard/components/StockHistoricalChartPanel.jsx b/src-trader-dashboard/components/StockHistoricalChartPanel.jsx index 25befb7..ae78563 100644 --- a/src-trader-dashboard/components/StockHistoricalChartPanel.jsx +++ b/src-trader-dashboard/components/StockHistoricalChartPanel.jsx @@ -29,7 +29,7 @@ export default class extends Component { static get defaultProps() { return { - graphHeight: 320, + graphHeight: 230, graphWidth: 400 } } diff --git a/src-trader-dashboard/components/StockPanel.jsx b/src-trader-dashboard/components/StockPanel.jsx index 6f2149c..2ba004d 100644 --- a/src-trader-dashboard/components/StockPanel.jsx +++ b/src-trader-dashboard/components/StockPanel.jsx @@ -12,7 +12,7 @@ export default class extends Component { selectedSymbol: null }; - this.onRowClicked = this.onRowClicked.bind(this); + this.onSelectionChanged = this.onSelectionChanged.bind(this); } componentWillReceiveProps(nextProps) { @@ -28,7 +28,7 @@ export default class extends Component { nextState.selectedSymbol !== this.state.selectedSymbol; } - onRowClicked(selectedSymbol) { + onSelectionChanged(selectedSymbol) { this.setState({ selectedSymbol }) @@ -37,16 +37,16 @@ export default class extends Component { render() { return (
- {/*
*/} - {/*
*/} - {/**/} - {/*
*/} - {/*
*/} - {/**/} - {/*
*/} - {/*
*/} +
+
+ +
+
+ +
+
diff --git a/src-trader-dashboard/index.html b/src-trader-dashboard/index.html index f69d9b6..927d3a3 100644 --- a/src-trader-dashboard/index.html +++ b/src-trader-dashboard/index.html @@ -10,6 +10,10 @@ height: 100%; } + .ag-fresh .ag-value-change-value-highlight { + background-color: #afbcff; + } + .align-right { text-align: right } diff --git a/src-trader-dashboard/index.js b/src-trader-dashboard/index.js index 1729e47..77198e5 100644 --- a/src-trader-dashboard/index.js +++ b/src-trader-dashboard/index.js @@ -4,16 +4,14 @@ import React from "react"; import {render} from "react-dom"; import {Provider} from "react-redux"; -import {createStore} from "redux"; - -import TraderDashboard from "./components/TraderDashboard.jsx"; import "ag-grid-root/dist/styles/ag-grid.css"; import "ag-grid-root/dist/styles/theme-fresh.css"; -import fxData from "./reducers/fxData"; +import StoreService from './services/StoreService'; +import TraderDashboard from "./components/TraderDashboard.jsx"; -let store = createStore(fxData); +let store = StoreService.STORE; document.addEventListener('DOMContentLoaded', () => { render( diff --git a/src-trader-dashboard/reducers/fxData.js b/src-trader-dashboard/reducers/fxData.js index ddf60b3..e0a9b1f 100644 --- a/src-trader-dashboard/reducers/fxData.js +++ b/src-trader-dashboard/reducers/fxData.js @@ -1,3 +1,10 @@ -export default (state = {fxRowData: []}, action) => { - return state; +export default (state = {fxData: []}, action) => { + switch (action.type) { + case 'FX_DATA_CHANGED': + return { + fxData: action.fxData.slice(0) + }; + default: + return state; + } }; \ No newline at end of file diff --git a/src-trader-dashboard/services/ExchangeService.jsx b/src-trader-dashboard/services/ExchangeService.jsx index eee0ebd..255dbc1 100644 --- a/src-trader-dashboard/services/ExchangeService.jsx +++ b/src-trader-dashboard/services/ExchangeService.jsx @@ -190,33 +190,6 @@ export default class { return historicalData; } - - getFxMatrixHeaderNames() { - return FX_DELTA_HEADERS; - } - - getFxMatrixSnapshot() { - let columns = FX_CURRENCY_MATRIX[0]; - let data = FX_CURRENCY_MATRIX.slice(1); - - let rowData = []; - for (let i = 0; i < data.length; i++) { - let currentRow = data[i]; - - let row = {}; - for (let j = 0; j < columns.length; j++) { - row[columns[j]] = currentRow[j]; - } - - // last, net and % change are different - row['last'] = Math.floor(this.random(7000, 170000)); - row['net'] = this.random(-500, 500).toFixed(2); - row['pct_net_change'] = this.random(-1, 1).toFixed(2); - - rowData.push(row); - } - return rowData; - } } const NASDAQ_SYMBOLS = [ @@ -353,350 +326,4 @@ const DE_SYMBOLS = [ "STS.L", "BKIR.L", "AFMF.L", -]; - -const FX_CURRENCY_SYMBOLS = ["USDGBP", "USDEUR", "USDAED", "USDJPY", "USDCAD", "USDCHF", "GBPUSD", "GBPEUR", "GBPAED", "GBPJPY", "GBPCAD", "GBPCHF", "EURUSD", "EURGBP", "EURAED", "EURJPY", "EURCAD", "EURCHF", "AEDUSD", "AEDGBP", "AEDEUR", "AEDJPY", "AEDCAD", "AEDCHF", "JPYUSD", "JPYGBP", "JPYEUR", "JPYAED", "JPYCAD", "JPYCHF", "CADUSD", "CADGBP", "CADEUR", "CADAED", "CADJPY", "CADCHF", "CHFUSD", "CHFGBP", "CHFEUR", "CHFAED", "CHFJPY", "CHFCAD"]; -const FX_DELTA_HEADERS = [ - { - field: 'symbol', - headerName: 'Symbol', - width: 80 - }, - { - field: 'last', - headerName: 'Last', - headerClass: 'align-right', - cellRenderer: 'animateShowChange', - cellClass: 'align-right', - width: 70 - }, - { - field: 'net', - headerName: 'Net', - headerClass: 'align-right', - cellRenderer: 'animateShowChange', - cellStyle: {'text-align': 'right'}, - width: 60 - }, - { - field: 'pct_net_change', - headerName: '% NC', - headerClass: 'align-right', - cellStyle: {'text-align': 'right'}, // to be removed once the component is in place - // cellRendererFramework: HorizontalBarComponent, - width: 67, - cellClassRules: { - 'pct-change-green': 'x > 0', - 'pct-change-amber': 'x <= 0 && x >= -0.10', - 'pct-change-red': 'x < -0.10' - } - }, -].concat(FX_CURRENCY_SYMBOLS.map((symbol) => { - "use strict"; - return { - field: symbol, - headerName: symbol, - headerClass: 'align-right', - width: 87, - cellStyle: {'text-align': 'right'}, - cellClassRules: { - 'fx-postive': 'x > 0.8', - 'fx-null': 'x === null', - 'fx-negative': 'x < -0.8' - } - } -})); - -const FX_CURRENCY_MATRIX = [ - ["symbol", ...FX_CURRENCY_SYMBOLS], - ["USDGBP", null, "0.89", "-0.01", "0.29", "0.28", "-0.04", "0.47", "0.17", "0.20", "0.11", "0.97", "0.07", "-0.20", "0.57", "0.54", "0.26", "0.33", "0.86", "0.95", "0.39", "0.21", "-0.49", "0.63", "-0.13", "-0.86", "0.18", "-0.84", "-0.89", "0.05", "-0.29", "0.34", "0.93", "0.41", "0.13", "-0.17", "0.70", "-0.17", "0.60", "0.00", "0.09", "-0.15", "0.10"], - ["USDEUR", "0.89", null, "0.25", "0.29", "0.86", "-0.93", "0.09", "0.63", "0.76", "0.10", "0.51", "-0.31", "-0.51", "0.20", "0.48", "-0.42", "0.73", "0.57", "0.65", "0.40", "0.12", "0.24", "0.42", "0.75", "0.13", "0.75", "0.42", "-0.80", "-0.26", "0.68", "0.68", "0.98", "0.87", "0.48", "0.52", "0.23", "0.61", "0.71", "-0.61", "0.40", "-0.80", "-0.89"], - ["USDAED", "0.90", "0.95", null, "0.71", "0.49", "0.50", "0.51", "0.07", "0.80", "-0.74", "0.54", "0.46", "-0.90", "-0.33", "0.75", "0.91", "0.84", "0.86", "0.89", "0.68", "0.71", "0.74", "0.58", "-0.24", "0.31", "0.85", "0.28", "0.44", "0.51", "-0.19", "0.71", "0.81", "0.85", "0.23", "0.09", "0.65", "-0.48", "0.43", "0.97", "0.11", "-0.81", "-0.69"], - ["USDJPY", "0.84", "0.92", "0.36", null, "0.79", "0.90", "0.86", "0.42", "0.14", "0.98", "0.47", "0.76", "0.60", "0.15", "0.04", "0.58", "0.13", "-0.16", "0.63", "0.86", "-0.63", "-0.95", "0.42", "0.08", "0.90", "-0.39", "-0.16", "0.66", "0.95", "0.31", "0.66", "-0.84", "0.06", "-0.60", "0.08", "0.57", "0.93", "0.78", "0.15", "0.36", "0.78", "0.34"], - ["USDCAD", "0.79", "-0.87", "0.93", "0.83", null, "0.10", "0.60", "0.34", "0.98", "0.70", "0.09", "0.46", "0.80", "0.10", "0.26", "-0.90", "0.69", "-0.22", "0.51", "-0.75", "-0.08", "0.07", "0.24", "0.68", "0.60", "0.37", "0.92", "0.02", "0.66", "0.16", "0.24", "-0.79", "0.19", "0.19", "0.08", "-0.97", "-0.93", "0.04", "-0.92", "0.86", "-0.36", "0.04"], - ["USDCHF", "0.94", "-0.02", "0.70", "0.82", "0.41", null, "0.76", "0.06", "0.46", "0.99", "0.07", "0.72", "0.14", "0.90", "0.23", "-0.54", "0.64", "0.80", "0.16", "0.23", "0.66", "-0.89", "-0.54", "-0.95", "0.27", "0.56", "0.42", "0.41", "0.88", "0.81", "0.37", "0.75", "0.06", "-0.75", "0.98", "0.21", "0.01", "0.03", "0.35", "-0.42", "0.55", "0.19"], - ["GBPUSD", "0.05", "-0.64", "0.47", "0.56", "0.51", "-0.47", null, "-0.15", "0.13", "0.55", "0.58", "0.57", "-0.49", "0.28", "0.86", "0.49", "0.12", "-0.91", "0.06", "0.12", "0.18", "-0.02", "-0.55", "0.18", "0.29", "0.76", "0.11", "0.04", "0.55", "0.16", "0.84", "0.83", "-0.94", "0.32", "0.07", "-0.33", "-0.29", "0.01", "-0.19", "0.01", "-0.60", "0.66"], - ["GBPEUR", "-0.32", "0.17", "0.60", "-0.52", "-0.52", "0.39", "-0.42", null, "0.07", "0.69", "0.67", "0.01", "0.72", "0.35", "0.66", "-0.66", "0.21", "0.12", "0.42", "-0.57", "-0.04", "0.48", "0.91", "0.72", "-0.16", "0.79", "0.03", "0.44", "0.17", "0.87", "-0.82", "0.20", "0.88", "0.48", "0.59", "-0.70", "0.12", "0.56", "-0.69", "0.10", "0.90", "1.00"], - ["GBPAED", "0.76", "0.05", "0.72", "-0.40", "0.93", "0.64", "0.90", "0.21", null, "0.91", "0.33", "-0.36", "0.28", "0.87", "0.25", "0.33", "0.44", "0.89", "0.17", "0.96", "0.86", "0.88", "0.03", "-0.25", "0.21", "0.98", "-0.60", "0.07", "0.90", "0.23", "0.41", "0.77", "0.83", "0.94", "0.12", "0.37", "0.58", "0.35", "-0.53", "0.49", "0.96", "-0.06"], - ["GBPJPY", "0.63", "0.72", "0.59", "0.89", "-0.54", "0.97", "0.61", "0.64", "0.85", null, "0.35", "0.57", "0.25", "0.85", "0.27", "-0.70", "-0.30", "-0.36", "0.29", "0.82", "0.26", "0.69", "0.46", "0.01", "0.09", "0.78", "0.95", "0.16", "0.07", "0.41", "0.99", "0.67", "0.34", "-0.89", "0.83", "0.32", "0.21", "-0.48", "-0.64", "0.65", "0.58", "0.69"], - ["GBPCAD", "0.78", "0.09", "0.33", "0.11", "0.95", "0.01", "0.96", "0.72", "0.13", "0.02", null, "0.44", "0.63", "-0.52", "0.08", "-0.85", "0.74", "0.41", "0.52", "0.15", "-0.97", "0.61", "0.58", "0.47", "0.56", "0.37", "0.54", "-0.65", "0.98", "0.44", "0.28", "0.70", "0.44", "0.34", "0.95", "0.82", "-0.09", "0.62", "0.87", "0.25", "-1.00", "0.99"], - ["GBPCHF", "-0.87", "0.68", "0.84", "0.83", "0.50", "0.74", "0.02", "0.11", "-0.12", "0.36", "0.71", null, "0.45", "0.02", "0.51", "0.50", "-0.03", "-0.94", "0.23", "0.38", "0.09", "0.26", "0.14", "0.39", "0.36", "0.01", "0.76", "0.21", "0.03", "0.97", "-0.89", "0.68", "0.43", "0.43", "0.26", "0.01", "0.60", "0.15", "0.77", "0.51", "-0.31", "0.37"], - ["EURUSD", "-0.45", "-0.05", "0.14", "-0.11", "0.36", "0.12", "0.76", "0.66", "0.50", "0.31", "0.28", "0.90", null, "-0.04", "0.73", "0.33", "0.27", "0.22", "0.86", "0.79", "-0.29", "0.30", "0.89", "0.73", "0.94", "0.24", "0.19", "0.81", "0.88", "0.46", "0.19", "0.79", "-0.16", "0.85", "0.84", "-0.57", "-0.87", "0.86", "0.69", "0.12", "0.64", "0.13"], - ["EURGBP", "0.06", "0.81", "0.54", "0.57", "0.57", "0.81", "0.38", "0.70", "0.37", "0.58", "-0.56", "0.77", "0.59", null, "0.98", "-0.48", "0.60", "0.78", "0.22", "0.20", "-0.62", "-0.97", "-0.55", "0.39", "0.88", "0.96", "0.32", "0.84", "0.26", "-0.47", "0.04", "0.34", "-0.24", "0.53", "-0.75", "-0.97", "0.47", "0.81", "0.49", "-0.84", "0.94", "0.09"], - ["EURAED", "0.61", "0.59", "0.11", "0.21", "0.41", "-0.45", "0.32", "0.90", "-0.98", "0.38", "0.27", "0.62", "0.67", "0.89", null, "0.27", "0.65", "0.72", "0.69", "0.66", "0.12", "0.32", "0.11", "-0.73", "-0.17", "0.74", "0.03", "0.96", "0.59", "-0.92", "-0.91", "-0.41", "0.09", "0.45", "0.90", "0.88", "0.96", "0.47", "0.95", "0.27", "-0.48", "0.71"], - ["EURJPY", "-0.01", "0.36", "0.28", "0.68", "0.50", "0.25", "0.81", "0.64", "0.12", "-0.73", "-0.47", "0.96", "-0.98", "-0.41", "0.78", null, "0.19", "-0.37", "0.24", "0.63", "0.74", "-0.24", "0.46", "0.63", "0.99", "0.65", "0.52", "0.11", "0.52", "0.39", "0.41", "0.51", "0.78", "1.00", "0.80", "-0.11", "0.90", "0.96", "0.66", "0.32", "0.02", "0.19"], - ["EURCAD", "-0.80", "0.40", "0.35", "0.45", "0.66", "0.21", "0.77", "0.58", "0.09", "1.00", "0.02", "-0.85", "0.89", "0.63", "-0.05", "0.46", null, "0.87", "0.96", "-0.48", "0.40", "0.18", "0.37", "0.81", "0.50", "-0.06", "-0.56", "0.38", "0.02", "0.83", "-0.93", "0.80", "0.31", "0.10", "0.70", "0.55", "0.47", "0.77", "0.98", "0.88", "0.19", "0.91"], - ["EURCHF", "-0.93", "0.01", "-0.29", "0.46", "-0.59", "-0.15", "0.58", "0.00", "-0.62", "0.36", "0.27", "-0.10", "-0.10", "0.57", "0.57", "0.75", "-0.10", null, "0.88", "0.21", "0.89", "0.85", "0.16", "0.93", "0.60", "0.59", "0.42", "0.70", "0.66", "0.80", "0.83", "0.52", "0.01", "0.41", "0.68", "0.94", "0.81", "0.40", "0.69", "0.04", "0.70", "0.61"], - ["AEDUSD", "0.10", "0.45", "0.06", "-0.37", "-0.14", "0.63", "0.10", "0.77", "0.95", "-0.12", "1.00", "-0.19", "-0.59", "0.78", "0.10", "0.76", "-0.45", "-0.99", null, "-0.46", "0.28", "0.31", "0.32", "0.42", "-0.00", "0.66", "0.24", "0.31", "0.10", "0.73", "0.02", "0.78", "0.07", "1.00", "0.43", "0.61", "0.53", "0.53", "0.41", "0.37", "0.97", "-0.19"], - ["AEDGBP", "0.70", "0.73", "0.34", "0.97", "0.84", "0.05", "0.21", "0.14", "0.45", "0.69", "0.41", "-0.53", "0.28", "0.13", "0.99", "0.97", "0.93", "0.62", "0.35", null, "0.18", "0.96", "0.58", "0.04", "0.00", "0.58", "-0.54", "0.35", "0.84", "0.83", "-0.20", "0.51", "0.32", "0.01", "0.95", "0.69", "-0.73", "0.36", "0.78", "0.02", "0.22", "0.39"], - ["AEDEUR", "0.18", "0.84", "-0.89", "0.90", "-0.25", "0.53", "0.71", "0.80", "0.60", "-0.98", "-0.81", "0.57", "0.72", "0.32", "-0.23", "0.98", "0.50", "0.93", "0.56", "0.26", null, "0.61", "0.47", "0.72", "0.58", "0.19", "0.94", "0.21", "0.47", "0.70", "0.67", "0.85", "0.98", "0.15", "0.21", "0.43", "0.03", "0.92", "0.91", "0.35", "0.70", "0.85"], - ["AEDJPY", "0.88", "0.62", "0.50", "0.27", "0.56", "0.61", "0.06", "-0.02", "0.42", "0.26", "0.23", "0.83", "-0.55", "0.94", "0.01", "0.72", "-0.43", "0.10", "0.01", "-0.20", "0.13", null, "0.70", "0.10", "0.05", "0.43", "-0.14", "-0.64", "0.80", "0.79", "0.57", "0.14", "0.14", "0.04", "-0.96", "0.59", "0.14", "0.51", "0.23", "0.57", "0.94", "0.88"], - ["AEDCAD", "0.75", "-0.99", "0.82", "-0.87", "0.79", "1.00", "0.21", "0.30", "-0.40", "0.34", "-0.85", "0.41", "0.79", "0.17", "0.58", "-0.24", "0.18", "0.15", "0.18", "0.44", "0.34", "0.90", null, "0.10", "0.34", "0.31", "0.34", "0.79", "-0.05", "0.19", "-0.86", "0.61", "-0.65", "0.23", "0.59", "0.69", "-0.65", "0.89", "0.97", "0.12", "0.63", "-0.24"], - ["AEDCHF", "0.67", "0.46", "0.92", "0.22", "0.91", "0.67", "0.81", "0.04", "0.29", "0.13", "0.80", "0.95", "0.29", "0.99", "-0.17", "0.58", "0.64", "0.68", "0.41", "0.69", "0.84", "0.01", "0.04", null, "0.07", "0.16", "0.26", "-0.43", "0.08", "0.58", "0.33", "-0.28", "0.03", "-0.08", "0.54", "-0.91", "0.78", "-0.10", "-0.13", "0.15", "0.62", "-0.13"], - ["JPYUSD", "-0.67", "0.90", "0.84", "0.10", "0.77", "0.43", "0.59", "0.69", "0.63", "0.82", "-0.61", "0.41", "0.07", "0.48", "1.00", "-0.52", "0.22", "0.89", "0.43", "0.54", "0.56", "-0.43", "0.78", "0.67", null, "0.06", "0.28", "0.04", "0.62", "0.18", "0.77", "0.63", "0.05", "0.87", "0.22", "0.21", "0.07", "0.25", "-0.55", "0.67", "0.10", "-0.67"], - ["JPYGBP", "0.21", "0.46", "0.23", "0.53", "-0.97", "0.78", "0.43", "0.74", "-0.95", "0.98", "0.49", "0.66", "0.18", "0.55", "-0.33", "0.67", "0.65", "0.23", "-0.07", "-0.67", "0.56", "0.74", "-0.38", "-0.83", "-0.51", null, "-0.26", "-0.79", "0.73", "-0.78", "-0.09", "0.19", "0.48", "0.97", "0.11", "0.19", "0.51", "0.32", "0.81", "-0.02", "0.17", "0.48"], - ["JPYEUR", "0.83", "0.86", "0.62", "-0.92", "0.64", "0.58", "0.55", "0.07", "0.81", "0.32", "0.33", "0.96", "0.48", "0.57", "0.25", "0.56", "0.33", "0.02", "-0.79", "0.44", "0.95", "0.35", "0.41", "0.06", "0.28", "0.77", null, "0.64", "0.79", "0.74", "0.67", "-0.97", "0.47", "-0.11", "0.03", "0.39", "-0.37", "0.06", "0.09", "0.13", "0.20", "0.87"], - ["JPYAED", "0.69", "0.80", "0.90", "0.06", "0.55", "0.90", "-0.09", "0.05", "-0.10", "0.31", "0.57", "0.69", "-0.78", "0.42", "0.64", "0.96", "0.08", "-0.76", "0.59", "0.00", "0.40", "-0.88", "0.69", "0.17", "-0.16", "0.57", "0.86", null, "-0.61", "-0.14", "0.41", "-0.16", "0.36", "0.95", "0.44", "0.41", "0.35", "-0.56", "0.25", "0.66", "0.90", "0.82"], - ["JPYCAD", "0.33", "0.27", "0.61", "0.01", "-0.16", "0.21", "0.57", "-0.41", "-0.56", "0.55", "0.13", "-0.87", "0.19", "0.64", "-0.38", "-0.80", "-0.10", "0.44", "0.72", "-0.72", "0.48", "0.42", "0.84", "0.73", "0.35", "0.68", "0.01", "0.09", null, "0.87", "0.17", "0.45", "0.02", "0.01", "0.77", "0.24", "0.62", "0.39", "-0.73", "0.21", "-0.08", "0.42"], - ["JPYCHF", "-0.45", "0.52", "0.34", "0.85", "0.16", "0.96", "0.53", "0.62", "0.46", "0.94", "0.08", "-0.68", "0.81", "0.44", "0.27", "0.75", "-0.84", "0.69", "-0.99", "0.41", "0.66", "-0.94", "0.21", "0.85", "-0.08", "0.36", "0.62", "0.25", "-0.48", null, "0.51", "-0.39", "0.60", "0.63", "0.68", "0.10", "0.62", "0.68", "0.00", "0.24", "0.61", "0.23"], - ["CADUSD", "-0.65", "0.73", "0.93", "0.27", "-0.00", "-0.46", "0.53", "0.36", "0.83", "0.58", "0.40", "0.03", "0.32", "0.38", "-0.53", "0.86", "0.42", "0.90", "0.83", "0.94", "0.34", "-0.56", "0.46", "-0.72", "0.13", "0.08", "0.25", "0.59", "0.75", "0.72", null, "0.62", "0.73", "0.52", "0.28", "0.03", "-0.54", "0.50", "0.76", "-0.28", "0.89", "0.97"], - ["CADGBP", "0.74", "0.58", "0.55", "0.01", "0.33", "0.61", "0.75", "0.86", "-0.87", "0.50", "0.57", "0.84", "-0.34", "1.00", "0.77", "0.75", "0.40", "0.12", "-0.57", "-0.16", "-0.91", "0.06", "0.67", "-0.55", "0.02", "0.78", "0.57", "0.70", "0.21", "0.95", "-0.91", null, "-0.82", "0.71", "0.36", "0.46", "0.46", "0.24", "0.15", "0.54", "0.15", "0.83"], - ["CADEUR", "-0.58", "0.29", "0.03", "0.70", "0.77", "0.80", "0.52", "0.04", "0.11", "0.86", "-0.98", "0.02", "0.01", "-0.19", "-0.48", "0.80", "0.90", "0.10", "0.28", "0.88", "0.98", "0.43", "0.47", "-0.41", "-0.92", "0.49", "0.64", "-0.60", "0.11", "0.61", "0.19", "-0.39", null, "-0.21", "0.56", "-0.45", "-0.48", "0.51", "0.04", "-0.44", "-0.22", "-0.29"], - ["CADAED", "0.07", "0.55", "0.99", "-0.41", "0.65", "0.75", "0.97", "0.74", "0.65", "0.37", "-0.04", "0.85", "0.83", "0.25", "0.14", "-0.00", "0.80", "0.78", "-0.42", "0.54", "-0.42", "-0.07", "-0.62", "0.56", "0.89", "0.92", "0.19", "0.64", "0.45", "0.24", "0.97", "0.41", "0.36", null, "-0.54", "-0.85", "-0.68", "0.48", "0.13", "0.61", "0.75", "0.21"], - ["CADJPY", "-0.84", "0.71", "0.59", "-0.78", "0.92", "0.93", "0.03", "0.27", "0.22", "0.71", "-0.79", "0.72", "0.27", "0.29", "0.40", "0.66", "0.44", "-0.33", "0.24", "0.99", "-0.95", "0.74", "0.42", "0.45", "0.08", "0.46", "0.22", "0.70", "0.80", "0.36", "0.36", "0.94", "0.75", "0.51", null, "0.10", "0.31", "0.54", "1.00", "0.78", "0.17", "0.32"], - ["CADCHF", "0.19", "0.00", "0.62", "-0.63", "0.75", "0.57", "0.28", "-0.98", "0.17", "-0.63", "0.09", "0.10", "-0.09", "0.22", "0.65", "0.20", "0.27", "-0.66", "-0.70", "0.72", "0.40", "0.96", "0.52", "0.38", "0.96", "0.90", "0.35", "-0.70", "0.37", "0.94", "0.20", "0.78", "0.34", "0.24", "-0.18", null, "0.05", "0.71", "0.05", "0.38", "0.02", "0.60"], - ["CHFUSD", "0.42", "0.61", "-0.30", "-0.27", "0.46", "0.63", "0.64", "0.33", "0.18", "0.88", "0.99", "0.73", "0.85", "0.07", "0.53", "0.31", "-0.63", "0.56", "-0.04", "-0.68", "0.43", "-0.96", "0.45", "0.45", "0.50", "0.17", "0.82", "0.34", "0.26", "0.16", "0.71", "0.35", "0.57", "0.79", "0.56", "0.55", null, "0.02", "-0.90", "0.84", "0.33", "0.18"], - ["CHFGBP", "-0.38", "0.73", "0.25", "0.64", "0.41", "-0.48", "0.75", "-0.40", "0.37", "0.62", "0.30", "0.06", "0.54", "0.15", "0.51", "0.33", "-0.79", "-0.05", "-0.54", "0.21", "0.40", "0.86", "0.96", "0.94", "0.52", "0.07", "0.71", "-0.80", "-0.40", "0.71", "0.71", "0.89", "0.43", "-0.68", "0.93", "0.05", "0.42", null, "0.59", "-0.67", "0.03", "0.17"], - ["CHFEUR", "-0.64", "0.96", "-0.34", "0.71", "0.53", "0.44", "0.27", "0.56", "0.96", "0.40", "0.86", "0.65", "0.82", "0.89", "-0.75", "0.29", "0.06", "0.70", "0.23", "0.68", "0.79", "0.21", "0.50", "0.14", "-0.27", "-0.83", "-0.22", "0.59", "0.40", "0.10", "0.88", "0.99", "0.21", "-0.36", "0.00", "0.53", "0.08", "0.08", null, "0.53", "-0.51", "0.03"], - ["CHFAED", "-0.99", "0.71", "0.51", "0.58", "0.57", "0.73", "0.60", "0.23", "0.02", "0.84", "0.90", "0.56", "0.03", "-0.93", "0.59", "0.24", "-0.67", "0.13", "0.99", "0.28", "0.72", "0.79", "-0.83", "-0.30", "0.73", "0.08", "-0.02", "0.85", "0.33", "0.57", "0.09", "0.26", "0.16", "0.80", "0.65", "-0.19", "-0.38", "-0.61", "-0.98", null, "0.57", "-0.81"], - ["CHFJPY", "0.60", "0.96", "0.22", "0.52", "0.63", "0.24", "0.76", "0.91", "0.80", "-0.14", "0.59", "-0.01", "0.60", "-0.08", "0.63", "0.39", "0.30", "-0.71", "0.18", "0.94", "-0.30", "0.28", "0.87", "0.92", "-0.19", "0.18", "-0.40", "0.44", "0.88", "0.52", "0.50", "0.44", "0.84", "0.24", "0.09", "0.15", "0.10", "0.30", "-0.05", "0.79", null, "0.99"], - ["CHFCAD", "0.93", "0.24", "0.05", "0.40", "0.75", "0.12", "0.90", "0.56", "0.46", "0.62", "0.71", "0.01", "0.04", "0.02", "0.49", "0.51", "-0.94", "0.93", "0.80", "-0.40", "0.79", "0.82", "-0.04", "0.38", "-0.24", "-0.17", "0.78", "-0.42", "0.92", "-0.83", "-0.01", "0.54", "0.73", "0.52", "0.95", "0.44", "0.90", "0.81", "0.42", "0.26", "0.36", null] -]; - -// for (i = 0; i < MAJOR_CURRENCIES.length; i++) { -// for (j = 0; j < MAJOR_CURRENCIES.length; j++) { -// if (i === j) { -// continue; -// } -// console.log(`${MAJOR_CURRENCIES[i] + MAJOR_CURRENCIES[j]}`); -// } -// } - -// let rows = []; -// let row = ['Symbol']; -// -// rows = []; -// for (j = 0; j < FX_CURRENCY_CODE.length; j++) { -// row.push(FX_CURRENCY_CODE[j]); -// } -// rows.push(row); -// -// for (i = 0; i < FX_CURRENCY_CODE.length; i++) { -// let row = []; -// row.push(FX_CURRENCY_CODE[i]); -// -// for (j = 0; j < FX_CURRENCY_CODE.length; j++) { -// if (i === j) { -// row.push(null); -// } else { -// var mutliplier = ((Math.random() * 10) > 8) ? -1 : 1; -// row.push((mutliplier * Math.random()).toFixed(2)) -// // row.push(`${FX_CURRENCY_CODE[j]} value`) -// } -// } -// -// rows.push(row); -// } -// -// JSON.stringify(rows); - -const FX_CURRENCY_CODE = [ - 'USDGBP', - 'USDEUR', - 'USDAED', - 'USDJPY', - 'USDCAD', - 'USDCHF', - 'GBPUSD', - 'GBPEUR', - 'GBPAED', - 'GBPJPY', - 'GBPCAD', - 'GBPCHF', - 'EURUSD', - 'EURGBP', - 'EURAED', - 'EURJPY', - 'EURCAD', - 'EURCHF', - 'AEDUSD', - 'AEDGBP', - 'AEDEUR', - 'AEDJPY', - 'AEDCAD', - 'AEDCHF', - 'JPYUSD', - 'JPYGBP', - 'JPYEUR', - 'JPYAED', - 'JPYCAD', - 'JPYCHF', - 'CADUSD', - 'CADGBP', - 'CADEUR', - 'CADAED', - 'CADJPY', - 'CADCHF', - 'CHFUSD', - 'CHFGBP', - 'CHFEUR', - 'CHFAED', - 'CHFJPY', - 'CHFCAD' -]; - -const MAJOR_CURRENCIES = [ - 'USD', - 'GBP', - 'EUR', - 'AED', - 'JPY', - 'CAD', - 'CHF']; - -const SECONDARY_CURRENCIES = [ - 'AFN', - 'ALL', - 'AMD', - 'ANG', - 'AOA', - 'ARS', - 'AUD', - 'AWG', - 'AZN', - 'BAM', - 'BBD', - 'BDT', - 'BGN', - 'BHD', - 'BIF', - 'BMD', - 'BND', - 'BOB', - 'BRL', - 'BSD', - 'BTN', - 'BWP', - 'BYN', - 'BZD', - 'CDF', - 'CLP', - 'CNY', - 'COP', - 'CRC', - 'CUC', - 'CUP', - 'CVE', - 'CZK', - 'DJF', - 'DKK', - 'DOP', - 'DZD', - 'EGP', - 'ERN', - 'ETB', - 'FJD', - 'FKP', - 'GEL', - 'GGP', - 'GHS', - 'GIP', - 'GMD', - 'GNF', - 'GTQ', - 'GYD', - 'HKD', - 'HNL', - 'HRK', - 'HTG', - 'HUF', - 'IDR', - 'ILS', - 'IMP', - 'INR', - 'IQD', - 'IRR', - 'ISK', - 'JEP', - 'JMD', - 'JOD', - 'KES', - 'KGS', - 'KHR', - 'KMF', - 'KPW', - 'KRW', - 'KWD', - 'KYD', - 'KZT', - 'LAK', - 'LBP', - 'LKR', - 'LRD', - 'LSL', - 'LYD', - 'MAD', - 'MDL', - 'MGA', - 'MKD', - 'MMK', - 'MNT', - 'MOP', - 'MRO', - 'MUR', - 'MVR', - 'MWK', - 'MXN', - 'MYR', - 'MZN', - 'NAD', - 'NGN', - 'NIO', - 'NOK', - 'NPR', - 'NZD', - 'OMR', - 'PAB', - 'PEN', - 'PGK', - 'PHP', - 'PKR', - 'PLN', - 'PYG', - 'QAR', - 'RON', - 'RSD', - 'RUB', - 'RWF', - 'SAR', - 'SBD', - 'SCR', - 'SDG', - 'SEK', - 'SGD', - 'SHP', - 'SLL', - 'SOS', - 'SPL', - 'SRD', - 'STD', - 'SVC', - 'SYP', - 'SZL', - 'THB', - 'TJS', - 'TMT', - 'TND', - 'TOP', - 'TRY', - 'TTD', - 'TVD', - 'TWD', - 'TZS', - 'UAH', - 'UGX', - 'UYU', - 'UZS', - 'VEF', - 'VND', - 'VUV', - 'WST', - 'XAF', - 'XCD', - 'XDR', - 'XOF', - 'XPF', - 'YER', - 'ZMW', - 'ZWD', - 'ZAR']; +]; \ No newline at end of file diff --git a/src-trader-dashboard/services/FxDataService.jsx b/src-trader-dashboard/services/FxDataService.jsx new file mode 100644 index 0000000..f7c8979 --- /dev/null +++ b/src-trader-dashboard/services/FxDataService.jsx @@ -0,0 +1,420 @@ +import sampleSize from "lodash/sampleSize"; + +import StoreService from "./StoreService"; +import fxDataUpdated from "../actions/fxDataUpdated"; + +export default class { + constructor() { + this.store = StoreService.STORE; + + this.fxData = this.createFxMatrixSnapshot(); + + this.store.dispatch(fxDataUpdated(this.fxData)); + + setInterval(() => { + this.applyDeltasToFxData(); + this.store.dispatch(fxDataUpdated(this.fxData)); + }, 1500) + } + + applyDeltasToFxData() { + let fxSymbolsToUpdate = sampleSize(FX_CURRENCY_SYMBOLS, FX_CURRENCY_SYMBOLS.length / 5); + let rowsToUpdate = sampleSize(this.fxData, this.fxData.length / 5); + for (let i = 0; i < rowsToUpdate.length; i++) { + let row = rowsToUpdate[i]; + + let maxSwing = row.last * 0.05; // max 5% swing + let swing = Math.floor(this.random(-maxSwing, maxSwing)); + row.last = row.last + swing; + row.net = swing; + row.pct_net_change = (row.net / row.last).toFixed(2); + + for (let symbolToUpdate of fxSymbolsToUpdate) { + if(row[symbolToUpdate] === null) { + continue; + } + + let multiplier = ((Math.random() * 10) > 8) ? -1 : 1; + row[symbolToUpdate] = (multiplier * Math.random()).toFixed(2); + } + } + return this.fxData; + } + + random(min, max) { + return parseFloat((Math.random() * (max - min + 1) + min)) + } + + getFxMatrixHeaderNames() { + return FX_DELTA_HEADERS; + } + + createFxMatrixSnapshot() { + let columns = FX_CURRENCY_MATRIX[0]; + let data = FX_CURRENCY_MATRIX.slice(1); + + let rowData = []; + for (let i = 0; i < data.length; i++) { + let currentRow = data[i]; + + let row = {}; + for (let j = 0; j < columns.length; j++) { + row[columns[j]] = currentRow[j]; + } + + // last, net and % change are different + row['last'] = Math.floor(this.random(7000, 170000)); + row['net'] = Math.floor(this.random(-500, 500)); + row['pct_net_change'] = this.random(-1, 1).toFixed(2); + + rowData.push(row); + } + return rowData; + } +} + +const FX_CURRENCY_SYMBOLS = ["USDGBP", "USDEUR", "USDAED", "USDJPY", "USDCAD", "USDCHF", "GBPUSD", "GBPEUR", "GBPAED", "GBPJPY", "GBPCAD", "GBPCHF", "EURUSD", "EURGBP", "EURAED", "EURJPY", "EURCAD", "EURCHF", "AEDUSD", "AEDGBP", "AEDEUR", "AEDJPY", "AEDCAD", "AEDCHF", "JPYUSD", "JPYGBP", "JPYEUR", "JPYAED", "JPYCAD", "JPYCHF", "CADUSD", "CADGBP", "CADEUR", "CADAED", "CADJPY", "CADCHF", "CHFUSD", "CHFGBP", "CHFEUR", "CHFAED", "CHFJPY", "CHFCAD"]; +const FX_DELTA_HEADERS = [ + { + field: 'symbol', + headerName: 'Symbol', + width: 80 + }, + { + field: 'last', + headerName: 'Last', + headerClass: 'align-right', + cellRenderer: 'animateShowChange', + cellClass: 'align-right', + width: 100 + }, + { + field: 'net', + headerName: 'Net', + headerClass: 'align-right', + cellRenderer: 'animateShowChange', + cellClass: 'align-right', + width: 90 + }, + { + field: 'pct_net_change', + headerName: '% NC', + headerClass: 'align-right', + cellClass: 'align-right', // to be removed once the component is in place + // cellRendererFramework: HorizontalBarComponent, + width: 50, + cellClassRules: { + 'pct-change-green': 'x > 0', + 'pct-change-amber': 'x <= 0 && x >= -0.10', + 'pct-change-red': 'x < -0.10' + } + }, +].concat(FX_CURRENCY_SYMBOLS.map((symbol) => { + "use strict"; + return { + field: symbol, + headerName: symbol, + width: 67, + cellClass: 'align-right', + cellRenderer: 'animateShowChange', + cellClassRules: { + 'fx-postive': 'x > 0.8', + 'fx-null': 'x === null', + 'fx-negative': 'x < -0.8' + } + } +})); + +const FX_CURRENCY_MATRIX = [ + ["symbol", ...FX_CURRENCY_SYMBOLS], + ["USDGBP", null, "0.89", "-0.01", "0.29", "0.28", "-0.04", "0.47", "0.17", "0.20", "0.11", "0.97", "0.07", "-0.20", "0.57", "0.54", "0.26", "0.33", "0.86", "0.95", "0.39", "0.21", "-0.49", "0.63", "-0.13", "-0.86", "0.18", "-0.84", "-0.89", "0.05", "-0.29", "0.34", "0.93", "0.41", "0.13", "-0.17", "0.70", "-0.17", "0.60", "0.00", "0.09", "-0.15", "0.10"], + ["USDEUR", "0.89", null, "0.25", "0.29", "0.86", "-0.93", "0.09", "0.63", "0.76", "0.10", "0.51", "-0.31", "-0.51", "0.20", "0.48", "-0.42", "0.73", "0.57", "0.65", "0.40", "0.12", "0.24", "0.42", "0.75", "0.13", "0.75", "0.42", "-0.80", "-0.26", "0.68", "0.68", "0.98", "0.87", "0.48", "0.52", "0.23", "0.61", "0.71", "-0.61", "0.40", "-0.80", "-0.89"], + ["USDAED", "0.90", "0.95", null, "0.71", "0.49", "0.50", "0.51", "0.07", "0.80", "-0.74", "0.54", "0.46", "-0.90", "-0.33", "0.75", "0.91", "0.84", "0.86", "0.89", "0.68", "0.71", "0.74", "0.58", "-0.24", "0.31", "0.85", "0.28", "0.44", "0.51", "-0.19", "0.71", "0.81", "0.85", "0.23", "0.09", "0.65", "-0.48", "0.43", "0.97", "0.11", "-0.81", "-0.69"], + ["USDJPY", "0.84", "0.92", "0.36", null, "0.79", "0.90", "0.86", "0.42", "0.14", "0.98", "0.47", "0.76", "0.60", "0.15", "0.04", "0.58", "0.13", "-0.16", "0.63", "0.86", "-0.63", "-0.95", "0.42", "0.08", "0.90", "-0.39", "-0.16", "0.66", "0.95", "0.31", "0.66", "-0.84", "0.06", "-0.60", "0.08", "0.57", "0.93", "0.78", "0.15", "0.36", "0.78", "0.34"], + ["USDCAD", "0.79", "-0.87", "0.93", "0.83", null, "0.10", "0.60", "0.34", "0.98", "0.70", "0.09", "0.46", "0.80", "0.10", "0.26", "-0.90", "0.69", "-0.22", "0.51", "-0.75", "-0.08", "0.07", "0.24", "0.68", "0.60", "0.37", "0.92", "0.02", "0.66", "0.16", "0.24", "-0.79", "0.19", "0.19", "0.08", "-0.97", "-0.93", "0.04", "-0.92", "0.86", "-0.36", "0.04"], + ["USDCHF", "0.94", "-0.02", "0.70", "0.82", "0.41", null, "0.76", "0.06", "0.46", "0.99", "0.07", "0.72", "0.14", "0.90", "0.23", "-0.54", "0.64", "0.80", "0.16", "0.23", "0.66", "-0.89", "-0.54", "-0.95", "0.27", "0.56", "0.42", "0.41", "0.88", "0.81", "0.37", "0.75", "0.06", "-0.75", "0.98", "0.21", "0.01", "0.03", "0.35", "-0.42", "0.55", "0.19"], + ["GBPUSD", "0.05", "-0.64", "0.47", "0.56", "0.51", "-0.47", null, "-0.15", "0.13", "0.55", "0.58", "0.57", "-0.49", "0.28", "0.86", "0.49", "0.12", "-0.91", "0.06", "0.12", "0.18", "-0.02", "-0.55", "0.18", "0.29", "0.76", "0.11", "0.04", "0.55", "0.16", "0.84", "0.83", "-0.94", "0.32", "0.07", "-0.33", "-0.29", "0.01", "-0.19", "0.01", "-0.60", "0.66"], + ["GBPEUR", "-0.32", "0.17", "0.60", "-0.52", "-0.52", "0.39", "-0.42", null, "0.07", "0.69", "0.67", "0.01", "0.72", "0.35", "0.66", "-0.66", "0.21", "0.12", "0.42", "-0.57", "-0.04", "0.48", "0.91", "0.72", "-0.16", "0.79", "0.03", "0.44", "0.17", "0.87", "-0.82", "0.20", "0.88", "0.48", "0.59", "-0.70", "0.12", "0.56", "-0.69", "0.10", "0.90", "1.00"], + ["GBPAED", "0.76", "0.05", "0.72", "-0.40", "0.93", "0.64", "0.90", "0.21", null, "0.91", "0.33", "-0.36", "0.28", "0.87", "0.25", "0.33", "0.44", "0.89", "0.17", "0.96", "0.86", "0.88", "0.03", "-0.25", "0.21", "0.98", "-0.60", "0.07", "0.90", "0.23", "0.41", "0.77", "0.83", "0.94", "0.12", "0.37", "0.58", "0.35", "-0.53", "0.49", "0.96", "-0.06"], + ["GBPJPY", "0.63", "0.72", "0.59", "0.89", "-0.54", "0.97", "0.61", "0.64", "0.85", null, "0.35", "0.57", "0.25", "0.85", "0.27", "-0.70", "-0.30", "-0.36", "0.29", "0.82", "0.26", "0.69", "0.46", "0.01", "0.09", "0.78", "0.95", "0.16", "0.07", "0.41", "0.99", "0.67", "0.34", "-0.89", "0.83", "0.32", "0.21", "-0.48", "-0.64", "0.65", "0.58", "0.69"], + ["GBPCAD", "0.78", "0.09", "0.33", "0.11", "0.95", "0.01", "0.96", "0.72", "0.13", "0.02", null, "0.44", "0.63", "-0.52", "0.08", "-0.85", "0.74", "0.41", "0.52", "0.15", "-0.97", "0.61", "0.58", "0.47", "0.56", "0.37", "0.54", "-0.65", "0.98", "0.44", "0.28", "0.70", "0.44", "0.34", "0.95", "0.82", "-0.09", "0.62", "0.87", "0.25", "-1.00", "0.99"], + ["GBPCHF", "-0.87", "0.68", "0.84", "0.83", "0.50", "0.74", "0.02", "0.11", "-0.12", "0.36", "0.71", null, "0.45", "0.02", "0.51", "0.50", "-0.03", "-0.94", "0.23", "0.38", "0.09", "0.26", "0.14", "0.39", "0.36", "0.01", "0.76", "0.21", "0.03", "0.97", "-0.89", "0.68", "0.43", "0.43", "0.26", "0.01", "0.60", "0.15", "0.77", "0.51", "-0.31", "0.37"], + ["EURUSD", "-0.45", "-0.05", "0.14", "-0.11", "0.36", "0.12", "0.76", "0.66", "0.50", "0.31", "0.28", "0.90", null, "-0.04", "0.73", "0.33", "0.27", "0.22", "0.86", "0.79", "-0.29", "0.30", "0.89", "0.73", "0.94", "0.24", "0.19", "0.81", "0.88", "0.46", "0.19", "0.79", "-0.16", "0.85", "0.84", "-0.57", "-0.87", "0.86", "0.69", "0.12", "0.64", "0.13"], + ["EURGBP", "0.06", "0.81", "0.54", "0.57", "0.57", "0.81", "0.38", "0.70", "0.37", "0.58", "-0.56", "0.77", "0.59", null, "0.98", "-0.48", "0.60", "0.78", "0.22", "0.20", "-0.62", "-0.97", "-0.55", "0.39", "0.88", "0.96", "0.32", "0.84", "0.26", "-0.47", "0.04", "0.34", "-0.24", "0.53", "-0.75", "-0.97", "0.47", "0.81", "0.49", "-0.84", "0.94", "0.09"], + ["EURAED", "0.61", "0.59", "0.11", "0.21", "0.41", "-0.45", "0.32", "0.90", "-0.98", "0.38", "0.27", "0.62", "0.67", "0.89", null, "0.27", "0.65", "0.72", "0.69", "0.66", "0.12", "0.32", "0.11", "-0.73", "-0.17", "0.74", "0.03", "0.96", "0.59", "-0.92", "-0.91", "-0.41", "0.09", "0.45", "0.90", "0.88", "0.96", "0.47", "0.95", "0.27", "-0.48", "0.71"], + ["EURJPY", "-0.01", "0.36", "0.28", "0.68", "0.50", "0.25", "0.81", "0.64", "0.12", "-0.73", "-0.47", "0.96", "-0.98", "-0.41", "0.78", null, "0.19", "-0.37", "0.24", "0.63", "0.74", "-0.24", "0.46", "0.63", "0.99", "0.65", "0.52", "0.11", "0.52", "0.39", "0.41", "0.51", "0.78", "1.00", "0.80", "-0.11", "0.90", "0.96", "0.66", "0.32", "0.02", "0.19"], + ["EURCAD", "-0.80", "0.40", "0.35", "0.45", "0.66", "0.21", "0.77", "0.58", "0.09", "1.00", "0.02", "-0.85", "0.89", "0.63", "-0.05", "0.46", null, "0.87", "0.96", "-0.48", "0.40", "0.18", "0.37", "0.81", "0.50", "-0.06", "-0.56", "0.38", "0.02", "0.83", "-0.93", "0.80", "0.31", "0.10", "0.70", "0.55", "0.47", "0.77", "0.98", "0.88", "0.19", "0.91"], + ["EURCHF", "-0.93", "0.01", "-0.29", "0.46", "-0.59", "-0.15", "0.58", "0.00", "-0.62", "0.36", "0.27", "-0.10", "-0.10", "0.57", "0.57", "0.75", "-0.10", null, "0.88", "0.21", "0.89", "0.85", "0.16", "0.93", "0.60", "0.59", "0.42", "0.70", "0.66", "0.80", "0.83", "0.52", "0.01", "0.41", "0.68", "0.94", "0.81", "0.40", "0.69", "0.04", "0.70", "0.61"], + ["AEDUSD", "0.10", "0.45", "0.06", "-0.37", "-0.14", "0.63", "0.10", "0.77", "0.95", "-0.12", "1.00", "-0.19", "-0.59", "0.78", "0.10", "0.76", "-0.45", "-0.99", null, "-0.46", "0.28", "0.31", "0.32", "0.42", "-0.00", "0.66", "0.24", "0.31", "0.10", "0.73", "0.02", "0.78", "0.07", "1.00", "0.43", "0.61", "0.53", "0.53", "0.41", "0.37", "0.97", "-0.19"], + ["AEDGBP", "0.70", "0.73", "0.34", "0.97", "0.84", "0.05", "0.21", "0.14", "0.45", "0.69", "0.41", "-0.53", "0.28", "0.13", "0.99", "0.97", "0.93", "0.62", "0.35", null, "0.18", "0.96", "0.58", "0.04", "0.00", "0.58", "-0.54", "0.35", "0.84", "0.83", "-0.20", "0.51", "0.32", "0.01", "0.95", "0.69", "-0.73", "0.36", "0.78", "0.02", "0.22", "0.39"], + ["AEDEUR", "0.18", "0.84", "-0.89", "0.90", "-0.25", "0.53", "0.71", "0.80", "0.60", "-0.98", "-0.81", "0.57", "0.72", "0.32", "-0.23", "0.98", "0.50", "0.93", "0.56", "0.26", null, "0.61", "0.47", "0.72", "0.58", "0.19", "0.94", "0.21", "0.47", "0.70", "0.67", "0.85", "0.98", "0.15", "0.21", "0.43", "0.03", "0.92", "0.91", "0.35", "0.70", "0.85"], + ["AEDJPY", "0.88", "0.62", "0.50", "0.27", "0.56", "0.61", "0.06", "-0.02", "0.42", "0.26", "0.23", "0.83", "-0.55", "0.94", "0.01", "0.72", "-0.43", "0.10", "0.01", "-0.20", "0.13", null, "0.70", "0.10", "0.05", "0.43", "-0.14", "-0.64", "0.80", "0.79", "0.57", "0.14", "0.14", "0.04", "-0.96", "0.59", "0.14", "0.51", "0.23", "0.57", "0.94", "0.88"], + ["AEDCAD", "0.75", "-0.99", "0.82", "-0.87", "0.79", "1.00", "0.21", "0.30", "-0.40", "0.34", "-0.85", "0.41", "0.79", "0.17", "0.58", "-0.24", "0.18", "0.15", "0.18", "0.44", "0.34", "0.90", null, "0.10", "0.34", "0.31", "0.34", "0.79", "-0.05", "0.19", "-0.86", "0.61", "-0.65", "0.23", "0.59", "0.69", "-0.65", "0.89", "0.97", "0.12", "0.63", "-0.24"], + ["AEDCHF", "0.67", "0.46", "0.92", "0.22", "0.91", "0.67", "0.81", "0.04", "0.29", "0.13", "0.80", "0.95", "0.29", "0.99", "-0.17", "0.58", "0.64", "0.68", "0.41", "0.69", "0.84", "0.01", "0.04", null, "0.07", "0.16", "0.26", "-0.43", "0.08", "0.58", "0.33", "-0.28", "0.03", "-0.08", "0.54", "-0.91", "0.78", "-0.10", "-0.13", "0.15", "0.62", "-0.13"], + ["JPYUSD", "-0.67", "0.90", "0.84", "0.10", "0.77", "0.43", "0.59", "0.69", "0.63", "0.82", "-0.61", "0.41", "0.07", "0.48", "1.00", "-0.52", "0.22", "0.89", "0.43", "0.54", "0.56", "-0.43", "0.78", "0.67", null, "0.06", "0.28", "0.04", "0.62", "0.18", "0.77", "0.63", "0.05", "0.87", "0.22", "0.21", "0.07", "0.25", "-0.55", "0.67", "0.10", "-0.67"], + ["JPYGBP", "0.21", "0.46", "0.23", "0.53", "-0.97", "0.78", "0.43", "0.74", "-0.95", "0.98", "0.49", "0.66", "0.18", "0.55", "-0.33", "0.67", "0.65", "0.23", "-0.07", "-0.67", "0.56", "0.74", "-0.38", "-0.83", "-0.51", null, "-0.26", "-0.79", "0.73", "-0.78", "-0.09", "0.19", "0.48", "0.97", "0.11", "0.19", "0.51", "0.32", "0.81", "-0.02", "0.17", "0.48"], + ["JPYEUR", "0.83", "0.86", "0.62", "-0.92", "0.64", "0.58", "0.55", "0.07", "0.81", "0.32", "0.33", "0.96", "0.48", "0.57", "0.25", "0.56", "0.33", "0.02", "-0.79", "0.44", "0.95", "0.35", "0.41", "0.06", "0.28", "0.77", null, "0.64", "0.79", "0.74", "0.67", "-0.97", "0.47", "-0.11", "0.03", "0.39", "-0.37", "0.06", "0.09", "0.13", "0.20", "0.87"], + ["JPYAED", "0.69", "0.80", "0.90", "0.06", "0.55", "0.90", "-0.09", "0.05", "-0.10", "0.31", "0.57", "0.69", "-0.78", "0.42", "0.64", "0.96", "0.08", "-0.76", "0.59", "0.00", "0.40", "-0.88", "0.69", "0.17", "-0.16", "0.57", "0.86", null, "-0.61", "-0.14", "0.41", "-0.16", "0.36", "0.95", "0.44", "0.41", "0.35", "-0.56", "0.25", "0.66", "0.90", "0.82"], + ["JPYCAD", "0.33", "0.27", "0.61", "0.01", "-0.16", "0.21", "0.57", "-0.41", "-0.56", "0.55", "0.13", "-0.87", "0.19", "0.64", "-0.38", "-0.80", "-0.10", "0.44", "0.72", "-0.72", "0.48", "0.42", "0.84", "0.73", "0.35", "0.68", "0.01", "0.09", null, "0.87", "0.17", "0.45", "0.02", "0.01", "0.77", "0.24", "0.62", "0.39", "-0.73", "0.21", "-0.08", "0.42"], + ["JPYCHF", "-0.45", "0.52", "0.34", "0.85", "0.16", "0.96", "0.53", "0.62", "0.46", "0.94", "0.08", "-0.68", "0.81", "0.44", "0.27", "0.75", "-0.84", "0.69", "-0.99", "0.41", "0.66", "-0.94", "0.21", "0.85", "-0.08", "0.36", "0.62", "0.25", "-0.48", null, "0.51", "-0.39", "0.60", "0.63", "0.68", "0.10", "0.62", "0.68", "0.00", "0.24", "0.61", "0.23"], + ["CADUSD", "-0.65", "0.73", "0.93", "0.27", "-0.00", "-0.46", "0.53", "0.36", "0.83", "0.58", "0.40", "0.03", "0.32", "0.38", "-0.53", "0.86", "0.42", "0.90", "0.83", "0.94", "0.34", "-0.56", "0.46", "-0.72", "0.13", "0.08", "0.25", "0.59", "0.75", "0.72", null, "0.62", "0.73", "0.52", "0.28", "0.03", "-0.54", "0.50", "0.76", "-0.28", "0.89", "0.97"], + ["CADGBP", "0.74", "0.58", "0.55", "0.01", "0.33", "0.61", "0.75", "0.86", "-0.87", "0.50", "0.57", "0.84", "-0.34", "1.00", "0.77", "0.75", "0.40", "0.12", "-0.57", "-0.16", "-0.91", "0.06", "0.67", "-0.55", "0.02", "0.78", "0.57", "0.70", "0.21", "0.95", "-0.91", null, "-0.82", "0.71", "0.36", "0.46", "0.46", "0.24", "0.15", "0.54", "0.15", "0.83"], + ["CADEUR", "-0.58", "0.29", "0.03", "0.70", "0.77", "0.80", "0.52", "0.04", "0.11", "0.86", "-0.98", "0.02", "0.01", "-0.19", "-0.48", "0.80", "0.90", "0.10", "0.28", "0.88", "0.98", "0.43", "0.47", "-0.41", "-0.92", "0.49", "0.64", "-0.60", "0.11", "0.61", "0.19", "-0.39", null, "-0.21", "0.56", "-0.45", "-0.48", "0.51", "0.04", "-0.44", "-0.22", "-0.29"], + ["CADAED", "0.07", "0.55", "0.99", "-0.41", "0.65", "0.75", "0.97", "0.74", "0.65", "0.37", "-0.04", "0.85", "0.83", "0.25", "0.14", "-0.00", "0.80", "0.78", "-0.42", "0.54", "-0.42", "-0.07", "-0.62", "0.56", "0.89", "0.92", "0.19", "0.64", "0.45", "0.24", "0.97", "0.41", "0.36", null, "-0.54", "-0.85", "-0.68", "0.48", "0.13", "0.61", "0.75", "0.21"], + ["CADJPY", "-0.84", "0.71", "0.59", "-0.78", "0.92", "0.93", "0.03", "0.27", "0.22", "0.71", "-0.79", "0.72", "0.27", "0.29", "0.40", "0.66", "0.44", "-0.33", "0.24", "0.99", "-0.95", "0.74", "0.42", "0.45", "0.08", "0.46", "0.22", "0.70", "0.80", "0.36", "0.36", "0.94", "0.75", "0.51", null, "0.10", "0.31", "0.54", "1.00", "0.78", "0.17", "0.32"], + ["CADCHF", "0.19", "0.00", "0.62", "-0.63", "0.75", "0.57", "0.28", "-0.98", "0.17", "-0.63", "0.09", "0.10", "-0.09", "0.22", "0.65", "0.20", "0.27", "-0.66", "-0.70", "0.72", "0.40", "0.96", "0.52", "0.38", "0.96", "0.90", "0.35", "-0.70", "0.37", "0.94", "0.20", "0.78", "0.34", "0.24", "-0.18", null, "0.05", "0.71", "0.05", "0.38", "0.02", "0.60"], + ["CHFUSD", "0.42", "0.61", "-0.30", "-0.27", "0.46", "0.63", "0.64", "0.33", "0.18", "0.88", "0.99", "0.73", "0.85", "0.07", "0.53", "0.31", "-0.63", "0.56", "-0.04", "-0.68", "0.43", "-0.96", "0.45", "0.45", "0.50", "0.17", "0.82", "0.34", "0.26", "0.16", "0.71", "0.35", "0.57", "0.79", "0.56", "0.55", null, "0.02", "-0.90", "0.84", "0.33", "0.18"], + ["CHFGBP", "-0.38", "0.73", "0.25", "0.64", "0.41", "-0.48", "0.75", "-0.40", "0.37", "0.62", "0.30", "0.06", "0.54", "0.15", "0.51", "0.33", "-0.79", "-0.05", "-0.54", "0.21", "0.40", "0.86", "0.96", "0.94", "0.52", "0.07", "0.71", "-0.80", "-0.40", "0.71", "0.71", "0.89", "0.43", "-0.68", "0.93", "0.05", "0.42", null, "0.59", "-0.67", "0.03", "0.17"], + ["CHFEUR", "-0.64", "0.96", "-0.34", "0.71", "0.53", "0.44", "0.27", "0.56", "0.96", "0.40", "0.86", "0.65", "0.82", "0.89", "-0.75", "0.29", "0.06", "0.70", "0.23", "0.68", "0.79", "0.21", "0.50", "0.14", "-0.27", "-0.83", "-0.22", "0.59", "0.40", "0.10", "0.88", "0.99", "0.21", "-0.36", "0.00", "0.53", "0.08", "0.08", null, "0.53", "-0.51", "0.03"], + ["CHFAED", "-0.99", "0.71", "0.51", "0.58", "0.57", "0.73", "0.60", "0.23", "0.02", "0.84", "0.90", "0.56", "0.03", "-0.93", "0.59", "0.24", "-0.67", "0.13", "0.99", "0.28", "0.72", "0.79", "-0.83", "-0.30", "0.73", "0.08", "-0.02", "0.85", "0.33", "0.57", "0.09", "0.26", "0.16", "0.80", "0.65", "-0.19", "-0.38", "-0.61", "-0.98", null, "0.57", "-0.81"], + ["CHFJPY", "0.60", "0.96", "0.22", "0.52", "0.63", "0.24", "0.76", "0.91", "0.80", "-0.14", "0.59", "-0.01", "0.60", "-0.08", "0.63", "0.39", "0.30", "-0.71", "0.18", "0.94", "-0.30", "0.28", "0.87", "0.92", "-0.19", "0.18", "-0.40", "0.44", "0.88", "0.52", "0.50", "0.44", "0.84", "0.24", "0.09", "0.15", "0.10", "0.30", "-0.05", "0.79", null, "0.99"], + ["CHFCAD", "0.93", "0.24", "0.05", "0.40", "0.75", "0.12", "0.90", "0.56", "0.46", "0.62", "0.71", "0.01", "0.04", "0.02", "0.49", "0.51", "-0.94", "0.93", "0.80", "-0.40", "0.79", "0.82", "-0.04", "0.38", "-0.24", "-0.17", "0.78", "-0.42", "0.92", "-0.83", "-0.01", "0.54", "0.73", "0.52", "0.95", "0.44", "0.90", "0.81", "0.42", "0.26", "0.36", null] +]; + +// for (i = 0; i < MAJOR_CURRENCIES.length; i++) { +// for (j = 0; j < MAJOR_CURRENCIES.length; j++) { +// if (i === j) { +// continue; +// } +// console.log(`${MAJOR_CURRENCIES[i] + MAJOR_CURRENCIES[j]}`); +// } +// } + +// let rows = []; +// let row = ['Symbol']; +// +// rows = []; +// for (j = 0; j < FX_CURRENCY_CODE.length; j++) { +// row.push(FX_CURRENCY_CODE[j]); +// } +// rows.push(row); +// +// for (i = 0; i < FX_CURRENCY_CODE.length; i++) { +// let row = []; +// row.push(FX_CURRENCY_CODE[i]); +// +// for (j = 0; j < FX_CURRENCY_CODE.length; j++) { +// if (i === j) { +// row.push(null); +// } else { +// var mutliplier = ((Math.random() * 10) > 8) ? -1 : 1; +// row.push((mutliplier * Math.random()).toFixed(2)) +// // row.push(`${FX_CURRENCY_CODE[j]} value`) +// } +// } +// +// rows.push(row); +// } +// +// JSON.stringify(rows); +// +// const FX_CURRENCY_CODE = [ +// 'USDGBP', +// 'USDEUR', +// 'USDAED', +// 'USDJPY', +// 'USDCAD', +// 'USDCHF', +// 'GBPUSD', +// 'GBPEUR', +// 'GBPAED', +// 'GBPJPY', +// 'GBPCAD', +// 'GBPCHF', +// 'EURUSD', +// 'EURGBP', +// 'EURAED', +// 'EURJPY', +// 'EURCAD', +// 'EURCHF', +// 'AEDUSD', +// 'AEDGBP', +// 'AEDEUR', +// 'AEDJPY', +// 'AEDCAD', +// 'AEDCHF', +// 'JPYUSD', +// 'JPYGBP', +// 'JPYEUR', +// 'JPYAED', +// 'JPYCAD', +// 'JPYCHF', +// 'CADUSD', +// 'CADGBP', +// 'CADEUR', +// 'CADAED', +// 'CADJPY', +// 'CADCHF', +// 'CHFUSD', +// 'CHFGBP', +// 'CHFEUR', +// 'CHFAED', +// 'CHFJPY', +// 'CHFCAD' +// ]; +// +// const MAJOR_CURRENCIES = [ +// 'USD', +// 'GBP', +// 'EUR', +// 'AED', +// 'JPY', +// 'CAD', +// 'CHF']; +// +// const SECONDARY_CURRENCIES = [ +// 'AFN', +// 'ALL', +// 'AMD', +// 'ANG', +// 'AOA', +// 'ARS', +// 'AUD', +// 'AWG', +// 'AZN', +// 'BAM', +// 'BBD', +// 'BDT', +// 'BGN', +// 'BHD', +// 'BIF', +// 'BMD', +// 'BND', +// 'BOB', +// 'BRL', +// 'BSD', +// 'BTN', +// 'BWP', +// 'BYN', +// 'BZD', +// 'CDF', +// 'CLP', +// 'CNY', +// 'COP', +// 'CRC', +// 'CUC', +// 'CUP', +// 'CVE', +// 'CZK', +// 'DJF', +// 'DKK', +// 'DOP', +// 'DZD', +// 'EGP', +// 'ERN', +// 'ETB', +// 'FJD', +// 'FKP', +// 'GEL', +// 'GGP', +// 'GHS', +// 'GIP', +// 'GMD', +// 'GNF', +// 'GTQ', +// 'GYD', +// 'HKD', +// 'HNL', +// 'HRK', +// 'HTG', +// 'HUF', +// 'IDR', +// 'ILS', +// 'IMP', +// 'INR', +// 'IQD', +// 'IRR', +// 'ISK', +// 'JEP', +// 'JMD', +// 'JOD', +// 'KES', +// 'KGS', +// 'KHR', +// 'KMF', +// 'KPW', +// 'KRW', +// 'KWD', +// 'KYD', +// 'KZT', +// 'LAK', +// 'LBP', +// 'LKR', +// 'LRD', +// 'LSL', +// 'LYD', +// 'MAD', +// 'MDL', +// 'MGA', +// 'MKD', +// 'MMK', +// 'MNT', +// 'MOP', +// 'MRO', +// 'MUR', +// 'MVR', +// 'MWK', +// 'MXN', +// 'MYR', +// 'MZN', +// 'NAD', +// 'NGN', +// 'NIO', +// 'NOK', +// 'NPR', +// 'NZD', +// 'OMR', +// 'PAB', +// 'PEN', +// 'PGK', +// 'PHP', +// 'PKR', +// 'PLN', +// 'PYG', +// 'QAR', +// 'RON', +// 'RSD', +// 'RUB', +// 'RWF', +// 'SAR', +// 'SBD', +// 'SCR', +// 'SDG', +// 'SEK', +// 'SGD', +// 'SHP', +// 'SLL', +// 'SOS', +// 'SPL', +// 'SRD', +// 'STD', +// 'SVC', +// 'SYP', +// 'SZL', +// 'THB', +// 'TJS', +// 'TMT', +// 'TND', +// 'TOP', +// 'TRY', +// 'TTD', +// 'TVD', +// 'TWD', +// 'TZS', +// 'UAH', +// 'UGX', +// 'UYU', +// 'UZS', +// 'VEF', +// 'VND', +// 'VUV', +// 'WST', +// 'XAF', +// 'XCD', +// 'XDR', +// 'XOF', +// 'XPF', +// 'YER', +// 'ZMW', +// 'ZWD', +// 'ZAR']; diff --git a/src-trader-dashboard/services/StoreService.js b/src-trader-dashboard/services/StoreService.js new file mode 100644 index 0000000..909981d --- /dev/null +++ b/src-trader-dashboard/services/StoreService.js @@ -0,0 +1,8 @@ +import {createStore} from "redux"; + +import fxData from "../reducers/fxData"; + +class StoreService { +} +StoreService.STORE = createStore(fxData); +export default StoreService; \ No newline at end of file