From f6928ce39a3b86078715f8085628d09e27ac8b21 Mon Sep 17 00:00:00 2001 From: Philip Love Date: Thu, 4 Nov 2021 03:04:09 -0400 Subject: [PATCH] Lots Schema Stuff; Added to Network; More Functions refactoring --- PM_changes | 13 +- .../App-Schema/dynamic-indicators.json | 2 +- .../App-Schema/exchange-portfolio-tasks.json | 75 ++++++++++ .../Schemas/App-Schema/fee-structure.json | 2 +- .../Schemas/App-Schema/heartbeats.json | 2 +- .../Schemas/App-Schema/lan-network-node.json | 16 ++ .../App-Schema/live-portfolio-session.json | 115 ++++++++++++++ .../App-Schema/market-portfolio-tasks.json | 76 ++++++++++ .../App-Schema/portfolio-bot-instance.json | 37 +++++ .../portfolio-engine-reference.json | 27 ++++ .../App-Schema/portfolio-mine-tasks.json | 75 ++++++++++ .../App-Schema/portfolio-parameters.json | 85 +++++++++++ .../portfolio-process-instance.json | 62 ++++++++ .../portfolio-system-reference.json | 27 ++++ .../production-portfolio-tasks.json | 67 +++++++++ .../App-Schema/project-portfolio-tasks.json | 75 ++++++++++ .../App-Schema/session-base-asset.json | 2 +- .../App-Schema/session-quoted-asset.json | 2 +- .../Schemas/App-Schema/slippage.json | 2 +- .../Schemas/App-Schema/snapshots.json | 2 +- .../Schemas/App-Schema/task-manager.json | 2 +- .../Foundations/Schemas/App-Schema/task.json | 15 ++ .../Schemas/App-Schema/time-frame.json | 2 +- .../Schemas/App-Schema/time-range.json | 2 +- .../App-Schema/user-defined-parameters.json | 2 +- .../TS/Process-Modules/StatusReport.js | 6 +- .../ChartingSpaceFunctions.js | 97 ++++++++++-- .../CryptoEcosystemFunctions.js | 140 +++++++++++++++++- .../UI/Function-Libraries/ProductFunctions.js | 73 +++++++++ .../Function-Libraries/UiObjectsFromNodes.js | 46 +++++- 30 files changed, 1114 insertions(+), 35 deletions(-) create mode 100644 Projects/Foundations/Schemas/App-Schema/exchange-portfolio-tasks.json create mode 100644 Projects/Foundations/Schemas/App-Schema/live-portfolio-session.json create mode 100644 Projects/Foundations/Schemas/App-Schema/market-portfolio-tasks.json create mode 100644 Projects/Foundations/Schemas/App-Schema/portfolio-bot-instance.json create mode 100644 Projects/Foundations/Schemas/App-Schema/portfolio-engine-reference.json create mode 100644 Projects/Foundations/Schemas/App-Schema/portfolio-mine-tasks.json create mode 100644 Projects/Foundations/Schemas/App-Schema/portfolio-parameters.json create mode 100644 Projects/Foundations/Schemas/App-Schema/portfolio-process-instance.json create mode 100644 Projects/Foundations/Schemas/App-Schema/portfolio-system-reference.json create mode 100644 Projects/Foundations/Schemas/App-Schema/production-portfolio-tasks.json create mode 100644 Projects/Foundations/Schemas/App-Schema/project-portfolio-tasks.json diff --git a/PM_changes b/PM_changes index c676c675b..e27af9751 100644 --- a/PM_changes +++ b/PM_changes @@ -46,10 +46,12 @@ Projects/Foundations/UI/Function-Libraries/ ActionSwitch.js: cp case statements run-all, stop-all, add-missing, references, products, etc. Line 506 && 512 may not need to have been cloned but I did for now - regarding live and paper trading. - + ChartingSpaceFunctions.js: Needs Completion to include Portfolio at Charting Space. + 'Market Trading|Portfolio Tasks' -> 'nodeType' as param. <= If error arises note that it was not configured this way by Luis when adding the Learning Mine. This is a File that could be heavily re-factored && optimized. + ProductFunctions.js: Skipping: - Projects/Foundatoins/UI/Function-Libraries/ChartingSpaceFunctions.js + Projects/Foundations/UI/Function-Libraries/ChartingSpaceFunctions.js: Needs Completion Projects/Foundations/UI/Function-Libraries/CryptoEcosystemFunctions.js Projects/Foundations/UI/Function-Libraries/ @@ -72,7 +74,14 @@ Projects/Foundations/UI/Spaces/ /Panel-Space/Layer.js: Line 173 Only 'Live Portfolio Session' Projects/Visual-Scripting/UI/Function-Libraries/ +<<<<<<< Updated upstream ActionsSwitch.js: *** NOTE: Not sure how to handle line 14 at the current moment. *** + UiObjectsFromNodes.js: only if(uiObjectType === 'Live Portfolio Session') +======= + ActionsSwitch.js: + NodePath.js*** NOTE: Not sure how to handle line 14 at the current moment. *** + UIObjectsFromNodes.js: Line 977 'Live Portfolio Session' only. +>>>>>>> Stashed changes Skipping: Projects/Foundations/UI/Spaces/Floating-Space/ConditionEditor.js diff --git a/Projects/Foundations/Schemas/App-Schema/dynamic-indicators.json b/Projects/Foundations/Schemas/App-Schema/dynamic-indicators.json index fd4f25e27..36193a763 100644 --- a/Projects/Foundations/Schemas/App-Schema/dynamic-indicators.json +++ b/Projects/Foundations/Schemas/App-Schema/dynamic-indicators.json @@ -23,7 +23,7 @@ "addLeftIcons": true, "level": 3, "attachingRules": { - "compatibleTypes": "->Trading System->" + "compatibleTypes": "->Trading System->Portfolio System->" }, "propertyNameAtParent": "dynamicIndicators", "childrenNodesProperties": [ diff --git a/Projects/Foundations/Schemas/App-Schema/exchange-portfolio-tasks.json b/Projects/Foundations/Schemas/App-Schema/exchange-portfolio-tasks.json new file mode 100644 index 000000000..17511a7b5 --- /dev/null +++ b/Projects/Foundations/Schemas/App-Schema/exchange-portfolio-tasks.json @@ -0,0 +1,75 @@ +{ + "type": "Exchange Portfolio Tasks", + "menuItems": [ + { + "action": "Run All Market Portfolio Tasks", + "label": "Run All Market Portfolio Tasks", + "askConfirmation": true, + "confirmationLabel": "Confirm to Run", + "workDoneLabel": "Run Request Sent", + "iconPathOn": "run", + "iconPathOff": "run", + "actionFunction": "payload.executeAction" + }, + { + "action": "Stop All Market Portfolio Tasks", + "label": "Stop All Market Portfolio Tasks", + "askConfirmation": true, + "confirmationLabel": "Confirm to Stop", + "workDoneLabel": "Stop Request Sent", + "iconPathOn": "stop", + "iconPathOff": "stop", + "actionFunction": "payload.executeAction" + }, + { + "action": "Add UI Object", + "label": "Add Market Portfolio Tasks", + "relatedUiObject": "Market Portfolio Tasks", + "actionFunction": "payload.executeAction", + "actionProject": "Visual-Scripting", + "relatedUiObjectProject": "Foundations" + }, + { + "action": "Add Missing Market Portfolio Tasks", + "label": "Add Missing Markets", + "askConfirmation": true, + "confirmationLabel": "Confirm to Proceed", + "workDoneLabel": "Done", + "relatedUiObject": "Market Portfolio Tasks", + "actionFunction": "payload.executeAction", + "relatedUiObjectProject": "Foundations" + }, + { + "action": "Delete UI Object", + "actionProject": "Visual-Scripting", + "askConfirmation": true, + "confirmationLabel": "Confirm to Delete", + "label": "Delete", + "iconPathOn": "delete-entity", + "iconPathOff": "delete-entity", + "actionFunction": "payload.executeAction" + } + ], + "addLeftIcons": true, + "level": 2, + "referencingRules": { + "compatibleTypes": "->Crypto Exchange->" + }, + "attachingRules": { + "compatibleTypes": "->Project Portfolio Tasks->" + }, + "alternativeIcons": "Use Reference Parent", + "title": [ + "Use Reference Parent" + ], + "isTitleAllwaysVisible": true, + "propertyNameAtParent": "exchangePortfolioTasks", + "childrenNodesProperties": [ + { + "name": "marketPortfolioTasks", + "type": "array", + "childType": "Market Portfolio Tasks", + "monitorChildrenRunning": true + } + ] +} \ No newline at end of file diff --git a/Projects/Foundations/Schemas/App-Schema/fee-structure.json b/Projects/Foundations/Schemas/App-Schema/fee-structure.json index d906ed451..c4990e58e 100644 --- a/Projects/Foundations/Schemas/App-Schema/fee-structure.json +++ b/Projects/Foundations/Schemas/App-Schema/fee-structure.json @@ -28,7 +28,7 @@ }, "level": 3, "attachingRules": { - "compatibleTypes": "->Trading Parameters->" + "compatibleTypes": "->Trading Parameters->Portfolio Parameters->" }, "propertyNameAtParent": "feeStructure" } \ No newline at end of file diff --git a/Projects/Foundations/Schemas/App-Schema/heartbeats.json b/Projects/Foundations/Schemas/App-Schema/heartbeats.json index 93fb66c5c..f228c31ea 100644 --- a/Projects/Foundations/Schemas/App-Schema/heartbeats.json +++ b/Projects/Foundations/Schemas/App-Schema/heartbeats.json @@ -28,7 +28,7 @@ }, "level": 3, "attachingRules": { - "compatibleTypes": "->Trading Parameters->Learning Parameters->" + "compatibleTypes": "->Trading Parameters->Portfolio Parameters->Learning Parameters->" }, "propertyNameAtParent": "heartbeats" } \ No newline at end of file diff --git a/Projects/Foundations/Schemas/App-Schema/lan-network-node.json b/Projects/Foundations/Schemas/App-Schema/lan-network-node.json index 3a9d1aa25..df213c903 100644 --- a/Projects/Foundations/Schemas/App-Schema/lan-network-node.json +++ b/Projects/Foundations/Schemas/App-Schema/lan-network-node.json @@ -49,6 +49,16 @@ "actionProject": "Visual-Scripting", "relatedUiObjectProject": "Foundations" }, + { + "action": "Add UI Object", + "disableIfPropertyIsDefined": true, + "propertyToCheckFor": "productionPortfolioTasks", + "label": "Add Production Portfolio Tasks", + "relatedUiObject": "Production Portfolio Tasks", + "actionFunction": "payload.executeAction", + "actionProject": "Visual-Scripting", + "relatedUiObjectProject": "Foundations" + }, { "action": "Add UI Object", "disableIfPropertyIsDefined": true, @@ -107,6 +117,12 @@ "childType": "Production Trading Tasks", "autoAdd": true }, + { + "name": "productionPortfolioTasks", + "type": "node", + "childType": "Production Portfolio Tasks", + "autoAdd": true + }, { "name": "dataStorage", "type": "node", diff --git a/Projects/Foundations/Schemas/App-Schema/live-portfolio-session.json b/Projects/Foundations/Schemas/App-Schema/live-portfolio-session.json new file mode 100644 index 000000000..9c18dda1c --- /dev/null +++ b/Projects/Foundations/Schemas/App-Schema/live-portfolio-session.json @@ -0,0 +1,115 @@ +{ + "type": "Live Portfolio Session", + "menuItems": [ + { + "action": "Run Portfolio Session", + "label": "Run", + "workingLabel": "Run Request Sent", + "workDoneLabel": "Session Running", + "workFailedLabel": "Session Cannot be Run", + "secondaryAction": "Stop Portfolio Session", + "secondaryLabel": "Stop", + "secondaryWorkingLabel": "Stopping...", + "secondaryWorkDoneLabel": "Session Stopped", + "secondaryWorkFailedLabel": "Session Cannot be Stopped", + "secondaryIcon": "stop", + "iconPathOn": "run", + "iconPathOff": "run", + "actionFunction": "payload.executeAction", + "actionProject": "Portfolio-Management" + }, + { + "action": "Resume Portfolio Session", + "label": "Resume", + "workingLabel": "Resume Request Sent", + "workDoneLabel": "Session Running", + "workFailedLabel": "Session Cannot be Resumed", + "secondaryAction": "Stop Portfolio Session", + "secondaryLabel": "Stop", + "secondaryWorkingLabel": "Stopping...", + "secondaryWorkDoneLabel": "Session Stopped", + "secondaryWorkFailedLabel": "Session Cannot be Stopped", + "secondaryIcon": "stop", + "iconPathOn": "resume", + "iconPathOff": "resume", + "actionFunction": "payload.executeAction", + "actionProject": "Portfolio-Management" + }, + { + "action": "Configure", + "label": "Configure", + "iconPathOn": "configuration", + "iconPathOff": "configuration", + "dontShowAtFullscreen": true, + "actionFunction": "uiObject.configEditor.activate" + }, + { + "action": "Add UI Object", + "label": "Add Social Bots", + "relatedUiObject": "Social Bots", + "actionFunction": "payload.executeAction", + "relatedUiObjectProject": "Social-Bots", + "actionProject": "Visual-Scripting" + }, + { + "action": "Add Missing Children", + "label": "Add Missing Children", + "relatedUiObject": "Portfolio Parameters", + "actionFunction": "payload.executeAction", + "actionProject": "Visual-Scripting", + "relatedUiObjectProject": "Foundations" + }, + { + "action": "Delete UI Object", + "actionProject": "Visual-Scripting", + "askConfirmation": true, + "confirmationLabel": "Confirm to Delete", + "label": "Delete", + "iconPathOn": "delete-entity", + "iconPathOff": "delete-entity", + "actionFunction": "payload.executeAction" + } + ], + "isTitleAllwaysVisible": true, + "addLeftIcons": true, + "editors": { + "config": true + }, + "initialValues": { + "config": "{ \n\"folderName\": \"Your-Session-Folder-Name\"\n}" + }, + "level": 2, + "referencingRules": { + "compatibleTypes": "->Portfolio System->" + }, + "attachingRules": { + "compatibleTypes": "->Portfolio Process Instance->" + }, + "childrenNodesProperties": [ + { + "name": "portfolioParameters", + "type": "node", + "childType": "Portfolio Parameters", + "autoAdd": true + }, + { + "name": "portfolioSystemReference", + "type": "node", + "childType": "Portfolio System Reference", + "autoAdd": true + }, + { + "name": "portfolioEngineReference", + "type": "node", + "childType": "Portfolio Engine Reference", + "autoAdd": true + }, + { + "name": "socialBots", + "type": "node", + "childType": "Social Bots", + "project": "Social-Bots" + } + ], + "propertyNameAtParent": "session" +} \ No newline at end of file diff --git a/Projects/Foundations/Schemas/App-Schema/market-portfolio-tasks.json b/Projects/Foundations/Schemas/App-Schema/market-portfolio-tasks.json new file mode 100644 index 000000000..b3cebeadf --- /dev/null +++ b/Projects/Foundations/Schemas/App-Schema/market-portfolio-tasks.json @@ -0,0 +1,76 @@ +{ + "type": "Market Portfolio Tasks", + "menuItems": [ + { + "action": "Run All Portfolio Mine Tasks", + "label": "Run All Portfolio Mine Tasks", + "askConfirmation": true, + "confirmationLabel": "Confirm to Run", + "workDoneLabel": "Run Request Sent", + "iconPathOn": "run", + "iconPathOff": "run", + "actionFunction": "payload.executeAction" + }, + { + "action": "Stop All Portfolio Mine Tasks", + "label": "Stop All Portfolio Mine Tasks", + "askConfirmation": true, + "confirmationLabel": "Confirm to Stop", + "workDoneLabel": "Stop Request Sent", + "iconPathOn": "stop", + "iconPathOff": "stop", + "actionFunction": "payload.executeAction" + }, + { + "action": "Add UI Object", + "label": "Add Portfolio Mine Tasks", + "relatedUiObject": "Portfolio Mine Tasks", + "actionFunction": "payload.executeAction", + "actionProject": "Visual-Scripting", + "relatedUiObjectProject": "Foundations" + }, + { + "action": "Add Missing Portfolio Mine Tasks", + "label": "Add Missing Portfolio Mine Tasks", + "askConfirmation": true, + "confirmationLabel": "Confirm to Proceed", + "workDoneLabel": "Done", + "relatedUiObject": "Portfolio Mine Tasks", + "actionFunction": "payload.executeAction", + "relatedUiObjectProject": "Foundations" + }, + { + "action": "Delete UI Object", + "actionProject": "Visual-Scripting", + "askConfirmation": true, + "confirmationLabel": "Confirm to Delete", + "label": "Delete", + "iconPathOn": "delete-entity", + "iconPathOff": "delete-entity", + "actionFunction": "payload.executeAction" + } + ], + "addLeftIcons": true, + "level": 2, + "referencingRules": { + "compatibleTypes": "->Market->" + }, + "attachingRules": { + "compatibleTypes": "->Exchange Portfolio Tasks->" + }, + "alternativeIcons": "Use Reference Parent", + "title": [ + "Use Reference Parent Parent Parent", + "Use Reference Parent" + ], + "isTitleAllwaysVisible": true, + "propertyNameAtParent": "marketPortfolioTasks", + "childrenNodesProperties": [ + { + "name": "portfolioMineTasks", + "type": "array", + "childType": "Portfolio Mine Tasks", + "monitorChildrenRunning": true + } + ] +} \ No newline at end of file diff --git a/Projects/Foundations/Schemas/App-Schema/portfolio-bot-instance.json b/Projects/Foundations/Schemas/App-Schema/portfolio-bot-instance.json new file mode 100644 index 000000000..c50cd8e0c --- /dev/null +++ b/Projects/Foundations/Schemas/App-Schema/portfolio-bot-instance.json @@ -0,0 +1,37 @@ +{ + "type": "Portfolio Bot Instance", + "menuItems": [ + { + "action": "Add UI Object", + "label": "Add Process Instance", + "relatedUiObject": "Portfolio Process Instance", + "actionFunction": "payload.executeAction", + "actionProject": "Visual-Scripting", + "relatedUiObjectProject": "Foundations" + }, + { + "action": "Delete UI Object", + "actionProject": "Visual-Scripting", + "askConfirmation": true, + "confirmationLabel": "Confirm to Delete", + "label": "Delete", + "iconPathOn": "delete-entity", + "iconPathOff": "delete-entity", + "actionFunction": "payload.executeAction" + } + ], + "addLeftIcons": true, + "level": 3, + "attachingRules": { + "compatibleTypes": "->Task->" + }, + "childrenNodesProperties": [ + { + "name": "processes", + "type": "array", + "childType": "Portfolio Process Instance", + "autoAdd": false + } + ], + "propertyNameAtParent": "bot" +} \ No newline at end of file diff --git a/Projects/Foundations/Schemas/App-Schema/portfolio-engine-reference.json b/Projects/Foundations/Schemas/App-Schema/portfolio-engine-reference.json new file mode 100644 index 000000000..aabcabc2d --- /dev/null +++ b/Projects/Foundations/Schemas/App-Schema/portfolio-engine-reference.json @@ -0,0 +1,27 @@ +{ + "type": "Portfolio Engine Reference", + "menuItems": [ + { + "action": "Delete UI Object", +"actionProject": "Visual-Scripting", + "askConfirmation": true, + "confirmationLabel": "Confirm to Delete", + "label": "Delete", + "iconPathOn": "delete-entity", + "iconPathOff": "delete-entity", + "actionFunction": "payload.executeAction" + } + ], + "title": [ + "Use Reference Parent" + ], + "addLeftIcons": true, + "level": 2, + "attachingRules": { + "compatibleTypes": "->Live Portfolio Session->" + }, + "referencingRules": { + "compatibleTypes": "->Portfolio Engine->" + }, + "propertyNameAtParent": "portfolioEngineReference" +} \ No newline at end of file diff --git a/Projects/Foundations/Schemas/App-Schema/portfolio-mine-tasks.json b/Projects/Foundations/Schemas/App-Schema/portfolio-mine-tasks.json new file mode 100644 index 000000000..ad54daa3c --- /dev/null +++ b/Projects/Foundations/Schemas/App-Schema/portfolio-mine-tasks.json @@ -0,0 +1,75 @@ +{ + "type": "Portfolio Mine Tasks", + "menuItems": [ + { + "action": "Run All Task Managers", + "label": "Run All Task Managers", + "askConfirmation": true, + "confirmationLabel": "Confirm to Run", + "workDoneLabel": "Run Request Sent", + "iconPathOn": "run", + "iconPathOff": "run", + "actionFunction": "payload.executeAction" + }, + { + "action": "Stop All Task Managers", + "label": "Stop All Task Managers", + "askConfirmation": true, + "confirmationLabel": "Confirm to Stop", + "workDoneLabel": "Stop Request Sent", + "iconPathOn": "stop", + "iconPathOff": "stop", + "actionFunction": "payload.executeAction" + }, + { + "action": "Add UI Object", + "label": "Add Task Manager", + "relatedUiObject": "Task Manager", + "actionFunction": "payload.executeAction", + "actionProject": "Visual-Scripting", + "relatedUiObjectProject": "Foundations" + }, + { + "action": "Add All Tasks", + "label": "Add All Tasks", + "askConfirmation": true, + "confirmationLabel": "Confirm to Proceed", + "workDoneLabel": "Done", + "relatedUiObject": "Task", + "actionFunction": "payload.executeAction", + "relatedUiObjectProject": "Foundations" + }, + { + "action": "Delete UI Object", + "actionProject": "Visual-Scripting", + "askConfirmation": true, + "confirmationLabel": "Confirm to Delete", + "label": "Delete", + "iconPathOn": "delete-entity", + "iconPathOff": "delete-entity", + "actionFunction": "payload.executeAction" + } + ], + "addLeftIcons": true, + "level": 2, + "referencingRules": { + "compatibleTypes": "->Portfolio Mine->" + }, + "attachingRules": { + "compatibleTypes": "->Market Portfolio Tasks->" + }, + "alternativeIcons": "Use Reference Parent", + "title": [ + "Use Reference Parent" + ], + "isTitleAllwaysVisible": true, + "propertyNameAtParent": "portfolioMineTasks", + "childrenNodesProperties": [ + { + "name": "taskManagers", + "type": "array", + "childType": "Task Manager", + "monitorChildrenRunning": true + } + ] +} \ No newline at end of file diff --git a/Projects/Foundations/Schemas/App-Schema/portfolio-parameters.json b/Projects/Foundations/Schemas/App-Schema/portfolio-parameters.json new file mode 100644 index 000000000..91918cb61 --- /dev/null +++ b/Projects/Foundations/Schemas/App-Schema/portfolio-parameters.json @@ -0,0 +1,85 @@ +{ + "type": "Portfolio Parameters", + "menuItems": [ + { + "action": "Add Missing Children", + "label": "Add Missing Parameters", + "relatedUiObject": "Portfolio Parameters", + "actionFunction": "payload.executeAction", + "actionProject": "Visual-Scripting", + "relatedUiObjectProject": "Foundations" + }, + { + "action": "Delete UI Object", + "actionProject": "Visual-Scripting", + "askConfirmation": true, + "confirmationLabel": "Confirm to Delete", + "label": "Delete", + "iconPathOn": "delete-entity", + "iconPathOff": "delete-entity", + "actionFunction": "payload.executeAction" + } + ], + "addLeftIcons": true, + "level": 2, + "attachingRules": { + "compatibleTypes": "->Live Portfolio Session->" + }, + "childrenNodesProperties": [ + { + "name": "sessionBaseAsset", + "type": "node", + "childType": "Session Base Asset", + "autoAdd": true + }, + { + "name": "sessionQuotedAsset", + "type": "node", + "childType": "Session Quoted Asset", + "autoAdd": true + }, + { + "name": "timeRange", + "type": "node", + "childType": "Time Range", + "autoAdd": true + }, + { + "name": "timeFrame", + "type": "node", + "childType": "Time Frame", + "autoAdd": true + }, + { + "name": "slippage", + "type": "node", + "childType": "Slippage", + "autoAdd": true + }, + { + "name": "feeStructure", + "type": "node", + "childType": "Fee Structure", + "autoAdd": true + }, + { + "name": "snapshots", + "type": "node", + "childType": "Snapshots", + "autoAdd": true + }, + { + "name": "heartbeats", + "type": "node", + "childType": "Heartbeats", + "autoAdd": true + }, + { + "name": "userDefinedParameters", + "type": "node", + "childType": "User Defined Parameters", + "autoAdd": true + } + ], + "propertyNameAtParent": "portfolioParameters" +} \ No newline at end of file diff --git a/Projects/Foundations/Schemas/App-Schema/portfolio-process-instance.json b/Projects/Foundations/Schemas/App-Schema/portfolio-process-instance.json new file mode 100644 index 000000000..dc2ac49d2 --- /dev/null +++ b/Projects/Foundations/Schemas/App-Schema/portfolio-process-instance.json @@ -0,0 +1,62 @@ +{ + "type": "Portfolio Process Instance", + "menuItems": [ + { + "action": "Add UI Object", + "disableIfPropertyIsDefined": true, + "propertyToCheckFor": "session", + "label": "Add Live Portfolio Session", + "relatedUiObject": "Live Portfolio Session", + "actionFunction": "payload.executeAction", + "actionProject": "Visual-Scripting", + "relatedUiObjectProject": "Foundations" + }, + { + "action": "Add UI Object", + "disableIfPropertyIsDefined": true, + "propertyToCheckFor": "executionStartedEvent", + "label": "Add Execution Started Event", + "relatedUiObject": "Execution Started Event", + "actionFunction": "payload.executeAction", + "actionProject": "Visual-Scripting", + "relatedUiObjectProject": "Foundations" + }, + { + "action": "Delete UI Object", + "actionProject": "Visual-Scripting", + "askConfirmation": true, + "confirmationLabel": "Confirm to Delete", + "label": "Delete", + "iconPathOn": "delete-entity", + "iconPathOff": "delete-entity", + "actionFunction": "payload.executeAction" + } + ], + "isTitleAllwaysVisible": true, + "title": [ + "Use Reference Parent Parent", + "Use Reference Parent" + ], + "addLeftIcons": true, + "level": 2, + "referencingRules": { + "compatibleTypes": "->Process Definition->" + }, + "attachingRules": { + "compatibleTypes": "->Portfolio Bot Instance->" + }, + "childrenNodesProperties": [ + { + "name": "session", + "type": "node", + "childType": "Live Portfolio Session" + }, + { + "name": "executionStartedEvent", + "type": "node", + "childType": "Execution Started Event", + "autoAdd": false + } + ], + "propertyNameAtParent": "processes" +} \ No newline at end of file diff --git a/Projects/Foundations/Schemas/App-Schema/portfolio-system-reference.json b/Projects/Foundations/Schemas/App-Schema/portfolio-system-reference.json new file mode 100644 index 000000000..30c41a05e --- /dev/null +++ b/Projects/Foundations/Schemas/App-Schema/portfolio-system-reference.json @@ -0,0 +1,27 @@ +{ + "type": "Portfolio System Reference", + "menuItems": [ + { + "action": "Delete UI Object", +"actionProject": "Visual-Scripting", + "askConfirmation": true, + "confirmationLabel": "Confirm to Delete", + "label": "Delete", + "iconPathOn": "delete-entity", + "iconPathOff": "delete-entity", + "actionFunction": "payload.executeAction" + } + ], + "title": [ + "Use Reference Parent" + ], + "addLeftIcons": true, + "level": 2, + "attachingRules": { + "compatibleTypes": "->Live Portfolio Session->" + }, + "referencingRules": { + "compatibleTypes": "->Portfolio System->" + }, + "propertyNameAtParent": "portfolioSystemReference" +} \ No newline at end of file diff --git a/Projects/Foundations/Schemas/App-Schema/production-portfolio-tasks.json b/Projects/Foundations/Schemas/App-Schema/production-portfolio-tasks.json new file mode 100644 index 000000000..c8e4cd687 --- /dev/null +++ b/Projects/Foundations/Schemas/App-Schema/production-portfolio-tasks.json @@ -0,0 +1,67 @@ +{ + "type": "Production Portfolio Tasks", + "menuItems": [ + { + "action": "Run All Project Portfolio Tasks", + "label": "Run All Project Portfolio Tasks", + "askConfirmation": true, + "confirmationLabel": "Confirm to Run", + "workDoneLabel": "Run Request Sent", + "iconPathOn": "run", + "iconPathOff": "run", + "actionFunction": "payload.executeAction" + }, + { + "action": "Stop All Project Portfolio Tasks", + "label": "Stop All Project Portfolio Tasks", + "askConfirmation": true, + "confirmationLabel": "Confirm to Stop", + "workDoneLabel": "Stop Request Sent", + "iconPathOn": "stop", + "iconPathOff": "stop", + "actionFunction": "payload.executeAction" + }, + { + "action": "Add UI Object", + "label": "Add Project Portfolio Tasks", + "relatedUiObject": "Project Portfolio Tasks", + "actionFunction": "payload.executeAction", + "actionProject": "Visual-Scripting", + "relatedUiObjectProject": "Foundations" + }, + { + "action": "Add Missing Project Portfolio Tasks", + "label": "Add Missing Projects", + "askConfirmation": true, + "confirmationLabel": "Confirm to Proceed", + "workDoneLabel": "Done", + "relatedUiObject": "Project Portfolio Tasks", + "actionFunction": "payload.executeAction", + "relatedUiObjectProject": "Foundations" + }, + { + "action": "Delete UI Object", + "actionProject": "Visual-Scripting", + "askConfirmation": true, + "confirmationLabel": "Confirm to Delete", + "label": "Delete", + "iconPathOn": "delete-entity", + "iconPathOff": "delete-entity", + "actionFunction": "payload.executeAction" + } + ], + "addLeftIcons": true, + "level": 0, + "attachingRules": { + "compatibleTypes": "->LAN Network Node->" + }, + "propertyNameAtParent": "productionPortfolioTasks", + "childrenNodesProperties": [ + { + "name": "projectPortfolioTasks", + "type": "array", + "childType": "Project Portfolio Tasks", + "monitorChildrenRunning": true + } + ] +} \ No newline at end of file diff --git a/Projects/Foundations/Schemas/App-Schema/project-portfolio-tasks.json b/Projects/Foundations/Schemas/App-Schema/project-portfolio-tasks.json new file mode 100644 index 000000000..fa9dcb775 --- /dev/null +++ b/Projects/Foundations/Schemas/App-Schema/project-portfolio-tasks.json @@ -0,0 +1,75 @@ +{ + "type": "Project Portfolio Tasks", + "menuItems": [ + { + "action": "Run All Exchange Portfolio Tasks", + "label": "Run All Exchange Portfolio Tasks", + "askConfirmation": true, + "confirmationLabel": "Confirm to Run", + "workDoneLabel": "Run Request Sent", + "iconPathOn": "run", + "iconPathOff": "run", + "actionFunction": "payload.executeAction" + }, + { + "action": "Stop All Exchange Portfolio Tasks", + "label": "Stop All Exchange Portfolio Tasks", + "askConfirmation": true, + "confirmationLabel": "Confirm to Stop", + "workDoneLabel": "Stop Request Sent", + "iconPathOn": "stop", + "iconPathOff": "stop", + "actionFunction": "payload.executeAction" + }, + { + "action": "Add UI Object", + "label": "Add Exchange Portfolio Tasks", + "relatedUiObject": "Exchange Portfolio Tasks", + "actionFunction": "payload.executeAction", + "actionProject": "Visual-Scripting", + "relatedUiObjectProject": "Foundations" + }, + { + "action": "Add Missing Exchange Portfolio Tasks", + "label": "Add Missing Exchanges", + "askConfirmation": true, + "confirmationLabel": "Confirm to Proceed", + "workDoneLabel": "Done", + "relatedUiObject": "Exchange Portfolio Tasks", + "actionFunction": "payload.executeAction", + "relatedUiObjectProject": "Foundations" + }, + { + "action": "Delete UI Object", + "actionProject": "Visual-Scripting", + "askConfirmation": true, + "confirmationLabel": "Confirm to Delete", + "label": "Delete", + "iconPathOn": "delete-entity", + "iconPathOff": "delete-entity", + "actionFunction": "payload.executeAction" + } + ], + "title": [ + "Use Reference Parent" + ], + "alternativeIcons": "Use Reference Parent Parent", + "addLeftIcons": true, + "level": 2, + "referencingRules": { + "compatibleTypes": "->Project Definition->" + }, + "attachingRules": { + "compatibleTypes": "->Testing Portfolio Tasks->Production Portfolio Tasks->" + }, + "propertyNameAtParent": "projectPortfolioTasks", + "childrenNodesProperties": [ + { + "name": "exchangePortfolioTasks", + "type": "array", + "childType": "Exchange Portfolio Tasks", + "monitorChildrenRunning": true + } + ], + "icon": "bitcoin" +} \ No newline at end of file diff --git a/Projects/Foundations/Schemas/App-Schema/session-base-asset.json b/Projects/Foundations/Schemas/App-Schema/session-base-asset.json index 179fbb177..e22c95b02 100644 --- a/Projects/Foundations/Schemas/App-Schema/session-base-asset.json +++ b/Projects/Foundations/Schemas/App-Schema/session-base-asset.json @@ -32,7 +32,7 @@ "compatibleTypes": "->Exchange Account Asset->" }, "attachingRules": { - "compatibleTypes": "->Trading Parameters->" + "compatibleTypes": "->Trading Parameters->Portfolio Parameters->" }, "alternativeIcons": "Use Reference Grandparent", "title": [ diff --git a/Projects/Foundations/Schemas/App-Schema/session-quoted-asset.json b/Projects/Foundations/Schemas/App-Schema/session-quoted-asset.json index 7a9f1ebaf..b8928686f 100644 --- a/Projects/Foundations/Schemas/App-Schema/session-quoted-asset.json +++ b/Projects/Foundations/Schemas/App-Schema/session-quoted-asset.json @@ -32,7 +32,7 @@ "compatibleTypes": "->Exchange Account Asset->" }, "attachingRules": { - "compatibleTypes": "->Trading Parameters->" + "compatibleTypes": "->Trading Parameters->Portfolio Parameters->" }, "alternativeIcons": "Use Reference Grandparent", "title": [ diff --git a/Projects/Foundations/Schemas/App-Schema/slippage.json b/Projects/Foundations/Schemas/App-Schema/slippage.json index df58ed3a0..36696ecff 100644 --- a/Projects/Foundations/Schemas/App-Schema/slippage.json +++ b/Projects/Foundations/Schemas/App-Schema/slippage.json @@ -28,7 +28,7 @@ }, "level": 3, "attachingRules": { - "compatibleTypes": "->Trading Parameters->" + "compatibleTypes": "->Trading Parameters->Portfolio Parameters->" }, "propertyNameAtParent": "slippage" } \ No newline at end of file diff --git a/Projects/Foundations/Schemas/App-Schema/snapshots.json b/Projects/Foundations/Schemas/App-Schema/snapshots.json index af7598826..4205783d4 100644 --- a/Projects/Foundations/Schemas/App-Schema/snapshots.json +++ b/Projects/Foundations/Schemas/App-Schema/snapshots.json @@ -28,7 +28,7 @@ }, "level": 3, "attachingRules": { - "compatibleTypes": "->Trading Parameters->" + "compatibleTypes": "->Trading Parameters->Portfolio Parameters->" }, "propertyNameAtParent": "snapshots" } \ No newline at end of file diff --git a/Projects/Foundations/Schemas/App-Schema/task-manager.json b/Projects/Foundations/Schemas/App-Schema/task-manager.json index 299039fc6..65b1bcca2 100644 --- a/Projects/Foundations/Schemas/App-Schema/task-manager.json +++ b/Projects/Foundations/Schemas/App-Schema/task-manager.json @@ -43,7 +43,7 @@ "addLeftIcons": true, "level": 2, "attachingRules": { - "compatibleTypes": "->Data Mine Tasks->Trading Mine Tasks->Learning Mine Tasks->" + "compatibleTypes": "->Data Mine Tasks->Trading Mine Tasks->Portfolio Mine Tasks->Learning Mine Tasks->" }, "childrenNodesProperties": [ { diff --git a/Projects/Foundations/Schemas/App-Schema/task.json b/Projects/Foundations/Schemas/App-Schema/task.json index c13b68202..c25cd5ed7 100644 --- a/Projects/Foundations/Schemas/App-Schema/task.json +++ b/Projects/Foundations/Schemas/App-Schema/task.json @@ -67,6 +67,16 @@ "actionProject": "Visual-Scripting", "relatedUiObjectProject": "Foundations" }, + { + "action": "Add UI Object", + "disableIfPropertyIsDefined": true, + "propertyToCheckFor": "bot", + "label": "Add Portfolio Bot Instance", + "relatedUiObject": "Portfolio Bot Instance", + "actionFunction": "payload.executeAction", + "actionProject": "Visual-Scripting", + "relatedUiObjectProject": "Foundations" + }, { "action": "Add UI Object", "disableIfPropertyIsDefined": true, @@ -110,6 +120,11 @@ "type": "node", "childType": "Trading Bot Instance" }, + { + "name": "bot", + "type": "node", + "childType": "Portfolio Bot Instance" + }, { "name": "bot", "type": "node", diff --git a/Projects/Foundations/Schemas/App-Schema/time-frame.json b/Projects/Foundations/Schemas/App-Schema/time-frame.json index 765294fc2..481697d84 100644 --- a/Projects/Foundations/Schemas/App-Schema/time-frame.json +++ b/Projects/Foundations/Schemas/App-Schema/time-frame.json @@ -28,7 +28,7 @@ }, "level": 3, "attachingRules": { - "compatibleTypes": "->Trading Parameters->Learning Parameters->" + "compatibleTypes": "->Trading Parameters->Portfolio Parameters->Learning Parameters->" }, "propertyNameAtParent": "timeFrame" } \ No newline at end of file diff --git a/Projects/Foundations/Schemas/App-Schema/time-range.json b/Projects/Foundations/Schemas/App-Schema/time-range.json index 77ee3147b..29ba3fd7a 100644 --- a/Projects/Foundations/Schemas/App-Schema/time-range.json +++ b/Projects/Foundations/Schemas/App-Schema/time-range.json @@ -28,7 +28,7 @@ }, "level": 3, "attachingRules": { - "compatibleTypes": "->Trading Parameters->Learning Parameters->" + "compatibleTypes": "->Trading Parameters->Portfolio Parameters->Learning Parameters->" }, "propertyNameAtParent": "timeRange" } \ No newline at end of file diff --git a/Projects/Foundations/Schemas/App-Schema/user-defined-parameters.json b/Projects/Foundations/Schemas/App-Schema/user-defined-parameters.json index e707a811f..c15041c13 100644 --- a/Projects/Foundations/Schemas/App-Schema/user-defined-parameters.json +++ b/Projects/Foundations/Schemas/App-Schema/user-defined-parameters.json @@ -28,7 +28,7 @@ }, "level": 3, "attachingRules": { - "compatibleTypes": "->Trading Parameters->Learning Parameters->" + "compatibleTypes": "->Trading Parameters->Portfolio Parameters->Learning Parameters->" }, "propertyNameAtParent": "userDefinedParameters" } \ No newline at end of file diff --git a/Projects/Foundations/TS/Process-Modules/StatusReport.js b/Projects/Foundations/TS/Process-Modules/StatusReport.js index e3a93d4ee..896b1f01e 100644 --- a/Projects/Foundations/TS/Process-Modules/StatusReport.js +++ b/Projects/Foundations/TS/Process-Modules/StatusReport.js @@ -113,7 +113,7 @@ if (checkThisDataBranch(lanNetworkNode.dataTasks) === true) { return } if (checkThisTradingBranch(lanNetworkNode.testingTradingTasks) === true) { return } if (checkThisTradingBranch(lanNetworkNode.productionTradingTasks) === true) { return } - if (checkThisPortfolioBranch(lanNetworkNode.portfolioTasks) === true) { return } + if (checkThisPortfolioBranch(lanNetworkNode.productionPortfolioTasks) === true) { return } if (checkThisLearningBranch(lanNetworkNode.learningTasks) === true) { return } function checkThisDataBranch(branch) { @@ -231,8 +231,8 @@ let marketTasks = exchangeTasks.marketPortfolioTasks[p] if (marketTasks.referenceParent === undefined) { continue } if (marketTasks.referenceParent.id !== TS.projects.foundations.globals.taskConstants.TASK_NODE.parentNode.parentNode.parentNode.referenceParent.id) { continue } - for (let q = 0; q < marketTasks.PortfolioMineTasks.length; q++) { - let mineTasks = marketTasks.PortfolioMineTasks[q] + for (let q = 0; q < marketTasks.portfolioMineTasks.length; q++) { + let mineTasks = marketTasks.portfolioMineTasks[q] for (let k = 0; k < mineTasks.taskManagers.length; k++) { let taskManager = mineTasks.taskManagers[k] for (let m = 0; m < taskManager.tasks.length; m++) { diff --git a/Projects/Foundations/UI/Function-Libraries/ChartingSpaceFunctions.js b/Projects/Foundations/UI/Function-Libraries/ChartingSpaceFunctions.js index 2fdac867e..6c91b96b3 100644 --- a/Projects/Foundations/UI/Function-Libraries/ChartingSpaceFunctions.js +++ b/Projects/Foundations/UI/Function-Libraries/ChartingSpaceFunctions.js @@ -111,23 +111,25 @@ function newFoundationsFunctionLibraryChartingSpaceFunctions() { let fordwardTestingSessionsArray = UI.projects.visualScripting.utilities.branches.nodeBranchToArray(lanNetworkNode, 'Forward Testing Session') let paperTradingSessionsArray = UI.projects.visualScripting.utilities.branches.nodeBranchToArray(lanNetworkNode, 'Paper Trading Session') let liveTradingSessionsArray = UI.projects.visualScripting.utilities.branches.nodeBranchToArray(lanNetworkNode, 'Live Trading Session') + let livePortfolioSessionsArray = UI.projects.visualScripting.utilities.branches.nodeBranchToArray(lanNetworkNode, 'Live Portfolio Session') let backLearningSessionsArray = UI.projects.visualScripting.utilities.branches.nodeBranchToArray(lanNetworkNode, 'Back Learning Session') let liveLearningSessionsArray = UI.projects.visualScripting.utilities.branches.nodeBranchToArray(lanNetworkNode, 'Live Learning Session') - scanSessionArray(backtestingSessionsArray) - scanSessionArray(fordwardTestingSessionsArray) - scanSessionArray(paperTradingSessionsArray) - scanSessionArray(liveTradingSessionsArray) - scanSessionArray(backLearningSessionsArray) - scanSessionArray(liveLearningSessionsArray) + scanSessionArray(backtestingSessionsArray, 'Market Trading Tasks') + scanSessionArray(fordwardTestingSessionsArray, 'Market Trading Tasks') + scanSessionArray(paperTradingSessionsArray, 'Market Trading Tasks') + scanSessionArray(liveTradingSessionsArray, 'Market Trading Tasks') + scanSessionArray(livePortfolioSessionsArray, 'Market Portfolio Tasks') + scanSessionArray(backLearningSessionsArray, 'Market Trading Tasks') + scanSessionArray(liveLearningSessionsArray, 'Market Trading Tasks') - function scanSessionArray(sessionsArray) { + function scanSessionArray(sessionsArray, nodeType) { for (let i = 0; i < sessionsArray.length; i++) { let session = sessionsArray[i] let environment = UI.projects.visualScripting.utilities.meshes.findNodeInNodeMesh(session, node.payload.referenceParent.type, undefined, true, false, true, false) if (environment === undefined) { continue } if (environment.id !== node.payload.referenceParent.id) { continue } - let market = UI.projects.visualScripting.utilities.meshes.findNodeInNodeMesh(session, 'Market Trading Tasks', undefined, true, false, true, false) + let market = UI.projects.visualScripting.utilities.meshes.findNodeInNodeMesh(session, nodeType, undefined, true, false, true, false) if (market.payload.referenceParent === undefined) { continue } if (UI.projects.visualScripting.utilities.nodeChildren.isMissingChildrenById(node, session, true) === true) { createTimeMachine(node, session, market.payload.referenceParent, lanNetworkNode, rootNodes) @@ -148,9 +150,10 @@ function newFoundationsFunctionLibraryChartingSpaceFunctions() { timeMachine.timeFrameScale.payload.floatingObject.angleToParent = ANGLE_TO_PARENT.RANGE_180 timeMachine.timeScale.payload.floatingObject.angleToParent = ANGLE_TO_PARENT.RANGE_180 timeMachine.rateScale.payload.floatingObject.angleToParent = ANGLE_TO_PARENT.RANGE_180 + /* - We will create 3 Time Line Charts for the Trading Mine Products - */ + * We will create 3 Time Line Charts for the Trading Mine Products: + */ mineProducts = UI.projects.visualScripting.utilities.branches.nodeBranchToArray(lanNetworkNode, 'Trading Mine Products') for (let j = 0; j < mineProducts.length; j++) { let mineProduct = mineProducts[j] @@ -160,13 +163,13 @@ function newFoundationsFunctionLibraryChartingSpaceFunctions() { */ if (mineProduct.payload.parentNode === undefined) { continue } if (mineProduct.payload.parentNode.payload.referenceParent.id !== session.id) { continue } + /* At the current version of Superalgos, beta 6, there is only one Trading Mine, with only one bot, and it has so many data products that we want to put them in 3 different timeline charts. So we will create 3 charts, connect them, and delete from each one 1/3 of the layers. We do all that next: */ - for (let k = 0; k < 3; k++) { let timelineChart = UI.projects.visualScripting.functionLibraries.uiObjectsFromNodes.addUIObject(timeMachine, 'Timeline Chart') @@ -207,9 +210,68 @@ function newFoundationsFunctionLibraryChartingSpaceFunctions() { } } } + /* - We will create 3 Time Line Charts for the Learning Mine Products - */ + * We will create 3 Time Line Charts for the Portfolio Mine Products: + */ + mineProducts = UI.projects.visualScripting.utilities.branches.nodeBranchToArray(lanNetworkNode, 'Portfolio Mine Products') + for (let j = 0; j < mineProducts.length; j++) { + let mineProduct = mineProducts[j] + /* + The mine products found so far, belongs to any session. To filter all the sessions + that are not the one we are interested in, we do the following: + */ + if (mineProduct.payload.parentNode === undefined) { continue } + if (mineProduct.payload.parentNode.payload.referenceParent.id !== session.id) { continue } + + /* + For the legacy reasons stated above @Trading Mine Products we will create 3 charts, connect them, + and delete from each one 1/3 of the layers. We do all that next: + */ + for (let k = 0; k < 3; k++) { + let timelineChart = UI.projects.visualScripting.functionLibraries.uiObjectsFromNodes.addUIObject(timeMachine, 'Timeline Chart') + + UI.projects.visualScripting.functionLibraries.attachDetach.referenceAttachNode(timelineChart.layerManager, mineProduct) + timelineChart.payload.floatingObject.collapseToggle() + timelineChart.layerManager.payload.floatingObject.collapseToggle() + timelineChart.payload.floatingObject.angleToParent = ANGLE_TO_PARENT.RANGE_180 + timelineChart.layerManager.payload.floatingObject.angleToParent = ANGLE_TO_PARENT.RANGE_180 + + let menu = timelineChart.layerManager.payload.uiObject.menu + menu.internalClick('Add All Mine Layers') + menu.internalClick('Add All Mine Layers') + + switch (k) { + case 0: { + timelineChart.name = 'Portfolio Engine' + deleteNodeByName('Portfolio System') + deleteNodeByName('Simulation Objects') + break + } + case 1: { + timelineChart.name = 'Portfolio System' + deleteNodeByName('Portfolio Engine') + deleteNodeByName('Simulation Objects') + break + } + case 2: { + timelineChart.name = 'Simulation Objects' + deleteNodeByName('Portfolio Engine') + deleteNodeByName('Portfolio System') + break + } + } + function deleteNodeByName(nodeName) { + let nodeToDelete = UI.projects.visualScripting.utilities.meshes.findNodeInNodeMesh(timelineChart.layerManager, undefined, nodeName, true, true, false, false) + if (nodeToDelete === undefined) { return } + UI.projects.visualScripting.functionLibraries.nodeDeleter.deleteUIObject(nodeToDelete, rootNodes) + } + } + } + + /* + * We will create 3 Time Line Charts for the Learning Mine Products: + */ mineProducts = UI.projects.visualScripting.utilities.branches.nodeBranchToArray(lanNetworkNode, 'Learning Mine Products') for (let j = 0; j < mineProducts.length; j++) { let mineProduct = mineProducts[j] @@ -219,13 +281,13 @@ function newFoundationsFunctionLibraryChartingSpaceFunctions() { */ if (mineProduct.payload.parentNode === undefined) { continue } if (mineProduct.payload.parentNode.payload.referenceParent.id !== session.id) { continue } + /* At the current version of Superalgos, beta 6, there is only one Learning Mine, with only one bot, and it has so many data products that we want to put them in 3 different timeline charts. So we will create 3 charts, connect them, and delete from each one 1/3 of the layers. We do all that next: */ - for (let k = 0; k < 3; k++) { let timelineChart = UI.projects.visualScripting.functionLibraries.uiObjectsFromNodes.addUIObject(timeMachine, 'Timeline Chart') @@ -319,6 +381,7 @@ function newFoundationsFunctionLibraryChartingSpaceFunctions() { function scanNetworkNode(lanNetworkNode) { let testingTradingTasks = UI.projects.visualScripting.utilities.branches.findInBranch(lanNetworkNode, 'Testing Trading Tasks', node, true) let productionTradingTasks = UI.projects.visualScripting.utilities.branches.findInBranch(lanNetworkNode, 'Production Trading Tasks', node, true) + let productionPortfolioTasks = UI.projects.visualScripting.utilities.branches.findInBranch(lanNetworkNode, 'Production Portfolio Tasks', node, true) if (UI.projects.visualScripting.utilities.nodeChildren.isMissingChildrenById(node, testingTradingTasks, true) === true) { let dashboard = UI.projects.visualScripting.functionLibraries.uiObjectsFromNodes.addUIObject(node, 'Dashboard') @@ -331,6 +394,12 @@ function newFoundationsFunctionLibraryChartingSpaceFunctions() { UI.projects.visualScripting.functionLibraries.attachDetach.referenceAttachNode(dashboard, productionTradingTasks) dashboard.name = productionTradingTasks.type + ' ' + lanNetworkNode.name } + + if (UI.projects.visualScripting.utilities.nodeChildren.isMissingChildrenById(node, productionPortfolioTasks, true) === true) { + let dashboard = UI.projects.visualScripting.functionLibraries.uiObjectsFromNodes.addUIObject(node, 'Dashboard') + UI.projects.visualScripting.functionLibraries.attachDetach.referenceAttachNode(dashboard, productionPortfolioTasks) + dashboard.name = productionPortfolioTasks.type + ' ' + lanNetworkNode.name + } } } } diff --git a/Projects/Foundations/UI/Function-Libraries/CryptoEcosystemFunctions.js b/Projects/Foundations/UI/Function-Libraries/CryptoEcosystemFunctions.js index efa57a5e9..64047de23 100644 --- a/Projects/Foundations/UI/Function-Libraries/CryptoEcosystemFunctions.js +++ b/Projects/Foundations/UI/Function-Libraries/CryptoEcosystemFunctions.js @@ -256,15 +256,18 @@ function newFoundationsFunctionLibraryCryptoEcosystemFunctions() { function installInNetworkNode(lanNetworkNode) { let tradingSessionsCreatedArray = [] + let portfolioSessionsCreatedArray = [] let learningSessionsCreatedArray = [] installDataTasksTasks() installLearningTasksTasks() - isntallTradingTasksTasks() + installTradingTasksTasks() + installPortfolioTasksTasks() installDataMinesData() installLearningMinesData() installTradingMineData() + installPortfolioMineData() function installDataTasksTasks() { /* @@ -343,7 +346,7 @@ function newFoundationsFunctionLibraryCryptoEcosystemFunctions() { } } - function isntallTradingTasksTasks() { + function installTradingTasksTasks() { /* Next we complete the missing stuff at Testing Trading Tasks */ @@ -400,6 +403,64 @@ function newFoundationsFunctionLibraryCryptoEcosystemFunctions() { } } + function installPortfolioTasksTasks() { + /* + Next we complete the missing stuff at Testing Portfolio Tasks + */ + //installEnvironment('Testing Portfolio Tasks') + /* + Next we complete the missing stuff at Production Portfolio Tasks + */ + installEnvironment('Production Portfolio Tasks') + + function installEnvironment(environmentType) { + /* + Now we install the environment at the current Network Node + */ + let portfolioTasks = UI.projects.visualScripting.utilities.branches.findInBranch(lanNetworkNode, environmentType, node, true) + if (portfolioTasks === undefined) { + portfolioTasks = UI.projects.visualScripting.functionLibraries.uiObjectsFromNodes.addUIObject(lanNetworkNode, environmentType) + } + /* + We will make ourselves sure that the Project Portfolio Tasks nodes are there. + */ + portfolioTasks.payload.uiObject.menu.internalClick('Add Missing Project Portfolio Tasks') + portfolioTasks.payload.uiObject.menu.internalClick('Add Missing Project Portfolio Tasks') + + for (let i = 0; i < portfolioTasks.projectPortfolioTasks.length; i++) { + let projectPortfolioTasks = portfolioTasks.projectPortfolioTasks[i] + projectPortfolioTasks.payload.floatingObject.angleToParent = ANGLE_TO_PARENT.RANGE_90 + + if (projectPortfolioTasks.project === "Foundations") { + installTheRestOfTheBranch(projectPortfolioTasks) + } + } + + function installTheRestOfTheBranch(projectPortfolioTasks) { + let exchangePortfolioTasks = UI.projects.visualScripting.utilities.nodeChildren.findOrCreateChildWithReference(projectPortfolioTasks, 'Exchange Portfolio Tasks', cryptoExchange) + exchangePortfolioTasks.payload.floatingObject.angleToParent = ANGLE_TO_PARENT.RANGE_180 + let marketPortfolioTask = UI.projects.visualScripting.utilities.nodeChildren.findAndRecreateChildWithReference(exchangePortfolioTasks, 'Market Portfolio Tasks', market, rootNodes) + + UI.projects.foundations.utilities.menu.menuClick(marketPortfolioTask, 'Add Missing Portfolio Mine Tasks', true) + UI.projects.foundations.utilities.menu.menuClickOfNodeArray(marketPortfolioTask.portfolioMineTasks, 'Add All Tasks', true) + + /* This will be needed at the charting space, for creating Dashboards */ + //let backtestingSessionsArray = UI.projects.visualScripting.utilities.branches.nodeBranchToArray(marketPortfolioTask, 'Backtesting Session') + let livePortfolioSessionsArray = UI.projects.visualScripting.utilities.branches.nodeBranchToArray(marketPortfolioTask, 'Live Portfolio Session') + //let paperPortfolioSessionsArray = UI.projects.visualScripting.utilities.branches.nodeBranchToArray(marketPortfolioTask, 'Paper Portfolio Session') + //let forwardSessionsArray = UI.projects.visualScripting.utilities.branches.nodeBranchToArray(marketPortfolioTask, 'Forward Testing Session') + let allSessionsArray = livePortfolioSessionsArray; + /*backtestingSessionsArray + .concat(livePortfolioSessionsArray) + .concat(paperPortfolioSessionsArray) + .concat(forwardSessionsArray)*/ + portfolioSessionsCreatedArray = portfolioSessionsCreatedArray.concat(allSessionsArray) + + dashboardsArray.push({ environmentNode: portfolioTasks, lanNetworkNode: lanNetworkNode, sessionsArray: allSessionsArray }) + } + } + } + function installDataMinesData() { /* Here we complete the missing stuff at Data Mines Data @@ -548,6 +609,61 @@ function newFoundationsFunctionLibraryCryptoEcosystemFunctions() { } } } + + function installPortfolioMineData() { + /* + Here we complete the missing stuff at Data Mines Data + */ + let dataStorage = UI.projects.visualScripting.utilities.branches.findInBranch(lanNetworkNode, 'Data Storage', node, true) + if (dataStorage === undefined) { + dataStorage = UI.projects.visualScripting.functionLibraries.uiObjectsFromNodes.addUIObject(lanNetworkNode, 'Data Storage') + } + let portfolioMinesData = UI.projects.visualScripting.utilities.branches.findInBranch(dataStorage, 'Portfolio Mines Data', node, true) + if (portfolioMinesData === undefined) { + portfolioMinesData = UI.projects.visualScripting.functionLibraries.uiObjectsFromNodes.addUIObject(dataStorage, 'Portfolio Mines Data') + } + portfolioMinesData.payload.floatingObject.angleToParent = ANGLE_TO_PARENT.RANGE_90 + /* + We will make ourselves sure that the Project Portfolio Products nodes are there. + */ + portfolioMinesData.payload.uiObject.menu.internalClick('Add Missing Project Portfolio Products') + portfolioMinesData.payload.uiObject.menu.internalClick('Add Missing Project Portfolio Products') + + for (let i = 0; i < portfolioMinesData.projectPortfolioProducts.length; i++) { + let projectPortfolioProducts = portfolioMinesData.projectPortfolioProducts[i] + projectPortfolioProducts.payload.floatingObject.angleToParent = ANGLE_TO_PARENT.RANGE_45 + + if (projectPortfolioProducts.project === "Foundations") { + installTheRestOfTheBranch(projectPortfolioProducts) + } + } + + function installTheRestOfTheBranch(projectPortfolioProducts) { + + let exchangePortfolioProducts = UI.projects.visualScripting.utilities.nodeChildren.findOrCreateChildWithReference(projectPortfolioProducts, 'Exchange Portfolio Products', cryptoExchange) + exchangePortfolioProducts.payload.floatingObject.angleToParent = ANGLE_TO_PARENT.RANGE_180 + let marketPortfolioProducts = UI.projects.visualScripting.utilities.nodeChildren.findAndRecreateChildWithReference(exchangePortfolioProducts, 'Market Portfolio Products', market, rootNodes) + marketPortfolioProducts.payload.floatingObject.collapseToggle() + /* + Create the new session references. + */ + for (let i = 0; i < portfolioSessionsCreatedArray.length; i++) { + let session = portfolioSessionsCreatedArray[i] + if (UI.projects.visualScripting.utilities.nodeChildren.isMissingChildrenById(marketPortfolioProducts, session, true) === true) { + UI.projects.foundations.functionLibraries.dataStorageFunctions.createSessionReference(marketPortfolioProducts, session, 'Portfolio Session Reference') + } + } + /* + Create everything inside the session references. + */ + for (let j = 0; j < marketPortfolioProducts.portfolioSessionReferences.length; j++) { + let sessionReference = marketPortfolioProducts.portfolioSessionReferences[j] + UI.projects.foundations.utilities.menu.menuClick(sessionReference, 'Add All Portfolio Mine Products', true) + UI.projects.foundations.utilities.menu.menuClickOfNodeArray(sessionReference.portfolioMineProducts, 'Add All Data Products', true) + sessionReference.payload.floatingObject.collapseToggle() + } + } + } } } @@ -605,6 +721,14 @@ function newFoundationsFunctionLibraryCryptoEcosystemFunctions() { if (marketTradingTasks.payload.referenceParent.id === market.id) { UI.projects.visualScripting.functionLibraries.nodeDeleter.deleteUIObject(timeMachine, rootNodes) } + + let marketPortfolioTasks = UI.projects.visualScripting.utilities.meshes.findNodeInNodeMesh(session, 'Market Portfolio Tasks', undefined, true, false, true, false) + if (marketPortfolioTasks === undefined) { continue } + if (marketPortfolioTasks.payload === undefined) { continue } + if (marketPortfolioTasks.payload.referenceParent === undefined) { continue } + if (marketPortfolioTasks.payload.referenceParent.id === market.id) { + UI.projects.visualScripting.functionLibraries.nodeDeleter.deleteUIObject(timeMachine, rootNodes) + } } /* We create a time machine for each session added during the previous processing. @@ -651,6 +775,14 @@ function newFoundationsFunctionLibraryCryptoEcosystemFunctions() { if (marketTradingTasks.payload.referenceParent.id === market.id) { UI.projects.visualScripting.functionLibraries.nodeDeleter.deleteUIObject(timeMachine, rootNodes) } + + let marketPortfolioTasks = UI.projects.visualScripting.utilities.meshes.findNodeInNodeMesh(session, 'Market Portfolio Tasks', undefined, true, false, true, false) + if (marketPortfolioTasks === undefined) { continue } + if (marketPortfolioTasks.payload === undefined) { continue } + if (marketPortfolioTasks.payload.referenceParent === undefined) { continue } + if (marketPortfolioTasks.payload.referenceParent.id === market.id) { + UI.projects.visualScripting.functionLibraries.nodeDeleter.deleteUIObject(timeMachine, rootNodes) + } } /* Delete all Dashboards that does not have time machines inside. */ @@ -688,16 +820,20 @@ function newFoundationsFunctionLibraryCryptoEcosystemFunctions() { let marketDataTasksArray = UI.projects.visualScripting.utilities.branches.nodeBranchToArray(network, 'Market Data Tasks') let marketTradingTasksArray = UI.projects.visualScripting.utilities.branches.nodeBranchToArray(network, 'Market Trading Tasks') + let marketPortfolioTasksArray = UI.projects.visualScripting.utilities.branches.nodeBranchToArray(network, 'Market Portfolio Tasks') let marketLearningTasksArray = UI.projects.visualScripting.utilities.branches.nodeBranchToArray(network, 'Market Learning Tasks') let marketDataProductsArray = UI.projects.visualScripting.utilities.branches.nodeBranchToArray(network, 'Market Data Products') let marketTradingProductsArray = UI.projects.visualScripting.utilities.branches.nodeBranchToArray(network, 'Market Trading Products') + let marketPortfolioProductsArray = UI.projects.visualScripting.utilities.branches.nodeBranchToArray(network, 'Market Portfolio Products') let marketLearningProductsArray = UI.projects.visualScripting.utilities.branches.nodeBranchToArray(network, 'Market Learning Products') uninstalMarketArray(marketDataTasksArray) uninstalMarketArray(marketTradingTasksArray) + uninstalMarketArray(marketPortfolioTasksArray) uninstalMarketArray(marketLearningTasksArray) uninstalMarketArray(marketDataProductsArray) uninstalMarketArray(marketTradingProductsArray) + uninstalMarketArray(marketPortfolioProductsArray) uninstalMarketArray(marketLearningProductsArray) function uninstalMarketArray(marketArray) { diff --git a/Projects/Foundations/UI/Function-Libraries/ProductFunctions.js b/Projects/Foundations/UI/Function-Libraries/ProductFunctions.js index a5a34fd60..f7ec33c56 100644 --- a/Projects/Foundations/UI/Function-Libraries/ProductFunctions.js +++ b/Projects/Foundations/UI/Function-Libraries/ProductFunctions.js @@ -39,6 +39,13 @@ function newFoundationsFunctionLibraryProductFunctions() { } } + for (let i = 0; i < rootNodes.length; i++) { + let rootNode = rootNodes[i] + if (rootNode.type === 'Portfolio Mine') { + installInPortfolioMine(rootNode) + } + } + for (let i = 0; i < rootNodes.length; i++) { let rootNode = rootNodes[i] if (rootNode.type === 'LAN Network') { @@ -255,6 +262,72 @@ function newFoundationsFunctionLibraryProductFunctions() { } + function installInPortfolioMine(portfolioMine) { + let savePlugin = false + for (let j = 0; j < portfolioMine.portfolioBots.length; j++) { + let portfolioBotNode = portfolioMine.portfolioBots[j] + + for (let k = 0; k < portfolioBotNode.processes.length; k++) { + let process = portfolioBotNode.processes[k] + + /** + * In case the data mine is not referenced at all, we must add it + */ + + let dataMineDependency = UI.projects.visualScripting.utilities.nodeChildren.findOrCreateChildWithReference(process.processDependencies, 'Data Mine Data Dependencies', productDataMineParent) + + let botDataDependencies = UI.projects.visualScripting.utilities.meshes.findNodeInNodeMesh(dataMineDependency, undefined, productIndicatorBot.name, false, true, false, false) + + /** + * If Bot Data Dependency exists add Data Dependencies + * Otherwise create the Bot Data Dependency and add Data Dependencies to newly created Bot Data + */ + if (botDataDependencies !== undefined) { + addAllDataDependenciesIfNotExists(botDataDependencies) + } else { + let newBotDataDependencies = UI.projects.visualScripting.functionLibraries.uiObjectsFromNodes.addUIObject(dataMineDependency, 'Bot Data Dependencies') + newBotDataDependencies.name = productIndicatorBot.name + addAllDataDependenciesIfNotExists(newBotDataDependencies) + } + + + function addAllDataDependenciesIfNotExists(botDataDependencies) { + for (let l = 0; l < product.datasets.length; l++) { + let dataset = product.datasets[l] + + // Explicit check is needed so we know if we have to save the plugin or not + if (UI.projects.visualScripting.utilities.nodeChildren.isMissingChildrenById(botDataDependencies, dataset, true) === true) { + savePlugin = true + let dataDependency = UI.projects.visualScripting.functionLibraries.uiObjectsFromNodes.addUIObject(botDataDependencies, 'Data Dependency') + UI.projects.visualScripting.functionLibraries.attachDetach.referenceAttachNode(dataDependency, dataset) + } + } + } + } + } + /** + * There is no reason to save the plugin if no modifications have been made to the hierarchy + * We will save the plugin only if we get to the point were we have to add the data dependencies + * + */ + if (savePlugin) { + for (let i = 0; i < rootNodes.length; i++) { + let rootNode = rootNodes[i] + if (rootNode.type === 'Plugins') { + let portfolioMinePlugin = UI.projects.visualScripting.utilities.meshes.findNodeInNodeMesh(rootNode, 'Plugin Portfolio Mines', undefined, false, true, false, false) + + for (let j = 0; j < portfolioMinePlugin.pluginFiles.length; j++) { + let pluginFile = portfolioMinePlugin.pluginFiles[j] + + UI.projects.communityPlugins.functionLibraries.pluginsFunctions.savePlugin(pluginFile) + } + } + } + + } + + } + /** * This function will install the product into existing Charting Space * It is mandatory to have at least a dashboard which contains at least one time machine diff --git a/Projects/Visual-Scripting/UI/Function-Libraries/UiObjectsFromNodes.js b/Projects/Visual-Scripting/UI/Function-Libraries/UiObjectsFromNodes.js index 4bdf462d2..ce45e50a7 100644 --- a/Projects/Visual-Scripting/UI/Function-Libraries/UiObjectsFromNodes.js +++ b/Projects/Visual-Scripting/UI/Function-Libraries/UiObjectsFromNodes.js @@ -2,6 +2,7 @@ function newVisualScritingFunctionLibraryUiObjectsFromNodes() { let thisObject = { syncronizeTasksFoundAtWorkspaceWithBackEnd: syncronizeTasksFoundAtWorkspaceWithBackEnd, syncronizeTradingSessionsFoundAtWorkspaceWithBackEnd: syncronizeTradingSessionsFoundAtWorkspaceWithBackEnd, + syncronizePortfolioSessionsFoundAtWorkspaceWithBackEnd: syncronizePortfolioSessionsFoundAtWorkspaceWithBackEnd, syncronizeLearningSessionsFoundAtWorkspaceWithBackEnd: syncronizeLearningSessionsFoundAtWorkspaceWithBackEnd, playTutorials: playTutorials, recreateWorkspace: recreateWorkspace, @@ -16,6 +17,7 @@ function newVisualScritingFunctionLibraryUiObjectsFromNodes() { let mapOfNodes let tasksFoundAtWorkspace let tradingSessionsFoundAtWorkspace + let portfolioSessionsFoundAtWorkspace let learningSessionsFoundAtWorkspace let tutorialsToPlay @@ -29,6 +31,7 @@ function newVisualScritingFunctionLibraryUiObjectsFromNodes() { mapOfNodes = new Map() tasksFoundAtWorkspace = [] tradingSessionsFoundAtWorkspace = [] + portfolioSessionsFoundAtWorkspace = [] learningSessionsFoundAtWorkspace = [] tutorialsToPlay = [] @@ -84,6 +87,18 @@ function newVisualScritingFunctionLibraryUiObjectsFromNodes() { totalPlugin = totalPlugin + project.pluginTradingEngines.pluginFiles.length pluginAllTheseFiles(project.pluginTradingEngines.pluginFiles, 'Trading-Engines') } + if (project.pluginPortfolioMines !== undefined) { + totalPlugin = totalPlugin + project.pluginPortfolioMines.pluginFiles.length + pluginAllTheseFiles(project.pluginPortfolioMines.pluginFiles, 'Portfolio-Mines') + } + if (project.pluginPortfolioSystems !== undefined) { + totalPlugin = totalPlugin + project.pluginPortfolioSystems.pluginFiles.length + pluginAllTheseFiles(project.pluginPortfolioSystems.pluginFiles, 'Portfolio-Systems') + } + if (project.pluginPortfolioEngines !== undefined) { + totalPlugin = totalPlugin + project.pluginPortfolioEngines.pluginFiles.length + pluginAllTheseFiles(project.pluginPortfolioEngines.pluginFiles, 'Portfolio-Engines') + } if (project.pluginLearningMines !== undefined) { totalPlugin = totalPlugin + project.pluginLearningMines.pluginFiles.length pluginAllTheseFiles(project.pluginLearningMines.pluginFiles, 'Learning-Mines') @@ -278,6 +293,14 @@ function newVisualScritingFunctionLibraryUiObjectsFromNodes() { tradingSessionsFoundAtWorkspace = undefined } + function syncronizePortfolioSessionsFoundAtWorkspaceWithBackEnd() { + for (let i = 0; i < portfolioSessionsFoundAtWorkspace.length; i++) { + let node = portfolioSessionsFoundAtWorkspace[i] + UI.projects.algorithmicPortfolio.functionLibraries.portfolioSessionFunctions.syncronizeSessionWithBackEnd(node) + } + portfolioSessionsFoundAtWorkspace = undefined + } + function syncronizeLearningSessionsFoundAtWorkspaceWithBackEnd() { for (let i = 0; i < learningSessionsFoundAtWorkspace.length; i++) { let node = learningSessionsFoundAtWorkspace[i] @@ -465,6 +488,15 @@ function newVisualScritingFunctionLibraryUiObjectsFromNodes() { node.project = "Algorithmic-Trading" } + if ( + node.type === 'Portfolio Engine' || + node.type === 'Portfolio Mine' || + node.type === 'Portfolio System' || + node.type === 'Portfolio Bot' + ) { + node.project = "Portfolio-Management" + } + if ( node.type === 'Learning Engine' || node.type === 'Learning Mine' || @@ -477,9 +509,12 @@ function newVisualScritingFunctionLibraryUiObjectsFromNodes() { if ( node.type === 'Plugins' || node.type === 'Plugin Tutorials' || - node.type === 'Plugin Trading Systems' || - node.type === 'Plugin Trading Mines' || - node.type === 'Plugin Trading Engines' || + node.type === 'Plugin Trading Systems' || + node.type === 'Plugin Trading Mines' || + node.type === 'Plugin Trading Engines' || + node.type === 'Plugin Portfolio Systems' || + node.type === 'Plugin Portfolio Mines' || + node.type === 'Plugin Portfolio Engines' || node.type === 'Plugin Project' || node.type === 'Plugin Learning Systems' || node.type === 'Plugin Learning Mines' || @@ -939,6 +974,11 @@ function newVisualScritingFunctionLibraryUiObjectsFromNodes() { tradingSessionsFoundAtWorkspace.push(node) } } + if (uiObjectType === 'Live Portfolio Session') { + if (portfolioSessionsFoundAtWorkspace !== undefined) { // it might be undefined when you are spawning a session that was running while backed up + portfolioSessionsFoundAtWorkspace.push(node) + } + } if (uiObjectType === 'Learning Session') { if (learningSessionsFoundAtWorkspace !== undefined) { // it might be undefined when you are spawning a session that was running while backed up learningSessionsFoundAtWorkspace.push(node)