From 90cc2a06909d199c101b0d89284c08092afd4bc1 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sun, 6 Oct 2019 11:39:24 +0200 Subject: [PATCH] Bug Fixes and Default Definition Concept Completely erradicated --- StrategySpace/StrategizerGateway.js | 77 +---------- .../FunctionLibraries/ProtocolNode.js | 123 ++++++++++++++++++ .../FunctionLibraries/SessionFunctions.js | 37 +++++- StrategySpace/Workspace/Workspace.js | 5 - Utilities.js | 17 --- 5 files changed, 157 insertions(+), 102 deletions(-) diff --git a/StrategySpace/StrategizerGateway.js b/StrategySpace/StrategizerGateway.js index efde1d0eb..bcf8644bb 100644 --- a/StrategySpace/StrategizerGateway.js +++ b/StrategySpace/StrategizerGateway.js @@ -8,8 +8,7 @@ function newStrategizerGateway () { idAtStrategizer: undefined, strategizerData: undefined, container: undefined, - loadFromStrategyzer: loadFromStrategyzer, - saveToStrategyzer: saveToStrategyzer + loadFromStrategyzer: loadFromStrategyzer } let colletionItems = [] @@ -92,77 +91,5 @@ function newStrategizerGateway () { } catch (err) { logger.write('[ERROR] loadFromStrategyzer -> err = ' + err.stack) } - } - - async function saveToStrategyzer (uiCurrentValues) { - try { - const accessToken = window.localStorage.getItem(LOGGED_IN_ACCESS_TOKEN_LOCAL_STORAGE_KEY) - if (accessToken === null) { - logger.write('[ERROR] saveToStrategyzer -> Can not save because the accessToken is missing.') - return - } - - let user = window.localStorage.getItem(LOGGED_IN_USER_LOCAL_STORAGE_KEY) - if (user === null) { - logger.write('[ERROR] saveToStrategyzer -> Can not save because user is not logged in. ') - return - } - - 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 - } - - if (window.canvasApp.executingAt === 'Local') { - tradingSystem.uiCurrentValues = uiCurrentValues - callServer(JSON.stringify(tradingSystem), 'SaveDefinition', onSaved) - function onSaved (err) { - if (err.result === GLOBAL.DEFAULT_OK_RESPONSE.result) { - return true - } else { - logger.write('[ERROR] saveToStrategyzer -> Can not save definition to local server. err = ' + err.messsage) - return false - } - } - return true // TODO: Here we will always show that the saving works even if it does not. We need to fix this at some point in time. - } else { - user = JSON.parse(user) - - graphQLServer = await axios({ - url: window.canvasApp.graphQL.masterAppApiUrl, - method: 'post', - data: { - query: ` - mutation strategizer_EditTradingSystem - ( - $id: ID!, $data: strategizer_JSON! - ) - { - strategizer_EditTradingSystem(id: $id, tradingSystem: { data: $data }) - { - id - } - } - `, - variables: { - id: idAtStrategizer, - data: tradingSystem - } - }, - headers: { - authorization: 'Bearer ' + accessToken - } - }) - - if (graphQLServer.data.errors) { - logger.write('[ERROR] saveToStrategyzer -> GraphsQL Error -> graphQLServer.data.errors = ' + JSON.stringify(graphQLServer.data.errors)) - } - - return true - } - } catch (err) { - logger.write('[ERROR] saveToStrategyzer -> err = ' + err.stack) - } - } + } } diff --git a/StrategySpace/Workspace/FunctionLibraries/ProtocolNode.js b/StrategySpace/Workspace/FunctionLibraries/ProtocolNode.js index f06950f71..1e1bdb1fc 100644 --- a/StrategySpace/Workspace/FunctionLibraries/ProtocolNode.js +++ b/StrategySpace/Workspace/FunctionLibraries/ProtocolNode.js @@ -15,6 +15,9 @@ function newProtocolNode () { name: node.name, code: node.code } + if (includeIds) { + code.id = node.id + } return code } case 'Condition': @@ -25,6 +28,9 @@ function newProtocolNode () { name: node.name, code: getProtocolNode(node.code, removePersonalData, parseJSONStrings, includeIds) } + if (includeIds) { + condition.id = node.id + } return condition } case 'Situation': { @@ -39,6 +45,9 @@ function newProtocolNode () { let condition = getProtocolNode(node.conditions[m], removePersonalData, parseJSONStrings, includeIds) situation.conditions.push(condition) } + if (includeIds) { + situation.id = node.id + } return situation } case 'Formula': @@ -49,6 +58,9 @@ function newProtocolNode () { name: node.name, code: node.code } + if (includeIds) { + formula.id = node.id + } return formula } case 'Next Phase Event': @@ -63,6 +75,9 @@ function newProtocolNode () { let situation = getProtocolNode(node.situations[m], removePersonalData, parseJSONStrings, includeIds) event.situations.push(situation) } + if (includeIds) { + event.id = node.id + } return event } case 'Phase': { @@ -73,6 +88,9 @@ function newProtocolNode () { formula: getProtocolNode(node.formula, removePersonalData, parseJSONStrings, includeIds), nextPhaseEvent: getProtocolNode(node.nextPhaseEvent, removePersonalData, parseJSONStrings, includeIds) } + if (includeIds) { + phase.id = node.id + } return phase } case 'Stop': { @@ -87,6 +105,9 @@ function newProtocolNode () { let phase = getProtocolNode(node.phases[m], removePersonalData, parseJSONStrings, includeIds) stop.phases.push(phase) } + if (includeIds) { + stop.id = node.id + } return stop } case 'Take Profit': { @@ -101,6 +122,9 @@ function newProtocolNode () { let phase = getProtocolNode(node.phases[m], removePersonalData, parseJSONStrings, includeIds) takeProfit.phases.push(phase) } + if (includeIds) { + takeProfit.id = node.id + } return takeProfit } case 'Take Position Event': { @@ -115,6 +139,9 @@ function newProtocolNode () { let situation = getProtocolNode(node.situations[m], removePersonalData, parseJSONStrings, includeIds) event.situations.push(situation) } + if (includeIds) { + event.id = node.id + } return event } case 'Trigger On Event': { @@ -129,6 +156,9 @@ function newProtocolNode () { let situation = getProtocolNode(node.situations[m], removePersonalData, parseJSONStrings, includeIds) event.situations.push(situation) } + if (includeIds) { + event.id = node.id + } return event } case 'Trigger Off Event': { @@ -143,6 +173,9 @@ function newProtocolNode () { let situation = getProtocolNode(node.situations[m], removePersonalData, parseJSONStrings, includeIds) event.situations.push(situation) } + if (includeIds) { + event.id = node.id + } return event } case 'Initial Definition': { @@ -155,6 +188,9 @@ function newProtocolNode () { positionSize: getProtocolNode(node.positionSize, removePersonalData, parseJSONStrings, includeIds), positionRate: getProtocolNode(node.positionRate, removePersonalData, parseJSONStrings, includeIds) } + if (includeIds) { + object.id = node.id + } return object } case 'Open Execution': { @@ -163,6 +199,9 @@ function newProtocolNode () { subType: node.subType, name: node.name } + if (includeIds) { + object.id = node.id + } return object } case 'Close Execution': { @@ -171,6 +210,9 @@ function newProtocolNode () { subType: node.subType, name: node.name } + if (includeIds) { + object.id = node.id + } return object } case 'Position Size': { @@ -180,6 +222,9 @@ function newProtocolNode () { name: node.name, formula: getProtocolNode(node.formula, removePersonalData, parseJSONStrings, includeIds) } + if (includeIds) { + object.id = node.id + } return object } case 'Position Rate': { @@ -189,6 +234,9 @@ function newProtocolNode () { name: node.name, formula: getProtocolNode(node.formula, removePersonalData, parseJSONStrings, includeIds) } + if (includeIds) { + object.id = node.id + } return object } case 'Trigger Stage': { @@ -200,6 +248,9 @@ function newProtocolNode () { triggerOff: getProtocolNode(node.triggerOff, removePersonalData, parseJSONStrings, includeIds), takePosition: getProtocolNode(node.takePosition, removePersonalData, parseJSONStrings, includeIds) } + if (includeIds) { + stage.id = node.id + } return stage } case 'Open Stage': { @@ -210,6 +261,9 @@ function newProtocolNode () { initialDefinition: getProtocolNode(node.initialDefinition, removePersonalData, parseJSONStrings, includeIds), openExecution: getProtocolNode(node.openExecution, removePersonalData, parseJSONStrings, includeIds) } + if (includeIds) { + stage.id = node.id + } return stage } case 'Manage Stage': { @@ -220,6 +274,9 @@ function newProtocolNode () { stopLoss: getProtocolNode(node.stopLoss, removePersonalData, parseJSONStrings, includeIds), takeProfit: getProtocolNode(node.takeProfit, removePersonalData, parseJSONStrings, includeIds) } + if (includeIds) { + stage.id = node.id + } return stage } case 'Close Stage': { @@ -229,6 +286,9 @@ function newProtocolNode () { name: node.name, closeExecution: getProtocolNode(node.closeExecution, removePersonalData, parseJSONStrings, includeIds) } + if (includeIds) { + stage.id = node.id + } return stage } case 'Strategy': { @@ -241,6 +301,9 @@ function newProtocolNode () { manageStage: getProtocolNode(node.manageStage, removePersonalData, parseJSONStrings, includeIds), closeStage: getProtocolNode(node.closeStage, removePersonalData, parseJSONStrings, includeIds) } + if (includeIds) { + strategy.id = node.id + } return strategy } case 'Base Asset': { @@ -250,6 +313,9 @@ function newProtocolNode () { name: node.name, code: node.code } + if (includeIds) { + object.id = node.id + } return object } case 'Time Range': { @@ -259,6 +325,9 @@ function newProtocolNode () { name: node.name, code: node.code } + if (includeIds) { + object.id = node.id + } return object } case 'Time Period': { @@ -268,6 +337,9 @@ function newProtocolNode () { name: node.name, code: node.code } + if (includeIds) { + object.id = node.id + } return object } case 'Slippage': { @@ -277,6 +349,9 @@ function newProtocolNode () { name: node.name, code: node.code } + if (includeIds) { + object.id = node.id + } return object } case 'Fee Structure': { @@ -286,6 +361,9 @@ function newProtocolNode () { name: node.name, code: node.code } + if (includeIds) { + object.id = node.id + } return object } case 'Parameters': { @@ -299,6 +377,9 @@ function newProtocolNode () { slippage: getProtocolNode(node.slippage, removePersonalData, parseJSONStrings, includeIds), feeStructure: getProtocolNode(node.feeStructure, removePersonalData, parseJSONStrings, includeIds) } + if (includeIds) { + object.id = node.id + } return object } case 'Trading System': { @@ -314,6 +395,9 @@ function newProtocolNode () { let strategy = getProtocolNode(node.strategies[m], removePersonalData, parseJSONStrings, includeIds) tradingSystem.strategies.push(strategy) } + if (includeIds) { + tradingSystem.id = node.id + } return tradingSystem } case 'Personal Data': { @@ -329,6 +413,9 @@ function newProtocolNode () { let exchangeAccount = getProtocolNode(node.exchangeAccounts[m], removePersonalData, parseJSONStrings, includeIds) personalData.exchangeAccounts.push(exchangeAccount) } + if (includeIds) { + personalData.id = node.id + } return personalData } case 'Exchange Account': { @@ -349,6 +436,9 @@ function newProtocolNode () { let key = getProtocolNode(node.keys[m], removePersonalData, parseJSONStrings, includeIds) exchangeAccount.keys.push(key) } + if (includeIds) { + exchangeAccount.id = node.id + } return exchangeAccount } case 'Exchange Account Asset': { @@ -358,6 +448,9 @@ function newProtocolNode () { subType: node.subType, name: node.name } + if (includeIds) { + asset.id = node.id + } return asset } case 'Exchange Account Key': { @@ -368,6 +461,9 @@ function newProtocolNode () { name: node.name, code: node.code } + if (includeIds) { + key.id = node.id + } return key } case 'Task Manager': { @@ -382,6 +478,9 @@ function newProtocolNode () { let task = getProtocolNode(node.tasks[m], removePersonalData, parseJSONStrings, includeIds) taskManager.tasks.push(task) } + if (includeIds) { + taskManager.id = node.id + } return taskManager } case 'Task': { @@ -394,6 +493,9 @@ function newProtocolNode () { if (includeIds) { object.id = node.id } + if (includeIds) { + object.id = node.id + } return object } case 'Sensor': { @@ -408,6 +510,9 @@ function newProtocolNode () { let process = getProtocolNode(node.processes[m], removePersonalData, parseJSONStrings, includeIds) bot.processes.push(process) } + if (includeIds) { + bot.id = node.id + } return bot } case 'Indicator': { @@ -422,6 +527,9 @@ function newProtocolNode () { let process = getProtocolNode(node.processes[m], removePersonalData, parseJSONStrings, includeIds) bot.processes.push(process) } + if (includeIds) { + bot.id = node.id + } return bot } case 'Trading Engine': { @@ -436,6 +544,9 @@ function newProtocolNode () { let process = getProtocolNode(node.processes[m], removePersonalData, parseJSONStrings, includeIds) bot.processes.push(process) } + if (includeIds) { + bot.id = node.id + } return bot } case 'Process': { @@ -504,6 +615,9 @@ function newProtocolNode () { if (includeIds) { object.id = node.id } + if (includeIds) { + object.id = node.id + } return object } @@ -520,6 +634,9 @@ function newProtocolNode () { object.taskManagers.push(taskManager) } } + if (includeIds) { + object.id = node.id + } return object } case 'Network': { @@ -535,6 +652,9 @@ function newProtocolNode () { object.networkNodes.push(networkNode) } } + if (includeIds) { + object.id = node.id + } return object } case 'Definition': { @@ -546,6 +666,9 @@ function newProtocolNode () { personalData: getProtocolNode(node.personalData, removePersonalData, parseJSONStrings, includeIds), network: getProtocolNode(node.network, removePersonalData, parseJSONStrings, includeIds) } + if (includeIds) { + object.id = node.id + } return object } } diff --git a/StrategySpace/Workspace/FunctionLibraries/SessionFunctions.js b/StrategySpace/Workspace/FunctionLibraries/SessionFunctions.js index 01537425a..790fe292b 100644 --- a/StrategySpace/Workspace/FunctionLibraries/SessionFunctions.js +++ b/StrategySpace/Workspace/FunctionLibraries/SessionFunctions.js @@ -22,18 +22,45 @@ function newSessionFunctions () { let key = node.name + '-' + node.type + '-' + node.id + let thisNodeDefinition = getDefinition(node) + if (thisNodeDefinition === undefined) { return } + /* Raise event to run the session */ let event = { session: JSON.stringify(functionLibraryProtocolNode.getProtocolNode(node, false, false, true)), - definition: getDefinition() + definition: JSON.stringify(functionLibraryProtocolNode.getProtocolNode(thisNodeDefinition, false, true, true)), + uiCurrentValues: getUICurrentValues() } systemEventHandler.raiseEvent(key, 'Run Session', event) - function getDefinition () { - let definitionNode = canvas.strategySpace.workspace.getProtocolDefinitionNode() - definitionNode.uiCurrentValues = getUICurrentValues() - return JSON.stringify(definitionNode) + function getDefinition (node) { + if (node.type === 'Definition') { + return node + } + + if (node.payload.parentNode !== undefined) { + return getDefinition(node.payload.parentNode) + } else { + return + } + } + + function getUICurrentValues () { + let dateAtScreenCorner = new Date(window.localStorage.getItem('Date @ Screen Corner')) + let currentTimePeriod = JSON.parse(window.localStorage.getItem('Current Time Period')) + + let timePeriodsMasterArray = [marketFilesPeriods, dailyFilePeriods] + let timePeriodArray = timePeriodsMasterArray[currentTimePeriod.filePeriodIndex] + let timePeriod = timePeriodArray[currentTimePeriod.timePeriodIndex][1] + + let uiCurrentValues = { + initialDatetime: dateAtScreenCorner, + timePeriod: timePeriod, + timestamp: (new Date()).valueOf() + } + + return uiCurrentValues } } diff --git a/StrategySpace/Workspace/Workspace.js b/StrategySpace/Workspace/Workspace.js index ec05aeb38..0e2515055 100644 --- a/StrategySpace/Workspace/Workspace.js +++ b/StrategySpace/Workspace/Workspace.js @@ -13,7 +13,6 @@ function newWorkspace () { nodeChildren: undefined, stopAllRunningTasks: stopAllRunningTasks, onMenuItemClick: onMenuItemClick, - getProtocolDefinitionNode: getProtocolDefinitionNode, physics: physics, spawn: spawn, detachNode: detachNode, @@ -102,10 +101,6 @@ function newWorkspace () { } } - 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) { functionLibraryAttachDetach.detachNode(node, thisObject.workspaceNode.rootNodes) } diff --git a/Utilities.js b/Utilities.js index 4ff33d663..a72310054 100644 --- a/Utilities.js +++ b/Utilities.js @@ -1,21 +1,4 @@ -function getUICurrentValues () { - let dateAtScreenCorner = new Date(window.localStorage.getItem('Date @ Screen Corner')) - let currentTimePeriod = JSON.parse(window.localStorage.getItem('Current Time Period')) - - let timePeriodsMasterArray = [marketFilesPeriods, dailyFilePeriods] - let timePeriodArray = timePeriodsMasterArray[currentTimePeriod.filePeriodIndex] - let timePeriod = timePeriodArray[currentTimePeriod.timePeriodIndex][1] - - let uiCurrentValues = { - initialDatetime: dateAtScreenCorner, - timePeriod: timePeriod, - timestamp: (new Date()).valueOf() - } - - return uiCurrentValues -} - function transformThisPoint (point, container) { /* We make the point relative to the current frame */