diff --git a/FloatingSpace/FloatingObject.js b/FloatingSpace/FloatingObject.js index 10164b2ab..bc9462f71 100644 --- a/FloatingSpace/FloatingObject.js +++ b/FloatingSpace/FloatingObject.js @@ -34,7 +34,7 @@ function newFloatingObject () { initializeRadius: initializeRadius, initializeImageSize: initializeImageSize, initializeFontSize: initializeFontSize, - radomizeCurrentPosition: radomizeCurrentPosition, + initializeCurrentPosition: initializeCurrentPosition, radomizeCurrentSpeed: radomizeCurrentSpeed, drawBackground: drawBackground, drawMiddleground: drawMiddleground, @@ -89,7 +89,7 @@ function newFloatingObject () { /* Assign a position and speed */ - thisObject.radomizeCurrentPosition(thisObject.payload.targetPosition) + thisObject.initializeCurrentPosition(thisObject.payload.targetPosition) thisObject.radomizeCurrentSpeed() } @@ -297,10 +297,19 @@ function newFloatingObject () { thisObject.currentFontSize = size / 3 } - function radomizeCurrentPosition (arroundPoint) { - let position = { - x: Math.floor((Math.random() * (200) - 100)) + arroundPoint.x, - y: Math.floor((Math.random() * (200) - 100)) + arroundPoint.y + function initializeCurrentPosition (arroundPoint) { + let position + + if (thisObject.payload.position === undefined) { + position = { + x: Math.floor((Math.random() * (200) - 100)) + arroundPoint.x, + y: Math.floor((Math.random() * (200) - 100)) + arroundPoint.y + } + } else { + position = { + x: thisObject.payload.position.x, + y: thisObject.payload.position.y + } } setPosition(position) diff --git a/StrategySpace/Workspace/FunctionLibraries/PartsFromNodes.js b/StrategySpace/Workspace/FunctionLibraries/PartsFromNodes.js index ed942efda..326121ce3 100644 --- a/StrategySpace/Workspace/FunctionLibraries/PartsFromNodes.js +++ b/StrategySpace/Workspace/FunctionLibraries/PartsFromNodes.js @@ -578,6 +578,12 @@ function newPartsFromNodes () { x: spawnPosition.x, y: spawnPosition.y } + if (partType === 'Workspace' || partType === 'Trading System') { + payload.position = { + x: spawnPosition.x, + y: spawnPosition.y + } + } } else { payload.targetPosition = { x: chainParent.payload.position.x, diff --git a/StrategySpace/Workspace/FunctionLibraries/WorkspaceNode.js b/StrategySpace/Workspace/FunctionLibraries/StringifyNode.js similarity index 80% rename from StrategySpace/Workspace/FunctionLibraries/WorkspaceNode.js rename to StrategySpace/Workspace/FunctionLibraries/StringifyNode.js index 04e69a3fd..c7691e2bb 100644 --- a/StrategySpace/Workspace/FunctionLibraries/WorkspaceNode.js +++ b/StrategySpace/Workspace/FunctionLibraries/StringifyNode.js @@ -1,10 +1,10 @@ -function newWorkspaceNode () { +function newStringifyNode () { thisObject = { - getWorkspaceNode: getWorkspaceNode + prepareForStringify: prepareForStringify } return thisObject - function getWorkspaceNode (node) { + function prepareForStringify (node) { if (node === undefined) { return } switch (node.type) { case 'Code': @@ -26,7 +26,7 @@ function newWorkspaceNode () { type: node.type, subType: node.subType, name: node.name, - code: getWorkspaceNode(node.code), + code: prepareForStringify(node.code), savedPayload: getSavedPayload(node) } return condition @@ -42,7 +42,7 @@ function newWorkspaceNode () { } for (let m = 0; m < node.conditions.length; m++) { - let condition = getWorkspaceNode(node.conditions[m]) + let condition = prepareForStringify(node.conditions[m]) situation.conditions.push(condition) } return situation @@ -70,7 +70,7 @@ function newWorkspaceNode () { savedPayload: getSavedPayload(node) } for (let m = 0; m < node.situations.length; m++) { - let situation = getWorkspaceNode(node.situations[m]) + let situation = prepareForStringify(node.situations[m]) event.situations.push(situation) } return event @@ -81,8 +81,8 @@ function newWorkspaceNode () { type: node.type, subType: node.subType, name: node.name, - formula: getWorkspaceNode(node.formula), - nextPhaseEvent: getWorkspaceNode(node.nextPhaseEvent), + formula: prepareForStringify(node.formula), + nextPhaseEvent: prepareForStringify(node.nextPhaseEvent), savedPayload: getSavedPayload(node) } return phase @@ -99,7 +99,7 @@ function newWorkspaceNode () { } for (let m = 0; m < node.phases.length; m++) { - let phase = getWorkspaceNode(node.phases[m]) + let phase = prepareForStringify(node.phases[m]) stop.phases.push(phase) } return stop @@ -116,7 +116,7 @@ function newWorkspaceNode () { } for (let m = 0; m < node.phases.length; m++) { - let phase = getWorkspaceNode(node.phases[m]) + let phase = prepareForStringify(node.phases[m]) takeProfit.phases.push(phase) } return takeProfit @@ -132,7 +132,7 @@ function newWorkspaceNode () { } for (let m = 0; m < node.situations.length; m++) { - let situation = getWorkspaceNode(node.situations[m]) + let situation = prepareForStringify(node.situations[m]) event.situations.push(situation) } return event @@ -148,7 +148,7 @@ function newWorkspaceNode () { } for (let m = 0; m < node.situations.length; m++) { - let situation = getWorkspaceNode(node.situations[m]) + let situation = prepareForStringify(node.situations[m]) event.situations.push(situation) } return event @@ -164,7 +164,7 @@ function newWorkspaceNode () { } for (let m = 0; m < node.situations.length; m++) { - let situation = getWorkspaceNode(node.situations[m]) + let situation = prepareForStringify(node.situations[m]) event.situations.push(situation) } return event @@ -175,8 +175,8 @@ function newWorkspaceNode () { type: node.type, subType: node.subType, name: node.name, - stopLoss: getWorkspaceNode(node.stopLoss), - takeProfit: getWorkspaceNode(node.takeProfit), + stopLoss: prepareForStringify(node.stopLoss), + takeProfit: prepareForStringify(node.takeProfit), savedPayload: getSavedPayload(node) } return object @@ -187,7 +187,7 @@ function newWorkspaceNode () { type: node.type, subType: node.subType, name: node.name, - formula: getWorkspaceNode(node.formula), + formula: prepareForStringify(node.formula), savedPayload: getSavedPayload(node) } return object @@ -198,10 +198,10 @@ function newWorkspaceNode () { type: node.type, subType: node.subType, name: node.name, - triggerOn: getWorkspaceNode(node.triggerOn), - triggerOff: getWorkspaceNode(node.triggerOff), - takePosition: getWorkspaceNode(node.takePosition), - positionSize: getWorkspaceNode(node.positionSize), + triggerOn: prepareForStringify(node.triggerOn), + triggerOff: prepareForStringify(node.triggerOff), + takePosition: prepareForStringify(node.takePosition), + positionSize: prepareForStringify(node.positionSize), savedPayload: getSavedPayload(node) } return stage @@ -212,7 +212,7 @@ function newWorkspaceNode () { type: node.type, subType: node.subType, name: node.name, - initialDefinition: getWorkspaceNode(node.initialDefinition), + initialDefinition: prepareForStringify(node.initialDefinition), savedPayload: getSavedPayload(node) } return stage @@ -223,8 +223,8 @@ function newWorkspaceNode () { type: node.type, subType: node.subType, name: node.name, - stopLoss: getWorkspaceNode(node.stopLoss), - takeProfit: getWorkspaceNode(node.takeProfit), + stopLoss: prepareForStringify(node.stopLoss), + takeProfit: prepareForStringify(node.takeProfit), savedPayload: getSavedPayload(node) } return stage @@ -245,10 +245,10 @@ function newWorkspaceNode () { type: node.type, subType: node.subType, name: node.name, - triggerStage: getWorkspaceNode(node.triggerStage), - openStage: getWorkspaceNode(node.openStage), - manageStage: getWorkspaceNode(node.manageStage), - closeStage: getWorkspaceNode(node.closeStage), + triggerStage: prepareForStringify(node.triggerStage), + openStage: prepareForStringify(node.openStage), + manageStage: prepareForStringify(node.manageStage), + closeStage: prepareForStringify(node.closeStage), savedPayload: getSavedPayload(node) } return strategy @@ -259,7 +259,7 @@ function newWorkspaceNode () { type: node.type, subType: node.subType, name: node.name, - formula: getWorkspaceNode(node.formula), + formula: prepareForStringify(node.formula), savedPayload: getSavedPayload(node) } return object @@ -270,7 +270,7 @@ function newWorkspaceNode () { type: node.type, subType: node.subType, name: node.name, - baseAsset: getWorkspaceNode(node.baseAsset), + baseAsset: prepareForStringify(node.baseAsset), savedPayload: getSavedPayload(node) } return object @@ -282,12 +282,12 @@ function newWorkspaceNode () { subType: node.subType, name: node.name, strategies: [], - parameters: getWorkspaceNode(node.parameters), + parameters: prepareForStringify(node.parameters), savedPayload: getSavedPayload(node) } for (let m = 0; m < node.strategies.length; m++) { - let strategy = getWorkspaceNode(node.strategies[m]) + let strategy = prepareForStringify(node.strategies[m]) tradingSystem.strategies.push(strategy) } return tradingSystem diff --git a/StrategySpace/Workspace/Workspace.js b/StrategySpace/Workspace/Workspace.js index 8c9d3da16..5aeb06869 100644 --- a/StrategySpace/Workspace/Workspace.js +++ b/StrategySpace/Workspace/Workspace.js @@ -33,13 +33,14 @@ function newWorkspace () { y: canvas.floatingSpace.container.frame.height / 2 } - let rootNodes = [] + let workspaceNode = {} + workspaceNode.rootNodes = [] functionLibraryAttachDetach = newAttachDetach() functionLibraryNodeDeleter = newNodeDeleter() functionLibraryPartsFromNodes = newPartsFromNodes() functionLibraryProtocolNode = newProtocolNode() - functionLibraryWorkspaceNodes = newWorkspaceNode() + functionLibraryWorkspaceNodes = newStringifyNode() let isInitialized = false return thisObject @@ -57,27 +58,18 @@ function newWorkspace () { } user = JSON.parse(user) - functionLibraryAttachDetach = newAttachDetach() - functionLibraryNodeDeleter = newNodeDeleter() - functionLibraryPartsFromNodes = newPartsFromNodes() - functionLibraryProtocolNode = newProtocolNode() - functionLibraryWorkspaceNodes = newWorkspaceNode() - let savedWorkspace = window.localStorage.getItem(user.alias + '.' + 'workspace') if (savedWorkspace === null) { - let workspaceNode = { - name: 'My Workspace', - type: 'Workspace' - } + workspaceNode.type = 'Workspace' + workspaceNode.name = 'My Workspace' functionLibraryPartsFromNodes.createPartFromNode(workspaceNode, undefined, undefined) spawnPosition.y = spawnPosition.y + 250 initializeLoadingFromStrategizer() } else { - workspace = JSON.parse(savedWorkspace) - rootNodes = workspace.rootNodes + workspaceNode = JSON.parse(savedWorkspace) - for (let i = 0; i < rootNodes.length; i++) { - let rootNode = rootNodes[i] + for (let i = 0; i < workspaceNode.rootNodes.length; i++) { + let rootNode = workspaceNode.rootNodes[i] functionLibraryPartsFromNodes.createPartFromNode(rootNode, undefined, undefined) } isInitialized = true @@ -88,7 +80,7 @@ function newWorkspace () { let result = await canvas.strategySpace.strategizerGateway.loadFromStrategyzer() if (result === true) { thisObject.tradingSystem = canvas.strategySpace.strategizerGateway.strategizerData - rootNodes.push(thisObject.tradingSystem) + workspaceNode.rootNodes.push(thisObject.tradingSystem) functionLibraryPartsFromNodes.createPartFromNode(thisObject.tradingSystem, undefined, undefined) thisObject.tradingSystem.payload.uiObject.setRunningStatus() } else { @@ -97,7 +89,7 @@ function newWorkspace () { type: 'Trading System', strategies: [] } - rootNodes.push(thisObject.tradingSystem) + workspaceNode.rootNodes.push(thisObject.tradingSystem) functionLibraryPartsFromNodes.createPartFromNode(thisObject.tradingSystem, undefined, undefined) thisObject.tradingSystem.payload.uiObject.setRunningStatus() } @@ -113,11 +105,11 @@ function newWorkspace () { } function detachNode (node) { - functionLibraryAttachDetach.detachNode(node, rootNodes) + functionLibraryAttachDetach.detachNode(node, workspaceNode.rootNodes) } function attachNode (node, attachToNode) { - functionLibraryAttachDetach.attachNode(node, attachToNode, rootNodes) + functionLibraryAttachDetach.attachNode(node, attachToNode, workspaceNode.rootNodes) } function physics () { @@ -135,12 +127,14 @@ function newWorkspace () { function stringifyWorkspace () { let stringifyReadyNodes = [] - for (let i = 0; i < rootNodes.length; i++) { - let rootNode = rootNodes[i] - let workspaceNode = functionLibraryWorkspaceNodes.getWorkspaceNode(rootNode) - stringifyReadyNodes.push(workspaceNode) + for (let i = 0; i < workspaceNode.rootNodes.length; i++) { + let rootNode = workspaceNode.rootNodes[i] + let workspace = functionLibraryWorkspaceNodes.prepareForStringify(rootNode) + stringifyReadyNodes.push(workspace) } let workspace = { + type: 'Workspace', + name: workspaceNode.name, rootNodes: stringifyReadyNodes } return JSON.stringify(workspace) @@ -153,7 +147,7 @@ function newWorkspace () { let dirtyNode = JSON.parse(nodeText) let rootNode = functionLibraryProtocolNode.getProtocolNode(dirtyNode) - rootNodes.push(rootNode) + workspaceNode.rootNodes.push(rootNode) functionLibraryPartsFromNodes.createPartFromNode(rootNode, undefined, undefined) } @@ -263,71 +257,71 @@ function newWorkspace () { } break case 'Delete Trading System': { - functionLibraryNodeDeleter.deleteTradingSystem(payload.node, rootNodes) + functionLibraryNodeDeleter.deleteTradingSystem(payload.node, workspaceNode.rootNodes) break } case 'Delete Parameters': { - functionLibraryNodeDeleter.deleteParameters(payload.node, rootNodes) + functionLibraryNodeDeleter.deleteParameters(payload.node, workspaceNode.rootNodes) break } case 'Delete Base Asset': { - functionLibraryNodeDeleter.deleteBaseAsset(payload.node, rootNodes) + functionLibraryNodeDeleter.deleteBaseAsset(payload.node, workspaceNode.rootNodes) break } case 'Delete Strategy': { - functionLibraryNodeDeleter.deleteStrategy(payload.node, rootNodes) + functionLibraryNodeDeleter.deleteStrategy(payload.node, workspaceNode.rootNodes) break } case 'Delete Trigger Stage': { - functionLibraryNodeDeleter.deleteTriggerStage(payload.node, rootNodes) + functionLibraryNodeDeleter.deleteTriggerStage(payload.node, workspaceNode.rootNodes) break } case 'Delete Open Stage': { - functionLibraryNodeDeleter.deleteOpenStage(payload.node, rootNodes) + functionLibraryNodeDeleter.deleteOpenStage(payload.node, workspaceNode.rootNodes) break } case 'Delete Manage Stage': { - functionLibraryNodeDeleter.deleteManageStage(payload.node, rootNodes) + functionLibraryNodeDeleter.deleteManageStage(payload.node, workspaceNode.rootNodes) break } case 'Delete Close Stage': { - functionLibraryNodeDeleter.deleteCloseStage(payload.node, rootNodes) + functionLibraryNodeDeleter.deleteCloseStage(payload.node, workspaceNode.rootNodes) break } case 'Delete Position Size': { - functionLibraryNodeDeleter.deletePositionSize(payload.node, rootNodes) + functionLibraryNodeDeleter.deletePositionSize(payload.node, workspaceNode.rootNodes) break } case 'Delete Initial Definition': { - functionLibraryNodeDeleter.deleteInitialDefinition(payload.node, rootNodes) + functionLibraryNodeDeleter.deleteInitialDefinition(payload.node, workspaceNode.rootNodes) break } case 'Delete Event': { - functionLibraryNodeDeleter.deleteEvent(payload.node, rootNodes) + functionLibraryNodeDeleter.deleteEvent(payload.node, workspaceNode.rootNodes) break } case 'Delete Managed Item': { - functionLibraryNodeDeleter.deleteManagedItem(payload.node, rootNodes) + functionLibraryNodeDeleter.deleteManagedItem(payload.node, workspaceNode.rootNodes) break } case 'Delete Phase': { - functionLibraryNodeDeleter.deletePhase(payload.node, rootNodes) + functionLibraryNodeDeleter.deletePhase(payload.node, workspaceNode.rootNodes) break } case 'Delete Formula': { - functionLibraryNodeDeleter.deleteFormula(payload.node, rootNodes) + functionLibraryNodeDeleter.deleteFormula(payload.node, workspaceNode.rootNodes) break } case 'Delete Situation': { - functionLibraryNodeDeleter.deleteSituation(payload.node, rootNodes) + functionLibraryNodeDeleter.deleteSituation(payload.node, workspaceNode.rootNodes) break } case 'Delete Condition': { - functionLibraryNodeDeleter.deleteCondition(payload.node, rootNodes) + functionLibraryNodeDeleter.deleteCondition(payload.node, workspaceNode.rootNodes) break } case 'Delete Code': { - functionLibraryNodeDeleter.deleteCode(payload.node, rootNodes) + functionLibraryNodeDeleter.deleteCode(payload.node, workspaceNode.rootNodes) break } default: