From a9c57c3ee46840bf978bbcaa5b8ac9d1a63eae9d Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Tue, 20 Aug 2019 21:55:27 +0200 Subject: [PATCH 01/40] Bug Fixed Textarea out of place --- FloatingSpace/CodeEditor.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FloatingSpace/CodeEditor.js b/FloatingSpace/CodeEditor.js index 5bfa65232..c552a55e7 100644 --- a/FloatingSpace/CodeEditor.js +++ b/FloatingSpace/CodeEditor.js @@ -133,7 +133,7 @@ function newCodeEditor () { let textAreaPosition = { x: 0 - thisObject.container.frame.width / 2, - y: 0 - thisObject.container.frame.height * 3 / 7 + y: 0 - thisObject.container.frame.height * 3 / 7 + CURRENT_TOP_MARGIN } textAreaPosition = thisObject.container.frame.frameThisPoint(textAreaPosition) From afc5e5fc2d69aadcc3f1b4dc55eefa3b6298324c Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Fri, 23 Aug 2019 18:13:07 +0200 Subject: [PATCH 02/40] Bug fix, importing nodes --- StrategySpace/Workspace/Workspace.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/StrategySpace/Workspace/Workspace.js b/StrategySpace/Workspace/Workspace.js index c7840da06..939b035c7 100644 --- a/StrategySpace/Workspace/Workspace.js +++ b/StrategySpace/Workspace/Workspace.js @@ -119,8 +119,10 @@ function newWorkspace () { let stringifyReadyNodes = [] for (let i = 0; i < workspaceNode.rootNodes.length; i++) { let rootNode = workspaceNode.rootNodes[i] - let workspace = functionLibraryWorkspaceNodes.prepareForStringify(rootNode, removePersonalData) - stringifyReadyNodes.push(workspace) + let node = functionLibraryWorkspaceNodes.prepareForStringify(rootNode, removePersonalData) + if (node) { + stringifyReadyNodes.push(node) + } } let workspace = { type: 'Workspace', From 98e34a11199c4ca0347c1455a11084fe48994ddc Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sat, 24 Aug 2019 09:47:24 +0200 Subject: [PATCH 03/40] Base Asset with no formula object --- FloatingSpace/StrategyPart.js | 17 ++++++++++++++++- FloatingSpace/StrategyPartConstructor.js | 14 ++++++++++---- Globals.js | 1 + .../Workspace/FunctionLibraries/NodeChildren.js | 7 ------- .../Workspace/FunctionLibraries/NodeDeleter.js | 3 --- .../FunctionLibraries/PartsFromNodes.js | 8 +------- .../Workspace/FunctionLibraries/ProtocolNode.js | 2 +- .../FunctionLibraries/StringifyNode.js | 2 +- 8 files changed, 30 insertions(+), 24 deletions(-) diff --git a/FloatingSpace/StrategyPart.js b/FloatingSpace/StrategyPart.js index e8653f1ad..930a99e1f 100644 --- a/FloatingSpace/StrategyPart.js +++ b/FloatingSpace/StrategyPart.js @@ -224,6 +224,18 @@ function newStrategyPart () { compatibleType = '->' + 'Parameters' compatibleSubType = undefined break + case 'Time Range': + compatibleType = '->' + 'Parameters' + compatibleSubType = undefined + break + case 'Slippage': + compatibleType = '->' + 'Parameters' + compatibleSubType = undefined + break + case 'Fee Structure': + compatibleType = '->' + 'Parameters' + compatibleSubType = undefined + break case 'Strategy': compatibleType = '->' + 'Trading System' compatibleSubType = undefined @@ -289,7 +301,7 @@ function newStrategyPart () { compatibleSubType = undefined break case 'Formula': - compatibleType = '->' + 'Base Asset' + '->' + 'Position Size' + '->' + 'Position Rate' + '->' + 'Phase' + compatibleType = '->' + 'Position Size' + '->' + 'Position Rate' + '->' + 'Phase' compatibleSubType = undefined break case 'Next Phase Event': @@ -326,6 +338,9 @@ function newStrategyPart () { if (thisObject.payload.node.type === 'Personal Data' && nearbyNode.personalData !== undefined) { continue } if (thisObject.payload.node.type === 'Parameters' && nearbyNode.parameters !== undefined) { continue } if (thisObject.payload.node.type === 'Base Asset' && nearbyNode.baseAsset !== undefined) { continue } + if (thisObject.payload.node.type === 'Time Range' && nearbyNode.timeRange !== undefined) { continue } + if (thisObject.payload.node.type === 'Slippage' && nearbyNode.slippage !== undefined) { continue } + if (thisObject.payload.node.type === 'Fee Structure' && nearbyNode.feeStructure !== undefined) { continue } if (thisObject.payload.node.type === 'Trigger Stage' && nearbyNode.triggerStage !== undefined) { continue } if (thisObject.payload.node.type === 'Open Stage' && nearbyNode.openStage !== undefined) { continue } if (thisObject.payload.node.type === 'Manage Stage' && nearbyNode.manageStage !== undefined) { continue } diff --git a/FloatingSpace/StrategyPartConstructor.js b/FloatingSpace/StrategyPartConstructor.js index 0ea5e295b..43470d5ce 100644 --- a/FloatingSpace/StrategyPartConstructor.js +++ b/FloatingSpace/StrategyPartConstructor.js @@ -551,6 +551,11 @@ function newStrategyPartConstructor () { break } case 'Base Asset': { + strategyPart.codeEditor = newCodeEditor() + strategyPart.codeEditor.isVisibleFunction = strategyPart.isVisibleFunction + strategyPart.codeEditor.initialize() + strategyPart.codeEditor.container.connectToParent(strategyPart.container, false, false, true, true, false, false, false, false) + addLeftIcons(menuItemsInitialValues, floatingObject) menuItemsInitialValues.push( { @@ -570,11 +575,12 @@ function newStrategyPartConstructor () { ) menuItemsInitialValues.push( { - action: 'Add Formula', - actionFunction: payload.onMenuItemClick, - label: 'Add Formula', + action: 'Edit Base Asset', + actionFunction: strategyPart.codeEditor.activate, + label: 'Edit Base Asset', visible: false, - relatedStrategyPart: 'Formula', + iconPathOn: 'settings', + iconPathOff: 'settings', rawRadius: 8, targetRadius: 0, currentRadius: 0, diff --git a/Globals.js b/Globals.js index 564259e92..9bae5463f 100644 --- a/Globals.js +++ b/Globals.js @@ -135,6 +135,7 @@ if (testUser !== null) { LOGGED_IN_ACCESS_TOKEN_LOCAL_STORAGE_KEY = "access_token" } +const DEFAULT_CONFIG_TEXT = '// Write your config here' const DEFAULT_FORMULA_TEXT = '// Write your formula here' const DEFAULT_CODE_TEXT = '// Write your code here' diff --git a/StrategySpace/Workspace/FunctionLibraries/NodeChildren.js b/StrategySpace/Workspace/FunctionLibraries/NodeChildren.js index 9d57b1a87..cf8d0b6d2 100644 --- a/StrategySpace/Workspace/FunctionLibraries/NodeChildren.js +++ b/StrategySpace/Workspace/FunctionLibraries/NodeChildren.js @@ -219,12 +219,6 @@ function newNodeChildren () { childrenCount: 0, childIndex: undefined } - if (parentNode.formula !== undefined) { - response.childrenCount++ - if (parentNode.formula.id === childNode.id) { - response.childIndex = response.childrenCount - } - } return response } @@ -536,4 +530,3 @@ function newNodeChildren () { return response } } - diff --git a/StrategySpace/Workspace/FunctionLibraries/NodeDeleter.js b/StrategySpace/Workspace/FunctionLibraries/NodeDeleter.js index e4ded4e0b..e0410e3b2 100644 --- a/StrategySpace/Workspace/FunctionLibraries/NodeDeleter.js +++ b/StrategySpace/Workspace/FunctionLibraries/NodeDeleter.js @@ -291,9 +291,6 @@ function newNodeDeleter () { } else { completeDeletion(node, rootNodes) } - if (node.formula !== undefined) { - deleteFormula(node.formula, rootNodes) - } destroyPart(node) cleanNode(node) } diff --git a/StrategySpace/Workspace/FunctionLibraries/PartsFromNodes.js b/StrategySpace/Workspace/FunctionLibraries/PartsFromNodes.js index 5aa38b5ff..51e5c2864 100644 --- a/StrategySpace/Workspace/FunctionLibraries/PartsFromNodes.js +++ b/StrategySpace/Workspace/FunctionLibraries/PartsFromNodes.js @@ -244,9 +244,6 @@ function newPartsFromNodes () { } case 'Base Asset': { createPart('Base Asset', node.name, node, parentNode, chainParent, 'Base Asset') - if (node.formula !== undefined) { - createPartFromNode(node.formula, node, node) - } return } case 'Parameters': { @@ -440,12 +437,9 @@ function newPartsFromNodes () { if (node.baseAsset === undefined) { node.baseAsset = { name: 'Base Asset', - formula: { - code: DEFAULT_FORMULA_TEXT - } + code: DEFAULT_CONFIG_TEXT } createPart('Base Asset', '', node.baseAsset, node, node) - createPart('Formula', '', node.baseAsset.formula, node.baseAsset, node.baseAsset) } } diff --git a/StrategySpace/Workspace/FunctionLibraries/ProtocolNode.js b/StrategySpace/Workspace/FunctionLibraries/ProtocolNode.js index c3eb4d943..77596d2eb 100644 --- a/StrategySpace/Workspace/FunctionLibraries/ProtocolNode.js +++ b/StrategySpace/Workspace/FunctionLibraries/ProtocolNode.js @@ -248,7 +248,7 @@ function newProtocolNode () { type: node.type, subType: node.subType, name: node.name, - formula: getProtocolNode(node.formula, removePersonalData) + code: node.code } return object } diff --git a/StrategySpace/Workspace/FunctionLibraries/StringifyNode.js b/StrategySpace/Workspace/FunctionLibraries/StringifyNode.js index 4191cacd0..b3e61406d 100644 --- a/StrategySpace/Workspace/FunctionLibraries/StringifyNode.js +++ b/StrategySpace/Workspace/FunctionLibraries/StringifyNode.js @@ -293,7 +293,7 @@ function newStringifyNode () { type: node.type, subType: node.subType, name: node.name, - formula: prepareForStringify(node.formula, removePersonalData), + code: node.code, savedPayload: getSavedPayload(node) } return object From 316ea0ab771ea310600a28ad97da3935f55b46ab Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sat, 24 Aug 2019 10:58:18 +0200 Subject: [PATCH 04/40] Base Asset Slitted into 4 icons --- FloatingSpace/StrategyPartConstructor.js | 171 ++++++++++++++++++ FloatingSpace/StrategyPartTitle.js | 9 + Spaces/StrategySpace.js | 5 +- .../FunctionLibraries/AttachDetach.js | 36 ++++ .../FunctionLibraries/NodeChildren.js | 51 ++++++ .../FunctionLibraries/NodeDeleter.js | 57 ++++++ .../FunctionLibraries/PartsFromNodes.js | 42 +++++ .../FunctionLibraries/ProtocolNode.js | 32 +++- .../FunctionLibraries/StringifyNode.js | 36 ++++ StrategySpace/Workspace/Workspace.js | 12 ++ 10 files changed, 449 insertions(+), 2 deletions(-) diff --git a/FloatingSpace/StrategyPartConstructor.js b/FloatingSpace/StrategyPartConstructor.js index 43470d5ce..2018cdcd8 100644 --- a/FloatingSpace/StrategyPartConstructor.js +++ b/FloatingSpace/StrategyPartConstructor.js @@ -603,6 +603,165 @@ function newStrategyPartConstructor () { ) break } + case 'Time Range': { + strategyPart.codeEditor = newCodeEditor() + strategyPart.codeEditor.isVisibleFunction = strategyPart.isVisibleFunction + strategyPart.codeEditor.initialize() + strategyPart.codeEditor.container.connectToParent(strategyPart.container, false, false, true, true, false, false, false, false) + + addLeftIcons(menuItemsInitialValues, floatingObject) + menuItemsInitialValues.push( + { + action: 'Delete Time Range', + askConfirmation: true, + confirmationLabel: 'Confirm to Delete', + actionFunction: payload.onMenuItemClick, + label: 'Delete Time Range', + visible: false, + iconPathOn: 'delete', + iconPathOff: 'delete', + rawRadius: 8, + targetRadius: 0, + currentRadius: 0, + angle: -40 + } + ) + menuItemsInitialValues.push( + { + action: 'Edit Time Range', + actionFunction: strategyPart.codeEditor.activate, + label: 'Edit Time Range', + visible: false, + iconPathOn: 'settings', + iconPathOff: 'settings', + rawRadius: 8, + targetRadius: 0, + currentRadius: 0, + angle: 0 + } + ) + menuItemsInitialValues.push( + { + action: 'Share', + actionFunction: payload.onMenuItemClick, + label: 'Share', + visible: false, + iconPathOn: 'menu-share', + iconPathOff: 'menu-share', + rawRadius: 8, + targetRadius: 0, + currentRadius: 0, + angle: 40 + } + ) + break + } + case 'Slippage': { + strategyPart.codeEditor = newCodeEditor() + strategyPart.codeEditor.isVisibleFunction = strategyPart.isVisibleFunction + strategyPart.codeEditor.initialize() + strategyPart.codeEditor.container.connectToParent(strategyPart.container, false, false, true, true, false, false, false, false) + + addLeftIcons(menuItemsInitialValues, floatingObject) + menuItemsInitialValues.push( + { + action: 'Delete Slippage', + askConfirmation: true, + confirmationLabel: 'Confirm to Delete', + actionFunction: payload.onMenuItemClick, + label: 'Delete Slippage', + visible: false, + iconPathOn: 'delete', + iconPathOff: 'delete', + rawRadius: 8, + targetRadius: 0, + currentRadius: 0, + angle: -40 + } + ) + menuItemsInitialValues.push( + { + action: 'Edit Slippage', + actionFunction: strategyPart.codeEditor.activate, + label: 'Edit Slippage', + visible: false, + iconPathOn: 'settings', + iconPathOff: 'settings', + rawRadius: 8, + targetRadius: 0, + currentRadius: 0, + angle: 0 + } + ) + menuItemsInitialValues.push( + { + action: 'Share', + actionFunction: payload.onMenuItemClick, + label: 'Share', + visible: false, + iconPathOn: 'menu-share', + iconPathOff: 'menu-share', + rawRadius: 8, + targetRadius: 0, + currentRadius: 0, + angle: 40 + } + ) + break + } + case 'Fee Structure': { + strategyPart.codeEditor = newCodeEditor() + strategyPart.codeEditor.isVisibleFunction = strategyPart.isVisibleFunction + strategyPart.codeEditor.initialize() + strategyPart.codeEditor.container.connectToParent(strategyPart.container, false, false, true, true, false, false, false, false) + + addLeftIcons(menuItemsInitialValues, floatingObject) + menuItemsInitialValues.push( + { + action: 'Delete Fee Structure', + askConfirmation: true, + confirmationLabel: 'Confirm to Delete', + actionFunction: payload.onMenuItemClick, + label: 'Delete Fee Structure', + visible: false, + iconPathOn: 'delete', + iconPathOff: 'delete', + rawRadius: 8, + targetRadius: 0, + currentRadius: 0, + angle: -40 + } + ) + menuItemsInitialValues.push( + { + action: 'Edit Fee Structure', + actionFunction: strategyPart.codeEditor.activate, + label: 'Edit Fee Structure', + visible: false, + iconPathOn: 'settings', + iconPathOff: 'settings', + rawRadius: 8, + targetRadius: 0, + currentRadius: 0, + angle: 0 + } + ) + menuItemsInitialValues.push( + { + action: 'Share', + actionFunction: payload.onMenuItemClick, + label: 'Share', + visible: false, + iconPathOn: 'menu-share', + iconPathOff: 'menu-share', + rawRadius: 8, + targetRadius: 0, + currentRadius: 0, + angle: 40 + } + ) + break + } case 'Strategy': { addLeftIcons(menuItemsInitialValues, floatingObject) menuItemsInitialValues.push( @@ -1653,6 +1812,18 @@ function newStrategyPartConstructor () { level_3() break } + case 'Time Range': { + level_3() + break + } + case 'Slippage': { + level_3() + break + } + case 'Fee Structure': { + level_3() + break + } case 'Strategy': { level_1() break diff --git a/FloatingSpace/StrategyPartTitle.js b/FloatingSpace/StrategyPartTitle.js index 7a79eaf73..e54c35838 100644 --- a/FloatingSpace/StrategyPartTitle.js +++ b/FloatingSpace/StrategyPartTitle.js @@ -78,6 +78,15 @@ function newStrategyPartTitle () { case 'Base Asset': { break } + case 'Time Range': { + break + } + case 'Slippage': { + break + } + case 'Fee Structure': { + break + } case 'Strategy': { thisObject.allwaysVisible = true break diff --git a/Spaces/StrategySpace.js b/Spaces/StrategySpace.js index b5c0fbfde..b64cda904 100644 --- a/Spaces/StrategySpace.js +++ b/Spaces/StrategySpace.js @@ -47,7 +47,10 @@ function newStrategySpace () { ['Workspace', 'design-tool'], ['Trading System', 'analysis'], ['Parameters', 'settings'], - ['Base Asset', 'sitemap'], + ['Base Asset', 'loading'], + ['Time Range', 'chronometer'], + ['Slippage', 'support'], + ['Fee Structure', 'sitemap'], ['Strategy', 'quality'], ['Trigger Stage', 'stage-trigger'], ['Open Stage', 'stage-open'], diff --git a/StrategySpace/Workspace/FunctionLibraries/AttachDetach.js b/StrategySpace/Workspace/FunctionLibraries/AttachDetach.js index 107539f5f..38ee5c501 100644 --- a/StrategySpace/Workspace/FunctionLibraries/AttachDetach.js +++ b/StrategySpace/Workspace/FunctionLibraries/AttachDetach.js @@ -59,6 +59,21 @@ function newAttachDetach () { completeDetachment(node, rootNodes) return } + case 'Time Period': { + node.payload.parentNode.baseAsset = undefined + completeDetachment(node, rootNodes) + return + } + case 'Slippage': { + node.payload.parentNode.baseAsset = undefined + completeDetachment(node, rootNodes) + return + } + case 'Fee Structure': { + node.payload.parentNode.baseAsset = undefined + completeDetachment(node, rootNodes) + return + } case 'Strategy': { let payload = node.payload for (let i = 0; i < payload.parentNode.strategies.length; i++) { @@ -245,6 +260,27 @@ function newAttachDetach () { completeAttachment(node, rootNodes) } break + case 'Time Range': { + node.payload.parentNode = attachToNode + node.payload.chainParent = attachToNode + node.payload.parentNode.timeRange = node + completeAttachment(node, rootNodes) + } + break + case 'Slippage': { + node.payload.parentNode = attachToNode + node.payload.chainParent = attachToNode + node.payload.parentNode.slippage = node + completeAttachment(node, rootNodes) + } + break + case 'Fee Structure': { + node.payload.parentNode = attachToNode + node.payload.chainParent = attachToNode + node.payload.parentNode.feeStructure = node + completeAttachment(node, rootNodes) + } + break case 'Trading System': { node.payload.parentNode = attachToNode node.payload.chainParent = attachToNode diff --git a/StrategySpace/Workspace/FunctionLibraries/NodeChildren.js b/StrategySpace/Workspace/FunctionLibraries/NodeChildren.js index cf8d0b6d2..b52a3b16a 100644 --- a/StrategySpace/Workspace/FunctionLibraries/NodeChildren.js +++ b/StrategySpace/Workspace/FunctionLibraries/NodeChildren.js @@ -32,6 +32,15 @@ function newNodeChildren () { case 'Base Asset': { return countChildrenBaseAsset(parentNode, childNode) } + case 'Time Range': { + return countChildrenTimeRange(parentNode, childNode) + } + case 'Slippage': { + return countChildrenSlippage(parentNode, childNode) + } + case 'Fee Structure': { + return countChildrenFeeStructure(parentNode, childNode) + } case 'Strategy': { return countChildrenStrategy(parentNode, childNode) } @@ -211,6 +220,24 @@ function newNodeChildren () { response.childIndex = response.childrenCount } } + if (parentNode.timeRange !== undefined) { + response.childrenCount++ + if (parentNode.timeRange.id === childNode.id) { + response.childIndex = response.childrenCount + } + } + if (parentNode.slippage !== undefined) { + response.childrenCount++ + if (parentNode.slippage.id === childNode.id) { + response.childIndex = response.childrenCount + } + } + if (parentNode.feeStructure !== undefined) { + response.childrenCount++ + if (parentNode.feeStructure.id === childNode.id) { + response.childIndex = response.childrenCount + } + } return response } @@ -222,6 +249,30 @@ function newNodeChildren () { return response } + function countChildrenTimeRange (parentNode, childNode) { + let response = { + childrenCount: 0, + childIndex: undefined + } + return response + } + + function countChildrenSlippage (parentNode, childNode) { + let response = { + childrenCount: 0, + childIndex: undefined + } + return response + } + + function countChildrenFeeStructure (parentNode, childNode) { + let response = { + childrenCount: 0, + childIndex: undefined + } + return response + } + function countChildrenStrategy (parentNode, childNode) { let response = { childrenCount: 0, diff --git a/StrategySpace/Workspace/FunctionLibraries/NodeDeleter.js b/StrategySpace/Workspace/FunctionLibraries/NodeDeleter.js index e0410e3b2..d937c6d68 100644 --- a/StrategySpace/Workspace/FunctionLibraries/NodeDeleter.js +++ b/StrategySpace/Workspace/FunctionLibraries/NodeDeleter.js @@ -9,6 +9,9 @@ function newNodeDeleter () { deleteTradingSystem: deleteTradingSystem, deleteParameters: deleteParameters, deleteBaseAsset: deleteBaseAsset, + deleteTimeRange: deleteTimeRange, + deleteSlippage: deleteSlippage, + deleteFeeStructure: deleteFeeStructure, deleteStrategy: deleteStrategy, deleteTriggerStage: deleteTriggerStage, deleteOpenStage: deleteOpenStage, @@ -71,6 +74,18 @@ function newNodeDeleter () { deleteBaseAsset(rootNode, rootNodes) break } + case 'Time Range': { + deleteTimeRange(rootNode, rootNodes) + break + } + case 'Slippage': { + deleteSlippage(rootNode, rootNodes) + break + } + case 'Fee Structure': { + deleteFeeStructure(rootNode, rootNodes) + break + } case 'Strategy': { deleteStrategy(rootNode, rootNodes) break @@ -280,6 +295,15 @@ function newNodeDeleter () { if (node.baseAsset !== undefined) { deleteBaseAsset(node.baseAsset, rootNodes) } + if (node.timeRange !== undefined) { + deleteTimeRange(node.timeRange, rootNodes) + } + if (node.slippage !== undefined) { + deleteSlippage(node.slippage, rootNodes) + } + if (node.feeStructure !== undefined) { + deleteFeeStructure(node.feeStructure, rootNodes) + } destroyPart(node) cleanNode(node) } @@ -295,6 +319,39 @@ function newNodeDeleter () { cleanNode(node) } + function deleteTimeRange (node, rootNodes) { + let payload = node.payload + if (payload.parentNode !== undefined) { + payload.parentNode.timeRange = undefined + } else { + completeDeletion(node, rootNodes) + } + destroyPart(node) + cleanNode(node) + } + + function deleteSlippage (node, rootNodes) { + let payload = node.payload + if (payload.parentNode !== undefined) { + payload.parentNode.slippage = undefined + } else { + completeDeletion(node, rootNodes) + } + destroyPart(node) + cleanNode(node) + } + + function deleteFeeStructure (node, rootNodes) { + let payload = node.payload + if (payload.parentNode !== undefined) { + payload.parentNode.feeStructure = undefined + } else { + completeDeletion(node, rootNodes) + } + destroyPart(node) + cleanNode(node) + } + function deleteStrategy (node, rootNodes) { let payload = node.payload if (payload.parentNode !== undefined) { diff --git a/StrategySpace/Workspace/FunctionLibraries/PartsFromNodes.js b/StrategySpace/Workspace/FunctionLibraries/PartsFromNodes.js index 51e5c2864..94b58d6fe 100644 --- a/StrategySpace/Workspace/FunctionLibraries/PartsFromNodes.js +++ b/StrategySpace/Workspace/FunctionLibraries/PartsFromNodes.js @@ -246,11 +246,32 @@ function newPartsFromNodes () { createPart('Base Asset', node.name, node, parentNode, chainParent, 'Base Asset') return } + case 'Time Range': { + createPart('Time Range', node.name, node, parentNode, chainParent, 'Time Range') + return + } + case 'Slippage': { + createPart('Slippage', node.name, node, parentNode, chainParent, 'Slippage') + return + } + case 'Fee Structure': { + createPart('Fee Structure', node.name, node, parentNode, chainParent, 'Fee Structure') + return + } case 'Parameters': { createPart('Parameters', node.name, node, parentNode, chainParent, 'Parameters') if (node.baseAsset !== undefined) { createPartFromNode(node.baseAsset, node, node) } + if (node.timeRange !== undefined) { + createPartFromNode(node.timeRange, node, node) + } + if (node.slippage !== undefined) { + createPartFromNode(node.slippage, node, node) + } + if (node.feeStructure !== undefined) { + createPartFromNode(node.feeStructure, node, node) + } return } case 'Trading System': { @@ -441,6 +462,27 @@ function newPartsFromNodes () { } createPart('Base Asset', '', node.baseAsset, node, node) } + if (node.timeRange === undefined) { + node.timeRange = { + name: 'Time Range', + code: DEFAULT_CONFIG_TEXT + } + createPart('Time Range', '', node.timeRange, node, node) + } + if (node.slippage === undefined) { + node.slippage = { + name: 'Slippage', + code: DEFAULT_CONFIG_TEXT + } + createPart('Slippage', '', node.slippage, node, node) + } + if (node.feeStructure === undefined) { + node.feeStructure = { + name: 'Fee Structure', + code: DEFAULT_CONFIG_TEXT + } + createPart('Fee Structure', '', node.feeStructure, node, node) + } } function addMissingStages (node) { diff --git a/StrategySpace/Workspace/FunctionLibraries/ProtocolNode.js b/StrategySpace/Workspace/FunctionLibraries/ProtocolNode.js index 77596d2eb..58a82e3c4 100644 --- a/StrategySpace/Workspace/FunctionLibraries/ProtocolNode.js +++ b/StrategySpace/Workspace/FunctionLibraries/ProtocolNode.js @@ -252,12 +252,42 @@ function newProtocolNode () { } return object } + case 'Time Range': { + let object = { + type: node.type, + subType: node.subType, + name: node.name, + code: node.code + } + return object + } + case 'Slippage': { + let object = { + type: node.type, + subType: node.subType, + name: node.name, + code: node.code + } + return object + } + case 'Fee Structure': { + let object = { + type: node.type, + subType: node.subType, + name: node.name, + code: node.code + } + return object + } case 'Parameters': { let object = { type: node.type, subType: node.subType, name: node.name, - baseAsset: getProtocolNode(node.baseAsset, removePersonalData) + baseAsset: getProtocolNode(node.baseAsset, removePersonalData), + timeRange: getProtocolNode(node.timeRange, removePersonalData), + slippage: getProtocolNode(node.slippage, removePersonalData), + feeStructure: getProtocolNode(node.feeStructure, removePersonalData) } return object } diff --git a/StrategySpace/Workspace/FunctionLibraries/StringifyNode.js b/StrategySpace/Workspace/FunctionLibraries/StringifyNode.js index b3e61406d..f3ea230f1 100644 --- a/StrategySpace/Workspace/FunctionLibraries/StringifyNode.js +++ b/StrategySpace/Workspace/FunctionLibraries/StringifyNode.js @@ -298,6 +298,39 @@ function newStringifyNode () { } return object } + case 'Time Range': { + let object = { + id: node.id, + type: node.type, + subType: node.subType, + name: node.name, + code: node.code, + savedPayload: getSavedPayload(node) + } + return object + } + case 'Slippage': { + let object = { + id: node.id, + type: node.type, + subType: node.subType, + name: node.name, + code: node.code, + savedPayload: getSavedPayload(node) + } + return object + } + case 'Fee Structure': { + let object = { + id: node.id, + type: node.type, + subType: node.subType, + name: node.name, + code: node.code, + savedPayload: getSavedPayload(node) + } + return object + } case 'Parameters': { let object = { id: node.id, @@ -305,6 +338,9 @@ function newStringifyNode () { subType: node.subType, name: node.name, baseAsset: prepareForStringify(node.baseAsset, removePersonalData), + timeRange: prepareForStringify(node.timeRange, removePersonalData), + slippage: prepareForStringify(node.slippage, removePersonalData), + feeStructure: prepareForStringify(node.feeStructure, removePersonalData), savedPayload: getSavedPayload(node) } return object diff --git a/StrategySpace/Workspace/Workspace.js b/StrategySpace/Workspace/Workspace.js index 939b035c7..32aa832fa 100644 --- a/StrategySpace/Workspace/Workspace.js +++ b/StrategySpace/Workspace/Workspace.js @@ -321,6 +321,18 @@ function newWorkspace () { functionLibraryNodeDeleter.deleteBaseAsset(payload.node, workspaceNode.rootNodes) break } + case 'Delete Time Range': { + functionLibraryNodeDeleter.deleteTimeRange(payload.node, workspaceNode.rootNodes) + break + } + case 'Delete Slippage': { + functionLibraryNodeDeleter.deleteSlippage(payload.node, workspaceNode.rootNodes) + break + } + case 'Delete Fee Structure': { + functionLibraryNodeDeleter.deleteFeeStructure(payload.node, workspaceNode.rootNodes) + break + } case 'Delete Strategy': { functionLibraryNodeDeleter.deleteStrategy(payload.node, workspaceNode.rootNodes) break From 933c99967503d4b48b142dea56126b7e0c3a1660 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sat, 24 Aug 2019 14:54:22 +0200 Subject: [PATCH 05/40] Icon changed --- FloatingSpace/StrategyPart.js | 3 ++- FloatingSpace/StrategyPartConstructor.js | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/FloatingSpace/StrategyPart.js b/FloatingSpace/StrategyPart.js index 930a99e1f..05d4719e8 100644 --- a/FloatingSpace/StrategyPart.js +++ b/FloatingSpace/StrategyPart.js @@ -731,7 +731,7 @@ function newStrategyPart () { let label if (radius > 6) { - const MAX_LABEL_LENGTH = 40 + const MAX_LABEL_LENGTH = 45 label = errorMessage @@ -1009,3 +1009,4 @@ function newStrategyPart () { } } } + diff --git a/FloatingSpace/StrategyPartConstructor.js b/FloatingSpace/StrategyPartConstructor.js index 2018cdcd8..70cfa70bb 100644 --- a/FloatingSpace/StrategyPartConstructor.js +++ b/FloatingSpace/StrategyPartConstructor.js @@ -222,7 +222,7 @@ function newStrategyPartConstructor () { label: 'Run', visible: false, iconPathOn: 'paper-plane', - iconPathOff: 'menu-share', + iconPathOff: 'paper-plane', rawRadius: 8, targetRadius: 0, currentRadius: 0, From 4d4c1d0155ecbded3f9ef8b781767be4978e284e Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sun, 25 Aug 2019 20:29:43 +0200 Subject: [PATCH 06/40] Better Error Showing --- FloatingSpace/StrategyPart.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/FloatingSpace/StrategyPart.js b/FloatingSpace/StrategyPart.js index 05d4719e8..e9d6dc866 100644 --- a/FloatingSpace/StrategyPart.js +++ b/FloatingSpace/StrategyPart.js @@ -724,14 +724,14 @@ function newStrategyPart () { position = thisObject.container.frame.frameThisPoint(position) - let radius = thisObject.container.frame.radius + let radius = thisObject.container.frame.radius * 3.5 /* Label Text */ let labelPoint let fontSize = thisObject.payload.floatingObject.currentFontSize * 3 / 4 let label if (radius > 6) { - const MAX_LABEL_LENGTH = 45 + const MAX_LABEL_LENGTH = 65 label = errorMessage From ed0e0f0e079610476be8cffad18f73aea8f01791 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sun, 25 Aug 2019 20:51:44 +0200 Subject: [PATCH 07/40] Error handling --- FloatingSpace/StrategyPart.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/FloatingSpace/StrategyPart.js b/FloatingSpace/StrategyPart.js index e9d6dc866..498cb3214 100644 --- a/FloatingSpace/StrategyPart.js +++ b/FloatingSpace/StrategyPart.js @@ -731,7 +731,7 @@ function newStrategyPart () { let label if (radius > 6) { - const MAX_LABEL_LENGTH = 65 + const MAX_LABEL_LENGTH = 80 label = errorMessage @@ -1009,4 +1009,3 @@ function newStrategyPart () { } } } - From 8c4fbe6609a198171bb249eb0595ecd379c1745b Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Wed, 28 Aug 2019 14:46:07 +0200 Subject: [PATCH 08/40] Fix zoom for mac users --- Animation.js | 9 +++++++++ ChartsSpace/ViewPort.js | 4 ++++ 2 files changed, 13 insertions(+) diff --git a/Animation.js b/Animation.js index 95bf8a85d..c5a53041d 100644 --- a/Animation.js +++ b/Animation.js @@ -79,7 +79,16 @@ function newAnimation () { /* We request the next frame to be drawn, and stablishing a loop */ + /* Use this code for full animation speed. */ animationLoopHandle = window.requestAnimationFrame(animationLoop) + + /* Use this code for max 10 frames per second animation speed, if the app is consumming too much of your CPU. */ + /* + setTimeout(nextLoop, 100) + function nextLoop () { + animationLoopHandle = window.requestAnimationFrame(animationLoop) + } + */ } catch (err) { if (ERROR_LOG === true) { logger.write('[ERROR] animationLoop -> err = ' + err.stack) } } diff --git a/ChartsSpace/ViewPort.js b/ChartsSpace/ViewPort.js index 358f3a1e6..40f5154f9 100644 --- a/ChartsSpace/ViewPort.js +++ b/ChartsSpace/ViewPort.js @@ -204,6 +204,10 @@ function newViewPort () { function applyZoom (amount) { // console.log("applyZoom amount: " + amount); + /* We adjust the sensitivity for Mac Users */ + let isMac = navigator.platform.toUpperCase().indexOf('MAC') >= 0 + if (isMac) { amount = amount / 5 } + if (amount > 0) { if (thisObject.zoomTargetLevel > -5) { amount = amount * 2 From 5647484345c57a3292b151683aa702f30089a6b8 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Wed, 28 Aug 2019 20:13:14 +0200 Subject: [PATCH 09/40] bug fixxed --- Scales/TimePeriodScale.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Scales/TimePeriodScale.js b/Scales/TimePeriodScale.js index 25d94cf15..38ba997b4 100644 --- a/Scales/TimePeriodScale.js +++ b/Scales/TimePeriodScale.js @@ -175,12 +175,12 @@ to be visible at the top of the viewPort. */ point1 = { x: 0, - y: frame.height - frame.height / 10 + y: frame.height - frame.height * 2 / 100 } point2 = { x: frame.width, - y: frame.height - frame.height / 10 + y: frame.height - frame.height * 2 / 100 } point3 = { From 701ef42513a7b30adc05c5d1110b6a721f0afda8 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Wed, 28 Aug 2019 20:37:20 +0200 Subject: [PATCH 10/40] Ordering Menu Items with some logic --- FloatingSpace/StrategyPartConstructor.js | 304 +++++++++++------------ 1 file changed, 152 insertions(+), 152 deletions(-) diff --git a/FloatingSpace/StrategyPartConstructor.js b/FloatingSpace/StrategyPartConstructor.js index 70cfa70bb..08233154b 100644 --- a/FloatingSpace/StrategyPartConstructor.js +++ b/FloatingSpace/StrategyPartConstructor.js @@ -246,22 +246,6 @@ function newStrategyPartConstructor () { angle: -40 } ) - menuItemsInitialValues.push( - { - action: 'Delete Definition', - askConfirmation: true, - confirmationLabel: 'Confirm to Delete', - actionFunction: payload.onMenuItemClick, - label: 'Delete Definition', - visible: false, - iconPathOn: 'delete', - iconPathOff: 'delete', - rawRadius: 8, - targetRadius: 0, - currentRadius: 0, - angle: -10 - } - ) menuItemsInitialValues.push( { action: 'Add Trading System', @@ -272,7 +256,7 @@ function newStrategyPartConstructor () { rawRadius: 8, targetRadius: 0, currentRadius: 0, - angle: 10 + angle: -10 } ) menuItemsInitialValues.push( @@ -285,9 +269,25 @@ function newStrategyPartConstructor () { rawRadius: 8, targetRadius: 0, currentRadius: 0, - angle: 40 + angle: 10 } ) + menuItemsInitialValues.push( + { + action: 'Delete Definition', + askConfirmation: true, + confirmationLabel: 'Confirm to Delete', + actionFunction: payload.onMenuItemClick, + label: 'Delete Definition', + visible: false, + iconPathOn: 'delete', + iconPathOff: 'delete', + rawRadius: 8, + targetRadius: 0, + currentRadius: 0, + angle: 40 + } + ) menuItemsInitialValues.push( { action: 'Share', @@ -306,6 +306,19 @@ function newStrategyPartConstructor () { } case 'Personal Data': { addLeftIcons(menuItemsInitialValues, floatingObject) + menuItemsInitialValues.push( + { + action: 'Add Exchange Account', + actionFunction: payload.onMenuItemClick, + label: 'Add Exchange Account', + visible: false, + relatedStrategyPart: 'Exchange Account', + rawRadius: 8, + targetRadius: 0, + currentRadius: 0, + angle: -20 + } + ) menuItemsInitialValues.push( { action: 'Delete Personal Data', @@ -319,26 +332,39 @@ function newStrategyPartConstructor () { rawRadius: 8, targetRadius: 0, currentRadius: 0, - angle: -20 - } - ) - menuItemsInitialValues.push( - { - action: 'Add Exchange Account', - actionFunction: payload.onMenuItemClick, - label: 'Add Exchange Account', - visible: false, - relatedStrategyPart: 'Exchange Account', - rawRadius: 8, - targetRadius: 0, - currentRadius: 0, angle: +20 } - ) + ) break } case 'Exchange Account': { addLeftIcons(menuItemsInitialValues, floatingObject) + menuItemsInitialValues.push( + { + action: 'Add Exchange Account Asset', + actionFunction: payload.onMenuItemClick, + label: 'Add Asset', + visible: false, + relatedStrategyPart: 'Exchange Account Asset', + rawRadius: 8, + targetRadius: 0, + currentRadius: 0, + angle: -40 + } + ) + menuItemsInitialValues.push( + { + action: 'Add Exchange Account Key', + actionFunction: payload.onMenuItemClick, + label: 'Add Key', + visible: false, + relatedStrategyPart: 'Exchange Account Key', + rawRadius: 8, + targetRadius: 0, + currentRadius: 0, + angle: 0 + } + ) menuItemsInitialValues.push( { action: 'Delete Exchange Account', @@ -352,35 +378,9 @@ function newStrategyPartConstructor () { rawRadius: 8, targetRadius: 0, currentRadius: 0, - angle: -40 - } - ) - menuItemsInitialValues.push( - { - action: 'Add Exchange Account Asset', - actionFunction: payload.onMenuItemClick, - label: 'Add Asset', - visible: false, - relatedStrategyPart: 'Exchange Account Asset', - rawRadius: 8, - targetRadius: 0, - currentRadius: 0, - angle: 0 - } - ) - menuItemsInitialValues.push( - { - action: 'Add Exchange Account Key', - actionFunction: payload.onMenuItemClick, - label: 'Add Key', - visible: false, - relatedStrategyPart: 'Exchange Account Key', - rawRadius: 8, - targetRadius: 0, - currentRadius: 0, angle: 40 } - ) + ) break } case 'Exchange Account Asset': { @@ -445,22 +445,6 @@ function newStrategyPartConstructor () { } case 'Trading System': { addLeftIcons(menuItemsInitialValues, floatingObject) - menuItemsInitialValues.push( - { - action: 'Delete Trading System', - askConfirmation: true, - confirmationLabel: 'Confirm to Delete', - actionFunction: payload.onMenuItemClick, - label: 'Delete Trading System', - visible: false, - iconPathOn: 'delete', - iconPathOff: 'delete', - rawRadius: 8, - targetRadius: 0, - currentRadius: 0, - angle: -60 - } - ) menuItemsInitialValues.push( { action: 'Add Strategy', @@ -471,7 +455,7 @@ function newStrategyPartConstructor () { rawRadius: 8, targetRadius: 0, currentRadius: 0, - angle: -20 + angle: -60 } ) menuItemsInitialValues.push( @@ -484,9 +468,25 @@ function newStrategyPartConstructor () { rawRadius: 8, targetRadius: 0, currentRadius: 0, - angle: 20 + angle: -20 } ) + menuItemsInitialValues.push( + { + action: 'Delete Trading System', + askConfirmation: true, + confirmationLabel: 'Confirm to Delete', + actionFunction: payload.onMenuItemClick, + label: 'Delete Trading System', + visible: false, + iconPathOn: 'delete', + iconPathOff: 'delete', + rawRadius: 8, + targetRadius: 0, + currentRadius: 0, + angle: 20 + } + ) menuItemsInitialValues.push( { action: 'Share', @@ -507,14 +507,11 @@ function newStrategyPartConstructor () { addLeftIcons(menuItemsInitialValues, floatingObject) menuItemsInitialValues.push( { - action: 'Delete Parameters', - askConfirmation: true, - confirmationLabel: 'Confirm to Delete', + action: 'Add Missing Parameters', actionFunction: payload.onMenuItemClick, - label: 'Delete Parameters', + label: 'Add Missing Params', visible: false, - iconPathOn: 'delete', - iconPathOff: 'delete', + relatedStrategyPart: 'Parameters', rawRadius: 8, targetRadius: 0, currentRadius: 0, @@ -523,11 +520,14 @@ function newStrategyPartConstructor () { ) menuItemsInitialValues.push( { - action: 'Add Missing Parameters', + action: 'Delete Parameters', + askConfirmation: true, + confirmationLabel: 'Confirm to Delete', actionFunction: payload.onMenuItemClick, - label: 'Add Missing Params', + label: 'Delete Parameters', visible: false, - relatedStrategyPart: 'Parameters', + iconPathOn: 'delete', + iconPathOff: 'delete', rawRadius: 8, targetRadius: 0, currentRadius: 0, @@ -559,14 +559,12 @@ function newStrategyPartConstructor () { addLeftIcons(menuItemsInitialValues, floatingObject) menuItemsInitialValues.push( { - action: 'Delete Base Asset', - askConfirmation: true, - confirmationLabel: 'Confirm to Delete', - actionFunction: payload.onMenuItemClick, - label: 'Delete Base Asset', + action: 'Edit Base Asset', + actionFunction: strategyPart.codeEditor.activate, + label: 'Edit Base Asset', visible: false, - iconPathOn: 'delete', - iconPathOff: 'delete', + iconPathOn: 'settings', + iconPathOff: 'settings', rawRadius: 8, targetRadius: 0, currentRadius: 0, @@ -575,12 +573,14 @@ function newStrategyPartConstructor () { ) menuItemsInitialValues.push( { - action: 'Edit Base Asset', - actionFunction: strategyPart.codeEditor.activate, - label: 'Edit Base Asset', + action: 'Delete Base Asset', + askConfirmation: true, + confirmationLabel: 'Confirm to Delete', + actionFunction: payload.onMenuItemClick, + label: 'Delete Base Asset', visible: false, - iconPathOn: 'settings', - iconPathOff: 'settings', + iconPathOn: 'delete', + iconPathOff: 'delete', rawRadius: 8, targetRadius: 0, currentRadius: 0, @@ -612,14 +612,12 @@ function newStrategyPartConstructor () { addLeftIcons(menuItemsInitialValues, floatingObject) menuItemsInitialValues.push( { - action: 'Delete Time Range', - askConfirmation: true, - confirmationLabel: 'Confirm to Delete', - actionFunction: payload.onMenuItemClick, - label: 'Delete Time Range', + action: 'Edit Time Range', + actionFunction: strategyPart.codeEditor.activate, + label: 'Edit Time Range', visible: false, - iconPathOn: 'delete', - iconPathOff: 'delete', + iconPathOn: 'settings', + iconPathOff: 'settings', rawRadius: 8, targetRadius: 0, currentRadius: 0, @@ -628,12 +626,14 @@ function newStrategyPartConstructor () { ) menuItemsInitialValues.push( { - action: 'Edit Time Range', - actionFunction: strategyPart.codeEditor.activate, - label: 'Edit Time Range', + action: 'Delete Time Range', + askConfirmation: true, + confirmationLabel: 'Confirm to Delete', + actionFunction: payload.onMenuItemClick, + label: 'Delete Time Range', visible: false, - iconPathOn: 'settings', - iconPathOff: 'settings', + iconPathOn: 'delete', + iconPathOff: 'delete', rawRadius: 8, targetRadius: 0, currentRadius: 0, @@ -665,14 +665,12 @@ function newStrategyPartConstructor () { addLeftIcons(menuItemsInitialValues, floatingObject) menuItemsInitialValues.push( { - action: 'Delete Slippage', - askConfirmation: true, - confirmationLabel: 'Confirm to Delete', - actionFunction: payload.onMenuItemClick, - label: 'Delete Slippage', + action: 'Edit Slippage', + actionFunction: strategyPart.codeEditor.activate, + label: 'Edit Slippage', visible: false, - iconPathOn: 'delete', - iconPathOff: 'delete', + iconPathOn: 'settings', + iconPathOff: 'settings', rawRadius: 8, targetRadius: 0, currentRadius: 0, @@ -681,12 +679,14 @@ function newStrategyPartConstructor () { ) menuItemsInitialValues.push( { - action: 'Edit Slippage', - actionFunction: strategyPart.codeEditor.activate, - label: 'Edit Slippage', + action: 'Delete Slippage', + askConfirmation: true, + confirmationLabel: 'Confirm to Delete', + actionFunction: payload.onMenuItemClick, + label: 'Delete Slippage', visible: false, - iconPathOn: 'settings', - iconPathOff: 'settings', + iconPathOn: 'delete', + iconPathOff: 'delete', rawRadius: 8, targetRadius: 0, currentRadius: 0, @@ -718,14 +718,12 @@ function newStrategyPartConstructor () { addLeftIcons(menuItemsInitialValues, floatingObject) menuItemsInitialValues.push( { - action: 'Delete Fee Structure', - askConfirmation: true, - confirmationLabel: 'Confirm to Delete', - actionFunction: payload.onMenuItemClick, - label: 'Delete Fee Structure', + action: 'Edit Fee Structure', + actionFunction: strategyPart.codeEditor.activate, + label: 'Edit Fee Structure', visible: false, - iconPathOn: 'delete', - iconPathOff: 'delete', + iconPathOn: 'settings', + iconPathOff: 'settings', rawRadius: 8, targetRadius: 0, currentRadius: 0, @@ -734,12 +732,14 @@ function newStrategyPartConstructor () { ) menuItemsInitialValues.push( { - action: 'Edit Fee Structure', - actionFunction: strategyPart.codeEditor.activate, - label: 'Edit Fee Structure', + action: 'Delete Fee Structure', + askConfirmation: true, + confirmationLabel: 'Confirm to Delete', + actionFunction: payload.onMenuItemClick, + label: 'Delete Fee Structure', visible: false, - iconPathOn: 'settings', - iconPathOff: 'settings', + iconPathOn: 'delete', + iconPathOff: 'delete', rawRadius: 8, targetRadius: 0, currentRadius: 0, @@ -1014,14 +1014,11 @@ function newStrategyPartConstructor () { addLeftIcons(menuItemsInitialValues, floatingObject) menuItemsInitialValues.push( { - action: 'Delete Position Size', - askConfirmation: true, - confirmationLabel: 'Confirm to Delete', + action: 'Add Formula', actionFunction: payload.onMenuItemClick, - label: 'Delete Position Size', + label: 'Add Formula', visible: false, - iconPathOn: 'delete', - iconPathOff: 'delete', + relatedStrategyPart: 'Formula', rawRadius: 8, targetRadius: 0, currentRadius: 0, @@ -1030,11 +1027,14 @@ function newStrategyPartConstructor () { ) menuItemsInitialValues.push( { - action: 'Add Formula', + action: 'Delete Position Size', + askConfirmation: true, + confirmationLabel: 'Confirm to Delete', actionFunction: payload.onMenuItemClick, - label: 'Add Formula', + label: 'Delete Position Size', visible: false, - relatedStrategyPart: 'Formula', + iconPathOn: 'delete', + iconPathOff: 'delete', rawRadius: 8, targetRadius: 0, currentRadius: 0, @@ -1061,14 +1061,11 @@ function newStrategyPartConstructor () { addLeftIcons(menuItemsInitialValues, floatingObject) menuItemsInitialValues.push( { - action: 'Delete Position Rate', - askConfirmation: true, - confirmationLabel: 'Confirm to Delete', + action: 'Add Formula', actionFunction: payload.onMenuItemClick, - label: 'Delete Position Rate', + label: 'Add Formula', visible: false, - iconPathOn: 'delete', - iconPathOff: 'delete', + relatedStrategyPart: 'Formula', rawRadius: 8, targetRadius: 0, currentRadius: 0, @@ -1077,11 +1074,14 @@ function newStrategyPartConstructor () { ) menuItemsInitialValues.push( { - action: 'Add Formula', + action: 'Delete Position Rate', + askConfirmation: true, + confirmationLabel: 'Confirm to Delete', actionFunction: payload.onMenuItemClick, - label: 'Add Formula', + label: 'Delete Position Rate', visible: false, - relatedStrategyPart: 'Formula', + iconPathOn: 'delete', + iconPathOff: 'delete', rawRadius: 8, targetRadius: 0, currentRadius: 0, From 402540c78114ff51745e8f9ee152de6ee7a3b172 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Fri, 6 Sep 2019 08:33:39 +0200 Subject: [PATCH 11/40] System Event Handler Working --- CockpitSpace/RestartSimulation.js | 24 ++++-- Dashboard.js | 44 +++++----- Globals.js | 1 + SystemEventHandler.js | 129 ++++++++++++++++++++++++++++++ 4 files changed, 172 insertions(+), 26 deletions(-) create mode 100644 SystemEventHandler.js diff --git a/CockpitSpace/RestartSimulation.js b/CockpitSpace/RestartSimulation.js index 451c4f4ac..7d1ebab5e 100644 --- a/CockpitSpace/RestartSimulation.js +++ b/CockpitSpace/RestartSimulation.js @@ -35,6 +35,7 @@ function newRestartSimulation () { let executionFocusExists = false let idleLabel = '' + let date = '' return thisObject @@ -56,6 +57,8 @@ function newRestartSimulation () { selfMouseNotOverEventSubscriptionId = thisObject.container.eventHandler.listenToEvent('onMouseNotOver', onMouseNotOver) thisObject.status = 'Ready' + + systemEventHandler.createEventHandler('Cockpit-Restart-Simulation') } function getContainer (point, purpose) { @@ -86,6 +89,7 @@ function newRestartSimulation () { async function restart () { try { + /* Processing the restart */ thisObject.status = 'Saving' let result = await canvas.strategySpace.strategizerGateway.saveToStrategyzer(getSimulationParams()) if (result === true) { @@ -100,18 +104,20 @@ function newRestartSimulation () { } } } - callServer('', 'RestartCloneExecutor', onSaved) - function onSaved (err) { - if (err.result === GLOBAL.DEFAULT_OK_RESPONSE.result) { - logger.write('[INFO] Restart Simulation -> Clone Executor Restarted') - } else { - logger.write('[ERROR] Restart Simulation -> Can not restart Clone Executor. err = ' + err.messsage) - } + + systemEventHandler.raiseEvent('Cockpit-Restart-Simulation', 'Simulation Started') + + /* We will start listening to the event that is triggered when the simulation process finishes processing one day. */ + systemEventHandler.listenToEvent('Jason-Multi-Period', 'Status Report Updated', undefined, undefined, undefined, onEvent) + + function onEvent (message) { + date = message.event.lastProcessedDay } } else { thisObject.status = 'Restarting' await graphQlRestartSimulation(simulationParams) } + thisObject.status = 'Calculating' counterTillNextState = 500 } else { @@ -326,6 +332,10 @@ function newRestartSimulation () { } labelPoint = thisObject.container.frame.frameThisPoint(labelPoint) + if (date !== '') { + label = date + } + browserCanvasContext.fillStyle = 'rgba(' + UI_COLOR.WHITE + ', ' + OPACITY + ')' browserCanvasContext.fillText(label, labelPoint.x, labelPoint.y) } diff --git a/Dashboard.js b/Dashboard.js index 4811d2b5a..ac0507ce8 100644 --- a/Dashboard.js +++ b/Dashboard.js @@ -1,6 +1,7 @@ let canvas let markets let ecosystem = newEcosystem() +let systemEventHandler let viewPort try { @@ -32,29 +33,34 @@ function newDashboard () { function start () { try { - /* If this method is executed for a second time, it should finalize the current execution structure */ + systemEventHandler = newSystemEventHandler() + systemEventHandler.initialize(startCanvas) - if (canvas !== undefined) { canvas.finalize() } + function startCanvas () { + /* If this method is executed for a second time, it should finalize the current execution structure */ - /* Here we check where we are executing. In case we are Local we need to create a Local Dummy User and Team. */ + if (canvas !== undefined) { canvas.finalize() } - if (window.canvasApp.executingAt === 'Local') { - window.localStorage.setItem(LOGGED_IN_ACCESS_TOKEN_LOCAL_STORAGE_KEY, 'Local Access Token') // Dummy Access Token - window.localStorage.setItem(LOGGED_IN_USER_LOCAL_STORAGE_KEY, '{"authId":"x|x","alias":"user"}') // Dummy Local User + /* Here we check where we are executing. In case we are Local we need to create a Local Dummy User and Team. */ + + if (window.canvasApp.executingAt === 'Local') { + window.localStorage.setItem(LOGGED_IN_ACCESS_TOKEN_LOCAL_STORAGE_KEY, 'Local Access Token') // Dummy Access Token + window.localStorage.setItem(LOGGED_IN_USER_LOCAL_STORAGE_KEY, '{"authId":"x|x","alias":"user"}') // Dummy Local User + } + + /* Here we will setup the global eventHandler that will enable the Canvas App to react to events happening outside its execution scope. */ + + window.canvasApp.eventHandler = newEventHandler() + userProfileChangedEventSubscriptionId = window.canvasApp.eventHandler.listenToEvent('User Profile Changed', userProfileChanged) + browserResizedEventSubscriptionId = window.canvasApp.eventHandler.listenToEvent('Browser Resized', browserResized) + + /* Here we used to have a call to the Teams Module to get the profile pictures. That was removed but to keep things working, we do this: */ + + window.canvasApp.context.teamProfileImages = new Map() + window.canvasApp.context.fbProfileImages = new Map() + + setTimeout(delayedStart, DEBUG_START_UP_DELAY) } - - /* Here we will setup the global eventHandler that will enable the Canvas App to react to events happening outside its execution scope. */ - - window.canvasApp.eventHandler = newEventHandler() - userProfileChangedEventSubscriptionId = window.canvasApp.eventHandler.listenToEvent('User Profile Changed', userProfileChanged) - browserResizedEventSubscriptionId = window.canvasApp.eventHandler.listenToEvent('Browser Resized', browserResized) - - /* Here we used to have a call to the Teams Module to get the profile pictures. That was removed but to keep things working, we do this: */ - - window.canvasApp.context.teamProfileImages = new Map() - window.canvasApp.context.fbProfileImages = new Map() - - setTimeout(delayedStart, DEBUG_START_UP_DELAY) } catch (err) { if (ERROR_LOG === true) { logger.write('[ERROR] start -> err = ' + err.stack) } } diff --git a/Globals.js b/Globals.js index 9bae5463f..4e09972ee 100644 --- a/Globals.js +++ b/Globals.js @@ -1,3 +1,4 @@ + /* User Interface Colors */ const STORAGE_PROVIDER = 'AAWeb'; diff --git a/SystemEventHandler.js b/SystemEventHandler.js new file mode 100644 index 000000000..92504e60e --- /dev/null +++ b/SystemEventHandler.js @@ -0,0 +1,129 @@ + +function newSystemEventHandler () { + /* Web Sockets Connection */ + + const MODULE_NAME = 'System Event Handler' + const ERROR_LOG = true + const logger = newWebDebugLog() + logger.fileName = MODULE_NAME + + const WEB_SOCKETS_URL = 'ws://localhost:8080' + let WEB_SOCKETS_CONNECTION + + let thisObject = { + initialize: initialize, + createEventHandler: createEventHandler, + deleteEventHandler: deleteEventHandler, + listenToEvent: listenToEvent, + stopListening: stopListening, + raiseEvent: raiseEvent + } + + let eventListeners = new Map() + let responseWaiters = new Map() + + return thisObject + + function initialize (callBackFunction) { + setuptWebSockets(callBackFunction) + } + + function sendCommand (command, responseCallBack, eventsCallBack) { + if (command.action === 'listenToEvent') { + eventListeners.set(command.eventHandlerName + '-' + command.eventType, eventsCallBack) + } + if (command.callerId && responseCallBack) { + responseWaiters.set(command.callerId, responseCallBack) + } + + WEB_SOCKETS_CONNECTION.send(JSON.stringify(command)) + } + + function createEventHandler (eventHandlerName, callerId, responseCallBack) { + let eventCommand = { + action: 'createEventHandler', + eventHandlerName: eventHandlerName, + callerId: callerId + } + sendCommand(eventCommand, responseCallBack) + } + + function deleteEventHandler (eventHandlerName, callerId, responseCallBack) { + let eventCommand = { + action: 'deleteEventHandler', + eventHandlerName: eventHandlerName, + callerId: callerId + } + sendCommand(eventCommand, responseCallBack) + } + + function listenToEvent (eventHandlerName, eventType, extraData, callerId, responseCallBack, eventsCallBack) { + let eventCommand = { + action: 'listenToEvent', + eventHandlerName: eventHandlerName, + eventType: eventType, + extraData: extraData, + callerId: callerId + } + sendCommand(eventCommand, responseCallBack, eventsCallBack) + } + + function stopListening (eventHandlerName, eventSubscriptionId, callerId, responseCallBack) { + let eventCommand = { + action: 'stopListening', + eventHandlerName: eventHandlerName, + eventSubscriptionId: eventSubscriptionId, + callerId: callerId + } + sendCommand(eventCommand, responseCallBack) + } + + function raiseEvent (eventHandlerName, eventType, event, callerId, responseCallBack) { + let eventCommand = { + action: 'raiseEvent', + eventHandlerName: eventHandlerName, + eventType: eventType, + event: event, + callerId: callerId + } + sendCommand(eventCommand, responseCallBack) + } + + function setuptWebSockets (callBackFunction) { + try { + WEB_SOCKETS_CONNECTION = new WebSocket(WEB_SOCKETS_URL) + WEB_SOCKETS_CONNECTION.onopen = () => { + console.log('Websocket connection opened.') + } + WEB_SOCKETS_CONNECTION.onerror = error => { + console.log('WebSocket error:' + JSON.stringify(error)) + } + WEB_SOCKETS_CONNECTION.onopen = () => { + callBackFunction() + } + WEB_SOCKETS_CONNECTION.onmessage = e => { + console.log('Websoked Message Received: ' + e.data) + + let message = JSON.parse(e.data) + + if (message.action === 'Event Raised') { + let handler = eventListeners.get(message.eventHandlerName + '-' + message.eventType) + if (handler) { + handler(message) + } + return + } + + if (message.action === 'Event Server Response') { + let handler = responseWaiters.get(message.callerId) + if (handler) { + handler(message) + } + return + } + } + } catch (err) { + if (ERROR_LOG === true) { logger.write('[ERROR] setuptWebSockets -> err = ' + err.stack) } + } + } +} From b5291209ce2dcefd7af82f4695ac4bbc0eeefb4d Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Fri, 6 Sep 2019 10:59:49 +0200 Subject: [PATCH 12/40] Implementing new icons part 1 --- FloatingSpace/StrategyPart.js | 30 +++ FloatingSpace/StrategyPartConstructor.js | 231 +++++++++++++++++++++++ FloatingSpace/StrategyPartTitle.js | 18 ++ Spaces/StrategySpace.js | 6 + 4 files changed, 285 insertions(+) diff --git a/FloatingSpace/StrategyPart.js b/FloatingSpace/StrategyPart.js index 498cb3214..58455534e 100644 --- a/FloatingSpace/StrategyPart.js +++ b/FloatingSpace/StrategyPart.js @@ -236,6 +236,30 @@ function newStrategyPart () { compatibleType = '->' + 'Parameters' compatibleSubType = undefined break + case 'Backend': + compatibleType = '->' + 'Definition' + compatibleSubType = undefined + break + case 'Backend Process': + compatibleType = '->' + 'Backend' + compatibleSubType = undefined + break + case 'Sensor': + compatibleType = '->' + 'Backend Process' + compatibleSubType = undefined + break + case 'Indicator': + compatibleType = '->' + 'Backend Process' + compatibleSubType = undefined + break + case 'Trading Engine': + compatibleType = '->' + 'Backend Process' + compatibleSubType = undefined + break + case 'Bot Process': + compatibleType = '->' + 'Sensor' + '->' + 'Indicator' + '->' + 'Trading Engine' + compatibleSubType = undefined + break case 'Strategy': compatibleType = '->' + 'Trading System' compatibleSubType = undefined @@ -334,6 +358,12 @@ function newStrategyPart () { let nearbyNode = floatingObject.payload.node if (compatibleType.indexOf('->' + nearbyNode.type) >= 0) { /* Discard objects with busy coonection ports */ + if (thisObject.payload.node.type === 'Backend' && nearbyNode.backend !== undefined) { continue } + if (thisObject.payload.node.type === 'Backend Process' && nearbyNode.backendProcess !== undefined) { continue } + if (thisObject.payload.node.type === 'Sensor' && nearbyNode.bot !== undefined) { continue } + if (thisObject.payload.node.type === 'Indicator' && nearbyNode.bot !== undefined) { continue } + if (thisObject.payload.node.type === 'Trading Engine' && nearbyNode.bot !== undefined) { continue } + if (thisObject.payload.node.type === 'Bot Process' && nearbyNode.botProcess !== undefined) { continue } if (thisObject.payload.node.type === 'Trading System' && nearbyNode.tradingSystem !== undefined) { continue } if (thisObject.payload.node.type === 'Personal Data' && nearbyNode.personalData !== undefined) { continue } if (thisObject.payload.node.type === 'Parameters' && nearbyNode.parameters !== undefined) { continue } diff --git a/FloatingSpace/StrategyPartConstructor.js b/FloatingSpace/StrategyPartConstructor.js index 08233154b..341fc71a7 100644 --- a/FloatingSpace/StrategyPartConstructor.js +++ b/FloatingSpace/StrategyPartConstructor.js @@ -304,6 +304,237 @@ function newStrategyPartConstructor () { ) break } + case 'Backend': { + addLeftIcons(menuItemsInitialValues, floatingObject) + menuItemsInitialValues.push( + { + action: 'Add Backend Process', + actionFunction: payload.onMenuItemClick, + label: 'Add Backend Process', + visible: false, + relatedStrategyPart: 'Backend', + rawRadius: 8, + targetRadius: 0, + currentRadius: 0, + angle: -20 + } + ) + menuItemsInitialValues.push( + { + action: 'Delete Backend', + askConfirmation: true, + confirmationLabel: 'Confirm to Delete', + actionFunction: payload.onMenuItemClick, + label: 'Delete Backend', + visible: false, + iconPathOn: 'delete', + iconPathOff: 'delete', + rawRadius: 8, + targetRadius: 0, + currentRadius: 0, + angle: +20 + } + ) + break + } + case 'Backend Process': { + addLeftIcons(menuItemsInitialValues, floatingObject) + menuItemsInitialValues.push( + { + action: 'Add Sensor', + actionFunction: payload.onMenuItemClick, + label: 'Add Sensor', + visible: false, + relatedStrategyPart: 'Sensor', + rawRadius: 8, + targetRadius: 0, + currentRadius: 0, + angle: -60 + } + ) + menuItemsInitialValues.push( + { + action: 'Add Indicator', + actionFunction: payload.onMenuItemClick, + label: 'Add Indicator', + visible: false, + relatedStrategyPart: 'Indicator', + rawRadius: 8, + targetRadius: 0, + currentRadius: 0, + angle: -20 + } + ) + menuItemsInitialValues.push( + { + action: 'Add Trading Engine', + actionFunction: payload.onMenuItemClick, + label: 'Add Trading Engine', + visible: false, + relatedStrategyPart: 'Trading Engine', + rawRadius: 8, + targetRadius: 0, + currentRadius: 0, + angle: 20 + } + ) + menuItemsInitialValues.push( + { + action: 'Delete Backend Process', + askConfirmation: true, + confirmationLabel: 'Confirm to Delete', + actionFunction: payload.onMenuItemClick, + label: 'Delete Backend Process', + visible: false, + iconPathOn: 'delete', + iconPathOff: 'delete', + rawRadius: 8, + targetRadius: 0, + currentRadius: 0, + angle: +6s0 + } + ) + break + } + case 'Sensor': { + addLeftIcons(menuItemsInitialValues, floatingObject) + menuItemsInitialValues.push( + { + action: 'Add Bot Process', + actionFunction: payload.onMenuItemClick, + label: 'Add Bot Process', + visible: false, + relatedStrategyPart: 'Bot Process', + rawRadius: 8, + targetRadius: 0, + currentRadius: 0, + angle: -20 + } + ) + menuItemsInitialValues.push( + { + action: 'Delete Sensor', + askConfirmation: true, + confirmationLabel: 'Confirm to Delete', + actionFunction: payload.onMenuItemClick, + label: 'Delete Sensor', + visible: false, + iconPathOn: 'delete', + iconPathOff: 'delete', + rawRadius: 8, + targetRadius: 0, + currentRadius: 0, + angle: +20 + } + ) + break + } + case 'Indicator': { + addLeftIcons(menuItemsInitialValues, floatingObject) + menuItemsInitialValues.push( + { + action: 'Add Bot Process', + actionFunction: payload.onMenuItemClick, + label: 'Add Bot Process', + visible: false, + relatedStrategyPart: 'Bot Process', + rawRadius: 8, + targetRadius: 0, + currentRadius: 0, + angle: -20 + } + ) + menuItemsInitialValues.push( + { + action: 'Delete Indicator', + askConfirmation: true, + confirmationLabel: 'Confirm to Delete', + actionFunction: payload.onMenuItemClick, + label: 'Delete Indicator', + visible: false, + iconPathOn: 'delete', + iconPathOff: 'delete', + rawRadius: 8, + targetRadius: 0, + currentRadius: 0, + angle: +20 + } + ) + break + } + case 'Trading Engine': { + addLeftIcons(menuItemsInitialValues, floatingObject) + menuItemsInitialValues.push( + { + action: 'Add Bot Process', + actionFunction: payload.onMenuItemClick, + label: 'Add Bot Process', + visible: false, + relatedStrategyPart: 'Bot Process', + rawRadius: 8, + targetRadius: 0, + currentRadius: 0, + angle: -20 + } + ) + menuItemsInitialValues.push( + { + action: 'Delete Trading Engine', + askConfirmation: true, + confirmationLabel: 'Confirm to Delete', + actionFunction: payload.onMenuItemClick, + label: 'Delete Trading Engine', + visible: false, + iconPathOn: 'delete', + iconPathOff: 'delete', + rawRadius: 8, + targetRadius: 0, + currentRadius: 0, + angle: +20 + } + ) + break + } + case 'Bot Process': { + strategyPart.codeEditor = newCodeEditor() + strategyPart.codeEditor.isVisibleFunction = strategyPart.isVisibleFunction + strategyPart.codeEditor.initialize() + strategyPart.codeEditor.container.connectToParent(strategyPart.container, false, false, true, true, false, false, false, false) + + addLeftIcons(menuItemsInitialValues, floatingObject) + menuItemsInitialValues.push( + { + action: 'Edit Bot Process', + actionFunction: strategyPart.codeEditor.activate, + label: 'Edit Bot Process', + visible: false, + iconPathOn: 'html', + iconPathOff: 'html', + rawRadius: 8, + targetRadius: 0, + currentRadius: 0, + angle: -20, + dontShowAtFullscreen: true + } + ) + menuItemsInitialValues.push( + { + action: 'Delete Bot Process', + askConfirmation: true, + confirmationLabel: 'Confirm to Delete', + actionFunction: payload.onMenuItemClick, + label: 'Delete Bot Process', + visible: false, + iconPathOn: 'delete', + iconPathOff: 'delete', + rawRadius: 8, + targetRadius: 0, + currentRadius: 0, + angle: +20 + } + ) + break + } case 'Personal Data': { addLeftIcons(menuItemsInitialValues, floatingObject) menuItemsInitialValues.push( diff --git a/FloatingSpace/StrategyPartTitle.js b/FloatingSpace/StrategyPartTitle.js index e54c35838..9d8659d8e 100644 --- a/FloatingSpace/StrategyPartTitle.js +++ b/FloatingSpace/StrategyPartTitle.js @@ -52,6 +52,24 @@ function newStrategyPartTitle () { thisObject.allwaysVisible = true break } + case 'Backend': { + break + } + case 'Backend Process': { + break + } + case 'Sensor': { + break + } + case 'Indicator': { + break + } + case 'Trading Engine': { + break + } + case 'Bot Process': { + break + } case 'Personal Data': { break } diff --git a/Spaces/StrategySpace.js b/Spaces/StrategySpace.js index b64cda904..d74768e8b 100644 --- a/Spaces/StrategySpace.js +++ b/Spaces/StrategySpace.js @@ -40,6 +40,12 @@ function newStrategySpace () { function buildIconByPartTypeMap () { const relationshipArray = [ ['Definition', 'text'], + ['Backend', 'task'], + ['Backend Process', 'timeline'], + ['Sensor', 'pipette'], + ['Indicator', 'vector'], + ['Trading Engine', 'brainstorming'], + ['Bot Process', 'grid'], ['Personal Data', 'security'], ['Exchange Account', 'approve'], ['Exchange Account Asset', 'paper-plane'], From 60ad8bd819c2b06f65cb4df2c7a9a04f3c953335 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Fri, 6 Sep 2019 11:26:56 +0200 Subject: [PATCH 13/40] Adding new Icons / Objects Part 2 --- .../FunctionLibraries/AttachDetach.js | 42 +++++++ .../FunctionLibraries/NodeChildren.js | 104 ++++++++++++++++++ 2 files changed, 146 insertions(+) diff --git a/StrategySpace/Workspace/FunctionLibraries/AttachDetach.js b/StrategySpace/Workspace/FunctionLibraries/AttachDetach.js index 38ee5c501..837a66f3a 100644 --- a/StrategySpace/Workspace/FunctionLibraries/AttachDetach.js +++ b/StrategySpace/Workspace/FunctionLibraries/AttachDetach.js @@ -218,6 +218,48 @@ function newAttachDetach () { function attachNode (node, attachToNode, rootNodes) { switch (node.type) { + case 'Backend': { + node.payload.parentNode = attachToNode + node.payload.chainParent = attachToNode + node.payload.parentNode.backend = node + completeAttachment(node, rootNodes) + } + break + case 'Backend Process': { + node.payload.parentNode = attachToNode + node.payload.chainParent = attachToNode + node.payload.parentNode.backendProcesses.push(node) + completeAttachment(node, rootNodes) + } + break + case 'Sensor': { + node.payload.parentNode = attachToNode + node.payload.chainParent = attachToNode + node.payload.parentNode.bot = node + completeAttachment(node, rootNodes) + } + break + case 'Indicator': { + node.payload.parentNode = attachToNode + node.payload.chainParent = attachToNode + node.payload.parentNode.bot = node + completeAttachment(node, rootNodes) + } + break + case 'Trading Engine': { + node.payload.parentNode = attachToNode + node.payload.chainParent = attachToNode + node.payload.parentNode.bot = node + completeAttachment(node, rootNodes) + } + break + case 'Bot Process': { + node.payload.parentNode = attachToNode + node.payload.chainParent = attachToNode + node.payload.parentNode.botProcesses.push(node) + completeAttachment(node, rootNodes) + } + break case 'Personal Data': { node.payload.parentNode = attachToNode node.payload.chainParent = attachToNode diff --git a/StrategySpace/Workspace/FunctionLibraries/NodeChildren.js b/StrategySpace/Workspace/FunctionLibraries/NodeChildren.js index b52a3b16a..02caab136 100644 --- a/StrategySpace/Workspace/FunctionLibraries/NodeChildren.js +++ b/StrategySpace/Workspace/FunctionLibraries/NodeChildren.js @@ -11,6 +11,24 @@ function newNodeChildren () { case 'Definition': { return countChildrenDefinition(parentNode, childNode) } + case 'Backend': { + return countChildrenBackend(parentNode, childNode) + } + case 'Backend Process': { + return countChildrenBackendProcess(parentNode, childNode) + } + case 'Sensor': { + return countChildrenSensor(parentNode, childNode) + } + case 'Indicator': { + return countChildrenIndicator(parentNode, childNode) + } + case 'Trading Engine': { + return countChildrenTradingEngine(parentNode, childNode) + } + case 'Bot Process': { + return countChildrenBotProcess(parentNode, childNode) + } case 'Personal Data': { return countChildrenPersonalData(parentNode, childNode) } @@ -130,6 +148,92 @@ function newNodeChildren () { return response } + function countChildrenBackend (parentNode, childNode) { + let response = { + childrenCount: 0, + childIndex: undefined + } + + for (let i = 0; i < parentNode.exchangeAccounts.length; i++) { + let child = parentNode.backendProcesses[i] + response.childrenCount++ + if (child.id === childNode.id) { + response.childIndex = response.childrenCount + } + } + return response + } + + function countChildrenBackendProcess (parentNode, childNode) { + let response = { + childrenCount: 0, + childIndex: undefined + } + if (parentNode.bot !== undefined) { + response.childrenCount++ + if (parentNode.bot.id === childNode.id) { + response.childIndex = response.childrenCount + } + } + return response + } + + function countChildrenSensor (parentNode, childNode) { + let response = { + childrenCount: 0, + childIndex: undefined + } + + for (let i = 0; i < parentNode.botProcesses.length; i++) { + let child = parentNode.botProcesses[i] + response.childrenCount++ + if (child.id === childNode.id) { + response.childIndex = response.childrenCount + } + } + return response + } + + function countChildrenIndicator (parentNode, childNode) { + let response = { + childrenCount: 0, + childIndex: undefined + } + + for (let i = 0; i < parentNode.botProcesses.length; i++) { + let child = parentNode.botProcesses[i] + response.childrenCount++ + if (child.id === childNode.id) { + response.childIndex = response.childrenCount + } + } + return response + } + + function countChildrenTradingEngine (parentNode, childNode) { + let response = { + childrenCount: 0, + childIndex: undefined + } + + for (let i = 0; i < parentNode.botProcesses.length; i++) { + let child = parentNode.botProcesses[i] + response.childrenCount++ + if (child.id === childNode.id) { + response.childIndex = response.childrenCount + } + } + return response + } + + function countChildrenBotProcess (parentNode, childNode) { + let response = { + childrenCount: 0, + childIndex: undefined + } + return response + } + function countChildrenPersonalData (parentNode, childNode) { let response = { childrenCount: 0, From db721908f1f4442f60cc2ede8f544a81512dc766 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Fri, 6 Sep 2019 12:49:38 +0200 Subject: [PATCH 14/40] NodeDeleter new icons implemented --- .../FunctionLibraries/NodeDeleter.js | 92 +++++++++++++++++++ 1 file changed, 92 insertions(+) diff --git a/StrategySpace/Workspace/FunctionLibraries/NodeDeleter.js b/StrategySpace/Workspace/FunctionLibraries/NodeDeleter.js index d937c6d68..21b44f553 100644 --- a/StrategySpace/Workspace/FunctionLibraries/NodeDeleter.js +++ b/StrategySpace/Workspace/FunctionLibraries/NodeDeleter.js @@ -1,6 +1,12 @@ function newNodeDeleter () { thisObject = { deleteDefinition: deleteDefinition, + deleteBackend: deleteBackend, + deleteBackendProcess: deleteBackendProcess, + deleteSensor: deleteSensor, + deleteIndicator: deleteIndicator, + deleteTradingEngine: deleteTradingEngine, + deleteBotProcess: deleteBotProcess, deletePersonalData: deletePersonalData, deleteExchangeAccount: deleteExchangeAccount, deleteExchangeAccountAsset: deleteExchangeAccountAsset, @@ -46,6 +52,30 @@ function newNodeDeleter () { deleteDefinition(rootNode, rootNodes, true) break } + case 'Backend': { + deleteBackend(rootNode, rootNodes) + break + } + case 'Backend Process': { + deleteBackendProcess(rootNode, rootNodes) + break + } + case 'Sensor': { + deleteBot(rootNode, rootNodes) + break + } + case 'Indicator': { + deleteBot(rootNode, rootNodes) + break + } + case 'Trading Engine': { + deleteBot(rootNode, rootNodes) + break + } + case 'Bot Process': { + deleteBotProcess(rootNode, rootNodes) + break + } case 'Personal Data': { deletePersonalData(rootNode, rootNodes) break @@ -191,6 +221,68 @@ function newNodeDeleter () { if (node.personalData !== undefined) { deletePersonalData(node.personalData, rootNodes) } + if (node.backend !== undefined) { + deleteBackend(node.personalData, rootNodes) + } + completeDeletion(node, rootNodes) + destroyPart(node) + cleanNode(node) + } + + function deleteBackend (node, rootNodes) { + let payload = node.payload + if (payload.parentNode !== undefined) { + payload.parentNode.backend = undefined + } + while (node.backendProcesses.length > 0) { + deleteBackendProcess(node.backendProcesses[0], rootNodes) + } + completeDeletion(node, rootNodes) + destroyPart(node) + cleanNode(node) + } + + function deleteBackendProcess (node, rootNodes) { + let payload = node.payload + if (payload.parentNode !== undefined) { + for (let j = 0; j < payload.parentNode.backendProcesses.length; j++) { + let backendProcess = payload.parentNode.backendProcesses[j] + if (backendProcess.id === node.id) { + payload.parentNode.backendProcesses.splice(j, 1) + } + } + } + if (node.bot !== undefined) { + deleteBot(node.bot, rootNodes) + } + completeDeletion(node, rootNodes) + destroyPart(node) + cleanNode(node) + } + + function deleteBot (node, rootNodes) { + let payload = node.payload + if (payload.parentNode !== undefined) { + payload.parentNode.bot = undefined + } + while (node.botProcesses.length > 0) { + deleteBotProcess(node.botProcesses[0], rootNodes) + } + completeDeletion(node, rootNodes) + destroyPart(node) + cleanNode(node) + } + + function deleteBotProcess (node, rootNodes) { + let payload = node.payload + if (payload.parentNode !== undefined) { + for (let j = 0; j < payload.parentNode.botProcesses.length; j++) { + let backendProcess = payload.parentNode.botProcesses[j] + if (backendProcess.id === node.id) { + payload.parentNode.botProcesses.splice(j, 1) + } + } + } completeDeletion(node, rootNodes) destroyPart(node) cleanNode(node) From 2ac8afd10f202087d6d79d5b9c19c7fd47a9c7fc Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Fri, 6 Sep 2019 13:22:47 +0200 Subject: [PATCH 15/40] Parts From Nodes for new icons implemented --- .../FunctionLibraries/PartsFromNodes.js | 101 ++++++++++++++++++ 1 file changed, 101 insertions(+) diff --git a/StrategySpace/Workspace/FunctionLibraries/PartsFromNodes.js b/StrategySpace/Workspace/FunctionLibraries/PartsFromNodes.js index 94b58d6fe..4b492d9f4 100644 --- a/StrategySpace/Workspace/FunctionLibraries/PartsFromNodes.js +++ b/StrategySpace/Workspace/FunctionLibraries/PartsFromNodes.js @@ -1,6 +1,12 @@ function newPartsFromNodes () { thisObject = { createPartFromNode: createPartFromNode, + addBackend: addBackend, + addBackendProcess: addBackendProcess, + addSensor: addSensor, + addIndicator: addIndicator, + addTradingEngine: addTradingEngine, + addBotProcess: addBotProcess, addTradingSystem: addTradingSystem, addPersonalData: addPersonalData, addExchangeAccount: addExchangeAccount, @@ -329,9 +335,104 @@ function newPartsFromNodes () { } return } + case 'Backend': { + createPart('Backend', node.name, node, parentNode, chainParent, 'Backend') + for (let m = 0; m < node.backendProcesses.length; m++) { + let backendProcess = node.backendProcesses[m] + createPartFromNode(backendProcess, node, node) + } + return + } + case 'Backend Process': { + createPart('Backend Process', node.name, node, parentNode, chainParent, 'Backend Process') + if (node.bot !== undefined) { + createPartFromNode(node.bot, node, node) + } + return + } + case 'Sensor': { + createPart('Sensor', node.name, node, parentNode, chainParent, 'Sensor') + for (let m = 0; m < node.botProcesses.length; m++) { + let botProcess = node.botProcesses[m] + createPartFromNode(botProcess, node, node) + } + return + } + case 'Indicator': { + createPart('Indicator', node.name, node, parentNode, chainParent, 'Indicator') + for (let m = 0; m < node.botProcesses.length; m++) { + let botProcess = node.botProcesses[m] + createPartFromNode(botProcess, node, node) + } + return + } + case 'Trading Engine': { + createPart('Trading Engine', node.name, node, parentNode, chainParent, 'Trading Engine') + for (let m = 0; m < node.botProcesses.length; m++) { + let botProcess = node.botProcesses[m] + createPartFromNode(botProcess, node, node) + } + return + } + case 'Bot Process': { + createPart('Bot Process', node.name, node, parentNode, chainParent, 'Bot Process') + return + } } } + function addBackend (node) { + if (node.backend === undefined) { + node.backend = { + backendProcesses: [] + } + createPart('Backend', '', node.backend, node, node) + } + } + + function addBackendProcess (node) { + let backendProcess = { + name: 'New Backend Process' + } + node.backendProcesses.push(backendProcess) + createPart('Backend Process', backendProcess.name, backendProcess, node, node, 'Backend Process') + } + + function addSensor (node) { + if (node.bot === undefined) { + node.bot = { + botProcesses: [] + } + createPart('Sensor', '', node.bot, node, node) + } + } + + function addIndicator (node) { + if (node.bot === undefined) { + node.bot = { + botProcesses: [] + } + createPart('Indicator', '', node.bot, node, node) + } + } + + function addTradingEngine (node) { + if (node.bot === undefined) { + node.bot = { + botProcesses: [] + } + createPart('Trading Engine', '', node.bot, node, node) + } + } + + function addBotProcess (node) { + let botProcess = { + name: 'New Bot Process' + } + node.botProcesses.push(botProcess) + createPart('Bot Process', botProcess.name, botProcess, node, node, 'Bot Process') + } + function addTradingSystem (node) { if (node.tradingSystem === undefined) { node.tradingSystem = { From bebfa234b34830f81f3223a87dcc1a3969b10d9f Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Fri, 6 Sep 2019 13:48:22 +0200 Subject: [PATCH 16/40] Adding 6 icons almost last part --- .../FunctionLibraries/ProtocolNode.js | 74 +++++++++++++++ .../FunctionLibraries/StringifyNode.js | 90 +++++++++++++++++++ 2 files changed, 164 insertions(+) diff --git a/StrategySpace/Workspace/FunctionLibraries/ProtocolNode.js b/StrategySpace/Workspace/FunctionLibraries/ProtocolNode.js index 58a82e3c4..ec53ef55a 100644 --- a/StrategySpace/Workspace/FunctionLibraries/ProtocolNode.js +++ b/StrategySpace/Workspace/FunctionLibraries/ProtocolNode.js @@ -360,6 +360,80 @@ function newProtocolNode () { } return key } + case 'Backend': { + let backend = { + type: node.type, + subType: node.subType, + name: node.name, + backendProcesses: [] + } + + for (let m = 0; m < node.backendProcesses.length; m++) { + let backendProcess = getProtocolNode(node.backendProcesses[m], removePersonalData) + backend.backendProcesses.push(backendProcess) + } + return backend + } + case 'Backend Process': { + let object = { + type: node.type, + subType: node.subType, + name: node.name, + bot: getProtocolNode(node.bot, removePersonalData) + } + return object + } + case 'Sensor': { + let bot = { + type: node.type, + subType: node.subType, + name: node.name, + botProcesses: [] + } + + for (let m = 0; m < node.botProcesses.length; m++) { + let botProcess = getProtocolNode(node.botProcesses[m], removePersonalData) + bot.botProcesses.push(botProcess) + } + return bot + } + case 'Indicator': { + let bot = { + type: node.type, + subType: node.subType, + name: node.name, + botProcesses: [] + } + + for (let m = 0; m < node.botProcesses.length; m++) { + let botProcess = getProtocolNode(node.botProcesses[m], removePersonalData) + bot.botProcesses.push(botProcess) + } + return bot + } + case 'Trading Engine': { + let bot = { + type: node.type, + subType: node.subType, + name: node.name, + botProcesses: [] + } + + for (let m = 0; m < node.botProcesses.length; m++) { + let botProcess = getProtocolNode(node.botProcesses[m], removePersonalData) + bot.botProcesses.push(botProcess) + } + return bot + } + case 'Bot Process': { + let object = { + type: node.type, + subType: node.subType, + name: node.name, + code: node.code + } + return object + } case 'Definition': { let object = { type: node.type, diff --git a/StrategySpace/Workspace/FunctionLibraries/StringifyNode.js b/StrategySpace/Workspace/FunctionLibraries/StringifyNode.js index f3ea230f1..d2e651055 100644 --- a/StrategySpace/Workspace/FunctionLibraries/StringifyNode.js +++ b/StrategySpace/Workspace/FunctionLibraries/StringifyNode.js @@ -425,6 +425,85 @@ function newStringifyNode () { } return key } + case 'Backend': { + let backend = { + id: node.id, + type: node.type, + subType: node.subType, + name: node.name, + backendProcesses: [] + savedPayload: getSavedPayload(node) + } + + for (let m = 0; m < node.backendProcesses.length; m++) { + let backendProcess = prepareForStringify(node.backendProcesses[m], removePersonalData) + backend.backendProcesses.push(backendProcess) + } + + return backend + } + case 'Backend Process': { + let object = { + id: node.id, + type: node.type, + subType: node.subType, + name: node.name, + bot: prepareForStringify(node.bot, removePersonalData) + savedPayload: getSavedPayload(node) + } + return object + } + case 'Sensor': { + let bot = { + id: node.id, + type: node.type, + subType: node.subType, + name: node.name, + botProcesses: [] + savedPayload: getSavedPayload(node) + } + + for (let m = 0; m < node.botProcesses.length; m++) { + let botProcess = prepareForStringify(node.botProcesses[m], removePersonalData) + bot.botProcesses.push(botProcess) + } + + return bot + } + case 'Indicator': { + let bot = { + id: node.id, + type: node.type, + subType: node.subType, + name: node.name, + botProcesses: [] + savedPayload: getSavedPayload(node) + } + + for (let m = 0; m < node.botProcesses.length; m++) { + let botProcess = prepareForStringify(node.botProcesses[m], removePersonalData) + bot.botProcesses.push(botProcess) + } + + return bot + } + case 'Trading Engine': { + let bot = { + id: node.id, + type: node.type, + subType: node.subType, + name: node.name, + botProcesses: [] + savedPayload: getSavedPayload(node) + } + + for (let m = 0; m < node.botProcesses.length; m++) { + let botProcess = prepareForStringify(node.botProcesses[m], removePersonalData) + bot.botProcesses.push(botProcess) + } + + return bot + } case 'Definition': { let object = { id: node.id, @@ -437,6 +516,17 @@ function newStringifyNode () { } return object } + case 'Bot Process': { + let object = { + id: node.id, + type: node.type, + subType: node.subType, + name: node.name, + code: node.code + savedPayload: getSavedPayload(node) + } + return object + } } } From c35435a33abf89dc91f3d07e91615d26f0617417 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Fri, 6 Sep 2019 13:53:47 +0200 Subject: [PATCH 17/40] All code implemente for the 6 icons --- StrategySpace/Workspace/Workspace.js | 54 ++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/StrategySpace/Workspace/Workspace.js b/StrategySpace/Workspace/Workspace.js index 32aa832fa..671ee31e1 100644 --- a/StrategySpace/Workspace/Workspace.js +++ b/StrategySpace/Workspace/Workspace.js @@ -208,6 +208,36 @@ function newWorkspace () { download(fileName, text) } + break + case 'Add Backend': + { + functionLibraryPartsFromNodes.addBackend(payload.node) + } + break + case 'Add Backend Process': + { + functionLibraryPartsFromNodes.addBackendProcess(payload.node) + } + break + case 'Add Sensor': + { + functionLibraryPartsFromNodes.addSensor(payload.node) + } + break + case 'Add Indicator': + { + functionLibraryPartsFromNodes.addIndicator(payload.node) + } + break + case 'Add Trading Engine': + { + functionLibraryPartsFromNodes.addTradingEngine(payload.node) + } + break + case 'Add Bot Process': + { + functionLibraryPartsFromNodes.addBotProcess(payload.node) + } break case 'Add Strategy': { @@ -309,6 +339,30 @@ function newWorkspace () { functionLibraryPartsFromNodes.addPersonalData(payload.node) } break + case 'Delete Backend': { + functionLibraryNodeDeleter.deleteBackend(payload.node, workspaceNode.rootNodes) + break + } + case 'Delete Backend Process': { + functionLibraryNodeDeleter.deleteBackendProcess(payload.node, workspaceNode.rootNodes) + break + } + case 'Delete Sensor': { + functionLibraryNodeDeleter.deleteSensor(payload.node, workspaceNode.rootNodes) + break + } + case 'Delete Indicator': { + functionLibraryNodeDeleter.deleteIndicator(payload.node, workspaceNode.rootNodes) + break + } + case 'Delete Trading Engine': { + functionLibraryNodeDeleter.deleteTradingEngine(payload.node, workspaceNode.rootNodes) + break + } + case 'Delete Bot Process': { + functionLibraryNodeDeleter.deleteBotProcess(payload.node, workspaceNode.rootNodes) + break + } case 'Delete Trading System': { functionLibraryNodeDeleter.deleteTradingSystem(payload.node, workspaceNode.rootNodes) break From 808e5bfdd35e01cbe854836427af67576e82c37c Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Fri, 6 Sep 2019 14:14:29 +0200 Subject: [PATCH 18/40] Sytax error fixed --- FloatingSpace/StrategyPartConstructor.js | 2 +- .../FunctionLibraries/NodeDeleter.js | 6 ++-- .../FunctionLibraries/StringifyNode.js | 32 +++++++++---------- 3 files changed, 20 insertions(+), 20 deletions(-) diff --git a/FloatingSpace/StrategyPartConstructor.js b/FloatingSpace/StrategyPartConstructor.js index 341fc71a7..add1cac91 100644 --- a/FloatingSpace/StrategyPartConstructor.js +++ b/FloatingSpace/StrategyPartConstructor.js @@ -391,7 +391,7 @@ function newStrategyPartConstructor () { rawRadius: 8, targetRadius: 0, currentRadius: 0, - angle: +6s0 + angle: +60 } ) break diff --git a/StrategySpace/Workspace/FunctionLibraries/NodeDeleter.js b/StrategySpace/Workspace/FunctionLibraries/NodeDeleter.js index 21b44f553..d35c1f3dc 100644 --- a/StrategySpace/Workspace/FunctionLibraries/NodeDeleter.js +++ b/StrategySpace/Workspace/FunctionLibraries/NodeDeleter.js @@ -3,9 +3,9 @@ function newNodeDeleter () { deleteDefinition: deleteDefinition, deleteBackend: deleteBackend, deleteBackendProcess: deleteBackendProcess, - deleteSensor: deleteSensor, - deleteIndicator: deleteIndicator, - deleteTradingEngine: deleteTradingEngine, + deleteSensor: deleteBot, + deleteIndicator: deleteBot, + deleteTradingEngine: deleteBot, deleteBotProcess: deleteBotProcess, deletePersonalData: deletePersonalData, deleteExchangeAccount: deleteExchangeAccount, diff --git a/StrategySpace/Workspace/FunctionLibraries/StringifyNode.js b/StrategySpace/Workspace/FunctionLibraries/StringifyNode.js index d2e651055..026835e3b 100644 --- a/StrategySpace/Workspace/FunctionLibraries/StringifyNode.js +++ b/StrategySpace/Workspace/FunctionLibraries/StringifyNode.js @@ -431,7 +431,7 @@ function newStringifyNode () { type: node.type, subType: node.subType, name: node.name, - backendProcesses: [] + backendProcesses: [], savedPayload: getSavedPayload(node) } @@ -448,7 +448,7 @@ function newStringifyNode () { type: node.type, subType: node.subType, name: node.name, - bot: prepareForStringify(node.bot, removePersonalData) + bot: prepareForStringify(node.bot, removePersonalData), savedPayload: getSavedPayload(node) } return object @@ -459,7 +459,7 @@ function newStringifyNode () { type: node.type, subType: node.subType, name: node.name, - botProcesses: [] + botProcesses: [], savedPayload: getSavedPayload(node) } @@ -476,7 +476,7 @@ function newStringifyNode () { type: node.type, subType: node.subType, name: node.name, - botProcesses: [] + botProcesses: [], savedPayload: getSavedPayload(node) } @@ -493,7 +493,7 @@ function newStringifyNode () { type: node.type, subType: node.subType, name: node.name, - botProcesses: [] + botProcesses: [], savedPayload: getSavedPayload(node) } @@ -504,6 +504,17 @@ function newStringifyNode () { return bot } + case 'Bot Process': { + let object = { + id: node.id, + type: node.type, + subType: node.subType, + name: node.name, + code: node.code, + savedPayload: getSavedPayload(node) + } + return object + } case 'Definition': { let object = { id: node.id, @@ -516,17 +527,6 @@ function newStringifyNode () { } return object } - case 'Bot Process': { - let object = { - id: node.id, - type: node.type, - subType: node.subType, - name: node.name, - code: node.code - savedPayload: getSavedPayload(node) - } - return object - } } } From c57782dcb2fd1aa353e54f91d6132d48e5272e54 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Fri, 6 Sep 2019 14:20:50 +0200 Subject: [PATCH 19/40] Connecting to definition --- FloatingSpace/StrategyPartConstructor.js | 25 ++++++++++++++----- .../FunctionLibraries/NodeChildren.js | 6 +++++ .../FunctionLibraries/PartsFromNodes.js | 3 +++ .../FunctionLibraries/ProtocolNode.js | 3 ++- .../FunctionLibraries/StringifyNode.js | 1 + 5 files changed, 31 insertions(+), 7 deletions(-) diff --git a/FloatingSpace/StrategyPartConstructor.js b/FloatingSpace/StrategyPartConstructor.js index add1cac91..4657d0f86 100644 --- a/FloatingSpace/StrategyPartConstructor.js +++ b/FloatingSpace/StrategyPartConstructor.js @@ -226,7 +226,7 @@ function newStrategyPartConstructor () { rawRadius: 8, targetRadius: 0, currentRadius: 0, - angle: -70 + angle: -75 } ) menuItemsInitialValues.push( @@ -243,7 +243,7 @@ function newStrategyPartConstructor () { rawRadius: 8, targetRadius: 0, currentRadius: 0, - angle: -40 + angle: -50 } ) menuItemsInitialValues.push( @@ -256,7 +256,7 @@ function newStrategyPartConstructor () { rawRadius: 8, targetRadius: 0, currentRadius: 0, - angle: -10 + angle: -25 } ) menuItemsInitialValues.push( @@ -269,9 +269,22 @@ function newStrategyPartConstructor () { rawRadius: 8, targetRadius: 0, currentRadius: 0, - angle: 10 + angle: 0 } ) + menuItemsInitialValues.push( + { + action: 'Add Backend', + actionFunction: payload.onMenuItemClick, + label: 'Add Backend', + visible: false, + relatedStrategyPart: 'Backend', + rawRadius: 8, + targetRadius: 0, + currentRadius: 0, + angle: 25 + } + ) menuItemsInitialValues.push( { action: 'Delete Definition', @@ -285,7 +298,7 @@ function newStrategyPartConstructor () { rawRadius: 8, targetRadius: 0, currentRadius: 0, - angle: 40 + angle: 50 } ) menuItemsInitialValues.push( @@ -299,7 +312,7 @@ function newStrategyPartConstructor () { rawRadius: 8, targetRadius: 0, currentRadius: 0, - angle: 70 + angle: 75 } ) break diff --git a/StrategySpace/Workspace/FunctionLibraries/NodeChildren.js b/StrategySpace/Workspace/FunctionLibraries/NodeChildren.js index 02caab136..0776441a7 100644 --- a/StrategySpace/Workspace/FunctionLibraries/NodeChildren.js +++ b/StrategySpace/Workspace/FunctionLibraries/NodeChildren.js @@ -145,6 +145,12 @@ function newNodeChildren () { response.childIndex = response.childrenCount } } + if (parentNode.backend !== undefined) { + response.childrenCount++ + if (parentNode.backend.id === childNode.id) { + response.childIndex = response.childrenCount + } + } return response } diff --git a/StrategySpace/Workspace/FunctionLibraries/PartsFromNodes.js b/StrategySpace/Workspace/FunctionLibraries/PartsFromNodes.js index 4b492d9f4..b151ae6f0 100644 --- a/StrategySpace/Workspace/FunctionLibraries/PartsFromNodes.js +++ b/StrategySpace/Workspace/FunctionLibraries/PartsFromNodes.js @@ -333,6 +333,9 @@ function newPartsFromNodes () { if (node.personalData !== undefined) { createPartFromNode(node.personalData, node, node) } + if (node.backend !== undefined) { + createPartFromNode(node.backend, node, node) + } return } case 'Backend': { diff --git a/StrategySpace/Workspace/FunctionLibraries/ProtocolNode.js b/StrategySpace/Workspace/FunctionLibraries/ProtocolNode.js index ec53ef55a..b4eff0efe 100644 --- a/StrategySpace/Workspace/FunctionLibraries/ProtocolNode.js +++ b/StrategySpace/Workspace/FunctionLibraries/ProtocolNode.js @@ -440,7 +440,8 @@ function newProtocolNode () { subType: node.subType, name: node.name, tradingSystem: getProtocolNode(node.tradingSystem, removePersonalData), - personalData: getProtocolNode(node.personalData, removePersonalData) + personalData: getProtocolNode(node.personalData, removePersonalData), + backend: getProtocolNode(node.backend, removePersonalData) } return object } diff --git a/StrategySpace/Workspace/FunctionLibraries/StringifyNode.js b/StrategySpace/Workspace/FunctionLibraries/StringifyNode.js index 026835e3b..ba8ff4d88 100644 --- a/StrategySpace/Workspace/FunctionLibraries/StringifyNode.js +++ b/StrategySpace/Workspace/FunctionLibraries/StringifyNode.js @@ -523,6 +523,7 @@ function newStringifyNode () { name: node.name, tradingSystem: prepareForStringify(node.tradingSystem, removePersonalData), personalData: prepareForStringify(node.personalData, removePersonalData), + backend: prepareForStringify(node.backend, removePersonalData), savedPayload: getSavedPayload(node) } return object From 62884a6d4f70e0d0990260f40971d942a3d0f583 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Fri, 6 Sep 2019 14:37:57 +0200 Subject: [PATCH 20/40] Bug Fixes con addition of new elements --- FloatingSpace/StrategyPartConstructor.js | 32 ++++++++++++++++--- .../FunctionLibraries/NodeChildren.js | 2 +- .../FunctionLibraries/PartsFromNodes.js | 3 +- 3 files changed, 31 insertions(+), 6 deletions(-) diff --git a/FloatingSpace/StrategyPartConstructor.js b/FloatingSpace/StrategyPartConstructor.js index 4657d0f86..6bfe4c870 100644 --- a/FloatingSpace/StrategyPartConstructor.js +++ b/FloatingSpace/StrategyPartConstructor.js @@ -243,7 +243,7 @@ function newStrategyPartConstructor () { rawRadius: 8, targetRadius: 0, currentRadius: 0, - angle: -50 + angle: -40 } ) menuItemsInitialValues.push( @@ -256,7 +256,7 @@ function newStrategyPartConstructor () { rawRadius: 8, targetRadius: 0, currentRadius: 0, - angle: -25 + angle: -20 } ) menuItemsInitialValues.push( @@ -282,7 +282,7 @@ function newStrategyPartConstructor () { rawRadius: 8, targetRadius: 0, currentRadius: 0, - angle: 25 + angle: 20 } ) menuItemsInitialValues.push( @@ -298,7 +298,7 @@ function newStrategyPartConstructor () { rawRadius: 8, targetRadius: 0, currentRadius: 0, - angle: 50 + angle: 40 } ) menuItemsInitialValues.push( @@ -2028,6 +2028,30 @@ function newStrategyPartConstructor () { level_0() break } + case 'Backend': { + level_1() + break + } + case 'Backend Process': { + level_2() + break + } + case 'Sensor': { + level_3() + break + } + case 'Indicator': { + level_3() + break + } + case 'Trading Engine': { + level_3() + break + } + case 'Bot Process': { + level_4() + break + } case 'Exchange Account': { level_1() break diff --git a/StrategySpace/Workspace/FunctionLibraries/NodeChildren.js b/StrategySpace/Workspace/FunctionLibraries/NodeChildren.js index 0776441a7..409d285d4 100644 --- a/StrategySpace/Workspace/FunctionLibraries/NodeChildren.js +++ b/StrategySpace/Workspace/FunctionLibraries/NodeChildren.js @@ -160,7 +160,7 @@ function newNodeChildren () { childIndex: undefined } - for (let i = 0; i < parentNode.exchangeAccounts.length; i++) { + for (let i = 0; i < parentNode.backendProcesses.length; i++) { let child = parentNode.backendProcesses[i] response.childrenCount++ if (child.id === childNode.id) { diff --git a/StrategySpace/Workspace/FunctionLibraries/PartsFromNodes.js b/StrategySpace/Workspace/FunctionLibraries/PartsFromNodes.js index b151ae6f0..7fa8b9ec0 100644 --- a/StrategySpace/Workspace/FunctionLibraries/PartsFromNodes.js +++ b/StrategySpace/Workspace/FunctionLibraries/PartsFromNodes.js @@ -430,7 +430,8 @@ function newPartsFromNodes () { function addBotProcess (node) { let botProcess = { - name: 'New Bot Process' + name: 'New Bot Process', + code: '// Write the configuration here.' } node.botProcesses.push(botProcess) createPart('Bot Process', botProcess.name, botProcess, node, node, 'Bot Process') From 167dc50018472f8aa3b65de523c5e84862a39c58 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Fri, 6 Sep 2019 18:56:24 +0200 Subject: [PATCH 21/40] Bug Fixed with Params Objects --- FloatingSpace/StrategyPartConstructor.js | 122 +++++++++++++++--- .../FunctionLibraries/AttachDetach.js | 38 +++++- 2 files changed, 137 insertions(+), 23 deletions(-) diff --git a/FloatingSpace/StrategyPartConstructor.js b/FloatingSpace/StrategyPartConstructor.js index 6bfe4c870..a42efd5ef 100644 --- a/FloatingSpace/StrategyPartConstructor.js +++ b/FloatingSpace/StrategyPartConstructor.js @@ -329,7 +329,7 @@ function newStrategyPartConstructor () { rawRadius: 8, targetRadius: 0, currentRadius: 0, - angle: -20 + angle: -40 } ) menuItemsInitialValues.push( @@ -345,7 +345,21 @@ function newStrategyPartConstructor () { rawRadius: 8, targetRadius: 0, currentRadius: 0, - angle: +20 + angle: 0 + } + ) + menuItemsInitialValues.push( + { + action: 'Share', + actionFunction: payload.onMenuItemClick, + label: 'Share', + visible: false, + iconPathOn: 'menu-share', + iconPathOff: 'menu-share', + rawRadius: 8, + targetRadius: 0, + currentRadius: 0, + angle: 40 } ) break @@ -362,7 +376,7 @@ function newStrategyPartConstructor () { rawRadius: 8, targetRadius: 0, currentRadius: 0, - angle: -60 + angle: -70 } ) menuItemsInitialValues.push( @@ -375,7 +389,7 @@ function newStrategyPartConstructor () { rawRadius: 8, targetRadius: 0, currentRadius: 0, - angle: -20 + angle: -30 } ) menuItemsInitialValues.push( @@ -388,7 +402,7 @@ function newStrategyPartConstructor () { rawRadius: 8, targetRadius: 0, currentRadius: 0, - angle: 20 + angle: 0 } ) menuItemsInitialValues.push( @@ -397,16 +411,30 @@ function newStrategyPartConstructor () { askConfirmation: true, confirmationLabel: 'Confirm to Delete', actionFunction: payload.onMenuItemClick, - label: 'Delete Backend Process', + label: 'Delete Process', visible: false, iconPathOn: 'delete', iconPathOff: 'delete', rawRadius: 8, targetRadius: 0, currentRadius: 0, - angle: +60 + angle: +30 } ) + menuItemsInitialValues.push( + { + action: 'Share', + actionFunction: payload.onMenuItemClick, + label: 'Share', + visible: false, + iconPathOn: 'menu-share', + iconPathOff: 'menu-share', + rawRadius: 8, + targetRadius: 0, + currentRadius: 0, + angle: 70 + } + ) break } case 'Sensor': { @@ -421,7 +449,7 @@ function newStrategyPartConstructor () { rawRadius: 8, targetRadius: 0, currentRadius: 0, - angle: -20 + angle: -40 } ) menuItemsInitialValues.push( @@ -437,9 +465,23 @@ function newStrategyPartConstructor () { rawRadius: 8, targetRadius: 0, currentRadius: 0, - angle: +20 + angle: 0 } ) + menuItemsInitialValues.push( + { + action: 'Share', + actionFunction: payload.onMenuItemClick, + label: 'Share', + visible: false, + iconPathOn: 'menu-share', + iconPathOff: 'menu-share', + rawRadius: 8, + targetRadius: 0, + currentRadius: 0, + angle: 40 + } + ) break } case 'Indicator': { @@ -454,7 +496,7 @@ function newStrategyPartConstructor () { rawRadius: 8, targetRadius: 0, currentRadius: 0, - angle: -20 + angle: -40 } ) menuItemsInitialValues.push( @@ -470,7 +512,21 @@ function newStrategyPartConstructor () { rawRadius: 8, targetRadius: 0, currentRadius: 0, - angle: +20 + angle: 0 + } + ) + menuItemsInitialValues.push( + { + action: 'Share', + actionFunction: payload.onMenuItemClick, + label: 'Share', + visible: false, + iconPathOn: 'menu-share', + iconPathOff: 'menu-share', + rawRadius: 8, + targetRadius: 0, + currentRadius: 0, + angle: 40 } ) break @@ -487,7 +543,7 @@ function newStrategyPartConstructor () { rawRadius: 8, targetRadius: 0, currentRadius: 0, - angle: -20 + angle: -40 } ) menuItemsInitialValues.push( @@ -503,9 +559,23 @@ function newStrategyPartConstructor () { rawRadius: 8, targetRadius: 0, currentRadius: 0, - angle: +20 + angle: 0 } ) + menuItemsInitialValues.push( + { + action: 'Share', + actionFunction: payload.onMenuItemClick, + label: 'Share', + visible: false, + iconPathOn: 'menu-share', + iconPathOff: 'menu-share', + rawRadius: 8, + targetRadius: 0, + currentRadius: 0, + angle: 40 + } + ) break } case 'Bot Process': { @@ -526,7 +596,7 @@ function newStrategyPartConstructor () { rawRadius: 8, targetRadius: 0, currentRadius: 0, - angle: -20, + angle: -40, dontShowAtFullscreen: true } ) @@ -543,9 +613,23 @@ function newStrategyPartConstructor () { rawRadius: 8, targetRadius: 0, currentRadius: 0, - angle: +20 + angle: 0 } ) + menuItemsInitialValues.push( + { + action: 'Share', + actionFunction: payload.onMenuItemClick, + label: 'Share', + visible: false, + iconPathOn: 'menu-share', + iconPathOff: 'menu-share', + rawRadius: 8, + targetRadius: 0, + currentRadius: 0, + angle: 40 + } + ) break } case 'Personal Data': { @@ -2206,7 +2290,7 @@ function newStrategyPartConstructor () { floatingObject.fillStyle = 'rgba(' + UI_COLOR.WHITE + ', 1)' if (payload.node.savedPayload === undefined) { - floatingObject.tensionToggle() + // floatingObject.tensionToggle() } } @@ -2222,7 +2306,7 @@ function newStrategyPartConstructor () { floatingObject.fillStyle = 'rgba(' + UI_COLOR.GREEN + ', 1)' if (payload.node.savedPayload === undefined) { - floatingObject.tensionToggle() + // floatingObject.tensionToggle() } } @@ -2238,7 +2322,7 @@ function newStrategyPartConstructor () { floatingObject.fillStyle = 'rgba(' + UI_COLOR.RUSTED_RED + ', 1)' if (payload.node.savedPayload === undefined) { - floatingObject.tensionToggle() + // floatingObject.tensionToggle() } } @@ -2254,7 +2338,7 @@ function newStrategyPartConstructor () { floatingObject.fillStyle = 'rgba(' + UI_COLOR.TITANIUM_YELLOW + ', 1)' if (payload.node.savedPayload === undefined) { - floatingObject.tensionToggle() + // floatingObject.tensionToggle() } } diff --git a/StrategySpace/Workspace/FunctionLibraries/AttachDetach.js b/StrategySpace/Workspace/FunctionLibraries/AttachDetach.js index 837a66f3a..b8044b9ac 100644 --- a/StrategySpace/Workspace/FunctionLibraries/AttachDetach.js +++ b/StrategySpace/Workspace/FunctionLibraries/AttachDetach.js @@ -49,6 +49,36 @@ function newAttachDetach () { completeDetachment(node, rootNodes) return } + case 'Backend': { + node.payload.parentNode.backend = undefined + completeDetachment(node, rootNodes) + return + } + case 'Backend Process': { + node.payload.parentNode.backendProcess = undefined + completeDetachment(node, rootNodes) + return + } + case 'Sensor': { + node.payload.parentNode.sensor = undefined + completeDetachment(node, rootNodes) + return + } + case 'Indicator': { + node.payload.parentNode.indicator = undefined + completeDetachment(node, rootNodes) + return + } + case 'Trading Engine': { + node.payload.parentNode.tradingEngine = undefined + completeDetachment(node, rootNodes) + return + } + case 'Bot Process': { + node.payload.parentNode.botProcess = undefined + completeDetachment(node, rootNodes) + return + } case 'Trading System': { node.payload.parentNode.tradingSystem = undefined completeDetachment(node, rootNodes) @@ -59,18 +89,18 @@ function newAttachDetach () { completeDetachment(node, rootNodes) return } - case 'Time Period': { - node.payload.parentNode.baseAsset = undefined + case 'Time Range': { + node.payload.parentNode.timeRange = undefined completeDetachment(node, rootNodes) return } case 'Slippage': { - node.payload.parentNode.baseAsset = undefined + node.payload.parentNode.slippage = undefined completeDetachment(node, rootNodes) return } case 'Fee Structure': { - node.payload.parentNode.baseAsset = undefined + node.payload.parentNode.feeStructure = undefined completeDetachment(node, rootNodes) return } From 688bf286920f5abe67dc5db019ef7fdb2f02d612 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sat, 7 Sep 2019 14:14:03 +0200 Subject: [PATCH 22/40] creating and deleting BackEnd Processes working --- .../FunctionLibraries/PartsFromNodes.js | 40 +++++++++++++++++++ StrategySpace/Workspace/Workspace.js | 13 +++++- 2 files changed, 52 insertions(+), 1 deletion(-) diff --git a/StrategySpace/Workspace/FunctionLibraries/PartsFromNodes.js b/StrategySpace/Workspace/FunctionLibraries/PartsFromNodes.js index 7fa8b9ec0..cca5f6c4f 100644 --- a/StrategySpace/Workspace/FunctionLibraries/PartsFromNodes.js +++ b/StrategySpace/Workspace/FunctionLibraries/PartsFromNodes.js @@ -391,6 +391,8 @@ function newPartsFromNodes () { } createPart('Backend', '', node.backend, node, node) } + + return node.backend } function addBackendProcess (node) { @@ -399,6 +401,8 @@ function newPartsFromNodes () { } node.backendProcesses.push(backendProcess) createPart('Backend Process', backendProcess.name, backendProcess, node, node, 'Backend Process') + + return backendProcess } function addSensor (node) { @@ -408,6 +412,7 @@ function newPartsFromNodes () { } createPart('Sensor', '', node.bot, node, node) } + return node.bot } function addIndicator (node) { @@ -417,6 +422,7 @@ function newPartsFromNodes () { } createPart('Indicator', '', node.bot, node, node) } + return node.bot } function addTradingEngine (node) { @@ -426,6 +432,7 @@ function newPartsFromNodes () { } createPart('Trading Engine', '', node.bot, node, node) } + return node.bot } function addBotProcess (node) { @@ -435,6 +442,8 @@ function newPartsFromNodes () { } node.botProcesses.push(botProcess) createPart('Bot Process', botProcess.name, botProcess, node, node, 'Bot Process') + + return botProcess } function addTradingSystem (node) { @@ -444,6 +453,7 @@ function newPartsFromNodes () { } createPart('Trading System', '', node.tradingSystem, node, node) } + return node.tradingSystem } function addPersonalData (node) { @@ -453,6 +463,8 @@ function newPartsFromNodes () { } createPart('Personal Data', '', node.personalData, node, node) } + + return node.personalData } function addExchangeAccount (parentNode) { @@ -464,6 +476,8 @@ function newPartsFromNodes () { } personalData.exchangeAccounts.push(exchangeAccount) createPart('Exchange Account', exchangeAccount.name, exchangeAccount, personalData, personalData, 'Exchange Account') + + return exchangeAccount } function addExchangeAccountAsset (parentNode) { @@ -473,6 +487,8 @@ function newPartsFromNodes () { } exchangeAccount.assets.push(asset) createPart('Exchange Account Asset', asset.name, asset, exchangeAccount, exchangeAccount, 'Account Asset') + + return asset } function addExchangeAccountKey (parentNode) { @@ -483,6 +499,8 @@ function newPartsFromNodes () { } exchangeAccount.keys.push(key) createPart('Exchange Account Key', key.name, key, exchangeAccount, exchangeAccount, 'Account Key') + + return key } function addStrategy (parentNode) { @@ -547,6 +565,8 @@ function newPartsFromNodes () { createPart('Stop', 'Initial Stop', strategy.openStage.initialDefinition.stopLoss, strategy.openStage.initialDefinition, strategy.openStage.initialDefinition) createPart('Take Profit', 'Initial Take Profit', strategy.openStage.initialDefinition.takeProfit, strategy.openStage.initialDefinition, strategy.openStage.initialDefinition) createPart('Formula', '', strategy.triggerStage.positionSize.formula, strategy.triggerStage.positionSize, strategy.triggerStage.positionSize) + + return strategy } function addParameters (node) { @@ -557,6 +577,8 @@ function newPartsFromNodes () { createPart('Parameters', '', node.parameters, node, node) addMissingParameters(node.parameters) } + + return node.parameters } function addMissingParameters (node) { @@ -747,6 +769,8 @@ function newPartsFromNodes () { createPart('Position Rate', '', node.initialDefinition.positionRate, node.initialDefinition, node.initialDefinition) createPart('Formula', '', node.initialDefinition.positionRate.formula, node.initialDefinition.positionRate, node.initialDefinition.positionRate) } + + return node.initialDefinition } function addOpenExecution (node) { @@ -754,6 +778,8 @@ function newPartsFromNodes () { node.openExecution = {} createPart('Open Execution', '', node.openExecution, node, node) } + + return node.openExecution } function addCloseExecution (node) { @@ -761,6 +787,8 @@ function newPartsFromNodes () { node.closeExecution = {} createPart('Close Execution', '', node.closeExecution, node, node) } + + return node.closeExecution } function addFormula (node) { @@ -770,6 +798,8 @@ function newPartsFromNodes () { } createPart('Formula', '', node.formula, node, node) } + + return node.formula } function addNextPhaseEvent (node) { @@ -779,6 +809,8 @@ function newPartsFromNodes () { } createPart('Next Phase Event', '', node.nextPhaseEvent, node, node) } + + return node.nextPhaseEvent } function addCode (node) { @@ -788,6 +820,8 @@ function newPartsFromNodes () { } createPart('Code', '', node.code, node, node) } + + return node.code } function addPhase (parentNode) { @@ -822,6 +856,8 @@ function newPartsFromNodes () { createPart('Phase', phase.name, phase, phaseParent, phaseChainParent, 'Phase') createPart('Formula', '', phase.formula, phase, phase, 'Formula') createPart('Next Phase Event', '', phase.nextPhaseEvent, phase, phase) + + return phase } function addSituation (parentNode) { @@ -832,6 +868,8 @@ function newPartsFromNodes () { } parentNode.situations.push(situation) createPart('Situation', situation.name, situation, parentNode, parentNode, 'Situation') + + return situation } function addCondition (parentNode) { @@ -846,6 +884,8 @@ function newPartsFromNodes () { situation.conditions.push(condition) createPart('Condition', condition.name, condition, situation, situation, 'Condition') createPart('Code', '', condition.code, condition, condition, 'Code') + + return condition } function createPart (partType, name, node, parentNode, chainParent, title) { diff --git a/StrategySpace/Workspace/Workspace.js b/StrategySpace/Workspace/Workspace.js index 671ee31e1..f3777e838 100644 --- a/StrategySpace/Workspace/Workspace.js +++ b/StrategySpace/Workspace/Workspace.js @@ -216,7 +216,13 @@ function newWorkspace () { break case 'Add Backend Process': { - functionLibraryPartsFromNodes.addBackendProcess(payload.node) + let node = functionLibraryPartsFromNodes.addBackendProcess(payload.node) + + let event = { + backendProcessId: node.id, + definition: JSON.stringify(functionLibraryProtocolNode.getProtocolNode(node, false)) + } + systemEventHandler.raiseEvent('Backend Server', 'Backend Process Created', event) } break case 'Add Sensor': @@ -344,6 +350,11 @@ function newWorkspace () { break } case 'Delete Backend Process': { + let event = { + backendProcessId: payload.node.id + } + systemEventHandler.raiseEvent('Backend Server', 'Backend Process Deleted', event) + functionLibraryNodeDeleter.deleteBackendProcess(payload.node, workspaceNode.rootNodes) break } From b83418c772630fc85dec4a0af30c8957985628e3 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sat, 7 Sep 2019 21:20:55 +0200 Subject: [PATCH 23/40] Run and Stop of Backend Process implemented --- FloatingSpace/StrategyPartConstructor.js | 38 +++++++- .../FunctionLibraries/ProtocolNode.js | 95 ++++++++++--------- StrategySpace/Workspace/Workspace.js | 34 ++++--- 3 files changed, 104 insertions(+), 63 deletions(-) diff --git a/FloatingSpace/StrategyPartConstructor.js b/FloatingSpace/StrategyPartConstructor.js index a42efd5ef..3762c95b1 100644 --- a/FloatingSpace/StrategyPartConstructor.js +++ b/FloatingSpace/StrategyPartConstructor.js @@ -366,6 +366,34 @@ function newStrategyPartConstructor () { } case 'Backend Process': { addLeftIcons(menuItemsInitialValues, floatingObject) + menuItemsInitialValues.push( + { + action: 'Run Backend Process', + actionFunction: payload.onMenuItemClick, + label: 'Run', + visible: false, + iconPathOn: 'paper-plane', + iconPathOff: 'paper-plane', + rawRadius: 8, + targetRadius: 0, + currentRadius: 0, + angle: -75 + } + ) + menuItemsInitialValues.push( + { + action: 'Stop Backend Process', + actionFunction: payload.onMenuItemClick, + label: 'Stop', + visible: false, + iconPathOn: 'stop', + iconPathOff: 'stop', + rawRadius: 8, + targetRadius: 0, + currentRadius: 0, + angle: -40 + } + ) menuItemsInitialValues.push( { action: 'Add Sensor', @@ -376,7 +404,7 @@ function newStrategyPartConstructor () { rawRadius: 8, targetRadius: 0, currentRadius: 0, - angle: -70 + angle: -20 } ) menuItemsInitialValues.push( @@ -389,7 +417,7 @@ function newStrategyPartConstructor () { rawRadius: 8, targetRadius: 0, currentRadius: 0, - angle: -30 + angle: 0 } ) menuItemsInitialValues.push( @@ -402,7 +430,7 @@ function newStrategyPartConstructor () { rawRadius: 8, targetRadius: 0, currentRadius: 0, - angle: 0 + angle: 20 } ) menuItemsInitialValues.push( @@ -418,7 +446,7 @@ function newStrategyPartConstructor () { rawRadius: 8, targetRadius: 0, currentRadius: 0, - angle: +30 + angle: +40 } ) menuItemsInitialValues.push( @@ -432,7 +460,7 @@ function newStrategyPartConstructor () { rawRadius: 8, targetRadius: 0, currentRadius: 0, - angle: 70 + angle: 75 } ) break diff --git a/StrategySpace/Workspace/FunctionLibraries/ProtocolNode.js b/StrategySpace/Workspace/FunctionLibraries/ProtocolNode.js index b4eff0efe..c59945759 100644 --- a/StrategySpace/Workspace/FunctionLibraries/ProtocolNode.js +++ b/StrategySpace/Workspace/FunctionLibraries/ProtocolNode.js @@ -4,7 +4,7 @@ function newProtocolNode () { } return thisObject - function getProtocolNode (node, removePersonalData) { + function getProtocolNode (node, removePersonalData, parseJSONStrings) { if (node === undefined) { return } switch (node.type) { case 'Code': @@ -23,7 +23,7 @@ function newProtocolNode () { type: node.type, subType: node.subType, name: node.name, - code: getProtocolNode(node.code, removePersonalData) + code: getProtocolNode(node.code, removePersonalData, parseJSONStrings) } return condition } @@ -36,7 +36,7 @@ function newProtocolNode () { } for (let m = 0; m < node.conditions.length; m++) { - let condition = getProtocolNode(node.conditions[m], removePersonalData) + let condition = getProtocolNode(node.conditions[m], removePersonalData, parseJSONStrings) situation.conditions.push(condition) } return situation @@ -60,7 +60,7 @@ function newProtocolNode () { situations: [] } for (let m = 0; m < node.situations.length; m++) { - let situation = getProtocolNode(node.situations[m], removePersonalData) + let situation = getProtocolNode(node.situations[m], removePersonalData, parseJSONStrings) event.situations.push(situation) } return event @@ -70,8 +70,8 @@ function newProtocolNode () { type: node.type, subType: node.subType, name: node.name, - formula: getProtocolNode(node.formula, removePersonalData), - nextPhaseEvent: getProtocolNode(node.nextPhaseEvent, removePersonalData) + formula: getProtocolNode(node.formula, removePersonalData, parseJSONStrings), + nextPhaseEvent: getProtocolNode(node.nextPhaseEvent, removePersonalData, parseJSONStrings) } return phase } @@ -84,7 +84,7 @@ function newProtocolNode () { } for (let m = 0; m < node.phases.length; m++) { - let phase = getProtocolNode(node.phases[m], removePersonalData) + let phase = getProtocolNode(node.phases[m], removePersonalData, parseJSONStrings) stop.phases.push(phase) } return stop @@ -98,7 +98,7 @@ function newProtocolNode () { } for (let m = 0; m < node.phases.length; m++) { - let phase = getProtocolNode(node.phases[m], removePersonalData) + let phase = getProtocolNode(node.phases[m], removePersonalData, parseJSONStrings) takeProfit.phases.push(phase) } return takeProfit @@ -112,7 +112,7 @@ function newProtocolNode () { } for (let m = 0; m < node.situations.length; m++) { - let situation = getProtocolNode(node.situations[m], removePersonalData) + let situation = getProtocolNode(node.situations[m], removePersonalData, parseJSONStrings) event.situations.push(situation) } return event @@ -126,7 +126,7 @@ function newProtocolNode () { } for (let m = 0; m < node.situations.length; m++) { - let situation = getProtocolNode(node.situations[m], removePersonalData) + let situation = getProtocolNode(node.situations[m], removePersonalData, parseJSONStrings) event.situations.push(situation) } return event @@ -140,7 +140,7 @@ function newProtocolNode () { } for (let m = 0; m < node.situations.length; m++) { - let situation = getProtocolNode(node.situations[m], removePersonalData) + let situation = getProtocolNode(node.situations[m], removePersonalData, parseJSONStrings) event.situations.push(situation) } return event @@ -150,10 +150,10 @@ function newProtocolNode () { type: node.type, subType: node.subType, name: node.name, - stopLoss: getProtocolNode(node.stopLoss, removePersonalData), - takeProfit: getProtocolNode(node.takeProfit, removePersonalData), - positionSize: getProtocolNode(node.positionSize, removePersonalData), - positionRate: getProtocolNode(node.positionRate, removePersonalData) + stopLoss: getProtocolNode(node.stopLoss, removePersonalData, parseJSONStrings), + takeProfit: getProtocolNode(node.takeProfit, removePersonalData, parseJSONStrings), + positionSize: getProtocolNode(node.positionSize, removePersonalData, parseJSONStrings), + positionRate: getProtocolNode(node.positionRate, removePersonalData, parseJSONStrings) } return object } @@ -178,7 +178,7 @@ function newProtocolNode () { type: node.type, subType: node.subType, name: node.name, - formula: getProtocolNode(node.formula, removePersonalData) + formula: getProtocolNode(node.formula, removePersonalData, parseJSONStrings) } return object } @@ -187,7 +187,7 @@ function newProtocolNode () { type: node.type, subType: node.subType, name: node.name, - formula: getProtocolNode(node.formula, removePersonalData) + formula: getProtocolNode(node.formula, removePersonalData, parseJSONStrings) } return object } @@ -196,9 +196,9 @@ function newProtocolNode () { type: node.type, subType: node.subType, name: node.name, - triggerOn: getProtocolNode(node.triggerOn, removePersonalData), - triggerOff: getProtocolNode(node.triggerOff, removePersonalData), - takePosition: getProtocolNode(node.takePosition, removePersonalData) + triggerOn: getProtocolNode(node.triggerOn, removePersonalData, parseJSONStrings), + triggerOff: getProtocolNode(node.triggerOff, removePersonalData, parseJSONStrings), + takePosition: getProtocolNode(node.takePosition, removePersonalData, parseJSONStrings) } return stage } @@ -207,8 +207,8 @@ function newProtocolNode () { type: node.type, subType: node.subType, name: node.name, - initialDefinition: getProtocolNode(node.initialDefinition, removePersonalData), - openExecution: getProtocolNode(node.openExecution, removePersonalData) + initialDefinition: getProtocolNode(node.initialDefinition, removePersonalData, parseJSONStrings), + openExecution: getProtocolNode(node.openExecution, removePersonalData, parseJSONStrings) } return stage } @@ -217,8 +217,8 @@ function newProtocolNode () { type: node.type, subType: node.subType, name: node.name, - stopLoss: getProtocolNode(node.stopLoss, removePersonalData), - takeProfit: getProtocolNode(node.takeProfit, removePersonalData) + stopLoss: getProtocolNode(node.stopLoss, removePersonalData, parseJSONStrings), + takeProfit: getProtocolNode(node.takeProfit, removePersonalData, parseJSONStrings) } return stage } @@ -227,7 +227,7 @@ function newProtocolNode () { type: node.type, subType: node.subType, name: node.name, - closeExecution: getProtocolNode(node.closeExecution, removePersonalData) + closeExecution: getProtocolNode(node.closeExecution, removePersonalData, parseJSONStrings) } return stage } @@ -236,10 +236,10 @@ function newProtocolNode () { type: node.type, subType: node.subType, name: node.name, - triggerStage: getProtocolNode(node.triggerStage, removePersonalData), - openStage: getProtocolNode(node.openStage, removePersonalData), - manageStage: getProtocolNode(node.manageStage, removePersonalData), - closeStage: getProtocolNode(node.closeStage, removePersonalData) + triggerStage: getProtocolNode(node.triggerStage, removePersonalData, parseJSONStrings), + openStage: getProtocolNode(node.openStage, removePersonalData, parseJSONStrings), + manageStage: getProtocolNode(node.manageStage, removePersonalData, parseJSONStrings), + closeStage: getProtocolNode(node.closeStage, removePersonalData, parseJSONStrings) } return strategy } @@ -284,10 +284,10 @@ function newProtocolNode () { type: node.type, subType: node.subType, name: node.name, - baseAsset: getProtocolNode(node.baseAsset, removePersonalData), - timeRange: getProtocolNode(node.timeRange, removePersonalData), - slippage: getProtocolNode(node.slippage, removePersonalData), - feeStructure: getProtocolNode(node.feeStructure, removePersonalData) + baseAsset: getProtocolNode(node.baseAsset, removePersonalData, parseJSONStrings), + timeRange: getProtocolNode(node.timeRange, removePersonalData, parseJSONStrings), + slippage: getProtocolNode(node.slippage, removePersonalData, parseJSONStrings), + feeStructure: getProtocolNode(node.feeStructure, removePersonalData, parseJSONStrings) } return object } @@ -297,11 +297,11 @@ function newProtocolNode () { subType: node.subType, name: node.name, strategies: [], - parameters: getProtocolNode(node.parameters, removePersonalData) + parameters: getProtocolNode(node.parameters, removePersonalData, parseJSONStrings) } for (let m = 0; m < node.strategies.length; m++) { - let strategy = getProtocolNode(node.strategies[m], removePersonalData) + let strategy = getProtocolNode(node.strategies[m], removePersonalData, parseJSONStrings) tradingSystem.strategies.push(strategy) } return tradingSystem @@ -316,7 +316,7 @@ function newProtocolNode () { } for (let m = 0; m < node.exchangeAccounts.length; m++) { - let exchangeAccount = getProtocolNode(node.exchangeAccounts[m], removePersonalData) + let exchangeAccount = getProtocolNode(node.exchangeAccounts[m], removePersonalData, parseJSONStrings) personalData.exchangeAccounts.push(exchangeAccount) } return personalData @@ -332,11 +332,11 @@ function newProtocolNode () { } for (let m = 0; m < node.assets.length; m++) { - let asset = getProtocolNode(node.assets[m], removePersonalData) + let asset = getProtocolNode(node.assets[m], removePersonalData, parseJSONStrings) exchangeAccount.assets.push(asset) } for (let m = 0; m < node.keys.length; m++) { - let key = getProtocolNode(node.keys[m], removePersonalData) + let key = getProtocolNode(node.keys[m], removePersonalData, parseJSONStrings) exchangeAccount.keys.push(key) } return exchangeAccount @@ -369,7 +369,7 @@ function newProtocolNode () { } for (let m = 0; m < node.backendProcesses.length; m++) { - let backendProcess = getProtocolNode(node.backendProcesses[m], removePersonalData) + let backendProcess = getProtocolNode(node.backendProcesses[m], removePersonalData, parseJSONStrings) backend.backendProcesses.push(backendProcess) } return backend @@ -379,7 +379,7 @@ function newProtocolNode () { type: node.type, subType: node.subType, name: node.name, - bot: getProtocolNode(node.bot, removePersonalData) + bot: getProtocolNode(node.bot, removePersonalData, parseJSONStrings) } return object } @@ -392,7 +392,7 @@ function newProtocolNode () { } for (let m = 0; m < node.botProcesses.length; m++) { - let botProcess = getProtocolNode(node.botProcesses[m], removePersonalData) + let botProcess = getProtocolNode(node.botProcesses[m], removePersonalData, parseJSONStrings) bot.botProcesses.push(botProcess) } return bot @@ -406,7 +406,7 @@ function newProtocolNode () { } for (let m = 0; m < node.botProcesses.length; m++) { - let botProcess = getProtocolNode(node.botProcesses[m], removePersonalData) + let botProcess = getProtocolNode(node.botProcesses[m], removePersonalData, parseJSONStrings) bot.botProcesses.push(botProcess) } return bot @@ -420,7 +420,7 @@ function newProtocolNode () { } for (let m = 0; m < node.botProcesses.length; m++) { - let botProcess = getProtocolNode(node.botProcesses[m], removePersonalData) + let botProcess = getProtocolNode(node.botProcesses[m], removePersonalData, parseJSONStrings) bot.botProcesses.push(botProcess) } return bot @@ -432,6 +432,9 @@ function newProtocolNode () { name: node.name, code: node.code } + if (parseJSONStrings) { + object.code = JSON.parse(object.code) + } return object } case 'Definition': { @@ -439,9 +442,9 @@ function newProtocolNode () { type: node.type, subType: node.subType, name: node.name, - tradingSystem: getProtocolNode(node.tradingSystem, removePersonalData), - personalData: getProtocolNode(node.personalData, removePersonalData), - backend: getProtocolNode(node.backend, removePersonalData) + tradingSystem: getProtocolNode(node.tradingSystem, removePersonalData, parseJSONStrings), + personalData: getProtocolNode(node.personalData, removePersonalData, parseJSONStrings), + backend: getProtocolNode(node.backend, removePersonalData, parseJSONStrings) } return object } diff --git a/StrategySpace/Workspace/Workspace.js b/StrategySpace/Workspace/Workspace.js index f3777e838..565f14752 100644 --- a/StrategySpace/Workspace/Workspace.js +++ b/StrategySpace/Workspace/Workspace.js @@ -208,6 +208,27 @@ function newWorkspace () { download(fileName, text) } + break + case 'Run Backend Process': + { + /* Check if it is possible to Run or not */ + if (payload.node.bot === undefined) { return } + if (payload.node.bot.botProcesses.length === 0) { return } + + let event = { + backendProcessId: payload.node.id, + definition: JSON.stringify(functionLibraryProtocolNode.getProtocolNode(payload.node, false, true)) // <- We need to do this workaround in order no to send unescaped charactars to the backend. + } + systemEventHandler.raiseEvent('Backend Server', 'Run Backend Process', event) + } + break + case 'Stop Backend Process': + { + let event = { + backendProcessId: payload.node.id + } + systemEventHandler.raiseEvent('Backend Server', 'Stop Backend Process', event) + } break case 'Add Backend': { @@ -216,13 +237,7 @@ function newWorkspace () { break case 'Add Backend Process': { - let node = functionLibraryPartsFromNodes.addBackendProcess(payload.node) - - let event = { - backendProcessId: node.id, - definition: JSON.stringify(functionLibraryProtocolNode.getProtocolNode(node, false)) - } - systemEventHandler.raiseEvent('Backend Server', 'Backend Process Created', event) + functionLibraryPartsFromNodes.addBackendProcess(payload.node) } break case 'Add Sensor': @@ -350,11 +365,6 @@ function newWorkspace () { break } case 'Delete Backend Process': { - let event = { - backendProcessId: payload.node.id - } - systemEventHandler.raiseEvent('Backend Server', 'Backend Process Deleted', event) - functionLibraryNodeDeleter.deleteBackendProcess(payload.node, workspaceNode.rootNodes) break } From fb31f1f2557a834e06f4f32cf98a44ef5174e9ac Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sun, 8 Sep 2019 00:19:34 +0200 Subject: [PATCH 24/40] Circular Running Status Implemented and working --- FloatingSpace/CircularRunningStatus.js | 109 +++++++++++++++++++++++ FloatingSpace/StrategyPart.js | 52 +++++------ FloatingSpace/StrategyPartConstructor.js | 2 +- StrategySpace/Workspace/Workspace.js | 4 + 4 files changed, 141 insertions(+), 26 deletions(-) create mode 100644 FloatingSpace/CircularRunningStatus.js diff --git a/FloatingSpace/CircularRunningStatus.js b/FloatingSpace/CircularRunningStatus.js new file mode 100644 index 000000000..a6fbcc8e3 --- /dev/null +++ b/FloatingSpace/CircularRunningStatus.js @@ -0,0 +1,109 @@ + +function newCircularRunningStatus () { + const MODULE_NAME = 'Circular Running Status' + + let thisObject = { + container: undefined, + isDeployed: undefined, + physics: physics, + drawBackground: drawBackground, + drawForeground: drawForeground, + getContainer: getContainer, + finalize: finalize, + initialize: initialize + } + + thisObject.container = newContainer() + thisObject.container.initialize(MODULE_NAME, 'Circle') + thisObject.container.isClickeable = false + thisObject.container.isDraggeable = false + thisObject.container.frame.radius = 0 + thisObject.container.frame.position.x = 0 + thisObject.container.frame.position.y = 0 + + let opacityCounters = [] + + return thisObject + + function finalize () { + thisObject.container.finalize() + thisObject.container = undefined + + thisObject.payload = undefined + thisObject.fitFunction = undefined + } + + function initialize (payload) { + thisObject.payload = payload + + for (let i = 0; i < 60; i++) { + opacityCounters.push(0) + } + + let key = thisObject.payload.node.name + '-' + thisObject.payload.node.type + systemEventHandler.createEventHandler(key) + systemEventHandler.listenToEvent(key, 'Heartbeat', undefined, key, undefined, onHeartBeat) + } + + function onHeartBeat (message) { + opacityCounters[message.event.seconds] = 2000 + } + + function getContainer (point) { + let container + + for (let i = 0; i < menuItems.length; i++) { + let menutItem = menuItems[i] + container = menutItem.getContainer(point) + if (container !== undefined) { return container } + } + } + + function physics () { + for (let i = 0; i < 60; i++) { + opacityCounters[i]-- + + if (opacityCounters[i] < 0) { + opacityCounters[i] = 0 + } + } + } + + function drawBackground (pFloatingObject) { + const VISIBLE_RADIUS = thisObject.container.frame.radius * 2 + + let visiblePosition = { + x: thisObject.container.frame.position.x, + y: thisObject.container.frame.position.y + } + + visiblePosition = thisObject.container.frame.frameThisPoint(visiblePosition) + visiblePosition = thisObject.fitFunction(visiblePosition) + + for (let i = 0; i < 60; i++) { + let OPACITY = opacityCounters[i] / 1000 + + let initialAngle = Math.PI * 2 / 60 * i - Math.PI / 2 + let finalAngle = Math.PI * 2 / 60 * (i + 1) - Math.PI / 2 + + browserCanvasContext.beginPath() + browserCanvasContext.arc(visiblePosition.x, visiblePosition.y, VISIBLE_RADIUS, initialAngle, finalAngle, false) + browserCanvasContext.closePath() + + browserCanvasContext.strokeStyle = 'rgba(' + UI_COLOR.GOLDEN_ORANGE + ', ' + OPACITY * 2 + ')' + browserCanvasContext.lineWidth = 6 + opacityCounters[i] / 100 + browserCanvasContext.setLineDash([3, 4]) + browserCanvasContext.stroke() + + browserCanvasContext.strokeStyle = 'rgba(' + UI_COLOR.DARK_TURQUOISE + ', ' + OPACITY + ')' + browserCanvasContext.lineWidth = 0 + opacityCounters[i] / 100 + browserCanvasContext.setLineDash([3, 4]) + browserCanvasContext.stroke() + } + } + + function drawForeground (pFloatingObject) { + + } +} + diff --git a/FloatingSpace/StrategyPart.js b/FloatingSpace/StrategyPart.js index 58455534e..bc3eb8b8e 100644 --- a/FloatingSpace/StrategyPart.js +++ b/FloatingSpace/StrategyPart.js @@ -16,9 +16,12 @@ function newStrategyPart () { payload: undefined, codeEditor: undefined, partTitle: undefined, + runningStatus: undefined, isExecuting: undefined, isRunning: undefined, run: run, + runX: runX, + stop: stop, setRunningStatus: setRunningStatus, setNotRunningStatus: setNotRunningStatus, getReadyToAttach: getReadyToAttach, @@ -175,8 +178,11 @@ function newStrategyPart () { thisObject.payload.targetPosition.y = thisObject.payload.chainParent.payload.position.y } + if (thisObject.runningStatus !== undefined) { + thisObject.runningStatus.physics() + } + iconPhysics() - runningPhisycs() highlightPhisycs() errorMessagePhisycs() valuePhisycs() @@ -525,17 +531,20 @@ function newStrategyPart () { } } - function runningPhisycs () { - if (canvas.strategySpace.workspace.definition !== undefined) { - if (canvas.strategySpace.workspace.definition.id !== thisObject.payload.node.id) { - runningCounter-- - } + function runX () { + if (thisObject.runningStatus !== undefined) { + thisObject.runningStatus.finalize() } - if (runningCounter < 0) { - runningCounter = 0 - thisObject.isRunning = false - } + thisObject.runningStatus = newCircularRunningStatus() + thisObject.runningStatus.initialize(thisObject.payload) + thisObject.runningStatus.fitFunction = thisObject.fitFunction + thisObject.runningStatus.container = thisObject.container + } + + function stop () { + thisObject.runningStatus.finalize() + thisObject.runningStatus = undefined } function run () { @@ -604,6 +613,10 @@ function newStrategyPart () { thisObject.menu.drawBackground() } } + + if (thisObject.runningStatus !== undefined) { + thisObject.runningStatus.drawBackground() + } } function drawMiddleground () { @@ -621,6 +634,10 @@ function newStrategyPart () { thisObject.menu.drawForeground() } } + + if (thisObject.runningStatus !== undefined) { + thisObject.runningStatus.drawForeground() + } } function drawOnFocus () { @@ -931,21 +948,6 @@ function newStrategyPart () { browserCanvasContext.fill() } - if (thisObject.isRunning === true) { - VISIBLE_RADIUS = thisObject.container.frame.radius * 2 - let OPACITY = runningCounter / 30 - - browserCanvasContext.beginPath() - browserCanvasContext.arc(visiblePosition.x, visiblePosition.y, VISIBLE_RADIUS, 0, Math.PI * 2, true) - browserCanvasContext.closePath() - - browserCanvasContext.strokeStyle = 'rgba(' + UI_COLOR.LIGHT_GREY + ', ' + OPACITY + ')' - - browserCanvasContext.lineWidth = 10 - browserCanvasContext.setLineDash([4, 20]) - browserCanvasContext.stroke() - } - if (hasError === true) { VISIBLE_RADIUS = thisObject.container.frame.radius * 1 let OPACITY = errorMessageCounter / 30 diff --git a/FloatingSpace/StrategyPartConstructor.js b/FloatingSpace/StrategyPartConstructor.js index 3762c95b1..33eb83dac 100644 --- a/FloatingSpace/StrategyPartConstructor.js +++ b/FloatingSpace/StrategyPartConstructor.js @@ -2145,7 +2145,7 @@ function newStrategyPartConstructor () { break } case 'Backend Process': { - level_2() + level_1() break } case 'Sensor': { diff --git a/StrategySpace/Workspace/Workspace.js b/StrategySpace/Workspace/Workspace.js index 565f14752..70e7bf47b 100644 --- a/StrategySpace/Workspace/Workspace.js +++ b/StrategySpace/Workspace/Workspace.js @@ -215,6 +215,8 @@ function newWorkspace () { if (payload.node.bot === undefined) { return } if (payload.node.bot.botProcesses.length === 0) { return } + payload.uiObject.runX() + let event = { backendProcessId: payload.node.id, definition: JSON.stringify(functionLibraryProtocolNode.getProtocolNode(payload.node, false, true)) // <- We need to do this workaround in order no to send unescaped charactars to the backend. @@ -228,6 +230,8 @@ function newWorkspace () { backendProcessId: payload.node.id } systemEventHandler.raiseEvent('Backend Server', 'Stop Backend Process', event) + + payload.uiObject.stop() } break case 'Add Backend': From 905d9f637904a7eae884e644097f34bc945dc49d Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sun, 8 Sep 2019 00:28:22 +0200 Subject: [PATCH 25/40] Bug Fixed with finalizing container --- FloatingSpace/CircularRunningStatus.js | 1 - FloatingSpace/StrategyPart.js | 7 +++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/FloatingSpace/CircularRunningStatus.js b/FloatingSpace/CircularRunningStatus.js index a6fbcc8e3..9248ce44f 100644 --- a/FloatingSpace/CircularRunningStatus.js +++ b/FloatingSpace/CircularRunningStatus.js @@ -26,7 +26,6 @@ function newCircularRunningStatus () { return thisObject function finalize () { - thisObject.container.finalize() thisObject.container = undefined thisObject.payload = undefined diff --git a/FloatingSpace/StrategyPart.js b/FloatingSpace/StrategyPart.js index bc3eb8b8e..3bea77328 100644 --- a/FloatingSpace/StrategyPart.js +++ b/FloatingSpace/StrategyPart.js @@ -543,8 +543,11 @@ function newStrategyPart () { } function stop () { - thisObject.runningStatus.finalize() - thisObject.runningStatus = undefined + setTimeout(removeRunningStatus, 30000) + function removeRunningStatus () { + thisObject.runningStatus.finalize() + thisObject.runningStatus = undefined + } } function run () { From 34ed860bf273e3f61196dd76419b9b35f51c9c51 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sun, 8 Sep 2019 09:57:11 +0200 Subject: [PATCH 26/40] Refactored to PLAY --- .../{CircularRunningStatus.js => CircularProgressBar.js} | 5 ++--- FloatingSpace/StrategyPart.js | 6 +++--- StrategySpace/Workspace/Workspace.js | 2 +- 3 files changed, 6 insertions(+), 7 deletions(-) rename FloatingSpace/{CircularRunningStatus.js => CircularProgressBar.js} (97%) diff --git a/FloatingSpace/CircularRunningStatus.js b/FloatingSpace/CircularProgressBar.js similarity index 97% rename from FloatingSpace/CircularRunningStatus.js rename to FloatingSpace/CircularProgressBar.js index 9248ce44f..dfe160b70 100644 --- a/FloatingSpace/CircularRunningStatus.js +++ b/FloatingSpace/CircularProgressBar.js @@ -1,6 +1,6 @@ -function newCircularRunningStatus () { - const MODULE_NAME = 'Circular Running Status' +function newCircularProgressBar () { + const MODULE_NAME = 'Circular Progress Bar' let thisObject = { container: undefined, @@ -105,4 +105,3 @@ function newCircularRunningStatus () { } } - diff --git a/FloatingSpace/StrategyPart.js b/FloatingSpace/StrategyPart.js index 3bea77328..b63fac1de 100644 --- a/FloatingSpace/StrategyPart.js +++ b/FloatingSpace/StrategyPart.js @@ -20,7 +20,7 @@ function newStrategyPart () { isExecuting: undefined, isRunning: undefined, run: run, - runX: runX, + play: play, stop: stop, setRunningStatus: setRunningStatus, setNotRunningStatus: setNotRunningStatus, @@ -531,12 +531,12 @@ function newStrategyPart () { } } - function runX () { + function play () { if (thisObject.runningStatus !== undefined) { thisObject.runningStatus.finalize() } - thisObject.runningStatus = newCircularRunningStatus() + thisObject.runningStatus = newCircularProgressBar() thisObject.runningStatus.initialize(thisObject.payload) thisObject.runningStatus.fitFunction = thisObject.fitFunction thisObject.runningStatus.container = thisObject.container diff --git a/StrategySpace/Workspace/Workspace.js b/StrategySpace/Workspace/Workspace.js index 70e7bf47b..5b6367f3f 100644 --- a/StrategySpace/Workspace/Workspace.js +++ b/StrategySpace/Workspace/Workspace.js @@ -215,7 +215,7 @@ function newWorkspace () { if (payload.node.bot === undefined) { return } if (payload.node.bot.botProcesses.length === 0) { return } - payload.uiObject.runX() + payload.uiObject.play() let event = { backendProcessId: payload.node.id, From d17627c29a32db8983d6664b31e42172a0b05041 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sun, 8 Sep 2019 11:01:46 +0200 Subject: [PATCH 27/40] progress bar at processes --- StrategySpace/Workspace/Workspace.js | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/StrategySpace/Workspace/Workspace.js b/StrategySpace/Workspace/Workspace.js index 5b6367f3f..f2f060915 100644 --- a/StrategySpace/Workspace/Workspace.js +++ b/StrategySpace/Workspace/Workspace.js @@ -215,6 +215,11 @@ function newWorkspace () { if (payload.node.bot === undefined) { return } if (payload.node.bot.botProcesses.length === 0) { return } + for (let i = 0; i < payload.node.bot.botProcesses.length; i++) { + let botProcess = payload.node.bot.botProcesses[i] + botProcess.payload.uiObject.play() + } + payload.uiObject.play() let event = { @@ -232,6 +237,14 @@ function newWorkspace () { systemEventHandler.raiseEvent('Backend Server', 'Stop Backend Process', event) payload.uiObject.stop() + + if (payload.node.bot === undefined) { return } + if (payload.node.bot.botProcesses.length === 0) { return } + + for (let i = 0; i < payload.node.bot.botProcesses.length; i++) { + let botProcess = payload.node.bot.botProcesses[i] + botProcess.payload.uiObject.stop() + } } break case 'Add Backend': From 2f7461c58fb0857ca4f48b2f336aba15cb1248ad Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sun, 8 Sep 2019 11:28:39 +0200 Subject: [PATCH 28/40] Refactoring for Tasks --- FloatingSpace/StrategyPart.js | 10 +++---- FloatingSpace/StrategyPartConstructor.js | 14 +++++----- FloatingSpace/StrategyPartTitle.js | 2 +- Spaces/StrategySpace.js | 2 +- .../FunctionLibraries/AttachDetach.js | 8 +++--- .../FunctionLibraries/NodeChildren.js | 10 +++---- .../FunctionLibraries/NodeDeleter.js | 24 ++++++++--------- .../FunctionLibraries/PartsFromNodes.js | 26 +++++++++---------- .../FunctionLibraries/ProtocolNode.js | 10 +++---- .../FunctionLibraries/StringifyNode.js | 10 +++---- StrategySpace/Workspace/Workspace.js | 20 +++++++------- 11 files changed, 68 insertions(+), 68 deletions(-) diff --git a/FloatingSpace/StrategyPart.js b/FloatingSpace/StrategyPart.js index b63fac1de..f617351e9 100644 --- a/FloatingSpace/StrategyPart.js +++ b/FloatingSpace/StrategyPart.js @@ -246,20 +246,20 @@ function newStrategyPart () { compatibleType = '->' + 'Definition' compatibleSubType = undefined break - case 'Backend Process': + case 'Task': compatibleType = '->' + 'Backend' compatibleSubType = undefined break case 'Sensor': - compatibleType = '->' + 'Backend Process' + compatibleType = '->' + 'Task' compatibleSubType = undefined break case 'Indicator': - compatibleType = '->' + 'Backend Process' + compatibleType = '->' + 'Task' compatibleSubType = undefined break case 'Trading Engine': - compatibleType = '->' + 'Backend Process' + compatibleType = '->' + 'Task' compatibleSubType = undefined break case 'Bot Process': @@ -365,7 +365,7 @@ function newStrategyPart () { if (compatibleType.indexOf('->' + nearbyNode.type) >= 0) { /* Discard objects with busy coonection ports */ if (thisObject.payload.node.type === 'Backend' && nearbyNode.backend !== undefined) { continue } - if (thisObject.payload.node.type === 'Backend Process' && nearbyNode.backendProcess !== undefined) { continue } + if (thisObject.payload.node.type === 'Task' && nearbyNode.task !== undefined) { continue } if (thisObject.payload.node.type === 'Sensor' && nearbyNode.bot !== undefined) { continue } if (thisObject.payload.node.type === 'Indicator' && nearbyNode.bot !== undefined) { continue } if (thisObject.payload.node.type === 'Trading Engine' && nearbyNode.bot !== undefined) { continue } diff --git a/FloatingSpace/StrategyPartConstructor.js b/FloatingSpace/StrategyPartConstructor.js index 33eb83dac..28e55edd5 100644 --- a/FloatingSpace/StrategyPartConstructor.js +++ b/FloatingSpace/StrategyPartConstructor.js @@ -321,9 +321,9 @@ function newStrategyPartConstructor () { addLeftIcons(menuItemsInitialValues, floatingObject) menuItemsInitialValues.push( { - action: 'Add Backend Process', + action: 'Add Task', actionFunction: payload.onMenuItemClick, - label: 'Add Backend Process', + label: 'Add Task', visible: false, relatedStrategyPart: 'Backend', rawRadius: 8, @@ -364,11 +364,11 @@ function newStrategyPartConstructor () { ) break } - case 'Backend Process': { + case 'Task': { addLeftIcons(menuItemsInitialValues, floatingObject) menuItemsInitialValues.push( { - action: 'Run Backend Process', + action: 'Run Task', actionFunction: payload.onMenuItemClick, label: 'Run', visible: false, @@ -382,7 +382,7 @@ function newStrategyPartConstructor () { ) menuItemsInitialValues.push( { - action: 'Stop Backend Process', + action: 'Stop Task', actionFunction: payload.onMenuItemClick, label: 'Stop', visible: false, @@ -435,7 +435,7 @@ function newStrategyPartConstructor () { ) menuItemsInitialValues.push( { - action: 'Delete Backend Process', + action: 'Delete Task', askConfirmation: true, confirmationLabel: 'Confirm to Delete', actionFunction: payload.onMenuItemClick, @@ -2144,7 +2144,7 @@ function newStrategyPartConstructor () { level_1() break } - case 'Backend Process': { + case 'Task': { level_1() break } diff --git a/FloatingSpace/StrategyPartTitle.js b/FloatingSpace/StrategyPartTitle.js index 9d8659d8e..6baf88262 100644 --- a/FloatingSpace/StrategyPartTitle.js +++ b/FloatingSpace/StrategyPartTitle.js @@ -55,7 +55,7 @@ function newStrategyPartTitle () { case 'Backend': { break } - case 'Backend Process': { + case 'Task': { break } case 'Sensor': { diff --git a/Spaces/StrategySpace.js b/Spaces/StrategySpace.js index d74768e8b..42104cc9e 100644 --- a/Spaces/StrategySpace.js +++ b/Spaces/StrategySpace.js @@ -41,7 +41,7 @@ function newStrategySpace () { const relationshipArray = [ ['Definition', 'text'], ['Backend', 'task'], - ['Backend Process', 'timeline'], + ['Task', 'timeline'], ['Sensor', 'pipette'], ['Indicator', 'vector'], ['Trading Engine', 'brainstorming'], diff --git a/StrategySpace/Workspace/FunctionLibraries/AttachDetach.js b/StrategySpace/Workspace/FunctionLibraries/AttachDetach.js index b8044b9ac..3abe7c8c9 100644 --- a/StrategySpace/Workspace/FunctionLibraries/AttachDetach.js +++ b/StrategySpace/Workspace/FunctionLibraries/AttachDetach.js @@ -54,8 +54,8 @@ function newAttachDetach () { completeDetachment(node, rootNodes) return } - case 'Backend Process': { - node.payload.parentNode.backendProcess = undefined + case 'Task': { + node.payload.parentNode.task = undefined completeDetachment(node, rootNodes) return } @@ -255,10 +255,10 @@ function newAttachDetach () { completeAttachment(node, rootNodes) } break - case 'Backend Process': { + case 'Task': { node.payload.parentNode = attachToNode node.payload.chainParent = attachToNode - node.payload.parentNode.backendProcesses.push(node) + node.payload.parentNode.tasks.push(node) completeAttachment(node, rootNodes) } break diff --git a/StrategySpace/Workspace/FunctionLibraries/NodeChildren.js b/StrategySpace/Workspace/FunctionLibraries/NodeChildren.js index 409d285d4..00c84350b 100644 --- a/StrategySpace/Workspace/FunctionLibraries/NodeChildren.js +++ b/StrategySpace/Workspace/FunctionLibraries/NodeChildren.js @@ -14,8 +14,8 @@ function newNodeChildren () { case 'Backend': { return countChildrenBackend(parentNode, childNode) } - case 'Backend Process': { - return countChildrenBackendProcess(parentNode, childNode) + case 'Task': { + return countChildrenTask(parentNode, childNode) } case 'Sensor': { return countChildrenSensor(parentNode, childNode) @@ -160,8 +160,8 @@ function newNodeChildren () { childIndex: undefined } - for (let i = 0; i < parentNode.backendProcesses.length; i++) { - let child = parentNode.backendProcesses[i] + for (let i = 0; i < parentNode.tasks.length; i++) { + let child = parentNode.tasks[i] response.childrenCount++ if (child.id === childNode.id) { response.childIndex = response.childrenCount @@ -170,7 +170,7 @@ function newNodeChildren () { return response } - function countChildrenBackendProcess (parentNode, childNode) { + function countChildrenTask (parentNode, childNode) { let response = { childrenCount: 0, childIndex: undefined diff --git a/StrategySpace/Workspace/FunctionLibraries/NodeDeleter.js b/StrategySpace/Workspace/FunctionLibraries/NodeDeleter.js index d35c1f3dc..7d4522b8d 100644 --- a/StrategySpace/Workspace/FunctionLibraries/NodeDeleter.js +++ b/StrategySpace/Workspace/FunctionLibraries/NodeDeleter.js @@ -2,7 +2,7 @@ function newNodeDeleter () { thisObject = { deleteDefinition: deleteDefinition, deleteBackend: deleteBackend, - deleteBackendProcess: deleteBackendProcess, + deleteTask: deleteTask, deleteSensor: deleteBot, deleteIndicator: deleteBot, deleteTradingEngine: deleteBot, @@ -56,8 +56,8 @@ function newNodeDeleter () { deleteBackend(rootNode, rootNodes) break } - case 'Backend Process': { - deleteBackendProcess(rootNode, rootNodes) + case 'Task': { + deleteTask(rootNode, rootNodes) break } case 'Sensor': { @@ -234,21 +234,21 @@ function newNodeDeleter () { if (payload.parentNode !== undefined) { payload.parentNode.backend = undefined } - while (node.backendProcesses.length > 0) { - deleteBackendProcess(node.backendProcesses[0], rootNodes) + while (node.tasks.length > 0) { + deleteTask(node.tasks[0], rootNodes) } completeDeletion(node, rootNodes) destroyPart(node) cleanNode(node) } - function deleteBackendProcess (node, rootNodes) { + function deleteTask (node, rootNodes) { let payload = node.payload if (payload.parentNode !== undefined) { - for (let j = 0; j < payload.parentNode.backendProcesses.length; j++) { - let backendProcess = payload.parentNode.backendProcesses[j] - if (backendProcess.id === node.id) { - payload.parentNode.backendProcesses.splice(j, 1) + for (let j = 0; j < payload.parentNode.tasks.length; j++) { + let task = payload.parentNode.tasks[j] + if (task.id === node.id) { + payload.parentNode.tasks.splice(j, 1) } } } @@ -277,8 +277,8 @@ function newNodeDeleter () { let payload = node.payload if (payload.parentNode !== undefined) { for (let j = 0; j < payload.parentNode.botProcesses.length; j++) { - let backendProcess = payload.parentNode.botProcesses[j] - if (backendProcess.id === node.id) { + let task = payload.parentNode.botProcesses[j] + if (task.id === node.id) { payload.parentNode.botProcesses.splice(j, 1) } } diff --git a/StrategySpace/Workspace/FunctionLibraries/PartsFromNodes.js b/StrategySpace/Workspace/FunctionLibraries/PartsFromNodes.js index cca5f6c4f..045e8e019 100644 --- a/StrategySpace/Workspace/FunctionLibraries/PartsFromNodes.js +++ b/StrategySpace/Workspace/FunctionLibraries/PartsFromNodes.js @@ -2,7 +2,7 @@ function newPartsFromNodes () { thisObject = { createPartFromNode: createPartFromNode, addBackend: addBackend, - addBackendProcess: addBackendProcess, + addTask: addTask, addSensor: addSensor, addIndicator: addIndicator, addTradingEngine: addTradingEngine, @@ -340,14 +340,14 @@ function newPartsFromNodes () { } case 'Backend': { createPart('Backend', node.name, node, parentNode, chainParent, 'Backend') - for (let m = 0; m < node.backendProcesses.length; m++) { - let backendProcess = node.backendProcesses[m] - createPartFromNode(backendProcess, node, node) + for (let m = 0; m < node.tasks.length; m++) { + let task = node.tasks[m] + createPartFromNode(task, node, node) } return } - case 'Backend Process': { - createPart('Backend Process', node.name, node, parentNode, chainParent, 'Backend Process') + case 'Task': { + createPart('Task', node.name, node, parentNode, chainParent, 'Task') if (node.bot !== undefined) { createPartFromNode(node.bot, node, node) } @@ -387,7 +387,7 @@ function newPartsFromNodes () { function addBackend (node) { if (node.backend === undefined) { node.backend = { - backendProcesses: [] + tasks: [] } createPart('Backend', '', node.backend, node, node) } @@ -395,14 +395,14 @@ function newPartsFromNodes () { return node.backend } - function addBackendProcess (node) { - let backendProcess = { - name: 'New Backend Process' + function addTask (node) { + let task = { + name: 'New Task' } - node.backendProcesses.push(backendProcess) - createPart('Backend Process', backendProcess.name, backendProcess, node, node, 'Backend Process') + node.tasks.push(task) + createPart('Task', task.name, task, node, node, 'Task') - return backendProcess + return task } function addSensor (node) { diff --git a/StrategySpace/Workspace/FunctionLibraries/ProtocolNode.js b/StrategySpace/Workspace/FunctionLibraries/ProtocolNode.js index c59945759..b068ed227 100644 --- a/StrategySpace/Workspace/FunctionLibraries/ProtocolNode.js +++ b/StrategySpace/Workspace/FunctionLibraries/ProtocolNode.js @@ -365,16 +365,16 @@ function newProtocolNode () { type: node.type, subType: node.subType, name: node.name, - backendProcesses: [] + tasks: [] } - for (let m = 0; m < node.backendProcesses.length; m++) { - let backendProcess = getProtocolNode(node.backendProcesses[m], removePersonalData, parseJSONStrings) - backend.backendProcesses.push(backendProcess) + for (let m = 0; m < node.tasks.length; m++) { + let task = getProtocolNode(node.tasks[m], removePersonalData, parseJSONStrings) + backend.tasks.push(task) } return backend } - case 'Backend Process': { + case 'Task': { let object = { type: node.type, subType: node.subType, diff --git a/StrategySpace/Workspace/FunctionLibraries/StringifyNode.js b/StrategySpace/Workspace/FunctionLibraries/StringifyNode.js index ba8ff4d88..b9dec729b 100644 --- a/StrategySpace/Workspace/FunctionLibraries/StringifyNode.js +++ b/StrategySpace/Workspace/FunctionLibraries/StringifyNode.js @@ -431,18 +431,18 @@ function newStringifyNode () { type: node.type, subType: node.subType, name: node.name, - backendProcesses: [], + tasks: [], savedPayload: getSavedPayload(node) } - for (let m = 0; m < node.backendProcesses.length; m++) { - let backendProcess = prepareForStringify(node.backendProcesses[m], removePersonalData) - backend.backendProcesses.push(backendProcess) + for (let m = 0; m < node.tasks.length; m++) { + let task = prepareForStringify(node.tasks[m], removePersonalData) + backend.tasks.push(task) } return backend } - case 'Backend Process': { + case 'Task': { let object = { id: node.id, type: node.type, diff --git a/StrategySpace/Workspace/Workspace.js b/StrategySpace/Workspace/Workspace.js index f2f060915..8b26a59d8 100644 --- a/StrategySpace/Workspace/Workspace.js +++ b/StrategySpace/Workspace/Workspace.js @@ -209,7 +209,7 @@ function newWorkspace () { } break - case 'Run Backend Process': + case 'Run Task': { /* Check if it is possible to Run or not */ if (payload.node.bot === undefined) { return } @@ -223,18 +223,18 @@ function newWorkspace () { payload.uiObject.play() let event = { - backendProcessId: payload.node.id, + taskId: payload.node.id, definition: JSON.stringify(functionLibraryProtocolNode.getProtocolNode(payload.node, false, true)) // <- We need to do this workaround in order no to send unescaped charactars to the backend. } - systemEventHandler.raiseEvent('Backend Server', 'Run Backend Process', event) + systemEventHandler.raiseEvent('Backend Server', 'Run Task', event) } break - case 'Stop Backend Process': + case 'Stop Task': { let event = { - backendProcessId: payload.node.id + taskId: payload.node.id } - systemEventHandler.raiseEvent('Backend Server', 'Stop Backend Process', event) + systemEventHandler.raiseEvent('Backend Server', 'Stop Task', event) payload.uiObject.stop() @@ -252,9 +252,9 @@ function newWorkspace () { functionLibraryPartsFromNodes.addBackend(payload.node) } break - case 'Add Backend Process': + case 'Add Task': { - functionLibraryPartsFromNodes.addBackendProcess(payload.node) + functionLibraryPartsFromNodes.addTask(payload.node) } break case 'Add Sensor': @@ -381,8 +381,8 @@ function newWorkspace () { functionLibraryNodeDeleter.deleteBackend(payload.node, workspaceNode.rootNodes) break } - case 'Delete Backend Process': { - functionLibraryNodeDeleter.deleteBackendProcess(payload.node, workspaceNode.rootNodes) + case 'Delete Task': { + functionLibraryNodeDeleter.deleteTask(payload.node, workspaceNode.rootNodes) break } case 'Delete Sensor': { From e7fb4dc54bae50c9a11ce5f7a1240020e0134099 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sun, 8 Sep 2019 11:40:12 +0200 Subject: [PATCH 29/40] Refactoring to Task Manager --- FloatingSpace/StrategyPart.js | 6 +++--- FloatingSpace/StrategyPartConstructor.js | 16 +++++++-------- FloatingSpace/StrategyPartTitle.js | 2 +- Spaces/StrategySpace.js | 2 +- .../FunctionLibraries/AttachDetach.js | 8 ++++---- .../FunctionLibraries/NodeChildren.js | 10 +++++----- .../FunctionLibraries/NodeDeleter.js | 14 ++++++------- .../FunctionLibraries/PartsFromNodes.js | 20 +++++++++---------- .../FunctionLibraries/ProtocolNode.js | 10 +++++----- .../FunctionLibraries/StringifyNode.js | 10 +++++----- StrategySpace/Workspace/Workspace.js | 14 ++++++------- 11 files changed, 56 insertions(+), 56 deletions(-) diff --git a/FloatingSpace/StrategyPart.js b/FloatingSpace/StrategyPart.js index f617351e9..c8b0b67a1 100644 --- a/FloatingSpace/StrategyPart.js +++ b/FloatingSpace/StrategyPart.js @@ -242,12 +242,12 @@ function newStrategyPart () { compatibleType = '->' + 'Parameters' compatibleSubType = undefined break - case 'Backend': + case 'Task Manager': compatibleType = '->' + 'Definition' compatibleSubType = undefined break case 'Task': - compatibleType = '->' + 'Backend' + compatibleType = '->' + 'Task Manager' compatibleSubType = undefined break case 'Sensor': @@ -364,7 +364,7 @@ function newStrategyPart () { let nearbyNode = floatingObject.payload.node if (compatibleType.indexOf('->' + nearbyNode.type) >= 0) { /* Discard objects with busy coonection ports */ - if (thisObject.payload.node.type === 'Backend' && nearbyNode.backend !== undefined) { continue } + if (thisObject.payload.node.type === 'Task Manager' && nearbyNode.taskManager !== undefined) { continue } if (thisObject.payload.node.type === 'Task' && nearbyNode.task !== undefined) { continue } if (thisObject.payload.node.type === 'Sensor' && nearbyNode.bot !== undefined) { continue } if (thisObject.payload.node.type === 'Indicator' && nearbyNode.bot !== undefined) { continue } diff --git a/FloatingSpace/StrategyPartConstructor.js b/FloatingSpace/StrategyPartConstructor.js index 28e55edd5..13fc55abf 100644 --- a/FloatingSpace/StrategyPartConstructor.js +++ b/FloatingSpace/StrategyPartConstructor.js @@ -274,11 +274,11 @@ function newStrategyPartConstructor () { ) menuItemsInitialValues.push( { - action: 'Add Backend', + action: 'Add Task Manager', actionFunction: payload.onMenuItemClick, - label: 'Add Backend', + label: 'Add Task Manager', visible: false, - relatedStrategyPart: 'Backend', + relatedStrategyPart: 'Task Manager', rawRadius: 8, targetRadius: 0, currentRadius: 0, @@ -317,7 +317,7 @@ function newStrategyPartConstructor () { ) break } - case 'Backend': { + case 'Task Manager': { addLeftIcons(menuItemsInitialValues, floatingObject) menuItemsInitialValues.push( { @@ -325,7 +325,7 @@ function newStrategyPartConstructor () { actionFunction: payload.onMenuItemClick, label: 'Add Task', visible: false, - relatedStrategyPart: 'Backend', + relatedStrategyPart: 'Task Manager', rawRadius: 8, targetRadius: 0, currentRadius: 0, @@ -334,11 +334,11 @@ function newStrategyPartConstructor () { ) menuItemsInitialValues.push( { - action: 'Delete Backend', + action: 'Delete Task Manager', askConfirmation: true, confirmationLabel: 'Confirm to Delete', actionFunction: payload.onMenuItemClick, - label: 'Delete Backend', + label: 'Delete Task Manager', visible: false, iconPathOn: 'delete', iconPathOff: 'delete', @@ -2140,7 +2140,7 @@ function newStrategyPartConstructor () { level_0() break } - case 'Backend': { + case 'Task Manager': { level_1() break } diff --git a/FloatingSpace/StrategyPartTitle.js b/FloatingSpace/StrategyPartTitle.js index 6baf88262..8918eed42 100644 --- a/FloatingSpace/StrategyPartTitle.js +++ b/FloatingSpace/StrategyPartTitle.js @@ -52,7 +52,7 @@ function newStrategyPartTitle () { thisObject.allwaysVisible = true break } - case 'Backend': { + case 'Task Manager': { break } case 'Task': { diff --git a/Spaces/StrategySpace.js b/Spaces/StrategySpace.js index 42104cc9e..48803846f 100644 --- a/Spaces/StrategySpace.js +++ b/Spaces/StrategySpace.js @@ -40,7 +40,7 @@ function newStrategySpace () { function buildIconByPartTypeMap () { const relationshipArray = [ ['Definition', 'text'], - ['Backend', 'task'], + ['Task Manager', 'task'], ['Task', 'timeline'], ['Sensor', 'pipette'], ['Indicator', 'vector'], diff --git a/StrategySpace/Workspace/FunctionLibraries/AttachDetach.js b/StrategySpace/Workspace/FunctionLibraries/AttachDetach.js index 3abe7c8c9..0e99c6321 100644 --- a/StrategySpace/Workspace/FunctionLibraries/AttachDetach.js +++ b/StrategySpace/Workspace/FunctionLibraries/AttachDetach.js @@ -49,8 +49,8 @@ function newAttachDetach () { completeDetachment(node, rootNodes) return } - case 'Backend': { - node.payload.parentNode.backend = undefined + case 'Task Manager': { + node.payload.parentNode.taskManager = undefined completeDetachment(node, rootNodes) return } @@ -248,10 +248,10 @@ function newAttachDetach () { function attachNode (node, attachToNode, rootNodes) { switch (node.type) { - case 'Backend': { + case 'Task Manager': { node.payload.parentNode = attachToNode node.payload.chainParent = attachToNode - node.payload.parentNode.backend = node + node.payload.parentNode.taskManager = node completeAttachment(node, rootNodes) } break diff --git a/StrategySpace/Workspace/FunctionLibraries/NodeChildren.js b/StrategySpace/Workspace/FunctionLibraries/NodeChildren.js index 00c84350b..9305c7f13 100644 --- a/StrategySpace/Workspace/FunctionLibraries/NodeChildren.js +++ b/StrategySpace/Workspace/FunctionLibraries/NodeChildren.js @@ -11,8 +11,8 @@ function newNodeChildren () { case 'Definition': { return countChildrenDefinition(parentNode, childNode) } - case 'Backend': { - return countChildrenBackend(parentNode, childNode) + case 'Task Manager': { + return countChildrenTaskManager(parentNode, childNode) } case 'Task': { return countChildrenTask(parentNode, childNode) @@ -145,16 +145,16 @@ function newNodeChildren () { response.childIndex = response.childrenCount } } - if (parentNode.backend !== undefined) { + if (parentNode.taskManager !== undefined) { response.childrenCount++ - if (parentNode.backend.id === childNode.id) { + if (parentNode.taskManager.id === childNode.id) { response.childIndex = response.childrenCount } } return response } - function countChildrenBackend (parentNode, childNode) { + function countChildrenTaskManager (parentNode, childNode) { let response = { childrenCount: 0, childIndex: undefined diff --git a/StrategySpace/Workspace/FunctionLibraries/NodeDeleter.js b/StrategySpace/Workspace/FunctionLibraries/NodeDeleter.js index 7d4522b8d..98aa81c34 100644 --- a/StrategySpace/Workspace/FunctionLibraries/NodeDeleter.js +++ b/StrategySpace/Workspace/FunctionLibraries/NodeDeleter.js @@ -1,7 +1,7 @@ function newNodeDeleter () { thisObject = { deleteDefinition: deleteDefinition, - deleteBackend: deleteBackend, + deleteTaskManager: deleteTaskManager, deleteTask: deleteTask, deleteSensor: deleteBot, deleteIndicator: deleteBot, @@ -52,8 +52,8 @@ function newNodeDeleter () { deleteDefinition(rootNode, rootNodes, true) break } - case 'Backend': { - deleteBackend(rootNode, rootNodes) + case 'Task Manager': { + deleteTaskManager(rootNode, rootNodes) break } case 'Task': { @@ -221,18 +221,18 @@ function newNodeDeleter () { if (node.personalData !== undefined) { deletePersonalData(node.personalData, rootNodes) } - if (node.backend !== undefined) { - deleteBackend(node.personalData, rootNodes) + if (node.taskManager !== undefined) { + deleteTaskManager(node.personalData, rootNodes) } completeDeletion(node, rootNodes) destroyPart(node) cleanNode(node) } - function deleteBackend (node, rootNodes) { + function deleteTaskManager (node, rootNodes) { let payload = node.payload if (payload.parentNode !== undefined) { - payload.parentNode.backend = undefined + payload.parentNode.taskManager = undefined } while (node.tasks.length > 0) { deleteTask(node.tasks[0], rootNodes) diff --git a/StrategySpace/Workspace/FunctionLibraries/PartsFromNodes.js b/StrategySpace/Workspace/FunctionLibraries/PartsFromNodes.js index 045e8e019..12b56513e 100644 --- a/StrategySpace/Workspace/FunctionLibraries/PartsFromNodes.js +++ b/StrategySpace/Workspace/FunctionLibraries/PartsFromNodes.js @@ -1,7 +1,7 @@ function newPartsFromNodes () { thisObject = { createPartFromNode: createPartFromNode, - addBackend: addBackend, + addTaskManager: addTaskManager, addTask: addTask, addSensor: addSensor, addIndicator: addIndicator, @@ -333,13 +333,13 @@ function newPartsFromNodes () { if (node.personalData !== undefined) { createPartFromNode(node.personalData, node, node) } - if (node.backend !== undefined) { - createPartFromNode(node.backend, node, node) + if (node.taskManager !== undefined) { + createPartFromNode(node.taskManager, node, node) } return } - case 'Backend': { - createPart('Backend', node.name, node, parentNode, chainParent, 'Backend') + case 'Task Manager': { + createPart('Task Manager', node.name, node, parentNode, chainParent, 'Task Manager') for (let m = 0; m < node.tasks.length; m++) { let task = node.tasks[m] createPartFromNode(task, node, node) @@ -384,15 +384,15 @@ function newPartsFromNodes () { } } - function addBackend (node) { - if (node.backend === undefined) { - node.backend = { + function addTaskManager (node) { + if (node.taskManager === undefined) { + node.taskManager = { tasks: [] } - createPart('Backend', '', node.backend, node, node) + createPart('Task Manager', '', node.taskManager, node, node) } - return node.backend + return node.taskManager } function addTask (node) { diff --git a/StrategySpace/Workspace/FunctionLibraries/ProtocolNode.js b/StrategySpace/Workspace/FunctionLibraries/ProtocolNode.js index b068ed227..cadf9bcf3 100644 --- a/StrategySpace/Workspace/FunctionLibraries/ProtocolNode.js +++ b/StrategySpace/Workspace/FunctionLibraries/ProtocolNode.js @@ -360,8 +360,8 @@ function newProtocolNode () { } return key } - case 'Backend': { - let backend = { + case 'Task Manager': { + let taskManager = { type: node.type, subType: node.subType, name: node.name, @@ -370,9 +370,9 @@ function newProtocolNode () { for (let m = 0; m < node.tasks.length; m++) { let task = getProtocolNode(node.tasks[m], removePersonalData, parseJSONStrings) - backend.tasks.push(task) + taskManager.tasks.push(task) } - return backend + return taskManager } case 'Task': { let object = { @@ -444,7 +444,7 @@ function newProtocolNode () { name: node.name, tradingSystem: getProtocolNode(node.tradingSystem, removePersonalData, parseJSONStrings), personalData: getProtocolNode(node.personalData, removePersonalData, parseJSONStrings), - backend: getProtocolNode(node.backend, removePersonalData, parseJSONStrings) + taskManager: getProtocolNode(node.taskManager, removePersonalData, parseJSONStrings) } return object } diff --git a/StrategySpace/Workspace/FunctionLibraries/StringifyNode.js b/StrategySpace/Workspace/FunctionLibraries/StringifyNode.js index b9dec729b..b3f0777c3 100644 --- a/StrategySpace/Workspace/FunctionLibraries/StringifyNode.js +++ b/StrategySpace/Workspace/FunctionLibraries/StringifyNode.js @@ -425,8 +425,8 @@ function newStringifyNode () { } return key } - case 'Backend': { - let backend = { + case 'Task Manager': { + let taskManager = { id: node.id, type: node.type, subType: node.subType, @@ -437,10 +437,10 @@ function newStringifyNode () { for (let m = 0; m < node.tasks.length; m++) { let task = prepareForStringify(node.tasks[m], removePersonalData) - backend.tasks.push(task) + taskManager.tasks.push(task) } - return backend + return taskManager } case 'Task': { let object = { @@ -523,7 +523,7 @@ function newStringifyNode () { name: node.name, tradingSystem: prepareForStringify(node.tradingSystem, removePersonalData), personalData: prepareForStringify(node.personalData, removePersonalData), - backend: prepareForStringify(node.backend, removePersonalData), + taskManager: prepareForStringify(node.taskManager, removePersonalData), savedPayload: getSavedPayload(node) } return object diff --git a/StrategySpace/Workspace/Workspace.js b/StrategySpace/Workspace/Workspace.js index 8b26a59d8..e41a8e758 100644 --- a/StrategySpace/Workspace/Workspace.js +++ b/StrategySpace/Workspace/Workspace.js @@ -224,9 +224,9 @@ function newWorkspace () { let event = { taskId: payload.node.id, - definition: JSON.stringify(functionLibraryProtocolNode.getProtocolNode(payload.node, false, true)) // <- We need to do this workaround in order no to send unescaped charactars to the backend. + definition: JSON.stringify(functionLibraryProtocolNode.getProtocolNode(payload.node, false, true)) // <- We need to do this workaround in order no to send unescaped charactars to the taskManager. } - systemEventHandler.raiseEvent('Backend Server', 'Run Task', event) + systemEventHandler.raiseEvent('Task Manager', 'Run Task', event) } break case 'Stop Task': @@ -234,7 +234,7 @@ function newWorkspace () { let event = { taskId: payload.node.id } - systemEventHandler.raiseEvent('Backend Server', 'Stop Task', event) + systemEventHandler.raiseEvent('Task Manager', 'Stop Task', event) payload.uiObject.stop() @@ -247,9 +247,9 @@ function newWorkspace () { } } break - case 'Add Backend': + case 'Add Task Manager': { - functionLibraryPartsFromNodes.addBackend(payload.node) + functionLibraryPartsFromNodes.addTaskManager(payload.node) } break case 'Add Task': @@ -377,8 +377,8 @@ function newWorkspace () { functionLibraryPartsFromNodes.addPersonalData(payload.node) } break - case 'Delete Backend': { - functionLibraryNodeDeleter.deleteBackend(payload.node, workspaceNode.rootNodes) + case 'Delete Task Manager': { + functionLibraryNodeDeleter.deleteTaskManager(payload.node, workspaceNode.rootNodes) break } case 'Delete Task': { From c35e587d186636d4f4ae08763eadbbd254aac910 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sun, 8 Sep 2019 12:02:17 +0200 Subject: [PATCH 30/40] Refactoring to Task Manager --- FloatingSpace/StrategyPart.js | 4 +- FloatingSpace/StrategyPartConstructor.js | 30 ++++++------- FloatingSpace/StrategyPartTitle.js | 2 +- Spaces/StrategySpace.js | 2 +- .../FunctionLibraries/AttachDetach.js | 8 ++-- .../FunctionLibraries/NodeChildren.js | 18 ++++---- .../FunctionLibraries/NodeDeleter.js | 18 ++++---- .../FunctionLibraries/PartsFromNodes.js | 42 +++++++++---------- .../FunctionLibraries/ProtocolNode.js | 26 ++++++------ .../FunctionLibraries/StringifyNode.js | 26 ++++++------ StrategySpace/Workspace/Workspace.js | 24 +++++------ 11 files changed, 100 insertions(+), 100 deletions(-) diff --git a/FloatingSpace/StrategyPart.js b/FloatingSpace/StrategyPart.js index c8b0b67a1..c18e4f338 100644 --- a/FloatingSpace/StrategyPart.js +++ b/FloatingSpace/StrategyPart.js @@ -262,7 +262,7 @@ function newStrategyPart () { compatibleType = '->' + 'Task' compatibleSubType = undefined break - case 'Bot Process': + case 'Process': compatibleType = '->' + 'Sensor' + '->' + 'Indicator' + '->' + 'Trading Engine' compatibleSubType = undefined break @@ -369,7 +369,7 @@ function newStrategyPart () { if (thisObject.payload.node.type === 'Sensor' && nearbyNode.bot !== undefined) { continue } if (thisObject.payload.node.type === 'Indicator' && nearbyNode.bot !== undefined) { continue } if (thisObject.payload.node.type === 'Trading Engine' && nearbyNode.bot !== undefined) { continue } - if (thisObject.payload.node.type === 'Bot Process' && nearbyNode.botProcess !== undefined) { continue } + if (thisObject.payload.node.type === 'Process' && nearbyNode.process !== undefined) { continue } if (thisObject.payload.node.type === 'Trading System' && nearbyNode.tradingSystem !== undefined) { continue } if (thisObject.payload.node.type === 'Personal Data' && nearbyNode.personalData !== undefined) { continue } if (thisObject.payload.node.type === 'Parameters' && nearbyNode.parameters !== undefined) { continue } diff --git a/FloatingSpace/StrategyPartConstructor.js b/FloatingSpace/StrategyPartConstructor.js index 13fc55abf..082ac9cf7 100644 --- a/FloatingSpace/StrategyPartConstructor.js +++ b/FloatingSpace/StrategyPartConstructor.js @@ -469,11 +469,11 @@ function newStrategyPartConstructor () { addLeftIcons(menuItemsInitialValues, floatingObject) menuItemsInitialValues.push( { - action: 'Add Bot Process', + action: 'Add Process', actionFunction: payload.onMenuItemClick, - label: 'Add Bot Process', + label: 'Add Process', visible: false, - relatedStrategyPart: 'Bot Process', + relatedStrategyPart: 'Process', rawRadius: 8, targetRadius: 0, currentRadius: 0, @@ -516,11 +516,11 @@ function newStrategyPartConstructor () { addLeftIcons(menuItemsInitialValues, floatingObject) menuItemsInitialValues.push( { - action: 'Add Bot Process', + action: 'Add Process', actionFunction: payload.onMenuItemClick, - label: 'Add Bot Process', + label: 'Add Process', visible: false, - relatedStrategyPart: 'Bot Process', + relatedStrategyPart: 'Process', rawRadius: 8, targetRadius: 0, currentRadius: 0, @@ -563,11 +563,11 @@ function newStrategyPartConstructor () { addLeftIcons(menuItemsInitialValues, floatingObject) menuItemsInitialValues.push( { - action: 'Add Bot Process', + action: 'Add Process', actionFunction: payload.onMenuItemClick, - label: 'Add Bot Process', + label: 'Add Process', visible: false, - relatedStrategyPart: 'Bot Process', + relatedStrategyPart: 'Process', rawRadius: 8, targetRadius: 0, currentRadius: 0, @@ -606,7 +606,7 @@ function newStrategyPartConstructor () { ) break } - case 'Bot Process': { + case 'Process': { strategyPart.codeEditor = newCodeEditor() strategyPart.codeEditor.isVisibleFunction = strategyPart.isVisibleFunction strategyPart.codeEditor.initialize() @@ -615,9 +615,9 @@ function newStrategyPartConstructor () { addLeftIcons(menuItemsInitialValues, floatingObject) menuItemsInitialValues.push( { - action: 'Edit Bot Process', + action: 'Edit Process', actionFunction: strategyPart.codeEditor.activate, - label: 'Edit Bot Process', + label: 'Edit Process', visible: false, iconPathOn: 'html', iconPathOff: 'html', @@ -630,11 +630,11 @@ function newStrategyPartConstructor () { ) menuItemsInitialValues.push( { - action: 'Delete Bot Process', + action: 'Delete Process', askConfirmation: true, confirmationLabel: 'Confirm to Delete', actionFunction: payload.onMenuItemClick, - label: 'Delete Bot Process', + label: 'Delete Process', visible: false, iconPathOn: 'delete', iconPathOff: 'delete', @@ -2160,7 +2160,7 @@ function newStrategyPartConstructor () { level_3() break } - case 'Bot Process': { + case 'Process': { level_4() break } diff --git a/FloatingSpace/StrategyPartTitle.js b/FloatingSpace/StrategyPartTitle.js index 8918eed42..663c52cf4 100644 --- a/FloatingSpace/StrategyPartTitle.js +++ b/FloatingSpace/StrategyPartTitle.js @@ -67,7 +67,7 @@ function newStrategyPartTitle () { case 'Trading Engine': { break } - case 'Bot Process': { + case 'Process': { break } case 'Personal Data': { diff --git a/Spaces/StrategySpace.js b/Spaces/StrategySpace.js index 48803846f..d940f2325 100644 --- a/Spaces/StrategySpace.js +++ b/Spaces/StrategySpace.js @@ -45,7 +45,7 @@ function newStrategySpace () { ['Sensor', 'pipette'], ['Indicator', 'vector'], ['Trading Engine', 'brainstorming'], - ['Bot Process', 'grid'], + ['Process', 'grid'], ['Personal Data', 'security'], ['Exchange Account', 'approve'], ['Exchange Account Asset', 'paper-plane'], diff --git a/StrategySpace/Workspace/FunctionLibraries/AttachDetach.js b/StrategySpace/Workspace/FunctionLibraries/AttachDetach.js index 0e99c6321..86e4d13f1 100644 --- a/StrategySpace/Workspace/FunctionLibraries/AttachDetach.js +++ b/StrategySpace/Workspace/FunctionLibraries/AttachDetach.js @@ -74,8 +74,8 @@ function newAttachDetach () { completeDetachment(node, rootNodes) return } - case 'Bot Process': { - node.payload.parentNode.botProcess = undefined + case 'Process': { + node.payload.parentNode.process = undefined completeDetachment(node, rootNodes) return } @@ -283,10 +283,10 @@ function newAttachDetach () { completeAttachment(node, rootNodes) } break - case 'Bot Process': { + case 'Process': { node.payload.parentNode = attachToNode node.payload.chainParent = attachToNode - node.payload.parentNode.botProcesses.push(node) + node.payload.parentNode.processes.push(node) completeAttachment(node, rootNodes) } break diff --git a/StrategySpace/Workspace/FunctionLibraries/NodeChildren.js b/StrategySpace/Workspace/FunctionLibraries/NodeChildren.js index 9305c7f13..df0a8b531 100644 --- a/StrategySpace/Workspace/FunctionLibraries/NodeChildren.js +++ b/StrategySpace/Workspace/FunctionLibraries/NodeChildren.js @@ -26,8 +26,8 @@ function newNodeChildren () { case 'Trading Engine': { return countChildrenTradingEngine(parentNode, childNode) } - case 'Bot Process': { - return countChildrenBotProcess(parentNode, childNode) + case 'Process': { + return countChildrenProcess(parentNode, childNode) } case 'Personal Data': { return countChildrenPersonalData(parentNode, childNode) @@ -190,8 +190,8 @@ function newNodeChildren () { childIndex: undefined } - for (let i = 0; i < parentNode.botProcesses.length; i++) { - let child = parentNode.botProcesses[i] + for (let i = 0; i < parentNode.processes.length; i++) { + let child = parentNode.processes[i] response.childrenCount++ if (child.id === childNode.id) { response.childIndex = response.childrenCount @@ -206,8 +206,8 @@ function newNodeChildren () { childIndex: undefined } - for (let i = 0; i < parentNode.botProcesses.length; i++) { - let child = parentNode.botProcesses[i] + for (let i = 0; i < parentNode.processes.length; i++) { + let child = parentNode.processes[i] response.childrenCount++ if (child.id === childNode.id) { response.childIndex = response.childrenCount @@ -222,8 +222,8 @@ function newNodeChildren () { childIndex: undefined } - for (let i = 0; i < parentNode.botProcesses.length; i++) { - let child = parentNode.botProcesses[i] + for (let i = 0; i < parentNode.processes.length; i++) { + let child = parentNode.processes[i] response.childrenCount++ if (child.id === childNode.id) { response.childIndex = response.childrenCount @@ -232,7 +232,7 @@ function newNodeChildren () { return response } - function countChildrenBotProcess (parentNode, childNode) { + function countChildrenProcess (parentNode, childNode) { let response = { childrenCount: 0, childIndex: undefined diff --git a/StrategySpace/Workspace/FunctionLibraries/NodeDeleter.js b/StrategySpace/Workspace/FunctionLibraries/NodeDeleter.js index 98aa81c34..e5de24395 100644 --- a/StrategySpace/Workspace/FunctionLibraries/NodeDeleter.js +++ b/StrategySpace/Workspace/FunctionLibraries/NodeDeleter.js @@ -6,7 +6,7 @@ function newNodeDeleter () { deleteSensor: deleteBot, deleteIndicator: deleteBot, deleteTradingEngine: deleteBot, - deleteBotProcess: deleteBotProcess, + deleteProcess: deleteProcess, deletePersonalData: deletePersonalData, deleteExchangeAccount: deleteExchangeAccount, deleteExchangeAccountAsset: deleteExchangeAccountAsset, @@ -72,8 +72,8 @@ function newNodeDeleter () { deleteBot(rootNode, rootNodes) break } - case 'Bot Process': { - deleteBotProcess(rootNode, rootNodes) + case 'Process': { + deleteProcess(rootNode, rootNodes) break } case 'Personal Data': { @@ -265,21 +265,21 @@ function newNodeDeleter () { if (payload.parentNode !== undefined) { payload.parentNode.bot = undefined } - while (node.botProcesses.length > 0) { - deleteBotProcess(node.botProcesses[0], rootNodes) + while (node.processes.length > 0) { + deleteProcess(node.processes[0], rootNodes) } completeDeletion(node, rootNodes) destroyPart(node) cleanNode(node) } - function deleteBotProcess (node, rootNodes) { + function deleteProcess (node, rootNodes) { let payload = node.payload if (payload.parentNode !== undefined) { - for (let j = 0; j < payload.parentNode.botProcesses.length; j++) { - let task = payload.parentNode.botProcesses[j] + for (let j = 0; j < payload.parentNode.processes.length; j++) { + let task = payload.parentNode.processes[j] if (task.id === node.id) { - payload.parentNode.botProcesses.splice(j, 1) + payload.parentNode.processes.splice(j, 1) } } } diff --git a/StrategySpace/Workspace/FunctionLibraries/PartsFromNodes.js b/StrategySpace/Workspace/FunctionLibraries/PartsFromNodes.js index 12b56513e..412d6160e 100644 --- a/StrategySpace/Workspace/FunctionLibraries/PartsFromNodes.js +++ b/StrategySpace/Workspace/FunctionLibraries/PartsFromNodes.js @@ -6,7 +6,7 @@ function newPartsFromNodes () { addSensor: addSensor, addIndicator: addIndicator, addTradingEngine: addTradingEngine, - addBotProcess: addBotProcess, + addProcess: addProcess, addTradingSystem: addTradingSystem, addPersonalData: addPersonalData, addExchangeAccount: addExchangeAccount, @@ -355,30 +355,30 @@ function newPartsFromNodes () { } case 'Sensor': { createPart('Sensor', node.name, node, parentNode, chainParent, 'Sensor') - for (let m = 0; m < node.botProcesses.length; m++) { - let botProcess = node.botProcesses[m] - createPartFromNode(botProcess, node, node) + for (let m = 0; m < node.processes.length; m++) { + let process = node.processes[m] + createPartFromNode(process, node, node) } return } case 'Indicator': { createPart('Indicator', node.name, node, parentNode, chainParent, 'Indicator') - for (let m = 0; m < node.botProcesses.length; m++) { - let botProcess = node.botProcesses[m] - createPartFromNode(botProcess, node, node) + for (let m = 0; m < node.processes.length; m++) { + let process = node.processes[m] + createPartFromNode(process, node, node) } return } case 'Trading Engine': { createPart('Trading Engine', node.name, node, parentNode, chainParent, 'Trading Engine') - for (let m = 0; m < node.botProcesses.length; m++) { - let botProcess = node.botProcesses[m] - createPartFromNode(botProcess, node, node) + for (let m = 0; m < node.processes.length; m++) { + let process = node.processes[m] + createPartFromNode(process, node, node) } return } - case 'Bot Process': { - createPart('Bot Process', node.name, node, parentNode, chainParent, 'Bot Process') + case 'Process': { + createPart('Process', node.name, node, parentNode, chainParent, 'Process') return } } @@ -408,7 +408,7 @@ function newPartsFromNodes () { function addSensor (node) { if (node.bot === undefined) { node.bot = { - botProcesses: [] + processes: [] } createPart('Sensor', '', node.bot, node, node) } @@ -418,7 +418,7 @@ function newPartsFromNodes () { function addIndicator (node) { if (node.bot === undefined) { node.bot = { - botProcesses: [] + processes: [] } createPart('Indicator', '', node.bot, node, node) } @@ -428,22 +428,22 @@ function newPartsFromNodes () { function addTradingEngine (node) { if (node.bot === undefined) { node.bot = { - botProcesses: [] + processes: [] } createPart('Trading Engine', '', node.bot, node, node) } return node.bot } - function addBotProcess (node) { - let botProcess = { - name: 'New Bot Process', + function addProcess (node) { + let process = { + name: 'New Process', code: '// Write the configuration here.' } - node.botProcesses.push(botProcess) - createPart('Bot Process', botProcess.name, botProcess, node, node, 'Bot Process') + node.processes.push(process) + createPart('Process', process.name, process, node, node, 'Process') - return botProcess + return process } function addTradingSystem (node) { diff --git a/StrategySpace/Workspace/FunctionLibraries/ProtocolNode.js b/StrategySpace/Workspace/FunctionLibraries/ProtocolNode.js index cadf9bcf3..78d32b703 100644 --- a/StrategySpace/Workspace/FunctionLibraries/ProtocolNode.js +++ b/StrategySpace/Workspace/FunctionLibraries/ProtocolNode.js @@ -388,12 +388,12 @@ function newProtocolNode () { type: node.type, subType: node.subType, name: node.name, - botProcesses: [] + processes: [] } - for (let m = 0; m < node.botProcesses.length; m++) { - let botProcess = getProtocolNode(node.botProcesses[m], removePersonalData, parseJSONStrings) - bot.botProcesses.push(botProcess) + for (let m = 0; m < node.processes.length; m++) { + let process = getProtocolNode(node.processes[m], removePersonalData, parseJSONStrings) + bot.processes.push(process) } return bot } @@ -402,12 +402,12 @@ function newProtocolNode () { type: node.type, subType: node.subType, name: node.name, - botProcesses: [] + processes: [] } - for (let m = 0; m < node.botProcesses.length; m++) { - let botProcess = getProtocolNode(node.botProcesses[m], removePersonalData, parseJSONStrings) - bot.botProcesses.push(botProcess) + for (let m = 0; m < node.processes.length; m++) { + let process = getProtocolNode(node.processes[m], removePersonalData, parseJSONStrings) + bot.processes.push(process) } return bot } @@ -416,16 +416,16 @@ function newProtocolNode () { type: node.type, subType: node.subType, name: node.name, - botProcesses: [] + processes: [] } - for (let m = 0; m < node.botProcesses.length; m++) { - let botProcess = getProtocolNode(node.botProcesses[m], removePersonalData, parseJSONStrings) - bot.botProcesses.push(botProcess) + for (let m = 0; m < node.processes.length; m++) { + let process = getProtocolNode(node.processes[m], removePersonalData, parseJSONStrings) + bot.processes.push(process) } return bot } - case 'Bot Process': { + case 'Process': { let object = { type: node.type, subType: node.subType, diff --git a/StrategySpace/Workspace/FunctionLibraries/StringifyNode.js b/StrategySpace/Workspace/FunctionLibraries/StringifyNode.js index b3f0777c3..79a4ed6de 100644 --- a/StrategySpace/Workspace/FunctionLibraries/StringifyNode.js +++ b/StrategySpace/Workspace/FunctionLibraries/StringifyNode.js @@ -459,13 +459,13 @@ function newStringifyNode () { type: node.type, subType: node.subType, name: node.name, - botProcesses: [], + processes: [], savedPayload: getSavedPayload(node) } - for (let m = 0; m < node.botProcesses.length; m++) { - let botProcess = prepareForStringify(node.botProcesses[m], removePersonalData) - bot.botProcesses.push(botProcess) + for (let m = 0; m < node.processes.length; m++) { + let process = prepareForStringify(node.processes[m], removePersonalData) + bot.processes.push(process) } return bot @@ -476,13 +476,13 @@ function newStringifyNode () { type: node.type, subType: node.subType, name: node.name, - botProcesses: [], + processes: [], savedPayload: getSavedPayload(node) } - for (let m = 0; m < node.botProcesses.length; m++) { - let botProcess = prepareForStringify(node.botProcesses[m], removePersonalData) - bot.botProcesses.push(botProcess) + for (let m = 0; m < node.processes.length; m++) { + let process = prepareForStringify(node.processes[m], removePersonalData) + bot.processes.push(process) } return bot @@ -493,18 +493,18 @@ function newStringifyNode () { type: node.type, subType: node.subType, name: node.name, - botProcesses: [], + processes: [], savedPayload: getSavedPayload(node) } - for (let m = 0; m < node.botProcesses.length; m++) { - let botProcess = prepareForStringify(node.botProcesses[m], removePersonalData) - bot.botProcesses.push(botProcess) + for (let m = 0; m < node.processes.length; m++) { + let process = prepareForStringify(node.processes[m], removePersonalData) + bot.processes.push(process) } return bot } - case 'Bot Process': { + case 'Process': { let object = { id: node.id, type: node.type, diff --git a/StrategySpace/Workspace/Workspace.js b/StrategySpace/Workspace/Workspace.js index e41a8e758..f57d7152b 100644 --- a/StrategySpace/Workspace/Workspace.js +++ b/StrategySpace/Workspace/Workspace.js @@ -213,11 +213,11 @@ function newWorkspace () { { /* Check if it is possible to Run or not */ if (payload.node.bot === undefined) { return } - if (payload.node.bot.botProcesses.length === 0) { return } + if (payload.node.bot.processes.length === 0) { return } - for (let i = 0; i < payload.node.bot.botProcesses.length; i++) { - let botProcess = payload.node.bot.botProcesses[i] - botProcess.payload.uiObject.play() + for (let i = 0; i < payload.node.bot.processes.length; i++) { + let process = payload.node.bot.processes[i] + process.payload.uiObject.play() } payload.uiObject.play() @@ -239,11 +239,11 @@ function newWorkspace () { payload.uiObject.stop() if (payload.node.bot === undefined) { return } - if (payload.node.bot.botProcesses.length === 0) { return } + if (payload.node.bot.processes.length === 0) { return } - for (let i = 0; i < payload.node.bot.botProcesses.length; i++) { - let botProcess = payload.node.bot.botProcesses[i] - botProcess.payload.uiObject.stop() + for (let i = 0; i < payload.node.bot.processes.length; i++) { + let process = payload.node.bot.processes[i] + process.payload.uiObject.stop() } } break @@ -272,9 +272,9 @@ function newWorkspace () { functionLibraryPartsFromNodes.addTradingEngine(payload.node) } break - case 'Add Bot Process': + case 'Add Process': { - functionLibraryPartsFromNodes.addBotProcess(payload.node) + functionLibraryPartsFromNodes.addProcess(payload.node) } break case 'Add Strategy': @@ -397,8 +397,8 @@ function newWorkspace () { functionLibraryNodeDeleter.deleteTradingEngine(payload.node, workspaceNode.rootNodes) break } - case 'Delete Bot Process': { - functionLibraryNodeDeleter.deleteBotProcess(payload.node, workspaceNode.rootNodes) + case 'Delete Process': { + functionLibraryNodeDeleter.deleteProcess(payload.node, workspaceNode.rootNodes) break } case 'Delete Trading System': { From cef80f59fabf9b1bf2deab7a070c3a16f7a4344d Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sun, 8 Sep 2019 14:04:30 +0200 Subject: [PATCH 31/40] Processes with progress bar working --- FloatingSpace/CircularProgressBar.js | 2 +- .../FunctionLibraries/ProtocolNode.js | 98 ++++++++++--------- StrategySpace/Workspace/Workspace.js | 2 +- 3 files changed, 54 insertions(+), 48 deletions(-) diff --git a/FloatingSpace/CircularProgressBar.js b/FloatingSpace/CircularProgressBar.js index dfe160b70..373e2fe62 100644 --- a/FloatingSpace/CircularProgressBar.js +++ b/FloatingSpace/CircularProgressBar.js @@ -39,7 +39,7 @@ function newCircularProgressBar () { opacityCounters.push(0) } - let key = thisObject.payload.node.name + '-' + thisObject.payload.node.type + let key = thisObject.payload.node.name + '-' + thisObject.payload.node.type + '-' + thisObject.payload.node.id systemEventHandler.createEventHandler(key) systemEventHandler.listenToEvent(key, 'Heartbeat', undefined, key, undefined, onHeartBeat) } diff --git a/StrategySpace/Workspace/FunctionLibraries/ProtocolNode.js b/StrategySpace/Workspace/FunctionLibraries/ProtocolNode.js index 78d32b703..b9a9f95f4 100644 --- a/StrategySpace/Workspace/FunctionLibraries/ProtocolNode.js +++ b/StrategySpace/Workspace/FunctionLibraries/ProtocolNode.js @@ -4,7 +4,7 @@ function newProtocolNode () { } return thisObject - function getProtocolNode (node, removePersonalData, parseJSONStrings) { + function getProtocolNode (node, removePersonalData, parseJSONStrings, includeIds) { if (node === undefined) { return } switch (node.type) { case 'Code': @@ -23,7 +23,7 @@ function newProtocolNode () { type: node.type, subType: node.subType, name: node.name, - code: getProtocolNode(node.code, removePersonalData, parseJSONStrings) + code: getProtocolNode(node.code, removePersonalData, parseJSONStrings, includeIds) } return condition } @@ -36,7 +36,7 @@ function newProtocolNode () { } for (let m = 0; m < node.conditions.length; m++) { - let condition = getProtocolNode(node.conditions[m], removePersonalData, parseJSONStrings) + let condition = getProtocolNode(node.conditions[m], removePersonalData, parseJSONStrings, includeIds) situation.conditions.push(condition) } return situation @@ -60,7 +60,7 @@ function newProtocolNode () { situations: [] } for (let m = 0; m < node.situations.length; m++) { - let situation = getProtocolNode(node.situations[m], removePersonalData, parseJSONStrings) + let situation = getProtocolNode(node.situations[m], removePersonalData, parseJSONStrings, includeIds) event.situations.push(situation) } return event @@ -70,8 +70,8 @@ function newProtocolNode () { type: node.type, subType: node.subType, name: node.name, - formula: getProtocolNode(node.formula, removePersonalData, parseJSONStrings), - nextPhaseEvent: getProtocolNode(node.nextPhaseEvent, removePersonalData, parseJSONStrings) + formula: getProtocolNode(node.formula, removePersonalData, parseJSONStrings, includeIds), + nextPhaseEvent: getProtocolNode(node.nextPhaseEvent, removePersonalData, parseJSONStrings, includeIds) } return phase } @@ -84,7 +84,7 @@ function newProtocolNode () { } for (let m = 0; m < node.phases.length; m++) { - let phase = getProtocolNode(node.phases[m], removePersonalData, parseJSONStrings) + let phase = getProtocolNode(node.phases[m], removePersonalData, parseJSONStrings, includeIds) stop.phases.push(phase) } return stop @@ -98,7 +98,7 @@ function newProtocolNode () { } for (let m = 0; m < node.phases.length; m++) { - let phase = getProtocolNode(node.phases[m], removePersonalData, parseJSONStrings) + let phase = getProtocolNode(node.phases[m], removePersonalData, parseJSONStrings, includeIds) takeProfit.phases.push(phase) } return takeProfit @@ -112,7 +112,7 @@ function newProtocolNode () { } for (let m = 0; m < node.situations.length; m++) { - let situation = getProtocolNode(node.situations[m], removePersonalData, parseJSONStrings) + let situation = getProtocolNode(node.situations[m], removePersonalData, parseJSONStrings, includeIds) event.situations.push(situation) } return event @@ -126,7 +126,7 @@ function newProtocolNode () { } for (let m = 0; m < node.situations.length; m++) { - let situation = getProtocolNode(node.situations[m], removePersonalData, parseJSONStrings) + let situation = getProtocolNode(node.situations[m], removePersonalData, parseJSONStrings, includeIds) event.situations.push(situation) } return event @@ -140,7 +140,7 @@ function newProtocolNode () { } for (let m = 0; m < node.situations.length; m++) { - let situation = getProtocolNode(node.situations[m], removePersonalData, parseJSONStrings) + let situation = getProtocolNode(node.situations[m], removePersonalData, parseJSONStrings, includeIds) event.situations.push(situation) } return event @@ -150,10 +150,10 @@ function newProtocolNode () { type: node.type, subType: node.subType, name: node.name, - stopLoss: getProtocolNode(node.stopLoss, removePersonalData, parseJSONStrings), - takeProfit: getProtocolNode(node.takeProfit, removePersonalData, parseJSONStrings), - positionSize: getProtocolNode(node.positionSize, removePersonalData, parseJSONStrings), - positionRate: getProtocolNode(node.positionRate, removePersonalData, parseJSONStrings) + stopLoss: getProtocolNode(node.stopLoss, removePersonalData, parseJSONStrings, includeIds), + takeProfit: getProtocolNode(node.takeProfit, removePersonalData, parseJSONStrings, includeIds), + positionSize: getProtocolNode(node.positionSize, removePersonalData, parseJSONStrings, includeIds), + positionRate: getProtocolNode(node.positionRate, removePersonalData, parseJSONStrings, includeIds) } return object } @@ -178,7 +178,7 @@ function newProtocolNode () { type: node.type, subType: node.subType, name: node.name, - formula: getProtocolNode(node.formula, removePersonalData, parseJSONStrings) + formula: getProtocolNode(node.formula, removePersonalData, parseJSONStrings, includeIds) } return object } @@ -187,7 +187,7 @@ function newProtocolNode () { type: node.type, subType: node.subType, name: node.name, - formula: getProtocolNode(node.formula, removePersonalData, parseJSONStrings) + formula: getProtocolNode(node.formula, removePersonalData, parseJSONStrings, includeIds) } return object } @@ -196,9 +196,9 @@ function newProtocolNode () { type: node.type, subType: node.subType, name: node.name, - triggerOn: getProtocolNode(node.triggerOn, removePersonalData, parseJSONStrings), - triggerOff: getProtocolNode(node.triggerOff, removePersonalData, parseJSONStrings), - takePosition: getProtocolNode(node.takePosition, removePersonalData, parseJSONStrings) + triggerOn: getProtocolNode(node.triggerOn, removePersonalData, parseJSONStrings, includeIds), + triggerOff: getProtocolNode(node.triggerOff, removePersonalData, parseJSONStrings, includeIds), + takePosition: getProtocolNode(node.takePosition, removePersonalData, parseJSONStrings, includeIds) } return stage } @@ -207,8 +207,8 @@ function newProtocolNode () { type: node.type, subType: node.subType, name: node.name, - initialDefinition: getProtocolNode(node.initialDefinition, removePersonalData, parseJSONStrings), - openExecution: getProtocolNode(node.openExecution, removePersonalData, parseJSONStrings) + initialDefinition: getProtocolNode(node.initialDefinition, removePersonalData, parseJSONStrings, includeIds), + openExecution: getProtocolNode(node.openExecution, removePersonalData, parseJSONStrings, includeIds) } return stage } @@ -217,8 +217,8 @@ function newProtocolNode () { type: node.type, subType: node.subType, name: node.name, - stopLoss: getProtocolNode(node.stopLoss, removePersonalData, parseJSONStrings), - takeProfit: getProtocolNode(node.takeProfit, removePersonalData, parseJSONStrings) + stopLoss: getProtocolNode(node.stopLoss, removePersonalData, parseJSONStrings, includeIds), + takeProfit: getProtocolNode(node.takeProfit, removePersonalData, parseJSONStrings, includeIds) } return stage } @@ -227,7 +227,7 @@ function newProtocolNode () { type: node.type, subType: node.subType, name: node.name, - closeExecution: getProtocolNode(node.closeExecution, removePersonalData, parseJSONStrings) + closeExecution: getProtocolNode(node.closeExecution, removePersonalData, parseJSONStrings, includeIds) } return stage } @@ -236,10 +236,10 @@ function newProtocolNode () { type: node.type, subType: node.subType, name: node.name, - triggerStage: getProtocolNode(node.triggerStage, removePersonalData, parseJSONStrings), - openStage: getProtocolNode(node.openStage, removePersonalData, parseJSONStrings), - manageStage: getProtocolNode(node.manageStage, removePersonalData, parseJSONStrings), - closeStage: getProtocolNode(node.closeStage, removePersonalData, parseJSONStrings) + triggerStage: getProtocolNode(node.triggerStage, removePersonalData, parseJSONStrings, includeIds), + openStage: getProtocolNode(node.openStage, removePersonalData, parseJSONStrings, includeIds), + manageStage: getProtocolNode(node.manageStage, removePersonalData, parseJSONStrings, includeIds), + closeStage: getProtocolNode(node.closeStage, removePersonalData, parseJSONStrings, includeIds) } return strategy } @@ -284,10 +284,10 @@ function newProtocolNode () { type: node.type, subType: node.subType, name: node.name, - baseAsset: getProtocolNode(node.baseAsset, removePersonalData, parseJSONStrings), - timeRange: getProtocolNode(node.timeRange, removePersonalData, parseJSONStrings), - slippage: getProtocolNode(node.slippage, removePersonalData, parseJSONStrings), - feeStructure: getProtocolNode(node.feeStructure, removePersonalData, parseJSONStrings) + baseAsset: getProtocolNode(node.baseAsset, removePersonalData, parseJSONStrings, includeIds), + timeRange: getProtocolNode(node.timeRange, removePersonalData, parseJSONStrings, includeIds), + slippage: getProtocolNode(node.slippage, removePersonalData, parseJSONStrings, includeIds), + feeStructure: getProtocolNode(node.feeStructure, removePersonalData, parseJSONStrings, includeIds) } return object } @@ -297,11 +297,11 @@ function newProtocolNode () { subType: node.subType, name: node.name, strategies: [], - parameters: getProtocolNode(node.parameters, removePersonalData, parseJSONStrings) + parameters: getProtocolNode(node.parameters, removePersonalData, parseJSONStrings, includeIds) } for (let m = 0; m < node.strategies.length; m++) { - let strategy = getProtocolNode(node.strategies[m], removePersonalData, parseJSONStrings) + let strategy = getProtocolNode(node.strategies[m], removePersonalData, parseJSONStrings, includeIds) tradingSystem.strategies.push(strategy) } return tradingSystem @@ -316,7 +316,7 @@ function newProtocolNode () { } for (let m = 0; m < node.exchangeAccounts.length; m++) { - let exchangeAccount = getProtocolNode(node.exchangeAccounts[m], removePersonalData, parseJSONStrings) + let exchangeAccount = getProtocolNode(node.exchangeAccounts[m], removePersonalData, parseJSONStrings, includeIds) personalData.exchangeAccounts.push(exchangeAccount) } return personalData @@ -332,11 +332,11 @@ function newProtocolNode () { } for (let m = 0; m < node.assets.length; m++) { - let asset = getProtocolNode(node.assets[m], removePersonalData, parseJSONStrings) + let asset = getProtocolNode(node.assets[m], removePersonalData, parseJSONStrings, includeIds) exchangeAccount.assets.push(asset) } for (let m = 0; m < node.keys.length; m++) { - let key = getProtocolNode(node.keys[m], removePersonalData, parseJSONStrings) + let key = getProtocolNode(node.keys[m], removePersonalData, parseJSONStrings, includeIds) exchangeAccount.keys.push(key) } return exchangeAccount @@ -369,7 +369,7 @@ function newProtocolNode () { } for (let m = 0; m < node.tasks.length; m++) { - let task = getProtocolNode(node.tasks[m], removePersonalData, parseJSONStrings) + let task = getProtocolNode(node.tasks[m], removePersonalData, parseJSONStrings, includeIds) taskManager.tasks.push(task) } return taskManager @@ -379,7 +379,10 @@ function newProtocolNode () { type: node.type, subType: node.subType, name: node.name, - bot: getProtocolNode(node.bot, removePersonalData, parseJSONStrings) + bot: getProtocolNode(node.bot, removePersonalData, parseJSONStrings, includeIds) + } + if (includeIds) { + object.id = node.id } return object } @@ -392,7 +395,7 @@ function newProtocolNode () { } for (let m = 0; m < node.processes.length; m++) { - let process = getProtocolNode(node.processes[m], removePersonalData, parseJSONStrings) + let process = getProtocolNode(node.processes[m], removePersonalData, parseJSONStrings, includeIds) bot.processes.push(process) } return bot @@ -406,7 +409,7 @@ function newProtocolNode () { } for (let m = 0; m < node.processes.length; m++) { - let process = getProtocolNode(node.processes[m], removePersonalData, parseJSONStrings) + let process = getProtocolNode(node.processes[m], removePersonalData, parseJSONStrings, includeIds) bot.processes.push(process) } return bot @@ -420,7 +423,7 @@ function newProtocolNode () { } for (let m = 0; m < node.processes.length; m++) { - let process = getProtocolNode(node.processes[m], removePersonalData, parseJSONStrings) + let process = getProtocolNode(node.processes[m], removePersonalData, parseJSONStrings, includeIds) bot.processes.push(process) } return bot @@ -435,6 +438,9 @@ function newProtocolNode () { if (parseJSONStrings) { object.code = JSON.parse(object.code) } + if (includeIds) { + object.id = node.id + } return object } case 'Definition': { @@ -442,9 +448,9 @@ function newProtocolNode () { type: node.type, subType: node.subType, name: node.name, - tradingSystem: getProtocolNode(node.tradingSystem, removePersonalData, parseJSONStrings), - personalData: getProtocolNode(node.personalData, removePersonalData, parseJSONStrings), - taskManager: getProtocolNode(node.taskManager, removePersonalData, parseJSONStrings) + tradingSystem: getProtocolNode(node.tradingSystem, removePersonalData, parseJSONStrings, includeIds), + personalData: getProtocolNode(node.personalData, removePersonalData, parseJSONStrings, includeIds), + taskManager: getProtocolNode(node.taskManager, removePersonalData, parseJSONStrings, includeIds) } return object } diff --git a/StrategySpace/Workspace/Workspace.js b/StrategySpace/Workspace/Workspace.js index f57d7152b..b3ac2f5e7 100644 --- a/StrategySpace/Workspace/Workspace.js +++ b/StrategySpace/Workspace/Workspace.js @@ -224,7 +224,7 @@ function newWorkspace () { let event = { taskId: payload.node.id, - definition: JSON.stringify(functionLibraryProtocolNode.getProtocolNode(payload.node, false, true)) // <- We need to do this workaround in order no to send unescaped charactars to the taskManager. + definition: JSON.stringify(functionLibraryProtocolNode.getProtocolNode(payload.node, false, true, true)) // <- We need to do this workaround in order no to send unescaped charactars to the taskManager. } systemEventHandler.raiseEvent('Task Manager', 'Run Task', event) } From d98738a073fd53c01062f6de18a421f4841f8c55 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Mon, 9 Sep 2019 09:51:16 +0200 Subject: [PATCH 32/40] allways visible names --- FloatingSpace/StrategyPartTitle.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/FloatingSpace/StrategyPartTitle.js b/FloatingSpace/StrategyPartTitle.js index 663c52cf4..4d859608d 100644 --- a/FloatingSpace/StrategyPartTitle.js +++ b/FloatingSpace/StrategyPartTitle.js @@ -59,9 +59,11 @@ function newStrategyPartTitle () { break } case 'Sensor': { + thisObject.allwaysVisible = true break } case 'Indicator': { + thisObject.allwaysVisible = true break } case 'Trading Engine': { @@ -344,7 +346,7 @@ function newStrategyPartTitle () { function trimTitle (title) { if (title === undefined) { return } - const MAX_LABEL_LENGTH = 30 + const MAX_LABEL_LENGTH = 50 if (title.length > MAX_LABEL_LENGTH) { title = title.substring(0, MAX_LABEL_LENGTH) + '...' } From 1d45f3acbcaba4f7b63b227a3e86a05838b7f891 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Mon, 9 Sep 2019 10:20:52 +0200 Subject: [PATCH 33/40] Bug Fixed while deleting Task Manager --- .../FunctionLibraries/NodeDeleter.js | 2 +- StrategySpace/Workspace/Workspace.js | 83 +++++++++++-------- 2 files changed, 48 insertions(+), 37 deletions(-) diff --git a/StrategySpace/Workspace/FunctionLibraries/NodeDeleter.js b/StrategySpace/Workspace/FunctionLibraries/NodeDeleter.js index e5de24395..517f705bb 100644 --- a/StrategySpace/Workspace/FunctionLibraries/NodeDeleter.js +++ b/StrategySpace/Workspace/FunctionLibraries/NodeDeleter.js @@ -222,7 +222,7 @@ function newNodeDeleter () { deletePersonalData(node.personalData, rootNodes) } if (node.taskManager !== undefined) { - deleteTaskManager(node.personalData, rootNodes) + deleteTaskManager(node.taskManager, rootNodes) } completeDeletion(node, rootNodes) destroyPart(node) diff --git a/StrategySpace/Workspace/Workspace.js b/StrategySpace/Workspace/Workspace.js index b3ac2f5e7..bae8d1635 100644 --- a/StrategySpace/Workspace/Workspace.js +++ b/StrategySpace/Workspace/Workspace.js @@ -1,6 +1,9 @@ function newWorkspace () { const MODULE_NAME = 'Workspace' + const ERROR_LOG = true + const logger = newWebDebugLog() + logger.fileName = MODULE_NAME let thisObject = { tradingSystem: undefined, @@ -53,29 +56,33 @@ function newWorkspace () { } async function initialize () { - let user = window.localStorage.getItem(LOGGED_IN_USER_LOCAL_STORAGE_KEY) - if (user === null) { - return - } - user = JSON.parse(user) - - let idAtStrategizer = window.localStorage.getItem(CANVAS_APP_NAME + '.' + 'Strategizer Gateway' + '.' + user.alias) - let savedWorkspace = window.localStorage.getItem(CANVAS_APP_NAME + '.' + 'Workspace' + '.' + user.alias) - - if (savedWorkspace === null || idAtStrategizer === null) { - workspaceNode.type = 'Workspace' - workspaceNode.name = 'My Workspace' - functionLibraryPartsFromNodes.createPartFromNode(workspaceNode, undefined, undefined) - spawnPosition.y = spawnPosition.y + 250 - initializeLoadingFromStrategizer() - } else { - workspaceNode = JSON.parse(savedWorkspace) - functionLibraryPartsFromNodes.createPartFromNode(workspaceNode, undefined, undefined) - for (let i = 0; i < workspaceNode.rootNodes.length; i++) { - let rootNode = workspaceNode.rootNodes[i] - functionLibraryPartsFromNodes.createPartFromNode(rootNode, undefined, undefined) + try { + let user = window.localStorage.getItem(LOGGED_IN_USER_LOCAL_STORAGE_KEY) + if (user === null) { + return } - thisObject.enabled = true + user = JSON.parse(user) + + let idAtStrategizer = window.localStorage.getItem(CANVAS_APP_NAME + '.' + 'Strategizer Gateway' + '.' + user.alias) + let savedWorkspace = window.localStorage.getItem(CANVAS_APP_NAME + '.' + 'Workspace' + '.' + user.alias) + + if (savedWorkspace === null || idAtStrategizer === null) { + workspaceNode.type = 'Workspace' + workspaceNode.name = 'My Workspace' + functionLibraryPartsFromNodes.createPartFromNode(workspaceNode, undefined, undefined) + spawnPosition.y = spawnPosition.y + 250 + initializeLoadingFromStrategizer() + } else { + workspaceNode = JSON.parse(savedWorkspace) + functionLibraryPartsFromNodes.createPartFromNode(workspaceNode, undefined, undefined) + for (let i = 0; i < workspaceNode.rootNodes.length; i++) { + let rootNode = workspaceNode.rootNodes[i] + functionLibraryPartsFromNodes.createPartFromNode(rootNode, undefined, undefined) + } + thisObject.enabled = true + } + } catch (err) { + if (ERROR_LOG === true) { logger.write('[ERROR] initialize -> err = ' + err.stack) } } } @@ -134,24 +141,28 @@ function newWorkspace () { } function spawn (nodeText, point) { - point = canvas.floatingSpace.container.frame.unframeThisPoint(point) - spawnPosition.x = point.x - spawnPosition.y = point.y + try { + point = canvas.floatingSpace.container.frame.unframeThisPoint(point) + spawnPosition.x = point.x + spawnPosition.y = point.y - let droppedNode = JSON.parse(nodeText) + let droppedNode = JSON.parse(nodeText) - if (droppedNode.type === 'Workspace') { - functionLibraryNodeDeleter.deleteWorkspace(workspaceNode, workspaceNode.rootNodes) - workspaceNode = droppedNode - functionLibraryPartsFromNodes.createPartFromNode(workspaceNode, undefined, undefined) - for (let i = 0; i < workspaceNode.rootNodes.length; i++) { - let rootNode = workspaceNode.rootNodes[i] + if (droppedNode.type === 'Workspace') { + functionLibraryNodeDeleter.deleteWorkspace(workspaceNode, workspaceNode.rootNodes) + workspaceNode = droppedNode + functionLibraryPartsFromNodes.createPartFromNode(workspaceNode, undefined, undefined) + for (let i = 0; i < workspaceNode.rootNodes.length; i++) { + let rootNode = workspaceNode.rootNodes[i] + functionLibraryPartsFromNodes.createPartFromNode(rootNode, undefined, undefined) + } + } else { + let rootNode = functionLibraryProtocolNode.getProtocolNode(droppedNode) + workspaceNode.rootNodes.push(rootNode) functionLibraryPartsFromNodes.createPartFromNode(rootNode, undefined, undefined) } - } else { - let rootNode = functionLibraryProtocolNode.getProtocolNode(droppedNode) - workspaceNode.rootNodes.push(rootNode) - functionLibraryPartsFromNodes.createPartFromNode(rootNode, undefined, undefined) + } catch (err) { + if (ERROR_LOG === true) { logger.write('[ERROR] spawn -> err = ' + err.stack) } } } From 1a3b917b4cd30a687a577db953c00520de2ecd26 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Tue, 10 Sep 2019 07:53:09 +0200 Subject: [PATCH 34/40] Restoring Previous Workings of Running Status --- FloatingSpace/StrategyPart.js | 53 ++++++++++++++++++++++------------- 1 file changed, 34 insertions(+), 19 deletions(-) diff --git a/FloatingSpace/StrategyPart.js b/FloatingSpace/StrategyPart.js index c18e4f338..d3d67d00f 100644 --- a/FloatingSpace/StrategyPart.js +++ b/FloatingSpace/StrategyPart.js @@ -16,14 +16,14 @@ function newStrategyPart () { payload: undefined, codeEditor: undefined, partTitle: undefined, - runningStatus: undefined, + circularProgressBar: undefined, isExecuting: undefined, isRunning: undefined, run: run, play: play, stop: stop, setRunningStatus: setRunningStatus, - setNotRunningStatus: setNotRunningStatus, + setNotcircularProgressBar: setNotcircularProgressBar, getReadyToAttach: getReadyToAttach, showAvailabilityToAttach: showAvailabilityToAttach, highlight: highlight, @@ -178,8 +178,8 @@ function newStrategyPart () { thisObject.payload.targetPosition.y = thisObject.payload.chainParent.payload.position.y } - if (thisObject.runningStatus !== undefined) { - thisObject.runningStatus.physics() + if (thisObject.circularProgressBar !== undefined) { + thisObject.circularProgressBar.physics() } iconPhysics() @@ -532,21 +532,21 @@ function newStrategyPart () { } function play () { - if (thisObject.runningStatus !== undefined) { - thisObject.runningStatus.finalize() + if (thisObject.circularProgressBar !== undefined) { + thisObject.circularProgressBar.finalize() } - thisObject.runningStatus = newCircularProgressBar() - thisObject.runningStatus.initialize(thisObject.payload) - thisObject.runningStatus.fitFunction = thisObject.fitFunction - thisObject.runningStatus.container = thisObject.container + thisObject.circularProgressBar = newCircularProgressBar() + thisObject.circularProgressBar.initialize(thisObject.payload) + thisObject.circularProgressBar.fitFunction = thisObject.fitFunction + thisObject.circularProgressBar.container = thisObject.container } function stop () { - setTimeout(removeRunningStatus, 30000) - function removeRunningStatus () { - thisObject.runningStatus.finalize() - thisObject.runningStatus = undefined + setTimeout(removecircularProgressBar, 30000) + function removecircularProgressBar () { + thisObject.circularProgressBar.finalize() + thisObject.circularProgressBar = undefined } } @@ -561,7 +561,7 @@ function newStrategyPart () { runningCounter = 30 } - function setNotRunningStatus () { + function setNotcircularProgressBar () { canvas.strategySpace.workspace.definition = undefined thisObject.isRunning = false } @@ -617,8 +617,8 @@ function newStrategyPart () { } } - if (thisObject.runningStatus !== undefined) { - thisObject.runningStatus.drawBackground() + if (thisObject.circularProgressBar !== undefined) { + thisObject.circularProgressBar.drawBackground() } } @@ -638,8 +638,8 @@ function newStrategyPart () { } } - if (thisObject.runningStatus !== undefined) { - thisObject.runningStatus.drawForeground() + if (thisObject.circularProgressBar !== undefined) { + thisObject.circularProgressBar.drawForeground() } } @@ -940,6 +940,21 @@ function newStrategyPart () { browserCanvasContext.fill() + if (thisObject.isRunning === true) { + VISIBLE_RADIUS = thisObject.container.frame.radius * 2 + let OPACITY = runningCounter / 30 + + browserCanvasContext.beginPath() + browserCanvasContext.arc(visiblePosition.x, visiblePosition.y, VISIBLE_RADIUS, 0, Math.PI * 2, true) + browserCanvasContext.closePath() + + browserCanvasContext.strokeStyle = 'rgba(' + UI_COLOR.LIGHT_GREY + ', ' + OPACITY + ')' + + browserCanvasContext.lineWidth = 10 + browserCanvasContext.setLineDash([4, 20]) + browserCanvasContext.stroke() + } + if (thisObject.isOnFocus === true) { VISIBLE_RADIUS = thisObject.container.frame.radius browserCanvasContext.beginPath() From ad54e1d868aab5734143e883beadb004ac067745 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Tue, 10 Sep 2019 11:25:43 +0200 Subject: [PATCH 35/40] No event messages please --- SystemEventHandler.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SystemEventHandler.js b/SystemEventHandler.js index 92504e60e..072fa880b 100644 --- a/SystemEventHandler.js +++ b/SystemEventHandler.js @@ -102,7 +102,7 @@ function newSystemEventHandler () { callBackFunction() } WEB_SOCKETS_CONNECTION.onmessage = e => { - console.log('Websoked Message Received: ' + e.data) + // console.log('Websoked Message Received: ' + e.data) let message = JSON.parse(e.data) From 3c0edf634ea7ba4eff9004f2e742c5858356a46d Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Tue, 10 Sep 2019 12:41:26 +0200 Subject: [PATCH 36/40] Task Functions --- FloatingSpace/StrategyPartConstructor.js | 34 ++++++++++- .../FunctionLibraries/TaskFunctions.js | 60 +++++++++++++++++++ StrategySpace/Workspace/Workspace.js | 43 ++++--------- 3 files changed, 104 insertions(+), 33 deletions(-) create mode 100644 StrategySpace/Workspace/FunctionLibraries/TaskFunctions.js diff --git a/FloatingSpace/StrategyPartConstructor.js b/FloatingSpace/StrategyPartConstructor.js index 082ac9cf7..d63d3e9c8 100644 --- a/FloatingSpace/StrategyPartConstructor.js +++ b/FloatingSpace/StrategyPartConstructor.js @@ -319,6 +319,34 @@ function newStrategyPartConstructor () { } case 'Task Manager': { addLeftIcons(menuItemsInitialValues, floatingObject) + menuItemsInitialValues.push( + { + action: 'Run All Tasks', + actionFunction: payload.onMenuItemClick, + label: 'Run All Tasks', + visible: false, + iconPathOn: 'paper-plane', + iconPathOff: 'paper-plane', + rawRadius: 8, + targetRadius: 0, + currentRadius: 0, + angle: -60 + } + ) + menuItemsInitialValues.push( + { + action: 'Stop All Tasks', + actionFunction: payload.onMenuItemClick, + label: 'Stop All Tasks', + visible: false, + iconPathOn: 'stop', + iconPathOff: 'stop', + rawRadius: 8, + targetRadius: 0, + currentRadius: 0, + angle: -20 + } + ) menuItemsInitialValues.push( { action: 'Add Task', @@ -329,7 +357,7 @@ function newStrategyPartConstructor () { rawRadius: 8, targetRadius: 0, currentRadius: 0, - angle: -40 + angle: 0 } ) menuItemsInitialValues.push( @@ -345,7 +373,7 @@ function newStrategyPartConstructor () { rawRadius: 8, targetRadius: 0, currentRadius: 0, - angle: 0 + angle: 20 } ) menuItemsInitialValues.push( @@ -359,7 +387,7 @@ function newStrategyPartConstructor () { rawRadius: 8, targetRadius: 0, currentRadius: 0, - angle: 40 + angle: 60 } ) break diff --git a/StrategySpace/Workspace/FunctionLibraries/TaskFunctions.js b/StrategySpace/Workspace/FunctionLibraries/TaskFunctions.js new file mode 100644 index 000000000..72b48c1e3 --- /dev/null +++ b/StrategySpace/Workspace/FunctionLibraries/TaskFunctions.js @@ -0,0 +1,60 @@ +function newTaskFunctions () { + thisObject = { + runTask: runTask, + stopTask: stopTask, + runAllTasks: runAllTasks, + stopAllTasks: stopAllTasks + } + + return thisObject + + function runTask (node, functionLibraryProtocolNode) { + /* Check if it is possible to Run or not */ + if (node.bot === undefined) { return } + if (node.bot.processes.length === 0) { return } + + for (let i = 0; i < node.bot.processes.length; i++) { + let process = node.bot.processes[i] + process.payload.uiObject.play() + } + + node.payload.uiObject.play() + + let event = { + taskId: node.id, + definition: JSON.stringify(functionLibraryProtocolNode.getProtocolNode(node, false, true, true)) // <- We need to do this workaround in order no to send unescaped charactars to the taskManager. + } + systemEventHandler.raiseEvent('Task Manager', 'Run Task', event) + } + + function stopTask (node, functionLibraryProtocolNode) { + let event = { + taskId: node.id + } + systemEventHandler.raiseEvent('Task Manager', 'Stop Task', event) + + node.payload.uiObject.stop() + + if (node.bot === undefined) { return } + if (node.bot.processes.length === 0) { return } + + for (let i = 0; i < node.bot.processes.length; i++) { + let process = node.bot.processes[i] + process.payload.uiObject.stop() + } + } + + function runAllTasks (taskManager, functionLibraryProtocolNode) { + for (let i = 0; i < taskManager.tasks.length; i++) { + let node = taskManager.tasks[i] + runTask(node, functionLibraryProtocolNode) + } + } + + function stopAllTasks (taskManager, functionLibraryProtocolNode) { + for (let i = 0; i < taskManager.tasks.length; i++) { + let node = taskManager.tasks[i] + stopTask(node, functionLibraryProtocolNode) + } + } +} diff --git a/StrategySpace/Workspace/Workspace.js b/StrategySpace/Workspace/Workspace.js index bae8d1635..c13b961a9 100644 --- a/StrategySpace/Workspace/Workspace.js +++ b/StrategySpace/Workspace/Workspace.js @@ -45,6 +45,7 @@ function newWorkspace () { let functionLibraryPartsFromNodes = newPartsFromNodes() let functionLibraryProtocolNode = newProtocolNode() let functionLibraryWorkspaceNodes = newStringifyNode() + let functionLibraryTaskFunctions = newTaskFunctions() thisObject.nodeChildren = newNodeChildren() return thisObject @@ -222,40 +223,22 @@ function newWorkspace () { break case 'Run Task': { - /* Check if it is possible to Run or not */ - if (payload.node.bot === undefined) { return } - if (payload.node.bot.processes.length === 0) { return } - - for (let i = 0; i < payload.node.bot.processes.length; i++) { - let process = payload.node.bot.processes[i] - process.payload.uiObject.play() - } - - payload.uiObject.play() - - let event = { - taskId: payload.node.id, - definition: JSON.stringify(functionLibraryProtocolNode.getProtocolNode(payload.node, false, true, true)) // <- We need to do this workaround in order no to send unescaped charactars to the taskManager. - } - systemEventHandler.raiseEvent('Task Manager', 'Run Task', event) + functionLibraryTaskFunctions.runTask(payload.node, functionLibraryProtocolNode) } break case 'Stop Task': { - let event = { - taskId: payload.node.id - } - systemEventHandler.raiseEvent('Task Manager', 'Stop Task', event) - - payload.uiObject.stop() - - if (payload.node.bot === undefined) { return } - if (payload.node.bot.processes.length === 0) { return } - - for (let i = 0; i < payload.node.bot.processes.length; i++) { - let process = payload.node.bot.processes[i] - process.payload.uiObject.stop() - } + functionLibraryTaskFunctions.stopTask(payload.node, functionLibraryProtocolNode) + } + break + case 'Run All Tasks': + { + functionLibraryTaskFunctions.runAllTasks(payload.node, functionLibraryProtocolNode) + } + break + case 'Stop All Tasks': + { + functionLibraryTaskFunctions.stopAllTasks(payload.node, functionLibraryProtocolNode) } break case 'Add Task Manager': From 131f9d39f6b2a0c9bb8f6afd4899b7e46d2d1c10 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Wed, 11 Sep 2019 09:36:16 +0200 Subject: [PATCH 37/40] Progress bar Improved --- FloatingSpace/CircularProgressBar.js | 2 +- FloatingSpace/StrategyPart.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/FloatingSpace/CircularProgressBar.js b/FloatingSpace/CircularProgressBar.js index 373e2fe62..2bb3da856 100644 --- a/FloatingSpace/CircularProgressBar.js +++ b/FloatingSpace/CircularProgressBar.js @@ -60,7 +60,7 @@ function newCircularProgressBar () { function physics () { for (let i = 0; i < 60; i++) { - opacityCounters[i]-- + opacityCounters[i] = opacityCounters[i] - 2 if (opacityCounters[i] < 0) { opacityCounters[i] = 0 diff --git a/FloatingSpace/StrategyPart.js b/FloatingSpace/StrategyPart.js index d3d67d00f..a29d616cf 100644 --- a/FloatingSpace/StrategyPart.js +++ b/FloatingSpace/StrategyPart.js @@ -543,7 +543,7 @@ function newStrategyPart () { } function stop () { - setTimeout(removecircularProgressBar, 30000) + setTimeout(removecircularProgressBar, 90000) function removecircularProgressBar () { thisObject.circularProgressBar.finalize() thisObject.circularProgressBar = undefined From 028ac61f0d1074646034dd3b675d67cc56a238de Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Wed, 11 Sep 2019 17:03:58 +0200 Subject: [PATCH 38/40] Restart Button Improved --- CockpitSpace/RestartSimulation.js | 126 ++++++++++------------- FloatingSpace/StrategyPart.js | 4 +- FloatingSpace/StrategyPartConstructor.js | 2 +- 3 files changed, 55 insertions(+), 77 deletions(-) diff --git a/CockpitSpace/RestartSimulation.js b/CockpitSpace/RestartSimulation.js index 7d1ebab5e..68f669cb1 100644 --- a/CockpitSpace/RestartSimulation.js +++ b/CockpitSpace/RestartSimulation.js @@ -8,7 +8,7 @@ function newRestartSimulation () { visible: true, container: undefined, status: undefined, - restart: restart, + startOrStop: startOrStop, physics: physics, draw: draw, getContainer: getContainer, @@ -35,7 +35,9 @@ function newRestartSimulation () { let executionFocusExists = false let idleLabel = '' - let date = '' + let refreshCounter = 0 + let isRunning = false + let eventSubscriptionId return thisObject @@ -44,6 +46,8 @@ function newRestartSimulation () { thisObject.container.eventHandler.stopListening(selfMouseClickEventSubscriptionId) thisObject.container.eventHandler.stopListening(selfMouseNotOverEventSubscriptionId) + systemEventHandler.stopListening('Jason-Multi-Period', eventSubscriptionId) + thisObject.container.finalize() thisObject.container = undefined } @@ -58,11 +62,27 @@ function newRestartSimulation () { thisObject.status = 'Ready' - systemEventHandler.createEventHandler('Cockpit-Restart-Simulation') + systemEventHandler.createEventHandler('Cockpit-Restart-Button') + + /* + We will start listening to the event that is triggered when the simulation process finishes processing one day in the case + of daily files or the whole market in the case of market files. + */ + eventSubscriptionId = systemEventHandler.listenToEvent('Jason-Multi-Period', 'Status Report Updated', undefined, undefined, undefined, onEvent) + + function onEvent (message) { + refreshCounter++ + + if (refreshCounter === 3) { + refreshCounter = 0 + turnOffProductCards() + turnOnProductCards() + } + } } function getContainer (point, purpose) { - if (thisObject.visible !== true || thisObject.status !== 'Ready' || executionFocusExists === false) { return } + if (thisObject.visible !== true || (thisObject.status !== 'Ready' && thisObject.status !== 'Calculating') || executionFocusExists === false) { return } if (thisObject.container.frame.isThisPointHere(point, true) === true) { return thisObject.container @@ -84,17 +104,19 @@ function newRestartSimulation () { } function onMouseClick (event) { - restart() + startOrStop() } - async function restart () { + async function startOrStop () { try { - /* Processing the restart */ - thisObject.status = 'Saving' - let result = await canvas.strategySpace.strategizerGateway.saveToStrategyzer(getSimulationParams()) - if (result === true) { - if (window.canvasApp.executingAt === 'Local') { - if (idleLabel === 'RESTART LIVE TRADING') { + if (isRunning === false) { + thisObject.status = 'Saving' + let result = await canvas.strategySpace.strategizerGateway.saveToStrategyzer(getSimulationParams()) + if (result === false) { + thisObject.status = 'Error' + counterTillNextState = 500 + } else { + if (idleLabel === 'START LIVE TRADING') { callServer('', 'ResetLogsAndData', onSaved) function onSaved (err) { if (err.result === GLOBAL.DEFAULT_OK_RESPONSE.result) { @@ -103,26 +125,20 @@ function newRestartSimulation () { logger.write('[ERROR] Restart Simulation -> Can not delete Logs and Simulation data. err = ' + err.messsage) } } + systemEventHandler.raiseEvent('Cockpit-Restart-Button', 'Live-Trading Started') + } else { + systemEventHandler.raiseEvent('Cockpit-Restart-Button', 'Backstesting Started') } - systemEventHandler.raiseEvent('Cockpit-Restart-Simulation', 'Simulation Started') - - /* We will start listening to the event that is triggered when the simulation process finishes processing one day. */ - systemEventHandler.listenToEvent('Jason-Multi-Period', 'Status Report Updated', undefined, undefined, undefined, onEvent) - - function onEvent (message) { - date = message.event.lastProcessedDay - } - } else { - thisObject.status = 'Restarting' - await graphQlRestartSimulation(simulationParams) + thisObject.status = 'Calculating' + isRunning = true } - - thisObject.status = 'Calculating' - counterTillNextState = 500 } else { - thisObject.status = 'Error' - counterTillNextState = 500 + /* isRunning === true */ + systemEventHandler.raiseEvent('Cockpit-Restart-Button', 'Stop Requested') + isRunning = false + thisObject.status = 'Stopping' + counterTillNextState = 200 } } catch (err) { thisObject.status = 'Error' @@ -168,27 +184,11 @@ function newRestartSimulation () { case 'Saving': break - case 'Restarting': + case 'Calculating': break - case 'Calculating': - thisObject.status = 'Refreshing' - counterTillNextState = 150 - break - case 'Refreshing': - thisObject.status = 'Reviewing' - turnOffProductCards() - turnOnProductCards() - counterTillNextState = 150 - break - case 'Reviewing': - thisObject.status = '2nd Refresh' - counterTillNextState = 250 - break - case '2nd Refresh': + case 'Stopping': thisObject.status = 'Ready' - turnOffProductCards() - turnOnProductCards() break case 'Error': thisObject.status = 'Ready' @@ -202,7 +202,7 @@ function newRestartSimulation () { } function labelPhysics () { - idleLabel = 'RESTART SIMULATION' + idleLabel = 'START BACKTESTING' if (canvas.strategySpace.workspace.definition) { let definition = canvas.strategySpace.workspace.definition if (definition.personalData) { @@ -212,7 +212,7 @@ function newRestartSimulation () { if (exchangeAccount.keys) { if (exchangeAccount.keys.length > 0) { let key = exchangeAccount.keys[0] - idleLabel = 'RESTART LIVE TRADING' + idleLabel = 'START LIVE TRADING' } } } @@ -262,19 +262,10 @@ function newRestartSimulation () { case 'Saving': params.backgroundColor = UI_COLOR.GREY break - case 'Restarting': - params.backgroundColor = UI_COLOR.GREY - break - case 'Refreshing': - params.backgroundColor = UI_COLOR.GOLDEN_ORANGE - break case 'Calculating': params.backgroundColor = UI_COLOR.TITANIUM_YELLOW break - case 'Reviewing': - params.backgroundColor = UI_COLOR.GREY - break - case '2nd Refresh': + case 'Stopping': params.backgroundColor = UI_COLOR.GOLDEN_ORANGE break case 'Error': @@ -306,20 +297,11 @@ function newRestartSimulation () { case 'Saving': label = 'SAVING STRATEGIES CHANGES...' break - case 'Restarting': - label = 'RESTARTING TRADING ENGINE...' - break - case 'Refreshing': - label = 'RE-LOADING...' - break case 'Calculating': - label = 'CALCULATING...' + label = 'STOP CALCULATING' break - case 'Reviewing': - label = 'WAITING TO UPDATE...' - break - case '2nd Refresh': - label = 'UPDATING...' + case 'Stopping': + label = 'STOPPING...' break case 'Error': label = 'ERROR, RETRY LATER' @@ -332,10 +314,6 @@ function newRestartSimulation () { } labelPoint = thisObject.container.frame.frameThisPoint(labelPoint) - if (date !== '') { - label = date - } - browserCanvasContext.fillStyle = 'rgba(' + UI_COLOR.WHITE + ', ' + OPACITY + ')' browserCanvasContext.fillText(label, labelPoint.x, labelPoint.y) } diff --git a/FloatingSpace/StrategyPart.js b/FloatingSpace/StrategyPart.js index a29d616cf..1bbd10c08 100644 --- a/FloatingSpace/StrategyPart.js +++ b/FloatingSpace/StrategyPart.js @@ -23,7 +23,7 @@ function newStrategyPart () { play: play, stop: stop, setRunningStatus: setRunningStatus, - setNotcircularProgressBar: setNotcircularProgressBar, + setNotRunningStatus: setNotRunningStatus, getReadyToAttach: getReadyToAttach, showAvailabilityToAttach: showAvailabilityToAttach, highlight: highlight, @@ -561,7 +561,7 @@ function newStrategyPart () { runningCounter = 30 } - function setNotcircularProgressBar () { + function setNotRunningStatus () { canvas.strategySpace.workspace.definition = undefined thisObject.isRunning = false } diff --git a/FloatingSpace/StrategyPartConstructor.js b/FloatingSpace/StrategyPartConstructor.js index d63d3e9c8..04651ffc9 100644 --- a/FloatingSpace/StrategyPartConstructor.js +++ b/FloatingSpace/StrategyPartConstructor.js @@ -217,7 +217,7 @@ function newStrategyPartConstructor () { addLeftIcons(menuItemsInitialValues, floatingObject) menuItemsInitialValues.push( { - action: 'Run Trading System', + action: 'Run Definition', actionFunction: payload.uiObject.run, label: 'Run', visible: false, From c14b03a25b4f91ffd731e19c3580fa894ceeed57 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Thu, 12 Sep 2019 10:08:23 +0200 Subject: [PATCH 39/40] Backtests Tested and Running with events --- CockpitSpace/GraphQLRestartSimulation.js | 39 ------------------- .../FunctionLibraries/TaskFunctions.js | 4 +- Utilities.js | 18 +-------- 3 files changed, 4 insertions(+), 57 deletions(-) delete mode 100644 CockpitSpace/GraphQLRestartSimulation.js diff --git a/CockpitSpace/GraphQLRestartSimulation.js b/CockpitSpace/GraphQLRestartSimulation.js deleted file mode 100644 index fc42a3a66..000000000 --- a/CockpitSpace/GraphQLRestartSimulation.js +++ /dev/null @@ -1,39 +0,0 @@ - -async function graphQlRestartSimulation (simulationParams) { - try { - const accessToken = window.localStorage.getItem(LOGGED_IN_ACCESS_TOKEN_LOCAL_STORAGE_KEY) - - if (accessToken === null) { - throw new Error('Can not restart the simulation because the user is not logged in. ') - } - - const graphQLServer = await axios({ - url: window.canvasApp.graphQL.masterAppApiUrl, - method: 'post', - data: { - query: ` - mutation operations_RunSimulation( - $simulation: operations_SimulationInput) - { - operations_RunSimulation(simulation: $simulation) - } - `, - variables: { - simulation: simulationParams - } - }, - headers: { - authorization: 'Bearer ' + accessToken - } - }) - - if (graphQLServer.data.errors) { - console.log(graphQLServer.data.errors) - throw new Error(graphQLServer.data.errors[0].message) - } - } catch (err) { - console.log(err.stack) - throw new Error('There has been an error restarting the simulation. Error: ' + err.stack) - } -} - diff --git a/StrategySpace/Workspace/FunctionLibraries/TaskFunctions.js b/StrategySpace/Workspace/FunctionLibraries/TaskFunctions.js index 72b48c1e3..df729a1c3 100644 --- a/StrategySpace/Workspace/FunctionLibraries/TaskFunctions.js +++ b/StrategySpace/Workspace/FunctionLibraries/TaskFunctions.js @@ -22,6 +22,7 @@ function newTaskFunctions () { let event = { taskId: node.id, + taskName: node.name, definition: JSON.stringify(functionLibraryProtocolNode.getProtocolNode(node, false, true, true)) // <- We need to do this workaround in order no to send unescaped charactars to the taskManager. } systemEventHandler.raiseEvent('Task Manager', 'Run Task', event) @@ -29,7 +30,8 @@ function newTaskFunctions () { function stopTask (node, functionLibraryProtocolNode) { let event = { - taskId: node.id + taskId: node.id, + taskName: node.name } systemEventHandler.raiseEvent('Task Manager', 'Stop Task', event) diff --git a/Utilities.js b/Utilities.js index 17f0dba24..1639bdb62 100644 --- a/Utilities.js +++ b/Utilities.js @@ -7,25 +7,9 @@ function getSimulationParams () { let timePeriodArray = timePeriodsMasterArray[currentTimePeriod.filePeriodIndex] let timePeriod = timePeriodArray[currentTimePeriod.timePeriodIndex][1] - let timePeriodDailyArray = [] - let timePeriodMarketArray = [] - - switch (currentTimePeriod.filePeriodIndex) { - case 0: { - timePeriodMarketArray.push(timePeriod) - break - } - case 1: { - timePeriodDailyArray.push(timePeriod) - break - } - } - let simulationParams = { beginDatetime: dateAtScreenCorner.valueOf(), - resumeExecution: false, - timePeriodDailyArray: timePeriodDailyArray, - timePeriodMarketArray: timePeriodMarketArray, + timePeriod: timePeriod, timestamp: (new Date()).valueOf() } From 7e369c722b846ea466920f5a2497df9bcf84f751 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Thu, 12 Sep 2019 13:02:02 +0200 Subject: [PATCH 40/40] Sending the Definition via Events Part 1 --- CockpitSpace/RestartSimulation.js | 18 +++++++++++++++--- StrategySpace/StrategizerGateway.js | 2 +- StrategySpace/Workspace/Workspace.js | 6 +++--- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/CockpitSpace/RestartSimulation.js b/CockpitSpace/RestartSimulation.js index 68f669cb1..98e7eb14e 100644 --- a/CockpitSpace/RestartSimulation.js +++ b/CockpitSpace/RestartSimulation.js @@ -73,7 +73,7 @@ function newRestartSimulation () { function onEvent (message) { refreshCounter++ - if (refreshCounter === 3) { + if (refreshCounter === 1) { refreshCounter = 0 turnOffProductCards() turnOnProductCards() @@ -125,9 +125,15 @@ function newRestartSimulation () { logger.write('[ERROR] Restart Simulation -> Can not delete Logs and Simulation data. err = ' + err.messsage) } } - systemEventHandler.raiseEvent('Cockpit-Restart-Button', 'Live-Trading Started') + let event = { + definition: getDefinition() + } + systemEventHandler.raiseEvent('Cockpit-Restart-Button', 'Live-Trading Started', event) } else { - systemEventHandler.raiseEvent('Cockpit-Restart-Button', 'Backstesting Started') + let event = { + definition: getDefinition() + } + systemEventHandler.raiseEvent('Cockpit-Restart-Button', 'Backstesting Started', event) } thisObject.status = 'Calculating' @@ -146,6 +152,12 @@ function newRestartSimulation () { } } + function getDefinition () { + let definitionNode = canvas.strategySpace.workspace.getProtocolDefinitionNode() + definitionNode.simulationParams = getSimulationParams() + return JSON.stringify(definitionNode) + } + function turnOffProductCards () { let productCardsToTurnOff = ['Trading-Simulation', 'Simulation-Conditions', 'Simulation-Strategies', 'Simulation-Trades', 'Live Trading History'] for (let i = 0; i < canvas.panelsSpace.panels.length; i++) { diff --git a/StrategySpace/StrategizerGateway.js b/StrategySpace/StrategizerGateway.js index 1fb458ec8..b623990b4 100644 --- a/StrategySpace/StrategizerGateway.js +++ b/StrategySpace/StrategizerGateway.js @@ -108,7 +108,7 @@ function newStrategizerGateway () { return } - let tradingSystem = canvas.strategySpace.workspace.getProtocolTradingSystem() + let tradingSystem = canvas.strategySpace.workspace.getProtocolDefinitionNode() if (tradingSystem === undefined || tradingSystem === null) { logger.write('[ERROR] saveToStrategyzer -> Can not save when tradingSystem is null or undefined.') return diff --git a/StrategySpace/Workspace/Workspace.js b/StrategySpace/Workspace/Workspace.js index c13b961a9..dae445530 100644 --- a/StrategySpace/Workspace/Workspace.js +++ b/StrategySpace/Workspace/Workspace.js @@ -11,7 +11,7 @@ function newWorkspace () { enabled: false, nodeChildren: undefined, onMenuItemClick: onMenuItemClick, - getProtocolTradingSystem: getProtocolTradingSystem, + getProtocolDefinitionNode: getProtocolDefinitionNode, physics: physics, spawn: spawn, detachNode: detachNode, @@ -98,8 +98,8 @@ function newWorkspace () { } } - function getProtocolTradingSystem () { - return functionLibraryProtocolNode.getProtocolNode(thisObject.definition) + function getProtocolDefinitionNode () { + return functionLibraryProtocolNode.getProtocolNode(thisObject.definition, false, true, true) // <- We need to do this workaround in order no to send unescaped charactars through a system event. } function detachNode (node) {