Merge branch 'develop' of https://github.com/Superalgos/Superalgos into develop

This commit is contained in:
Luis Fernando Molina committed 2021-04-06 21:09:24 +02:00
commit 418c6bb83e
46 files changed
+1560 -191

No files matched your search

@@ -0,0 +1 @@
{"type":"Workspace","name":"Creating Custom Charts","rootNodes":[{"type":"Network","name":"My Network","project":"Superalgos","networkNodes":[{"type":"Network Node","name":"My Computer","config":"{ \n\"host\": \"localhost\", \n\"webPort\": \"34248\", \n\"webSocketsPort\": \"18041\"\n}","project":"Superalgos","dataTasks":{"type":"Data Tasks","name":"New Data Tasks","project":"Superalgos","projectDataTasks":[{"type":"Project Data Tasks","name":"Superalgos","project":"Superalgos","exchangeDataTasks":[{"type":"Exchange Data Tasks","name":"Binanceus","project":"Superalgos","marketDataTasks":[{"type":"Market Data Tasks","name":"Binanceus BTC/USDT","project":"Superalgos","dataMineTasks":[{"type":"Data Mine Tasks","name":"Masters","project":"Superalgos","taskManagers":[{"type":"Task Manager","name":"Masters","project":"Superalgos","tasks":[{"type":"Task","name":"Exchange Raw Data","project":"Superalgos","bot":{"type":"Sensor Bot Instance","name":"Exchange Raw Data","config":"{ \n\"startDate\": \"2020-01-01\"\n}","project":"Superalgos","processes":[{"type":"Sensor Process Instance","name":"Exchange Raw Data Historic-OHLCVs","project":"Superalgos","id":"d244c564-4e86-43c7-9796-dc3b6294ec8b","savedPayload":{"position":{"x":26497.378634092645,"y":28190.39686701245},"targetPosition":{"x":26757.186255227978,"y":28040.39686701245},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Historic-OHLCVs","id":"5eb11d6a-022e-4f60-97c4-d6cf90b249dc"}}}],"id":"343313ae-5705-484d-8bf8-aed25ba61cfa","savedPayload":{"position":{"x":26757.186255227978,"y":28040.39686701245},"targetPosition":{"x":27016.99387636331,"y":27890.39686701245},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"id":"a8f38508-1cac-4ab1-815f-d338fc813377","savedPayload":{"position":{"x":27016.99387636331,"y":27890.39686701245},"targetPosition":{"x":27276.801497498644,"y":27740.39686701245},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Task","name":"Candles Volumes","project":"Superalgos","bot":{"type":"Indicator Bot Instance","name":"Candles Volumes","config":"{}","project":"Superalgos","processes":[{"type":"Indicator Process Instance","name":"Candles Volumes Multi-Period-Market","project":"Superalgos","id":"f0ef12ed-f0fd-4b88-8e15-27cf24265a5f","savedPayload":{"position":{"x":26407.46825383848,"y":27662.75115348169},"targetPosition":{"x":26697.2460017252,"y":27585.105439950934},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Multi-Period-Market","id":"9f683143-a33f-42c1-9fa8-c601f01ee4e1"}}},{"type":"Indicator Process Instance","name":"Candles Volumes Multi-Period-Daily","project":"Superalgos","id":"7c8b312c-09bf-4c59-853f-1592391a9c57","savedPayload":{"position":{"x":26485.113967369238,"y":27372.97340559497},"targetPosition":{"x":26697.2460017252,"y":27585.105439950934},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Multi-Period-Daily","id":"980ceb1d-7be6-454f-90d9-01ba1fd4a65d"}}}],"id":"8d58e84b-d7ef-464f-8079-0ec0887e3da3","savedPayload":{"position":{"x":26697.2460017252,"y":27585.105439950934},"targetPosition":{"x":26987.023749611923,"y":27662.75115348169},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"id":"bf29e3bd-9386-408b-9091-042da0c53e81","savedPayload":{"position":{"x":26987.023749611923,"y":27662.75115348169},"targetPosition":{"x":27276.801497498644,"y":27740.39686701245},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Task","name":"Resistances and Supports","project":"Superalgos","bot":{"type":"Indicator Bot Instance","name":"Resistances and Supports","config":"{}","project":"Superalgos","processes":[{"type":"Indicator Process Instance","name":"Resistances and Supports Multi-Period-Market","project":"Superalgos","id":"a707814e-b81b-4102-9b5b-4e2fe969324f","savedPayload":{"position":{"x":26716.99387636331,"y":27070.781624741783},"targetPosition":{"x":26976.801497498644,"y":27220.781624741783},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referencePLine truncated
@@ -1 +1 @@
{"type":"Workspace","name":"Getting Started","rootNodes":[{"type":"Network","name":"My Network","project":"Superalgos","networkNodes":[{"type":"Network Node","name":"My Computer","config":"{ \n\"host\": \"localhost\", \n\"webPort\": \"34248\", \n\"webSocketsPort\": \"18041\"\n}","project":"Superalgos","dataTasks":{"type":"Data Tasks","name":"New Data Tasks","project":"Superalgos","projectDataTasks":[{"type":"Project Data Tasks","name":"Superalgos","project":"Superalgos","exchangeDataTasks":[{"type":"Exchange Data Tasks","name":"Binance","project":"Superalgos","marketDataTasks":[{"type":"Market Data Tasks","name":"Binance BTC/USDT","project":"Superalgos","dataMineTasks":[{"type":"Data Mine Tasks","name":"Masters","project":"Superalgos","taskManagers":[{"type":"Task Manager","name":"Masters","project":"Superalgos","tasks":[{"type":"Task","name":"Exchange Raw Data","project":"Superalgos","bot":{"type":"Sensor Bot Instance","name":"Exchange Raw Data","config":"{ \n\"startDate\": \"2020-01-01\"\n}","project":"Superalgos","processes":[{"type":"Sensor Process Instance","name":"Exchange Raw Data Historic-OHLCVs","project":"Superalgos","id":"d244c564-4e86-43c7-9796-dc3b6294ec8b","savedPayload":{"position":{"x":23490.023749611923,"y":29239.135911211026},"targetPosition":{"x":23779.801497498644,"y":29316.781624741783},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Historic-OHLCVs","id":"5eb11d6a-022e-4f60-97c4-d6cf90b249dc"}}}],"id":"343313ae-5705-484d-8bf8-aed25ba61cfa","savedPayload":{"position":{"x":23779.801497498644,"y":29316.781624741783},"targetPosition":{"x":24069.579245385365,"y":29394.42733827254},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"id":"a8f38508-1cac-4ab1-815f-d338fc813377","savedPayload":{"position":{"x":24069.579245385365,"y":29394.42733827254},"targetPosition":{"x":24359.356993272086,"y":29472.073051803298},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Task","name":"Candles Volumes","project":"Superalgos","bot":{"type":"Indicator Bot Instance","name":"Candles Volumes","config":"{}","project":"Superalgos","processes":[{"type":"Indicator Process Instance","name":"Candles Volumes Multi-Period-Market","project":"Superalgos","id":"f0ef12ed-f0fd-4b88-8e15-27cf24265a5f","savedPayload":{"position":{"x":23799.549372136753,"y":28802.457809532632},"targetPosition":{"x":24059.356993272086,"y":28952.457809532632},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Multi-Period-Market","id":"9f683143-a33f-42c1-9fa8-c601f01ee4e1"}}},{"type":"Indicator Process Instance","name":"Candles Volumes Multi-Period-Daily","project":"Superalgos","id":"7c8b312c-09bf-4c59-853f-1592391a9c57","savedPayload":{"position":{"x":24059.356993272086,"y":28652.457809532632},"targetPosition":{"x":24059.356993272086,"y":28952.457809532632},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Multi-Period-Daily","id":"980ceb1d-7be6-454f-90d9-01ba1fd4a65d"}}}],"id":"8d58e84b-d7ef-464f-8079-0ec0887e3da3","savedPayload":{"position":{"x":24059.356993272086,"y":28952.457809532632},"targetPosition":{"x":24209.356993272086,"y":29212.265430667965},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"id":"bf29e3bd-9386-408b-9091-042da0c53e81","savedPayload":{"position":{"x":24209.356993272086,"y":29212.265430667965},"targetPosition":{"x":24359.356993272086,"y":29472.073051803298},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Task","name":"Resistances and Supports","project":"Superalgos","bot":{"type":"Indicator Bot Instance","name":"Resistances and Supports","config":"{}","project":"Superalgos","processes":[{"type":"Indicator Process Instance","name":"Resistances and Supports Multi-Period-Market","project":"Superalgos","id":"a707814e-b81b-4102-9b5b-4e2fe969324f","savedPayload":{"position":{"x":24437.002706802843,"y":28602.739808143135},"targetPosition":{"x":24514.6484203336,"y":28892.517556029856},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"refeLine truncated
{"type":"Workspace","name":"Getting Started","rootNodes":[{"type":"Network","name":"My Network","project":"Superalgos","networkNodes":[{"type":"Network Node","name":"My Computer","config":"{ \n\"host\": \"localhost\", \n\"webPort\": \"34248\", \n\"webSocketsPort\": \"18041\"\n}","project":"Superalgos","dataTasks":{"type":"Data Tasks","name":"New Data Tasks","project":"Superalgos","projectDataTasks":[{"type":"Project Data Tasks","name":"Superalgos","project":"Superalgos","exchangeDataTasks":[{"type":"Exchange Data Tasks","name":"Binance","project":"Superalgos","marketDataTasks":[{"type":"Market Data Tasks","name":"Binance BTC/USDT","project":"Superalgos","dataMineTasks":[{"type":"Data Mine Tasks","name":"Masters","project":"Superalgos","taskManagers":[{"type":"Task Manager","name":"Masters","project":"Superalgos","tasks":[{"type":"Task","name":"Exchange Raw Data","project":"Superalgos","bot":{"type":"Sensor Bot Instance","name":"Exchange Raw Data","config":"{ \n\"startDate\": \"2020-01-01\"\n}","project":"Superalgos","processes":[{"type":"Sensor Process Instance","name":"Exchange Raw Data Historic-OHLCVs","project":"Superalgos","id":"d244c564-4e86-43c7-9796-dc3b6294ec8b","savedPayload":{"position":{"x":23490.023749611923,"y":29239.135911211026},"targetPosition":{"x":23779.801497498644,"y":29316.781624741783},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Historic-OHLCVs","id":"5eb11d6a-022e-4f60-97c4-d6cf90b249dc"}}}],"id":"343313ae-5705-484d-8bf8-aed25ba61cfa","savedPayload":{"position":{"x":23779.801497498644,"y":29316.781624741783},"targetPosition":{"x":24069.579245385365,"y":29394.42733827254},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"id":"a8f38508-1cac-4ab1-815f-d338fc813377","savedPayload":{"position":{"x":24069.579245385365,"y":29394.42733827254},"targetPosition":{"x":24359.356993272086,"y":29472.073051803298},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Task","name":"Candles Volumes","project":"Superalgos","bot":{"type":"Indicator Bot Instance","name":"Candles Volumes","config":"{}","project":"Superalgos","processes":[{"type":"Indicator Process Instance","name":"Candles Volumes Multi-Period-Market","project":"Superalgos","id":"f0ef12ed-f0fd-4b88-8e15-27cf24265a5f","savedPayload":{"position":{"x":23799.549372136753,"y":28802.457809532632},"targetPosition":{"x":24059.356993272086,"y":28952.457809532632},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Multi-Period-Market","id":"9f683143-a33f-42c1-9fa8-c601f01ee4e1"}}},{"type":"Indicator Process Instance","name":"Candles Volumes Multi-Period-Daily","project":"Superalgos","id":"7c8b312c-09bf-4c59-853f-1592391a9c57","savedPayload":{"position":{"x":24059.356993272086,"y":28652.457809532632},"targetPosition":{"x":24059.356993272086,"y":28952.457809532632},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Multi-Period-Daily","id":"980ceb1d-7be6-454f-90d9-01ba1fd4a65d"}}}],"id":"8d58e84b-d7ef-464f-8079-0ec0887e3da3","savedPayload":{"position":{"x":24059.356993272086,"y":28952.457809532632},"targetPosition":{"x":24209.356993272086,"y":29212.265430667965},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"id":"bf29e3bd-9386-408b-9091-042da0c53e81","savedPayload":{"position":{"x":24209.356993272086,"y":29212.265430667965},"targetPosition":{"x":24359.356993272086,"y":29472.073051803298},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Task","name":"Resistances and Supports","project":"Superalgos","bot":{"type":"Indicator Bot Instance","name":"Resistances and Supports","config":"{}","project":"Superalgos","processes":[{"type":"Indicator Process Instance","name":"Resistances and Supports Multi-Period-Market","project":"Superalgos","id":"a707814e-b81b-4102-9b5b-4e2fe969324f","savedPayload":{"position":{"x":24437.002706802843,"y":28602.739808143135},"targetPosition":{"x":24514.6484203336,"y":28892.517556029856},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"refeLine truncated
@@ -42,8 +42,13 @@
},
{
"style": "Chapter",
"text": "VIII->Superalgos->Topic->Order Management->One of the crucial aspects of trading automation is the management of orders. The system operates with assumptions that must be verified and synchronized with the exchange. Learning how the Low-Frequency Trading Bot manages orders will help you understand the life cycle of orders and how your definitions in the Open Stage and the Close Stage affect the results.",
"updated": 1611237227549
"text": "VIII->Superalgos->Topic->LF Trading Bot Available Data Structures->This chapter describes the three main data structures made available by the Trading Bot.",
"updated": 1617708146321
},
{
"style": "Chapter",
"text": "IX->Superalgos->Topic->Order Management->One of the crucial aspects of trading automation is the management of orders. The system operates with assumptions that must be verified and synchronized with the exchange. Learning how the Low-Frequency Trading Bot manages orders will help you understand the life cycle of orders and how your definitions in the Open Stage and the Close Stage affect the results.",
"updated": 1617708175194
},
{
"style": "Text",
@@ -51,8 +56,8 @@
},
{
"style": "Chapter",
"text": "IX->Superalgos->Topic->Trading Engine->The trading engine is about making the data processed by the Trading Bot accessible. Use it while debugging strategies to visually track every piece of information processed by the trading bot at any point in time. Use it from within trading systems to feed strategies with the details of what happens at runtime.",
"updated": 1611260954268
"text": "X->Superalgos->Topic->Trading Engine->The trading engine is about making the data processed by the Trading Bot accessible. Use it while debugging strategies to visually track every piece of information processed by the trading bot at any point in time. Use it from within trading systems to feed strategies with the details of what happens at runtime.",
"updated": 1617708180990
},
{
"style": "Text",
@@ -60,38 +65,38 @@
},
{
"style": "Chapter",
"text": "X->Superalgos->Topic->Trading Farms->Superalgos may coordinate Data Tasks and Trading Tasks across different machines on a network. Trading farms provide a robust environment for smart and scalable deployments.",
"updated": 1611503033139
"text": "XI->Superalgos->Topic->Trading Farms->Superalgos may coordinate Data Tasks and Trading Tasks across different machines on a network. Trading farms provide a robust environment for smart and scalable deployments.",
"updated": 1617708186995
},
{
"style": "Chapter",
"text": "XI->Superalgos->Topic->Crypto Ecosystem->The crypto ecosystem manages the interactions with parties external to Superalgos, primarily exchanges. ",
"updated": 1611503004599
"text": "XII->Superalgos->Topic->Crypto Ecosystem->The crypto ecosystem manages the interactions with parties external to Superalgos, primarily exchanges.",
"updated": 1617708192899
},
{
"style": "Chapter",
"text": "XII->Superalgos->Topic->Data Mines->Data Mines deal with bots that process data and feature a visual scripting framework that solves most all of the infrastructure intricacies of building indicators and plotters.",
"updated": 1611503425133
"text": "XIII->Superalgos->Topic->Data Mines->Data Mines deal with bots that process data and feature a visual scripting framework that solves most all of the infrastructure intricacies of building indicators and plotters.",
"updated": 1617708198397
},
{
"style": "Chapter",
"text": "XIII->Superalgos->Topic->Integrations->Superalgos integrates with Telegram Bots to broadcast announcements emerging from trading sessions. On the other hand, Superalgos supports receiving webhook messages, enabling automated actions originating from messages sent from third-party services, like TradingView.",
"updated": 1611503645995
"text": "XIV->Superalgos->Topic->Integrations->Superalgos integrates with Telegram Bots to broadcast announcements emerging from trading sessions. On the other hand, Superalgos supports receiving webhook messages, enabling automated actions originating from messages sent from third-party services, like TradingView.",
"updated": 1617708209659
},
{
"style": "Chapter",
"text": "XIV->Superalgos->Topic->Productivity Tools->This chapter discusses a collection of tools that help optimize productivity.",
"updated": 1611503697142
"text": "XV->Superalgos->Topic->Productivity Tools->This chapter discusses a collection of tools that help optimize productivity.",
"updated": 1617708217018
},
{
"style": "Chapter",
"text": "XV->Superalgos->Topic->Troubleshooting->Superalgos is a vast system and you will run into confusing situations while learning it. You must acquire the knowledge on how to analyze the issues that you may encounter. There usually is a good explanation for what is going on. This chapter helps you in that process.",
"updated": 1611649840313
"text": "XVI->Superalgos->Topic->Troubleshooting->Superalgos is a vast system and you will run into confusing situations while learning it. You must acquire the knowledge on how to analyze the issues that you may encounter. There usually is a good explanation for what is going on. This chapter helps you in that process.",
"updated": 1617708223623
},
{
"style": "Chapter",
"text": "XVI->Superalgos->Topic->Contributing to Superalgos->Superalgos is a Community project. Everything you build with Superalgos is susceptible to be contributed to the project. Contributing to the project earns you Superalgos (SA) tokens! This chapter covers how you may contribute some of the intelligence you build for yourself, and also how you may get involved with the project at a deeper level.",
"updated": 1617094031124
"text": "XVII->Superalgos->Topic->Contributing to Superalgos->Superalgos is a Community project. Everything you build with Superalgos is susceptible to be contributed to the project. Contributing to the project earns you Superalgos (SA) tokens! This chapter covers how you may contribute some of the intelligence you build for yourself, and also how you may get involved with the project at a deeper level.",
"updated": 1617708229948
},
{
"style": "Text",
@@ -1,8 +1,8 @@
{
"type": "Default Exchange",
"definition": {
"text": "The Default Exchange is the one referenced by the Exchange Data Tasks, Exchange Trading Tasks, Exchange Learning Tasks nodes of which a certain Task decends from. The Trading Bot running inside that Task will considere that referenced exchange to be it's Default Exchange.",
"updated": 1612352828045
"text": "The Default Exchange is the one referenced by the Exchange Data Tasks, Exchange Trading Tasks, and Exchange Learning Tasks nodes from which a certain Task descends. The Trading Bot Instance running under that Task will consider the referenced Crypto Exchange to be the Default Exchange for the said Task.",
"updated": 1617616790868
},
"paragraphs": [
{
@@ -56,7 +56,8 @@
},
{
"style": "Text",
"text": "Setting up a reference to a time machine node in the charting space hierarchy while using the below parameter causes the following:"
"text": "Setting up a reference to a time machine node in the Charting Space hierarchy while using the below parameter causes the following:",
"updated": 1617706853889
},
{
"style": "List",
@@ -81,7 +82,8 @@
},
{
"style": "Text",
"text": "Setting up a reference to a time machine node in the charting space hierarchy and using the below parameters allows simulating the pressing of relevant key combinations when on a time machine."
"text": "Setting up a reference to a time machine node in the charting space hierarchy and using the below parameters allows replicating the pressing of relevant key combinations when on a time machine.",
"updated": 1617706916777
},
{
"style": "Javascript",
@@ -103,17 +105,22 @@
},
{
"style": "Text",
"text": "The batchConfigChangesReferenceParent parameter allows you to edit the configuration of a referenced node and their offspring.",
"updated": 1613846892311
"text": "The batchConfigChangesReferenceParent property allows you to edit the configuration of a referenced node and their offspring.",
"updated": 1617707009812
},
{
"style": "Text",
"text": "The example below changes the configuration of the three different scale nodes under a time machine. In this case, the time machine is the node referenced, the nodePath is the path of the node whose configuration must be changed relative to the referenceParent, and the properties parameter is the actual configuration to be set."
},
{
"style": "Javascript",
"text": " \"batchConfigChangesReferenceParent\": [\n {\n \"nodePath\": \"referenceParent.timeScale\",\n \"properties\": {\n \"autoMinScale\": false,\n \"autoMaxScale\": false,\n \"fromDate\": \"2020-08-31T23:40:00.000Z\",\n \"toDate\": \"2020-09-01T01:00:00.000Z\"\n }\n },\n {\n \"nodePath\": \"referenceParent.rateScale\",\n \"properties\": {\n \"autoMinScale\": false,\n \"autoMaxScale\": false,\n \"minValue\": 11400,\n \"maxValue\": 11800\n }\n },\n {\n \"nodePath\": \"referenceParent.timeFrameScale\",\n \"properties\": {\n \"value\": \"01-min\"\n }\n }\n ]",
"updated": 1613846829780
"style": "Json",
"text": "\"batchConfigChangesReferenceParent\": [\n {\n \"nodePath\": \"referenceParent.timeScale\",\n \"properties\": {\n \"autoMinScale\": false,\n \"autoMaxScale\": false,\n \"fromDate\": \"2020-08-31T23:40:00.000Z\",\n \"toDate\": \"2020-09-01T01:00:00.000Z\"\n }\n },\n {\n \"nodePath\": \"referenceParent.rateScale\",\n \"properties\": {\n \"autoMinScale\": false,\n \"autoMaxScale\": false,\n \"minValue\": 11400,\n \"maxValue\": 11800\n }\n },\n {\n \"nodePath\": \"referenceParent.timeFrameScale\",\n \"properties\": {\n \"value\": \"01-min\"\n }\n }\n ]",
"updated": 1617707082553
},
{
"style": "Success",
"text": "A typical use case for this resource is when you wish to bring to user to a specific point in a chart, but it may be used for any other case that requires manipulating node's configurations.",
"updated": 1617707174287
}
]
}
@@ -1,8 +1,8 @@
{
"type": "Tutorial",
"definition": {
"text": "The tutorial hierarchy features a free arrangement of Tutorial Topic and Tutorial Step nodes that make up a tutorial. Each node in the hierarchy, including the parent tutorial node, represents an HTML page that is overlaid on top of both the design space and the charting space.",
"updated": 1613839026788
"text": "The tutorial hierarchy features a free arrangement of Tutorial Topic and Tutorial Step nodes that make up a tutorial. Each node in the hierarchy, including the parent tutorial node, represents an HTML page that may be overlaid on top of both the Design Space and the Charting Space.",
"updated": 1617610222444
},
"paragraphs": [
{
@@ -11,18 +11,23 @@
},
{
"style": "Text",
"text": "Nodes in the hierarchy may be arranged freely, meaning that there may be as many tutorial topics and tutorial steps as desired. ",
"updated": 1613839088895
"text": "Nodes in the hierarchy may be arranged freely, meaning that there may be as many tutorial topics and tutorial steps as desired. Tutorial topics may contain tutorial steps but also other tutorial topics. This allows nesting topics to be used as subtopics.",
"updated": 1617649482153
},
{
"style": "Text",
"text": "In general terms, all types of nodes behave similarly in the sense that each node, independently of the precise type, represents a tutorial step in and of itself. Subtle differences shall be covered where appropriate.",
"updated": 1613839117191
"text": "The system – as usual – evaluates the hierarchy in a clockwise direction starting from the node to the right of the parent Tutorial node, and goes to the deepest node of each branch before moving to the next one.",
"updated": 1617649522223
},
{
"style": "Success",
"text": "The key similarity among all types of nodes in the hierarchy is that all of them may draw content from a tutorial page in the Docs.",
"updated": 1613839286982
"style": "Callout",
"text": "In general terms, all types of nodes behave similarly in the sense that each node, independently of the precise type, represents a tutorial step in and of itself. That is, all nodes including the top-level Tutorial node, the Tutorial Topic node, and the Tutorial Step node may display a content page as a step in the tutorial. Subtle differences shall be pointed where appropriate.",
"updated": 1617622995279
},
{
"style": "Note",
"text": "The key similarity among all types of nodes in the hierarchy is that all of them may draw content from the tutorial's collection of pages in the Docs. That is, each node in the hierarchy points to a Docs Page, and it is that page in the Docs that features the content displayed for the given step. The pointer is specified in the configuration of each node (see the docs property).",
"updated": 1617623101039
},
{
"style": "Block",
@@ -35,33 +40,70 @@
},
{
"style": "Text",
"text": "The configuration of each node in the tutorial hierarchy determines the content and behavior of each step. All types of nodes share the same basic configuration. However, Tutorial Step nodes have extra properties, described elsewhere.",
"updated": 1613839329036
"text": "The configuration of each node in the tutorial hierarchy determines the content and behavior of each step. All types of nodes share the same basic configuration. However, Tutorial Step nodes have extra properties, described on the Tutorial Step node page.",
"updated": 1617623609988
},
{
"style": "Success",
"text": "The configuration properties discussed on this page apply to all types of nodes in the hierarchy.",
"updated": 1617623631110
},
{
"style": "Text",
"text": "The layout of the HTML page follows the layout of the referenced page in the Docs, although displayed within the confines of the tutorial window. ",
"updated": 1613839417342
"text": "The layout of the HTML page follows the layout of the associated page in the Docs, although displayed within the confines of the tutorial window.",
"updated": 1617610416865
},
{
"style": "Callout",
"text": "In other words, you affect the layout of the step by writing content and applying styles to individual paragraphs in the associated Docs Page.",
"updated": 1613839489189
"text": "In other words, you affect the layout of the particular step by writing content and applying styles to individual paragraphs in the associated Docs Page.",
"updated": 1617610435932
},
{
"style": "Note",
"text": "The HTML page features a limited space and does not support scrolling. If too much information is defined in the associated Docs Page, the resulting content overflows the available space in the tutorial window. There is no system-side control to deal with such overflows, so it's up to you to spread information across multiple steps and keep each page within its limits.",
"updated": 1613839536547
},
{
"style": "Title",
"text": "Configuration Properties",
"updated": 1617635291377
},
{
"style": "Subtitle",
"text": "Properties",
"updated": 1609705050135
"text": "icon",
"updated": 1617635214170
},
{
"style": "Text",
"text": "The property icon requires two definitions:",
"updated": 1617635366207
},
{
"style": "List",
"text": "icon: the name and project of one of the icons stored in the \\Projects\\[Project-Name]\\Iconsfolder, without the extension. When the configuration exists, the icon is placed within a table, on the left-hand side of the text block featured in the definition field. When there is no icon, the definition occupies the full width.",
"updated": 1613840648780
"text": "The \"name\" of the icon without the extension; "
},
{
"style": "List",
"text": "The \"project\" the icon belongs to."
},
{
"style": "Text",
"text": "For your reference, icons are stored in the following path:"
},
{
"style": "Json",
"text": "\\Projects\\[Project-Name]\\Icons",
"updated": 1617610685030
},
{
"style": "Success",
"text": "Use the existing collection of icons to illustrate each step of the tutorial. These illustrations help make for more compelling communication.",
"updated": 1617623866873
},
{
"style": "Text",
"text": "When the configuration exists, the icon is placed within a table, side by side with the text block that makes up the definition field of the associated Docs Page. When there is no icon, the definition occupies the full width of the page.",
"updated": 1617635415677
},
{
"style": "Json",
@@ -69,9 +111,19 @@
"updated": 1613840669552
},
{
"style": "List",
"text": "position: determines the position of the floating HTML. There are three alternatives... \"Left\", \"Right\", or leave the field empty to position the page in the center of the screen.",
"updated": 1613842749882
"style": "Text",
"text": "The above configuration places the balance.png icon of the Superalgos project in the table of the corresponding Docs page (see the docs property below).",
"updated": 1617635461827
},
{
"style": "Subtitle",
"text": "position",
"updated": 1617635475423
},
{
"style": "Text",
"text": "The position property determines the position of the floating HTML. There are three alternatives... \"Left\", \"Right\", or leave the field empty to position the page on the center of the screen.",
"updated": 1617635484212
},
{
"style": "Json",
@@ -79,18 +131,47 @@
"updated": 1613840787300
},
{
"style": "List",
"text": "slider: determines the position of the horizontal slider. There are three alternatives... \"toTop\", \"toBottom\", \"toMiddle\".",
"updated": 1613842783566
"style": "Text",
"text": "The configuration above places the tutorial step on the left-hand side of the screen.",
"updated": 1617635642707
},
{
"style": "Subtitle",
"text": "slider",
"updated": 1617635668767
},
{
"style": "Text",
"text": "The slider property determines the position of the horizontal slider. There are three alternatives... \"toTop\", \"toBottom\", \"toMiddle\"."
},
{
"style": "Json",
"text": "\"slider\": \"toBottom\""
"text": "\"slider\": \"toBottom\" // Opens the Charting Space",
"updated": 1617624084984
},
{
"style": "List",
"text": "pressButton: allows you to forcefully \"Stop\" the tutorial, go to the \"Next\" step, go to the \"Previous\" step, or \"Skip\" a step. When a step is loaded and one of these options is configured in this property, the action is applied immediately. A common use of this feature is to skip a step, for instance, a Tutorial Topic node that is used solely for organizational purposes within the hierarchy, thus has no content.",
"updated": 1613842824873
"style": "Json",
"text": "\"slider\": \"toTop\" // Opens the Design Space",
"updated": 1617624125599
},
{
"style": "Json",
"text": "\"slider\": \"toMiddle\" // Enables using the Charting Space and the Design Space concurrently",
"updated": 1617624154127
},
{
"style": "Subtitle",
"text": "pressButton",
"updated": 1617635952027
},
{
"style": "Text",
"text": "The pressButton property allows you to forcefully \"Stop\" the tutorial, go to the \"Next\" step, go to the \"Previous\" step, or \"Skip\" a step. When a step is loaded and one of these options is configured in this property, the action is applied immediately."
},
{
"style": "Note",
"text": "A common use of this feature is to skip a step, for instance, a Tutorial Topic node that is used solely for organizational purposes within the hierarchy, thus features no content. Leave the field empty for the step to play in the usual fashion.",
"updated": 1617649582774
},
{
"style": "Json",
@@ -98,9 +179,24 @@
"updated": 1613841332185
},
{
"style": "List",
"text": "docs: the property is used to reference the Docs Tutorial Page that feeds content to the particular tutorial step. The definition requires the name of the Project, the Docs Page Category which is always Tutorial, and the complete name of the tutorial step page.",
"updated": 1613841395148
"style": "Text",
"text": "The above configuration takes the user to the next step in the tutorial without displaying any content for the node in question.",
"updated": 1617648136262
},
{
"style": "Success",
"text": "You may use Tutorial Topic nodes for organizational purposes only, for instance, to arrange the hierarchy in a way that it's easy to read and maintain. Topics with too many steps are harder to deal with later on. In other words, you may use a Tutorial Topic node to group several steps, even if you don't intend the Tutorial Topic node to display any content. In such cases, you may use this property to skip the step that is not intended for content display.",
"updated": 1617649616576
},
{
"style": "Subtitle",
"text": "docs",
"updated": 1617636114812
},
{
"style": "Text",
"text": "The docs property is used to point to the Docs Tutorial Page that feeds content to the particular tutorial step. The definition requires the name of the Project, the Docs Page Category which is always \"Tutorial\", and the complete name of the Docs Page, that is, the \"type\" as specified in the JSON file.",
"updated": 1617648211414
},
{
"style": "Json",
@@ -108,14 +204,92 @@
"updated": 1613842164831
},
{
"style": "List",
"text": "controlDocs: the property is used to control the behavior of the Docs panel. The panel property may be set to \"Open\" or \"Close\". The property closeTutorialEditor may switch on (true) and off (false) the Docs editor. When set to false, the Docs panel shows the page corresponding to the active tutorial step or the page in the Docs that is requested. When the property is set to true and there is no request to open a Docs page, then the Docs panel shows the search box. The page property is where you define which page in the Docs must be loaded. You must specify the Project, the Docs Page Category, and the type which is the complete name of the page.",
"updated": 1613843493276
"style": "Subtitle",
"text": "controlDocs",
"updated": 1617648219190
},
{
"style": "Text",
"text": "The property is used to control the behavior of the Docs panel. Within controlDocs, several properties are available, and all of them are optional. Let's review each in detail."
},
{
"style": "Text",
"text": "The panel property may be set to \"Open\" or \"Close\". This property controls the tab that allows you to open the Docs Panel in one step, and close it on a different step when it's no longer needed.",
"updated": 1617649653900
},
{
"style": "Json",
"text": " \"controlDocs\": {\n \"panel\": \"Open\",\n \"closeTutorialEditor\": true,\n \"page\": {\n \"project\": \"Superalgos\",\n \"category\": \"Topic\",\n \"type\": \"Trading System Hierarchy\"\n }\n }",
"updated": 1613842185832
"text": "\"controlDocs\": {\n \"panel\": \"Open\",\n }",
"updated": 1617634451884
},
{
"style": "Text",
"text": ""
},
{
"style": "Success",
"text": "If the Docs Panel is closed, the rest of the properties are somehow irrelevant. However, when the Docs Panel is open, the rest of the properties control what is displayed in the Docs Panel.",
"updated": 1617635061507
},
{
"style": "Text",
"text": "The property closeTutorialEditor may switch on and off the Docs editor. When set to false or when there is no definition, and provided no specific Docs Page is called (see controlDocs below), the Docs panel shows the page associated with the current tutorial step in editing mode.",
"updated": 1617649781891
},
{
"style": "Json",
"text": "\"controlDocs\": {\n \"panel\": \"Open\",\n \"closeTutorialEditor\": false,\n }",
"updated": 1617648310737
},
{
"style": "Success",
"text": "Because this definition is set to false by default, this is the usual behavior. That is, by default, when the Docs Panel is opened while a tutorial step is playing, the Docs Panel shows the Docs Page associated with the specific step so that the page may be edited right then and there.",
"updated": 1617648335347
},
{
"style": "Text",
"text": "When the closeTutorialEditor property is set to true and there is no request to open a Docs page (see page property below), then the Docs panel shows whatever Docs Page was being displayed in the previous step.",
"updated": 1617648434580
},
{
"style": "Json",
"text": "\"controlDocs\": {\n \"panel\": \"Open\",\n \"closeTutorialEditor\": true,\n }",
"updated": 1617634444688
},
{
"style": "Success",
"text": "You may want to close the tutorial editor when the user is supposed to interact with the Docs from one step to the next. For example, let's say the tutorial instructs the user to run a search and discusses the search results in the following step. In that case, you will want the tutorial editor to remain closed, as otherwise, the search performed by the user would be lost, and instead the page corresponding to the new tutorial step would be loaded.",
"updated": 1617649832578
},
{
"style": "Text",
"text": "The searchPage property overruns the tutorial editor settings and loads the home search page featuring the search box in the center.",
"updated": 1617649861459
},
{
"style": "Json",
"text": "\"controlDocs\": {\n \"panel\": \"Open\",\n \"searchPage\": true,\n }",
"updated": 1617648855034
},
{
"style": "Success",
"text": "Use the above setting when you wish the user to get the clean search box to make a search or run a command.",
"updated": 1617648884933
},
{
"style": "Text",
"text": "The page property is where you define which Docs Page must be loaded. You must specify the Project, the Docs Page Category, and the \"type\" which is the complete name of the page. The optional property anchor allows you to points the user to a specific paragraph in the page with the Docs Anchor Style.",
"updated": 1617649332425
},
{
"style": "Json",
"text": "\"controlDocs\": {\n \"panel\": \"Open\",\n \"page\": {\n \"project\": \"Superalgos\",\n \"category\": \"Topic\",\n \"type\": \"Syntax Overview\",\n \"anchor\": \"Previous Property\"\n }\n }",
"updated": 1617649170254
},
{
"style": "Success",
"text": "Use the above configuration when you wish the user to read a specific page in the Docs.",
"updated": 1617649085529
}
]
}
@@ -0,0 +1,335 @@
{
"topic": "Contributing to Superalgos",
"pageNumber": "6",
"type": "How to Contribute Tutorials",
"definition": {
"text": "Tutorials are the ultimate educational resource available in Superalgos, and they play a crucial role during the onboarding of new users. Contributing tutorials is a great way to help the project grow the user base and is highly appreciated!",
"updated": 1617710488028
},
"paragraphs": [
{
"style": "Text",
"text": "This page discusses best practices to build and contribute Superalgos tutorials. It doesn't cover the actual mechanics of building tutorials. Instead, it focuses on what is desirable.",
"updated": 1617732597782
},
{
"style": "Title",
"text": "The Quest for Quality",
"updated": 1617710819169
},
{
"style": "Text",
"text": "At Superalgos, we take pride in the quality of the product we are building. Documentation and tutorials are crucial parts of Superalgos.",
"updated": 1617732636344
},
{
"style": "Text",
"text": "That said, we understand that it takes time and effort to get to a quality product, thus iterating on early prototypes and implementing early-stage feedback is a good way to achieve the desired quality standards.",
"updated": 1617732666027
},
{
"style": "Success",
"text": "When you build a tutorial for Superalgos, you become the maintainer of the tutorial. It is your responsibility to keep the tutorial up to date with the system, and to implement the feedback users may share! Your tutorial must become the ultimate resource to learn the topics it covers.",
"updated": 1617712109958
},
{
"style": "Title",
"text": "The Associated Workspace",
"updated": 1617712309440
},
{
"style": "Text",
"text": "To deliver the best possible experience, a tutorial must be featured in a specific Workspace, and the workspace must be custom-tailored to serve the tutorial. The workspace must be clean and feature the assets required for the learning experience to be optimal. It is best to keep the workspace clean, light, and stripped of unnecessary resources.",
"updated": 1617732813825
},
{
"style": "Title",
"text": "Tutorial Series & Planning",
"updated": 1617712970783
},
{
"style": "Text",
"text": "Some topics are broad, have ramifications, or require a nuanced analysis to be covered thoroughly. In such cases, planning for a series of tutorials is ideal.",
"updated": 1617712578718
},
{
"style": "Text",
"text": "Take, for example, the series of tutorials in the Trading System Design Tutorials Plugin Workspace:",
"updated": 1617712745906
},
{
"style": "List",
"text": "The first tutorial in the series gives a broad introduction to the topic, mostly in conceptual terms. This allows users to see the big picture and learn how the concepts are structured and why they are structured the way they are."
},
{
"style": "List",
"text": "The second tutorial in the series proposes an exercise that takes several more tutorials to develop and implement. That is, the tutorial sets the basis for what the series will cover.",
"updated": 1617732839409
},
{
"style": "List",
"text": "The remaining tutorials in the series dissect the exercise proposed earlier and cover with a fine level of detail the implementation. At the same time, they cover all the context and many lateral topics.",
"updated": 1617732881797
},
{
"style": "Note",
"text": "The whole series threads a common theme and develops it from the simplest to the most complex concepts, step by step. A tutorial series must be exhaustive and eventually, cover the whole topic. It must become the ultimate tool to learn about the subject matter!",
"updated": 1617732933799
},
{
"style": "Title",
"text": "The Target Audience",
"updated": 1617713465981
},
{
"style": "Text",
"text": "People are different. We all have slightly different wirings in our heads, and we all learn differently. In that sense, building tutorials is a bit of a challenge. Some people like tutorials that go straight to the point and show them how to solve a very specific issue. Others prefer tutorials that get to the bone, explain every detail, and properly cover the context.",
"updated": 1617733011186
},
{
"style": "Text",
"text": "At this early stage, we can't afford to duplicate efforts and build different tutorials for different kinds of learners. We have to choose the method that best serves the project.",
"updated": 1617714108723
},
{
"style": "Important",
"text": "We choose to focus on building comprehensive tutorials that everyone can follow and that leaves no one behind. We believe that a tutorial that goes slow, covering every detail, and taking the time to explain the nuance is the right approach at this stage. By building tutorials in a such manner, we guarantee that those who are willing to invest the time to learn the system have adequate material to quickly become power users.",
"updated": 1617733086141
},
{
"style": "Text",
"text": "Such tutorials may be slightly annoying to fast-learners, or to people that just want a specific question answered. But such needs are already covered by the searchable knowledge base comprised in the Docs.",
"updated": 1617714293925
},
{
"style": "Title",
"text": "Communication Resources",
"updated": 1617720397017
},
{
"style": "Text",
"text": "Let's get into some of the specifics on building tutorials for Superalgos!",
"updated": 1617720149756
},
{
"style": "Callout",
"text": "Superalgos tutorials have evolved through several months worth of feedback from early adopters. We feel we have found a sweet spot, and have started to develop a style in the way we use the space available in each tutorial step. The following are some notes that will help you build tutorials that match the format of existing tutorials.",
"updated": 1617733117832
},
{
"style": "Subtitle",
"text": "One Call For Action Only"
},
{
"style": "Text",
"text": "Each tutorial step should have a single call for action, that is, a single instruction that the user must carry out. This is the ideal case scenario. There may be exceptions, for example, when we ask the user to read a page in the Docs and do something else as the main instruction. ",
"updated": 1617720707328
},
{
"style": "Success",
"text": "In general terms and when possible, try to avoid giving the user more than one task on the same step. Instead, if you expect the user to perform several sequential actions, try to split the process into more than one step — as many as it takes.",
"updated": 1617721156206
},
{
"style": "Subtitle",
"text": "Consistent Use of Styles and Space",
"updated": 1617722131538
},
{
"style": "Text",
"text": "Use the different sections on the page and the different paragraph styles for consistent purposes. This helps users get accustomed to a certain format so that they know what to expect from each section of the page. Consistency in the way the information is delivered makes tutorials more usable!",
"updated": 1617733162806
},
{
"style": "Text",
"text": "Consider the following:",
"updated": 1617722201424
},
{
"style": "Text",
"text": "The definition box is the space to the right of the icon, below the title. Use this space to introduce what the step is about, that is, to set up the story the step will tell, or to provide some basic context.",
"updated": 1617721881227
},
{
"style": "Callout",
"text": "The most important section on any given step is the call for action, that is, the instruction that the user must follow to progress in the tutorial. Many times users redo tutorials or go back a few steps just to make sure they did everything right. Always use the callout style — the one applied to this paragraph — for the call for action! Similarly, try to avoid using this style for anything else. If the particular step doesn't have a call for action, then the step should not feature this style at all!",
"updated": 1617733181730
},
{
"style": "Text",
"text": "In some cases, you may need the user to take a very simple action so that the main call for action may be delivered. In such cases, you may use the definition box to tell the user how to get ready to execute the call for action delivered later in the page.",
"updated": 1617722090611
},
{
"style": "Text",
"text": "Use the rest of the styes to develop the content."
},
{
"style": "Subtitle",
"text": "Use of Docs Pages"
},
{
"style": "Text",
"text": "When you need the user to learn about a specific concept to get the proper context on the subject, do not replicate in the tutorial information that exists in the Docs. Duplicating information is not a good idea, as it makes it harder to maintain the Docs and tutorials.",
"updated": 1617730695174
},
{
"style": "Success",
"text": "Asking the user to read a page or a section of a page in the Docs is the correct approach. This has the added benefit of making the user aware that the Docs cover the topic too.",
"updated": 1617724009821
},
{
"style": "Important",
"text": "If you find that the relevant page in the Docs is outdated, doesn't cover the topic with the appropriate depth, or maybe even doesn't exist, helping create, complete, and/or improve the delivery of the information in the Docs is just as valuable as building the tutorial! Long format explanations do not fit well in tutorials. They do fit well in the Docs!",
"updated": 1617733203373
},
{
"style": "Subtitle",
"text": "Interactivity",
"updated": 1617724494717
},
{
"style": "Text",
"text": "The whole point of tutorials — and the main difference with the Docs as learning material — is that they offer the opportunity for hands-on learning. Tutorials are interactive while the Docs are less so!",
"updated": 1617730782624
},
{
"style": "Callout",
"text": "Make sure you use this quality to the fullest, but also try to maintain a certain balance!",
"updated": 1617725782977
},
{
"style": "List",
"text": "If the tutorial is talking about a hierarchy, a group of nodes, or a particular node, make sure that the tutorial step takes you to that place in the Workspace. This adds a visual element to the explanation and helps the user get familiar with the data structures involved.",
"updated": 1617725808080
},
{
"style": "List",
"text": "Tutorials can affect the Workspace in many ways replicating actions the user may do. When you want the user to learn to do something, it's best to ask the user to do it, instead of having the tutorial do it for the user.",
"updated": 1617733271488
},
{
"style": "List",
"text": "On the other hand, the tutorial should take care of doing certain things that are not conducive to learning something relevant to the context of the tutorial. Performing these actions directly may help keep the user focused on what matters most.",
"updated": 1617733297397
},
{
"style": "Subtitle",
"text": "Tooltips",
"updated": 1617731886888
},
{
"style": "Text",
"text": "The system recognizes the name of all entities that have a Docs Page when the name of the entity is written in title case. When that happens, the system automatically creates a tooltip for the phrase. This is a valuable resource, as it provides context that you don't need to explain.",
"updated": 1617731953773
},
{
"style": "Text",
"text": "Make sure you use this resource wisely, as too many tooltips on a single tutorial page may be overwhelming, and probably irrelevant."
},
{
"style": "Success",
"text": "When you believe the tooltip is relevant, then write the name of the entity in title case. If the tooltip is not relevant, then write the name of the entity in lower case.",
"updated": 1617733407351
},
{
"style": "Subtitle",
"text": "Naming of Nodes",
"updated": 1617731585276
},
{
"style": "Text",
"text": "Superalgos is a complex system. Helping users develop good organizational habits is highly desirable. The more top-level users we may help form, the more powerful the project becomes.",
"updated": 1617732614881
},
{
"style": "Text",
"text": "When users create new data structures, it's good practice to have them name the relevant nodes. This is particularly important with nodes that pass on their names through references to other nodes.",
"updated": 1617733435330
},
{
"style": "Note",
"text": "Make sure your tutorial goes the extra mile and reminds users to name those kinds of nodes. Proposing a specific name is ideal. Remember that the user may not know what comes next or what the node is used for at the time of creation, so they may not know what a relevant name may be. But you do, so you may propose a name that is consistent with the tutorial's goal.",
"updated": 1617731598259
},
{
"style": "Title",
"text": "Look & Feel",
"updated": 1617722154194
},
{
"style": "Text",
"text": ""
},
{
"style": "Text",
"text": "There is a philosophical debate on whether beauty is objective or subjective. Some people think beauty is in the eyes of the beholder, while others believe that there are inherently beautiful things.",
"updated": 1617733474625
},
{
"style": "Callout",
"text": "Whatever the case may be, we want the overall look & feel of tutorials to be consistent!",
"updated": 1617733495986
},
{
"style": "Text",
"text": "Here's a list of requirements that help tutorials be consistent in their look & feel:",
"updated": 1617722868882
},
{
"style": "List",
"text": "Always use proper title case for titles.",
"updated": 1617722923539
},
{
"style": "List",
"text": "Titles look best when they span a single line. Use two-line titles only if strictly necessary!"
},
{
"style": "List",
"text": "Always use an icon to illustrate the step. Sometimes the appropriate icon is the one corresponding to the node the user is working with. Other times you may use icons figuratively, playing with alternate meanings of what the drawing may represent."
},
{
"style": "List",
"text": "Avoid stud step pages. Steps with very little content seem empty and feel strange. You don't need to feel the space with gibberish or unnecessary information. Instead, try to use the space to provide context for the call for action. Explain why the user is asked to do this or that. Let the user know what may be expected from the action and so on.",
"updated": 1617733584684
},
{
"style": "List",
"text": "As a corollary of the above, the opposite case may be problematic too. That is, when the content barely fits the page and gets too close to the row of buttons fixed at the bottom of each step. The problem is that some browsers / OS combinations render styles slightly differently, and what may seem close to the buttons in one system may overlap the buttons in the next. Try to level at least one full empty line — preferably two.",
"updated": 1617733668851
},
{
"style": "List",
"text": "Do not set two consecutive paragraphs with the same style. The only exception is for bullet lists. Even the Docs Text Style is not formated to look good as consecutive paragraphs in the context of a tutorial (there is no padding between paragraphs).",
"updated": 1617723650896
},
{
"style": "Title",
"text": "Proper English",
"updated": 1617733994160
},
{
"style": "Text",
"text": "There are at least two reasons why it's desirable to have spell and grammar-checked tutorials:",
"updated": 1617734204593
},
{
"style": "List",
"text": "Proper language speaks to the quality of the product."
},
{
"style": "List",
"text": "Users who don't speak English may be using online translators, which perform well only when they have a proper source."
},
{
"style": "Important",
"text": "Always use a grammar and spell-checker to make sure your tutorial is as correct as it may be!",
"updated": 1617734220351
},
{
"style": "Text",
"text": ""
}
]
}
@@ -3,8 +3,8 @@
"pageNumber": 21,
"type": "Docs Anchor Style",
"definition": {
"text": "Anchor paragraphs are used together with the Docs Goto Command. When you want to generate a Docs Link to an specific part of a Docs Page, you first need to create an Anchor paragraph in order to be able to create the link to that part of the page.",
"updated": 1615591597546
"text": "Anchor paragraphs are used together with the Docs Goto Command. When you want to generate a Docs Link to a specific part of a Docs Page, you first need to create an Anchor paragraph to be able to create the link to the specific paragraph in the page.",
"updated": 1617649387777
},
"paragraphs": [
{
@@ -3,14 +3,14 @@
"pageNumber": "1",
"type": "LF Trading Bot - Chart Data Structure",
"definition": {
"text": "The Chart Data Structure is an object that contains Indicator or Sensor bots data, available at runtime, that can be accessed from the code of Conditions and Formulas.",
"updated": 1612349390525
"text": "The Chart Data Structure is an object that contains Indicator Bot or Sensor Bot data available at runtime, and can be accessed from the code of Conditions and Formulas.",
"updated": 1617615874508
},
"paragraphs": [
{
"style": "Note",
"text": "This Javascript object, together with the other two data structures available, ultimately defines the syntax that can be used to write conditions and formulas, and more precisely the sintax to retrieve Indicator Bot and Sensor Bot data.",
"updated": 1612349521002
"text": "This Javascript object, together with the other two data structures described on this topic, ultimately defines the syntax that used to write conditions and formulas, and more precisely the syntax to retrieve Indicator Bot and Sensor Bot data.",
"updated": 1617615932665
},
{
"style": "Title",
@@ -18,8 +18,8 @@
},
{
"style": "List",
"text": "The root of the object is called...",
"updated": 1612351077417
"text": "The root of the object is...",
"updated": 1617615941456
},
{
"style": "Json",
@@ -27,8 +27,8 @@
},
{
"style": "List",
"text": "After it these are it's valid properties...",
"updated": 1612351085368
"text": "After the root, the definition of the timeframe is mandatory...",
"updated": 1617616001919
},
{
"style": "Json",
@@ -37,13 +37,13 @@
},
{
"style": "List",
"text": "After that, it is expected the singleVariableName defined at the config of the Product Definition of an Indicator or Sensor.",
"updated": 1612351093008
"text": "After that comes the singleVariableName defined at the config of the Product Definition of an Indicator Bot or Sensor Bot.",
"updated": 1617616054644
},
{
"style": "List",
"text": "Finally the last property must be the codeName of a Record Property Node, belonging to the same Product Definition mentioned earlier.",
"updated": 1612350081190
"text": "Finally, the last property is the codeName of a Record Property node, corresponding to the same Product Definition mentioned earlier.",
"updated": 1617616859394
},
{
"style": "Title",
@@ -51,47 +51,59 @@
"updated": 1612350235632
},
{
"style": "Text",
"style": "Json",
"text": "chart.at01min.support.support5Rate",
"updated": 1612349808636
},
{
"style": "Text",
"style": "Json",
"text": "chart.at05min.candle.open",
"updated": 1612350213519
},
{
"style": "Text",
"style": "Json",
"text": "chart.at24hs.bollingerBand.movingAverage"
},
{
"style": "Title",
"text": "Advance Usage"
"text": "Advanced Use",
"updated": 1617616121116
},
{
"style": "Text",
"text": "You also have access to the set of indicators objects loaded in memory though this same data structure. If instead of using the sinleVariableName you use the pluralVariableName what you get is an array of objects, that depending on the time frame, could be the object for that time frame of all market or the current and previous day for time frames < 1 hour.",
"updated": 1612353614216
"text": "You also have access to the set of indicator objects loaded in memory through this same data structure.",
"updated": 1617616255365
},
{
"style": "Text",
"text": "If instead of using the singleVariableName you use the pluralVariableName, you get an array of objects that — depending on the time frame — could be the object featuring the whole market (for time frames of one hour and above) or the current and previous day (for time frames below one hour).",
"updated": 1617616419121
},
{
"style": "Note",
"text": "Remember that time frames of one hour and above are stored as Market Files while time frames below one hour are stored as Daily Files."
},
{
"style": "Title",
"text": "Examples"
},
{
"style": "Text",
"style": "Json",
"text": "chart.at05min.candles"
},
{
"style": "Text",
"text": "Will return an array of candles of the previous day concatenated with the candles of the current day. You then can use this information as you wish."
"text": "The above returns an array of candles of the previous days concatenated with the candles of the current day. You may use this information as you wish.",
"updated": 1617616467792
},
{
"style": "Text",
"style": "Json",
"text": "chart.at24hs.bollingerBands"
},
{
"style": "Text",
"text": "Will return an array of all bollingerBands object of the whole market, since the time frame is >= 1 hour."
"text": "The above returns an array of all bollingerBands object of the whole market since the time frame is above 1 hour.",
"updated": 1617616877744
},
{
"style": "Text",
@@ -3,22 +3,18 @@
"pageNumber": "2",
"type": "LF Trading Bot - Market Data Structure",
"definition": {
"text": "The Market Data Structure is one of the 3 data structures available at Conditions and Formulas with data from Indicator and Sensor bots.",
"updated": 1612351166683
"text": "You may use this Javascript object from within conditions and formulas when you want to specify a Market different from the Default Market. For example, you may access data of the ETH/USDT market from a Trading System running on the BTC/USDT market.",
"updated": 1617617047716
},
"paragraphs": [
{
"style": "Note",
"text": "This Javascript object can be used when you want to specify a market which is different fomr the Default Market. In this way you can access data of the ETH/USDT market from a stragegy running for example at the BTC/USDT market.",
"updated": 1612351365558
},
{
"style": "Title",
"text": "Structure"
},
{
"style": "List",
"text": "The root of the object is called..."
"text": "The root of the object is...",
"updated": 1617617057256
},
{
"style": "Json",
@@ -27,8 +23,8 @@
},
{
"style": "List",
"text": "After it you need to spacify the codeName of an Asset representing the Market Base Asset, like the following...",
"updated": 1612351559165
"text": "Then you must specify the codeName of an Asset representing the Market Base Asset, as follows...",
"updated": 1617617165183
},
{
"style": "Json",
@@ -37,7 +33,8 @@
},
{
"style": "List",
"text": "After that again the codeName of an Asset but this time representing the Market Quoted Asset.."
"text": "After that, specify the codeName of an Asset but this time representing the Market Quoted Asset...",
"updated": 1617617108322
},
{
"style": "Json",
@@ -45,8 +42,8 @@
},
{
"style": "List",
"text": "Finally you continue with the syntax of the LF Trading Bot - Chart Data Structure",
"updated": 1612352138708
"text": "Finally, continue with the syntax of the LF Trading Bot - Chart Data Structure",
"updated": 1617617178876
},
{
"style": "Title",
@@ -54,17 +51,17 @@
"updated": 1612352364588
},
{
"style": "Text",
"style": "Json",
"text": "market.ETH.BTC.chart.at01min.support.support5Rate",
"updated": 1612351751906
},
{
"style": "Text",
"style": "Json",
"text": "market.BTC.USDT.chart.at05min.candle.open",
"updated": 1612351782297
},
{
"style": "Text",
"style": "Json",
"text": "market.ETH.USDT.chart.at24hs.bollingerBand.movingAverage",
"updated": 1612351804074
}
@@ -3,21 +3,18 @@
"pageNumber": "3",
"type": "LF Trading Bot - Exchange Data Structure",
"definition": {
"text": "Write a summary for this topic page."
"text": "You may use this Javascript object when you want to specify a Crypto Exchange which is different from the Default Exchange. Then you may, for example, access data from Coinbase Pro from a Trading Session running on Binance.",
"updated": 1617617256390
},
"paragraphs": [
{
"style": "Note",
"text": "This Javascript object can be used when you want to specify a Cryto Exchage which is different fomr the Default Exchange. In this way you can access data from Coinbase Pro from a stragegy running for example at Binance.",
"updated": 1612351988656
},
{
"style": "Title",
"text": "Structure"
},
{
"style": "List",
"text": "The root of the object is called..."
"text": "The root of the object is...",
"updated": 1617617272058
},
{
"style": "Json",
@@ -26,8 +23,8 @@
},
{
"style": "List",
"text": "After it you need to spacify the codeName of a Crypto Exchange, like the following...",
"updated": 1612352057634
"text": "Then, you must specify the codeName of a Crypto Exchange, for instance...",
"updated": 1617617294733
},
{
"style": "Json",
@@ -36,8 +33,8 @@
},
{
"style": "List",
"text": "Finally you continue with the syntax of the LF Trading Bot - Market Data Structure",
"updated": 1612352124926
"text": "Finally, continue with the syntax of the LF Trading Bot - Market Data Structure",
"updated": 1617617310038
},
{
"style": "Title",
@@ -45,17 +42,17 @@
"updated": 1612352354839
},
{
"style": "Text",
"style": "Json",
"text": "exchange.poloniex.market.ETH.BTC.chart.at01min.support.support5Rate",
"updated": 1612352167087
},
{
"style": "Text",
"style": "Json",
"text": "exchange.bitfinex.market.BTC.USDT.chart.at05min.candle.open",
"updated": 1612352188098
},
{
"style": "Text",
"style": "Json",
"text": "exchange.binance.market.ETH.USDT.chart.at24hs.bollingerBand.movingAverage",
"updated": 1612352200136
},
@@ -66,7 +63,8 @@
},
{
"style": "Text",
"text": "As you can see at the following example you can have a mix of chart, market and exchange usage withing the same Formula or Condition. "
"text": "As you can see in the following example, you may have a mix of chart, market and exchange usage within the same Formula or Condition.",
"updated": 1617617348929
},
{
"style": "Json",
@@ -9,82 +9,46 @@
"paragraphs": [
{
"style": "Text",
"text": "You should expect new releases of Superalgos to become available every few months. Release announcements are made through the Official Superalgos Telegram Announcements Channel.",
"updated": 1611511377439
"text": "You should expect new releases of Superalgos to become available every few months. Release announcements are made through the official Superalgos Announcements Channel.",
"updated": 1617647047464
},
{
"style": "Note",
"text": "During this beta stage, patches may be released as frequently as several times per week. Due to their high-frequency, minor updates go unannounced. If you ever experience a malfunction, make sure you upgrade your installation to the latest version available in the Superalgos repository before reporting a bug.",
"updated": 1611511390486
"text": "During the beta stage, patches and new features may become available in the develop branch as frequently as several times per week. Due to the high frequency of their occurrence, minor updates go unannounced. If you ever experience a malfunction, make sure you upgrade your installation to the latest version available in the develop branch of the Superalgos repository before reporting a bug.",
"updated": 1617647903163
},
{
"style": "Title",
"text": "New Releases"
},
{
"style": "Text",
"text": "If you are upgrading to a new official release, make sure you follow these instructions as well as those under the All Upgrades section."
},
{
"style": "Subtitle",
"text": "Read the Announcement Carefully"
},
{
"style": "Text",
"text": "Read and understand the announcement explaining the changes and how they may impact your workflow. Most importantly, find out if the new version requires upgrading your workspace."
},
{
"style": "Subtitle",
"text": "Check the Getting Started Guide"
},
{
"style": "Text",
"text": "It would be wise to go through the potentially new Getting Started Guide in the documentation, as it may reveal important information."
},
{
"style": "Subtitle",
"text": "Back Up Your Personal Work"
},
{
"style": "Text",
"text": "If the new version requires upgrading to a new workspace, you must decide which parts of your work you wish to backup so that you may restore them on the upgraded workspace (e.g.: you may want to backup your trading systems, data mines, super scripts, specific settings or configurations such as testing sessions, time machines, and so on)."
},
{
"style": "Text",
"text": "If there is no need to upgrade the workspace, that means that the new version of the system should work well with your existing workspace, provided that you are only one version behind."
"text": "Read and understand the announcement explaining the changes and how they may impact your workflow. Most importantly, find out if the new version requires upgrading your workspaces or the rest of the assets you may be working with (trading systems, data mines, etc).",
"updated": 1617646452770
},
{
"style": "Title",
"text": "All Upgrades"
"text": "Back-Up Your Personal Work",
"updated": 1617647919380
},
{
"style": "Subtitle",
"text": "Back Up the Workspace"
"style": "Important",
"text": "Always back up your personal work. Whether the new version is backward-compatible or not, you may — for whatever reason — want to go back to the state of affairs before the upgrade.",
"updated": 1617647956316
},
{
"style": "Text",
"text": "Always back up your existing workspace before switching versions. You may go back to a working version of the software in case something goes wrong with the new one, by installing the previous version of the system and restoring your old workspace from a backup file if needed."
"text": "The new version will always ship with its own Plugin Workspaces. The release announcement should make it clear if the new version is backward-compatible or not. If it's not, the announcement should cover any consideration relevant to upgrading from the previous version.",
"updated": 1617648003762
},
{
"style": "Subtitle",
"style": "Title",
"text": "Put the House in Order"
},
{
"style": "Text",
"text": "1. Stop all tasks that may be running in the network hierarchy, and close your browser. Allow a minute or two until all activity stops before closing the Console/Command Line/Terminal running the servers."
},
{
"style": "Text",
"text": "2. Check if you have any personal files, such as your workspace backups and so on in your Superalgos-master folders. Move them to a different location if you do, or take precautions not to delete them in the next step."
},
{
"style": "Text",
"text": "3. You will keep the Data-Storage and My-Workspaces folders intact and delete all the remaining folders within the Superalgos folder."
},
{
"style": "Important",
"text": "You do not need to get rid of the historic market data or the workspaces you have been working with every time you upgrade your system. Do not delete your Data-Storage or your My-Workspaces folder.",
"updated": 1611511439947
"text": "Stop all tasks that may be running in the Network hierarchy. Allow a minute or two until all activity stops.",
"updated": 1617646656306
},
{
"style": "Title",
@@ -93,8 +57,18 @@
},
{
"style": "Text",
"text": "Always follow the instructions in the Official Announcements Channel and the official blog post about the new release.",
"updated": 1611511529701
"text": "Run the App Update Command to install the new version of the app. Follow the instructions to close the browser and stop the client once the system is updated.",
"updated": 1617647599654
},
{
"style": "Title",
"text": "Apply the Guidance in the Announcement",
"updated": 1617647633126
},
{
"style": "Text",
"text": "If the official announcement provides information on how to upgrade your assets to use them in the new version, this is the time to follow the relevant guidance.",
"updated": 1617647676913
},
{
"style": "Important",
@@ -107,18 +81,21 @@
},
{
"style": "Text",
"text": "Once the system loads in your browser window and before you start working, you need to empty Chrome’s cache and do a hard reload to make sure the browser does use the newly installed files."
"text": "Once the system loads in your browser window and before you start working, it's always good practice to empty Chrome’s cache and do a hard reload to make sure the browser does use the newly installed files.",
"updated": 1617647736967
},
{
"style": "Text",
"text": "1. Hit F12 to open Chrome’s Developer Tools. You do not need to use the Developers Tools, but opening it allows performing the next task."
"style": "List",
"text": "Hit F12 to open Chrome’s Developer Tools. You do not need to use the Developers Tools, but opening it allows performing the next task.",
"updated": 1617647751232
},
{
"style": "Text",
"text": "2. Right-click on the refresh icon and select Empty Cache and Hard Reload from the drop-down menu. Once refreshed, you may close Developer Tools with F12."
"style": "List",
"text": "Right-click on the refresh icon and select Empty Cache and Hard Reload from the drop-down menu. Once refreshed, you may close Developer Tools with F12.",
"updated": 1617647755781
},
{
"style": "Text",
"style": "List",
"text": "F12 to open Developer Tools, then right-click on the refresh icon."
},
{
@@ -135,11 +112,8 @@
},
{
"style": "Text",
"text": "Before going deep back to work, it is always recommeended to test the new version a bit and make sure that your existing work performs as you would expect."
},
{
"style": "Text",
"text": "If you run into any issues, feel free to drop us a line in our Community."
"text": "Before going deep back to work, it is always recommended to test the new version a bit and make sure that your existing work performs as you would expect.",
"updated": 1617648042507
}
]
}
@@ -0,0 +1,16 @@
{
"tutorial": "How to aggregate data from different Exchanges in the same Chart ",
"pageNumber": "1",
"type": "How to combine Exchanges in a Chart Tutorial",
"definition": {
"text": "This Tutorial covers the process of pulling together the most diverse set of data: data from different exchanges! By the end of this tutorial you will be able to build charts almost impossible to find anywhere else.",
"updated": 1617376996248
},
"paragraphs": [
{
"style": "Text",
"text": "This Tutorial can be found in Workspace TBD.",
"updated": 1617376832024
}
]
}
@@ -0,0 +1,16 @@
{
"tutorial": "How to combine two markets in the same Chart",
"pageNumber": "1",
"type": "How to combine Markets in a Chart Tutorial",
"definition": {
"text": "This Tutorial will guide you through adding data from two different markets into the same chart. No more flipping between!",
"updated": 1617376121091
},
"paragraphs": [
{
"style": "Text",
"text": "This Tutorial can be found in workspace TBD.",
"updated": 1617376032973
}
]
}
@@ -0,0 +1,16 @@
{
"tutorial": "How to customize the Layers held in a Layer Manager",
"pageNumber": "1",
"type": "How to customize a Layer Manager Tutorial",
"definition": {
"text": "This Tutorial will walk you through customizing the layers available within a Timeline Chart's Layer Manager.",
"updated": 1617375254609
},
"paragraphs": [
{
"style": "Text",
"text": "This Tutorial can be found in Workspace TBD",
"updated": 1617375110981
}
]
}
@@ -0,0 +1,16 @@
{
"tutorial": "How to set up a custom Rate Scale for an Indicator",
"pageNumber": "1",
"type": "How to set up a custom Rate Scale Tutorial",
"definition": {
"text": "This Tutorial explains the ins and outs of setting up a custom Rate Scale for an indicator. A custom rate scale allows you to visualize multiple indicators side by side in even more flexible ways. ",
"updated": 1617375842097
},
"paragraphs": [
{
"style": "Text",
"text": "This Tutorial can be found in Workspace TBD",
"updated": 1617375668105
}
]
}
@@ -0,0 +1,16 @@
{
"tutorial": "How to set up a new Chart",
"pageNumber": "1",
"type": "How to set up a new Chart Tutorial",
"definition": {
"text": "This Tutorial walks through the basic inner workings of the Charting Space to help you learn how to create your own custom charts.",
"updated": 1617371694835
},
"paragraphs": [
{
"style": "Text",
"text": "This tutorial can be found in the Creating Custom Charts Workspace",
"updated": 1617660792312
}
]
}
@@ -0,0 +1,25 @@
{
"tutorial": "How to set up a new Chart",
"pageNumber": "2",
"type": "Adding Charts - Introduction",
"definition": {
"text": "Today we will learn how to add your own custom Charts!",
"icon": {
"name": "chart-points",
"project": "Superalgos"
},
"updated": 1617323336592
},
"paragraphs": [
{
"style": "Text",
"text": "The charting system within Superalgos is quite powerful! It pulls together information from across the entire system so that you can conveniently visualize it in one place.",
"updated": 1617369523502
},
{
"style": "Text",
"text": "As I am sure you have figured out by now, there are a lot of moving pieces within Superalgos. The Charting Space lets you tap into the specific information you want to see. You can look at different combinations of Indicators, Backtesting and Live Trading results, even data from different Markets and Exchanges! This flexibility makes it possible to customize charts to your heart’s content. Pretty cool right!",
"updated": 1617631456321
}
]
}
@@ -0,0 +1,40 @@
{
"tutorial": "How to set up a new Chart",
"pageNumber": "3",
"type": "Adding Charts - Before We Begin",
"definition": {
"text": "Make sure you know the basics!",
"icon": {
"name": "tutorial",
"project": "Superalgos"
},
"updated": 1617326504902
},
"paragraphs": [
{
"style": "Text",
"text": "Before we get started, this tutorial assumes that you have finished the following tutorials:",
"updated": 1617631888828
},
{
"style": "List",
"text": "Welcome to Superalgos Tutorial"
},
{
"style": "List",
"text": "Basic Education Tutorial"
},
{
"style": "List",
"text": "Contribute to Superalgos Tutorial"
},
{
"style": "List",
"text": "Install a New Market Tutorial"
},
{
"style": "Text",
"text": "If you have not completed these tutorials and do not have a basic working knowledge of how to get around within your Workspace, this tutorial may be confusing. I would suggest that you pause and come back here once you know your way around a little."
}
]
}
@@ -0,0 +1,25 @@
{
"tutorial": "How to set up a new Chart",
"pageNumber": "4",
"type": "Adding Charts - Charts without tears",
"definition": {
"text": "I've got your back!",
"updated": 1617630234092,
"icon": {
"name": "charting-space",
"project": "Superalgos"
}
},
"paragraphs": [
{
"style": "Text",
"text": "If you are just starting out here in Superalgos, all this freedom might be a bit overwhelming. That’s where I come in! My friends and I will walk you through how to customize charts from start to finish! By the time we are done you will have the tools to create charts limited only by your imagination.",
"updated": 1617632679120
},
{
"style": "Note",
"text": "The goal of this tutorial is to teach you how to make custom charts. But if you are looking for a quick fix, the next step will walk you through the easiest way to add a new working chart. After that we will dig into the good stuff!",
"updated": 1617630368066
}
]
}
@@ -0,0 +1,43 @@
{
"tutorial": "How to set up a new Chart",
"pageNumber": "5",
"type": "Adding Charts - Looking for a quick fix?",
"definition": {
"text": "If you are less interested in a custom chart and just want a quick way to see your the Trading System in action. Follow these steps.",
"icon": {
"name": "tutorial",
"project": "Superalgos"
},
"updated": 1617629741903
},
"paragraphs": [
{
"style": "List",
"text": "Backup your Backtesting Session and Live Trading Session Parameters.",
"updated": 1617451879969
},
{
"style": "List",
"text": "Uninstall the Market so everything gets cleaned."
},
{
"style": "List",
"text": "Backup your Trading System and then restore it.",
"updated": 1617629798302
},
{
"style": "List",
"text": "Install the market again. The installation process will detect two trading systems at the Workspace and automatically create the Trading Tasks and Charts you need.",
"updated": 1617629618176
},
{
"style": "List",
"text": "Restore your Session Parameters and replace the auto generated ones."
},
{
"style": "Text",
"text": "Now you should have a nice basic setup. Click next to see some real magic!",
"updated": 1617653700467
}
]
}
@@ -0,0 +1,33 @@
{
"tutorial": "How to set up a new Chart",
"pageNumber": "6",
"type": "Adding Charts - Dashing Dashboards",
"definition": {
"text": "A Dashboard helps us stay organized.",
"icon": {
"name": "dashboard",
"project": "Superalgos"
},
"updated": 1617326878352
},
"paragraphs": [
{
"style": "Text",
"text": "To get us started, I want you to get a little more comfortable with how the Charting Space is set up. Expand the Charting Space node and take a look at the Dashboards underneath. What do you notice?",
"updated": 1617326642397
},
{
"style": "Text",
"text": "That’s right! There is one Dashboard set up for Backtesting and one set up for Live Trading. Dashboards are a convenient way to group charts according to type. ",
"updated": 1617635396701
},
{
"style": "Note",
"text": "Eventually Dashboards will be used to bring multiple Time Machines together in useful configurations, but for right now they helps us stay organized."
},
{
"style": "Text",
"text": ""
}
]
}
@@ -0,0 +1,20 @@
{
"tutorial": "How to set up a new Chart",
"pageNumber": "7",
"type": "Adding Charts - Time Machines hold it all together",
"definition": {
"text": "You've seen these portals to another dimension before! Now let's take a closer look at the magical Time Machine.",
"icon": {
"name": "time-machine",
"project": "Superalgos"
},
"updated": 1617634105980
},
"paragraphs": [
{
"style": "Text",
"text": "As you can see, each dashboard has a Time Machine attached to it. You have already encountered time machines in previous tutorials. But today we are going to be working with them a lot more closely. Take a minute and read their documentation page to get a better idea of what they do.",
"updated": 1617327414064
}
]
}
@@ -0,0 +1,29 @@
{
"tutorial": "How to set up a new Chart",
"pageNumber": "8",
"type": "Adding Charts - Keep it in one place",
"definition": {
"text": "Setting up a Time Machine will allow you to keep your data synchronized and accessible.",
"updated": 1617634554869,
"icon": {
"name": "time-machine",
"project": "Superalgos"
}
},
"paragraphs": [
{
"style": "Text",
"text": "The Time Machine is all about synchronizing. Whether it’s matching up candles with volume indicators or seeing exactly when a buy order was placed by your Trading Strategy, the time machine is your best friend in the Charting Space.",
"updated": 1617635549811
},
{
"style": "Success",
"text": "One Time Machine in the Design Space will show up as one box, or set of Charts, in the Charting Space",
"updated": 1617634300917
},
{
"style": "Text",
"text": ""
}
]
}
@@ -0,0 +1,33 @@
{
"tutorial": "How to set up a new Chart",
"pageNumber": "9",
"type": "Adding Charts - Without Further Ado",
"definition": {
"text": "I know I'm ready to add some charts. Are you?",
"icon": {
"name": "chart-points",
"project": "Superalgos"
},
"updated": 1617635653798
},
"paragraphs": [
{
"style": "Text",
"text": "Enough chit-chat, let’s start adding some charts! Hover over the Testing Environment Dashboard and click Add Time Machine. Then add a name that makes it easy to identify.",
"updated": 1617635008264
},
{
"style": "Text",
"text": "Now that we have something to hold our charts, let's go ahead and add one. Hover over your time machine and click Add Timeline Chart (make sure to name it as well).",
"updated": 1617635775344
},
{
"style": "Text",
"text": " "
},
{
"style": "Text",
"text": ""
}
]
}
@@ -0,0 +1,28 @@
{
"tutorial": "How to set up a new Chart",
"pageNumber": "10",
"type": "Adding Charts - Why is it blank?",
"definition": {
"text": "Woohoo, you did it! You have added your first custom chart.",
"updated": 1617636144825,
"icon": {
"name": "chart-points",
"project": "Superalgos"
}
},
"paragraphs": [
{
"style": "Text",
"text": "However, at this point, your chart is pretty boring.",
"updated": 1617636174999
},
{
"style": "Text",
"text": " If you check the Charting Space, your Time Machine is there, but it is totally blank. That’s because we haven’t hooked it up to any of your data."
},
{
"style": "Text",
"text": "Let’s change that!"
}
]
}
@@ -0,0 +1,34 @@
{
"tutorial": "How to set up a new Chart",
"pageNumber": "11",
"type": "Adding Charts - The Chart of many talents",
"definition": {
"text": "The Timeline Chart gives you total control.",
"icon": {
"name": "timeline-chart",
"project": "Superalgos"
},
"updated": 1617452143875
},
"paragraphs": [
{
"style": "Text",
"text": "As I mentioned earlier, one of the main features the Charting Space offers is the ability to combine many different types of data all in one place. ",
"updated": 1617636673390
},
{
"style": "Text",
"text": "The Timeline Chart gives you this control! Each timeline chart allows you to collect the data you wish to see under a Layer Manager. As you may remember, the layer manager is what allows you to turn different layers on and off while inside a Time Machine.",
"updated": 1617661192637
},
{
"style": "Important",
"text": "When we connect Data Products to the Layers held by a layer manager, we gain access to that data within our chart!",
"updated": 1617637222752
},
{
"style": "Text",
"text": ""
}
]
}
@@ -0,0 +1,46 @@
{
"tutorial": "How to set up a new Chart",
"pageNumber": "12",
"type": "Adding Charts - Herding layers",
"definition": {
"text": "Let's get into the nitty gritty of layer managment.",
"icon": {
"name": "layer-manager",
"project": "Superalgos"
},
"updated": 1617640657348
},
"paragraphs": [
{
"style": "Text",
"text": "Layer Managers keep track of all the layers connected beneath them. They are also the nodes that accept references to a variety of Data Mine Products. By establishing references with a particular mine we can easily add all the data associated with it. ",
"updated": 1617640517891
},
{
"style": "Text",
"text": "The three main types of data are:"
},
{
"style": "List",
"text": "Data Mine Products – for market data and indicators."
},
{
"style": "List",
"text": "Trading Mine Products– for results of a trading system’s Backtesting Session or Live Trading Session.",
"updated": 1617641005190
},
{
"style": "List",
"text": "Learning Mine Products – for data output from learning algorithms. "
},
{
"style": "Text",
"text": "Let’s walk through how to hook these up!",
"updated": 1617641030236
},
{
"style": "Text",
"text": ""
}
]
}
@@ -0,0 +1,25 @@
{
"tutorial": "How to set up a new Chart",
"pageNumber": "13",
"type": "Adding Charts - Your data treasure trove",
"definition": {
"text": "The Data Storage node holds all the important data your bots work so hard to produce. Think of it like your own personal tresure chest full of data.",
"icon": {
"name": "data-storage",
"project": "Superalgos"
},
"updated": 1617373173279
},
"paragraphs": [
{
"style": "Text",
"text": "All of the Data Products you will want to visualize in your charts are kept in the Data Storage node. Let’s start by getting some practice finding and hooking up our chart to Data Mine Products. Remember, Data Mines process the information from Exchanges. Accessing these products with our chart will let us visualize Indicators and other Market Data.",
"updated": 1617643578375
},
{
"style": "Note",
"text": "One great thing about Superalgos is that it uses consistent logic across the system. What that means for us now is that once you learn to hook a chart to one type of data you will know the basic steps to hook your charts to anything you want!",
"updated": 1617645915009
}
]
}
@@ -0,0 +1,25 @@
{
"tutorial": "How to set up a new Chart",
"pageNumber": "14",
"type": "Adding Charts - Follow the Tree!",
"definition": {
"text": "Follow the Data Storage hierarchy and find the Data Mine Products.",
"icon": {
"name": "data-mines-data",
"project": "Superalgos"
},
"updated": 1617328950687
},
"paragraphs": [
{
"style": "Text",
"text": "To do this, pin and drag your whole Time Machine over to the Network node and find the Data Storage node. Expand the Data Storage node. You should notice that there are three branches. One for each type of data we can access in our charts. Since we are interested in Data Mine Products, expand the Data Mines Data node and follow it down. Do you notice any similarity with the other parts of Superalgos you’ve seen? That’s right! The hierarchy is organized according to Project, Exchange, Market, and Data Mine.",
"updated": 1617452392093
},
{
"style": "Note",
"text": "This is the same basic organization you will find with other types of data as well.",
"updated": 1617328905528
}
]
}
@@ -0,0 +1,24 @@
{
"tutorial": "How to set up a new Chart",
"pageNumber": "15",
"type": "Adding Charts - The data you want to see",
"definition": {
"text": "You control the flow of data.",
"updated": 1617646900550,
"icon": {
"name": "data-storage",
"project": "Superalgos"
}
},
"paragraphs": [
{
"style": "Text",
"text": "The granularity of the Data Storage hierarchy means that you can access Data Products in any combination. Do you want to see data from two different exchanges on the same market? Easily possible. Do you want to see data from two similar markets side by side? Piece of cake! The combinations of data you can view within your charts is truly up to your imagination. ",
"updated": 1617646868051
},
{
"style": "Text",
"text": "Whew! I am getting a little carried away. My friends will cover these exciting possiblities in a little while. Let's refocus and finish adding those Data Mine Products."
}
]
}
@@ -0,0 +1,25 @@
{
"tutorial": "How to set up a new Chart",
"pageNumber": "16",
"type": "Adding Charts - Hooking up a Chart to Data Products",
"definition": {
"text": "We are almost to the node we need!",
"icon": {
"name": "data-mine-products",
"project": "Superalgos"
},
"updated": 1617329505743
},
"paragraphs": [
{
"style": "Text",
"text": "We've been working on adding some Data Mine Products to our chart. Let's be a little more specific, we are going to add the data mine products for the Masters Data Mine in the Binance BTC/USDT market. As you follow the hierarchy down you should see the Market Data Products nodes for the Binance BTC/USDT market.",
"updated": 1617452481209
},
{
"style": "Note",
"text": "There are three data mines installed in this Workspace. You will see one Market Data Products node for each market.",
"updated": 1617647424199
}
]
}
@@ -0,0 +1,25 @@
{
"tutorial": "How to set up a new Chart",
"pageNumber": "17",
"type": "Adding Charts - Data Products make the world go round",
"definition": {
"text": "We finally found it!",
"icon": {
"name": "data-mine-products",
"project": "Superalgos"
},
"updated": 1617330357641
},
"paragraphs": [
{
"style": "Text",
"text": "Underneath the Market Data Products node are the nodes we are after, the Data Mine Products nodes. These nodes are the ones we will connect to our chart! If the Data Storage node was your treasure chest, Data Products are your gold!",
"updated": 1617452590612
},
{
"style": "Note",
"text": "You should see one Data Mine Products node for each data mine you have installed in your workspace. I hope the pattern is starting to sink in for you!",
"updated": 1617329732074
}
]
}
@@ -0,0 +1,24 @@
{
"tutorial": "How to set up a new Chart",
"pageNumber": "18",
"type": "Adding Charts - Make the connection",
"definition": {
"text": "Let's make the connection.",
"icon": {
"name": "delink-node",
"project": "Superalgos"
},
"updated": 1617374708610
},
"paragraphs": [
{
"style": "Text",
"text": "Find the Layer Manager under the Timeline Chart you added earlier. Then establish a reference between it and the Masters Data Mine Products node. ",
"updated": 1617648263797
},
{
"style": "Success",
"text": "If things are connected correctly, the name of the data mine should appear over the layer manager."
}
]
}
@@ -0,0 +1,33 @@
{
"tutorial": "How to set up a new Chart",
"pageNumber": "19",
"type": "Adding Charts - Add the Layers",
"definition": {
"text": "Add those layers!",
"updated": 1617648557491,
"icon": {
"name": "layer",
"project": "Superalgos"
}
},
"paragraphs": [
{
"style": "Text",
"text": "The last step is to hover over the Layer Manager and click Add All Mine Layers. This will automatically add references to all of the individual layers produced by the Data Mine. ",
"updated": 1617656376504
},
{
"style": "Important",
"text": "Make sure to run all Data Tasks and wait for them to reach 100%.",
"updated": 1617656439904
},
{
"style": "Text",
"text": "Now you should be able to check the Charting Space and see the indicators from the Data Mine showing up in your chart!"
},
{
"style": "Text",
"text": ""
}
]
}
@@ -0,0 +1,30 @@
{
"tutorial": "How to set up a new Chart",
"pageNumber": "20",
"type": "Adding Charts - Hooking up a Chart to a Trading System",
"definition": {
"text": "I hope you are ready to see your Trading System in action!",
"icon": {
"name": "chart-points",
"project": "Superalgos"
},
"updated": 1617369846347
},
"paragraphs": [
{
"style": "Text",
"text": "The next thing you will want to connect with most charts are the results of your trading strategies. For the most part, this is the same as connecting to a Data Mine. There are just a few differences I will walk you through.",
"updated": 1617649096083
},
{
"style": "Text",
"text": "One major difference is that each Time Machine can only reference one Trading Session. For example, one Backtesting Session that is associated with one Trading System. This helps keep your charts clean and readable. It would be confusing to see buy orders from two different trading systems all at once!",
"updated": 1617649161505
},
{
"style": "Text",
"text": "What this means for connecting a chart is that we need to establish two references in order for things to work.",
"updated": 1617369951260
}
]
}
@@ -0,0 +1,24 @@
{
"tutorial": "How to set up a new Chart",
"pageNumber": "21",
"type": "Adding Charts - Connection one",
"definition": {
"text": "Let's make the first connection.",
"icon": {
"name": "delink-node",
"project": "Superalgos"
},
"updated": 1617370061516
},
"paragraphs": [
{
"style": "Text",
"text": "The first connection is between a Trading Session and the Time Machine we have been working on. Drag your Time Machine back up to the Network node. Find the Testing Trading Tasks hierarchy. Follow it down until you find the Backtesting Task for the Lightning Strike Trading System. Continue down the hierarchy until you find the Backtesting Session. Now take your Time Machine and create a reference to it.",
"updated": 1617649517982
},
{
"style": "Note",
"text": "These steps are the same for connecting to a Live Trading Session. The only difference is following the Production Trading Task hierarchy instead."
}
]
}
@@ -0,0 +1,25 @@
{
"tutorial": "How to set up a new Chart",
"pageNumber": "22",
"type": "Adding Charts - Connection two",
"definition": {
"text": "And now the second.",
"icon": {
"name": "delink-node",
"project": "Superalgos"
},
"updated": 1617374736974
},
"paragraphs": [
{
"style": "Text",
"text": "Now we can go back to the Data Storage hierarchy and follow the Trading Mines Data branch until we find the Backtesting Session Reference node that matches the Backtesting Session we just came from.",
"updated": 1617453374362
},
{
"style": "Text",
"text": "We are almost there! Under the Backtesting Session Reference node you will see a Trading Mine Products node. Just like before, add a new Timeline Chart (don’t forget to name it). Then create a reference between the Trading Mine Products node and the Layer Manager.",
"updated": 1617453393860
}
]
}
@@ -0,0 +1,29 @@
{
"tutorial": "How to set up a new Chart",
"pageNumber": "23",
"type": "Adding Charts - Check the Chart",
"definition": {
"text": "At this point everything is all hooked up, hurray! ",
"updated": 1617652418858,
"icon": {
"name": "chart-points",
"project": "Superalgos"
}
},
"paragraphs": [
{
"style": "Text",
"text": "Run the Backtesting Session for the Lightning Strike Trading System and wait for it to finish. Then verify things are working in the Charting Space by turning on a few layers.",
"updated": 1617661474803
},
{
"style": "Important",
"text": "Remember to pay attention to the Time Frame and dates the session was run under. Otherwise you won’t see anything!"
},
{
"style": "Success",
"text": "The Lightning Strike Backtesting Session was run on the one minute time frame from September 1 2020 to September 2 2020.",
"updated": 1617651027780
}
]
}
@@ -0,0 +1,44 @@
{
"tutorial": "How to set up a new Chart",
"pageNumber": "24",
"type": "Adding Charts - Easy as 1, 2, 3",
"definition": {
"text": "You did it! I knew you could.",
"icon": {
"name": "charting-space",
"project": "Superalgos"
},
"updated": 1617370584556
},
"paragraphs": [
{
"style": "Text",
"text": "Congratulations, your custom chart is now hooked up and working! ",
"updated": 1617370495984
},
{
"style": "Text",
"text": "You now know the basic steps of chart creation. You can repeat the same steps, adding more Timeline Charts, to connect any combination of data you want.",
"updated": 1617651306951
},
{
"style": "Text",
"text": "Just a quick reminder, the three types of nodes you can connect a Timeline Chart’s Layer Manager to are:",
"updated": 1617370557381
},
{
"style": "List",
"text": "Data Mine Products – for Market Data and indicators.",
"updated": 1617453477817
},
{
"style": "List",
"text": "Trading Mine Products– for the results of a Trading System’s Backtesting Session or Live Trading Session.",
"updated": 1617453541079
},
{
"style": "List",
"text": "Learning Mine Products – for data output from learning algorithms. "
}
]
}
@@ -0,0 +1,44 @@
{
"tutorial": "How to set up a new Chart",
"pageNumber": "25",
"type": "Adding Charts - Before I go",
"definition": {
"text": "Want some more help figuring out complex chart configurations? You are in luck! I have some friends who would love to help you out.",
"icon": {
"name": "charting-space",
"project": "Superalgos"
},
"updated": 1617371031010
},
"paragraphs": [
{
"style": "Text",
"text": "Fire up one of my friends to keep going!",
"updated": 1617656189804
},
{
"style": "List",
"text": "How to customize a Layer Manager Tutorial",
"updated": 1617375492766
},
{
"style": "List",
"text": "How to set up a custom Rate Scale Tutorial",
"updated": 1617453801398
},
{
"style": "List",
"text": "How to combine Markets in a Chart Tutorial",
"updated": 1617453794685
},
{
"style": "List",
"text": "How to combine Exchanges in a Chart Tutorial",
"updated": 1617453789889
},
{
"style": "Text",
"text": ""
}
]
}
@@ -0,0 +1,20 @@
{
"tutorial": "Welcome to Superalgos!",
"pageNumber": "110.5",
"type": "Tutorial Step - Beware of Impersonators!",
"definition": {
"text": "Superalgos Admins, the Core Team, and Community Mods will never contact you directly unless you contact them first!",
"icon": {
"name": "bullet-warning",
"project": "Superalgos"
},
"updated": 1617608574624
},
"paragraphs": [
{
"style": "Warning",
"text": "Scammers are lurking! Beware! It's no news that trading-related groups attract all sorts of scammers, and we are aware that they contact people in our groups attempting all sorts of tricks. We will never ask you for API keys, coins, or cash. In fact, we will never ask you to trust us in any way! We want to make it clear that if someone contacts you directly claiming to work with or for the project, it is a scam. Please report scammers in the Community group so that they may be banned, and to increase awareness of the problem, but also block them and report them to Telegram if the option is available.",
"updated": 1617608980211
}
]
}
@@ -408,12 +408,15 @@ exports.newSuperalgosBotModulesTradingStages = function (processIndex) {
function runWhenStatusIsOpening() {
/* Opening Status Procedure */
if (tradingEngine.tradingCurrent.strategyManageStage.status.value === 'Opening') {
let strategy = tradingSystem.tradingStrategies[tradingEngine.tradingCurrent.strategy.index.value]
let manageStage = strategy.manageStage
/*
The system allows the user not to define a Manage Stage, because the Manage Stage is optional.
Here we are going to see if that is the case and if it is, we will inmidiatelly consider
the Manage Stage as closed.
*/
if (tradingSystem.tradingStrategies[tradingEngine.tradingCurrent.strategy.index.value].manageStage === undefined) {
if (manageStage === undefined) {
changeStageStatus('Manage Stage', 'Closed', 'Manage Stage Undefined')
changeStageStatus('Close Stage', 'Opening')
return
@@ -421,6 +424,7 @@ exports.newSuperalgosBotModulesTradingStages = function (processIndex) {
/* Now we switch to the Open status. */
changeStageStatus('Manage Stage', 'Open')
announcementsModuleObject.makeAnnoucements(manageStage)
}
}
@@ -73,11 +73,11 @@ function newSuperalgosFunctionLibraryTradingSessionFunctions() {
'Situation->Condition->Javascript Code->' +
'Close Stage->' +
'Initial Targets->Target Size In Base Asset->Target Size In Quoted Asset->Target Rate->Formula->' +
'Announcement->Announcement Formula->Announcement Condition->' +
'Open Execution->Close Execution->' +
'Execution Algorithm->Market Buy Order->Market Sell Order->Limit Buy Order->Limit Sell Order->' +
'Order Rate->Formula->' +
'Create Order Event->Cancel Order Event->' +
'Announcement->Announcement Formula->Announcement Condition->' +
'Size In Base Asset->Size In Quoted Asset->Position Rate->Formula->' +
'Situation->Condition->Javascript Code->' +
'Market Order->Limit Order->' +
+9 -4
View File
@@ -20,7 +20,8 @@ Node JS is an open-source server environment required to run Superalgos.
**c.** Run the installer with the default configuration — just click Next until Node.JS is fully installed.
**NOTE FOR RASPBERRY PI USERS:** From the SSH Terminal, send the following commands to install Node. **NOTE:** It is best to use the most current and updated version of the FULL PiOS image.
**NOTE FOR RASPBERRY PI USERS:** You may install Node.JS just like you would on any other machine as per the above instructions. As an alternative, you may also try the following from the SSH Terminal. **NOTE:** It is best to use the most current and updated version of the FULL PiOS image.
```
curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash -
```
@@ -53,8 +54,7 @@ Git is an open-source distributed version control system required to download an
**NOTE FOR MAC USERS:** Depending on your setup, installing Git may be optional. The native XCode Command Line Developer Tools seems to work well. If you do install Git, we have tested Tim Harper's binary installer successfully.
**NOTE FOR RASPBERRY PI USERS:**
Send the SSH Terminal command to install git. The most recent version of PiOS has Git already installed, so this may give you an error. The error will not affect your installation.
**NOTE FOR RASPBERRY PI USERS:** Just like with Node.JS, you may follow the above instructions to install Git, or us the SSH Terminal command. The most recent version of PiOS has Git already installed, so this may give you an error. The error will not affect your installation.
```
sudo apt-get install git
```
@@ -148,7 +148,7 @@ A Welcome Tutorial pops-up automatically. You must do this Tutorial to finish th
![run-the-system-01](https://user-images.githubusercontent.com/13994516/107037804-e5fc6200-67bb-11eb-82f2-d0f40247fa14.gif)
If you are running a headless Raspberry Pi (one without a screen) it is recommended to use the following instead.
If you are running a headless Raspberry Pi (one without a screen) you may need to change directories first and run Superalgos with the `minMemo` and `noBrowser` options.
```
cd Superalgos
```
@@ -349,6 +349,11 @@ No problem, code or integrate libraries with your own version of any component a
# Support
The Superalgos Community meets on several Telegram groups.
> **BEWARE OF IMPERSONATORS — SCAMMERS ARE LURKING!**
Superalgos Admins, the Core Team, and Community Mods will never contact you directly unless you contact them first. We will never ask you for API keys, coins, or cash. In fact, we will never ask you to trust us in any way. Our [Community Safetey Policy](https://superalgos.org/community-safety-policy.shtml) explains why. In short, we want to make it clear that if someone contacts you directly claiming to work with or for the project, it is a scam. Please report scammers in the Community group so that they may be banned, and to increase awareness of the problem, but also block them and report them to Telegram if the option is available.
## Via Telegram
Online support through our [Superalgos User's Support Group](https://t.me/superalgossupport).
+24
View File
@@ -40,11 +40,35 @@ function loadSuperalgos() {
const MODULE_NAME = "App Pre-Loader";
const INFO_LOG = false;
let browser = checkBrowserVersion();
setupHTMLTextArea()
setupHTMLInput()
setupHTMLCanvas()
loadDebugModule()
if ((browser.name !== "Chrome" && browser.name!=="Safari") || (browser.name === "Chrome" && parseInt(browser.version) < 85) || (browser.name === "Safari" && parseInt(browser.version) < 13)) {
alert("Superalgos is officially supported on Google Chrome 85 or Safari 13.1 and above. Your browser version has been detected as potentially beneath this. If you continue you may experience some functionaility issues.\n\nDetected Browser: " + browser.name + "\nVersion: " + browser.version);
}
function checkBrowserVersion () {
let ua=navigator.userAgent,tem,M=ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) || [];
if(/trident/i.test(M[1])){
tem=/\brv[ :]+(\d+)/g.exec(ua) || [];
return {name:'IE',version:(tem[1]||'')};
}
if(M[1]==='Chrome'){
tem=ua.match(/\bOPR|Edge\/(\d+)/)
if(tem!=null) {return {name:'Opera', version:tem[1]};}
}
M=M[2]? [M[1], M[2]]: [navigator.appName, navigator.appVersion, '-?'];
if((tem=ua.match(/version\/(\d+)/i))!=null) {M.splice(1,1,tem[1]);}
return {
name: M[0],
version: M[1]
};
}
function setupHTMLTextArea() {
let textArea = document.createElement('textarea');
textArea.id = "textArea";