From 336c3b8d5b61047fd3f25485e8bc6ff002d0383c Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Wed, 29 May 2019 12:07:39 +0200 Subject: [PATCH] Initial Stop and Take Profit Implemented --- FloatingSpace/StrategyPart.js | 6 +- FloatingSpace/StrategyPartConstructor.js | 16 +++- .../FunctionLibraries/NodeDeleter.js | 7 +- .../FunctionLibraries/PartsFromNodes.js | 82 ++++++++++++++++--- .../FunctionLibraries/ProtocolNode.js | 4 +- .../FunctionLibraries/WorkspaceNode.js | 2 + 6 files changed, 98 insertions(+), 19 deletions(-) diff --git a/FloatingSpace/StrategyPart.js b/FloatingSpace/StrategyPart.js index 391a38295..96f4b66d6 100644 --- a/FloatingSpace/StrategyPart.js +++ b/FloatingSpace/StrategyPart.js @@ -219,11 +219,11 @@ function newStrategyPart () { compatibleSubType = undefined break case 'Stop': - compatibleType = 'Manage Stage' + compatibleType = 'Manage Stage' + '.' + 'Initial Definition' compatibleSubType = undefined break case 'Take Profit': - compatibleType = 'Manage Stage' + compatibleType = 'Manage Stage' + '.' + 'Initial Definition' compatibleSubType = undefined break case 'Phase': @@ -239,7 +239,7 @@ function newStrategyPart () { compatibleSubType = undefined break case 'Situation': - compatibleType = 'Phase' + '.' + 'Take Position Event' + '.' + 'Trigger On Event' + '.' + 'Trigger Off Event' + compatibleType = 'Take Position Event' + '.' + 'Trigger On Event' + '.' + 'Trigger Off Event' + '.' + 'Next Phase Event' compatibleSubType = undefined break case 'Condition': diff --git a/FloatingSpace/StrategyPartConstructor.js b/FloatingSpace/StrategyPartConstructor.js index e4748786b..a2eacd2be 100644 --- a/FloatingSpace/StrategyPartConstructor.js +++ b/FloatingSpace/StrategyPartConstructor.js @@ -738,6 +738,18 @@ function newStrategyPartConstructor () { currentRadius: 0, angle: 135 }, + { + action: 'Add Missing Items', + actionFunction: payload.onMenuItemClick, + label: 'Add Missing Items', + visible: false, + iconPathOn: 'target', + iconPathOff: 'trash', + rawRadius: 8, + targetRadius: 0, + currentRadius: 0, + angle: -40 + }, { action: 'Delete Initial Definition', actionFunction: payload.onMenuItemClick, @@ -748,7 +760,7 @@ function newStrategyPartConstructor () { rawRadius: 8, targetRadius: 0, currentRadius: 0, - angle: -20 + angle: 0 }, { action: 'Download', @@ -760,7 +772,7 @@ function newStrategyPartConstructor () { rawRadius: 8, targetRadius: 0, currentRadius: 0, - angle: 20 + angle: 40 }] break } diff --git a/StrategySpace/Workspace/FunctionLibraries/NodeDeleter.js b/StrategySpace/Workspace/FunctionLibraries/NodeDeleter.js index 33fa7372d..9ed435656 100644 --- a/StrategySpace/Workspace/FunctionLibraries/NodeDeleter.js +++ b/StrategySpace/Workspace/FunctionLibraries/NodeDeleter.js @@ -143,7 +143,12 @@ function newNodeDeleter () { } else { completeDeletion(node, rootNodes) } - + if (node.stopLoss !== undefined) { + deleteManagedItem(node.stopLoss) + } + if (node.takeProfit !== undefined) { + deleteManagedItem(node.takeProfit) + } destroyPart(node) cleanNode(node) } diff --git a/StrategySpace/Workspace/FunctionLibraries/PartsFromNodes.js b/StrategySpace/Workspace/FunctionLibraries/PartsFromNodes.js index 65d872b6c..581a83c8a 100644 --- a/StrategySpace/Workspace/FunctionLibraries/PartsFromNodes.js +++ b/StrategySpace/Workspace/FunctionLibraries/PartsFromNodes.js @@ -102,6 +102,13 @@ function newPartsFromNodes () { } case 'Initial Definition': { createPart('Initial Definition', node.name, node, parentNode, chainParent, 'Initial Definition') + + if (node.triggerOff !== undefined) { + createPartFromNode(node.triggerOff, stage, stage) + } + if (node.takePosition !== undefined) { + createPartFromNode(node.takePosition, stage, stage) + } return } case 'Take Position Event': { @@ -218,7 +225,16 @@ function newPartsFromNodes () { } }, openStage: { - initialDefinition: {} + initialDefinition: { + stopLoss: { + phases: [], + maxPhases: 1 + }, + takeProfit: { + phases: [], + maxPhases: 1 + } + } }, manageStage: { stopLoss: { @@ -244,6 +260,8 @@ function newPartsFromNodes () { createPart('Initial Definition', '', strategy.openStage.initialDefinition, strategy.openStage, strategy.openStage) createPart('Stop', '', strategy.manageStage.stopLoss, strategy.manageStage, strategy.manageStage) createPart('Take Profit', '', strategy.manageStage.takeProfit, strategy.manageStage, strategy.manageStage) + 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) } function addMissingStages (node) { @@ -267,10 +285,20 @@ function newPartsFromNodes () { if (node.openStage === undefined) { node.openStage = { initialDefinition: { + stopLoss: { + phases: [], + maxPhases: 1 + }, + takeProfit: { + phases: [], + maxPhases: 1 + } } } createPart('Open Stage', '', node.openStage, node, node, 'Open Stage') createPart('Initial Definition', '', node.openStage.initialDefinition, node.openStage, node.openStage) + createPart('Stop', 'Initial Stop', node.openStage.initialDefinition.stopLoss, node.openStage.initialDefinition, node.openStage.initialDefinition) + createPart('Take Profit', 'Initial Take Profit', node.openStage.initialDefinition.takeProfit, node.openStage.initialDefinition, node.openStage.initialDefinition) } if (node.manageStage === undefined) { node.manageStage = { @@ -312,24 +340,52 @@ function newPartsFromNodes () { } function addMissingItems (node) { - if (node.stopLoss === undefined) { - node.stopLoss = { - phases: [] + if (node.type === 'Initial Definition') { + if (node.stopLoss === undefined) { + node.stopLoss = { + phases: [], + maxPhases: 1 + } + createPart('Stop', 'Initial Stop', node.stopLoss, node, node) } - createPart('Stop', '', node.stopLoss, node, node) - } - if (node.takeProfit === undefined) { - node.takeProfit = { - phases: [] + if (node.takeProfit === undefined) { + node.takeProfit = { + phases: [], + maxPhases: 1 + } + createPart('Take Profit', 'Initial Take Profit', node.takeProfit, node, node) + } + } else { + if (node.stopLoss === undefined) { + node.stopLoss = { + phases: [] + } + createPart('Stop', '', node.stopLoss, node, node) + } + if (node.takeProfit === undefined) { + node.takeProfit = { + phases: [] + } + createPart('Take Profit', '', node.takeProfit, node, node) } - createPart('Take Profit', '', node.takeProfit, node, node) } } function addInitialDefinition (node) { if (node.initialDefinition === undefined) { - node.initialDefinition = {} + node.initialDefinition = { + stopLoss: { + phases: [], + maxPhases: 1 + }, + takeProfit: { + phases: [], + maxPhases: 1 + } + } createPart('Initial Definition', '', node.initialDefinition, node, node) + createPart('Stop', 'Initial Stop', node.initialDefinition.stopLoss, node.initialDefinition, node.initialDefinition) + createPart('Take Profit', 'Initial Take Profit', node.initialDefinition.takeProfit, node.initialDefinition, node.initialDefinition) } } @@ -362,7 +418,9 @@ function newPartsFromNodes () { let phase = { name: 'New Phase', formula: {}, - nextPhaseEvent: {} + nextPhaseEvent: { + situations: [] + } } phaseParent.phases.push(phase) let phaseChainParent diff --git a/StrategySpace/Workspace/FunctionLibraries/ProtocolNode.js b/StrategySpace/Workspace/FunctionLibraries/ProtocolNode.js index c6e0cbcb8..5ff9f18cd 100644 --- a/StrategySpace/Workspace/FunctionLibraries/ProtocolNode.js +++ b/StrategySpace/Workspace/FunctionLibraries/ProtocolNode.js @@ -149,7 +149,9 @@ function newProtocolNode () { let object = { type: node.type, subType: node.subType, - name: node.name + name: node.name, + stopLoss: getProtocolNode(node.stopLoss), + takeProfit: getProtocolNode(node.takeProfit) } return object } diff --git a/StrategySpace/Workspace/FunctionLibraries/WorkspaceNode.js b/StrategySpace/Workspace/FunctionLibraries/WorkspaceNode.js index 8dc406836..366b64f29 100644 --- a/StrategySpace/Workspace/FunctionLibraries/WorkspaceNode.js +++ b/StrategySpace/Workspace/FunctionLibraries/WorkspaceNode.js @@ -173,6 +173,8 @@ function newWorkspaceNode () { type: node.type, subType: node.subType, name: node.name, + stopLoss: getWorkspaceNode(node.stopLoss), + takeProfit: getWorkspaceNode(node.takeProfit), savedPayload: getSavedPayload(node) } return object