diff --git a/DesignSpace/Workspace/FunctionLibraries/ChartingSpaceFunctions.js b/DesignSpace/Workspace/FunctionLibraries/ChartingSpaceFunctions.js index bd6676ddb..453752151 100644 --- a/DesignSpace/Workspace/FunctionLibraries/ChartingSpaceFunctions.js +++ b/DesignSpace/Workspace/FunctionLibraries/ChartingSpaceFunctions.js @@ -2,7 +2,8 @@ function newChartingSpaceFunctions() { thisObject = { addAllMineLayers: addAllMineLayers, addMissingDashboards: addMissingDashboards, - addMissingTimeMachines: addMissingTimeMachines + addMissingTimeMachines: addMissingTimeMachines, + createTimeMachine: createTimeMachine } return thisObject @@ -100,97 +101,101 @@ function newChartingSpaceFunctions() { let market = findNodeInNodeMesh(session, 'Market Trading Tasks', undefined, true, false, true, false) if (market.payload.referenceParent === undefined) { continue } if (isMissingChildren(node, session, true) === true) { - let mineProducts - let timeMachine = functionLibraryUiObjectsFromNodes.addUIObject(node, 'Time Machine') - timeMachine.payload.referenceParent = session - timeMachine.name = session.name + ' ' + session.type - timeMachine.payload.floatingObject.collapseToggle() - timeMachine.payload.floatingObject.angleToParent = ANGLE_TO_PARENT.RANGE_180 - /* - We need to create a Timeline Chart for each Data Mine Indicators. - */ - mineProducts = nodeBranchToArray(networkNode, 'Data Mine Products') - for (let j = 0; j < mineProducts.length; j++) { - let mineProduct = mineProducts[j] - /* - We need to filter out the ones that do not belong to the market where - the session is running at. - */ - if (mineProduct.payload.parentNode.payload.referenceParent === undefined) { continue } - if (mineProduct.payload.parentNode.payload.referenceParent.id !== market.payload.referenceParent.id) { continue } - - let timelineChart = functionLibraryUiObjectsFromNodes.addUIObject(timeMachine, 'Timeline Chart') - timelineChart.name = mineProduct.name - timelineChart.layersManager.payload.referenceParent = mineProduct - timelineChart.payload.floatingObject.collapseToggle() - timelineChart.layersManager.payload.floatingObject.collapseToggle() - - let menu = timelineChart.layersManager.payload.uiObject.menu - menu.internalClick('Add All Mine Layers') - menu.internalClick('Add All Mine Layers') - } - - mineProducts = nodeBranchToArray(networkNode, 'Trading Mine Products') - for (let j = 0; j < mineProducts.length; j++) { - let mineProduct = mineProducts[j] - /* - The mine products found so far, belongs to any session. To filer all the sessions - that are not the one we are interested in, we do the following: - */ - if (mineProduct.payload.parentNode === undefined) { continue } - if (mineProduct.payload.parentNode.payload.parentNode.payload.referenceParent === undefined) { continue } - if (mineProduct.payload.parentNode.payload.parentNode.payload.referenceParent.id !== session.id) { continue } - /* - At the current version of Superalgos, beta 6, there is only one Trading Mine, - with only one bot, and it has so many data products that we want to put them - in 3 different timeline charts. So we will create 3 charts, connect them, - and delete from each one 1/3 of the layers. We do all that next: - */ - - for (let k = 0; k < 3; k++) { - let timelineChart = functionLibraryUiObjectsFromNodes.addUIObject(timeMachine, 'Timeline Chart') - - timelineChart.layersManager.payload.referenceParent = mineProduct - timelineChart.payload.floatingObject.collapseToggle() - timelineChart.layersManager.payload.floatingObject.collapseToggle() - - let menu = timelineChart.layersManager.payload.uiObject.menu - menu.internalClick('Add All Mine Layers') - menu.internalClick('Add All Mine Layers') - - switch (k) { - case 0: { - timelineChart.name = 'Trading Engine' - deleteNodeByName('Trading System') - deleteNodeByName('Objects') - break - } - case 1: { - timelineChart.name = 'Trading System' - deleteNodeByName('Trading Engine') - deleteNodeByName('Objects') - break - } - case 2: { - timelineChart.name = 'Objects' - deleteNodeByName('Trading Engine') - deleteNodeByName('Trading System') - break - } - } - function deleteNodeByName(nodeName) { - let nodeToDelete = findNodeInNodeMesh(timelineChart.layersManager, undefined, nodeName, true, true, false, false) - if (nodeToDelete === undefined) { return } - functionLibraryNodeDeleter.deleteUIObject(nodeToDelete, rootNodes) - } - } - } + createTimeMachine(node, session, market.payload.referenceParent, networkNode, rootNodes, functionLibraryUiObjectsFromNodes, functionLibraryNodeDeleter) } } } } } + function createTimeMachine(dashboard, session, market, networkNode, rootNodes, functionLibraryUiObjectsFromNodes, functionLibraryNodeDeleter) { + let mineProducts + let timeMachine = functionLibraryUiObjectsFromNodes.addUIObject(dashboard, 'Time Machine') + timeMachine.payload.referenceParent = session + timeMachine.name = session.name + ' ' + session.type + timeMachine.payload.floatingObject.collapseToggle() + timeMachine.payload.floatingObject.angleToParent = ANGLE_TO_PARENT.RANGE_180 + /* + We need to create a Timeline Chart for each Data Mine Indicators. + */ + mineProducts = nodeBranchToArray(networkNode, 'Data Mine Products') + for (let j = 0; j < mineProducts.length; j++) { + let mineProduct = mineProducts[j] + /* + We need to filter out the ones that do not belong to the market where + the session is running at. + */ + if (mineProduct.payload.parentNode.payload.referenceParent === undefined) { continue } + if (mineProduct.payload.parentNode.payload.referenceParent.id !== market.id) { continue } + + let timelineChart = functionLibraryUiObjectsFromNodes.addUIObject(timeMachine, 'Timeline Chart') + timelineChart.name = mineProduct.name + timelineChart.layersManager.payload.referenceParent = mineProduct + timelineChart.payload.floatingObject.collapseToggle() + timelineChart.layersManager.payload.floatingObject.collapseToggle() + + let menu = timelineChart.layersManager.payload.uiObject.menu + menu.internalClick('Add All Mine Layers') + menu.internalClick('Add All Mine Layers') + } + + mineProducts = nodeBranchToArray(networkNode, 'Trading Mine Products') + for (let j = 0; j < mineProducts.length; j++) { + let mineProduct = mineProducts[j] + /* + The mine products found so far, belongs to any session. To filer all the sessions + that are not the one we are interested in, we do the following: + */ + if (mineProduct.payload.parentNode === undefined) { continue } + if (mineProduct.payload.parentNode.payload.parentNode.payload.referenceParent === undefined) { continue } + if (mineProduct.payload.parentNode.payload.parentNode.payload.referenceParent.id !== session.id) { continue } + /* + At the current version of Superalgos, beta 6, there is only one Trading Mine, + with only one bot, and it has so many data products that we want to put them + in 3 different timeline charts. So we will create 3 charts, connect them, + and delete from each one 1/3 of the layers. We do all that next: + */ + + for (let k = 0; k < 3; k++) { + let timelineChart = functionLibraryUiObjectsFromNodes.addUIObject(timeMachine, 'Timeline Chart') + + timelineChart.layersManager.payload.referenceParent = mineProduct + timelineChart.payload.floatingObject.collapseToggle() + timelineChart.layersManager.payload.floatingObject.collapseToggle() + + let menu = timelineChart.layersManager.payload.uiObject.menu + menu.internalClick('Add All Mine Layers') + menu.internalClick('Add All Mine Layers') + + switch (k) { + case 0: { + timelineChart.name = 'Trading Engine' + deleteNodeByName('Trading System') + deleteNodeByName('Objects') + break + } + case 1: { + timelineChart.name = 'Trading System' + deleteNodeByName('Trading Engine') + deleteNodeByName('Objects') + break + } + case 2: { + timelineChart.name = 'Objects' + deleteNodeByName('Trading Engine') + deleteNodeByName('Trading System') + break + } + } + function deleteNodeByName(nodeName) { + let nodeToDelete = findNodeInNodeMesh(timelineChart.layersManager, undefined, nodeName, true, true, false, false) + if (nodeToDelete === undefined) { return } + functionLibraryNodeDeleter.deleteUIObject(nodeToDelete, rootNodes) + } + } + } + } + function addMissingDashboards(node, rootNodes, functionLibraryUiObjectsFromNodes, functionLibraryNodeDeleter) { for (let i = 0; i < rootNodes.length; i++) { let rootNode = rootNodes[i] diff --git a/DesignSpace/Workspace/FunctionLibraries/CryptoEcosystemFunctions.js b/DesignSpace/Workspace/FunctionLibraries/CryptoEcosystemFunctions.js index ae28574ab..e67c29b25 100644 --- a/DesignSpace/Workspace/FunctionLibraries/CryptoEcosystemFunctions.js +++ b/DesignSpace/Workspace/FunctionLibraries/CryptoEcosystemFunctions.js @@ -206,7 +206,7 @@ function newCryptoEcosystemFunctions() { } } - function installMarket(node, rootNodes, functionLibraryUiObjectsFromNodes, functionLibraryNodeDeleter) { + function installMarket(node, rootNodes, functionLibraryUiObjectsFromNodes, functionLibraryNodeDeleter, functionLibraryChartingSpaceFunctions, functionLibraryDataStorageFunctions) { let market = node let cryptoExchange = findNodeInNodeMesh(node, 'Crypto Exchange', undefined, true, false, true, false) @@ -214,7 +214,7 @@ function newCryptoEcosystemFunctions() { node.payload.uiObject.setErrorMessage('Market must be a descendant of a Crypto Exchange') return } - let environmentArray = [] + let dashboardsArray = [] for (let i = 0; i < rootNodes.length; i++) { let rootNode = rootNodes[i] @@ -253,6 +253,8 @@ function newCryptoEcosystemFunctions() { menuClick(marketDataTask, 'Add Missing Data Mine Tasks', true) menuClickOfNodeArray(marketDataTask.dataMineTasks, 'Add All Tasks', true) + + let sessionsCreatedArray = [] /* Next we complete the missing stuff at Testing Environment */ @@ -272,15 +274,20 @@ function newCryptoEcosystemFunctions() { return } - /* This will be needed at the charging space, for creating Dashboards */ - environmentArray.push({ environmentNode: environmentFound, networkNode: networkNode}) - let exchangeTradingTasks = findOrCreateChildWithReference(environmentFound, 'Exchange Trading Tasks', cryptoExchange, functionLibraryUiObjectsFromNodes) exchangeTradingTasks.payload.floatingObject.angleToParent = ANGLE_TO_PARENT.RANGE_180 let marketTradingTask = findAndRecreateChildWithReference(exchangeTradingTasks, 'Market Trading Tasks', market, rootNodes, functionLibraryUiObjectsFromNodes, functionLibraryNodeDeleter) menuClick(marketTradingTask, 'Add Missing Trading Mine Tasks', true) menuClickOfNodeArray(marketTradingTask.tradingMineTasks, 'Add All Tasks', true) + + /* This will be needed at the charging space, for creating Dashboards */ + let backtestingSessionsArray = nodeBranchToArray(marketTradingTask, 'Backtesting Session') + let liveTradingSessionsArray = nodeBranchToArray(marketTradingTask, 'Live Trading Session') + let allSessionsArray = backtestingSessionsArray.concat(liveTradingSessionsArray) + sessionsCreatedArray = sessionsCreatedArray.concat(allSessionsArray) + + dashboardsArray.push({ environmentNode: environmentFound, networkNode: networkNode, sessionsArray: allSessionsArray }) } /* Here we complete the missing stuff at Session Independent Data @@ -309,9 +316,36 @@ function newCryptoEcosystemFunctions() { let exchangeSessions = findOrCreateChildWithReference(sessionBasedData, 'Exchange Sessions', cryptoExchange, functionLibraryUiObjectsFromNodes) exchangeSessions.payload.floatingObject.angleToParent = ANGLE_TO_PARENT.RANGE_180 - - menuClick(exchangeSessions, 'Add Missing Session References', true) - + /* + We need to delete all the session references related to the market we are installing. + We make a copy of the array so that if we need to delete some nodes it does not + affect the loop evaluating the nodes. + */ + let sessionReferencesArray = [] + for (let i = 0; i < exchangeSessions.sessionReferences.length; i++) { + sessionReference = exchangeSessions.sessionReferences[i] + sessionReferencesArray.push(sessionReference) + } + for (let i = 0; i < sessionReferencesArray.length; i++) { + sessionReference = sessionReferencesArray[i] + if (sessionReference.singleMarketTradingData === undefined) { continue } + if (sessionReference.singleMarketTradingData.payload.referenceParent === undefined) { continue } + if (sessionReference.singleMarketTradingData.payload.referenceParent.id === node.id) { + functionLibraryNodeDeleter.deleteUIObject(sessionReference, rootNodes) + } + } + /* + Create the new session references. + */ + for (let i = 0; i < sessionsCreatedArray.length; i++) { + let session = sessionsCreatedArray[i] + if (isMissingChildren(exchangeSessions, session, true) === true) { + functionLibraryDataStorageFunctions.createSessionReference(exchangeSessions, session, functionLibraryUiObjectsFromNodes) + } + } + /* + Create everything inside the session references. + */ for (let j = 0; j < exchangeSessions.sessionReferences.length; j++) { sessionReference = exchangeSessions.sessionReferences[j] menuClick(sessionReference.singleMarketTradingData, 'Add All Trading Mine Products', true) @@ -323,18 +357,20 @@ function newCryptoEcosystemFunctions() { function installInChartingSpace(chartingSpace) { - for (let i = 0; i < environmentArray.length; i++) { - let environment = environmentArray[i] - if (isMissingChildren(chartingSpace, environment.environmentNode, true) === true) { - let dashboard = functionLibraryUiObjectsFromNodes.addUIObject(chartingSpace, 'Dashboard') - dashboard.payload.referenceParent = environment.environmentNode - dashboard.name = environment.environmentNode.type + ' ' + environment.networkNode.name + for (let i = 0; i < dashboardsArray.length; i++) { + let arrayItem = dashboardsArray[i] + let dashboard = findOrCreateChildWithReference(chartingSpace, 'Dashboard', arrayItem.environmentNode, functionLibraryUiObjectsFromNodes) + dashboard.name = arrayItem.environmentNode.type + ' ' + arrayItem.networkNode.name + + for (let j = 0; j < arrayItem.sessionsArray.length; j++) { + let session = arrayItem.sessionsArray[j] + functionLibraryChartingSpaceFunctions.createTimeMachine(dashboard, session, node, arrayItem.networkNode, rootNodes, functionLibraryUiObjectsFromNodes, functionLibraryNodeDeleter) } } } } - function uninstallMarket(node, rootNodes, functionLibraryUiObjectsFromNodes, functionLibraryNodeDeleter) { + function uninstallMarket(node, rootNodes, functionLibraryUiObjectsFromNodes, functionLibraryNodeDeleter, functionLibraryChartingSpaceFunctions, functionLibraryDataStorageFunctions) { } } diff --git a/DesignSpace/Workspace/FunctionLibraries/DataStorageFunctions.js b/DesignSpace/Workspace/FunctionLibraries/DataStorageFunctions.js index b3ca80693..6b2ca9502 100644 --- a/DesignSpace/Workspace/FunctionLibraries/DataStorageFunctions.js +++ b/DesignSpace/Workspace/FunctionLibraries/DataStorageFunctions.js @@ -6,7 +6,8 @@ function newDataStorageFunctions() { addMissingSessionReferences: addMissingSessionReferences, addMissingSingleMarketData: addMissingSingleMarketData, addMissingExchangeSessions: addMissingExchangeSessions, - addMissingExchangeDataProducts: addMissingExchangeDataProducts + addMissingExchangeDataProducts: addMissingExchangeDataProducts, + createSessionReference: createSessionReference } return thisObject @@ -100,20 +101,24 @@ function newDataStorageFunctions() { for (let i = 0; i < sessionsArray.length; i++) { let session = sessionsArray[i] if (isMissingChildren(node, session, true) === true) { - let sessionReference = functionLibraryUiObjectsFromNodes.addUIObject(node, 'Session Reference') - sessionReference.payload.referenceParent = session - /* - Now I will connect the Session Reference child that is auto created with the market - where the Session was found. - */ - let marketTradingTasks = findNodeInNodeMesh(session, 'Market Trading Tasks', undefined, true, false, true, false) - sessionReference.singleMarketTradingData.payload.referenceParent = marketTradingTasks.payload.referenceParent - marketTradingTasks.payload.floatingObject.collapseToggle() + createSessionReference(node, session, functionLibraryUiObjectsFromNodes) } } } } + function createSessionReference(node, session, functionLibraryUiObjectsFromNodes) { + let sessionReference = functionLibraryUiObjectsFromNodes.addUIObject(node, 'Session Reference') + sessionReference.payload.referenceParent = session + /* + Now I will connect the Session Reference child that is auto created with the market + where the Session was found. + */ + let marketTradingTasks = findNodeInNodeMesh(session, 'Market Trading Tasks', undefined, true, false, true, false) + sessionReference.singleMarketTradingData.payload.referenceParent = marketTradingTasks.payload.referenceParent + marketTradingTasks.payload.floatingObject.collapseToggle() + } + function addMissingSingleMarketData(node, rootNodes, functionLibraryUiObjectsFromNodes) { if (node.payload.referenceParent === undefined) { return } if (node.payload.referenceParent.exchangeMarkets === undefined) { return } diff --git a/DesignSpace/Workspace/Workspace.js b/DesignSpace/Workspace/Workspace.js index 6632dfeb4..1c8ed2df4 100644 --- a/DesignSpace/Workspace/Workspace.js +++ b/DesignSpace/Workspace/Workspace.js @@ -702,12 +702,12 @@ function newWorkspace() { break case 'Install Market': { - functionLibraryCryptoEcosystemFunctions.installMarket(payload.node, thisObject.workspaceNode.rootNodes, functionLibraryUiObjectsFromNodes, functionLibraryNodeDeleter) + functionLibraryCryptoEcosystemFunctions.installMarket(payload.node, thisObject.workspaceNode.rootNodes, functionLibraryUiObjectsFromNodes, functionLibraryNodeDeleter, functionLibraryChartingSpaceFunctions, functionLibraryDataStorageFunctions) } break case 'Uninstall Market': { - functionLibraryCryptoEcosystemFunctions.uninstallMarket(payload.node, thisObject.workspaceNode.rootNodes, functionLibraryUiObjectsFromNodes, functionLibraryNodeDeleter) + functionLibraryCryptoEcosystemFunctions.uninstallMarket(payload.node, thisObject.workspaceNode.rootNodes, functionLibraryUiObjectsFromNodes, functionLibraryNodeDeleter, functionLibraryChartingSpaceFunctions, functionLibraryDataStorageFunctions) } break case 'Add All Output Datasets': diff --git a/FloatingSpace/FloatingObject.js b/FloatingSpace/FloatingObject.js index 76901b340..c3da76f1c 100644 --- a/FloatingSpace/FloatingObject.js +++ b/FloatingSpace/FloatingObject.js @@ -274,6 +274,9 @@ function newFloatingObject() { } function invisiblePhysics() { + if (thisObject.payload === undefined) {return} + if (thisObject.payload.uiObject === undefined) {return} + if (thisObject.payload.uiObject !== undefined) { thisObject.payload.uiObject.invisiblePhysics() } @@ -589,6 +592,9 @@ function newFloatingObject() { } function drawBackground() { + if (thisObject.payload === undefined) {return} + if (thisObject.payload.uiObject === undefined) {return} + if (canvas.floatingSpace.isItFar(thisObject.payload) && thisObject.payload.uiObject.isShowing === false) { return } if ((thisObject.isCollapsed === true && thisObject.collapsedManually === false) || thisObject.isParentCollapsed === true) { if (thisObject.payload.uiObject.isShowing !== true) { @@ -599,6 +605,9 @@ function newFloatingObject() { } function drawMiddleground() { + if (thisObject.payload === undefined) {return} + if (thisObject.payload.uiObject === undefined) {return} + if (canvas.floatingSpace.isItFar(thisObject.payload) && thisObject.payload.uiObject.isShowing === false) { return } if ((thisObject.isCollapsed === true && thisObject.collapsedManually === false) || thisObject.isParentCollapsed === true) { if (thisObject.payload.uiObject.isShowing !== true) { @@ -609,6 +618,9 @@ function newFloatingObject() { } function drawForeground() { + if (thisObject.payload === undefined) {return} + if (thisObject.payload.uiObject === undefined) {return} + if (canvas.floatingSpace.isItFar(thisObject.payload) && thisObject.payload.uiObject.isShowing === false) { return } if ((thisObject.isCollapsed === true && thisObject.collapsedManually === false) || thisObject.isParentCollapsed === true) { if (thisObject.payload.uiObject.isShowing !== true) { @@ -619,6 +631,9 @@ function newFloatingObject() { } function drawOnFocus() { + if (thisObject.payload === undefined) {return} + if (thisObject.payload.uiObject === undefined) {return} + thisObject.payload.uiObject.drawOnFocus() }