diff --git a/Projects/Foundations/UI/Function-Libraries/TaskFunctions.js b/Projects/Foundations/UI/Function-Libraries/TaskFunctions.js index 4e1884a41..3e945c6ef 100644 --- a/Projects/Foundations/UI/Function-Libraries/TaskFunctions.js +++ b/Projects/Foundations/UI/Function-Libraries/TaskFunctions.js @@ -122,6 +122,7 @@ function newFoundationsFunctionLibraryTaskFunctions() { 'Trading Bot Instance->' + 'Learning Bot Instance->' + 'Sensor Process Instance->Time Frames Filter->API Data Fetcher Process Instance->Indicator Process Instance->Trading Process Instance->Learning Process Instance->' + + 'Social Trading Bot Reference->Social Trading Bot->Signing Account->' + 'Execution Started Event->' + 'Key Reference->Exchange Account Key->' + 'Task Manager->' + diff --git a/Projects/Governance/Plugins/User-Profiles/Luis-Fernando-Molina.json b/Projects/Governance/Plugins/User-Profiles/Luis-Fernando-Molina.json index dd0cbca69..746d700e7 100644 --- a/Projects/Governance/Plugins/User-Profiles/Luis-Fernando-Molina.json +++ b/Projects/Governance/Plugins/User-Profiles/Luis-Fernando-Molina.json @@ -18166,17 +18166,17 @@ "id": "a8de78f0-c3e4-4a2a-b7e8-f659073969db", "savedPayload": { "position": { - "x": 37500, + "x": 33333.333333333336, "y": 18800 }, "targetPosition": { - "x": 37500, + "x": 33333.333333333336, "y": 18800 }, "floatingObject": { "isPinned": false, "isFrozen": false, - "isCollapsed": false, + "isCollapsed": true, "angleToParent": 1, "distanceToParent": 3, "arrangementStyle": 0 diff --git a/Projects/Governance/Schemas/App-Schema/social-trading-bot.json b/Projects/Governance/Schemas/App-Schema/social-trading-bot.json index 8c48020a7..6b80b1421 100644 --- a/Projects/Governance/Schemas/App-Schema/social-trading-bot.json +++ b/Projects/Governance/Schemas/App-Schema/social-trading-bot.json @@ -18,6 +18,16 @@ "relatedUiObject": "Social Trading Bots Following", "relatedUiObjectProject": "Governance" }, + { + "action": "Add UI Object", + "actionProject": "Visual-Scripting", + "disableIfPropertyIsDefined": true, + "propertyToCheckFor": "availableSignals", + "actionFunction": "payload.executeAction", + "label": "Add Available Signals", + "relatedUiObject": "Available Signals", + "relatedUiObjectProject": "Trading-Signals" + }, { "action": "Delete UI Object", "actionProject": "Visual-Scripting", @@ -53,6 +63,12 @@ "type": "node", "childType": "Signing Account", "autoAdd": false + }, + { + "name": "availableSignals", + "type": "node", + "childType": "Available Signals", + "autoAdd": false } ] } \ No newline at end of file diff --git a/Projects/Governance/UI/Function-Libraries/ProfileConstructor.js b/Projects/Governance/UI/Function-Libraries/ProfileConstructor.js index 4a5d7e5b5..940b853b2 100644 --- a/Projects/Governance/UI/Function-Libraries/ProfileConstructor.js +++ b/Projects/Governance/UI/Function-Libraries/ProfileConstructor.js @@ -124,6 +124,8 @@ function newGovernanceFunctionLibraryProfileConstructor() { 'User Profile', UI.projects.foundations.spaces.designSpace.workspace.workspaceNode.rootNodes ) + + UI.projects.visualScripting.functionLibraries.attachDetach.referenceAttachNode(node, userProfile) /* Set up a basic profile to start receiving benefits */ @@ -142,11 +144,11 @@ function newGovernanceFunctionLibraryProfileConstructor() { let liquidProg = UI.projects.visualScripting.functionLibraries.uiObjectsFromNodes.addUIObject(liquidProgs, "Liquidity Program", userProfile) liquidProg.payload.floatingObject.angleToParent = ANGLE_TO_PARENT.RANGE_180 liquidProg.payload.uiObject.menu.internalClick('Add Tokens Awarded') - /* Check if the user already has the SA fork. If not, do it for them. */ + /* const hasFork = UI.projects.governance.spaces.userProfileSpace.githubForks.get(githubUsername) if (hasFork === undefined) { // New user! Probably doesn't have a fork, so let's create it. @@ -198,6 +200,7 @@ function newGovernanceFunctionLibraryProfileConstructor() { } } } + */ /* We store at the User Profile the Signed githubUsername */ @@ -217,10 +220,6 @@ function newGovernanceFunctionLibraryProfileConstructor() { Delete the mnemonic from the Profile Constructor config. */ node.config = "{}" - /* - TODO: Let's create a nice basic profile to start with liquidity and community - */ - /* Show nice message. */ diff --git a/Projects/ProjectsSchema.json b/Projects/ProjectsSchema.json index 0d393a901..156ec0498 100644 --- a/Projects/ProjectsSchema.json +++ b/Projects/ProjectsSchema.json @@ -1740,5 +1740,30 @@ } ] } + }, + { + "name": "Trading-Signals", + "propertyName": "tradingSignals", + "UI": { + "functionLibraries": [ + { + "name": "Trading Signals Functions", + "propertyName": "tradingSignalsFunctions", + "functionName": "newSocialBotsFunctionLibraryTradingSignalsFunctions" + } + ], + "utilities": [] + }, + "TS": { + "botModules": [ + { + "name": "Trading Signals", + "propertyName": "tradingSignals", + "functionName": "newTradingSignalsBotModulesTradingSignals", + "fileName": "TradingSignals.js", + "folderName": "" + } + ] + } } ] \ No newline at end of file diff --git a/Projects/Trading-Signals/Icons/available-signals.png b/Projects/Trading-Signals/Icons/available-signals.png new file mode 100644 index 000000000..a4ee2a209 Binary files /dev/null and b/Projects/Trading-Signals/Icons/available-signals.png differ diff --git a/Projects/Trading-Signals/Icons/cancel-order-signal.png b/Projects/Trading-Signals/Icons/cancel-order-signal.png new file mode 100644 index 000000000..a4ee2a209 Binary files /dev/null and b/Projects/Trading-Signals/Icons/cancel-order-signal.png differ diff --git a/Projects/Trading-Signals/Icons/close-stage-signals.png b/Projects/Trading-Signals/Icons/close-stage-signals.png new file mode 100644 index 000000000..a4ee2a209 Binary files /dev/null and b/Projects/Trading-Signals/Icons/close-stage-signals.png differ diff --git a/Projects/Trading-Signals/Icons/create-order-signal.png b/Projects/Trading-Signals/Icons/create-order-signal.png new file mode 100644 index 000000000..a4ee2a209 Binary files /dev/null and b/Projects/Trading-Signals/Icons/create-order-signal.png differ diff --git a/Projects/Trading-Signals/Icons/limit-buy-order-signals.png b/Projects/Trading-Signals/Icons/limit-buy-order-signals.png new file mode 100644 index 000000000..a4ee2a209 Binary files /dev/null and b/Projects/Trading-Signals/Icons/limit-buy-order-signals.png differ diff --git a/Projects/Trading-Signals/Icons/limit-sell-order-signals.png b/Projects/Trading-Signals/Icons/limit-sell-order-signals.png new file mode 100644 index 000000000..a4ee2a209 Binary files /dev/null and b/Projects/Trading-Signals/Icons/limit-sell-order-signals.png differ diff --git a/Projects/Trading-Signals/Icons/manage-stage-signals.png b/Projects/Trading-Signals/Icons/manage-stage-signals.png new file mode 100644 index 000000000..a4ee2a209 Binary files /dev/null and b/Projects/Trading-Signals/Icons/manage-stage-signals.png differ diff --git a/Projects/Trading-Signals/Icons/market-buy-order-signals.png b/Projects/Trading-Signals/Icons/market-buy-order-signals.png new file mode 100644 index 000000000..a4ee2a209 Binary files /dev/null and b/Projects/Trading-Signals/Icons/market-buy-order-signals.png differ diff --git a/Projects/Trading-Signals/Icons/market-sell-order-signals.png b/Projects/Trading-Signals/Icons/market-sell-order-signals.png new file mode 100644 index 000000000..a4ee2a209 Binary files /dev/null and b/Projects/Trading-Signals/Icons/market-sell-order-signals.png differ diff --git a/Projects/Trading-Signals/Icons/open-stage-signals.png b/Projects/Trading-Signals/Icons/open-stage-signals.png new file mode 100644 index 000000000..a4ee2a209 Binary files /dev/null and b/Projects/Trading-Signals/Icons/open-stage-signals.png differ diff --git a/Projects/Trading-Signals/Icons/take-position-signal.png b/Projects/Trading-Signals/Icons/take-position-signal.png new file mode 100644 index 000000000..a4ee2a209 Binary files /dev/null and b/Projects/Trading-Signals/Icons/take-position-signal.png differ diff --git a/Projects/Trading-Signals/Icons/trigger-off-signal.png b/Projects/Trading-Signals/Icons/trigger-off-signal.png new file mode 100644 index 000000000..a4ee2a209 Binary files /dev/null and b/Projects/Trading-Signals/Icons/trigger-off-signal.png differ diff --git a/Projects/Trading-Signals/Icons/trigger-on-signal.png b/Projects/Trading-Signals/Icons/trigger-on-signal.png new file mode 100644 index 000000000..a4ee2a209 Binary files /dev/null and b/Projects/Trading-Signals/Icons/trigger-on-signal.png differ diff --git a/Projects/Trading-Signals/Icons/trigger-stage-signals.png b/Projects/Trading-Signals/Icons/trigger-stage-signals.png new file mode 100644 index 000000000..a4ee2a209 Binary files /dev/null and b/Projects/Trading-Signals/Icons/trigger-stage-signals.png differ diff --git a/Projects/Trading-Signals/Schemas/App-Schema/available-signals.json b/Projects/Trading-Signals/Schemas/App-Schema/available-signals.json new file mode 100644 index 000000000..ded4741de --- /dev/null +++ b/Projects/Trading-Signals/Schemas/App-Schema/available-signals.json @@ -0,0 +1,100 @@ +{ + "type": "Available Signals", + "menuItems": [ + { + "action": "Configure", + "actionFunction": "uiObject.configEditor.activate", + "label": "Configure", + "iconPathOn": "configuration", + "iconPathOff": "configuration" + }, + { + "action": "Add UI Object", + "actionProject": "Visual-Scripting", + "disableIfPropertyIsDefined": true, + "propertyToCheckFor": "triggerStageSignals", + "actionFunction": "payload.executeAction", + "label": "Add Trigger Stage Signals", + "relatedUiObject": "Trigger Stage Signals", + "relatedUiObjectProject": "Trading-Signals" + }, + { + "action": "Add UI Object", + "actionProject": "Visual-Scripting", + "disableIfPropertyIsDefined": true, + "propertyToCheckFor": "openStageSignals", + "actionFunction": "payload.executeAction", + "label": "Add Open Stage Signals", + "relatedUiObject": "Open Stage Signals", + "relatedUiObjectProject": "Trading-Signals" + }, + { + "action": "Add UI Object", + "actionProject": "Visual-Scripting", + "disableIfPropertyIsDefined": true, + "propertyToCheckFor": "manageStageSignals", + "actionFunction": "payload.executeAction", + "label": "Add Manage Stage Signals", + "relatedUiObject": "Manage Stage Signals", + "relatedUiObjectProject": "Trading-Signals" + }, + { + "action": "Add UI Object", + "actionProject": "Visual-Scripting", + "disableIfPropertyIsDefined": true, + "propertyToCheckFor": "closeStageSignals", + "actionFunction": "payload.executeAction", + "label": "Add Close Stage Signals", + "relatedUiObject": "Close Stage Signals", + "relatedUiObjectProject": "Trading-Signals" + }, + { + "action": "Delete UI Object", + "actionProject": "Visual-Scripting", + "askConfirmation": true, + "confirmationLabel": "Confirm to Delete", + "label": "Delete", + "iconPathOn": "delete-entity", + "iconPathOff": "delete-entity", + "actionFunction": "payload.executeAction" + } + ], + "editors": { + "config": true + }, + "initialValues": { + "config": "{}" + }, + "addLeftIcons": true, + "level": 2, + "attachingRules": { + "compatibleTypes": "->Social Trading Bot->" + }, + "propertyNameAtParent": "availableSignals", + "childrenNodesProperties": [ + { + "name": "triggerStageSignals", + "type": "node", + "childType": "Trigger Stage Signals", + "autoAdd": true + }, + { + "name": "openStageSignals", + "type": "node", + "childType": "Open Stage Signals", + "autoAdd": true + }, + { + "name": "manageStageSignals", + "type": "node", + "childType": "Manage Stage Signals", + "autoAdd": true + }, + { + "name": "closeStageSignals", + "type": "node", + "childType": "Close Stage Signals", + "autoAdd": true + } + ] +} \ No newline at end of file diff --git a/Projects/Trading-Signals/Schemas/App-Schema/cancel-order-signal.json b/Projects/Trading-Signals/Schemas/App-Schema/cancel-order-signal.json new file mode 100644 index 000000000..655413c64 --- /dev/null +++ b/Projects/Trading-Signals/Schemas/App-Schema/cancel-order-signal.json @@ -0,0 +1,35 @@ +{ + "type": "Cancel Order Signal", + "menuItems": [ + { + "action": "Configure", + "actionFunction": "uiObject.configEditor.activate", + "label": "Configure", + "iconPathOn": "configuration", + "iconPathOff": "configuration" + }, + { + "action": "Delete UI Object", + "actionProject": "Visual-Scripting", + "askConfirmation": true, + "confirmationLabel": "Confirm to Delete", + "label": "Delete", + "iconPathOn": "delete-entity", + "iconPathOff": "delete-entity", + "actionFunction": "payload.executeAction" + } + ], + "editors": { + "config": true + }, + "initialValues": { + "config": "{}" + }, + "addLeftIcons": true, + "level": 2, + "attachingRules": { + "compatibleTypes": "->Limit Buy Order Signals->Limit Sell Order Signals->Market Buy Order Signals->Market Sell Order Signals->" + }, + "propertyNameAtParent": "cancelOrderSignal", + "childrenNodesProperties": [] +} \ No newline at end of file diff --git a/Projects/Trading-Signals/Schemas/App-Schema/close-stage-signals.json b/Projects/Trading-Signals/Schemas/App-Schema/close-stage-signals.json new file mode 100644 index 000000000..35b659c8c --- /dev/null +++ b/Projects/Trading-Signals/Schemas/App-Schema/close-stage-signals.json @@ -0,0 +1,92 @@ +{ + "type": "Close Stage Signals", + "menuItems": [ + { + "action": "Configure", + "actionFunction": "uiObject.configEditor.activate", + "label": "Configure", + "iconPathOn": "configuration", + "iconPathOff": "configuration" + }, + { + "action": "Add UI Object", + "actionProject": "Visual-Scripting", + "actionFunction": "payload.executeAction", + "label": "Add Limit Buy Order Signals", + "relatedUiObject": "Limit Buy Order Signals", + "relatedUiObjectProject": "Trading-Signals" + }, + { + "action": "Add UI Object", + "actionProject": "Visual-Scripting", + "actionFunction": "payload.executeAction", + "label": "Add Limit Sell Order Signals", + "relatedUiObject": "Limit Sell Order Signals", + "relatedUiObjectProject": "Trading-Signals" + }, + { + "action": "Add UI Object", + "actionProject": "Visual-Scripting", + "actionFunction": "payload.executeAction", + "label": "Add Market Buy Order Signals", + "relatedUiObject": "Market Buy Order Signals", + "relatedUiObjectProject": "Trading-Signals" + }, + { + "action": "Add UI Object", + "actionProject": "Visual-Scripting", + "actionFunction": "payload.executeAction", + "label": "Add Market Sell Order Signals", + "relatedUiObject": "Market Sell Order Signals", + "relatedUiObjectProject": "Trading-Signals" + }, + { + "action": "Delete UI Object", + "actionProject": "Visual-Scripting", + "askConfirmation": true, + "confirmationLabel": "Confirm to Delete", + "label": "Delete", + "iconPathOn": "delete-entity", + "iconPathOff": "delete-entity", + "actionFunction": "payload.executeAction" + } + ], + "editors": { + "config": true + }, + "initialValues": { + "config": "{}" + }, + "addLeftIcons": true, + "level": 2, + "attachingRules": { + "compatibleTypes": "->Available Signals->" + }, + "propertyNameAtParent": "closeStageSignals", + "childrenNodesProperties": [ + { + "name": "limitBuyOrderSignals", + "type": "array", + "childType": "Limit Buy Order Signals", + "autoAdd": false + }, + { + "name": "limitSellOrderSignals", + "type": "array", + "childType": "Limit Sell Order Signals", + "autoAdd": false + }, + { + "name": "marketBuyOrderSignals", + "type": "array", + "childType": "Market Buy Order Signals", + "autoAdd": false + }, + { + "name": "marketBuyOrderSignals", + "type": "array", + "childType": "Market Buy Order Signals", + "autoAdd": false + } + ] +} \ No newline at end of file diff --git a/Projects/Trading-Signals/Schemas/App-Schema/create-order-signal.json b/Projects/Trading-Signals/Schemas/App-Schema/create-order-signal.json new file mode 100644 index 000000000..6af30d62c --- /dev/null +++ b/Projects/Trading-Signals/Schemas/App-Schema/create-order-signal.json @@ -0,0 +1,35 @@ +{ + "type": "Create Order Signal", + "menuItems": [ + { + "action": "Configure", + "actionFunction": "uiObject.configEditor.activate", + "label": "Configure", + "iconPathOn": "configuration", + "iconPathOff": "configuration" + }, + { + "action": "Delete UI Object", + "actionProject": "Visual-Scripting", + "askConfirmation": true, + "confirmationLabel": "Confirm to Delete", + "label": "Delete", + "iconPathOn": "delete-entity", + "iconPathOff": "delete-entity", + "actionFunction": "payload.executeAction" + } + ], + "editors": { + "config": true + }, + "initialValues": { + "config": "{}" + }, + "addLeftIcons": true, + "level": 2, + "attachingRules": { + "compatibleTypes": "->Limit Buy Order Signals->Limit Sell Order Signals->Market Buy Order Signals->Market Sell Order Signals->" + }, + "propertyNameAtParent": "createOrderSignal", + "childrenNodesProperties": [] +} \ No newline at end of file diff --git a/Projects/Trading-Signals/Schemas/App-Schema/limit-buy-order-signals.json b/Projects/Trading-Signals/Schemas/App-Schema/limit-buy-order-signals.json new file mode 100644 index 000000000..f29296e15 --- /dev/null +++ b/Projects/Trading-Signals/Schemas/App-Schema/limit-buy-order-signals.json @@ -0,0 +1,68 @@ +{ + "type": "Limit Buy Order Signals", + "menuItems": [ + { + "action": "Configure", + "actionFunction": "uiObject.configEditor.activate", + "label": "Configure", + "iconPathOn": "configuration", + "iconPathOff": "configuration" + }, + { + "action": "Add UI Object", + "actionProject": "Visual-Scripting", + "disableIfPropertyIsDefined": true, + "propertyToCheckFor": "createOrderSignal", + "actionFunction": "payload.executeAction", + "label": "Add Create Order Signal", + "relatedUiObject": "Create Order Signal", + "relatedUiObjectProject": "Trading-Signals" + }, + { + "action": "Add UI Object", + "actionProject": "Visual-Scripting", + "disableIfPropertyIsDefined": true, + "propertyToCheckFor": "cancelOrderSignal", + "actionFunction": "payload.executeAction", + "label": "Add Cancel Order Signal", + "relatedUiObject": "Cancel Order Signal", + "relatedUiObjectProject": "Trading-Signals" + }, + { + "action": "Delete UI Object", + "actionProject": "Visual-Scripting", + "askConfirmation": true, + "confirmationLabel": "Confirm to Delete", + "label": "Delete", + "iconPathOn": "delete-entity", + "iconPathOff": "delete-entity", + "actionFunction": "payload.executeAction" + } + ], + "editors": { + "config": true + }, + "initialValues": { + "config": "{}" + }, + "addLeftIcons": true, + "level": 2, + "attachingRules": { + "compatibleTypes": "->Open Stage Signals->Close Stage Signals->" + }, + "propertyNameAtParent": "limitBuyOrderSignals", + "childrenNodesProperties": [ + { + "name": "createOrderSignal", + "type": "node", + "childType": "Create Order Signal", + "autoAdd": false + }, + { + "name": "cancelOrderSignal", + "type": "node", + "childType": "Cancel Order Signal", + "autoAdd": false + } + ] +} \ No newline at end of file diff --git a/Projects/Trading-Signals/Schemas/App-Schema/limit-sell-order-signals.json b/Projects/Trading-Signals/Schemas/App-Schema/limit-sell-order-signals.json new file mode 100644 index 000000000..7230b84c0 --- /dev/null +++ b/Projects/Trading-Signals/Schemas/App-Schema/limit-sell-order-signals.json @@ -0,0 +1,68 @@ +{ + "type": "Limit Sell Order Signals", + "menuItems": [ + { + "action": "Configure", + "actionFunction": "uiObject.configEditor.activate", + "label": "Configure", + "iconPathOn": "configuration", + "iconPathOff": "configuration" + }, + { + "action": "Add UI Object", + "actionProject": "Visual-Scripting", + "disableIfPropertyIsDefined": true, + "propertyToCheckFor": "createOrderSignal", + "actionFunction": "payload.executeAction", + "label": "Add Create Order Signal", + "relatedUiObject": "Create Order Signal", + "relatedUiObjectProject": "Trading-Signals" + }, + { + "action": "Add UI Object", + "actionProject": "Visual-Scripting", + "disableIfPropertyIsDefined": true, + "propertyToCheckFor": "cancelOrderSignal", + "actionFunction": "payload.executeAction", + "label": "Add Cancel Order Signal", + "relatedUiObject": "Cancel Order Signal", + "relatedUiObjectProject": "Trading-Signals" + }, + { + "action": "Delete UI Object", + "actionProject": "Visual-Scripting", + "askConfirmation": true, + "confirmationLabel": "Confirm to Delete", + "label": "Delete", + "iconPathOn": "delete-entity", + "iconPathOff": "delete-entity", + "actionFunction": "payload.executeAction" + } + ], + "editors": { + "config": true + }, + "initialValues": { + "config": "{}" + }, + "addLeftIcons": true, + "level": 2, + "attachingRules": { + "compatibleTypes": "->Open Stage Signals->Close Stage Signals->" + }, + "propertyNameAtParent": "limitSellOrderSignals", + "childrenNodesProperties": [ + { + "name": "createOrderSignal", + "type": "node", + "childType": "Create Order Signal", + "autoAdd": false + }, + { + "name": "cancelOrderSignal", + "type": "node", + "childType": "Cancel Order Signal", + "autoAdd": false + } + ] +} \ No newline at end of file diff --git a/Projects/Trading-Signals/Schemas/App-Schema/manage-stage-signals.json b/Projects/Trading-Signals/Schemas/App-Schema/manage-stage-signals.json new file mode 100644 index 000000000..d06bb452f --- /dev/null +++ b/Projects/Trading-Signals/Schemas/App-Schema/manage-stage-signals.json @@ -0,0 +1,35 @@ +{ + "type": "Manage Stage Signals", + "menuItems": [ + { + "action": "Configure", + "actionFunction": "uiObject.configEditor.activate", + "label": "Configure", + "iconPathOn": "configuration", + "iconPathOff": "configuration" + }, + { + "action": "Delete UI Object", + "actionProject": "Visual-Scripting", + "askConfirmation": true, + "confirmationLabel": "Confirm to Delete", + "label": "Delete", + "iconPathOn": "delete-entity", + "iconPathOff": "delete-entity", + "actionFunction": "payload.executeAction" + } + ], + "editors": { + "config": true + }, + "initialValues": { + "config": "{}" + }, + "addLeftIcons": true, + "level": 2, + "attachingRules": { + "compatibleTypes": "->Available Signals->" + }, + "propertyNameAtParent": "manageStageSignals", + "childrenNodesProperties": [] +} \ No newline at end of file diff --git a/Projects/Trading-Signals/Schemas/App-Schema/market-buy-order-signals.json b/Projects/Trading-Signals/Schemas/App-Schema/market-buy-order-signals.json new file mode 100644 index 000000000..13d5fe877 --- /dev/null +++ b/Projects/Trading-Signals/Schemas/App-Schema/market-buy-order-signals.json @@ -0,0 +1,68 @@ +{ + "type": "Market Buy Order Signals", + "menuItems": [ + { + "action": "Configure", + "actionFunction": "uiObject.configEditor.activate", + "label": "Configure", + "iconPathOn": "configuration", + "iconPathOff": "configuration" + }, + { + "action": "Add UI Object", + "actionProject": "Visual-Scripting", + "disableIfPropertyIsDefined": true, + "propertyToCheckFor": "createOrderSignal", + "actionFunction": "payload.executeAction", + "label": "Add Create Order Signal", + "relatedUiObject": "Create Order Signal", + "relatedUiObjectProject": "Trading-Signals" + }, + { + "action": "Add UI Object", + "actionProject": "Visual-Scripting", + "disableIfPropertyIsDefined": true, + "propertyToCheckFor": "cancelOrderSignal", + "actionFunction": "payload.executeAction", + "label": "Add Cancel Order Signal", + "relatedUiObject": "Cancel Order Signal", + "relatedUiObjectProject": "Trading-Signals" + }, + { + "action": "Delete UI Object", + "actionProject": "Visual-Scripting", + "askConfirmation": true, + "confirmationLabel": "Confirm to Delete", + "label": "Delete", + "iconPathOn": "delete-entity", + "iconPathOff": "delete-entity", + "actionFunction": "payload.executeAction" + } + ], + "editors": { + "config": true + }, + "initialValues": { + "config": "{}" + }, + "addLeftIcons": true, + "level": 2, + "attachingRules": { + "compatibleTypes": "->Open Stage Signals->Close Stage Signals->" + }, + "propertyNameAtParent": "marketBuyOrderSignals", + "childrenNodesProperties": [ + { + "name": "createOrderSignal", + "type": "node", + "childType": "Create Order Signal", + "autoAdd": false + }, + { + "name": "cancelOrderSignal", + "type": "node", + "childType": "Cancel Order Signal", + "autoAdd": false + } + ] +} \ No newline at end of file diff --git a/Projects/Trading-Signals/Schemas/App-Schema/market-sell-order-signals.json b/Projects/Trading-Signals/Schemas/App-Schema/market-sell-order-signals.json new file mode 100644 index 000000000..f57d03681 --- /dev/null +++ b/Projects/Trading-Signals/Schemas/App-Schema/market-sell-order-signals.json @@ -0,0 +1,68 @@ +{ + "type": "Market Sell Order Signals", + "menuItems": [ + { + "action": "Configure", + "actionFunction": "uiObject.configEditor.activate", + "label": "Configure", + "iconPathOn": "configuration", + "iconPathOff": "configuration" + }, + { + "action": "Add UI Object", + "actionProject": "Visual-Scripting", + "disableIfPropertyIsDefined": true, + "propertyToCheckFor": "createOrderSignal", + "actionFunction": "payload.executeAction", + "label": "Add Create Order Signal", + "relatedUiObject": "Create Order Signal", + "relatedUiObjectProject": "Trading-Signals" + }, + { + "action": "Add UI Object", + "actionProject": "Visual-Scripting", + "disableIfPropertyIsDefined": true, + "propertyToCheckFor": "cancelOrderSignal", + "actionFunction": "payload.executeAction", + "label": "Add Cancel Order Signal", + "relatedUiObject": "Cancel Order Signal", + "relatedUiObjectProject": "Trading-Signals" + }, + { + "action": "Delete UI Object", + "actionProject": "Visual-Scripting", + "askConfirmation": true, + "confirmationLabel": "Confirm to Delete", + "label": "Delete", + "iconPathOn": "delete-entity", + "iconPathOff": "delete-entity", + "actionFunction": "payload.executeAction" + } + ], + "editors": { + "config": true + }, + "initialValues": { + "config": "{}" + }, + "addLeftIcons": true, + "level": 2, + "attachingRules": { + "compatibleTypes": "->Open Stage Signals->Close Stage Signals->" + }, + "propertyNameAtParent": "marketSellOrderSignals", + "childrenNodesProperties": [ + { + "name": "createOrderSignal", + "type": "node", + "childType": "Create Order Signal", + "autoAdd": false + }, + { + "name": "cancelOrderSignal", + "type": "node", + "childType": "Cancel Order Signal", + "autoAdd": false + } + ] +} \ No newline at end of file diff --git a/Projects/Trading-Signals/Schemas/App-Schema/open-stage-signals.json b/Projects/Trading-Signals/Schemas/App-Schema/open-stage-signals.json new file mode 100644 index 000000000..74b0b0d57 --- /dev/null +++ b/Projects/Trading-Signals/Schemas/App-Schema/open-stage-signals.json @@ -0,0 +1,92 @@ +{ + "type": "Open Stage Signals", + "menuItems": [ + { + "action": "Configure", + "actionFunction": "uiObject.configEditor.activate", + "label": "Configure", + "iconPathOn": "configuration", + "iconPathOff": "configuration" + }, + { + "action": "Add UI Object", + "actionProject": "Visual-Scripting", + "actionFunction": "payload.executeAction", + "label": "Add Limit Buy Order Signals", + "relatedUiObject": "Limit Buy Order Signals", + "relatedUiObjectProject": "Trading-Signals" + }, + { + "action": "Add UI Object", + "actionProject": "Visual-Scripting", + "actionFunction": "payload.executeAction", + "label": "Add Limit Sell Order Signals", + "relatedUiObject": "Limit Sell Order Signals", + "relatedUiObjectProject": "Trading-Signals" + }, + { + "action": "Add UI Object", + "actionProject": "Visual-Scripting", + "actionFunction": "payload.executeAction", + "label": "Add Market Buy Order Signals", + "relatedUiObject": "Market Buy Order Signals", + "relatedUiObjectProject": "Trading-Signals" + }, + { + "action": "Add UI Object", + "actionProject": "Visual-Scripting", + "actionFunction": "payload.executeAction", + "label": "Add Market Sell Order Signals", + "relatedUiObject": "Market Sell Order Signals", + "relatedUiObjectProject": "Trading-Signals" + }, + { + "action": "Delete UI Object", + "actionProject": "Visual-Scripting", + "askConfirmation": true, + "confirmationLabel": "Confirm to Delete", + "label": "Delete", + "iconPathOn": "delete-entity", + "iconPathOff": "delete-entity", + "actionFunction": "payload.executeAction" + } + ], + "editors": { + "config": true + }, + "initialValues": { + "config": "{}" + }, + "addLeftIcons": true, + "level": 2, + "attachingRules": { + "compatibleTypes": "->Available Signals->" + }, + "propertyNameAtParent": "openStageSignals", + "childrenNodesProperties": [ + { + "name": "limitBuyOrderSignals", + "type": "array", + "childType": "Limit Buy Order Signals", + "autoAdd": false + }, + { + "name": "limitSellOrderSignals", + "type": "array", + "childType": "Limit Sell Order Signals", + "autoAdd": false + }, + { + "name": "marketBuyOrderSignals", + "type": "array", + "childType": "Market Buy Order Signals", + "autoAdd": false + }, + { + "name": "marketSellOrderSignals", + "type": "array", + "childType": "Market Sell Order Signals", + "autoAdd": false + } + ] +} \ No newline at end of file diff --git a/Projects/Trading-Signals/Schemas/App-Schema/take-position-signal.json b/Projects/Trading-Signals/Schemas/App-Schema/take-position-signal.json new file mode 100644 index 000000000..b499c2fa4 --- /dev/null +++ b/Projects/Trading-Signals/Schemas/App-Schema/take-position-signal.json @@ -0,0 +1,35 @@ +{ + "type": "Take Position Signal", + "menuItems": [ + { + "action": "Configure", + "actionFunction": "uiObject.configEditor.activate", + "label": "Configure", + "iconPathOn": "configuration", + "iconPathOff": "configuration" + }, + { + "action": "Delete UI Object", + "actionProject": "Visual-Scripting", + "askConfirmation": true, + "confirmationLabel": "Confirm to Delete", + "label": "Delete", + "iconPathOn": "delete-entity", + "iconPathOff": "delete-entity", + "actionFunction": "payload.executeAction" + } + ], + "editors": { + "config": true + }, + "initialValues": { + "config": "{}" + }, + "addLeftIcons": true, + "level": 2, + "attachingRules": { + "compatibleTypes": "->Trigger Stage Signals->" + }, + "propertyNameAtParent": "takePositionSignal", + "childrenNodesProperties": [] +} \ No newline at end of file diff --git a/Projects/Trading-Signals/Schemas/App-Schema/trigger-off-signal.json b/Projects/Trading-Signals/Schemas/App-Schema/trigger-off-signal.json new file mode 100644 index 000000000..55000aa3a --- /dev/null +++ b/Projects/Trading-Signals/Schemas/App-Schema/trigger-off-signal.json @@ -0,0 +1,35 @@ +{ + "type": "Trigger Off Signal", + "menuItems": [ + { + "action": "Configure", + "actionFunction": "uiObject.configEditor.activate", + "label": "Configure", + "iconPathOn": "configuration", + "iconPathOff": "configuration" + }, + { + "action": "Delete UI Object", + "actionProject": "Visual-Scripting", + "askConfirmation": true, + "confirmationLabel": "Confirm to Delete", + "label": "Delete", + "iconPathOn": "delete-entity", + "iconPathOff": "delete-entity", + "actionFunction": "payload.executeAction" + } + ], + "editors": { + "config": true + }, + "initialValues": { + "config": "{}" + }, + "addLeftIcons": true, + "level": 2, + "attachingRules": { + "compatibleTypes": "->Trigger Stage Signals->" + }, + "propertyNameAtParent": "triggerOffSignal", + "childrenNodesProperties": [] +} \ No newline at end of file diff --git a/Projects/Trading-Signals/Schemas/App-Schema/trigger-on-signal.json b/Projects/Trading-Signals/Schemas/App-Schema/trigger-on-signal.json new file mode 100644 index 000000000..cadb33343 --- /dev/null +++ b/Projects/Trading-Signals/Schemas/App-Schema/trigger-on-signal.json @@ -0,0 +1,35 @@ +{ + "type": "Trigger On Signal", + "menuItems": [ + { + "action": "Configure", + "actionFunction": "uiObject.configEditor.activate", + "label": "Configure", + "iconPathOn": "configuration", + "iconPathOff": "configuration" + }, + { + "action": "Delete UI Object", + "actionProject": "Visual-Scripting", + "askConfirmation": true, + "confirmationLabel": "Confirm to Delete", + "label": "Delete", + "iconPathOn": "delete-entity", + "iconPathOff": "delete-entity", + "actionFunction": "payload.executeAction" + } + ], + "editors": { + "config": true + }, + "initialValues": { + "config": "{}" + }, + "addLeftIcons": true, + "level": 2, + "attachingRules": { + "compatibleTypes": "->Trigger Stage Signals->" + }, + "propertyNameAtParent": "triggerOnSignal", + "childrenNodesProperties": [] +} \ No newline at end of file diff --git a/Projects/Trading-Signals/Schemas/App-Schema/trigger-stage-signals.json b/Projects/Trading-Signals/Schemas/App-Schema/trigger-stage-signals.json new file mode 100644 index 000000000..e72bea290 --- /dev/null +++ b/Projects/Trading-Signals/Schemas/App-Schema/trigger-stage-signals.json @@ -0,0 +1,84 @@ +{ + "type": "Trigger Stage Signals", + "menuItems": [ + { + "action": "Configure", + "actionFunction": "uiObject.configEditor.activate", + "label": "Configure", + "iconPathOn": "configuration", + "iconPathOff": "configuration" + }, + { + "action": "Add UI Object", + "actionProject": "Visual-Scripting", + "disableIfPropertyIsDefined": true, + "propertyToCheckFor": "triggerOnSignal", + "actionFunction": "payload.executeAction", + "label": "Add Trigger On Signal", + "relatedUiObject": "Trigger On Signal", + "relatedUiObjectProject": "Trading-Signals" + }, + { + "action": "Add UI Object", + "actionProject": "Visual-Scripting", + "disableIfPropertyIsDefined": true, + "propertyToCheckFor": "triggerOffSignal", + "actionFunction": "payload.executeAction", + "label": "Add Trigger Off Signal", + "relatedUiObject": "Trigger Off Signal", + "relatedUiObjectProject": "Trading-Signals" + }, + { + "action": "Add UI Object", + "actionProject": "Visual-Scripting", + "disableIfPropertyIsDefined": true, + "propertyToCheckFor": "takePositionSignal", + "actionFunction": "payload.executeAction", + "label": "Add Take Position Signal", + "relatedUiObject": "Take Position Signal", + "relatedUiObjectProject": "Trading-Signals" + }, + { + "action": "Delete UI Object", + "actionProject": "Visual-Scripting", + "askConfirmation": true, + "confirmationLabel": "Confirm to Delete", + "label": "Delete", + "iconPathOn": "delete-entity", + "iconPathOff": "delete-entity", + "actionFunction": "payload.executeAction" + } + ], + "editors": { + "config": true + }, + "initialValues": { + "config": "{}" + }, + "addLeftIcons": true, + "level": 2, + "attachingRules": { + "compatibleTypes": "->Available Signals->" + }, + "propertyNameAtParent": "triggerStageSignals", + "childrenNodesProperties": [ + { + "name": "triggerOnSignal", + "type": "node", + "childType": "Trigger On Signal", + "autoAdd": true + }, + { + "name": "triggerOffSignal", + "type": "node", + "childType": "Trigger Off Signal", + "autoAdd": true + }, + { + "name": "takePositionSignal", + "type": "node", + "childType": "Take Position Signal", + "autoAdd": true + } + ] +} \ No newline at end of file diff --git a/Projects/Trading-Signals/TS/Bot-Modules/TradingSignals.js b/Projects/Trading-Signals/TS/Bot-Modules/TradingSignals.js new file mode 100644 index 000000000..b000feecb --- /dev/null +++ b/Projects/Trading-Signals/TS/Bot-Modules/TradingSignals.js @@ -0,0 +1,128 @@ +exports.newTradingSignalsBotModulesTradingSignals = function (processIndex) { + + let thisObject = { + makeAnnouncements: makeAnnouncements, + initialize: initialize, + finalize: finalize + } + + let tradingSystem + let tradingEngine + let sessionParameters + let taskParameters + + return thisObject + + function initialize() { + tradingSystem = TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).SIMULATION_STATE.tradingSystem + tradingEngine = TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).SIMULATION_STATE.tradingEngine + sessionParameters = TS.projects.foundations.globals.processConstants.CONSTANTS_BY_PROCESS_INDEX_MAP.get(processIndex).SESSION_NODE.tradingParameters + + taskParameters = { + exchange: TS.projects.foundations.globals.taskConstants.TASK_NODE.parentNode.parentNode.parentNode.referenceParent.parentNode.parentNode.name, + market: TS.projects.foundations.globals.taskConstants.TASK_NODE.parentNode.parentNode.parentNode.referenceParent.baseAsset.referenceParent.config.codeName + + '/' + + TS.projects.foundations.globals.taskConstants.TASK_NODE.parentNode.parentNode.parentNode.referenceParent.quotedAsset.referenceParent.config.codeName + } + } + + function finalize() { + tradingSystem = undefined + tradingEngine = undefined + sessionParameters = undefined + taskParameters = undefined + TS.projects.foundations.globals.processConstants.CONSTANTS_BY_PROCESS_INDEX_MAP.get(processIndex).SESSION_NODE.messagesSent = undefined + } + + function makeAnnouncements(node, status='Open') { + if (node === undefined) { return } + if (node.announcements === undefined) { return } + + for (let i = 0; i < node.announcements.length; i++) { + let announcement = node.announcements[i] + let canAnnounce = true + + // Check configuration to see if Announcement should be run at Enter or Exit of Node + // set defaults, protect against empty configurations or missing values + let onEnter = true + let onExit = false + if (announcement.config.onEnter !== undefined) { + onEnter = announcement.config.onEnter + } + if (announcement.config.onExit !== undefined) { + onExit = announcement.config.onExit + if (announcement.config.onEnter === undefined) { + onEnter = false + } + } + if ((status === 'Open' && onEnter) || (status === 'Closed' && onExit)) { + canAnnounce = true + } else { + canAnnounce = false + } + + if (announcement.announcementCondition !== undefined) { + let conditionValue + try { + conditionValue = eval(announcement.announcementCondition.code) + } catch (err) { + + const message = 'Announcement Condition Evaluation Error' + let docs = { + project: 'Foundations', + category: 'Topic', + type: 'TS LF Trading Bot Error - ' + message, + placeholder: {} + } + + TS.projects.education.utilities.docsFunctions.buildPlaceholder(docs, err, announcement.announcementCondition.name, announcement.announcementCondition.code, undefined, undefined, undefined) + + tradingSystem.addError([announcement.announcementCondition.id, err.message, docs]) + } + if (conditionValue !== true) { canAnnounce = false } + } + if (canAnnounce === true) { + let text = announcement.config.text + if (announcement.announcementFormula !== undefined) { + let formulaValue + let errorMessage + + try { + formulaValue = eval(announcement.announcementFormula.code) + } catch (err) { + + errorMessage = err.message + const message = 'Announcement Formula Evaluation Error' + let docs = { + project: 'Foundations', + category: 'Topic', + type: 'TS LF Trading Bot Error - ' + message, + placeholder: {} + } + + TS.projects.education.utilities.docsFunctions.buildPlaceholder(docs, err, announcement.announcementFormula.name, announcement.announcementFormula.code, undefined, undefined, undefined) + + tradingSystem.addError([announcement.announcementFormula.id, err.message, docs]) + } + if (errorMessage == undefined) { text = formulaValue } + } + + if (TS.projects.foundations.globals.processConstants.CONSTANTS_BY_PROCESS_INDEX_MAP.get(processIndex).SESSION_NODE.socialBots !== undefined) { + TS.projects.foundations.globals.processConstants.CONSTANTS_BY_PROCESS_INDEX_MAP.get(processIndex).SESSION_NODE.socialBots.announce(text) + tradingSystem.announcements.push([announcement.id, text]) + } else { + + const message = 'Social Bots Node Missing' + let docs = { + project: 'Foundations', + category: 'Topic', + type: 'TS LF Trading Bot Error - ' + message, + placeholder: {} + } + + tradingSystem.addError([TS.projects.foundations.globals.processConstants.CONSTANTS_BY_PROCESS_INDEX_MAP.get(processIndex).SESSION_NODE.id, message, docs]) + } + } + } + } +} diff --git a/Projects/Trading-Signals/UI/Function-Libraries/ActionSwitch.js b/Projects/Trading-Signals/UI/Function-Libraries/ActionSwitch.js new file mode 100644 index 000000000..8bd40ffc6 --- /dev/null +++ b/Projects/Trading-Signals/UI/Function-Libraries/ActionSwitch.js @@ -0,0 +1,31 @@ +function newSocialBotsActionSwitch() { + + let thisObject = { + executeAction: executeAction, + initialize: initialize, + finalize: finalize + } + + return thisObject + + function finalize() { + + } + + function initialize() { + /* Nothing to initialize since a Function Library does not hold any state. */ + } + + async function executeAction(action) { + switch (action.name) { + case 'Send Telegram Test Message': + { + UI.projects.socialBots.functionLibraries.socialBotsFunctions.sendTelegramTestMessage(action.node, action.callBackFunction) + } + break + default: { + console.log("[WARN] Action sent to Social-Bots Action Switch does not belong here. Verify at the App Schema file of the node that triggered this action that the actionProject is pointing to the right project. -> Action = " + action.name + " -> Action Node Name = " + action.node.name) + } + } + } +} diff --git a/Projects/Trading-Signals/UI/Function-Libraries/TradingSignalsFunctions.js b/Projects/Trading-Signals/UI/Function-Libraries/TradingSignalsFunctions.js new file mode 100644 index 000000000..fcdf3d8a8 --- /dev/null +++ b/Projects/Trading-Signals/UI/Function-Libraries/TradingSignalsFunctions.js @@ -0,0 +1,73 @@ +function newSocialBotsFunctionLibraryTradingSignalsFunctions() { + let thisObject = { + sendTelegramTestMessage: sendTelegramTestMessage + } + + return thisObject + + function sendTelegramTestMessage(node, callBackFunction) { + + let botToken = UI.projects.visualScripting.utilities.nodeConfig.loadConfigProperty(node.payload, 'botToken') + let chatId = UI.projects.visualScripting.utilities.nodeConfig.loadConfigProperty(node.payload, 'chatId') + + if (botToken === undefined) { + node.payload.uiObject.setErrorMessage('botToken parameter not defined.') + callBackFunction(GLOBAL.DEFAULT_FAIL_RESPONSE) + return + } + + if (chatId === undefined) { + node.payload.uiObject.setErrorMessage('chatId parameter not defined.') + callBackFunction(GLOBAL.DEFAULT_FAIL_RESPONSE) + return + } + + let params = { + text: "Test Message from Superalgos", + chat_id: chatId + } + + httpRequestJSON(JSON.stringify(params),"https://api.telegram.org/bot" + botToken + "/sendMessage", onResponse) + + function onResponse(err) { + if (err.result === GLOBAL.DEFAULT_OK_RESPONSE.result) { + node.payload.uiObject.setInfoMessage('Telegram message sent.') + callBackFunction(GLOBAL.DEFAULT_OK_RESPONSE) + } else { + node.payload.uiObject.setErrorMessage('Could not send Telegram message. Error Response: ' + err.message) + callBackFunction(GLOBAL.DEFAULT_FAIL_RESPONSE) + } + } + + function httpRequestJSON(pContentToSend, pPath, callBackFunction) { + let xmlHttpRequest = new XMLHttpRequest(); + xmlHttpRequest.onreadystatechange = function () { + if (this.readyState === 4 && this.status === 200) { + callBackFunction(GLOBAL.DEFAULT_OK_RESPONSE, xmlHttpRequest.responseText); + return; + } else if (this.readyState === 4 && (this.status === 404 || this.status === 401 || this.status === 400)) { + callBackFunction({ + result: "Fail", + message: JSON.parse(xmlHttpRequest.responseText).description, + code: JSON.parse(xmlHttpRequest.responseText).error_code + }); + return; + } + }; + + if (pContentToSend === undefined) { + xmlHttpRequest.open("GET", pPath, true); + xmlHttpRequest.send(); + } else { + try { + let blob = new Blob([pContentToSend], { type: 'application/json' }); + xmlHttpRequest.open("POST", pPath, true); + xmlHttpRequest.send(blob); + } catch (err) { + if (ERROR_LOG === true) { console.log(spacePad(MODULE_NAME, 50) + " : " + "[ERROR] callServer -> err.message = " & err.message); } + callBackFunction({ result: "Fail", message: err.message }) + } + } + } + } +}