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

This commit is contained in:
Smidy13 committed 2021-10-28 20:52:04 +13:00
commit ce1e264e9f
34 files changed
+15499 -13033

No files matched your search

+1 -1
View File
@@ -4,7 +4,7 @@ COPY . .
RUN apk add --no-cache --virtual .build-deps make g++ \
&& apk add --no-cache python3 \
&& if [ "$(uname -m)" = "x86_64" ]; then node setup noShortcuts tensorflow; else node setup noShortcuts; fi \
&& mkdir -p Data-Storage Log-Files My-Workspaces \
&& mkdir -p ./Platform/My-Data-Storage ./Platform/My-Log-Files ./Platform/My-Workspaces \
&& addgroup superalgos \
&& adduser --disabled-password --no-create-home --ingroup superalgos superalgos \
&& chown -R superalgos:superalgos /app \
@@ -1142,12 +1142,12 @@ exports.newAlgorithmicTradingBotModulesTradingStages = function (processIndex) {
if (stage.status.value === 'Open') {
openStage(stage)
checkUserDefinedCode(stageName, 'Open')
checkAnnounce(stageName, 'Open')
checkAnnounce(stageName, stage.status.value)
}
if (stage.status.value === 'Closed') {
checkUserDefinedCode(stageName, 'Closed')
checkAnnounce(stageName, 'Closed')
closeStage(stage, stageName)
checkAnnounce(stageName, stage.status.value)
}
/*
@@ -4,13 +4,27 @@
"type": "Data Mining - Plotting",
"definition": {
"text": "Each product may 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 on a chart.",
"updated": 1622227086801
"updated": 1622227086801,
"translations": [
{
"language": "DE",
"text": "Jedem Produkt kann ein Plottermodul zugeordnet sein. Dieses Plottermodul enthält alle Definitionen, die zur Interpretation der Datensätze des Produkts und zur Darstellung der Informationen in einer chart (Diagramm) erforderlich sind.",
"updated": 1635105939995
}
]
},
"paragraphs": [
{
"style": "Text",
"text": "Superalgos has the capability to allow it's users to create plotters without writing any code. The plotter is defined at the Designer Space. This is done by means of defining vertices and polygons. Users can create custom charts for any Dataset.",
"updated": 1622227235452
"updated": 1622227235452,
"translations": [
{
"language": "DE",
"text": "Superalgos bietet die Möglichkeit, Plotter zu erstellen, ohne dass ein Code geschrieben werden muss. Der Plotter wird im Designer Space definiert. Dies geschieht durch die Definition von Scheitelpunkten und Polygonen. Benutzer können benutzerdefinierte Diagramme für jedes Dataset erstellen.",
"updated": 1635106017833
}
]
}
]
}
@@ -4,7 +4,14 @@
"type": "Data Mining - Fetching Data From APIs",
"definition": {
"text": "Superalgos allows its users to fetch data from any API on the Internet without needing to write code. Instead, users design an API Map, which is a set of definitions for how a Bot can access a certain API and how to interpret the API Server responses. With this API Map, an API Data Fetcher Bot can be configured to extract data from any API Server and store Raw Data inside the system. This raw data can later be processed and consumed by other Bots.",
"updated": 1622228621778
"updated": 1635182850649,
"translations": [
{
"language": "DE",
"text": "Superalgos ermöglicht es seinen Nutzern, Daten von jeder API im Internet abzurufen, ohne dass sie Code schreiben müssen. Stattdessen entwerfen die Benutzer eine API Map, die eine Reihe von Definitionen dafür enthält, wie ein Bot auf eine bestimmte API zugreifen kann und wie die Antworten des API Servers zu interpretieren sind. Mit dieser API Map kann ein API Data Fetcher Bot so konfiguriert werden, dass er Daten von einem beliebigen API Server extrahiert und Rohdaten im System speichert. Diese Rohdaten können später von anderen Bots verarbeitet und konsumiert werden.",
"updated": 1635182898612
}
]
},
"paragraphs": [
{
@@ -15,51 +22,122 @@
{
"style": "Title",
"text": "How to Fetch Data from an API?",
"updated": 1622228699547
"updated": 1622228699547,
"translations": [
{
"language": "DE",
"text": "Wie holt man sich Daten von einer API?",
"updated": 1635182922828
}
]
},
{
"style": "Text",
"text": "The main workflow to pull this off is quite straight forward. It does not require coding at all. Follow this guide and you will be using data from any source on the Internet for your trading strategies in no time.",
"updated": 1622228741015
"updated": 1622228741015,
"translations": [
{
"language": "DE",
"text": "Der Hauptarbeitsablauf, um dies zu erreichen, ist ziemlich einfach. Es ist überhaupt keine Programmierung erforderlich. Folgen Sie diesem Leitfaden, und Sie werden im Handumdrehen Daten aus jeder beliebigen Quelle im Internet für Ihre Handelsstrategien nutzen können.",
"updated": 1635183311281
}
]
},
{
"style": "List",
"text": "1. Choose an API: The current version is limited to public APIs only. Secured APIs coming soon.",
"updated": 1622229777229
"updated": 1622229777229,
"translations": [
{
"language": "DE",
"text": "1. Wähle eine API: Die aktuelle Version ist nur auf öffentliche APIs beschränkt. Gesicherte APIs folgen in Kürze.",
"updated": 1635183357574
}
]
},
{
"style": "List",
"text": "2. Design an API Map: Read the APIs online documentation and identify the Endpoints that return the data you would like to fetch. Carefully map the Endpoints defining the parameters the API Server expects at each call, and also how the API Server response is formatted.",
"updated": 1622229840237
"updated": 1622229840237,
"translations": [
{
"language": "DE",
"text": "2. Designe eine API Map: Lesen Sie die Online-Dokumentation der APIs und ermitteln Sie die Endpunkte, die die Daten zurückgeben, die Sie abrufen möchten. Ordnen-(map) Sie die Endpunkte sorgfältig zu und legen Sie die Parameter fest, die der API Server bei jedem Aufruf erwartet, und wie die Antwort des API Server formatiert wird.",
"updated": 1635183765303
}
]
},
{
"style": "List",
"text": "3. Setup an API Data Fetcher Bot: Create a Data Mine for this API and add 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. This is how you define which fields from each response you are going to save to disk. You might also need to define query or path parameters here.",
"updated": 1622229993447
"updated": 1622229993447,
"translations": [
{
"language": "DE",
"text": "3. Einrichten eines API Data Fetcher Bot: Erstellen Sie eine Data Mine für diese API und fügen Sie einen API Data Fetcher Bot hinzu. In den Datensatzeigenschaften dieses Bots müssen Sie auf die vom API Server zurückgegebenen Felder/Daten verweisen, die in der API Map definiert sind. Auf diese Weise legen Sie fest, welche Felder aus jeder Antwort auf der Festplatte gespeichert werden sollen. Möglicherweise müssen Sie hier auch Abfrage- oder Pfadparameter definieren.",
"updated": 1635183922700
}
]
},
{
"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. This process will do data aggregation in order to generate the elements with a fixed time range for every Time Frame possible. ",
"updated": 1621973482403
"updated": 1621973482403,
"translations": [
{
"language": "DE",
"text": "4. Einrichten eines Indicator Bot für die Dataset Type Konvertierung: Die auf der Festplatte gespeicherten Raw Data (Rohdaten) müssen für den Verbrauch organisiert werden. Sie müssen einen Indicator Bot einrichten, der eine Dataset Type -Konvertierung von Raw Data (Rohdaten) in einen Standard Dataset vornimmt. Dieser Prozess führt eine Datenaggregation durch, um die Elemente mit einem festen Zeitbereich für jeden möglichen Time Frame (Zeitrahmen) zu erzeugen.",
"updated": 1635184195592
}
]
},
{
"style": "List",
"text": "5. Setup Indicator Bots: Once the data is converted, you can extract specific Datasets from it. These datasets can be used to define a set of indicators you can build from that data. These Indicators can be as simple as reorganizations of the data (with some adjustments to the names of fields and splitting the data into different indicators), or it can include some data processing / transformations if you wish (this would require some coding).",
"updated": 1622230478744
"updated": 1622230478744,
"translations": [
{
"language": "DE",
"text": "5. Einrichten eines Indicator Bots: Sobald die Daten konvertiert sind, können Sie aus ihnen bestimmte Datensätze extrahieren. Diese Datensätze können verwendet werden, um eine Reihe von Indikatoren zu definieren, die Sie aus diesen Daten erstellen können. Bei diesen Indikatoren kann es sich um einfache Umstrukturierungen der Daten handeln (mit einigen Anpassungen der Feldnamen und der Aufteilung der Daten in verschiedene Indikatoren), oder sie können auf Wunsch einige Datenverarbeitungen/-transformationen umfassen (dies würde ein wenig Programmierung erfordern).",
"updated": 1635184307328
}
]
},
{
"style": "List",
"text": "6. Setup Plotters: After you have set up your indicators. You can design plotters for them if you wish.",
"updated": 1622230566915
"text": "6. Setup Plotters: After you have set up your indicators you can design plotters for them if you wish.",
"updated": 1635184368888,
"translations": [
{
"language": "DE",
"text": "6. Plotter einrichten: Nachdem Sie Ihre Indikatoren eingerichtet haben, können Sie, wenn Sie möchten, Plotter für sie entwerfen.",
"updated": 1635184425815
}
]
},
{
"style": "List",
"text": "7. Consume Data from Trading Strategies: These indicators can be consumed from your trading strategies."
"text": "7. Use Data for Trading Strategies: These indicators can be consumed from your trading strategies.",
"updated": 1635184569437,
"translations": [
{
"language": "DE",
"text": "7. Daten für Trading Strategies nutzen: Diese Indikatoren können von Ihren Handelsstrategien genutzt werden.",
"updated": 1635184615790
}
]
},
{
"style": "Success",
"text": "There is a Workspace called API Data Fetcher Bot Demo with a simple working example of the previous steps you can use as a reference.",
"updated": 1622230619069
"updated": 1622230619069,
"translations": [
{
"language": "DE",
"text": "Es gibt ein Workspace namens API Data Fetcher Bot Demo mit einem einfachen Arbeitsbeispiel der vorherigen Schritte, den Sie als Referenz verwenden können.",
"updated": 1635184665178
}
]
},
{
"style": "Block",
@@ -68,47 +146,119 @@
},
{
"style": "Title",
"text": "How Does Data Aggregation Work?"
"text": "How Does Data Aggregation Work?",
"translations": [
{
"language": "DE",
"text": "Wie funktioniert die Datenaggregation?",
"updated": 1635184724739
}
]
},
{
"style": "Text",
"text": "When Raw Data is fetched from the Internet, it needs to be converted into a Dataset Type either of Multi-Time-Frame-Daily or Multi-Time-Frame-Market types. Usually Raw Data is a timestamped dataset with a timesStamp field, or it has begin and end properties if they are fragmented in time slots of one minute.",
"updated": 1622230917402
"updated": 1622230917402,
"translations": [
{
"language": "DE",
"text": "Wenn Raw Data (Rohdaten) aus dem Internet abgerufen werden, müssen sie in einen Dataset Type umgewandelt werden, der entweder zum Typ Multi-Time-Frame-Daily oder Multi-Time-Frame-Market gehört. In der Regel handelt es sich bei Raw Data um einen Datensatz mit Zeitstempel und einem timesStamp Feld, oder sie haben Anfangs- und Endeigenschaften, wenn sie in Zeitschlitze von einer Minute unterteilt sind.",
"updated": 1635185031815
}
]
},
{
"style": "Text",
"text": "From there the conversion process needs to generate elements with time slots of 2 min, 3 min, 4 min, 5 min, 10, min, ... up to 24hs. To achieve this, each field needs to be aggregated in a certain way."
"text": "From there the conversion process needs to generate elements with time slots of 2 min, 3 min, 4 min, 5 min, 10, min, ... up to 24hs. To achieve this, each field needs to be aggregated in a certain way.",
"translations": [
{
"language": "DE",
"text": "Von dort aus muss der Konvertierungsprozess Elemente mit Zeitschlitzen von 2 min, 3 min, 4 min, 5 min, 10, min,... bis zu 24 Stunden erzeugen. Um dies zu erreichen, muss jedes Feld auf eine bestimmte Weise aggregiert werden.",
"updated": 1635185072820
}
]
},
{
"style": "Text",
"text": "At the Bot where this conversion happens, the Record Property nodes needs to have an aggregationMethod config property that defines how this is going to be handled. Here is a list of the supported aggregation methods that can be used during this conversion procedure:",
"updated": 1622235156415
"updated": 1622235156415,
"translations": [
{
"language": "DE",
"text": "Im Bot, in dem diese Konvertierung stattfindet, müssen die nodes der Datensatzeigenschaft über eine aggregationMethod config property (Konfigurationseigenschaft) verfügen, die definiert, wie dies gehandhabt werden soll. Hier ist eine Liste der unterstützten aggregation methods (Aggregationsmethoden), die während dieses Konvertierungsvorgangs verwendet werden können:",
"updated": 1635185366691
}
]
},
{
"style": "List",
"text": "First: This means that the fisrt value found within the time range being processed, will define the value of the Record Property."
"text": "First: This means that the fisrt value found within the time range being processed, will define the value of the Record Property.",
"translations": [
{
"language": "DE",
"text": "First: Das bedeutet, dass der erste Wert, der innerhalb des zu verarbeitenden Zeitraums gefunden wird, den Wert der Record Property (Datensatzeigenschaft) bestimmt.",
"updated": 1635186034021
}
]
},
{
"style": "List",
"text": "Last: This means that from all values found at the current time range, the last will be selected for the final value of the Record Property node being evaluated."
"text": "Last: This means that from all values found at the current time range, the last will be selected for the final value of the Record Property node being evaluated.",
"translations": [
{
"language": "DE",
"text": "Last: Das bedeutet, dass von allen Werten, die im aktuellen Zeitbereich gefunden wurden, der letzte für den endgültigen Wert der ausgewerteten node der Record Property ausgewählt wird.",
"updated": 1635185724585
}
]
},
{
"style": "List",
"text": "Min: This means that the mathematical minimum value from all values found in the time range will be used as the value for the Record Proeprty.",
"updated": 1622231381194
"text": "Min: This means that the mathematical minimum value from all values found in the time range will be used as the value for the Record Property.",
"updated": 1635185801651,
"translations": [
{
"language": "DE",
"text": "Min: Das bedeutet, dass der mathematische Mindestwert aus allen im Zeitbereich gefundenen Werten als Wert für die Record Property verwendet wird.",
"updated": 1635186027188
}
]
},
{
"style": "List",
"text": "Max: This means that the mathematical maximum value from all values found in the time range will be used as the value for the Record Proeprty.",
"updated": 1622231375974
"text": "Max: This means that the mathematical maximum value from all values found in the time range will be used as the value for the Record Property.",
"updated": 1635185814991,
"translations": [
{
"language": "DE",
"text": "Max: Das bedeutet, dass der mathematische Maximalwert aus allen im Zeitbereich gefundenen Werten als Wert für die Record Property verwendet wird.",
"updated": 1635186252288
}
]
},
{
"style": "List",
"text": "Sum: This means that the sum of all values found in the time range will be used as the value for the Record Proeprty."
"text": "Sum: This means that the sum of all values found in the time range will be used as the value for the Record Property.",
"updated": 1635185809846,
"translations": [
{
"language": "DE",
"text": "Sum: Das bedeutet, dass die Summe aller im Zeitbereich gefundenen Werte als Wert für die Record Property verwendet wird.",
"updated": 1635186286151
}
]
},
{
"style": "List",
"text": "Avg: This means that the average of all values found in the time range will be used as the value for the Record Proeprty."
"text": "Avg: This means that the average of all values found in the time range will be used as the value for the Record Property.",
"updated": 1635185822196,
"translations": [
{
"language": "DE",
"text": "Avg: Das bedeutet, dass der Durchschnitt aller im Zeitbereich gefundenen Werte als Wert für die Record Property verwendet wird.",
"updated": 1635186324151
}
]
},
{
"style": "Block",
@@ -117,157 +267,381 @@
},
{
"style": "Title",
"text": "Step by Step Guide to Fetch Data from an API"
"text": "Step by Step Guide to Fetch Data from an API",
"translations": [
{
"language": "DE",
"text": "Schritt für Schritt Anleitung zum Abrufen von Daten aus einer API",
"updated": 1635186345495
}
]
},
{
"style": "Text",
"text": "This is a detailed guide on how to setup a data mining operation fetching data from an Internet API.",
"updated": 1621975839421
"updated": 1621975839421,
"translations": [
{
"language": "DE",
"text": "Dies ist eine ausführliche Anleitung zur Einrichtung eines Data Mining-Vorgangs, der Daten von einer Internet-API abruft.",
"updated": 1635186372690
}
]
},
{
"style": "List",
"text": "Step #1: Open the API Data Fetcher Bot Demo Plugin Workspace and study it for a while. Run the tasks in there, watch while data is processed, check the charts and finally run the Trading Task that uses the data processed.",
"updated": 1621976539133
"updated": 1621976539133,
"translations": [
{
"language": "DE",
"text": "Schritt #1: Öffnen Sie den API Data Fetcher Bot Demo Plugin Workspace und arbeiten sie eine Weile mit ihm. Führen Sie die Tasks darin aus, beobachten Sie, wie die Daten verarbeitet werden, prüfen Sie die Charts und führen Sie schließlich die Trading Task aus, die die verarbeiteten Daten verwendet.",
"updated": 1635186793995
}
]
},
{
"style": "List",
"text": "Step #2: Open a second UI (this will prevent the previous one from saving the changes, but you don't need to do that). You will use the first UI to check from time to time how nodes are configured there, and the second UI to build your own data mining operation from scratch. The rest of the steps you will do within the second UI.",
"updated": 1622231623225
"updated": 1622231623225,
"translations": [
{
"language": "DE",
"text": "Schritt #2: Öffnen Sie eine zweite UI (Benutzeroberfläche) (dadurch wird verhindert, dass die vorherige die Änderungen speichert, aber das ist nicht nötig). Sie werden die erste Ui verwenden, um von Zeit zu Zeit zu überprüfen, wie die nodes dort konfiguriert sind, und die zweite UI, um Ihre eigene Data Mining Operation von Grund auf zu erstellen. Die restlichen Schritte werden Sie innerhalb der zweiten UI durchführen.",
"updated": 1635186922408
}
]
},
{
"style": "List",
"text": "Step #3: Select an API from the Internet with data that might be useful at your Trading Strategy.",
"updated": 1622231649073
"updated": 1622231649073,
"translations": [
{
"language": "DE",
"text": "Schritt #3: Wählen Sie eine API aus dem Internet mit Daten, die für Ihre Trading Strategy (Handelsstrategie) nützlich sein könnten.",
"updated": 1635186996482
}
]
},
{
"style": "List",
"text": "Step #4: Read the API's documentation, indentify the endpoints, what parameters they require and what data they will provide you. Another helpful way to see how the api responds is by typing the api endpoint into your browser and looking at the raw output.",
"updated": 1622469791527
"updated": 1622469791527,
"translations": [
{
"language": "DE",
"text": "Schritt #4: Lesen Sie die API-Dokumentation, identifizieren Sie die Endpunkte, welche Parameter sie benötigen und welche Daten sie Ihnen zur Verfügung stellen werden. Eine weitere hilfreiche Methode, um zu sehen, wie die API antwortet, ist die Eingabe des API-Endpunkts in Ihren Browser und die Betrachtung der Rohausgabe.",
"updated": 1635187040956
}
]
},
{
"style": "List",
"text": "Step #5: At Superalgos, get a clean workspace, without plugins pre-installed.",
"updated": 1621976682833
"updated": 1621976682833,
"translations": [
{
"language": "DE",
"text": "Schritt #5: Erstellen sie bei Superalgos einen freien Workspace, ohne vorinstallierte Plugins.",
"updated": 1635187084897
}
]
},
{
"style": "List",
"text": "Step #6: Create an API Map node, and start mapping the documented API by adding children to it. Especially pay attention to unnamed arrays and objects that may wrap the data.",
"updated": 1622470221717
"updated": 1622470221717,
"translations": [
{
"language": "DE",
"text": "Schritt #6: Erstellen Sie einen API Map node und beginnen Sie damit, die dokumentierte API abzubilden, indem Sie ihr \"children\" hinzufügen. Achten Sie insbesondere auf unbenannte Arrays und Objekte, die die Daten umhüllen können.",
"updated": 1635187292260
}
]
},
{
"style": "List",
"text": "Step #7: For each node you add, read the node's doc page. This will save you time trying to guess how all this works.",
"updated": 1621976694068
"updated": 1621976694068,
"translations": [
{
"language": "DE",
"text": "Schritt #7: Lesen Sie für jede node, die Sie hinzufügen, die Dokumentseite der node. So sparen Sie Zeit, wenn Sie versuchen zu erraten, wie das alles funktioniert.",
"updated": 1635187355089
}
]
},
{
"style": "List",
"text": "Step #8: Define one API Endpoint first, once you have the first one working, go for the rest of the endpoints available.",
"updated": 1622231734738
"updated": 1622231734738,
"translations": [
{
"language": "DE",
"text": "Schritt #8: Definieren Sie zunächst einen API Endpoint, und sobald der erste funktioniert, gehen Sie zu den übrigen verfügbaren Endpunkten über.",
"updated": 1635187398066
}
]
},
{
"style": "List",
"text": "Step #9: Define the query, or path parameters, and the responses. Read each node's help for details on how to do it right.",
"updated": 1622231862303
"updated": 1622231862303,
"translations": [
{
"language": "DE",
"text": "Schritt #9: Definieren Sie die Abfrage- oder Pfadparameter und die Antworten. Lesen Sie in der Hilfe der jeweiligen node für Details, wie Sie es richtig machen.",
"updated": 1635187429959
}
]
},
{
"style": "List",
"text": "Step #10: Create a Trading System with an empty Strategy. This will allow the Install New Market procedure to create trading tasks referencing this Trading System.",
"updated": 1621976716866
"updated": 1621976716866,
"translations": [
{
"language": "DE",
"text": "Schritt #10: Erstellen Sie ein Trading System mit einer leeren Strategy. Dadurch kann das Verfahren \"New Market\" installiert werden und trading tasks erstellt werden, die sich auf dieses Trading System beziehen.",
"updated": 1635187557139
}
]
},
{
"style": "List",
"text": "Step #11: Create a new Data Mine with the name of the company that hosts the API.",
"updated": 1622231912331
"updated": 1622231912331,
"translations": [
{
"language": "DE",
"text": "Schritt #11: Erstellen Sie eine neue Data Mine mit dem Namen des Unternehmens, das die API hostet.",
"updated": 1635187589477
}
]
},
{
"style": "List",
"text": "Step #12: Within the Data Mine add an API Data Fetcher Bot. Configure the Bot's nodes following the example at the UI #1.",
"updated": 1622231954570
"updated": 1622231954570,
"translations": [
{
"language": "DE",
"text": "Schritt #12: Fügen Sie innerhalb der Data Mine einen API Data Fetcher Bot hinzu. Konfigurieren Sie die node des Bots entsprechend dem Beispiel auf der UI #1.",
"updated": 1635187627867
}
]
},
{
"style": "List",
"text": "Step #13: Install a new market. This procedure is going to setup many things for you. It will detect the API Map, and the Data Mine you created and will create appropiate Tasks to run your API Fetcher Bot.",
"updated": 1622232103844
"updated": 1622232103844,
"translations": [
{
"language": "DE",
"text": "Schritt #13: Installieren Sie einen \"new market\". Dieser Vorgang wird viele Dinge für Sie einrichten. Er erkennt die API Map und die Data Mine, die Sie erstellt haben, und erstellt die entsprechenden tasks, um Ihren API Fetcher Bot auszuführen.",
"updated": 1635187739595
}
]
},
{
"style": "List",
"text": "Step #14: Pay attention to the nodePath property at the API Response Schema node of the API Map. Check the node's docs page for details."
"text": "Step #14: Pay attention to the nodePath property at the API Response Schema node of the API Map. Check the node's docs page for details.",
"translations": [
{
"language": "DE",
"text": "Schritt #14: Achten Sie auf die Eigenschaft nodePath in der API Response Schema node der API Map. Prüfen Sie die docs der node für Details.",
"updated": 1635187793966
}
]
},
{
"style": "List",
"text": "Step #15: At your API Data Fetcher Bot's Product Definition Record Properties, define the fields that you would like to save from the API Server response. You don't need to save everything, only what makes sense to you.",
"updated": 1622232590430
"updated": 1622232590430,
"translations": [
{
"language": "DE",
"text": "Schritt #15: Definieren sie in der API Data Fetcher Bot's Product Definition Record Properties, die Felder die sie von der Api Server Antwort speichern möchten. Sie müssen nicht alles speichern, sondern nur das, was für Sie sinnvoll ist.",
"updated": 1635188106919
}
]
},
{
"style": "List",
"text": "Step #16: Establish a reference from each Record Property child API Response Field Reference node to a node at the API Map of type API Response Field. Do it carefully for every Record Property."
"text": "Step #16: Establish a reference from each Record Property child API Response Field Reference node to a node at the API Map of type API Response Field. Do it carefully for every Record Property.",
"translations": [
{
"language": "DE",
"text": "Schritt #16: Stellen Sie einen Verweis von jeder untergeordneten API Response Field Reference node (Datensatzeigenschaft) auf einen Knoten in der API Map vom Typ API Response Field her. Tun Sie dies sorgfältig für jede Record Property.",
"updated": 1635188259246
}
]
},
{
"style": "List",
"text": "Step #17: The timestamp record property is the only required property. It helps keep the records you save organized. Addtionally, the timestamp may live in the header of the API responce. Read the docs of the API Response Field Reference node to set up the nodePath property if necessary.",
"updated": 1622475120505
"updated": 1622475120505,
"translations": [
{
"language": "DE",
"text": "Schritt #17: Die timestamp record property ist die einzige erforderliche Eigenschaft. Sie hilft, die von Ihnen gespeicherten Datensätze zu organisieren. Darüber hinaus kann der Zeitstempel in der Kopfzeile der API-Antwort stehen. Lesen Sie die Dokumentation der API Response Field Reference node, um die Eigenschaft nodePath einzurichten, falls erforderlich.",
"updated": 1635188586279
}
]
},
{
"style": "Note",
"text": "It is a good idea to make sure you get the api fetcher bot running and debugged before moving on to the next step.",
"updated": 1622475171484
"updated": 1622475171484,
"translations": [
{
"language": "DE",
"text": "Es ist eine gute Idee, sicherzustellen, dass der Api-Fetcher-Bot läuft und gedebuggt wird (Das Entfernen aller Bugs/Fehler aus dem Code), bevor Sie zum nächsten Schritt übergehen.",
"updated": 1635188659088
}
]
},
{
"style": "List",
"text": "Step #18: At your Data Mine, set up an Indicator Bot and configure its Process Definition nodes to the framework that will convert from One-Min-Daily to Multi-Time-Frame-Daily and Multi-Period-Market types of Datasets. See how it was done at the UI #1.",
"updated": 1635193955563
"updated": 1635193955563,
"translations": [
{
"language": "DE",
"text": "Step #18: Richten Sie in Ihrer Data Mine einen Indicator Bot ein und konfigurieren Sie seine Process Definition nodes für das Framework, das Datensätze von One-Min-Daily in Multi-Time-Frame-Daily und Multi-Period-Market konvertiert. Sehen Sie sich an, wie das in der UI #1 gemacht wurde.",
"updated": 1635244805304
}
]
},
{
"style": "List",
"text": "Step #19: Within the Indicator Bot you just added, define the Record Property nodes based on the information you would like to convert from Raw Data. Make sure you add a begin and end Record Property even if it does not exist at the Raw Data in order for the indicator bot to run correctly.",
"updated": 1635194170557
"updated": 1635194170557,
"translations": [
{
"language": "DE",
"text": "Step #19: Definieren Sie in dem soeben hinzugefügten Indicator Bot die nodes der Record Property auf der Grundlage der Informationen, die Sie aus Raw Data konvertieren möchten. Vergewissern Sie sich, dass Sie eine Anfangs- und eine Ende-Record Property (Datensatzeigenschaft) hinzufügen, auch wenn diese in den Rohdaten nicht vorhanden sind, damit der Indikator-Bot korrekt ausgeführt werden kann.",
"updated": 1635245425484
}
]
},
{
"style": "List",
"text": "Step #20: Configure the aggregationMethod property for each Record Property. Check the docs of that node for details.",
"updated": 1622235178187
"updated": 1622235178187,
"translations": [
{
"language": "DE",
"text": "Schritt #20: Konfigurieren Sie die Eigenschaft aggregationMethod für jede Record Property. Prüfen Sie die docs dieser node für Details.",
"updated": 1635190124011
}
]
},
{
"style": "List",
"text": "Step #21: If you wish, you can create multiple Indicator Bots to cut the dataset in different groups of Record Properties.",
"updated": 1622233072603
"updated": 1622233072603,
"translations": [
{
"language": "DE",
"text": "Schritt #21: Wenn Sie möchten, können Sie mehrere Indicator Bot`s erstellen, um den Datensatz in verschiedene Gruppen von Record Property aufzuteilen.",
"updated": 1635190629588
}
]
},
{
"style": "List",
"text": "Step #22: Setup a Plotter at your new Data Mine, and reference it from the Product Definition of the latest Indicator Bot created."
"text": "Step #22: Setup a Plotter at your new Data Mine, and reference it from the Product Definition of the latest Indicator Bot created.",
"translations": [
{
"language": "DE",
"text": "Schritt #22: Richten Sie einen Plotter in Ihrer neuen Data Mine ein, und referenzieren Sie ihn in der Product Definition des zuletzt erstellten Indicator Bot.",
"updated": 1635190802408
}
]
},
{
"style": "List",
"text": "Step #23: Now you are ready to run the Task where the Data Fetcher Bot Process Instance is defined. "
"text": "Step #23: Now you are ready to run the Task where the Data Fetcher Bot Process Instance is defined. ",
"translations": [
{
"language": "DE",
"text": "Schritt #23: Jetzt können Sie die Task ausführen, in dem die Data Fetcher Bot Process Instance definiert ist.",
"updated": 1635190919943
}
]
},
{
"style": "List",
"text": "Step #24: If something did not work, check the workspace map to see if there is a node with an error. Locate the node, click on the error and see the error's page at the doc. Try to understand what is wrong, fix it and try again."
"text": "Step #24: If something did not work, check the workspace map to see if there is a node with an error. Locate the node, click on the error and see the error's page at the doc. Try to understand what is wrong, fix it and try again.",
"translations": [
{
"language": "DE",
"text": "Schritt #24: Wenn etwas nicht funktioniert hat, überprüfen Sie die Workspace Map, um zu sehen, ob es eine node mit einem error/Fehler gibt. Suchen Sie die node, klicken Sie auf den Fehler und sehen Sie die Fehlerseite in der Documentation. Versuchen Sie zu verstehen, was falsch ist, beheben Sie den Fehler und versuchen Sie es erneut.",
"updated": 1635191377038
}
]
},
{
"style": "List",
"text": "Step #25: Iterate through step #24 until everything is working. Re read node's documentation until you get the details of what it explains there. Reread this guide or this whole Topic from the start, until the concepts explained sinks in.",
"updated": 1622233708371
"updated": 1622233708371,
"translations": [
{
"language": "DE",
"text": "Schritt #25: Iterieren Sie durch den Schritt #24, bis alles funktioniert. Lesen Sie die docs von Node erneut, bis Sie die Details der dortigen Erklärungen verstanden haben. Lesen Sie diesen Leitfaden oder das ganze Thema noch einmal von Anfang an, bis Sie die erklärten Konzepte verstanden haben.",
"updated": 1635191475882
}
]
},
{
"style": "List",
"text": "Step #26: If after digesting the docs, and following all this advice you still cannot get it to work, go to the Telegram Support group and ask for help.",
"updated": 1622233735826
"updated": 1622233735826,
"translations": [
{
"language": "DE",
"text": "Schritt #26: Wenn Sie nach dem durchforsten der docs und der Befolgung all dieser Ratschläge immer noch nicht in der Lage sind, das Programm zum Laufen zu bringen, gehen Sie zur Telegram Support group und bitten Sie um Hilfe.",
"updated": 1635191614474
}
]
},
{
"style": "List",
"text": "Step #27: Once all is running well, set up your Trading Strategy in a way that allows you to test if you have access to the processed data (the one provided by the latest Indicator Bots created).",
"updated": 1622233777598
"updated": 1622233777598,
"translations": [
{
"language": "DE",
"text": "Schritt #27: Wenn alles gut läuft, richten Sie Ihre Trading Strategy so ein, dass Sie testen können, ob Sie Zugang zu den verarbeiteten Daten haben (die von de, zuletzt erstellten Indicator Bots bereitgestellt werden).",
"updated": 1635191934607
}
]
},
{
"style": "List",
"text": "Step #29: Once the data is correctly consumed by your Trading Strategy, iterate through this guide by adding another API Endpoint to the API Map. You will need to add an addtional API Fetcher Bot.",
"updated": 1622233824073
"updated": 1622233824073,
"translations": [
{
"language": "DE",
"text": "Schritt #29: Sobald die Daten korrekt von Ihrer Trading Strategy genutzt werden, führen Sie diese Anleitung immerweider durch, indem Sie einen weiteren API Endpoint zur API Map hinzufügen. Sie müssen einen zusätzlichen API Fetcher Bot hinzufügen.",
"updated": 1635192207098
}
]
},
{
"style": "List",
"text": "Step #30: Once you have successfully mapped the whole API and you have all the needed API Data Fetchers, Indicator Bots and Plotters tested, you are ready to share your API Map and Data Mine with the community as a plugin, and receive SA Tokens in exchange for your contribution.",
"updated": 1622233875203
"updated": 1622233875203,
"translations": [
{
"language": "DE",
"text": "Schritt #30: Sobald Sie die gesamte API erfolgreich gemappt haben und alle benötigten API Data Fetchers, Indicator Bots und Plotter getestet haben, können Sie Ihre API Map und Data Mine als Plugin mit der Community teilen und SA Tokens im Austausch für Ihren Beitrag/contribution erhalten.",
"updated": 1635192382540
}
]
},
{
"style": "Text",
@@ -4,13 +4,27 @@
"type": "Data Mining - Consuming Data From Strategies",
"definition": {
"text": "Trading Bots can have Data Dependencies from any Indicator Bot that puts out data products. This allows Trading Strategies to act upon the data processed by Indicator Bots.",
"updated": 1622234087314
"updated": 1622234087314,
"translations": [
{
"language": "DE",
"text": "Trading: Trading Bots können Data Dependencies (Datenabhängigkeiten) von jedem Indicator Bot haben, der Datenprodukte herausgibt. Dadurch können Trading Strategies auf die von Indicator Bots verarbeiteten Daten aufbauen.",
"updated": 1635246035756
}
]
},
"paragraphs": [
{
"style": "Text",
"text": "This is the heart and soul of the data mining process allowing users to create trading bots that act upon sophisticated data and data analysis logic.",
"updated": 1622234159617
"updated": 1622234159617,
"translations": [
{
"language": "DE",
"text": "Dies ist das Herz und die Seele des Data Mining Prozesses, der es den Nutzern ermöglicht, trading bots zu erstellen, die auf der Grundlage anspruchsvoller/durchdachter Daten und Datenanalyselogiken zu handeln.",
"updated": 1635246242278
}
]
}
]
}
@@ -4,7 +4,14 @@
"type": "Data Mining - Indicator Bots",
"definition": {
"text": "Indicator bots enable the processing of data by consuming datasets others have produced, performing calculations, and outputting a new value-added data product that others may consume.",
"updated": 1611408124910
"updated": 1611408124910,
"translations": [
{
"language": "DE",
"text": "Indicator Bots ermöglichen die Verarbeitung von Daten, indem sie von anderen erstellte Datensätze nutzen, Berechnungen durchführen und ein neues Datenprodukt mit Mehrwert ausgeben, das von anderen genutzt werden kann.",
"updated": 1635246859259
}
]
},
"paragraphs": [
{
@@ -4,7 +4,14 @@
"type": "Data Mining - Indicator Bots - Process Definition",
"definition": {
"text": "The process definition is the compilation of configurations, dependencies, and references that make up a process.",
"updated": 1611410324543
"updated": 1611410324543,
"translations": [
{
"language": "DE",
"text": "Die process definition ist die Zusammenstellung von Konfigurationen, Abhängigkeiten und Referenzen, die einen Prozess ausmachen.",
"updated": 1635249685989
}
]
},
"paragraphs": [
{
@@ -103,7 +110,14 @@
{
"style": "Subtitle",
"text": "Status Dependency",
"updated": 1611409068335
"updated": 1611409068335,
"translations": [
{
"language": "DE",
"text": "Status Abhängigkeit:",
"updated": 1635250380628
}
]
},
{
"style": "Include",
@@ -148,7 +162,14 @@
{
"style": "Subtitle",
"text": "Bot Data Dependencies",
"updated": 1611409418545
"updated": 1611409418545,
"translations": [
{
"language": "DE",
"text": "Bot-Daten-Abhängigkeiten",
"updated": 1635250399600
}
]
},
{
"style": "Include",
@@ -163,7 +184,14 @@
{
"style": "Subtitle",
"text": "Data Dependency Folder",
"updated": 1611409491551
"updated": 1611409491551,
"translations": [
{
"language": "DE",
"text": "Daten Abhängigkeits (Dependency) Folder",
"updated": 1635250428583
}
]
},
{
"style": "Include",
@@ -178,7 +206,14 @@
{
"style": "Title",
"text": "Status Report",
"updated": 1611409535037
"updated": 1611409535037,
"translations": [
{
"language": "DE",
"text": "Statusbericht",
"updated": 1635250449950
}
]
},
{
"style": "Title",
@@ -4,7 +4,14 @@
"type": "Data Mining - Indicator Bots - Product Definition",
"definition": {
"text": "The product definition is the compilation of configurations, references, and JavaScript code that make up the data product.",
"updated": 1611425764441
"updated": 1611425764441,
"translations": [
{
"language": "DE",
"text": "Die Produktdefinition ist die Zusammenstellung von Konfigurationen, Referenzen und JavaScript-Code, aus denen das Datenprodukt besteht.",
"updated": 1635275735541
}
]
},
"paragraphs": [
{
@@ -98,7 +105,14 @@
{
"style": "Title",
"text": "Calculations Procedure",
"updated": 1611426226554
"updated": 1611426226554,
"translations": [
{
"language": "DE",
"text": "Calculations Prozedur:",
"updated": 1635276008201
}
]
},
{
"style": "Include",
@@ -4,29 +4,71 @@
"type": "Data Mining - Indicator Bots - Data Mining Workflow",
"definition": {
"text": "When running on a data mining operation, indicators follow a cycle designed to fulfill their purpose: to process data others have produced and make the result available for others to consume.",
"updated": 1611427674749
"updated": 1611427674749,
"translations": [
{
"language": "DE",
"text": "Bei einer Data-Mining-Operation folgen die Indikatoren einem Zyklus, der ihren Zweck erfüllt: Sie verarbeiten Daten, die andere produziert haben, und stellen das Ergebnis anderen zur Verfügung.",
"updated": 1635276099757
}
]
},
"paragraphs": [
{
"style": "Text",
"text": "Indicators take datasets produced by sensors or by other indicators as input. These inputs are determined by the data dependencies defined. The calculations procedure and the data building procedure produce the intended transformations. The data building procedure stores the results in datasets that others may use as input, and the calculations procedure may make certain pieces of information available without ever writing it in the files.",
"updated": 1611427699110
"updated": 1611427699110,
"translations": [
{
"language": "DE",
"text": "Indicators nehmen Datensätze, die von Sensoren oder anderen Indicators erzeugt werden, als Input. Diese Eingaben werden durch die definierten Datenabhängigkeiten bestimmt. Die Berechnungsprozedur und die Datenerstellungsprozedur erzeugen die beabsichtigten Transformationen. Die Datenerstellungsprozedur speichert die Ergebnisse in Datensätzen, die andere als Eingabe verwenden können, und die Berechnungsprozedur kann bestimmte Informationen zur Verfügung stellen, ohne sie jemals in die Dateien zu schreiben.",
"updated": 1635276217755
}
]
},
{
"style": "Text",
"text": "The following is the breakdown of the cycle."
"text": "The following is the breakdown of the cycle.",
"translations": [
{
"language": "DE",
"text": "Der Zyklus ist wie folgt aufgeschlüsselt.",
"updated": 1635276240360
}
]
},
{
"style": "Title",
"text": "1. Loading of data dependencies"
"text": "1. Loading of data dependencies",
"translations": [
{
"language": "DE",
"text": "1. Laden von data dependencies",
"updated": 1635276285780
}
]
},
{
"style": "Text",
"text": "Datasets produced by indicators are sets of text files with data stored in the form of arrays. Each value in a record is separated by colons, and each record is delimited by square brackets. Records are too separated by colons. The format in which data is stored in files aims to make files as lightweight as possible."
"text": "Datasets produced by indicators are sets of text files with data stored in the form of arrays. Each value in a record is separated by colons, and each record is delimited by square brackets. Records are too separated by colons. The format in which data is stored in files aims to make files as lightweight as possible.",
"translations": [
{
"language": "DE",
"text": "Die von den Indikatoren erzeugten Datensätze bestehen aus Textdateien, in denen die Daten in Form von Arrays gespeichert sind. Jeder Wert in einem Record wird durch Doppelpunkte getrennt, und jeder Record wird durch eckige Klammern abgegrenzt. Auch die Datensätze sind durch Doppelpunkte getrennt. Das Format, in dem die Daten in den Dateien gespeichert werden, zielt darauf ab, die Dateien so leicht (lightweight) wie möglich zu machen.",
"updated": 1635276444848
}
]
},
{
"style": "Text",
"text": "For example, the following fragment features three records in the 24-hours Multi-Time-Frame-Market Bollinger Bands Data.json file:"
"text": "For example, the following fragment features three records in the 24-hours Multi-Time-Frame-Market Bollinger Bands Data.json file:",
"translations": [
{
"language": "DE",
"text": "Das folgende Fragment enthält beispielsweise drei Datensätze in der Datei 24-hours Multi-Time-Frame-Market Bollinger Bands Data.json:",
"updated": 1635276468980
}
]
},
{
"style": "Json",
@@ -34,44 +76,114 @@
},
{
"style": "Text",
"text": "That is what the system encounters at the time of reading a typical file in a dataset, which is the first step in the runtime cycle."
"text": "That is what the system encounters at the time of reading a typical file in a dataset, which is the first step in the runtime cycle.",
"translations": [
{
"language": "DE",
"text": "Das ist es, was das System beim Lesen einer typischen Datei in einem Datensatz, dem ersten Schritt im Laufzeitzyklus, vorfindet.",
"updated": 1635276614868
}
]
},
{
"style": "Title",
"text": "2. Inflation of files into JSON objects with named properties"
"text": "2. Inflation of files into JSON objects with named properties",
"translations": [
{
"language": "DE",
"text": "2. Aufblasen (Inflation) von Dateien in JSON-Objekte mit benannten Eigenschaften:",
"updated": 1635276677178
}
]
},
{
"style": "Text",
"text": "Once a file is loaded in memory, it is inflated into a JSON object structure, with named properties. This is the second step in the cycle and aims to make accessing each record—from within the code—much easier."
"text": "Once a file is loaded in memory, it is inflated into a JSON object structure, with named properties. This is the second step in the cycle and aims to make accessing each record—from within the code—much easier.",
"translations": [
{
"language": "DE",
"text": "Sobald eine Datei in den Speicher geladen ist, wird sie in eine JSON-Objektstruktur mit benannten Eigenschaften aufgeblasen. Dies ist der zweite Schritt im Zyklus und soll den Zugriff auf jeden Datensatz - innerhalb des Codes - wesentlich erleichtern.",
"updated": 1635276774378
}
]
},
{
"style": "Title",
"text": "3. Calculation of properties not stored in the dataset"
"text": "3. Calculation of properties not stored in the dataset",
"translations": [
{
"language": "DE",
"text": "3. Berechnung von Eigenschaften, die nicht im Dataset gespeichert sind:",
"updated": 1635276920204
}
]
},
{
"style": "Text",
"text": "Because performance is inversely related to the weight of files, developers may choose not to store all indicator properties in files. They may choose to leave properties that are easy to calculate out of the dataset and make them available as calculated properties instead. Calculated properties are calculated by the calculations procedure and fed to the record definition formulas to be made available as an integral part of the object other indicators may access."
"text": "Because performance is inversely related to the weight of files, developers may choose not to store all indicator properties in files. They may choose to leave properties that are easy to calculate out of the dataset and make them available as calculated properties instead. Calculated properties are calculated by the calculations procedure and fed to the record definition formulas to be made available as an integral part of the object other indicators may access.",
"translations": [
{
"language": "DE",
"text": "Da die Leistung im umgekehrten Verhältnis zum Gewicht der Dateien steht, können sich Entwickler dafür entscheiden, nicht alle Indikatoreigenschaften in Dateien zu speichern. Sie können sich dafür entscheiden, Eigenschaften, die leicht zu berechnen sind, aus dem Datensatz herauszulassen und sie stattdessen als berechnete Eigenschaften verfügbar zu machen. Berechnete Eigenschaften werden von der Berechnungsprozedur berechnet und in die Formeln der Datensatzdefinition eingespeist, damit sie als integraler Bestandteil des Objekts, auf das andere Indikatoren zugreifen können, zur Verfügung stehen.",
"updated": 1635277103260
}
]
},
{
"style": "Text",
"text": "For example, picture an indicator that offers buy, sell, and total volumes. Because the total volume is so easy to calculate, the developer of such an indicator may choose to store the buy and sell volumes only and make the total volume available as a calculated property."
"text": "For example, picture an indicator that offers buy, sell, and total volumes. Because the total volume is so easy to calculate, the developer of such an indicator may choose to store the buy and sell volumes only and make the total volume available as a calculated property.",
"translations": [
{
"language": "DE",
"text": "Stellen Sie sich zum Beispiel einen Indikator vor, der Kauf-, Verkaufs- und Gesamtvolumen anbietet. Da das Gesamtvolumen so einfach zu berechnen ist, kann der Entwickler eines solchen Indikators beschließen, nur das Kauf- und Verkaufsvolumen zu speichern und das Gesamtvolumen als berechnete Eigenschaft zur Verfügung zu stellen.",
"updated": 1635277150436
}
]
},
{
"style": "Success",
"text": "Make your indicators more efficient by limiting the amount of information you store in files.",
"updated": 1611428939223
"updated": 1611428939223,
"translations": [
{
"language": "DE",
"text": "Erhöhen Sie die Effizienz Ihrer Indikatoren, indem Sie die Menge der in Dateien gespeicherten Informationen begrenzen.",
"updated": 1635277178826
}
]
},
{
"style": "Text",
"text": "The third step in the runtime cycle is, therefore, to run the calculations procedure of each data dependency and add the calculated properties to the JSON object structure in memory, so that all properties are available for the next steps in the cycle."
"text": "The third step in the runtime cycle is, therefore, to run the calculations procedure of each data dependency and add the calculated properties to the JSON object structure in memory, so that all properties are available for the next steps in the cycle.",
"translations": [
{
"language": "DE",
"text": "Der dritte Schritt im Laufzeitzyklus besteht daher darin, die Berechnungsprozedur jeder Datenabhängigkeit auszuführen und die berechneten Eigenschaften der JSON-Objektstruktur im Speicher hinzuzufügen, so dass alle Eigenschaften für die nächsten Schritte im Zyklus verfügbar sind.",
"updated": 1635277221102
}
]
},
{
"style": "Title",
"text": "4. Products structure"
"text": "4. Products structure",
"translations": [
{
"language": "DE",
"text": "4. Struktur der Produkte:",
"updated": 1635277246404
}
]
},
{
"style": "Text",
"text": "Steps 1, 2, and 3 are run for each one of the data dependencies, and the results are put inside an object named products. In this way, all data dependencies may be easily accessed with the following kind of syntax:"
"text": "Steps 1, 2, and 3 are run for each one of the data dependencies, and the results are put inside an object named products. In this way, all data dependencies may be easily accessed with the following kind of syntax:",
"translations": [
{
"language": "DE",
"text": "Die Schritte 1, 2 und 3 werden für jede der Datenabhängigkeiten ausgeführt, und die Ergebnisse werden in einem Objekt namens \"products\" abgelegt. Auf diese Weise kann auf alle Datenabhängigkeiten mit der folgenden Art von Syntax leicht zugegriffen werden:",
"updated": 1635277911811
}
]
},
{
"style": "Javascript",
@@ -80,7 +192,14 @@
{
"style": "Text",
"text": "For example: ",
"updated": 1611428967240
"updated": 1611428967240,
"translations": [
{
"language": "DE",
"text": "Zum Beispiel:",
"updated": 1635278270836
}
]
},
{
"style": "Javascript",
@@ -88,43 +207,113 @@
},
{
"style": "Text",
"text": "Each product remains an array of JSON objects with named variables."
"text": "Each product remains an array of JSON objects with named variables.",
"translations": [
{
"language": "DE",
"text": "Jedes Produkt bleibt ein Array von JSON-Objekten mit benannten Variablen.",
"updated": 1635278286054
}
]
},
{
"style": "Title",
"text": "5. Data building"
"text": "5. Data building",
"translations": [
{
"language": "DE",
"text": "5. Data building (Datenerstellung):",
"updated": 1635278314757
}
]
},
{
"style": "Text",
"text": "The fifth step in the runtime cycle is running the indicator’s data building procedure. This is where the developer codes the logic to go over the input datasets and perform the calculations required to produce the indicator’s output."
"text": "The fifth step in the runtime cycle is running the indicator’s data building procedure. This is where the developer codes the logic to go over the input datasets and perform the calculations required to produce the indicator’s output.",
"translations": [
{
"language": "DE",
"text": "Der fünfte Schritt im Laufzeitzyklus ist die Ausführung der Datenerstellungsprozedur des Indikators. Hier programmiert der Entwickler die Logik, um die Eingabedatensätze zu überprüfen und die Berechnungen durchzuführen, die für die Ausgabe des Indikators erforderlich sind.",
"updated": 1635278729512
}
]
},
{
"style": "Text",
"text": "Indicators may have multiple products, thus, the data building procedure corresponding to each product is run sequentially, in the order products have been defined around the indicator bot node."
"text": "Indicators may have multiple products, thus, the data building procedure corresponding to each product is run sequentially, in the order products have been defined around the indicator bot node.",
"translations": [
{
"language": "DE",
"text": "Da Indikatoren mehrere Produkte haben können, wird das Datenerstellungsverfahren für jedes Produkt nacheinander in der Reihenfolge durchgeführt, in der die Produkte um den Indikator-bot node herum definiert worden sind.",
"updated": 1635278793170
}
]
},
{
"style": "Text",
"text": "As transformations for a given product are finished, the results are appended to the products object and made available immediately for the rest of the products in the queue to use as input, in addition to the original data dependencies. Data dependencies are the same for all products, as data dependencies are defined at the level of processes."
"text": "As transformations for a given product are finished, the results are appended to the products object and made available immediately for the rest of the products in the queue to use as input, in addition to the original data dependencies. Data dependencies are the same for all products, as data dependencies are defined at the level of processes.",
"translations": [
{
"language": "DE",
"text": "Wenn die Transformationen für ein bestimmtes Produkt abgeschlossen sind, werden die Ergebnisse an das Produktobjekt angehängt und stehen den übrigen Produkten in der Warteschlange sofort als Eingabe zur Verfügung, und zwar zusätzlich zu den ursprünglichen Datenabhängigkeiten. Die Datenabhängigkeiten sind für alle Produkte gleich, da die Datenabhängigkeiten auf Prozessebene definiert werden.",
"updated": 1635278977927
}
]
},
{
"style": "Title",
"text": "6. Writing the output"
"text": "6. Writing the output",
"translations": [
{
"language": "DE",
"text": "6. Writing the output (Schreiben der Ausgabe):",
"updated": 1635278995057
}
]
},
{
"style": "Text",
"text": "The final step is turning the object-formatted records back into a minimized array format, and saving the corresponding files in the dataset."
"text": "The final step is turning the object-formatted records back into a minimized array format, and saving the corresponding files in the dataset.",
"translations": [
{
"language": "DE",
"text": "Der letzte Schritt besteht darin, die objektformatierten Datensätze wieder in ein minimiertes Array-Format umzuwandeln und die entsprechenden Dateien im Dataset zu speichern.",
"updated": 1635279046312
}
]
},
{
"style": "Title",
"text": "Appendix: Building 2 Interdependent Indicators"
"text": "Appendix: Building 2 Interdependent Indicators",
"translations": [
{
"language": "DE",
"text": "Appendix: Building 2 Interdependent Indicators (bauen zweier Interdependente Indikatoren):",
"updated": 1635279096121
}
]
},
{
"style": "Text",
"text": "Let's say you built indicator1 with product A that depends on Indicator Candles Volumens, product Candles, and you are building indicator2, product B that depends on indicator1 product A."
"text": "Let's say you built indicator1 with product A that depends on Indicator Candles Volumens, product Candles, and you are building indicator2, product B that depends on indicator1 product A.",
"translations": [
{
"language": "DE",
"text": "Nehmen wir an, Sie haben Indikator 1 mit Produkt A erstellt, der vom Indikator Candles Volumens, Produkt Candles, abhängt, und Sie erstellen Indikator 2, Produkt B, der vom Indikator 1, Produkt A, abhängt.",
"updated": 1635279123786
}
]
},
{
"style": "Text",
"text": "When you wrote the code for Indicator 1 Product A, you were using the syntax:"
"text": "When you wrote the code for Indicator 1 Product A, you were using the syntax:",
"translations": [
{
"language": "DE",
"text": "Als Sie den Code für Indikator 1 Produkt A geschrieben haben, haben Sie die Syntax verwendet:",
"updated": 1635279152916
}
]
},
{
"style": "Text",
@@ -132,31 +321,82 @@
},
{
"style": "Text",
"text": "Why? Because Indicator 1 depends on Candles Volumens, produc Candles, and each candle has a property called open, and since product Candles is the only data dependency, it is then also the main dependency and then it will be served to you inside the record object for your convenience."
"text": "Why? Because Indicator 1 depends on Candles Volumens, product Candles, and each candle has a property called open, and since product Candles is the only data dependency, it is then also the main dependency and then it will be served to you inside the record object for your convenience.",
"updated": 1635279353336,
"translations": [
{
"language": "DE",
"text": "Warum? Weil Indikator 1 von Kerzenvolumina und Produktkerzen abhängt, und jede Kerze eine Eigenschaft namens \"open\" hat, und da Produktkerzen die einzige Datenabhängigkeit sind, ist dies auch die Hauptabhängigkeit und wird Ihnen innerhalb des Datensatzobjekts zu Ihrer Bequemlichkeit zur Verfügung gestellt.",
"updated": 1635279448402
}
]
},
{
"style": "Subtitle",
"text": "You could also have done:",
"updated": 1635279487611,
"translations": [
{
"language": "DE",
"text": "Das hätten Sie auch so tun können:",
"updated": 1635279558626
}
]
},
{
"style": "Text",
"text": "You could also have done"
"text": "variable property1 = products.candles[index] but that is more difficult because you don't really know which index you are at at any given moment in time. It is best and easier to use the record object. The array is for very advanced users.",
"translations": [
{
"language": "DE",
"text": "variable property1 = products.candles[index] aber das ist schwieriger, weil man nicht wirklich weiß, in welchem Index man sich zu einem bestimmten Zeitpunkt befindet. Am besten und einfachsten ist es, das Datensatzobjekt (record object) zu verwenden. Das Array ist für sehr fortgeschrittene Benutzer.",
"updated": 1635279751456
}
]
},
{
"style": "Text",
"text": "variable property1 = products.candles[index] but that is more difficult because you don't really know which index you are at at any given moment in time. It is best and easier to use the record object. The array is for very advanced users."
"text": "Then you want to write the code for indicator 2, product B, you already declared Indicator 1, Product A as the only data dependency. ",
"translations": [
{
"language": "DE",
"text": "Wenn Sie dann den Code für Indikator 2, Produkt B, schreiben wollen, haben Sie bereits Indikator 1, Produkt A, als einzige Datenabhängigkeit deklariert.",
"updated": 1635281252028
}
]
},
{
"style": "Text",
"text": "Then you want to write the code for indicator 2, product B, you already declared Indicator 1, Product A as the only data dependency. "
"text": "Since Indicator1 product A is the only data dependency of indicator 2, then it is also the main dependency, which means that for building indicator 2, the Data Building Process will iterate over every element of Indicator 1 in this case (not candles because that is not a dependency at all).",
"translations": [
{
"language": "DE",
"text": "Da das Produkt A von Indikator 1 die einzige Datenabhängigkeit von Indikator 2 ist, ist es auch die Hauptabhängigkeit, was bedeutet, dass der Datenerstellungsprozess bei der Erstellung von Indikator 2 in diesem Fall über jedes Element von Indikator 1 iteriert (nicht über Kerzen, da dies überhaupt keine Abhängigkeit ist).",
"updated": 1635281329720
}
]
},
{
"style": "Text",
"text": "Since Indicator1 product A is the only data dependency of indicator 2, then it is also the main dependency, which means that for building indicator 2, the Data Building Process will iterate over every element of Indicator 1 in this case (not candles because that is not a dependency at all)."
"text": "In the same way that you did before, you will write code like this:",
"translations": [
{
"language": "DE",
"text": "Auf die gleiche Art und Weise wie zuvor werden Sie den Code wie folgt schreiben:",
"updated": 1635281342982
}
]
},
{
"style": "Text",
"text": "In the same way that you did before, you will write code like this:"
},
{
"style": "Text",
"text": "variable propertyX = record.current.property1 (that means the property 1 of Product A of Indicator 1) "
"text": "variable propertyX = record.current.property1 (that means the property 1 of Product A of Indicator 1) ",
"translations": [
{
"language": "DE",
"text": "variable propertyX = record.current.property1 (d. h. die Eigenschaft 1 des Produkts A des Indikators 1)",
"updated": 1635281359194
}
]
},
{
"style": "Text",
@@ -4,21 +4,49 @@
"type": "Data Mining - Indicator Bots - Coding the Indicator's Logic",
"definition": {
"text": "Learn how to use data dependencies, the variable object, and how to deal with indicators with irregular periods.",
"updated": 1611429211176
"updated": 1611429211176,
"translations": [
{
"language": "DE",
"text": "Lernen Sie, wie man data dependencies und das variable object verwendet und wie man mit indicators mit unregelmäßigen Perioden (irregular periods) umgeht.",
"updated": 1635354439837
}
]
},
"paragraphs": [
{
"style": "Title",
"text": "Main Data Dependency",
"updated": 1611430812568
"updated": 1611430812568,
"translations": [
{
"language": "DE",
"text": "Haupt-Data Dependency:",
"updated": 1635354651687
}
]
},
{
"style": "Text",
"text": "The data building procedure works under the premise that the algorithm loops around a data collection and that—for each loop—generates a record for the product being built. For example, the SMA indicator loops around the candles product of the Candles Volumes indicator, thus, candles is the main data dependency. In the case of the bollingerChannels product, the main data dependency is the bollingerBands product of the Bollinger Bands indicator."
"text": "The data building procedure works under the premise that the algorithm loops around a data collection and that—for each loop—generates a record for the product being built. For example, the SMA indicator loops around the candles product of the Candles Volumes indicator, thus, candles is the main data dependency. In the case of the bollingerChannels product, the main data dependency is the bollingerBands product of the Bollinger Bands indicator.",
"translations": [
{
"language": "DE",
"text": "Die data building procedure funktioniert unter der Prämisse, dass der Algorithmus in Schleifen um eine Datensammlung herumläuft und für jede Schleife einen Datensatz für das zu erstellende Produkt erzeugt. Der SMA-Indikator umkreist beispielsweise das Kerzen-Produkt des Kerzen-Volumen-Indikators, so dass die Kerzen die main Datenabhängigkeit darstellen. Im Fall des Produkts bollingerChannels ist die Hauptdatenabhängigkeit das Produkt bollingerBands des Indikators Bollinger Bands.",
"updated": 1635354770094
}
]
},
{
"style": "Text",
"text": "The main data dependency is the first dependency declared at the level of the processes. This dependency is made available in the record object, which features three properties:"
"text": "The main data dependency is the first dependency declared at the level of the processes. This dependency is made available in the record object, which features three properties:",
"translations": [
{
"language": "DE",
"text": "Die main data dependency ist die erste Abhängigkeit, die auf der Ebene der Prozesse deklariert wird. Diese Abhängigkeit wird im record object zur Verfügung gestellt, das über drei Eigenschaften verfügt:",
"updated": 1635354968813
}
]
},
{
"style": "List",
@@ -50,59 +78,150 @@
},
{
"style": "Text",
"text": "The variable index is the index in the array of the main dependency."
"text": "The variable index is the index in the array of the main dependency.",
"translations": [
{
"language": "DE",
"text": "Die Variable index ist der Index im Array der main dependency.",
"updated": 1635355002222
}
]
},
{
"style": "Text",
"text": "For example, you may use the statement record.propertyName to access the value of any of the properties in the input datasets for the current record, or record.previous.propertyName to access the value of the property in the previous record."
"text": "For example, you may use the statement record.propertyName to access the value of any of the properties in the input datasets for the current record, or record.previous.propertyName to access the value of the property in the previous record.",
"translations": [
{
"language": "DE",
"text": "Sie können zum Beispiel die Anweisung record.propertyName verwenden, um auf den Wert einer beliebigen Eigenschaft in den Eingabedatensätzen für den aktuellen Datensatz zuzugreifen, oder record.previous.propertyName, um auf den Wert der Eigenschaft im vorherigen Datensatz zuzugreifen.",
"updated": 1635355095733
}
]
},
{
"style": "Note",
"text": "The order in which dependencies are defined determines which one is the main data dependency.",
"updated": 1611429327162
"updated": 1611429327162,
"translations": [
{
"language": "DE",
"text": "Die Reihenfolge, in der die dependencies definiert werden, bestimmt, welche die Hauptdatenabhängigkeit ist.",
"updated": 1635355151609
}
]
},
{
"style": "Title",
"text": "Multiple Data Dependencies",
"updated": 1611430826204
"updated": 1611430826204,
"translations": [
{
"language": "DE",
"text": "Mehrere Data Dependencies:",
"updated": 1635355230718
}
]
},
{
"style": "Text",
"text": "The products object features a property for each data dependency, and each property is named with the pluralVariableName defined in the product’s configuration. Each property features an array with the dependency’s data collection."
"text": "The products object features a property for each data dependency, and each property is named with the pluralVariableName defined in the product’s configuration. Each property features an array with the dependency’s data collection.",
"translations": [
{
"language": "DE",
"text": "Das products-Objekt enthält eine Eigenschaft für jede Datenabhängigkeit, und jede Eigenschaft ist mit dem in der Produktkonfiguration definierten pluralVariableName benannt. Jede Eigenschaft enthält ein Array mit der Datensammlung der Abhängigkeit.",
"updated": 1635355293053
}
]
},
{
"style": "Text",
"text": "Data collections of different products may begin and end at different points in time. For example, it takes 20 candles to build the first bollingerBands object of the Bollinger Bands indicator, or 200 candles to build the first popularSMAs object of the SMA indicator. Therefore, the record in i position in the array of one product may not correspond to the same period of time of the record in the same position of a different product."
"text": "Data collections of different products may begin and end at different points in time. For example, it takes 20 candles to build the first bollingerBands object of the Bollinger Bands indicator, or 200 candles to build the first popularSMAs object of the SMA indicator. Therefore, the record in i position in the array of one product may not correspond to the same period of time of the record in the same position of a different product.",
"translations": [
{
"language": "DE",
"text": "Data collections für verschiedene Produkte können zu unterschiedlichen Zeitpunkten beginnen und enden. So dauert es beispielsweise 20 Kerzen, um das erste bollingerBands-Objekt des Bollinger Bands-Indikators zu erstellen, oder 200 Kerzen, um das erste popularSMAs-Objekt des SMA-Indikators zu erstellen. Daher entspricht der Datensatz an der Position \"i\" im Array eines Produkts möglicherweise nicht demselben Zeitraum wie der Datensatz an derselben Position eines anderen Produkts.",
"updated": 1635355398375
}
]
},
{
"style": "Subtitle",
"text": "getElement Function"
"text": "getElement Function",
"translations": [
{
"language": "DE",
"text": "\"getElement Function\" ",
"updated": 1635355493612
}
]
},
{
"style": "Text",
"text": "This function allows users to locate an object at a dataset whose objects does not have a begin and end property but instead, they have a timestamp property. It receives an arbitrary begin / end object and the function will search within the dependency dataset for the first record whose timestamp is whitin the begin and end of the received reference objet. For example, a user can get the News record that belong to a certain Candle object.",
"updated": 1621105823745
"updated": 1621105823745,
"translations": [
{
"language": "DE",
"text": "Diese Funktion ermöglicht es dem Benutzer, ein Objekt in einem Datensatz zu finden, dessen Objekte keine Anfangs- und Ende-Eigenschaft haben, sondern eine timestamp (Zeitstempel) Eigenschaft besitzen. Sie empfängt ein beliebiges Anfangs-/Endobjekt, und die Funktion sucht innerhalb des Abhängigkeitsdatensatzes nach dem ersten Datensatz, dessen Zeitstempel mit dem Anfang und Ende des empfangenen Referenzobjekts übereinstimmt. Zum Beispiel kann ein Benutzer die News-Datensätze abrufen, die zu einem bestimmten Candle object gehören.",
"updated": 1635355600885
}
]
},
{
"style": "Text",
"text": "The getElement function, which takes two parameters, may be used:",
"updated": 1621105837484
"updated": 1621105837484,
"translations": [
{
"language": "DE",
"text": "Die Funktion getElement, die zwei Parameter benötigt, kann so verwendet werden:",
"updated": 1635355644238
}
]
},
{
"style": "List",
"text": "The name of the data collection (pluralVariableName) you wish to consult."
"text": "The name of the data collection (pluralVariableName) you wish to consult.",
"translations": [
{
"language": "DE",
"text": "Der Name der Datensammlung (pluralVariableName) die Sie abfragen möchten.",
"updated": 1635355679335
}
]
},
{
"style": "List",
"text": "An object with begin and end properties, for example, the tenth candle."
"text": "An object with begin and end properties, for example, the tenth candle.",
"translations": [
{
"language": "DE",
"text": "Ein Objekt mit Anfangs- und Endeigenschaften, zum Beispiel die zehnte candle.",
"updated": 1635355699147
}
]
},
{
"style": "Text",
"text": "The function returns the record that matches the begin and end datetime of the second parameter."
"text": "The function returns the record that matches the begin and end datetime of the second parameter.",
"translations": [
{
"language": "DE",
"text": "Die Funktion gibt den Datensatz zurück, der mit dem Anfangs- und Enddatum des zweiten Parameters übereinstimmt.",
"updated": 1635355840137
}
]
},
{
"style": "Text",
"text": "This is an example from the Candle Patterns indicator, which has the candles product of the Candles Volumes indicator as the main data dependency:"
"text": "This is an example from the Candle Patterns indicator, which has the candles product of the Candles Volumes indicator as the main data dependency:",
"translations": [
{
"language": "DE",
"text": "Dies ist ein Beispiel aus dem Candle Patterns indicator, der das candle product des Candles Volumes indicator als Hauptdatenabhängigkeit hat:",
"updated": 1635355927938
}
]
},
{
"style": "Javascript",
@@ -117,7 +236,14 @@
{
"style": "Text",
"text": "Indicators might have parameters that influences it's calculations. These parameters are defined at the Product Definition config, and their values are set at the Process Instance config. Parameters are extracted at the Procedure Initialization Code. In order to facilitate this extraction we will create an object here that will be accesed from the Procedure Initialization with all parameters and their defined values.",
"updated": 1621105691314
"updated": 1621105691314,
"translations": [
{
"language": "DE",
"text": "Indikatoren können Parameter haben, die ihre Berechnungen beeinflussen. Diese Parameter werden in der Process Instance config definiert, und ihre Werte werden in der Process Instance config festgelegt. Die Parameter werden im Initialization Code der Prozedur extrahiert. Um diese Extraktion zu erleichtern, erstellen wir hier ein Objekt, auf das von der Procedure Initialization aus mit allen Parametern und ihren definierten Werten zugegriffen werden kann.",
"updated": 1635356111873
}
]
},
{
"style": "Text",
@@ -135,11 +261,25 @@
},
{
"style": "Text",
"text": "The output generated must be stored as new properties of the variable object, which is made available to record properties under the record definition node."
"text": "The output generated must be stored as new properties of the variable object, which is made available to record properties under the record definition node.",
"translations": [
{
"language": "DE",
"text": "Die erzeugten Ausgaben müssen als neue properties des variable object gespeichert werden, das den record properties unter dem record definition node zur Verfügung gestellt wird.",
"updated": 1635356249718
}
]
},
{
"style": "Text",
"text": "In the case of the data building procedure loop, the variable object may also be used to store and—later—retrieve information between different loop cycles, or even between different executions of the indicator process. Such a feature is not available in the calculations procedure loop, as the object does not persist beyond each loop in that context."
"text": "In the case of the data building procedure loop, the variable object may also be used to store and—later—retrieve information between different loop cycles, or even between different executions of the indicator process. Such a feature is not available in the calculations procedure loop, as the object does not persist beyond each loop in that context.",
"translations": [
{
"language": "DE",
"text": "Im Falle der data building procedure loop kann das variable object auch dazu verwendet werden, Informationen zwischen verschiedenen Schleifenzyklen oder sogar zwischen verschiedenen Ausführungen des indicator process zu speichern und später abzurufen. In der calculations procedure loop ist eine solche Funktion nicht verfügbar, da das object in diesem Kontext nicht über jede Schleife hinaus bestehen bleibt.",
"updated": 1635356359862
}
]
},
{
"style": "Title",
@@ -147,16 +287,37 @@
},
{
"style": "Text",
"text": "In time frames below one hour, the system allows to access data up to 48 hours in the past, relative to the current record. If more than 48-hours worth of data is required to produce the desired data building, then data must be stored into the variable object to be retrieved later on, as explained above."
"text": "In time frames below one hour, the system allows to access data up to 48 hours in the past, relative to the current record. If more than 48-hours worth of data is required to produce the desired data building, then data must be stored into the variable object to be retrieved later on, as explained above.",
"translations": [
{
"language": "DE",
"text": "In Zeiträumen von weniger als einer Stunde erlaubt das System den Zugriff auf Daten, die bis zu 48 Stunden in der Vergangenheit liegen, bezogen auf den aktuellen Datensatz. Werden mehr als 48 Stunden an Daten benötigt, um das gewünschte data building zu erstellen, müssen die Daten in dem variable object gespeichert werden, um später abgerufen werden zu können (wie oben erklärt).",
"updated": 1635356432924
}
]
},
{
"style": "Important",
"text": "Procedures may only access data up to 48 hours in the past counting from the datetime of the record being processed. For example, the calculation of a moving average spanning 100 periods requires temporarily storing data in an array, as the 45 minutes time frame needs 75-hours worth of data.",
"updated": 1611431032118
"updated": 1611431032118,
"translations": [
{
"language": "DE",
"text": "Verfahren können nur auf Daten zugreifen, die bis zu 48 Stunden in die Vergangenheit zurückreichen, gerechnet ab dem Datum des zu verarbeitenden Datensatzes. Die Berechnung eines gleitenden Durchschnitts (moving average), der sich über 100 Perioden erstreckt, erfordert beispielsweise die Zwischenspeicherung von Daten in einem Array, da für den Zeitrahmen von 45 Minuten Daten im Wert von 75 Stunden benötigt werden.",
"updated": 1635356514722
}
]
},
{
"style": "Text",
"text": "The following is an example of a procedure loop code, in particular, the code that calculates the Popular SMAs product of the Simple Moving Average (SMA) indicator. Notice how the output generated by the calculateSMA function is stored into the variable object, and how an array stored in the variable object is used to overcome the 48-hours data-access limitation of Multi-Priod-Daily time frames."
"text": "The following is an example of a procedure loop code, in particular, the code that calculates the Popular SMAs product of the Simple Moving Average (SMA) indicator. Notice how the output generated by the calculateSMA function is stored into the variable object, and how an array stored in the variable object is used to overcome the 48-hours data-access limitation of Multi-Priod-Daily time frames.",
"translations": [
{
"language": "DE",
"text": "Im Folgenden finden Sie ein Beispiel für einen procedure loop code, insbesondere den Code, der das Produkt Popular SMAs des Simple Moving Average (SMA) Indikators berechnet. Beachten Sie, wie die von der Funktion calculateSMA erzeugte Ausgabe im variable object gespeichert wird und wie ein im variable object gespeichertes Array verwendet wird, um die 48-Stunden-data-access limitation (Datenzugriffsbeschränkung) von Multi-Priod-Daily Zeitrahmen zu überwinden.",
"updated": 1635356663510
}
]
},
{
"style": "Javascript",
@@ -166,23 +327,58 @@
{
"style": "Title",
"text": "Irregular Periods",
"updated": 1611431066723
"updated": 1611431066723,
"translations": [
{
"language": "DE",
"text": "Irregular Periods (Irreguläre Perioden):",
"updated": 1635356682237
}
]
},
{
"style": "Text",
"text": "Occasionally, a one-to-one mapping of the periods of the data dependency with the periods of the resulting product does not exist. For example, in the case of the bollingerChannels product, using the bollingerBands as the main dependency. In such a case, the algorithm may read the 1-hour bollingerBands as input but the resulting object may span several hours."
"text": "Occasionally, a one-to-one mapping of the periods of the data dependency with the periods of the resulting product does not exist. For example, in the case of the bollingerChannels product, using the bollingerBands as the main dependency. In such a case, the algorithm may read the 1-hour bollingerBands as input but the resulting object may span several hours.",
"translations": [
{
"language": "DE",
"text": "Hin und wieder gibt es keine Eins-zu-Eins-Zuordnung zwischen den Perioden der Datenabhängigkeit und den Perioden des resultierenden Produkts. Zum Beispiel im Fall des bollingerChannels product, das die bollingerBands als main dependency verwendet. In einem solchen Fall kann der Algorithmus die 1-hour bollingerBands als Eingabe lesen, aber das resultierende object kann sich über mehrere Stunden erstrecken.",
"updated": 1635356783859
}
]
},
{
"style": "Text",
"text": "By default, the system pushes a record into the data collection for every loop. To build products that span several periods of the main dependency, you must make the push from within your own code."
"text": "By default, the system pushes a record into the data collection for every loop. To build products that span several periods of the main dependency, you must make the push from within your own code.",
"translations": [
{
"language": "DE",
"text": "Standardmäßig schiebt das System bei jeder Schleife einen Datensatz in die Datensammlung. Um Produkte zu erstellen, die sich über mehrere Perioden der Hauptabhängigkeit erstrecken, müssen Sie den Push in Ihrem eigenen Code durchführen.",
"updated": 1635356902606
}
]
},
{
"style": "Text",
"text": "When the system detects a push in the procedure loop code, it cancels the automatic push on each loop."
"text": "When the system detects a push in the procedure loop code, it cancels the automatic push on each loop.",
"translations": [
{
"language": "DE",
"text": "Wenn das System einen Push im Code der procedure loop feststellt, bricht es den automatischen Push in jeder Schleife ab.",
"updated": 1635356945154
}
]
},
{
"style": "Text",
"text": "The following example taken from the data building procedure loop of the Bollinger Channels Object indicator features several instances of arbitrary use of pushes."
"text": "The following example taken from the data building procedure loop of the Bollinger Channels Object indicator features several instances of arbitrary use of pushes.",
"translations": [
{
"language": "DE",
"text": "Das folgende Beispiel aus der Schleife der data building procedure loop des Bollinger Channels Object zeigt mehrere Beispiele für die willkürliche Verwendung von Pushs.",
"updated": 1635357060928
}
]
},
{
"style": "Javascript",
@@ -192,23 +388,58 @@
{
"style": "Title",
"text": "Managing Undefined Objects",
"updated": 1611431116629
"updated": 1611431116629,
"translations": [
{
"language": "DE",
"text": "Undefined Objects verwalten:",
"updated": 1635357087320
}
]
},
{
"style": "Text",
"text": "In many instances, objects may be undefined. For example, the first 199 candles in the data collection corresponding to a 200-period moving average may be undefined, as the data building procedure may only build the object once the 200th candle is evaluated."
"text": "In many instances, objects may be undefined. For example, the first 199 candles in the data collection corresponding to a 200-period moving average may be undefined, as the data building procedure may only build the object once the 200th candle is evaluated.",
"translations": [
{
"language": "DE",
"text": "In vielen Fällen können die Objekte undefiniert sein. Beispielsweise können die ersten 199 candles in der Datensammlung, die einem gleitenden 200-Perioden-Durchschnitt entsprechen, undefiniert sein, da die Datenerstellungsprozedur das Objekt möglicherweise erst nach der Auswertung der 200sten candle erstellt.",
"updated": 1635357128634
}
]
},
{
"style": "Text",
"text": "Storing undifined property values is highly undesirable, as that would likely produce errors downstream when others attempt to consume the products produced by the indicator. How to handle such circumstances is up to the developer."
"text": "Storing undifined property values is highly undesirable, as that would likely produce errors downstream when others attempt to consume the products produced by the indicator. How to handle such circumstances is up to the developer.",
"translations": [
{
"language": "DE",
"text": "Die Speicherung von undifined property values ist höchst unerwünscht, da dies wahrscheinlich zu Fehlern führen würde, wenn andere versuchen, die von dem indicator erzeugten Produkte zu konsumieren. Wie man mit solchen Umständen umgeht, bleibt dem Entwickler überlassen.",
"updated": 1635357275201
}
]
},
{
"style": "Text",
"text": "The Bollinger Channels Object example above features deliberate handling of undefined objects."
"text": "The Bollinger Channels Object example above features deliberate handling of undefined objects.",
"translations": [
{
"language": "DE",
"text": "Das obige Beispiel des Bollinger Channels Object zeichnet sich durch den bewussten Umgang mit undefinierten Objekten aus.",
"updated": 1635357307246
}
]
},
{
"style": "Text",
"text": "In the case of a 200-period moving average discussed above, the developer may want to produce an arbitrary estimation of the moving average for the first 199 candles, or simply set the value to zero for the first 199 candles. The later was the choice for the popularSMAs product as may be observed in the code of the initialization procedure:"
"text": "In the case of a 200-period moving average discussed above, the developer may want to produce an arbitrary estimation of the moving average for the first 199 candles, or simply set the value to zero for the first 199 candles. The later was the choice for the popularSMAs product as may be observed in the code of the initialization procedure:",
"translations": [
{
"language": "DE",
"text": "Im Falle des oben beschriebenen 200-period moving average kann der Entwickler eine beliebige Schätzung des gleitenden Durchschnitts für die ersten 199 Kerzen vornehmen oder den Wert für die ersten 199 Kerzen einfach auf Null setzen. Letzteres wurde für das Produkt popularSMAs gewählt, wie im Code der initialization procedure zu sehen ist:",
"updated": 1635357513374
}
]
},
{
"style": "Javascript",
@@ -30,7 +30,13 @@
{
"language": "DE",
"text": "Es gibt noch ein weiteres nützliches Werkzeug, um die Raumzeit zu manipulieren! \nDie Zoomfunktion des Browsers!",
"updated": 1634164815326
"updated": 1634164815326,
"style": "Definition"
},
{
"language": "NL",
"text": "Er is nog een hulpmiddel dat je wellicht nuttig vindt om de ruimtetijd te manipuleren! De zoom functie van de browser!",
"updated": 1635180926329
}
]
},
@@ -61,7 +67,13 @@
{
"language": "DE",
"text": "Manchmal möchten Sie vielleicht einen größeren Ausschnitt des Design Space visualisieren, als Ihr Bildschirm erlaubt.",
"updated": 1634164830952
"updated": 1634164830952,
"style": "Text"
},
{
"language": "NL",
"text": "Soms wil je grotere delen van de Design Space te visualiseren dan het scherm toelaat.",
"updated": 1635181009086
}
]
},
@@ -91,7 +103,13 @@
{
"language": "DE",
"text": "Drücken Sie Ctrl und scrollen Sie das Mausrad unter Windows oder <kbd>⌘</kbd> und <kbd>-</kbd> oder <kbd>+</kbd> unter Mac.",
"updated": 1634164874266
"updated": 1634164874266,
"style": "Callout"
},
{
"language": "NL",
"text": "Druk Ctrl in en scroll met je muiswiel op Windows of ⌘ en - of + op Mac.",
"updated": 1635181100849
}
]
},
@@ -125,7 +143,13 @@
{
"language": "DE",
"text": "Chrome zeigt die Zoomstufe in der oberen rechten Ecke an. Beim Vergrößern oder Verkleinern wird der Designbereich auf dem Bildschirm zentriert. Verwenden Sie die Karte des Designbereichs, um dorthin zurückzukehren, wo Sie waren.",
"updated": 1634164919327
"updated": 1634164919327,
"style": "Success"
},
{
"language": "NL",
"text": "Chrome geeft het zoomniveau aan in de rechterbovenhoek. Wanneer je in- of uitzoomt, wordt de ontwerpruimte gecentreerd op het scherm. Gebruik de kaart van de ontwerpruimte om terug te gaan naar waar je was gebleven.",
"updated": 1635181242967
}
]
}
@@ -30,7 +30,13 @@
{
"language": "DE",
"text": "Bevor wir wieder zur Sache kommen, möchte ich Ihnen ein paar Dinge darüber erzählen, wie wir-Tutorials funktionieren.",
"updated": 1634165352894
"updated": 1634165352894,
"style": "Definition"
},
{
"language": "NL",
"text": "Voordat we weer aan het werk gaan, wil ik je een paar dingen vertellen over hoe wij—tutorials—werken.",
"updated": 1635181366053
}
]
},
@@ -61,7 +67,13 @@
{
"language": "DE",
"text": "Kurz gesagt: Sie sind der Boss!",
"updated": 1634165360945
"updated": 1634165360945,
"style": "Success"
},
{
"language": "NL",
"text": "In het kort: Jij bent de baas!",
"updated": 1635181400130
}
]
},
@@ -85,7 +97,13 @@
{
"language": "DE",
"text": "Sie können ein Tutorial jederzeit unterbrechen und Schritte - oder ganze Themen - überspringen. Wenn Sie bereit sind, die Lektion fortzusetzen, finden Sie uns im unteren Bereich der Designfläche. Wählen Sie im Menü Resume , um dort anzufangen, wo Sie aufgehört haben, oder beim ersten Schritt, den Sie übersprungen haben. Wählen Sie Play , um von vorne zu beginnen!",
"updated": 1634165366034
"updated": 1634165366034,
"style": "Text"
},
{
"language": "NL",
"text": "Je kunt een tutorial onderbreken en stappen, of hele onderwerpen, op elk gewenst moment overslaan. Als je er klaar voor bent om de les weer op te pakken, vind je ons in het onderste deel van de ontwerpruimte. Klik op Resume in het menu om verder te gaan waar je was gebleven, of bij de eerste stap die je hebt overgeslagen. Klik op Play om vanaf het begin te beginnen!",
"updated": 1635181613391
}
]
},
@@ -114,7 +132,13 @@
{
"language": "DE",
"text": "Probieren wir das aus! Klicken Sie unten auf die Schaltfläche Stopp, und wenn ich weg bin, öffnen Sie mein Menü und wählen Sie Resume.",
"updated": 1634165372118
"updated": 1634165372118,
"style": "Callout"
},
{
"language": "NL",
"text": "Laten we dat eens proberen! Klik op onderstaande Stop knop, zodra ik weg ben, open mijn menu en klik op Resume.",
"updated": 1635181685751
}
]
}
@@ -30,7 +30,13 @@
{
"language": "DE",
"text": "An dieser Stelle werde ich wahrscheinlich Ihren Hippocampus überlaufen lassen! Aber keine Sorge... Sie können zu jedem früheren Schritt zurückgehen!",
"updated": 1634165475316
"updated": 1634165475316,
"style": "Definition"
},
{
"language": "NL",
"text": "Op dit punt, overspoel ik waarschijnlijk je hippocampus! Maak je geen zorgen... je kan teruggaan naar elke vorige stap!",
"updated": 1635181798322
}
]
},
@@ -60,7 +66,13 @@
{
"language": "DE",
"text": "Wenn Sie jemals eine Erinnerung an eines dieser Themen brauchen...",
"updated": 1634165486557
"updated": 1634165486557,
"style": "Text"
},
{
"language": "NL",
"text": "Heb je een reminder nodig over deze onderwerpen?",
"updated": 1635181965170
}
]
},
@@ -89,7 +101,13 @@
{
"language": "DE",
"text": "Suchen Sie ein Tutorial Topic ? Sie finden Tutorial am linken Rand des Design Space. Blättern Sie durch die Themen und Schritte und klicken Sie auf \"Abspielen\" bei einem Thema. Die Themen sind im Uhrzeigersinn angeordnet, beginnend auf der rechten Seite des Hauptknotens Tutorial.",
"updated": 1634165716356
"updated": 1634165716356,
"style": "List"
},
{
"language": "NL",
"text": "Vind een Tutorial Topic en speel het af! Je kan mij in de linkerbenedenhoek van de ontwerpruimte, vouw mij uit en loop door de hiërarchie van onderwerpen en stappen, kies je onderwerp en klik op Play. Onderwerpen zijn gerangschikt met de klok mee, startend rechts van de hoofdknoop van de Tutorial.",
"updated": 1635182170565
}
]
},
@@ -119,7 +137,13 @@
{
"language": "DE",
"text": "\"Need a Quick Reminder?\" Diesen Schritt finden Sie unter dem Thema \"Tutorials & Help\". Klicken Sie auf \"Stop\" und starten Sie erneut, indem Sie auf \"Play\" für den besagten Tutorial Step klicken!",
"updated": 1634165797400
"updated": 1634165797400,
"style": "Callout"
},
{
"language": "NL",
"text": "\"Need a Quick Reminder?\" Vind deze stap onder het \"Tutorials & Help\" onderwerp. Klik dan op Stop en herstart door op Play te klikken van de Tutorial Step!",
"updated": 1635182294956
}
]
}
@@ -122,7 +122,7 @@ function newCircularMenuItem() {
containerPhysics()
if(thisObject.booleanProperty !== undefined) {
if (thisObject.booleanProperty !== undefined) {
let config = JSON.parse(thisObject.payload.node.config)
if (config[thisObject.booleanProperty] === true) {
@@ -277,7 +277,7 @@ function newCircularMenuItem() {
temporaryStatus === STATUS_SECONDARY_WORK_FAILED
) && thisObject.secondaryAction !== undefined
) {
if(thisObject.iconProject !== undefined) {
if (thisObject.iconProject !== undefined) {
thisObject.iconOn = UI.projects.foundations.spaces.designSpace.getIconByProjectAndName(thisObject.iconProject, thisObject.secondaryIcon)
thisObject.iconOff = UI.projects.foundations.spaces.designSpace.getIconByProjectAndName(thisObject.iconProject, thisObject.secondaryIcon)
} else {
@@ -352,6 +352,7 @@ function newCircularMenuItem() {
}
function internalClick() {
if (thisObject.payload === undefined) { return }
if (thisObject.shorcutNumber !== undefined) {
let label = thisObject.payload.node.name + ' ' + labelToPrint
UI.projects.foundations.spaces.cockpitSpace.setStatus(label, 4, UI.projects.foundations.spaces.cockpitSpace.statusTypes.ALL_GOOD)
@@ -399,7 +400,7 @@ function newCircularMenuItem() {
let relatedNodeProject = thisObject.actionProject
if (thisObject.relatedUiObjectProject !== undefined) {
relatedNodeProject = thisObject.relatedUiObjectProject
}
}
thisObject.actionFunction(
{
@@ -304,7 +304,7 @@
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": true,
"isCollapsed": false,
"angleToParent": 2,
"distanceToParent": 3,
"arrangementStyle": 0
@@ -1064,7 +1064,7 @@
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": true,
"isCollapsed": false,
"angleToParent": 1,
"distanceToParent": 3,
"arrangementStyle": 0
File diff suppressed because it is too large. Load diff
@@ -27,11 +27,11 @@
"savedPayload": {
"position": {
"x": 8603.914169494044,
"y": 37400
"y": 32600
},
"targetPosition": {
"x": 8863.721790629375,
"y": 37550
"y": 32750
},
"floatingObject": {
"isPinned": false,
@@ -50,11 +50,11 @@
"savedPayload": {
"position": {
"x": 8863.721790629375,
"y": 37550
"y": 32750
},
"targetPosition": {
"x": 9123.529411764706,
"y": 37700
"y": 32900
},
"floatingObject": {
"isPinned": false,
@@ -72,7 +72,7 @@
"githubProgram": {
"type": "Github Program",
"name": "New Github Program",
"config": "{\n \"username\": \"Barrypair\",\n \"token\": \"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\"\n}",
"config": "{\n \"username\": \"Barrypair\",\n \"token\": \"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\"\n}",
"project": "Governance",
"tokensAwarded": {
"type": "Tokens Awarded",
@@ -82,11 +82,11 @@
"savedPayload": {
"position": {
"x": 9643.144654035368,
"y": 37400
"y": 32600
},
"targetPosition": {
"x": 9383.337032900037,
"y": 37550
"y": 32750
},
"floatingObject": {
"isPinned": false,
@@ -105,11 +105,11 @@
"savedPayload": {
"position": {
"x": 9383.337032900037,
"y": 37550
"y": 32750
},
"targetPosition": {
"x": 9123.529411764706,
"y": 37700
"y": 32900
},
"floatingObject": {
"isPinned": false,
@@ -128,11 +128,11 @@
"savedPayload": {
"position": {
"x": 9123.529411764706,
"y": 37700
"y": 32900
},
"targetPosition": {
"x": 9123.529411764706,
"y": 38000
"y": 33200
},
"floatingObject": {
"isPinned": false,
@@ -167,11 +167,11 @@
"savedPayload": {
"position": {
"x": 9123.529411764706,
"y": 37700
"y": 32900
},
"targetPosition": {
"x": 9423.529411764706,
"y": 37700
"y": 32900
},
"floatingObject": {
"isPinned": false,
@@ -208,11 +208,11 @@
"savedPayload": {
"position": {
"x": 9423.529411764706,
"y": 37400
"y": 32600
},
"targetPosition": {
"x": 9423.529411764706,
"y": 37700
"y": 32900
},
"floatingObject": {
"isPinned": false,
@@ -239,7 +239,7 @@
},
"targetPosition": {
"x": 9423.529411764706,
"y": 37700
"y": 32900
},
"floatingObject": {
"isPinned": true,
@@ -258,11 +258,11 @@
"savedPayload": {
"position": {
"x": 9423.529411764706,
"y": 37700
"y": 32900
},
"targetPosition": {
"x": 9423.529411764706,
"y": 38000
"y": 33200
},
"floatingObject": {
"isPinned": false,
@@ -296,7 +296,7 @@
},
"targetPosition": {
"x": 9723.529411764706,
"y": 38000
"y": 33200
},
"floatingObject": {
"isPinned": true,
@@ -333,11 +333,11 @@
"savedPayload": {
"position": {
"x": 10023.529411764706,
"y": 38000
"y": 33200
},
"targetPosition": {
"x": 9723.529411764706,
"y": 38000
"y": 33200
},
"floatingObject": {
"isPinned": false,
@@ -364,7 +364,7 @@
},
"targetPosition": {
"x": 9723.529411764706,
"y": 38000
"y": 33200
},
"floatingObject": {
"isPinned": true,
@@ -383,11 +383,11 @@
"savedPayload": {
"position": {
"x": 9723.529411764706,
"y": 38000
"y": 33200
},
"targetPosition": {
"x": 9423.529411764706,
"y": 38000
"y": 33200
},
"floatingObject": {
"isPinned": false,
@@ -417,11 +417,11 @@
"savedPayload": {
"position": {
"x": 9723.529411764706,
"y": 38300
"y": 33500
},
"targetPosition": {
"x": 9423.529411764706,
"y": 38300
"y": 33500
},
"floatingObject": {
"isPinned": false,
@@ -458,11 +458,11 @@
"savedPayload": {
"position": {
"x": 9423.529411764706,
"y": 38600
"y": 33800
},
"targetPosition": {
"x": 9423.529411764706,
"y": 38300
"y": 33500
},
"floatingObject": {
"isPinned": false,
@@ -489,7 +489,7 @@
},
"targetPosition": {
"x": 9423.529411764706,
"y": 38300
"y": 33500
},
"floatingObject": {
"isPinned": true,
@@ -508,11 +508,11 @@
"savedPayload": {
"position": {
"x": 9423.529411764706,
"y": 38300
"y": 33500
},
"targetPosition": {
"x": 9423.529411764706,
"y": 38000
"y": 33200
},
"floatingObject": {
"isPinned": false,
@@ -531,11 +531,11 @@
"savedPayload": {
"position": {
"x": 9423.529411764706,
"y": 38000
"y": 33200
},
"targetPosition": {
"x": 9123.529411764706,
"y": 38000
"y": 33200
},
"floatingObject": {
"isPinned": false,
@@ -559,11 +559,11 @@
"savedPayload": {
"position": {
"x": 9123.529411764706,
"y": 38300
"y": 33500
},
"targetPosition": {
"x": 9123.529411764706,
"y": 38000
"y": 33200
},
"floatingObject": {
"isPinned": false,
@@ -582,11 +582,11 @@
"savedPayload": {
"position": {
"x": 9123.529411764706,
"y": 38000
"y": 33200
},
"targetPosition": {
"x": 8823.529411764706,
"y": 38000
"y": 33200
},
"floatingObject": {
"isPinned": false,
@@ -609,11 +609,11 @@
"savedPayload": {
"position": {
"x": 8523.529411764706,
"y": 38000
"y": 33200
},
"targetPosition": {
"x": 8823.529411764706,
"y": 38000
"y": 33200
},
"floatingObject": {
"isPinned": false,
@@ -632,11 +632,11 @@
"savedPayload": {
"position": {
"x": 8823.529411764706,
"y": 38000
"y": 33200
},
"targetPosition": {
"x": 8823.529411764706,
"y": 38000
"y": 33200
},
"floatingObject": {
"isPinned": false,
@@ -26,12 +26,12 @@
"id": "40f63b98-548c-4efa-8351-263724b6564a",
"savedPayload": {
"position": {
"x": 13173,
"y": 9782.077136594007
"x": 28430.422176273078,
"y": 38479.62243846677
},
"targetPosition": {
"x": 13323,
"y": 10041.884757729338
"x": 28156.358538980297,
"y": 38601.643431389515
},
"floatingObject": {
"isPinned": false,
@@ -49,12 +49,12 @@
"id": "7ad53a0a-a266-447a-bc1a-27be8927fd28",
"savedPayload": {
"position": {
"x": 13323,
"y": 10041.884757729338
"x": 28156.358538980297,
"y": 38601.643431389515
},
"targetPosition": {
"x": 13473,
"y": 10301.692378864669
"x": 27882.294901687517,
"y": 38723.66442431226
},
"floatingObject": {
"isPinned": false,
@@ -81,12 +81,12 @@
"id": "6c9a3172-8723-4d4d-8836-ee64299db5dd",
"savedPayload": {
"position": {
"x": 14073,
"y": 10301.692378864669
"x": 28004.31589461026,
"y": 38997.72806160504
},
"targetPosition": {
"x": 13773,
"y": 10301.692378864669
"x": 27943.30539814889,
"y": 38860.69624295865
},
"floatingObject": {
"isPinned": false,
@@ -104,19 +104,19 @@
"id": "4a68f9e0-4122-48db-ab25-d159344af354",
"savedPayload": {
"position": {
"x": 13773,
"y": 10301.692378864669
"x": 27943.30539814889,
"y": 38860.69624295865
},
"targetPosition": {
"x": 13473,
"y": 10301.692378864669
"x": 27882.294901687517,
"y": 38723.66442431226
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 1,
"distanceToParent": 3,
"angleToParent": 2,
"distanceToParent": 2,
"arrangementStyle": 0
},
"uiObject": {
@@ -127,20 +127,20 @@
"id": "09ae0e39-1e64-4ad5-8bdd-9f399158de72",
"savedPayload": {
"position": {
"x": 13473,
"y": 10301.692378864669
"x": 27882.294901687517,
"y": 38723.66442431226
},
"targetPosition": {
"x": 13323,
"y": 10561.5
"x": 28125,
"y": 38300
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 1,
"angleToParent": 2,
"distanceToParent": 3,
"arrangementStyle": 0
"arrangementStyle": 1
},
"uiObject": {
"isRunning": false
@@ -160,30 +160,43 @@
"userReferrers": [
{
"type": "User Referrer",
"name": "",
"config": "{}",
"name": "EvaMaria70",
"config": " \"codeName\": \"EvaMaria70\"",
"project": "Governance",
"id": "19f8ecbf-2c85-4a90-bcf6-9f6946fab385",
"id": "6c177f63-755d-43dd-996d-2b49b43f0213",
"savedPayload": {
"position": {
"x": 13882.807621135331,
"y": 10931.115242270662
"x": 28780.615669307263,
"y": 39087.811413391595
},
"targetPosition": {
"x": 13623,
"y": 11081.115242270662
"x": 28556.30926921731,
"y": 39070.15811685283
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 1,
"distanceToParent": 3,
"angleToParent": 2,
"distanceToParent": 2,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
},
"referenceParent": {
"type": "User Profile",
"name": "EvaMaria70",
"id": "75a78d74-93f3-44c5-a96a-5b2b9f730afe"
},
"referenceParentCombinedNodePath": [
[
"EvaMaria70",
"User Profile",
"Governance",
"75a78d74-93f3-44c5-a96a-5b2b9f730afe"
]
]
}
}
],
@@ -194,19 +207,19 @@
"id": "0295ea28-3621-4809-95e6-a8571c42cb02",
"savedPayload": {
"position": {
"x": 13773,
"y": 11340.922863405993
"x": 28702.4350800916,
"y": 39241.249459112834
},
"targetPosition": {
"x": 13623,
"y": 11081.115242270662
"x": 28556.30926921731,
"y": 39070.15811685283
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 1,
"distanceToParent": 3,
"angleToParent": 2,
"distanceToParent": 2,
"arrangementStyle": 0
},
"uiObject": {
@@ -221,12 +234,470 @@
"id": "16de0f2b-1005-45d9-bb59-53dc156dfd0c",
"savedPayload": {
"position": {
"x": 13363.192378864669,
"y": 11231.115242270662
"x": 28547.482620947925,
"y": 39182.3113168978
},
"targetPosition": {
"x": 13623,
"y": 11081.115242270662
"x": 28556.30926921731,
"y": 39070.15811685283
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 2,
"distanceToParent": 1,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
},
"id": "e0801eee-7336-46c4-a715-022ea484d33b",
"savedPayload": {
"position": {
"x": 28556.30926921731,
"y": 39070.15811685283
},
"targetPosition": {
"x": 28264.057647468726,
"y": 38727.975432332816
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 3,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
},
"supportProgram": {
"type": "Support Program",
"name": "New Support Program",
"config": "{}",
"project": "Governance",
"userSupporters": [
{
"type": "User Supporter",
"name": "Luis-Fernando-Molina",
"config": "{}",
"project": "Governance",
"id": "e9140283-8828-459b-9034-35e63eeb74a2",
"savedPayload": {
"position": {
"x": 28911.02155129469,
"y": 39883.21260761206
},
"targetPosition": {
"x": 28472.644118671815,
"y": 39369.938580832044
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 3,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
},
"referenceParent": {
"type": "User Profile",
"name": "Luis-Fernando-Molina",
"id": "a8de78f0-c3e4-4a2a-b7e8-f659073969db"
},
"referenceParentCombinedNodePath": [
[
"Luis-Fernando-Molina",
"User Profile",
"Governance",
"a8de78f0-c3e4-4a2a-b7e8-f659073969db"
]
]
}
}
],
"tokensAwarded": {
"type": "Tokens Awarded",
"name": "New Tokens Awarded",
"project": "Governance",
"id": "5e61048d-2df0-4176-977c-aaf64b036fe1",
"savedPayload": {
"position": {
"x": 28681.230589874904,
"y": 40011.90172933127
},
"targetPosition": {
"x": 28472.644118671815,
"y": 39369.938580832044
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 3,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
},
"tokensBonus": {
"type": "Tokens Bonus",
"name": "New Tokens Bonus",
"project": "Governance",
"id": "3132f5c9-af4c-45c4-8d91-95d1aec8c182",
"savedPayload": {
"position": {
"x": 28419.684229055518,
"y": 40042.857781101906
},
"targetPosition": {
"x": 28472.644118671815,
"y": 39369.938580832044
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 3,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
},
"id": "ed2e4359-71d2-4cc8-afb4-bf01d06cbd2b",
"savedPayload": {
"position": {
"x": 28472.644118671815,
"y": 39369.938580832044
},
"targetPosition": {
"x": 28264.057647468726,
"y": 38727.975432332816
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 3,
"distanceToParent": 4,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
},
"mentorshipProgram": {
"type": "Mentorship Program",
"name": "New Mentorship Program",
"config": " \"codeName\": \"EvaMaria70\"",
"project": "Governance",
"userMentors": [
{
"type": "User Mentor",
"name": "gustavohcorradi",
"config": "{}",
"project": "Governance",
"id": "82f9e154-4da7-4077-b3d3-0fd60d5c255f",
"savedPayload": {
"position": {
"x": 28375.185181919536,
"y": 39361.500727451996
},
"targetPosition": {
"x": 28211.09775785243,
"y": 39400.89463260268
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 1,
"distanceToParent": 1,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
},
"referenceParent": {
"type": "User Profile",
"name": "gustavohcorradi",
"id": "96ccf2bc-e544-4b27-aa23-a7a734798fb4"
},
"referenceParentCombinedNodePath": [
[
"gustavohcorradi",
"User Profile",
"Governance",
"96ccf2bc-e544-4b27-aa23-a7a734798fb4"
]
]
}
},
{
"type": "User Mentor",
"name": "gitforkgit",
"config": "{}",
"project": "Governance",
"id": "9aa871e0-76b4-4db0-a96f-3230f01118a3",
"savedPayload": {
"position": {
"x": 28299.269390648245,
"y": 39544.77766033743
},
"targetPosition": {
"x": 28211.09775785243,
"y": 39400.89463260268
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 1,
"distanceToParent": 1,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
},
"referenceParent": {
"type": "User Profile",
"name": "gitforkgit",
"id": "a600818b-6702-4be1-94ea-46478a914cb4"
},
"referenceParentCombinedNodePath": [
[
"gitforkgit",
"User Profile",
"Governance",
"a600818b-6702-4be1-94ea-46478a914cb4"
]
]
}
}
],
"tokensAwarded": {
"type": "Tokens Awarded",
"name": "New Tokens Awarded",
"project": "Governance",
"id": "9f9e6fdf-f203-4161-b791-42c0718adc65",
"savedPayload": {
"position": {
"x": 28101.50339969671,
"y": 39529.21313929768
},
"targetPosition": {
"x": 28211.09775785243,
"y": 39400.89463260268
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 1,
"distanceToParent": 1,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
},
"tokensBonus": {
"type": "Tokens Bonus",
"name": "New Tokens Bonus",
"project": "Governance",
"id": "036aeb75-a628-410a-8397-906c652a2336",
"savedPayload": {
"position": {
"x": 28055.19308674115,
"y": 39336.31680339107
},
"targetPosition": {
"x": 28211.09775785243,
"y": 39400.89463260268
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 1,
"distanceToParent": 1,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
},
"id": "0de0c354-be16-4550-94af-5fb96f024632",
"savedPayload": {
"position": {
"x": 28211.09775785243,
"y": 39400.89463260268
},
"targetPosition": {
"x": 28264.057647468726,
"y": 38727.975432332816
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 3,
"distanceToParent": 4,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
},
"id": "923edd09-70dd-43b1-b7fa-40594299e37d",
"savedPayload": {
"position": {
"x": 28264.057647468726,
"y": 38727.975432332816
},
"targetPosition": {
"x": 28125,
"y": 38300
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 2,
"distanceToParent": 4,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
},
"votesAndClaimsPrograms": {
"type": "Votes And Claims Programs",
"name": "New Votes And Claims Programs",
"config": " \"codeName\": \"EvaMaria70\"",
"project": "Governance",
"id": "fe79f40b-9d30-4e86-bda2-1fd8a81599bf",
"savedPayload": {
"position": {
"x": 27948.664424312257,
"y": 38542.70509831249
},
"targetPosition": {
"x": 28125,
"y": 38300
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": true,
"angleToParent": 1,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
},
"financialPrograms": {
"type": "Financial Programs",
"name": "New Financial Programs",
"config": "{}",
"project": "Governance",
"stakingProgram": {
"type": "Staking Program",
"name": "New Staking Program",
"config": "{}",
"project": "Governance",
"tokensAwarded": {
"type": "Tokens Awarded",
"name": "New Tokens Awarded",
"project": "Governance",
"id": "6af397b6-cc73-4dc0-8c33-a2abd1745547",
"savedPayload": {
"position": {
"x": 27396.88470506255,
"y": 38829.00672706323
},
"targetPosition": {
"x": 27365.526166082254,
"y": 38530.65015845274
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 2,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
},
"id": "59357272-6ca3-4539-be7a-6f57e58f2709",
"savedPayload": {
"position": {
"x": 27365.526166082254,
"y": 38530.65015845274
},
"targetPosition": {
"x": 27882.294901687517,
"y": 38476.33557568774
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 1,
"distanceToParent": 3,
"arrangementStyle": 1
},
"uiObject": {
"isRunning": false
}
}
},
"delegationProgram": {
"type": "Delegation Program",
"name": "New Delegation Program",
"config": "{}",
"project": "Governance",
"delegatePowerSwitch": [],
"tokensBonus": {
"type": "Tokens Bonus",
"name": "New Tokens Bonus",
"project": "Governance",
"id": "805959aa-3810-43e8-8703-76736d28c526",
"savedPayload": {
"position": {
"x": 27334.167627101957,
"y": 38232.29358984226
},
"targetPosition": {
"x": 27608.231264394737,
"y": 38354.314582765
},
"floatingObject": {
"isPinned": false,
@@ -241,15 +712,15 @@
}
}
},
"id": "e0801eee-7336-46c4-a715-022ea484d33b",
"id": "2691fbbf-b284-4a88-8bd7-93a34e77413b",
"savedPayload": {
"position": {
"x": 13623,
"y": 11081.115242270662
"x": 27608.231264394737,
"y": 38354.314582765
},
"targetPosition": {
"x": 13473,
"y": 10821.307621135331
"x": 27882.294901687517,
"y": 38476.33557568774
},
"floatingObject": {
"isPinned": false,
@@ -264,21 +735,21 @@
}
}
},
"id": "923edd09-70dd-43b1-b7fa-40594299e37d",
"id": "0f1c339b-84a7-4056-8be1-219cecf4498d",
"savedPayload": {
"position": {
"x": 13473,
"y": 10821.307621135331
"x": 27882.294901687517,
"y": 38476.33557568774
},
"targetPosition": {
"x": 13323,
"y": 10561.5
"x": 28125,
"y": 38300
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 1,
"angleToParent": 2,
"distanceToParent": 3,
"arrangementStyle": 0
},
@@ -290,18 +761,18 @@
"id": "b96160c4-e1e8-4ad4-bbf6-a6cd35076877",
"savedPayload": {
"position": {
"x": 13323,
"y": 10561.5
"x": 28125,
"y": 38300
},
"targetPosition": {
"x": 13023,
"y": 10561.5
"x": 28125,
"y": 38000
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 1,
"angleToParent": 2,
"distanceToParent": 3,
"arrangementStyle": 0
},
@@ -317,12 +788,12 @@
"id": "f95822af-6480-47f6-9f64-93e3b0da64d5",
"savedPayload": {
"position": {
"x": 12723,
"y": 10561.5
"x": 27825,
"y": 38000
},
"targetPosition": {
"x": 13023,
"y": 10561.5
"x": 28125,
"y": 38000
},
"floatingObject": {
"isPinned": false,
@@ -340,17 +811,17 @@
"id": "75a78d74-93f3-44c5-a96a-5b2b9f730afe",
"savedPayload": {
"position": {
"x": 36065.57377049181,
"y": 12250
"x": 28125,
"y": 38000
},
"targetPosition": {
"x": 36065.57377049181,
"y": 12250
"x": 28125,
"y": 38000
},
"floatingObject": {
"isPinned": false,
"isPinned": true,
"isFrozen": false,
"isCollapsed": true,
"isCollapsed": false,
"angleToParent": 1,
"distanceToParent": 3,
"arrangementStyle": 0
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
@@ -26,12 +26,12 @@
"id": "2cd3a742-6540-4326-a3f5-8ad8da177ee6",
"savedPayload": {
"position": {
"x": 18900,
"y": 32420.577136594
"x": 23787.5,
"y": 37566.98729810778
},
"targetPosition": {
"x": 19050,
"y": 32680.384757729335
"x": 23837.5,
"y": 37653.58983848622
},
"floatingObject": {
"isPinned": false,
@@ -49,19 +49,19 @@
"id": "ee0124d9-1e12-4819-9dd9-bb1ca8840483",
"savedPayload": {
"position": {
"x": 19050,
"y": 32680.384757729335
"x": 23837.5,
"y": 37653.58983848622
},
"targetPosition": {
"x": 19200,
"y": 32940.19237886467
"x": 23887.5,
"y": 37740.19237886467
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 1,
"distanceToParent": 3,
"distanceToParent": 1,
"arrangementStyle": 0
},
"uiObject": {
@@ -81,12 +81,12 @@
"id": "49472434-c0b7-4561-adac-4c7709f79ac5",
"savedPayload": {
"position": {
"x": 19800,
"y": 32940.19237886467
"x": 24087.5,
"y": 37740.19237886467
},
"targetPosition": {
"x": 19500,
"y": 32940.19237886467
"x": 23987.5,
"y": 37740.19237886467
},
"floatingObject": {
"isPinned": false,
@@ -104,19 +104,19 @@
"id": "d83ff511-36ab-484d-a481-12118e29204f",
"savedPayload": {
"position": {
"x": 19500,
"y": 32940.19237886467
"x": 23987.5,
"y": 37740.19237886467
},
"targetPosition": {
"x": 19200,
"y": 32940.19237886467
"x": 23887.5,
"y": 37740.19237886467
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 1,
"distanceToParent": 3,
"distanceToParent": 1,
"arrangementStyle": 0
},
"uiObject": {
@@ -127,12 +127,12 @@
"id": "1cd251c3-5a87-435e-a262-42323aed0bc4",
"savedPayload": {
"position": {
"x": 19200,
"y": 32940.19237886467
"x": 23887.5,
"y": 37740.19237886467
},
"targetPosition": {
"x": 19050,
"y": 33200
"x": 23737.5,
"y": 38000
},
"floatingObject": {
"isPinned": false,
@@ -166,19 +166,19 @@
"id": "979ab0fb-ca96-4d93-876a-fb2499bf8aa6",
"savedPayload": {
"position": {
"x": 19407.294901687517,
"y": 33174.490666246784
"x": 23951.207363261266,
"y": 37975.85367703074
},
"targetPosition": {
"x": 19500,
"y": 33459.80762113533
"x": 24088.23918190766,
"y": 38036.86417349211
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 1,
"distanceToParent": 3,
"distanceToParent": 2,
"arrangementStyle": 0
},
"uiObject": {
@@ -207,19 +207,19 @@
"id": "487a8367-b662-4192-b053-4335d6be8089",
"savedPayload": {
"position": {
"x": 19742.705098312483,
"y": 33283.47204544759
"x": 24103.918451397807,
"y": 37887.68588918687
},
"targetPosition": {
"x": 19500,
"y": 33459.80762113533
"x": 24088.23918190766,
"y": 38036.86417349211
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 1,
"distanceToParent": 3,
"distanceToParent": 2,
"arrangementStyle": 0
},
"uiObject": {
@@ -248,19 +248,19 @@
"id": "0ab1e6ee-9db2-463f-a347-71940500475e",
"savedPayload": {
"position": {
"x": 19742.705098312483,
"y": 33636.143196823075
"x": 24186.053941981037,
"y": 38016.07300441033
},
"targetPosition": {
"x": 19500,
"y": 33459.80762113533
"x": 24088.23918190766,
"y": 38036.86417349211
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 1,
"distanceToParent": 3,
"distanceToParent": 1,
"arrangementStyle": 0
},
"uiObject": {
@@ -275,19 +275,19 @@
"id": "f93b30b2-f600-43be-875a-86407b7b573f",
"savedPayload": {
"position": {
"x": 19407.294901687517,
"y": 33745.12457602388
"x": 24138.23918190766,
"y": 38123.466713870555
},
"targetPosition": {
"x": 19500,
"y": 33459.80762113533
"x": 24088.23918190766,
"y": 38036.86417349211
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 1,
"distanceToParent": 3,
"distanceToParent": 1,
"arrangementStyle": 0
},
"uiObject": {
@@ -298,12 +298,12 @@
"id": "889d794d-6a98-4ae2-b81c-b1786ee37b35",
"savedPayload": {
"position": {
"x": 19500,
"y": 33459.80762113533
"x": 24088.23918190766,
"y": 38036.86417349211
},
"targetPosition": {
"x": 19200,
"y": 33459.80762113533
"x": 23887.5,
"y": 38259.80762113533
},
"floatingObject": {
"isPinned": false,
@@ -323,7 +323,129 @@
"name": "New Support Program",
"config": "{}",
"project": "Governance",
"userSupporters": [],
"userSupporters": [
{
"type": "User Supporter",
"name": "Luis-Fernando-Molina",
"config": "{}",
"project": "Governance",
"id": "6d4b14d3-695c-428b-b41b-826ce8e8bd1b",
"savedPayload": {
"position": {
"x": 24275.07655170395,
"y": 38219.071684061586
},
"targetPosition": {
"x": 24298.595455939172,
"y": 38442.839110519446
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 1,
"distanceToParent": 2,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
},
"referenceParent": {
"type": "User Profile",
"name": "Luis-Fernando-Molina",
"id": "a8de78f0-c3e4-4a2a-b7e8-f659073969db"
},
"referenceParentCombinedNodePath": [
[
"Luis-Fernando-Molina",
"User Profile",
"Governance",
"a8de78f0-c3e4-4a2a-b7e8-f659073969db"
]
]
}
},
{
"type": "User Supporter",
"name": "harrellbm",
"config": "{}",
"project": "Governance",
"id": "d0f05827-7f94-489a-8324-e3dcc62cd66e",
"savedPayload": {
"position": {
"x": 24480.624279673535,
"y": 38310.58742875364
},
"targetPosition": {
"x": 24298.595455939172,
"y": 38442.839110519446
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 1,
"distanceToParent": 2,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
},
"referenceParent": {
"type": "User Profile",
"name": "harrellbm",
"id": "3af73d3b-7c0e-4de7-a1e1-a72238081740"
},
"referenceParentCombinedNodePath": [
[
"harrellbm",
"User Profile",
"Governance",
"3af73d3b-7c0e-4de7-a1e1-a72238081740"
]
]
}
},
{
"type": "User Supporter",
"name": "end-debug",
"config": "{}",
"project": "Governance",
"id": "a8f0dbfe-cc0b-457e-8c22-6bf1e78d3a5d",
"savedPayload": {
"position": {
"x": 24504.143183908756,
"y": 38534.3548552115
},
"targetPosition": {
"x": 24298.595455939172,
"y": 38442.839110519446
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 1,
"distanceToParent": 2,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
},
"referenceParent": {
"type": "User Profile",
"name": "end-debug",
"id": "2ba902c6-59f4-40f4-91f5-44d12f807061"
},
"referenceParentCombinedNodePath": [
[
"end-debug",
"User Profile"
]
]
}
}
],
"tokensAwarded": {
"type": "Tokens Awarded",
"name": "New Tokens Awarded",
@@ -331,19 +453,19 @@
"id": "de8ab30a-7777-420e-80ff-fa4a3fc37e75",
"savedPayload": {
"position": {
"x": 19200,
"y": 33979.422863406
"x": 24310.354908056783,
"y": 38554.72282374838
},
"targetPosition": {
"x": 19050,
"y": 33719.615242270665
"x": 24298.595455939172,
"y": 38442.839110519446
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 1,
"distanceToParent": 3,
"distanceToParent": 1,
"arrangementStyle": 0
},
"uiObject": {
@@ -358,19 +480,19 @@
"id": "c6bc8cb9-1d39-431e-a462-7965a54df591",
"savedPayload": {
"position": {
"x": 18750,
"y": 33719.615242270665
"x": 24207.58104407199,
"y": 38508.96495140235
},
"targetPosition": {
"x": 19050,
"y": 33719.615242270665
"x": 24298.595455939172,
"y": 38442.839110519446
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 1,
"distanceToParent": 3,
"distanceToParent": 1,
"arrangementStyle": 0
},
"uiObject": {
@@ -381,12 +503,301 @@
"id": "7c573389-95d7-4b3f-88aa-35fd61f474f6",
"savedPayload": {
"position": {
"x": 19050,
"y": 33719.615242270665
"x": 24298.595455939172,
"y": 38442.839110519446
},
"targetPosition": {
"x": 19200,
"y": 33459.80762113533
"x": 23887.5,
"y": 38259.80762113533
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 1,
"distanceToParent": 4,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
},
"mentorshipProgram": {
"type": "Mentorship Program",
"name": "New Mentorship Program",
"config": "{}",
"project": "Governance",
"userMentors": [
{
"type": "User Mentor",
"name": "EvaMaria70",
"config": "{}",
"project": "Governance",
"id": "482f067b-cfe5-451b-a8cf-6cfa1c484f97",
"savedPayload": {
"position": {
"x": 24002.863601129775,
"y": 38526.977436123154
},
"targetPosition": {
"x": 23856.141461019703,
"y": 38558.16418974582
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 1,
"distanceToParent": 2,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
},
"referenceParent": {
"type": "User Profile",
"name": "EvaMaria70",
"id": "75a78d74-93f3-44c5-a96a-5b2b9f730afe"
},
"referenceParentCombinedNodePath": [
[
"EvaMaria70",
"User Profile",
"Governance",
"75a78d74-93f3-44c5-a96a-5b2b9f730afe"
]
]
}
},
{
"type": "User Mentor",
"name": "gitforkgit",
"config": "{}",
"project": "Governance",
"id": "8592901e-bbf7-44b5-8312-c4c841eedfc4",
"savedPayload": {
"position": {
"x": 23931.141461019703,
"y": 38688.068000313484
},
"targetPosition": {
"x": 23856.141461019703,
"y": 38558.16418974582
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 1,
"distanceToParent": 2,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
},
"referenceParent": {
"type": "User Profile",
"name": "gitforkgit",
"id": "a600818b-6702-4be1-94ea-46478a914cb4"
},
"referenceParentCombinedNodePath": [
[
"gitforkgit",
"User Profile",
"Governance",
"a600818b-6702-4be1-94ea-46478a914cb4"
]
]
}
}
],
"tokensAwarded": {
"type": "Tokens Awarded",
"name": "New Tokens Awarded",
"project": "Governance",
"id": "275cf592-9482-4562-8b61-92eb015b767d",
"savedPayload": {
"position": {
"x": 23789.228400383818,
"y": 38632.47867229356
},
"targetPosition": {
"x": 23856.141461019703,
"y": 38558.16418974582
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 1,
"distanceToParent": 1,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
},
"tokensBonus": {
"type": "Tokens Bonus",
"name": "New Tokens Bonus",
"project": "Governance",
"id": "bbba9c19-40e5-4a57-b401-b6c1f14658a7",
"savedPayload": {
"position": {
"x": 23764.78691525544,
"y": 38517.49052543824
},
"targetPosition": {
"x": 23856.141461019703,
"y": 38558.16418974582
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 1,
"distanceToParent": 1,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
},
"id": "c3bd2096-e3d4-406b-9a70-a4159fbe604c",
"savedPayload": {
"position": {
"x": 23856.141461019703,
"y": 38558.16418974582
},
"targetPosition": {
"x": 23887.5,
"y": 38259.80762113533
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 1,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
},
"influencerProgram": {
"type": "Influencer Program",
"name": "New Influencer Program",
"config": "{}",
"project": "Governance",
"userInfluencers": [
{
"type": "User Influencer",
"name": "gustavohcorradi",
"config": "{}",
"project": "Governance",
"id": "d2d1ed6a-bd24-430f-a741-6d4f4f85bee9",
"savedPayload": {
"position": {
"x": 23614.846888861633,
"y": 38419.99588845404
},
"targetPosition": {
"x": 23594.05571977986,
"y": 38322.18112838066
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 1,
"distanceToParent": 1,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
},
"referenceParent": {
"type": "User Profile",
"name": "gustavohcorradi",
"id": "96ccf2bc-e544-4b27-aa23-a7a734798fb4"
},
"referenceParentCombinedNodePath": [
[
"gustavohcorradi",
"User Profile"
]
]
}
}
],
"tokensAwarded": {
"type": "Tokens Awarded",
"name": "New Tokens Awarded",
"project": "Governance",
"id": "46ff784b-42a0-4f40-80e7-837c3fe94ee2",
"savedPayload": {
"position": {
"x": 23496.24095970648,
"y": 38342.97229746244
},
"targetPosition": {
"x": 23594.05571977986,
"y": 38322.18112838066
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 1,
"distanceToParent": 1,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
},
"tokensBonus": {
"type": "Tokens Bonus",
"name": "New Tokens Bonus",
"project": "Governance",
"id": "121324a1-cc59-4e5a-bb33-a0b87230ecb5",
"savedPayload": {
"position": {
"x": 23573.264550698084,
"y": 38224.36636830728
},
"targetPosition": {
"x": 23594.05571977986,
"y": 38322.18112838066
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 1,
"distanceToParent": 1,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
},
"id": "97d2f4d6-283a-4bce-8820-9b24f683587b",
"savedPayload": {
"position": {
"x": 23594.05571977986,
"y": 38322.18112838066
},
"targetPosition": {
"x": 23887.5,
"y": 38259.80762113533
},
"floatingObject": {
"isPinned": false,
@@ -404,12 +815,12 @@
"id": "b7c934fd-8031-4615-bf9c-94280e452511",
"savedPayload": {
"position": {
"x": 19200,
"y": 33459.80762113533
"x": 23887.5,
"y": 38259.80762113533
},
"targetPosition": {
"x": 19050,
"y": 33200
"x": 23737.5,
"y": 38000
},
"floatingObject": {
"isPinned": false,
@@ -427,12 +838,12 @@
"id": "b70247f5-4442-4433-b35f-aa64a2f7c174",
"savedPayload": {
"position": {
"x": 19050,
"y": 33200
"x": 23737.5,
"y": 38000
},
"targetPosition": {
"x": 18750,
"y": 33200
"x": 23437.5,
"y": 38000
},
"floatingObject": {
"isPinned": false,
@@ -454,12 +865,12 @@
"id": "899f92f8-5e00-42a0-8316-10c95dd2a6b1",
"savedPayload": {
"position": {
"x": 18450,
"y": 33200
"x": 23137.5,
"y": 38000
},
"targetPosition": {
"x": 18750,
"y": 33200
"x": 23437.5,
"y": 38000
},
"floatingObject": {
"isPinned": false,
@@ -477,12 +888,12 @@
"id": "96ccf2bc-e544-4b27-aa23-a7a734798fb4",
"savedPayload": {
"position": {
"x": 18750,
"y": 33200
"x": 23437.5,
"y": 38000
},
"targetPosition": {
"x": 18750,
"y": 33200
"x": 23437.5,
"y": 38000
},
"floatingObject": {
"isPinned": true,
File diff suppressed because it is too large. Load diff
@@ -2,7 +2,15 @@
"type": "Claim",
"definition": {
"text": "The token distribution is based on claims made by contributors that they have done something for the project. Anyone can make a claim, but without votes from the community, that claim will not be rewareded with tokens. ",
"updated": 1623007004449
"updated": 1623007004449,
"translations": [
{
"language": "ES",
"text": "La distribución de token está basada en solicitudes hechas por los contribuyentes que han hecho algo por el proyecto. Cualquiera puede hacer una solicitud, pero sin votos de la comunidad, esa solicitud no será recompensada con tokens.",
"updated": 1635268483932,
"style": "Definition"
}
]
},
"paragraphs": [
{
@@ -12,7 +20,15 @@
},
{
"style": "Text",
"text": "Assets, Features, Positions, etc. defines rewards offered to contributors by the community. Contributors later needs to make claims to get those rewards, and it is the same community the one who desides which claims to support with their votes."
"text": "Assets, Features, Positions, etc. defines rewards offered to contributors by the community. Contributors later needs to make claims to get those rewards, and it is the same community the one who desides which claims to support with their votes.",
"translations": [
{
"language": "ES",
"text": "Assets, Features, Positions, etc. definen recompensas ofrecidas a los contribuyentes por la comunidad. Luego los contribuyentes necesitan hacer las solicitudes para obtener esas recompensas, y es la misma comunidad la que decide que solicitudes apoyar con sus votos.",
"updated": 1635268812622,
"style": "Text"
}
]
},
{
"style": "Title",
@@ -20,33 +36,89 @@
},
{
"style": "List",
"text": "1. Weight Votes: The community uses Weight Votes to define what is more important. "
"text": "1. Weight Votes: The community uses Weight Votes to define what is more important. ",
"translations": [
{
"language": "ES",
"text": "1. Weight Votes: La comunidad utiliza Weight Votes para definir que es más importante.",
"updated": 1635268885129,
"style": "List"
}
]
},
{
"style": "List",
"text": "2. Weights: These Weight Votes: end up generating a weight for each relevant node."
"text": "2. Weights: These Weight Votes: end up generating a weight for each relevant node.",
"translations": [
{
"language": "ES",
"text": "2. Weights: Estos Weight Votes: terminan generando un peso para cada nodo relevante.",
"updated": 1635268940212,
"style": "List"
}
]
},
{
"style": "List",
"text": "3. Token Rewards: Based on Weights, Token Rewards are calculated. ",
"updated": 1623007443739
"updated": 1623007443739,
"translations": [
{
"language": "ES",
"text": "3. Token Rewards: Basado en Weights, se calculan los Token Rewards.",
"updated": 1635268980023,
"style": "List"
}
]
},
{
"style": "List",
"text": "4. Claims: Contributos post claims towards Token Rewards."
"text": "4. Claims: Contributos post claims towards Token Rewards.",
"translations": [
{
"language": "ES",
"text": "4. Claims: Contribuyentes publican solicitudes para Token Rewards.",
"updated": 1635269117070,
"style": "List"
}
]
},
{
"style": "List",
"text": "5. Claims Votes: The community vote on claims that believe are true."
"text": "5. Claims Votes: The community vote on claims that believe are true.",
"translations": [
{
"language": "ES",
"text": "5. Claims Votes: La comunidad vota en solicitudes que considera que son verdaderas.",
"updated": 1635269164919,
"style": "List"
}
]
},
{
"style": "List",
"text": "6. Token Awarded: Based on all claims towards each Token Rewards, Token Awarded is calculated for each Claim.",
"updated": 1623007602133
"updated": 1623007602133,
"translations": [
{
"language": "ES",
"text": "6. Token Awarded: Basados en todas las solicitudes hacia cada Token Rewards, Token Awarded se calcula para cada solicitud.",
"updated": 1635269451905,
"style": "List"
}
]
},
{
"style": "List",
"text": "7. Token Distribution: The distribution is made to users based on the Tokens Awarded to each of their claims."
"text": "7. Token Distribution: The distribution is made to users based on the Tokens Awarded to each of their claims.",
"translations": [
{
"language": "ES",
"text": "7. Token Distribution: La distribución se hace a los usuarios basada en los Tokens Awarded a cada una de sus solicitudes.",
"updated": 1635325051083,
"style": "List"
}
]
},
{
"style": "Title",
@@ -18,7 +18,7 @@
"iconPathOn": "test-entity",
"iconPathOff": "test-entity",
"actionFunction": "payload.executeAction",
"actionProject": "SocialBots"
"actionProject": "Social-Bots"
},
{
"action": "Delete UI Object",
@@ -41,4 +41,4 @@
},
"childrenNodesProperties": [],
"propertyNameAtParent": "discordBots"
}
}
@@ -18,7 +18,7 @@
"iconPathOn": "test-entity",
"iconPathOff": "test-entity",
"actionFunction": "payload.executeAction",
"actionProject": "SocialBots"
"actionProject": "Social-Bots"
},
{
"action": "Delete UI Object",
@@ -41,4 +41,4 @@
},
"childrenNodesProperties": [],
"propertyNameAtParent": "slackBots"
}
}
@@ -26,7 +26,7 @@
"iconPathOn": "test-entity",
"iconPathOff": "test-entity",
"actionFunction": "payload.executeAction",
"actionProject": "SocialBots"
"actionProject": "Social-Bots"
},
{
"action": "Delete UI Object",
@@ -57,4 +57,4 @@
}
],
"propertyNameAtParent": "telegramBots"
}
}
@@ -26,7 +26,7 @@
"iconPathOn": "test-entity",
"iconPathOff": "test-entity",
"actionFunction": "payload.executeAction",
"actionProject": "SocialBots"
"actionProject": "Social-Bots"
},
{
"action": "Delete UI Object",
@@ -40,7 +40,7 @@
}
],
"initialValues": {
"config": "{ \n\"botToken\": \"Paste the bot token obtained from Twitter \",\n}"
"config": "{\n \"consumer_key\": \"TWITTER_CONSUMER_KEY\",\n \"consumer_secret\": \"TWITTER_CONSUMER_SECRET\",\n \"access_token_key\": \"TWITTER_ACCESS_TOKEN_KEY\",\n \"access_token_secret\": \"TWITTER_ACCESS_TOKEN_SECRET\"\n}"
},
"addLeftIcons": true,
"level": 3,
@@ -57,4 +57,4 @@
}
],
"propertyNameAtParent": "twitterBots"
}
}
@@ -28,7 +28,7 @@ exports.newSocialBotsBotModulesSocialBots = function (processIndex) {
socialBot.botInstance = TS.projects.socialBots.botModules.slackBot.newSocialBotsBotModulesSlackBot(processIndex)
socialBot.botInstance.initialize(config)
} else if (socialBot.type === "Twitter Bot") {
socialBot.botInstance = TS.projects.socialBots.botModules.slackBot.newSocialBotsBotModulesTwitterBot(processIndex)
socialBot.botInstance = TS.projects.socialBots.botModules.twitterBot.newSocialBotsBotModulesTwitterBot(processIndex)
socialBot.botInstance.initialize(config)
}
}
@@ -44,7 +44,7 @@ exports.newSocialBotsBotModulesSocialBots = function (processIndex) {
try {
if (socialBot.type === "Telegram Bot") {
socialBot.botInstance.telegramAPI.sendMessage(socialBot.botInstance.chatId, text).catch(err => TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME, "[WARN] initialize -> initializeSocialBots -> announce -> Telegram API error -> err = " + err))
} else if (socialBot.type === "Discord Bot" || socialBot.type === "Slack Bot") {
} else if (socialBot.type === "Discord Bot" || socialBot.type === "Slack Bot" || socialBot.type === "Twitter Bot") {
socialBot.botInstance.sendMessage(text).catch(err => TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME, "[WARN] initialize -> initializeSocialBots -> announce -> Discord Bot error -> err = " + err))
}
} catch (err) {
@@ -67,7 +67,7 @@ exports.newSocialBotsBotModulesSocialBots = function (processIndex) {
if (TS.projects.foundations.globals.processConstants.CONSTANTS_BY_PROCESS_INDEX_MAP.get(processIndex).SESSION_NODE.socialBots[prop] !== undefined) {
for (let i = 0; i < TS.projects.foundations.globals.processConstants.CONSTANTS_BY_PROCESS_INDEX_MAP.get(processIndex).SESSION_NODE.socialBots[prop].length; i++) {
let socialBot = TS.projects.foundations.globals.processConstants.CONSTANTS_BY_PROCESS_INDEX_MAP.get(processIndex).SESSION_NODE.socialBots[prop][i]
if (socialBot.type === "Telegram Bot" || socialBot.type === "Discord Bot" || socialBot.type === "Slack Bot") {
if (socialBot.type === "Telegram Bot" || socialBot.type === "Discord Bot" || socialBot.type === "Slack Bot" || socialBot.type === "Twitter Bot") {
socialBot.botInstance.finalize()
}
}
@@ -83,7 +83,7 @@ exports.newSocialBotsBotModulesSocialBots = function (processIndex) {
if (TS.projects.foundations.globals.processConstants.CONSTANTS_BY_PROCESS_INDEX_MAP.get(processIndex).SESSION_NODE.socialBots[prop] !== undefined) {
for (let i = 0; i < TS.projects.foundations.globals.processConstants.CONSTANTS_BY_PROCESS_INDEX_MAP.get(processIndex).SESSION_NODE.socialBots[prop].length; i++) {
let socialBot = TS.projects.foundations.globals.processConstants.CONSTANTS_BY_PROCESS_INDEX_MAP.get(processIndex).SESSION_NODE.socialBots[prop][i]
if (socialBot.type === "Telegram Bot" || socialBot.type === "Discord Bot" || socialBot.type === "Slack Bot") {
if (socialBot.type === "Telegram Bot" || socialBot.type === "Discord Bot" || socialBot.type === "Slack Bot" || socialBot.type === "Twitter Bot") {
socialBot.botInstance.sendMessage(message)
}
}
@@ -5,7 +5,7 @@ exports.newSocialBotsBotModulesTwitterBot = function (processIndex) {
let thisObject = {
taskParameters: undefined,
format: undefined,
twitterclient: undefined,
twitterClient: undefined,
sendMessage: sendMessage,
initialize: initialize,
finalize: finalize
@@ -35,20 +35,30 @@ exports.newSocialBotsBotModulesTwitterBot = function (processIndex) {
access_token_secret = process.env.TWITTER_ACCESS_TOKEN_SECRET
}
var twitterclient = new Twitter({
if (!consumer_key) {
logError("consumer_key must be set")
}
if (!consumer_secret) {
logError("consumer_secret must be set")
}
if (!access_token_key) {
logError("access_token_key must be set")
}
if (!access_token_secret) {
logError("access_token_secret must be set")
}
var twitterClient = new Twitter({
consumer_key: consumer_key,
consumer_secret: consumer_secret,
access_token_key: access_token_key,
access_token_secret: access_token_secret
});
thisObject.twitterclient = twitterclient
thisObject.twitterClient = twitterClient
try {
thisObject.taskParameters = {
exchange: TS.projects.foundations.globals.taskConstants.TASK_NODE.parentNode.parentNode.parentNode.referenceParent.parentNode.parentNode.name,
market: TS.projects.foundations.globals.taskConstants.TASK_NODE.parentNode.parentNode.parentNode.referenceParent.baseAsset.referenceParent.config.codeName +
'/' +
TS.projects.foundations.globals.taskConstants.TASK_NODE.parentNode.parentNode.parentNode.referenceParent.quotedAsset.referenceParent.config.codeName
market: `${TS.projects.foundations.globals.taskConstants.TASK_NODE.parentNode.parentNode.parentNode.referenceParent.baseAsset.referenceParent.config.codeName}/${TS.projects.foundations.globals.taskConstants.TASK_NODE.parentNode.parentNode.parentNode.referenceParent.quotedAsset.referenceParent.config.codeName}`
}
if (config.format === undefined) {
thisObject.format = "%{MESSAGE}"
@@ -58,23 +68,23 @@ exports.newSocialBotsBotModulesTwitterBot = function (processIndex) {
} catch (err) {
logError("initialize -> err = " + err.stack);
}
}
function finalize() {}
function sendMessage(message) {
try {
message = formatMessage(message)
message = JSON.stringify({status: message})
message = {status: formatMessage(message)}
} catch (err) {
logError("announce -> Twitter JSON message error -> err = " + err)
}
console.log(thisObject.twitterClient)
thisObject.twitterclient.post('statuses/update', message, function(error, tweet, response) {
if(error) throw error;
console.log(tweet); // Tweet body.
console.log(response); // Raw response object.
thisObject.twitterClient.post('statuses/update', message, function(error) {
if(error) {
logError(error)
throw error
}
});
}
@@ -94,4 +104,4 @@ exports.newSocialBotsBotModulesTwitterBot = function (processIndex) {
function logError(message) {
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME, '[ERROR] ' + message)
}
}
}
@@ -186,6 +186,49 @@ function newSocialBotsFunctionLibrarySocialBotsFunctions() {
}
function sendTwitterTestMessage(node, callBackFunction) {
let message = JSON.stringify({text: "Test message from Superalgos!"})
let url = "https://api.twitter.com/1.1/statuses/update.json"
httpRequestJSON(message, url, onResponse)
function onResponse(err) {
if (err.result === GLOBAL.DEFAULT_OK_RESPONSE.result) {
node.payload.uiObject.setInfoMessage('Twitter status update sent.')
callBackFunction(GLOBAL.DEFAULT_OK_RESPONSE)
} else {
node.payload.uiObject.setErrorMessage('Could not send Twitter status update. Error Response: ' + err.message)
callBackFunction(GLOBAL.DEFAULT_FAIL_RESPONSE)
}
}
function httpRequestJSON(pContentToSend, pPath, callBackFunction) {
let xmlHttpRequest = new XMLHttpRequest();
xmlHttpRequest.onreadystatechange = function () {
if (this.readyState === 4 && this.status === 200) {
callBackFunction(GLOBAL.DEFAULT_OK_RESPONSE, xmlHttpRequest.responseText);
return;
} else if (this.readyState === 4 && (this.status === 404 || this.status === 401 || this.status === 400)) {
callBackFunction({
result: "Fail",
message: xmlHttpRequest.responseText
});
return;
}
};
if (pContentToSend === undefined) {
xmlHttpRequest.open("GET", pPath, true);
xmlHttpRequest.send();
} else {
try {
let blob = new Blob([pContentToSend]);
xmlHttpRequest.open("POST", pPath, true);
xmlHttpRequest.send(blob);
} catch (err) {
if (ERROR_LOG === true) { console.log(spacePad(MODULE_NAME, 50) + " : " + "[ERROR] callServer -> err.message = " & err.message); }
callBackFunction({ result: "Fail", message: err.message })
}
}
}
}
}
+1 -1
View File
@@ -72,7 +72,7 @@ app.on('activate', function () {
function create_menus () {
const template = [
{
label: app.getName(),
label: 'File',
submenu: [
{
role: 'quit'
+8308 -406
View File
File diff suppressed because it is too large. Load diff