From 173f752dc1c6df36a3b3b7b62d00cd85abfef212 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Tue, 25 May 2021 03:25:30 +0200 Subject: [PATCH 1/5] Data Mining Docs Topic Reviewed --- ...a-mining-001-data-mining-introduction.json | 25 ++++++++------ ...data-mining-002-data-mining-workflows.json | 20 +++++------ ...-mining-003-data-mining-dataset-types.json | 20 ++++++----- ...data-mining-datasets-type-conversions.json | 13 +++++--- ...-005-data-mining-indicator-frameworks.json | 33 ++++++++++--------- ...ata-mining-006-data-mining-data-mines.json | 7 ++-- ...ng-007-data-mining-managing-execution.json | 13 +++++--- ...ing-008-data-mining-data-dependencies.json | 3 +- ...mining-009-data-mining-status-reports.json | 14 ++++---- ...g-010-data-mining-status-dependencies.json | 7 ++-- ...ta-mining-011-data-mining-deployments.json | 32 +++++++++++++++--- .../data-mining-012-data-mining-products.json | 8 ++--- .../data-mining-013-data-mining-plotting.json | 7 ++-- ...1-data-mining-fetching-data-from-apis.json | 15 +++++++++ 14 files changed, 142 insertions(+), 75 deletions(-) create mode 100644 Projects/Superalgos/Schemas/Docs-Topics/data-mining-3.1-data-mining-fetching-data-from-apis.json diff --git a/Projects/Superalgos/Schemas/Docs-Topics/data-mining-001-data-mining-introduction.json b/Projects/Superalgos/Schemas/Docs-Topics/data-mining-001-data-mining-introduction.json index 583899495..64135a3cb 100644 --- a/Projects/Superalgos/Schemas/Docs-Topics/data-mining-001-data-mining-introduction.json +++ b/Projects/Superalgos/Schemas/Docs-Topics/data-mining-001-data-mining-introduction.json @@ -3,14 +3,14 @@ "pageNumber": "1", "type": "Data Mining - Introduction", "definition": { - "text": "Data Mining in Superalgos means extracting data from external sources, procesing that data in order to have it ready for consumption by trading strategies.", - "updated": 1621694013759 + "text": "Data Mining in Superalgos means extracting data from external sources and procesing that data in order to have it ready for consumption by trading strategies.", + "updated": 1621899758597 }, "paragraphs": [ { "style": "Text", - "text": "Superalgos offers a set of Data Mining tools. With those, users can fetch data from external sources, process them into more elaborate datasets, plot them at the charts and ultimately consume the data within their trading strategies.", - "updated": 1621694036120 + "text": "Superalgos offers a set of Data Mining tools. With those, users can fetch data from external sources, process them into more elaborate datasets, plot them at the charts, feed ML Bot's models and ultimately consume the data within their trading strategies.", + "updated": 1621899827534 }, { "style": "Title", @@ -18,8 +18,8 @@ }, { "style": "Text", - "text": "All of the data inside the Superalgos system has an origin somewhere at the Internet, outisde of the system. There are currently to ways to bring data into the system:", - "updated": 1621705240818 + "text": "All of the data inside the Superalgos system has an origin somewhere outside the system, usually somewhere at the Internet. There are currently 3 ways to bring data into the system:", + "updated": 1621899913780 }, { "style": "List", @@ -28,13 +28,18 @@ }, { "style": "List", - "text": "Without coding an Algorithm: (available since Beta 10) via the API Data Fetcher Bot, this method involves designing an API Map which is later feeded to an API Data Fetcher Bot at run time so that it can fetch data from APIs without needing the user to write a single line of code at all.", - "updated": 1621705316432 + "text": "Without coding an Algorithm: (available since Beta 10) via the API Data Fetcher Bot, this method involves designing an API Map which is later feeded to an API Data Fetcher Bot at runtime so that it can fetch data from APIs without needing the user to write a single line of code at all.", + "updated": 1621900116590 + }, + { + "style": "List", + "text": "External processing: it is also possible to gather the data and process it outside the system, and put it in the right folder, with the right format, and in this way feed the system with data. This use case is not the most popular, but it is a valid possibility.", + "updated": 1621900136004 }, { "style": "Text", - "text": "Once the data is in the system, it is then processed for different reasons by Indicator Bot s. Some of the processed data might be plotted, and some might be consumed from a Trading Strategy.", - "updated": 1621691628626 + "text": "Once the data is in the system, it is then processed for different reasons by Indicator Bot s. Some of the processed data might be plotted, some might feed machile learning bots, and some might be consumed from a Trading Strategy.", + "updated": 1621900199919 } ] } \ No newline at end of file diff --git a/Projects/Superalgos/Schemas/Docs-Topics/data-mining-002-data-mining-workflows.json b/Projects/Superalgos/Schemas/Docs-Topics/data-mining-002-data-mining-workflows.json index c25a777ea..cc9dfaebd 100644 --- a/Projects/Superalgos/Schemas/Docs-Topics/data-mining-002-data-mining-workflows.json +++ b/Projects/Superalgos/Schemas/Docs-Topics/data-mining-002-data-mining-workflows.json @@ -36,8 +36,8 @@ }, { "style": "Note", - "text": "Both of these 2 workflows start by producing Raw Data that has to be digested by Indicator Bots.", - "updated": 1621698358246 + "text": "The data just arrived from an external source is considered Raw Data. Both of these 2 workflows produce Raw Data that has to be digested by Indicator Bots.", + "updated": 1621900437233 }, { "style": "Subtitle", @@ -50,8 +50,8 @@ }, { "style": "List", - "text": "Standarize Datasets: They are used for standarization of raw data extracted from the internet by Sensor Bot s or API Data Fetcher Bot s. Once data is standarized, it can be run through other Indicator Bot s that will extract the juice out of them. Once standarized data can also be plotted and consumed from trading strategies. By standarizing we are specifically referring to transforming the data into a Dataset type that can be used for Plotting, to feed Learning Bots and Trading Bots. These Dataset types are Multi-Period-Daily and Milti-Period-Market. ", - "updated": 1621705567513 + "text": "Standarize Datasets: They are used for standarization of raw data extracted from the internet by a Sensor Bot or an API Data Fetcher Bot. Once data is standarized, it can be run through other Indicator Bot s that will extract the juice out of them. Once standarized, data can also be plotted and consumed from trading strategies. By standarizing we are specifically referring to transforming the data into a Dataset type that can be used for Plotting, to feed Learning Bots and Trading Bots. These Dataset types are Multi-Period-Daily and Milti-Period-Market.", + "updated": 1621900536868 }, { "style": "List", @@ -60,13 +60,13 @@ }, { "style": "Subtitle", - "text": "Indicators -> Plotters (for users)", - "updated": 1621698262190 + "text": "Indicators -> Plotters", + "updated": 1621900608845 }, { "style": "Text", - "text": "Plotters are intended for users, not for bots. Plotters will render at the charts information of a Dataset based on the plotter's definition. Plotters can only read data from certain Dataset types, you will learn which ones later at this Topic.", - "updated": 1621697151527 + "text": "Plotters are tools for users, not for bots. Plotters will render at the charts information of a Dataset based on the plotter's definition. Plotters can only read data from certain Dataset types, you will learn which ones later at this Topic.", + "updated": 1621900619194 }, { "style": "Text", @@ -88,8 +88,8 @@ }, { "style": "Text", - "text": "Trading bots are the final consumer of data, which they use to take trading decisions based on their definitions. The ultimate purpose of the whole Data Mining operation is to digest data so that is is easily accesible for trading strategies.", - "updated": 1621696940017 + "text": "Trading bots are the ultimate consumer of data, which they use to take trading decisions based on their definitions. The ultimate purpose of the whole Data Mining operation is to digest data so that is is easily accesible for trading strategies.", + "updated": 1621900703336 } ] } \ No newline at end of file diff --git a/Projects/Superalgos/Schemas/Docs-Topics/data-mining-003-data-mining-dataset-types.json b/Projects/Superalgos/Schemas/Docs-Topics/data-mining-003-data-mining-dataset-types.json index 26171f632..778e3159c 100644 --- a/Projects/Superalgos/Schemas/Docs-Topics/data-mining-003-data-mining-dataset-types.json +++ b/Projects/Superalgos/Schemas/Docs-Topics/data-mining-003-data-mining-dataset-types.json @@ -14,23 +14,27 @@ }, { "style": "List", - "text": "Single File: As the name suggest, this Dataset contains only one file with all the data in there. It is not frequently used. So far is the Dataset type where data comming from Webhooks is stored at. It is stored in this way because it assumed that not a lot of data will come through this pipe, only signals produced by external systems. Webhooks feature is expected to evolve in the future maniging the incoming data in another type of Dataset. This Dataset type can be plotted and it's data consumed from withing trading strategies.", - "updated": 1621696354757 + "text": "Single-File: As the name suggest, this Dataset contains only one file with all the data in there. It is not frequently used. So far is the Dataset type where data comming from Webhooks is stored at. It is stored in this way because it is assumed that not a lot of data will come through this pipe, only signals produced by external systems. Webhooks feature is expected to evolve in the future maniging the incoming data in another type of Dataset. This Dataset type can be plotted and it's data consumed from withing trading strategies. The API Data Fetcher Bot also can save Raw Data in this type of dataset, if needed.", + "updated": 1621901077561 }, { "style": "List", - "text": "One-Min Daily: This Dataset type organizes data in one file per day, and as the name suggest, expects the data itself to belong to time periods of one minute. This type of Dataset can not be plotted or it's data consumed from trading strategies.", - "updated": 1621696328584 + "text": "One-Min-Daily: This Dataset type organizes data in one file per day, and as the name suggest, expects the data itself to belong to time frames of one minute. This type of Dataset can not be plotted or it's data consumed from trading strategies.", + "updated": 1621901069906 }, { "style": "List", - "text": "Multi Period Daily: This Dataset type organizes data in one file per day for each Time Frame ranging from 1 minute to 45 minuntes. The data of this type of Dataset can be plotted and can be consumed by trading strategies.", - "updated": 1621696475925 + "text": "Multi-Period-Daily: This Dataset type organizes data in one file per day for each Time Frame ranging from 1 minute to 45 minuntes. The data of this type of Dataset can be plotted and can be consumed by trading strategies.", + "updated": 1621901061453 }, { "style": "List", - "text": "Multi Period Market: This Dataset type organizes data in only one file each Time Frame ranging from 1 hour to 24 hours. That means that the whole market history will be stored in one single file for each time frame. For example candles of 1 hour for a certain market, will be stored in a single file. The data of this type of Dataset can be plotted and can be consumed by trading strategies.", - "updated": 1621696582451 + "text": "Multi-Period-Market: This Dataset type organizes data in only one file for each Time Frame ranging from 1 hour to 24 hours. That means that the whole market history will be stored in one single file for each time frame. For example candles of 1 hour for a certain market, will be stored in a single file. The data of this type of Dataset can be plotted and can be consumed by trading strategies.", + "updated": 1621901050963 + }, + { + "style": "Note", + "text": "By far, the most popular Dataset Types are Multi-Period-Daily and Multi-Period-Market. " } ] } \ No newline at end of file diff --git a/Projects/Superalgos/Schemas/Docs-Topics/data-mining-004-data-mining-datasets-type-conversions.json b/Projects/Superalgos/Schemas/Docs-Topics/data-mining-004-data-mining-datasets-type-conversions.json index 2971c817c..04c94a7e5 100644 --- a/Projects/Superalgos/Schemas/Docs-Topics/data-mining-004-data-mining-datasets-type-conversions.json +++ b/Projects/Superalgos/Schemas/Docs-Topics/data-mining-004-data-mining-datasets-type-conversions.json @@ -62,8 +62,8 @@ }, { "style": "Text", - "text": "The Asset Metrics Indicator Bot, defined at the Messari Data Mine uses a Standard Converter from One-Min-Daily Dataset type to Multi-Period-Daily and Multi-Period-Market Dataset types. To use the conferter, the bot's Process Definition nodes need to have at their config the framework of this converter.", - "updated": 1621711379111 + "text": "The Asset Metrics Indicator Bot, defined at the Messari Data Mine uses a Standard Converter from One-Min-Daily Dataset type to Multi-Period-Daily and Multi-Period-Market Dataset types. To use the converter, the bot's Process Definition nodes need to have at their config the framework of this converter.", + "updated": 1621901387602 }, { "style": "Text", @@ -82,8 +82,13 @@ }, { "style": "Json", - "text": "{\n \"codeName\": \"From-One-Min-To-Multi-Period-Market\",\n \"normalWaitTime\": 0,\n \"retryWaitTime\": 10000,\n \"framework\": {\n \"name\": \"From-One-Min-To-Multi-Period-Market\"\n }\n}", - "updated": 1621701757557 + "text": " {\n \"codeName\": \"From-One-Min-To-Multi-Period-Market\",\n \"normalWaitTime\": 0,\n \"retryWaitTime\": 10000,\n \"framework\": {\n \"name\": \"From-One-Min-To-Multi-Period-Market\"\n }\n}", + "updated": 1621901499029 + }, + { + "style": "Success", + "text": "You will need the standar converter everytime you use the API Data Fetcher Bot to extract data from some Inernet API. The bot will usually save the data in a One-Min-Daily Dataset Type, and you will need to setup and Indicator Bot with two processes, in order to convert the One-Min-Daily Dataset Type into a Multi-PeriodDaily and a Multi-Period-Market Dataset Type. ", + "updated": 1621901677409 } ] } \ No newline at end of file diff --git a/Projects/Superalgos/Schemas/Docs-Topics/data-mining-005-data-mining-indicator-frameworks.json b/Projects/Superalgos/Schemas/Docs-Topics/data-mining-005-data-mining-indicator-frameworks.json index d81f77328..a414043b7 100644 --- a/Projects/Superalgos/Schemas/Docs-Topics/data-mining-005-data-mining-indicator-frameworks.json +++ b/Projects/Superalgos/Schemas/Docs-Topics/data-mining-005-data-mining-indicator-frameworks.json @@ -9,8 +9,8 @@ "paragraphs": [ { "style": "Text", - "text": "When running custom code, users have full control of the process and there is no limit on what it can be done in terms of data manipulations. The trade off is that the user must be a developer.", - "updated": 1621702329009 + "text": "When running custom code, users have full control of the process and there is no limit on what it can be done in terms of data manipulation. The trade off is that the user must be a developer.", + "updated": 1621902338195 }, { "style": "Text", @@ -31,11 +31,13 @@ }, { "style": "List", - "text": "Custom Code: This means the Indicator will use custom made code to handle all data transformations. " + "text": "Custom Code: This means the Indicator Bot will use custom made code to handle all data transformations.", + "updated": 1621902418790 }, { "style": "List", - "text": "UI-Defined: This means that the indictor will base it's behaviour on the definitioins defined at the UI including the code snippets provided by the user." + "text": "UI-Defined: This means that the Indictor Bot will base it's behaviour on the definitioins at the UI including the code snippets provided by the user.", + "updated": 1621902442579 }, { "style": "Title", @@ -65,8 +67,8 @@ }, { "style": "Text", - "text": "The way to implement a Custom Code Indicator is to set up at the config of the Process Definition that there is custom code for this process. Specifically, you need to add the botModule property to the config. This is how it looks like.", - "updated": 1621703510791 + "text": "The way to implement a Custom Code Indicator tell the Bot at the config of the Process Definition that there is custom code for this process. Specifically, you need to add the botModule property to the config. This is how it looks like.", + "updated": 1621902538119 }, { "style": "Json", @@ -75,8 +77,8 @@ }, { "style": "Text", - "text": "Then you will need to locate the Project Schema file for the project your bot belongs to. Inside of that file you will need to add some definitions in order for the system to be able to laod your new module at runtime and later execute it once users run your bot implemented in this way.", - "updated": 1621703616902 + "text": "Then you will need to locate the Project Schema File for the project your bot belongs to. Inside of that file you will need to add some definitions in order for the system to be able to laod your new module at runtime and later execute it once users run your bot implemented in this way.", + "updated": 1621902552523 }, { "style": "Text", @@ -84,7 +86,8 @@ }, { "style": "Text", - "text": "The definition to be added there should be something like this:" + "text": "The definition to be added there should look something like this:", + "updated": 1621902599128 }, { "style": "Json", @@ -93,8 +96,8 @@ }, { "style": "Text", - "text": "After that you will need to add a new Javascript module with your code. ", - "updated": 1621704019288 + "text": "After that you will need to add to the codebase a new Javascript module with your code.", + "updated": 1621902622372 }, { "style": "Title", @@ -127,13 +130,13 @@ }, { "style": "List", - "text": "Multi-Period-Daily: It is used to process data currently available at a Dataset of type Multi-Period-Daily and produce an output of a Dataset of the same type. How the data is going to be transformed is up to the user, since at the UI users can provide code snippets to handle the data transformation at the Data Building Procedure node.", - "updated": 1621703225204 + "text": "Multi-Period-Daily: It is used to process data currently available at a Dataset of type Multi-Period-Daily and produce as output a Dataset of the same type. How the data is going to be transformed is up to the user, since at the UI users can provide code snippets to handle the data transformation at the Data Building Procedure node.", + "updated": 1621902697553 }, { "style": "List", - "text": "Multi-Period-Market: It is used to process data currently available at a Dataset of type Multi-Period-Market and produce an output of a Dataset of the same type. How the data is going to be transformed is up to the user, since at the UI users can provide code snippets to handle the data transformation at the Data Building Procedure node.", - "updated": 1621703273921 + "text": "Multi-Period-Market: It is used to process data currently available at a Dataset of type Multi-Period-Market and produce as output a Dataset of the same type. How the data is going to be transformed is up to the user, since at the UI users can provide code snippets to handle the data transformation at the Data Building Procedure node.", + "updated": 1621902733616 }, { "style": "Subtitle", diff --git a/Projects/Superalgos/Schemas/Docs-Topics/data-mining-006-data-mining-data-mines.json b/Projects/Superalgos/Schemas/Docs-Topics/data-mining-006-data-mining-data-mines.json index 927a9b933..a42a73bf8 100644 --- a/Projects/Superalgos/Schemas/Docs-Topics/data-mining-006-data-mining-data-mines.json +++ b/Projects/Superalgos/Schemas/Docs-Topics/data-mining-006-data-mining-data-mines.json @@ -51,7 +51,8 @@ }, { "style": "Text", - "text": "Data Mines might depend of other Data Mines if any of their bots depend on bots belonging to other Data Mines. You will learn further down this Topic how a bot can depend on other bots in detail. In a nutshell, they can depend in two ways:" + "text": "Data Mines might depend of other Data Mines if any of their bots depend on bots belonging to other Data Mines. You will learn further down this Topic how a bot can depend on other bots in detail. In a nutshell, they can depend in 3 ways. They can have a:", + "updated": 1621903084681 }, { "style": "List", @@ -68,8 +69,8 @@ }, { "style": "Note", - "text": "When a Data Mine depends on another Data Mine, both need to be present at the Workspace where the Task involving the execution of the Bot is.", - "updated": 1621709928655 + "text": "When a Data Mine depends on another Data Mine, both need to be present at the Workspace where the Task defining the execution of the Bot is located.", + "updated": 1621903174117 } ] } \ No newline at end of file diff --git a/Projects/Superalgos/Schemas/Docs-Topics/data-mining-007-data-mining-managing-execution.json b/Projects/Superalgos/Schemas/Docs-Topics/data-mining-007-data-mining-managing-execution.json index 028d33d87..47cf94976 100644 --- a/Projects/Superalgos/Schemas/Docs-Topics/data-mining-007-data-mining-managing-execution.json +++ b/Projects/Superalgos/Schemas/Docs-Topics/data-mining-007-data-mining-managing-execution.json @@ -3,8 +3,8 @@ "pageNumber": "7", "type": "Data Mining - Managing Execution", "definition": { - "text": "Bots can execute at their own pace or they could wait for other bots to finish executing in order to start. ", - "updated": 1621710031525 + "text": "Bots can execute at their own pace or they can wait for other bots to finish executing in order for them to start.", + "updated": 1621903220369 }, "paragraphs": [ { @@ -38,8 +38,8 @@ }, { "style": "Text", - "text": "This is how to configure the Process Definition of a Bot that it's execution depends on other Bot. Here the normalWaitTime has a value of zero, which will force the boot to inmediatelly run the next loop, but since there is an Execution Started Event defined, that will make it wait until the referenced Bot finishes.", - "updated": 1621710760133 + "text": "This is how to configure the Process Definition of a Bot that it's execution depends on other Bot. Here the normalWaitTime has a value of zero, which will force the Bot to inmediatelly run the next loop, but since there is an Execution Started Event defined, that will make it wait until the referenced Bot finishes.", + "updated": 1621903624630 }, { "style": "Json", @@ -50,6 +50,11 @@ "style": "Success", "text": "In this case users must also define which bot to wait for. To do this they stablish a reference from the Execution Started Event node of the Bot that needs to wait, to the Execution Finished Event of the Bot they are waiting for to finish.", "updated": 1621710539966 + }, + { + "style": "Note", + "text": "From the deployment point of view, the dependant bots can be physically located at the same machine, or at multiple different machines. Superalgos handles the syncronization across multiples machines.", + "updated": 1621903914878 } ] } \ No newline at end of file diff --git a/Projects/Superalgos/Schemas/Docs-Topics/data-mining-008-data-mining-data-dependencies.json b/Projects/Superalgos/Schemas/Docs-Topics/data-mining-008-data-mining-data-dependencies.json index a0e1694c7..c4fed4808 100644 --- a/Projects/Superalgos/Schemas/Docs-Topics/data-mining-008-data-mining-data-dependencies.json +++ b/Projects/Superalgos/Schemas/Docs-Topics/data-mining-008-data-mining-data-dependencies.json @@ -26,7 +26,8 @@ }, { "style": "Text", - "text": "When a Bot has a Data Dependency of a dataset produced by a Bot defined in a different Data Mine, then both Data Mines must be present at the Workspace where the Bot is going to be lauched at." + "text": "When a Bot has a Data Dependency of a dataset produced by a Bot defined at a different Data Mine, then both Data Mines must be present at the Workspace where the Bot is going to be lauched at.", + "updated": 1621903950116 }, { "style": "Text", diff --git a/Projects/Superalgos/Schemas/Docs-Topics/data-mining-009-data-mining-status-reports.json b/Projects/Superalgos/Schemas/Docs-Topics/data-mining-009-data-mining-status-reports.json index b77e01b38..3a52ee366 100644 --- a/Projects/Superalgos/Schemas/Docs-Topics/data-mining-009-data-mining-status-reports.json +++ b/Projects/Superalgos/Schemas/Docs-Topics/data-mining-009-data-mining-status-reports.json @@ -3,18 +3,19 @@ "pageNumber": "9", "type": "Data Mining - Status Reports", "definition": { - "text": "Status Reports are files produced by each Bot's processes with some key information that the Bot needs to save in order to remember the next time is run.", - "updated": 1621716668465 + "text": "Status Reports are files produced by each Bot's processes with some key information that the Bot needs to save in order to remember it the next time is run.", + "updated": 1621904046327 }, "paragraphs": [ { "style": "Text", - "text": "Most Bots in superalgos are run by the Task Server and they implement a Main Loop. At each loop execution, bots do their job and at the end they go to sleep. How much time they sleep and other details are configured at the Bot's process. ", - "updated": 1621717056723 + "text": "Most Bots in Superalgos are run by the Task Server and they implement a Main Loop. At each loop execution, bots do their job and at the end they go to sleep. How much time they sleep and other details are configured at the Bot's Process Definition.", + "updated": 1621904131214 }, { "style": "Text", - "text": "Before going to sleep all the memory is flushed from all information related to the bot, so that machine resources are freed for other bots in the same machine to use. There is some info Bot's need to remember between every execution of the Main Loop, and between executions of the Task itself. That info is stored in a JSON / text file called the Status Report." + "text": "Before going to sleep, all the memory is flushed from all information related to the Bot, so that hardware resources are freed for other bots in the same machine to use. There is some info Bots need to remember between every execution of the Main Loop, and between executions of the Task itself. That info is stored in a JSON / text file called the Status Report.", + "updated": 1621904194069 }, { "style": "Text", @@ -27,7 +28,8 @@ }, { "style": "Note", - "text": "Status Report files also might include a data structure called Inter Execution Memory. Status information is kind of standard for all types of bots. Inter Execution Memory on the other hand depends on each Bot type and what is actually processing." + "text": "Status Report files also might include a data structure called Inter Execution Memory. Status information is kind of standard for all types of bots. Inter Execution Memory on the other hand, depends on each Bot type and what is actually processing.", + "updated": 1621904260686 }, { "style": "Text", diff --git a/Projects/Superalgos/Schemas/Docs-Topics/data-mining-010-data-mining-status-dependencies.json b/Projects/Superalgos/Schemas/Docs-Topics/data-mining-010-data-mining-status-dependencies.json index c63b5f014..d335edaae 100644 --- a/Projects/Superalgos/Schemas/Docs-Topics/data-mining-010-data-mining-status-dependencies.json +++ b/Projects/Superalgos/Schemas/Docs-Topics/data-mining-010-data-mining-status-dependencies.json @@ -19,8 +19,8 @@ }, { "style": "Text", - "text": "Bots that produce Raw Data usually do not depend on any other Bot's status and they are usually the root of a dependency tree or graph. Any Bot might have zero to many status dependencies. For each Status Dependency, the Bot's process at runtime will load the Status Report file of the dependent Bot and let extract from there the information it needs.", - "updated": 1621718085593 + "text": "Bots that produce Raw Data usually do not depend on any other Bot's status and they are usually the root of a dependency tree or graph. Any Bot can have from zero to many status dependencies. For each Status Dependency, the Bot's process at runtime will load the Status Report file of the dependent Bot and will extract from there the information it needs.", + "updated": 1621904417277 }, { "style": "Title", @@ -29,7 +29,8 @@ }, { "style": "Text", - "text": "Status Dependency can be classified by their utility. This make it easier for processes to handle them in code. There are currently three different utilities:" + "text": "A Status Dependency can be classified by it's utility. This make it easier for processes to handle them in code. There are currently three different utilities:", + "updated": 1621904453267 }, { "style": "List", diff --git a/Projects/Superalgos/Schemas/Docs-Topics/data-mining-011-data-mining-deployments.json b/Projects/Superalgos/Schemas/Docs-Topics/data-mining-011-data-mining-deployments.json index f21be3657..6ddad777f 100644 --- a/Projects/Superalgos/Schemas/Docs-Topics/data-mining-011-data-mining-deployments.json +++ b/Projects/Superalgos/Schemas/Docs-Topics/data-mining-011-data-mining-deployments.json @@ -13,13 +13,37 @@ "updated": 1621719049976 }, { - "style": "Text", - "text": "On one hand, the definitions at the Data Mine already contain the 3 types of relationships between Bots. Execution, Data Dependency and Status Dependency. On the other hand, the network hierarchy contains all the information needed to guess where the dependent bots are running (looking at the Tasks it can know at which machine in the network) and where the Datasets are in the network (looking at the Data Storage section).", - "updated": 1621719258047 + "style": "Title", + "text": "How does Superalgos know how to coordinate Bots?", + "updated": 1621904714762 }, { "style": "Text", - "text": "Everytime a Task is executed, the whole Network hierarchy, together with the bot's definitions at Data Mines are sent to the Task Server which will help the bot to load the datasets defined as Data Depencies, the Status Reports defined as Status Dependencies and wait for the Bot's defined at the Execution Dependencies, no matter where all those resources are within the physical network. " + "text": "Everything that needs to be known is already defined at the Workspace.", + "updated": 1621904768357 + }, + { + "style": "List", + "text": "In Data Mines: The definitions at the Data Mine contain the 3 types of relationships between Bots. Execution, Data Dependency and Status Dependency. " + }, + { + "style": "List", + "text": "At the Network: The Network hierarchy contains all the information needed to know where the dependent bots are running (looking at the Tasks we can know at which machine in the network) and where the Datasets are in the network (looking at the Data Storage section)." + }, + { + "style": "Title", + "text": "How does a Bot know where are it's dependencies running?", + "updated": 1621904824161 + }, + { + "style": "Text", + "text": "Everytime a Task is executed, the whole Network hierarchy, together with the bot's definitions at Data Mines are sent to the Task Server. This includes not only the Bot to be ran definitions, but also all the definitions of the dependent bots. ", + "updated": 1621904939603 + }, + { + "style": "Success", + "text": "At runtime, Superalgos will provide the Bot with the Datasets defined at Data Depencies, the Status Reports defined as Status Dependencies and if necesary, it iwll help the Bot wait for the Bot defined as an Execution Dependency, no matter where all those resources are within the physical network.", + "updated": 1621905102590 } ] } \ No newline at end of file diff --git a/Projects/Superalgos/Schemas/Docs-Topics/data-mining-012-data-mining-products.json b/Projects/Superalgos/Schemas/Docs-Topics/data-mining-012-data-mining-products.json index b0b55fae8..7663beddc 100644 --- a/Projects/Superalgos/Schemas/Docs-Topics/data-mining-012-data-mining-products.json +++ b/Projects/Superalgos/Schemas/Docs-Topics/data-mining-012-data-mining-products.json @@ -3,14 +3,14 @@ "pageNumber": "12", "type": "Data Mining - Products", "definition": { - "text": "All Datasets of any type of bot within the Superalgos system are considered products of the Bot that produced them. Why products? Because these dataset once the Superalgos Network is implemente wil be able to be sold to other users in the form of subscriptions.", - "updated": 1621721546261 + "text": "All Datasets of any type of bot within the Superalgos system are considered products of the Bot that produced them. Why products? Because users will be able to sell hese datasets in the form of subscriptions once the Superalgos Network is implemented.", + "updated": 1621905194343 }, "paragraphs": [ { "style": "Text", - "text": "In the future, users will be able to offer products to the rest of the users of the Superalgos Network / Marketplace. A single bot might produce many as many products as the bot designer wishes. Each product might contain one or more datasets. ", - "updated": 1621721677750 + "text": "In the future, users will be able to offer products to the rest of the users of the Superalgos Network / Superalgos Marketplace. A single bot might produce as many products as the bot designer wishes. Each product might contain one or more datasets.", + "updated": 1621905284676 } ] } \ No newline at end of file diff --git a/Projects/Superalgos/Schemas/Docs-Topics/data-mining-013-data-mining-plotting.json b/Projects/Superalgos/Schemas/Docs-Topics/data-mining-013-data-mining-plotting.json index 247595d6c..065d66a04 100644 --- a/Projects/Superalgos/Schemas/Docs-Topics/data-mining-013-data-mining-plotting.json +++ b/Projects/Superalgos/Schemas/Docs-Topics/data-mining-013-data-mining-plotting.json @@ -3,13 +3,14 @@ "pageNumber": "13", "type": "Data Mining - Plotting", "definition": { - "text": "Each product might have one Plotter Module associated with it. This Plotter Module has all the definitions to inteerpret the Product's datasets and render the information at the charts.", - "updated": 1621721823675 + "text": "Each product might have one Plotter Module associated with it. This Plotter Module has all the definitions needed to interpret the Product's datasets and render the information at the charts.", + "updated": 1621905321330 }, "paragraphs": [ { "style": "Text", - "text": "Right click and Edit to enter edit mode and change this text. ENTER to write new paragraphs. ESC to exit edit mode. Then you can use docs.save to save your changes and app.contribute to send it to the main repository." + "text": "Superalgos has the capability to allow it's users to create plotters without writing any code at all. The ploter is defined at the Designer Space, and by the means of defining vertices and polygons, users can create custom charts for any Dataset.", + "updated": 1621905478694 } ] } \ No newline at end of file diff --git a/Projects/Superalgos/Schemas/Docs-Topics/data-mining-3.1-data-mining-fetching-data-from-apis.json b/Projects/Superalgos/Schemas/Docs-Topics/data-mining-3.1-data-mining-fetching-data-from-apis.json new file mode 100644 index 000000000..6ad594806 --- /dev/null +++ b/Projects/Superalgos/Schemas/Docs-Topics/data-mining-3.1-data-mining-fetching-data-from-apis.json @@ -0,0 +1,15 @@ +{ + "topic": "Data Mining", + "pageNumber": "13.1", + "type": "Data Mining - Fetching Data From APIs", + "definition": { + "text": "Superalgos allow it's user to fetch data from any API on the Internet without needing to write code to do it. Instead, users design an API Map, which is a set of definitions of how a Bot can access a certain API and how to interpret the API Server responses. With this API Maps, a API Data Fetcher Bot can be configured to extract data from any API Server and stored inside the system as Raw Data that later can processed and consumed by other Bots.", + "updated": 1621905787119 + }, + "paragraphs": [ + { + "style": "Text", + "text": "Right click and Edit to enter edit mode and change this text. ENTER to write new paragraphs. ESC to exit edit mode. Then you can use docs.save to save your changes and app.contribute to send it to the main repository." + } + ] +} \ No newline at end of file From 97572ed0a4a2a87fc46e483df12fe8ec4a0d09df Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Tue, 25 May 2021 04:57:06 +0200 Subject: [PATCH 2/5] Final set of icons for API Data Fetcher by Hirajin Koizuko (Ron) --- .../nodes/api-data-fetcher-bot-instance.svg | 133 ++++++++++++++++++ .../nodes/api-data-fetcher-bot.svg | 37 +++++ .../api-data-fetcher-process-instance.svg | 34 +++++ .../nodes/api-map-reference.svg | 10 ++ .../Icons/api-data-fetcher-bot-instance.png | Bin 0 -> 23714 bytes .../Superalgos/Icons/api-data-fetcher-bot.png | Bin 0 -> 18483 bytes .../api-data-fetcher-process-instance.png | Bin 0 -> 23832 bytes .../Superalgos/Icons/api-map-reference.png | Bin 0 -> 14867 bytes ...1-data-mining-fetching-data-from-apis.json | 4 +- 9 files changed, 216 insertions(+), 2 deletions(-) create mode 100644 Projects/Superalgos/Icons-SVG-Sources/nodes/api-data-fetcher-bot-instance.svg create mode 100644 Projects/Superalgos/Icons-SVG-Sources/nodes/api-data-fetcher-bot.svg create mode 100644 Projects/Superalgos/Icons-SVG-Sources/nodes/api-data-fetcher-process-instance.svg create mode 100644 Projects/Superalgos/Icons-SVG-Sources/nodes/api-map-reference.svg create mode 100644 Projects/Superalgos/Icons/api-data-fetcher-bot-instance.png create mode 100644 Projects/Superalgos/Icons/api-data-fetcher-bot.png create mode 100644 Projects/Superalgos/Icons/api-data-fetcher-process-instance.png create mode 100644 Projects/Superalgos/Icons/api-map-reference.png diff --git a/Projects/Superalgos/Icons-SVG-Sources/nodes/api-data-fetcher-bot-instance.svg b/Projects/Superalgos/Icons-SVG-Sources/nodes/api-data-fetcher-bot-instance.svg new file mode 100644 index 000000000..87bee7bf0 --- /dev/null +++ b/Projects/Superalgos/Icons-SVG-Sources/nodes/api-data-fetcher-bot-instance.svg @@ -0,0 +1,133 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Projects/Superalgos/Icons-SVG-Sources/nodes/api-data-fetcher-bot.svg b/Projects/Superalgos/Icons-SVG-Sources/nodes/api-data-fetcher-bot.svg new file mode 100644 index 000000000..ac7e723f5 --- /dev/null +++ b/Projects/Superalgos/Icons-SVG-Sources/nodes/api-data-fetcher-bot.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Projects/Superalgos/Icons-SVG-Sources/nodes/api-data-fetcher-process-instance.svg b/Projects/Superalgos/Icons-SVG-Sources/nodes/api-data-fetcher-process-instance.svg new file mode 100644 index 000000000..d2f3dcdf4 --- /dev/null +++ b/Projects/Superalgos/Icons-SVG-Sources/nodes/api-data-fetcher-process-instance.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Projects/Superalgos/Icons-SVG-Sources/nodes/api-map-reference.svg b/Projects/Superalgos/Icons-SVG-Sources/nodes/api-map-reference.svg new file mode 100644 index 000000000..470c340ec --- /dev/null +++ b/Projects/Superalgos/Icons-SVG-Sources/nodes/api-map-reference.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/Projects/Superalgos/Icons/api-data-fetcher-bot-instance.png b/Projects/Superalgos/Icons/api-data-fetcher-bot-instance.png new file mode 100644 index 0000000000000000000000000000000000000000..84918f989456a9bf8ec84685896317e68f822fa5 GIT binary patch literal 23714 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

F7xnkfV|l-`-#!Q@8s@!FfO|C;lfy)-&St4a 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 literal 0 HcmV?d00001 diff --git a/Projects/Superalgos/Icons/api-data-fetcher-bot.png b/Projects/Superalgos/Icons/api-data-fetcher-bot.png new file mode 100644 index 0000000000000000000000000000000000000000..25f06da33e9b2749c33a43123d5d438ed417a280 GIT binary patch literal 18483 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 literal 0 HcmV?d00001 diff --git a/Projects/Superalgos/Icons/api-data-fetcher-process-instance.png b/Projects/Superalgos/Icons/api-data-fetcher-process-instance.png new file mode 100644 index 0000000000000000000000000000000000000000..ba638d4963bb592d3be2b1938bbc59db3de6964f GIT binary patch literal 23832 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 literal 0 HcmV?d00001 diff --git a/Projects/Superalgos/Icons/api-map-reference.png b/Projects/Superalgos/Icons/api-map-reference.png new file mode 100644 index 0000000000000000000000000000000000000000..eb9a66bbbb5b1f997b94f0b5cf0c650c2b137ac7 GIT binary patch literal 14867 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

9nRyn^R%d&hF3AkpJTJFCJR>*+h-)%8G2 zIVftNZ=Qt&74GO`LH0g&qvZ$8Ff8C37N=*KB=3pc>*7k!KQ9yj)p8M<%^RImQ)O~C zo^}Wg1dC`B5~2;8FVJ2uE;U246R^23Wh)*?9_;m|o5AEUZrcO>vM21EqD$Q%b*4@? z;f(V(+yqfTyx9v8B5wkPthghV{b{J_AX zfY!uW5?7Q*zUWX(iooUWt+asc?SXj`jk{~|r82ggd>@@Sk7OA-s{F^^A03f(2;1Ag zl%sWj;juw>q`kHY6p_K_d94htZm3?JmZ#S5Mvpwp-qdcV@am^v!NoV7SjBs9IyX_y z@ieoF?P1jJE2ARJuKJG9Gcy>ciHK%rkn=RA*}Gc{b)+bHm;;r^m$RvCLX&{`NbSZ6 z14~KR%A;t&#Q*5zaLW+f+FVx$hmMVt1DpV~@4T|AT45=y0T3@gRjP?@2NxRf)xR<% zJB`qn8(bcV1LBU-117R82Y)1opor|Y)}C|T*INfa!IxOVEO|yYYXL|%z4*Kr#!TV1 zzyEi#-#qYex(ck%p1^n3270^f2;~M5rHLwq6Nll>eHPrkrAqg@DU1TInz$m;>~R1& zsP7xX83M(Xcy!|@cnyFrcjK07`HKE;cmj@my9JPwb15sL;Q;yRh?l&VcVFxd2uRkZ z{RsA4Q&@un6PJ{RxgT3~s6+~n$o|$3x^EjcSw=eq)8cmdnR6-P&~uf&id+5d2NGa{ z)q$J%ov#C#IJwY62Lp4Bk9+=Rjh0=1j|<1#&-ZyLXYl(bRj#s7dqd$44m3Ox-EYC6 zQuQ1lnPDy~b+y|Jbnh{)SYJC@DogzEp$HFbh=N zZ%75NEhI(khc7=p4qwsqA|DUfYI#ebKf-}ed4AJ9E3d>BNK0YmM#xPEAZK|3FB)}D zLgeLUr@+b{8<^P3qXx$If}tnXZ@uWuft2r^SeT3)Mntfvq>|sqg5u{nBPk732FzP! z{bj&4Zk=y^6Taj%HXY3P8vV!uzR(6pzsBDOpOsv_>zAX*8Uo)In{O}Q-yKt&;cp0Y z4s*3G2e-^Jsrh2ENOW$nVCXi}TD^3nH%9~oxLlZ2K3=MN=6@%tjk`QDlYcubOn$3I zkq}%GeL?K1a;DtIf+1nuqb96%#rXyiqF4yNzYbb@b97_vNnGdBlYoWf@;jw44(izF zKGv@ocK53GQglkPFg63ja+zsh4_LEzrgBzE&r31d<^|rb)QV^WR+??|ur iVaEc%|F^#(gv=a$Pga)JowK&xQ&-dIbhf(no&N*F0Nz9Z literal 0 HcmV?d00001 diff --git a/Projects/Superalgos/Schemas/Docs-Topics/data-mining-3.1-data-mining-fetching-data-from-apis.json b/Projects/Superalgos/Schemas/Docs-Topics/data-mining-3.1-data-mining-fetching-data-from-apis.json index 6ad594806..921ec03d5 100644 --- a/Projects/Superalgos/Schemas/Docs-Topics/data-mining-3.1-data-mining-fetching-data-from-apis.json +++ b/Projects/Superalgos/Schemas/Docs-Topics/data-mining-3.1-data-mining-fetching-data-from-apis.json @@ -3,8 +3,8 @@ "pageNumber": "13.1", "type": "Data Mining - Fetching Data From APIs", "definition": { - "text": "Superalgos allow it's user to fetch data from any API on the Internet without needing to write code to do it. Instead, users design an API Map, which is a set of definitions of how a Bot can access a certain API and how to interpret the API Server responses. With this API Maps, a API Data Fetcher Bot can be configured to extract data from any API Server and stored inside the system as Raw Data that later can processed and consumed by other Bots.", - "updated": 1621905787119 + "text": "Superalgos allow it's users to fetch data from any API on the Internet without needing to write code to do it. Instead, users design an API Map, which is a set of definitions of how a Bot can access a certain API and how to interpret the API Server responses. With this API Maps, a API Data Fetcher Bot can be configured to extract data from any API Server and stored inside the system as Raw Data that later can processed and consumed by other Bots.", + "updated": 1621906349521 }, "paragraphs": [ { From 5e068f001232a6de4606d0b83d243234a89949e1 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Tue, 25 May 2021 12:55:49 +0200 Subject: [PATCH 3/5] BUG FIX Workspace List not loading plugins --- Projects/Superalgos/UI/Spaces/Side-Space/ListItem.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Projects/Superalgos/UI/Spaces/Side-Space/ListItem.js b/Projects/Superalgos/UI/Spaces/Side-Space/ListItem.js index 233bb4fdd..cc2643cb5 100644 --- a/Projects/Superalgos/UI/Spaces/Side-Space/ListItem.js +++ b/Projects/Superalgos/UI/Spaces/Side-Space/ListItem.js @@ -24,6 +24,7 @@ function newListItem() { thisObject.container.frame.height = SIDE_PANEL_WIDTH * 0.40 let prefix = "User " + let label let name let project let type @@ -49,10 +50,11 @@ function newListItem() { name = pName project = pProject type = pType + label = name let splittedName = name.split('→') if (splittedName.length === 2) { - name = splittedName[1] + label = splittedName[1] prefix = splittedName[0] } @@ -115,8 +117,9 @@ function newListItem() { UI.projects.superalgos.utilities.drawPrint.roundedCornersBackground(params) - UI.projects.superalgos.utilities.drawPrint.drawLabel(name, 1 / 2, 2.5 / 10, -5, 0, 15, thisObject.container, labelColor) + UI.projects.superalgos.utilities.drawPrint.drawLabel(label, 1 / 2, 2.5 / 10, -5, 0, 15, thisObject.container, labelColor) UI.projects.superalgos.utilities.drawPrint.drawLabel(prefix + type, 1 / 2, 8.5 / 10, -5, 0, 15, thisObject.container, labelColor) UI.projects.superalgos.utilities.drawPrint.drawIcon(icon, 1 / 2, 1 / 2, 0, 0, 50, thisObject.container) } } + From 7d1fe263aa2f265c05faf0a2bfdbe3ef10a1ec9c Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Tue, 25 May 2021 16:54:35 +0200 Subject: [PATCH 4/5] API Data Fetcher Docs improved --- .../Schemas/Docs-Nodes/api-endpoint.json | 16 ++++++- .../Schemas/Docs-Nodes/api-map.json | 17 +++++++ .../Docs-Nodes/api-path-parameter.json | 12 ++++- .../Docs-Nodes/api-path-parameters.json | 13 ++++++ .../Docs-Nodes/api-query-parameters.json | 12 ++++- .../Docs-Nodes/api-query-response.json | 3 +- .../Docs-Nodes/api-query-responses.json | 7 ++- .../Docs-Nodes/api-response-field.json | 33 ++++++++++++++ .../Docs-Nodes/api-response-schema.json | 8 +++- .../Schemas/Docs-Nodes/api-version.json | 14 +++++- ...1-data-mining-fetching-data-from-apis.json | 44 ++++++++++++++++++- 11 files changed, 167 insertions(+), 12 deletions(-) diff --git a/Projects/Superalgos/Schemas/Docs-Nodes/api-endpoint.json b/Projects/Superalgos/Schemas/Docs-Nodes/api-endpoint.json index a8d7404f1..3c5a7c150 100644 --- a/Projects/Superalgos/Schemas/Docs-Nodes/api-endpoint.json +++ b/Projects/Superalgos/Schemas/Docs-Nodes/api-endpoint.json @@ -5,9 +5,23 @@ "updated": 1621017376741 }, "paragraphs": [ + { + "style": "Subtitle", + "text": "How to use this node?", + "updated": 1621949863470 + }, { "style": "Text", - "text": "Right click and select the pencil button to enter edit mode." + "text": "Read the docs of the API you are trying to map, and indentigy the commands that it support (endpoints)." + }, + { + "style": "Include", + "text": "Superalgos->Topic->Data Mining - Fetching Data From APIs->Main Workflow", + "updated": 1621951345309 + }, + { + "style": "Title", + "text": "Configuration" } ] } \ No newline at end of file diff --git a/Projects/Superalgos/Schemas/Docs-Nodes/api-map.json b/Projects/Superalgos/Schemas/Docs-Nodes/api-map.json index 7103b86cb..956739b41 100644 --- a/Projects/Superalgos/Schemas/Docs-Nodes/api-map.json +++ b/Projects/Superalgos/Schemas/Docs-Nodes/api-map.json @@ -12,6 +12,23 @@ }, { "style": "Subtitle", + "text": "How is it used?" + }, + { + "style": "Text", + "text": "To use an API Map users need to setup a Task for an API Data Fetcher Bot. This set up is done automatically as part of the Install New Market procedure if an API Map is detected at the Worksapce. From within that Task, a reference to an API Map is established. " + }, + { + "style": "Text", + "text": "When the Task is run, the UI will send to the Task Server all the definitions inside the API Map so that the API Data Fetcher Bot can use them to connect to the API Server, fetch data from it, and correctly interpret the responses." + }, + { + "style": "Include", + "text": "Superalgos->Topic->Data Mining - Fetching Data From APIs->Main Workflow", + "updated": 1621951793419 + }, + { + "style": "Title", "text": "Configuration" }, { diff --git a/Projects/Superalgos/Schemas/Docs-Nodes/api-path-parameter.json b/Projects/Superalgos/Schemas/Docs-Nodes/api-path-parameter.json index b62fae9f2..fabb2abb1 100644 --- a/Projects/Superalgos/Schemas/Docs-Nodes/api-path-parameter.json +++ b/Projects/Superalgos/Schemas/Docs-Nodes/api-path-parameter.json @@ -16,8 +16,16 @@ }, { "style": "List", - "text": "replaceBy: this property allows you to instruct the API Fetcher Bot to set a value to this parameter. The possible values are: @BaseAsset and @QuotedAsset", - "updated": 1621018303336 + "text": "codeName: here you must write the exact string that is going to be used to form the URL path. ", + "updated": 1621950838675 + }, + { + "style": "List", + "text": "replaceBy: this property allows you to instruct the API Fetcher Bot to set a value to this parameter. The possible values are: @BaseAsset and @QuotedAsset" + }, + { + "style": "Important", + "text": "The replacedBy property is the way users have to send some contextual values to the API Server like for example the Base Asset or Quoted Asset of the Defautl Market." } ] } \ No newline at end of file diff --git a/Projects/Superalgos/Schemas/Docs-Nodes/api-path-parameters.json b/Projects/Superalgos/Schemas/Docs-Nodes/api-path-parameters.json index f310b56df..7b55f1979 100644 --- a/Projects/Superalgos/Schemas/Docs-Nodes/api-path-parameters.json +++ b/Projects/Superalgos/Schemas/Docs-Nodes/api-path-parameters.json @@ -9,6 +9,19 @@ "style": "Text", "text": "When found at an API Map they define the default values for each parameter, whicle when found at a Data Mine, they define the actual values to be used, which overrides the defaults.", "updated": 1621022867854 + }, + { + "style": "Title", + "text": "How to identify them?" + }, + { + "style": "Text", + "text": "The API your are trying to map shold have it's API Path Parameters documented. If not, check any example provided there of how to request the data and see if there are inner folders below the folder of the API Enpoint. These folders are, each one, one API Path Parameter that needs to be defined. As everything else in Superalgos, this current node children are considered clockwise, that defines the order in which the path will be constructed at runtime." + }, + { + "style": "Include", + "text": "Superalgos->Topic->Data Mining - Fetching Data From APIs->Main Workflow", + "updated": 1621951167309 } ] } \ No newline at end of file diff --git a/Projects/Superalgos/Schemas/Docs-Nodes/api-query-parameters.json b/Projects/Superalgos/Schemas/Docs-Nodes/api-query-parameters.json index 13855d9ce..236efacb3 100644 --- a/Projects/Superalgos/Schemas/Docs-Nodes/api-query-parameters.json +++ b/Projects/Superalgos/Schemas/Docs-Nodes/api-query-parameters.json @@ -7,8 +7,16 @@ "paragraphs": [ { "style": "Text", - "text": "When found at the API Map will define the default values for each parameter. When found at the Data Mine will define the actual values to be used, these would replace the defaults.", - "updated": 1621022566230 + "text": "In other words, Query Parameters are the parameters sent at any URL after the question mark ?", + "updated": 1621954104568 + }, + { + "style": "Text", + "text": "Query Parameters in general do not need to be defined in any specific orders, so feel free to add children for this node in whatever order you like." + }, + { + "style": "Success", + "text": "When found at the API Map will define the default values for each parameter. When found at the Data Mine will define the actual values to be used, these would replace the defaults." } ] } \ No newline at end of file diff --git a/Projects/Superalgos/Schemas/Docs-Nodes/api-query-response.json b/Projects/Superalgos/Schemas/Docs-Nodes/api-query-response.json index f817f3f0e..af8622cfd 100644 --- a/Projects/Superalgos/Schemas/Docs-Nodes/api-query-response.json +++ b/Projects/Superalgos/Schemas/Docs-Nodes/api-query-response.json @@ -16,7 +16,8 @@ }, { "style": "Success", - "text": "If you wish to be able to react to other error codes, you should also have more of this nodes with the codeName of each of the status you want to cover." + "text": "If you wish to be able to react to other error codes, you should also have more of these nodes with the codeName of each of the status you want to cover. If the API Data Fetcher Bot receives a response code that has not been defined, it will stop there the processing.", + "updated": 1621952346052 } ] } \ No newline at end of file diff --git a/Projects/Superalgos/Schemas/Docs-Nodes/api-query-responses.json b/Projects/Superalgos/Schemas/Docs-Nodes/api-query-responses.json index ed72a0ff0..3d297c6fc 100644 --- a/Projects/Superalgos/Schemas/Docs-Nodes/api-query-responses.json +++ b/Projects/Superalgos/Schemas/Docs-Nodes/api-query-responses.json @@ -7,7 +7,12 @@ "paragraphs": [ { "style": "Text", - "text": "Right click and select the pencil button to enter edit mode." + "text": "For a single API Endpoint an API Server might have different possible responses. Each response type is differentiated from each other by the response code / status.", + "updated": 1621952454860 + }, + { + "style": "Text", + "text": "Each child of this node is a different response code / status from the API Server. Users need to add at least the most common response code (200) in order to start testing this API Endpoint. After that is recommended to add all other response codes as well, otherwise the API Data Fetcher Bot will stop when an unhandled response code is received." } ] } \ No newline at end of file diff --git a/Projects/Superalgos/Schemas/Docs-Nodes/api-response-field.json b/Projects/Superalgos/Schemas/Docs-Nodes/api-response-field.json index 11a9b88cf..7b2825dde 100644 --- a/Projects/Superalgos/Schemas/Docs-Nodes/api-response-field.json +++ b/Projects/Superalgos/Schemas/Docs-Nodes/api-response-field.json @@ -19,6 +19,39 @@ "style": "List", "text": "fieldType: This property declares if the data is number, a string an object or an array, those are the 4 possible values.", "updated": 1621022104672 + }, + { + "style": "List", + "text": "description: The API Map is expected to be used not only by the user who created, but once contributed as a Plugin, by all other users. This property is useful to store the description of this field as it was written at the API Server documentation, to avoid other users to go and look for it." + }, + { + "style": "Subtitle", + "text": "Field Type Possible Values" + }, + { + "style": "Text", + "text": "This property is very important and needs to be defined very well. This property defines the structure of the response data structure and needs to be very precise. It's possible values are:", + "updated": 1621953383545 + }, + { + "style": "List", + "text": "number: Any type of numbers fall into this category, including dates timestamps in numbers.", + "updated": 1621953444809 + }, + { + "style": "List", + "text": "string: Any strings falls into this category, including dates in string format.", + "updated": 1621953470163 + }, + { + "style": "List", + "text": "object: Use this value when you find that the field holds a JSON object enclosed in { and }", + "updated": 1621953515163 + }, + { + "style": "List", + "text": "array: Use this type when the value of the field is a JSON array enclosed in [ and ]", + "updated": 1621953569329 } ] } \ No newline at end of file diff --git a/Projects/Superalgos/Schemas/Docs-Nodes/api-response-schema.json b/Projects/Superalgos/Schemas/Docs-Nodes/api-response-schema.json index 94dffdbe6..b60fef17f 100644 --- a/Projects/Superalgos/Schemas/Docs-Nodes/api-response-schema.json +++ b/Projects/Superalgos/Schemas/Docs-Nodes/api-response-schema.json @@ -5,10 +5,14 @@ "updated": 1621021486718 }, "paragraphs": [ + { + "style": "Text", + "text": "The API Map assumes the API Server will respond with string formatted in JSON. This means that the response will be a data structure of nestled objects and arrays. Users will need to map the response format into a API Response Schema by adding children to this node and to this node's children. All these descendants are of the same Node Type API Response Field. ", + "updated": 1621952655717 + }, { "style": "Subtitle", - "text": "Configuration", - "updated": 1621021492973 + "text": "Configuration" }, { "style": "List", diff --git a/Projects/Superalgos/Schemas/Docs-Nodes/api-version.json b/Projects/Superalgos/Schemas/Docs-Nodes/api-version.json index cd7418952..35abe1f17 100644 --- a/Projects/Superalgos/Schemas/Docs-Nodes/api-version.json +++ b/Projects/Superalgos/Schemas/Docs-Nodes/api-version.json @@ -6,8 +6,18 @@ }, "paragraphs": [ { - "style": "Text", - "text": "Right click and select the pencil button to enter edit mode." + "style": "Note", + "text": "We expect every API to have at leat one version.", + "updated": 1621951647515 + }, + { + "style": "Include", + "text": "Superalgos->Topic->Data Mining - Fetching Data From APIs->Main Workflow", + "updated": 1621951484955 + }, + { + "style": "Title", + "text": "Configuration" } ] } \ No newline at end of file diff --git a/Projects/Superalgos/Schemas/Docs-Topics/data-mining-3.1-data-mining-fetching-data-from-apis.json b/Projects/Superalgos/Schemas/Docs-Topics/data-mining-3.1-data-mining-fetching-data-from-apis.json index 921ec03d5..bec1bb52a 100644 --- a/Projects/Superalgos/Schemas/Docs-Topics/data-mining-3.1-data-mining-fetching-data-from-apis.json +++ b/Projects/Superalgos/Schemas/Docs-Topics/data-mining-3.1-data-mining-fetching-data-from-apis.json @@ -7,9 +7,51 @@ "updated": 1621906349521 }, "paragraphs": [ + { + "style": "Block", + "text": "Main Workflow", + "updated": 1621951016327 + }, + { + "style": "Title", + "text": "How to fetch data from an API?", + "updated": 1621951311144 + }, { "style": "Text", - "text": "Right click and Edit to enter edit mode and change this text. ENTER to write new paragraphs. ESC to exit edit mode. Then you can use docs.save to save your changes and app.contribute to send it to the main repository." + "text": "The main workflow to pull this out is quite straight forward and it does not require coding at all. Follow this guide and you will be using data from any source at the Internet from your trading strategies in no time." + }, + { + "style": "List", + "text": "1. Choose an API: Current version is limited to public APIs only. Secured APIs comming soon. " + }, + { + "style": "List", + "text": "2. Design an API Map: Read the APIs online documentation and identify the Endpoints that returns the data you would like to fetch. Carefully map those Endpoints defining the parameters the API Server expects at each call, and also how the API Server response is formatted." + }, + { + "style": "List", + "text": "3. Setup an API Data Fetcher Bot: Create a Data Mine for this API and create there an API Data Fetcher Bot. From that Bot's Record Properties you will need to reference the fields returned by the API Server defined at the API Map, defining in this way which fields from each response you are going to save to disk. You might also need to define query or path parameters here. " + }, + { + "style": "List", + "text": "4. Setup an Indicator Bot for Dataset Type Conversion: The Raw Data saved to disk needs to be organized for consumption. You will need to setup an Indicator Bot that will do a Dataset Type Conversion from Raw Data to a standard Dataset Type." + }, + { + "style": "List", + "text": "5. Setup Indicator Bots: Once the data is converted, you can extract from it specific Datasets defining a set of indicators you can build from that data. These Indicators can be just a reorganization of the data, with some adjustments on the names of fields and splitting the data in different indicators, or it can also include some data processing / transformations if you wish (this would require some coding)." + }, + { + "style": "List", + "text": "6. Setup Plotters: These last indicators can have their plotters if you wish." + }, + { + "style": "List", + "text": "7. Consume Data from Trading Strategies: These indicators can be consumed from your trading strategies." + }, + { + "style": "Success", + "text": "There is a Workspace called API Data Fetcher Bot Demo with a simple working example of the previous steps you can take as reference." } ] } \ No newline at end of file From f4c8f1abceb93fb12bb1e621fd02d65381d8f521 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Tue, 25 May 2021 17:25:21 +0200 Subject: [PATCH 5/5] New Docs Concepts --- .../Schemas/Docs-Concepts/api-server.json | 13 +++++++++++++ .../Schemas/Docs-Concepts/defautlt-market.json | 13 +++++++++++++ .../Docs-Concepts/inter-execution-memory.json | 14 ++++++++++++++ .../Schemas/Docs-Concepts/main-loop.json | 13 +++++++++++++ .../Superalgos/Schemas/Docs-Concepts/raw-data.json | 13 +++++++++++++ .../Docs-Concepts/superalgos-marketplace.json | 13 +++++++++++++ .../Schemas/Docs-Concepts/superalgos-network.json | 14 ++++++++++++++ .../Schemas/Docs-Concepts/task-server.json | 13 +++++++++++++ 8 files changed, 106 insertions(+) create mode 100644 Projects/Superalgos/Schemas/Docs-Concepts/api-server.json create mode 100644 Projects/Superalgos/Schemas/Docs-Concepts/defautlt-market.json create mode 100644 Projects/Superalgos/Schemas/Docs-Concepts/inter-execution-memory.json create mode 100644 Projects/Superalgos/Schemas/Docs-Concepts/main-loop.json create mode 100644 Projects/Superalgos/Schemas/Docs-Concepts/raw-data.json create mode 100644 Projects/Superalgos/Schemas/Docs-Concepts/superalgos-marketplace.json create mode 100644 Projects/Superalgos/Schemas/Docs-Concepts/superalgos-network.json create mode 100644 Projects/Superalgos/Schemas/Docs-Concepts/task-server.json diff --git a/Projects/Superalgos/Schemas/Docs-Concepts/api-server.json b/Projects/Superalgos/Schemas/Docs-Concepts/api-server.json new file mode 100644 index 000000000..1bd3692b1 --- /dev/null +++ b/Projects/Superalgos/Schemas/Docs-Concepts/api-server.json @@ -0,0 +1,13 @@ +{ + "type": "API Server", + "definition": { + "text": "It is a server (usually running at the Internet) that provides programatic access to it;s resources. This enables algorithms to access those resources. When those resources are data, then it allow anyone to fetch that data by executing predefined queries to the API Server.", + "updated": 1621955731261 + }, + "paragraphs": [ + { + "style": "Text", + "text": "Right click and Edit to enter edit mode and change this text. ENTER to write new paragraphs. ESC to exit edit mode. Then you can use docs.save to save your changes and app.contribute to send it to the main repository." + } + ] +} \ No newline at end of file diff --git a/Projects/Superalgos/Schemas/Docs-Concepts/defautlt-market.json b/Projects/Superalgos/Schemas/Docs-Concepts/defautlt-market.json new file mode 100644 index 000000000..37186edf1 --- /dev/null +++ b/Projects/Superalgos/Schemas/Docs-Concepts/defautlt-market.json @@ -0,0 +1,13 @@ +{ + "type": "Defautlt Market", + "definition": { + "text": "We define as Default Market to the market under which a certain Task was defined.", + "updated": 1621955911464 + }, + "paragraphs": [ + { + "style": "Text", + "text": "Right click and Edit to enter edit mode and change this text. ENTER to write new paragraphs. ESC to exit edit mode. Then you can use docs.save to save your changes and app.contribute to send it to the main repository." + } + ] +} \ No newline at end of file diff --git a/Projects/Superalgos/Schemas/Docs-Concepts/inter-execution-memory.json b/Projects/Superalgos/Schemas/Docs-Concepts/inter-execution-memory.json new file mode 100644 index 000000000..1ecbd271e --- /dev/null +++ b/Projects/Superalgos/Schemas/Docs-Concepts/inter-execution-memory.json @@ -0,0 +1,14 @@ +{ + "type": "Inter Execution Memory", + "definition": { + "text": "It is a data structure that some bots need in order to resume their operations after they get woken up at the next cycle of their Main Loop. ", + "updated": 1621955211473 + }, + "paragraphs": [ + { + "style": "Text", + "text": "This data structure is currently saved inside the Status Report of the Bot. Since every bot usually read it's own Status Report at every run, with it, it has access to the Inter Execution Memory data structure that itself saved at the previous run.", + "updated": 1621955314173 + } + ] +} \ No newline at end of file diff --git a/Projects/Superalgos/Schemas/Docs-Concepts/main-loop.json b/Projects/Superalgos/Schemas/Docs-Concepts/main-loop.json new file mode 100644 index 000000000..bdf411132 --- /dev/null +++ b/Projects/Superalgos/Schemas/Docs-Concepts/main-loop.json @@ -0,0 +1,13 @@ +{ + "type": "Main Loop", + "definition": { + "text": "Most Bots in Superalgos are not awake all the time. As a strategy to preserve hardware resourses, they run and go to sleep for a configurable amount of time, or until they are woken up by the finishing of some other task they are waiting for. Each cycle of running and sleeping is a loop at the Main Loop of a Bot.", + "updated": 1621955130672 + }, + "paragraphs": [ + { + "style": "Text", + "text": "Right click and Edit to enter edit mode and change this text. ENTER to write new paragraphs. ESC to exit edit mode. Then you can use docs.save to save your changes and app.contribute to send it to the main repository." + } + ] +} \ No newline at end of file diff --git a/Projects/Superalgos/Schemas/Docs-Concepts/raw-data.json b/Projects/Superalgos/Schemas/Docs-Concepts/raw-data.json new file mode 100644 index 000000000..49dba3291 --- /dev/null +++ b/Projects/Superalgos/Schemas/Docs-Concepts/raw-data.json @@ -0,0 +1,13 @@ +{ + "type": "Raw Data", + "definition": { + "text": "We call raw data to data just fetched from an external source that has not been processed or manipulated yet by Bots inside the system.", + "updated": 1621955789483 + }, + "paragraphs": [ + { + "style": "Text", + "text": "Right click and Edit to enter edit mode and change this text. ENTER to write new paragraphs. ESC to exit edit mode. Then you can use docs.save to save your changes and app.contribute to send it to the main repository." + } + ] +} \ No newline at end of file diff --git a/Projects/Superalgos/Schemas/Docs-Concepts/superalgos-marketplace.json b/Projects/Superalgos/Schemas/Docs-Concepts/superalgos-marketplace.json new file mode 100644 index 000000000..825e588f2 --- /dev/null +++ b/Projects/Superalgos/Schemas/Docs-Concepts/superalgos-marketplace.json @@ -0,0 +1,13 @@ +{ + "type": "Superalgos Marketplace", + "definition": { + "text": "The Superalgos Marketplace is a yet to be implemented set of features that will allow users to offer products and services to each other in a p2p way, enabling their bots to consume data and services from other user's bots across the internet.", + "updated": 1621955605794 + }, + "paragraphs": [ + { + "style": "Text", + "text": "Right click and Edit to enter edit mode and change this text. ENTER to write new paragraphs. ESC to exit edit mode. Then you can use docs.save to save your changes and app.contribute to send it to the main repository." + } + ] +} \ No newline at end of file diff --git a/Projects/Superalgos/Schemas/Docs-Concepts/superalgos-network.json b/Projects/Superalgos/Schemas/Docs-Concepts/superalgos-network.json new file mode 100644 index 000000000..18932863c --- /dev/null +++ b/Projects/Superalgos/Schemas/Docs-Concepts/superalgos-network.json @@ -0,0 +1,14 @@ +{ + "type": "Superalgos Network", + "definition": { + "text": "The Superalgos Network is a future, to be launched network that will allow users to setup their Client to be part of. Once done Clients will connect to each other in a p2p way, enabling from there the exchange of data and services between users.", + "updated": 1621955485325 + }, + "paragraphs": [ + { + "style": "Text", + "text": "The Superalgos Network is on the project's roadmap, expected to be implemented in 2022.", + "updated": 1621955515063 + } + ] +} \ No newline at end of file diff --git a/Projects/Superalgos/Schemas/Docs-Concepts/task-server.json b/Projects/Superalgos/Schemas/Docs-Concepts/task-server.json new file mode 100644 index 000000000..3376201be --- /dev/null +++ b/Projects/Superalgos/Schemas/Docs-Concepts/task-server.json @@ -0,0 +1,13 @@ +{ + "type": "Task Server", + "definition": { + "text": "The Task Server is one of the 3 main software components of Superalgos. The purpose of the Task Server is to run a Task. Tasks are defined at a Workspace at the UI. For running a Task, the Task Server receives at runtime all the needed definitions from the UI.", + "updated": 1621954996474 + }, + "paragraphs": [ + { + "style": "Text", + "text": "Right click and Edit to enter edit mode and change this text. ENTER to write new paragraphs. ESC to exit edit mode. Then you can use docs.save to save your changes and app.contribute to send it to the main repository." + } + ] +} \ No newline at end of file