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

This commit is contained in:
DougJCook committed 2021-03-05 06:28:04 -05:00
commit 23bf365a7b
62 files changed
+1775 -176

No files matched your search

Binary file not shown.
@@ -0,0 +1,13 @@
{
"type": "Action",
"definition": {
"text": "An Action is somthing that users of the system can triggeer via the UI, usually by clicking on a Menu Item of a Node. Actions can also be triggered by other actions enabling a resulable set of functionality to be available to users of the Design Space. Once triggered the action executes pre-defined code.",
"updated": 1614784762410
},
"paragraphs": [
{
"style": "Text",
"text": "Left click and Edit to enter edit mode and change this text. ENTER to write new paragraphs. ESC to exit edit mode. Then you can use doscs.save to save your changes and app.contribute to send it to the main repository."
}
]
}
@@ -0,0 +1,247 @@
{
"type": "App Schema",
"definition": {
"text": "A set of low level definitions placed at a JSON file that defines which types of nodes are made available by a certain Project to be used at the Design Space.",
"updated": 1614784939148
},
"paragraphs": [
{
"style": "Text",
"text": "The App Schema file is an array of objects, each objec defines a certain node type.",
"updated": 1614785082978
},
{
"style": "Title",
"text": "Example"
},
{
"style": "Json",
"text": " {\n \"type\": \"Plotter Panel\",\n \"level\": 4,\n \"propertyNameAtParent\": \"panels\",\n \"attachingRules\": {\n \"compatibleTypes\": \"->Plotter Module->\"\n },\n \"childrenNodesProperties\": [\n {\n \"name\": \"plotterPanelJavascriptCode\",\n \"type\": \"node\",\n \"childType\": \"Plotter Panel Javascript Code\"\n },\n {\n \"name\": \"panelData\",\n \"type\": \"array\",\n \"childType\": \"Panel Data\",\n \"autoAdd\": true\n }\n ],\n \"menuItems\": [\n {\n \"action\": \"Add UI Object\",\n \"disableIfPropertyIsDefined\": true,\n \"propertyToCheckFor\": \"plotterPanelJavascriptCode\",\n \"actionFunction\": \"payload.executeAction\",\n \"label\": \"Add Javascript Code\",\n \"relatedUiObject\": \"Plotter Panel Javascript Code\"\n },\n {\n \"action\": \"Add UI Object\",\n \"actionFunction\": \"payload.executeAction\",\n \"label\": \"Add Panel Data\",\n \"relatedUiObject\": \"Panel Data\"\n },\n {\n \"action\": \"Delete UI Object\",\n \"askConfirmation\": true,\n \"confirmationLabel\": \"Confirm to Delete\",\n \"actionFunction\": \"payload.executeAction\",\n \"label\": \"Delete\",\n \"iconPathOn\": \"delete-entity\",\n \"iconPathOff\": \"delete-entity\"\n }\n ],\n \"addLeftIcons\": true\n }",
"updated": 1614785173292
},
{
"style": "Title",
"text": "Properties",
"updated": 1614785297833
},
{
"style": "Text",
"text": "Each object can have a pre-defined set of properties, which you can see here:"
},
{
"style": "Subtitle",
"text": "type"
},
{
"style": "Text",
"text": "The Type of the node is the key by which each node is identified within the context of a certain Project. The naming convention here is that all words must be capitalized.",
"updated": 1614785486944
},
{
"style": "Subtitle",
"text": "level"
},
{
"style": "Text",
"text": "It is an integer from 0 to 5, representing the importance of this type of node. 0 is the most important. The more important the node type, the bigger is rendered at the Design Space. The difference between level is barely noticable.",
"updated": 1614785595122
},
{
"style": "Subtitle",
"text": "propertyNameAtParent"
},
{
"style": "Text",
"text": "Nodes are usually child of other nodes. Each Node might also have children. At runtime children references are stored at some property of the Node object, but that property is not unique or pre-defined. Instead, each Node Type declares at its own definition at the App Schema, which will be the name of the property that will host it's own reference at it's parent node. "
},
{
"style": "Subtitle",
"text": "childrenNodesProperties",
"updated": 1614785903518
},
{
"style": "Text",
"text": "Nodes also declare an array of property names that will be used to define which type of children the node can have. For example:",
"updated": 1614786054299
},
{
"style": "Json",
"text": "\"childrenNodesProperties\": [\n {\n \"name\": \"dataFormula\",\n \"type\": \"node\",\n \"childType\": \"Data Formula\",\n \"autoAdd\": true\n },\n {\n \"name\": \"textStyle\",\n \"type\": \"node\",\n \"childType\": \"Text Style\",\n \"autoAdd\": true\n }\n ]",
"updated": 1614786383043
},
{
"style": "Text",
"text": "Each array item represent one type of children node this node can have. ",
"updated": 1614786149174
},
{
"style": "Text",
"text": "Each object can have 4 properties:"
},
{
"style": "List",
"text": "name: means name of the property that will hold the reference to the child node at runtime.",
"updated": 1614786293774
},
{
"style": "List",
"text": "type: possible values are node or array. See details below.",
"updated": 1614786239139
},
{
"style": "List",
"text": "childType: means the type of the child node."
},
{
"style": "List",
"text": "autoAdd: optional, menas if one instance of this children will be automatically created when this Node type is created."
},
{
"style": "Text",
"text": "The type property, can either be node or array, meaning:",
"updated": 1614786331079
},
{
"style": "List",
"text": "node: means that can have only one instance of this type of children."
},
{
"style": "List",
"text": "array: means that it can have more than one instance of this type of children."
},
{
"style": "Subtitle",
"text": "attachingRules"
},
{
"style": "Text",
"text": "This property defines to which nodes the current one being defined can attach to, considering those nodes as possible parents. The values are expresed in a string with a list of Node Types like in the following example:"
},
{
"style": "Json",
"text": "\"attachingRules\": {\n \"compatibleTypes\": \"->Procedure Initialization->Procedure Loop->\"\n }",
"updated": 1614786517182
},
{
"style": "Note",
"text": "incompatibleTypes property can also be used to explicitly define which nodes can not be parents.",
"updated": 1614786596412
},
{
"style": "Subtitle",
"text": "referencingRules"
},
{
"style": "Text",
"text": "This property defines to which nodes the current one being defined can reference to, considering those nodes as possible reference parents. The values are expresed in a string with a list of Node Types like in the following example:",
"updated": 1614786699311
},
{
"style": "Json",
"text": "\"referencingRules\": {\n \"compatibleTypes\": \"->Dashboard->Data Mines Data->Trading Mines Data->Data Tasks->Testing Trading Tasks->Production Trading Tasks->\"\n }",
"updated": 1614786660155
},
{
"style": "Note",
"text": "incompatibleTypes property can also be used to explicitly define which nodes can not be parents.",
"updated": 1614786714357
},
{
"style": "Subtitle",
"text": "menuItems"
},
{
"style": "Text",
"text": "This property allow you to define the menu of this Node Type at the Design Space. This menu will be an array of Menu Items objects like in the example below:"
},
{
"style": "Json",
"text": "\"menuItems\": [\n {\n \"action\": \"Configure\",\n \"label\": \"Configure\",\n \"iconPathOn\": \"configuration\",\n \"iconPathOff\": \"configuration\",\n \"actionFunction\": \"uiObject.configEditor.activate\"\n },\n {\n \"action\": \"Run Super Action\",\n \"label\": \"Run\",\n \"askConfirmation\": true,\n \"confirmationLabel\": \"Confirm to Run\",\n \"workDoneLabel\": \"Super Action Executed\",\n \"iconPathOn\": \"run\",\n \"iconPathOff\": \"run\",\n \"actionFunction\": \"payload.executeAction\"\n },\n {\n \"action\": \"Delete UI Object\",\n \"askConfirmation\": true,\n \"confirmationLabel\": \"Confirm to Delete\",\n \"label\": \"Delete\",\n \"iconPathOn\": \"delete-entity\",\n \"iconPathOff\": \"delete-entity\",\n \"actionFunction\": \"payload.executeAction\"\n }\n ]",
"updated": 1614787632953
},
{
"style": "Text",
"text": "Although you are free to add any menu item you like, there are a few that have already become standarized. These standard Menu Items are also placed at a certain position within the menu for consistency.",
"updated": 1614787035329
},
{
"style": "List",
"text": "configure: always go as the first item"
},
{
"style": "List",
"text": "run: after the configure if there is one"
},
{
"style": "List",
"text": "delete: it is always the last one"
},
{
"style": "Text",
"text": ""
},
{
"style": "Subtitle",
"text": "initialValues"
},
{
"style": "Text",
"text": "This property is needed when the Node Type being defined will have a configuration. In those cases this property will set the initial value for that config. Example:"
},
{
"style": "Json",
"text": "\"initialValues\": {\n \"config\": \"{ \\n\\\"username\\\": \\\"\\\", \\n\\\"token\\\": \\\"\\\"\\n}\"\n }",
"updated": 1614787265306
},
{
"style": "Subtitle",
"text": "editors"
},
{
"style": "Text",
"text": "This property will tell the system which editor will be available for this type of node. Example:"
},
{
"style": "Json",
"text": "\"editors\": {\n \"config\": true\n }",
"updated": 1614787433867
},
{
"style": "Text",
"text": "There are a few existing editors:"
},
{
"style": "List",
"text": "config: editor for node configurations."
},
{
"style": "List",
"text": "code: editor for javascript code."
},
{
"style": "List",
"text": "formula: formulas expressed in javascript."
},
{
"style": "List",
"text": "condition: conditions editor.",
"updated": 1614787624722
},
{
"style": "Note",
"text": "In order for the user to actually be able to open the editor configured here, there must be a Menu Item than has an action = \"Configure\"."
},
{
"style": "Text",
"text": ""
},
{
"style": "Text",
"text": ""
},
{
"style": "Text",
"text": ""
}
]
}
@@ -0,0 +1,31 @@
{
"type": "Function Library",
"definition": {
"text": "It is a collection of functions related to a single topic. The topic is usuarlly expressed at the Function Libray's name.",
"updated": 1614787845534
},
"paragraphs": [
{
"style": "Text",
"text": "Each integrated project might have Function Libraries at the 3 different levels possible: Client, TS, and UI. In the case of Superalgos, at the UI it features, for instance, these Function Libraries:",
"updated": 1614788012945
},
{
"style": "List",
"text": "Charting Space Functions"
},
{
"style": "List",
"text": "Crypto Ecosystem Functions"
},
{
"style": "List",
"text": "Plugins Functions",
"updated": 1614788024303
},
{
"style": "Note",
"text": "Function Libraries are stateless by definition. "
}
]
}
@@ -0,0 +1,13 @@
{
"type": "Menu Item",
"definition": {
"text": "A Menu Item is each of the items listed at any given Node's menu.",
"updated": 1614784829380
},
"paragraphs": [
{
"style": "Text",
"text": "Left click and Edit to enter edit mode and change this text. ENTER to write new paragraphs. ESC to exit edit mode. Then you can use doscs.save to save your changes and app.contribute to send it to the main repository."
}
]
}
@@ -0,0 +1,49 @@
{
"type": "Superalgos SA Token",
"definition": {
"text": "It is an Ethereum ERC20 token that will be used as the medium of exchange by Superalgos users while paying for products or services they buy and sell to each other.",
"updated": 1614853448838
},
"paragraphs": [
{
"style": "Title",
"text": "Properties",
"updated": 1614853617940
},
{
"style": "Text",
"text": "The SA Token has the following properties:"
},
{
"style": "List",
"text": "Name: Superalgos"
},
{
"style": "List",
"text": "Ticker: SA"
},
{
"style": "List",
"text": "Max Total Supply: 1,500,000,000"
},
{
"style": "List",
"text": "Contract Address: 0x4b1cab076C791b0e24a8560B7Ab4BF6b4C0652F0"
},
{
"style": "Title",
"text": "Distribution",
"updated": 1614853604174
},
{
"style": "Text",
"text": "After issuing the token in March 2021, the funds were deposited at the project's Treasury Account, from where it is distributed to each year's Budget Account, each Release Account and finally to contributors accounts.",
"updated": 1614853686491
},
{
"style": "List",
"text": "Treasury Account: 0x176E32e3f1b6D218CBf920e7852Bd13207A62711",
"updated": 1614853653856
}
]
}
@@ -444,8 +444,13 @@
},
{
"style": "Text",
"text": "In the case of the Superalgos project, SVG source files are organized in subfolders, as follows:",
"updated": 1613730944769
"text": "In the case of the Superalgos project, SVG source files are organized in subfolders, under the following directory:",
"updated": 1614854522604
},
{
"style": "Json",
"text": "\\Projects\\Superalgos\\Icons-SVG-Sources\\",
"updated": 1614854467481
},
{
"style": "Table",
@@ -0,0 +1,36 @@
{
"topic": "How to Automate Actions at The Design Space",
"pageNumber": "1",
"type": "Automating Actions - What is an Action?",
"definition": {
"text": "An Action is what is executed when users picks something from the menu of a Node.",
"updated": 1614788525702
},
"paragraphs": [
{
"style": "Text",
"text": "These actions are implemented as functions inside a Function Library. So the basic workflow to implement a new action is the following:",
"updated": 1614788734425
},
{
"style": "List",
"text": "Add Menu Item: First you need to add a Menu Item for the node type that will allow the user to execute your action.",
"updated": 1614790023220
},
{
"style": "List",
"text": "Locate Function Library: Then you will need to locate the Function Library that is better suited to host the function that is going to be executed once the action is triggered.",
"updated": 1614790037292
},
{
"style": "List",
"text": "Add your Code: Then you will write the code for that function.",
"updated": 1614790047291
},
{
"style": "List",
"text": "Connect Menu Item to your Code: Finally you will connect the Menu Item to that function.",
"updated": 1614790060302
}
]
}
@@ -0,0 +1,77 @@
{
"topic": "How to Automate Actions at The Design Space",
"pageNumber": "2",
"type": "Automating Actions - Adding a Menu Item",
"definition": {
"text": "You need to add a new Menu Item at the node definition at the App Schema.",
"updated": 1614788860135
},
"paragraphs": [
{
"style": "Text",
"text": "Check out the page of the App Schema concept. After that, locate the App Schema file of the Projects folder. There is one App Schema file for Project, pick the right one and edit it with VS Code.",
"updated": 1614788974626
},
{
"style": "Warning",
"text": "Be carefull not to damage anything in there while editing. You will get into trouble if you do so. It can not only produce the UI not to load, but it can also damage the workspace you are working at.",
"updated": 1614789073656
},
{
"style": "Text",
"text": "Locate inside the file, the definition of the Node Type you want to add the new Action to. Once localted add a menu item object to the menuItems array, like in the following example:",
"updated": 1614789152442
},
{
"style": "Json",
"text": "{\n \"action\": \"Add UI Object\",\n \"actionFunction\": \"payload.executeAction\",\n \"label\": \"Add Image\",\n \"relatedUiObject\": \"Image\"\n }",
"updated": 1614789262250
},
{
"style": "Text",
"text": "The example above is most likely what you need to add. For completeness, this is the list of properties this object can have:",
"updated": 1614789977840
},
{
"style": "List",
"text": "action: define a name for your action. Capitalize each first letter please."
},
{
"style": "List",
"text": "actionFunction: use the standard \"payload.executeAction\" unless you are familiar with the system and would like to do some custom stuff."
},
{
"style": "List",
"text": "label: this is what is going to be read by the user at the Node's menu."
},
{
"style": "List",
"text": "relatedUiObject: optional. You can define here a Node Type. The system will use for the Menu Item icon, the image associated to the Node Type you define here."
},
{
"style": "List",
"text": "askConfirmation: true if you want the user to confirm with an extra click."
},
{
"style": "List",
"text": "confirmationLabel: the text the user will read when asked to confirm."
},
{
"style": "List",
"text": "iconPathOn: the name of the image to render when this Menu Item is ON (in cases that works as a toggle)"
},
{
"style": "List",
"text": "iconPathOff: the name of the image to render when this Menu Item is OFF (in cases that works as a toggle)"
},
{
"style": "List",
"text": "disableIfPropertyIsDefined: true when you want the Menu Item to be disabled if a certain property of the Node object is defined at runtime. This is used in conbination with the property propertyToCheckFor in the special situation that the Menu Item is used to create a child for this Node that is not part of a array of children and there can only be one child of that type.",
"updated": 1614789912636
},
{
"style": "List",
"text": "propertyToCheckFor: read the previous property."
}
]
}
@@ -0,0 +1,14 @@
{
"topic": "How to Automate Actions at The Design Space",
"pageNumber": "3",
"type": "Automating Actions - Adding a Children Node Property",
"definition": {
"text": "Write a summary for this topic page."
},
"paragraphs": [
{
"style": "Text",
"text": "Left click and Edit to enter edit mode and change this text. ENTER to write new paragraphs. ESC to exit edit mode. Then you can use doscs.save to save your changes and app.contribute to send it to the main repository."
}
]
}
@@ -0,0 +1,14 @@
{
"topic": "How to Automate Actions at The Design Space",
"pageNumber": "4",
"type": "Automating Actions - Locating the Right Function Library",
"definition": {
"text": "Write a summary for this topic page."
},
"paragraphs": [
{
"style": "Text",
"text": "Left click and Edit to enter edit mode and change this text. ENTER to write new paragraphs. ESC to exit edit mode. Then you can use doscs.save to save your changes and app.contribute to send it to the main repository."
}
]
}
@@ -0,0 +1,14 @@
{
"topic": "How to Automate Actions at The Design Space",
"pageNumber": "5",
"type": "Automating Actions - Adding your Function",
"definition": {
"text": "Write a summary for this topic page."
},
"paragraphs": [
{
"style": "Text",
"text": "Left click and Edit to enter edit mode and change this text. ENTER to write new paragraphs. ESC to exit edit mode. Then you can use doscs.save to save your changes and app.contribute to send it to the main repository."
}
]
}
@@ -0,0 +1,14 @@
{
"topic": "How to Automate Actions at The Design Space",
"pageNumber": "6",
"type": "Automating Actions - Using Utilities",
"definition": {
"text": "Write a summary for this topic page."
},
"paragraphs": [
{
"style": "Text",
"text": "Left click and Edit to enter edit mode and change this text. ENTER to write new paragraphs. ESC to exit edit mode. Then you can use doscs.save to save your changes and app.contribute to send it to the main repository."
}
]
}
@@ -0,0 +1,14 @@
{
"topic": "How to Automate Actions at The Design Space",
"pageNumber": "7",
"type": "Automating Actions - Using the Workspace",
"definition": {
"text": "Write a summary for this topic page."
},
"paragraphs": [
{
"style": "Text",
"text": "Left click and Edit to enter edit mode and change this text. ENTER to write new paragraphs. ESC to exit edit mode. Then you can use doscs.save to save your changes and app.contribute to send it to the main repository."
}
]
}
@@ -0,0 +1,14 @@
{
"topic": "How to Automate Actions at The Design Space",
"pageNumber": "8",
"type": "Automating Actions - Adding an Action Switch Case",
"definition": {
"text": "Write a summary for this topic page."
},
"paragraphs": [
{
"style": "Text",
"text": "Left click and Edit to enter edit mode and change this text. ENTER to write new paragraphs. ESC to exit edit mode. Then you can use doscs.save to save your changes and app.contribute to send it to the main repository."
}
]
}
@@ -0,0 +1,14 @@
{
"topic": "How to Automate Actions at The Design Space",
"pageNumber": "9",
"type": "Automating Actions - Testing your Action",
"definition": {
"text": "Write a summary for this topic page."
},
"paragraphs": [
{
"style": "Text",
"text": "Left click and Edit to enter edit mode and change this text. ENTER to write new paragraphs. ESC to exit edit mode. Then you can use doscs.save to save your changes and app.contribute to send it to the main repository."
}
]
}
@@ -12,7 +12,8 @@
{
"language": "IT",
"text": "Esatto! Gli indicatori cominceranno a lavorare non appena il sensor bot avrà finito il suo lavoro!",
"updated": 1614720705287
"updated": 1614720705287,
"style": "Definition"
}
]
},
@@ -24,7 +25,8 @@
{
"language": "IT",
"text": "Ciò che vedi é il processo del Candles Volumes: trasforma le candele sul periodo di un minuto che il sensor bot scarica dall'exchange in candele per tutti i periodi temporali.",
"updated": 1614721117562
"updated": 1614721117562,
"style": "Text"
}
]
},
@@ -36,7 +38,8 @@
{
"language": "IT",
"text": "Che succede dopo che ha terminato?",
"updated": 1614720863282
"updated": 1614720863282,
"style": "Callout"
}
]
},
@@ -46,8 +49,9 @@
"translations": [
{
"language": "IT",
"text": "Altri bot hanno bisogno che la Candles Volumes termini il proprio compito, per iniziare ad eseguire il loro. Immagina un bot che debba calcolare una Simple Moving Average a 20 periodi su tutti i periodi temporali. Per farlo, ha bisogno di un Data Product come input, che viene prodotto dal Candles Volumes. Questo rapporto si chiama Data Dependency.",
"updated": 1614721277800
"text": "Altri bot hanno bisogno che la Candles Volumes termini, prima di iniziare il loro compito. Immagina un bot che calcoli SMA-20 su tutti i time-frame: ha bisogno di un Data Product come input, risultato del Candles Volumes. Questo rapporto si chiama Data Dependency.",
"updated": 1614788007733,
"style": "Text"
}
]
}
@@ -7,21 +7,49 @@
"project": "Superalgos",
"name": "hand-drag"
},
"text": "I want to show you something while the data mining operation progresses. I'll teach you how to walk... in two seconds!"
"text": "I want to show you something while the data mining operation progresses. I'll teach you how to walk... in two seconds!",
"translations": [
{
"language": "IT",
"text": "Voglio mostrarti qualcosa, mentre l'operazione di data mining è in corso. Ti insegnerò a camminare nel giro di un attimo!",
"updated": 1614788444726
}
]
},
"paragraphs": [
{
"style": "Callout",
"text": "Just click and drag with your mouse!"
"text": "Just click and drag with your mouse!",
"translations": [
{
"language": "IT",
"text": "É facile: clicca e trascina usando il mouse!",
"updated": 1614788236203
}
]
},
{
"style": "Text",
"text": "Easy, right? Great! However, the design space is a huge place and I wouldn't want you to get tendinitis dragging your way around like this.",
"updated": 1610613840200
"updated": 1610613840200,
"translations": [
{
"language": "IT",
"text": "Semplice, no? Ad ogni modo, il Design Space è molto esteso e non vorrai farti venire la tendinite cliccando e trascinando in giro in questo modo.",
"updated": 1614789321190
}
]
},
{
"style": "Success",
"text": "I'll teach you a couple more tricks in the next couple of steps."
"text": "I'll teach you a couple more tricks in the next couple of steps.",
"translations": [
{
"language": "IT",
"text": "Nei prossimi step ti insegnerò un altro paio di trucchetti.",
"updated": 1614788431318
}
]
}
]
}
@@ -7,23 +7,51 @@
"project": "Superalgos",
"name": "key-ctrl"
},
"text": "Yes! You may use your keyboard too! You are going to love this for long-distance travel on the design space!"
"text": "Yes! You may use your keyboard too! You are going to love this for long-distance travel on the design space!",
"translations": [
{
"language": "IT",
"text": "Oh sì! Puoi usare anche la tastiera! Fidati, la adorerai per gli spostamenti a lunga distanza nel Design Space!",
"updated": 1614789336258
}
]
},
"paragraphs": [
{
"style": "Callout",
"text": "Regular folks may use the Ctrl key plus arrow keys: ← → ↑ ↓",
"updated": 1610614017276
"updated": 1610614017276,
"translations": [
{
"language": "IT",
"text": "Puoi usare il tasto Ctrl più i quattro tasti freccia: ← → ↑ ↓",
"updated": 1614788584746
}
]
},
{
"style": "Note",
"text": "Notice that keeping the keys pressed makes you fly!",
"updated": 1610614056593
"updated": 1610614056593,
"translations": [
{
"language": "IT",
"text": "Tenere premuti i tasti ti farà volare!",
"updated": 1614788606698
}
]
},
{
"style": "Success",
"text": "Of course Mac fanboys and girls must replace Ctrl with Cmd",
"updated": 1610614224444
"updated": 1610614224444,
"translations": [
{
"language": "IT",
"text": "Ovviamente i fan della Apple devono sostituire Ctrl con Cmd",
"updated": 1614788677478
}
]
}
]
}
@@ -7,21 +7,49 @@
"project": "Superalgos",
"name": "mouse-right-click"
},
"text": "Ok, you're not actually going to be teleporting, nor will you bend spacetime, but it almost feels like it! It's time to learn to use the design space map."
"text": "Ok, you're not actually going to be teleporting, nor will you bend spacetime, but it almost feels like it! It's time to learn to use the design space map.",
"translations": [
{
"language": "IT",
"text": "Okay, non ti teletrasporterai davvero nè piegherai lo spazio-tempo, ma la sensazione sarà la stessa! È il momento di utilizzare la mappa del Design Space.",
"updated": 1614789351031
}
]
},
"paragraphs": [
{
"style": "Text",
"text": "I said earlier that the design space is huge, and I meant it! Going from one corner to the opposite would take hundreds of clicks and drags. While using the keyboard allows you to develop neck-breaking speeds, it's not as cool as teleporting! This is how it works:"
"text": "I said earlier that the design space is huge, and I meant it! Going from one corner to the opposite would take hundreds of clicks and drags. While using the keyboard allows you to develop neck-breaking speeds, it's not as cool as teleporting! This is how it works:",
"translations": [
{
"language": "IT",
"text": "Come detto prima, il Design Space è veramente grande: andare da un angolo all'altro richiederebbe centinaia di click. Usare la tastiera ti permette di spostarti a grandi velocità, ma non è forte come teletrasportarsi! Ora ti spiego come si fa:",
"updated": 1614789460112
}
]
},
{
"style": "Callout",
"text": "Right-click to open the map and left-click anywhere to go to that specific spot!",
"updated": 1611076477382
"updated": 1611076477382,
"translations": [
{
"language": "IT",
"text": "Fai click con il tasto destro del mouse per aprire la mappa e clicca un punto qualsiasi con il tasto sinistro per raggiungerlo!",
"updated": 1614788954113
}
]
},
{
"style": "Text",
"text": "Look at me on the bottom-left corner of the design space? Now you know where to find me!"
"text": "Look at me on the bottom-left corner of the design space? Now you know where to find me!",
"translations": [
{
"language": "IT",
"text": "Mi vedi nell'angolo in basso a sinistra del Design Space? Ora sai dove trovarmi!",
"updated": 1614789481521
}
]
}
]
}
@@ -7,18 +7,39 @@
"project": "Superalgos",
"name": "mouse-wheel-down"
},
"text": "There's one more tool that you may find useful to manipulate spacetime! The native browser zoom function!"
"text": "There's one more tool that you may find useful to manipulate spacetime! The native browser zoom function!",
"translations": [
{
"language": "IT",
"text": "C'è ancora uno strumento utile per manipolare lo spazio-tempo: la funzione zoom del tuo browser!",
"updated": 1614789109029
}
]
},
"paragraphs": [
{
"style": "Text",
"text": "Sometimes you may wish to visualize larger sections of the Design Space than your screen allows.",
"updated": 1611314074367
"updated": 1611314074367,
"translations": [
{
"language": "IT",
"text": "A volte potresti voler visualizzare porzioni del Design Space più ampie di quanto permesso dal tuo schermo.",
"updated": 1614789154147
}
]
},
{
"style": "Callout",
"text": "Hit Ctrl and scroll the mouse wheel on Windows or <kbd>⌘</kbd> and <kbd>-</kbd> or <kbd>+</kbd> in Mac.",
"updated": 1611314352825
"updated": 1611314352825,
"translations": [
{
"language": "IT",
"text": "Clicca Ctrl e scorri con la rotella del mouse su Windows o usa ⌘ e - oppure + su Mac.",
"updated": 1614789231899
}
]
},
{
"style": "Text",
@@ -27,7 +48,14 @@
{
"style": "Success",
"text": "Chrome indicates the level of zoom on the top-right corner. When zooming in or out, the design space gets centered on the screen. Use the design space map to go back where you were.",
"updated": 1611314381796
"updated": 1611314381796,
"translations": [
{
"language": "IT",
"text": "Chrome ti mostra il livello di zoom nell'angolo in alto a destra. Quando zoommi, il Design Space viene centrato sullo schermo. Usa la mappa per tornare dove eri prima.",
"updated": 1614789306337
}
]
}
]
}
@@ -7,17 +7,38 @@
"project": "Superalgos",
"name": "tutorial"
},
"text": "Before we get back to business, let me tell you a few things about how we&mdash;tutorials&mdash;work."
"text": "Before we get back to business, let me tell you a few things about how we&mdash;tutorials&mdash;work.",
"translations": [
{
"language": "IT",
"text": "Prima di tornare al lavoro, lascia che ti spieghi un paio di cose su come funzioniamo noi tutorial.",
"updated": 1614790205512
}
]
},
"paragraphs": [
{
"style": "Text",
"text": "This is likely the most important bit: you are the boss! You may stop a tutorial and skip steps—or entire topics—at any point. Once you're ready to pick up the lesson again, find us on the bottom-left corner of the design space. Select Resume on the menu to start where you left, or on the first step skipped. Select Play to start from the beginning!",
"updated": 1611076579955
"updated": 1611076579955,
"translations": [
{
"language": "IT",
"text": "Questo è il concetto più importante: sei tu il boss! Puoi stoppare un tutorial e saltare step o interi capitoli in qualsiasi momento. Una volta che sei pronto a riprendere, ci trovi nell'angolo in basso a sinistra del Design Space. Seleziona Resume nel menu per riprendere da dove ti sei fermato, o dal primo step saltato. Oppure seleziona Play per ricominciare da capo!",
"updated": 1614789696848
}
]
},
{
"style": "Callout",
"text": "Let's try that! Click the Stop button below, and once I'm gone, open my menu and select Resume."
"text": "Let's try that! Click the Stop button below, and once I'm gone, open my menu and select Resume.",
"translations": [
{
"language": "IT",
"text": "Provaci! Premi il pulsante Stop qui sotto, e una volta che sono sparito apri il mio menu e seleziona Resume.",
"updated": 1614790103478
}
]
}
]
}
@@ -7,21 +7,49 @@
"project": "Superalgos",
"name": "key-left"
},
"text": "At this point, I'm probably overflowing your hippocampus! But don't worry... you may go back to any previous step!"
"text": "At this point, I'm probably overflowing your hippocampus! But don't worry... you may go back to any previous step!",
"translations": [
{
"language": "IT",
"text": "Tutte queste informazioni ti avranno sovraccaricato l'ippocampo! Ma non preccuparti, puoi tornare indietro a qualunque step precedente.",
"updated": 1614790380193
}
]
},
"paragraphs": [
{
"style": "Text",
"text": "If you ever need a reminder about any of these topics..."
"text": "If you ever need a reminder about any of these topics...",
"translations": [
{
"language": "IT",
"text": "Se mai ti servirà un ripasso su uno di quesi topic...",
"updated": 1614790424338
}
]
},
{
"style": "List",
"text": "Find a Tutorial Topic and replay it! You may find me on the bottom-left corner of the design space, expand me, browse through the hierarchy of topics and steps, and click Play on any of them. Topics are arranged in a clockwise direction, starting from the right-hand side of the main Tutorial node."
"text": "Find a Tutorial Topic and replay it! You may find me on the bottom-left corner of the design space, expand me, browse through the hierarchy of topics and steps, and click Play on any of them. Topics are arranged in a clockwise direction, starting from the right-hand side of the main Tutorial node.",
"translations": [
{
"language": "IT",
"text": "Cerca un Tutorial Topic e ri-eseguilo! Puoi trovarmi nell'angolo in basso a sinistra del Design Space. Espandimi, naviga nella gerarchia dei topics e degli steps e clicca Play su uno qualsiasi di questi. I topics sono strutturati in senso orario, a partire dal lato destro del nodo Tutorial principale.",
"updated": 1614790602319
}
]
},
{
"style": "Callout",
"text": "Need a Quick Reminder? Find the step under the Tutorials & Help topic below. Then click Stop, and restart by clicking Play on the said Tutorial Step!",
"updated": 1611076850328
"updated": 1611076850328,
"translations": [
{
"language": "IT",
"text": "Hai bisogno di un ripasso veloce? Trova lo step sotto il topic Tutorial & Help. Poi clicca Stop, e ricomincia cliccando Play su quel Tutorial Step!",
"updated": 1614790783510
}
]
}
]
}
@@ -7,34 +7,83 @@
"project": "Superalgos",
"name": "help"
},
"text": "I won't go into every detail as we move along, but if you need more info on a node, the help button on the menu takes you straight to its documentation."
"text": "I won't go into every detail as we move along, but if you need more info on a node, the help button on the menu takes you straight to its documentation.",
"translations": [
{
"language": "IT",
"text": "Non mi addentrerò in ogni dettaglio mentre proseguiamo, ma se hai bisogno di più info su un nodo il pulsante di help sul menu ti porta direttamente alla relativa documentazione.",
"updated": 1614790878931
}
]
},
"paragraphs": [
{
"style": "Text",
"text": "The documentation of a node may include one or more of the following sections:"
"text": "The documentation of a node may include one or more of the following sections:",
"translations": [
{
"language": "IT",
"text": "La documentazione di un nodo può includere una o più delle seguenti sezioni:",
"updated": 1614790910243
}
]
},
{
"style": "List",
"text": "Definition: describes what the node is or does."
"text": "Definition: describes what the node is or does.",
"translations": [
{
"language": "IT",
"text": "<b>Definizione</b>: descrive il nodo o la sua funzione",
"updated": 1614790956373
}
]
},
{
"style": "List",
"text": "Content: describes how the node works."
"text": "Content: describes how the node works.",
"translations": [
{
"language": "IT",
"text": "<b>Contenuto:</b> descrive come funziona il nodo",
"updated": 1614791022017
}
]
},
{
"style": "List",
"text": "Configuration: some node may have one.",
"updated": 1610614516774
"updated": 1610614516774,
"translations": [
{
"language": "IT",
"text": "<b>Configurazione:</b> alcuni nodi ne hanno una",
"updated": 1614791040416
}
]
},
{
"style": "List",
"text": "Technical: the rest of the infor is usually of a technical nature, oriented to developers.",
"updated": 1610614574015
"updated": 1610614574015,
"translations": [
{
"language": "IT",
"text": "<b>Info tecniche:</b> il resto delle informazioni sono solitamente di natura tecnica, principalmente per gli sviluppatori.",
"updated": 1614791106174
}
]
},
{
"style": "Callout",
"text": "Click the help button on the Data Tasks node!"
"text": "Click the help button on the Data Tasks node!",
"translations": [
{
"language": "IT",
"text": "Clicca il pulsante di help sul nodo Data Tasks!",
"updated": 1614791129195
}
]
}
]
}
@@ -7,20 +7,48 @@
"project": "Superalgos",
"name": "workspace"
},
"text": "If you ever break something&mdash;like deleting a node or changing a configuration&mdash;and don't know how to deal with the outcome..."
"text": "If you ever break something&mdash;like deleting a node or changing a configuration&mdash;and don't know how to deal with the outcome...",
"translations": [
{
"language": "IT",
"text": "Se ti capiterà mai di rompere qualcosa (per esempio cancellare un nodo o cambiare una configurazione) e non sai come sistemare...",
"updated": 1614791180230
}
]
},
"paragraphs": [
{
"style": "Callout",
"text": "... there is an easy way to start over with a brand new workspace!"
"text": "... there is an easy way to start over with a brand new workspace!",
"translations": [
{
"language": "IT",
"text": "...c'è un modo semplice di ricominciare con un nuovo workspace!",
"updated": 1614791206441
}
]
},
{
"style": "Text",
"text": "All you need to do is pull the tab on the left-hand side of the screen and click on the Getting-Started plugin workspace."
"text": "All you need to do is pull the tab on the left-hand side of the screen and click on the Getting-Started plugin workspace.",
"translations": [
{
"language": "IT",
"text": "Tutto ciò che devi fare è tirare la tab sul lato sinistro dello schermo e cliccare sul plugin workspace Getting-Started.",
"updated": 1614791245119
}
]
},
{
"style": "Success",
"text": "A brand new Getting Started workspace will load and I will show up again, fresh from the start!"
"text": "A brand new Getting Started workspace will load and I will show up again, fresh from the start!",
"translations": [
{
"language": "IT",
"text": "Un workspace Getting-Started nuovo e pulito verrà caricato e lanciato dall'inizio!",
"updated": 1614791287049
}
]
}
]
}
@@ -7,21 +7,49 @@
"project": "Superalgos",
"name": "workspace"
},
"text": "Yes! Some of them are plugins shipping with the system and some are your own!"
"text": "Yes! Some of them are plugins shipping with the system and some are your own!",
"translations": [
{
"language": "IT",
"text": "Oh sì! Alcuni di quelli sono plugin nativi del sistema, e altri sono i tuoi!",
"updated": 1614791394697
}
]
},
"paragraphs": [
{
"style": "Text",
"text": "As soon as you start using the system, the workspace is saved every minute. It is also saved before closing the browser or browser tab, and you may save it manually using the Ctrl + Shift + Key-S",
"updated": 1610614718976
"updated": 1610614718976,
"translations": [
{
"language": "IT",
"text": "Mentre usi il sistema, il workspace viene salvato automaticamente ogni minuto. Viene salvato anche quando chiudi il browser o la tab, e puoi salvarlo manualmente usando Ctrl + Shift + Key-S",
"updated": 1614791481642
}
]
},
{
"style": "Callout",
"text": "When a plugin workspace is modified in any way, a copy is stored in your My-Workspaces folder."
"text": "When a plugin workspace is modified in any way, a copy is stored in your My-Workspaces folder.",
"translations": [
{
"language": "IT",
"text": "Quando un plugin workspace viene modificato in qualunque modo, una copia viene salvata su disco nella tua cartella My-Workspaces.",
"updated": 1614791526653
}
]
},
{
"style": "Important",
"text": "Plugin files may not be modified from within the system!"
"text": "Plugin files may not be modified from within the system!",
"translations": [
{
"language": "IT",
"text": "I file plugin non devono essere modificati in altro modo!",
"updated": 1614791561359
}
]
}
]
}
@@ -7,24 +7,59 @@
"project": "Superalgos",
"name": "data-tasks"
},
"text": "Now that you're comfortable moving around, I want you to go on a little tour exploring the Data Tasks section of the hierarchy."
"text": "Now that you're comfortable moving around, I want you to go on a little tour exploring the Data Tasks section of the hierarchy.",
"translations": [
{
"language": "IT",
"text": "Ora che sei più a tuo agio nel muoverti, ti suggerirei un piccolo tour di esplorazione della sezione Data Tasks della gerarchia.",
"updated": 1614791644655
}
]
},
"paragraphs": [
{
"style": "Text",
"text": "Notice the following:"
"text": "Notice the following:",
"translations": [
{
"language": "IT",
"text": "Puoi notare che:",
"updated": 1614791668620
}
]
},
{
"style": "List",
"text": "The section is organized&mdash;first and foremost&mdash;by project, exchange, and market. This will help you work with multiple exchanges and multiple markets in an orderly fashion."
"text": "The section is organized&mdash;first and foremost&mdash;by project, exchange, and market. This will help you work with multiple exchanges and multiple markets in an orderly fashion.",
"translations": [
{
"language": "IT",
"text": "La sezione è organizzata innanzitutto per progetto, exchange e market. Questa struttura ti aiuta a lavorare con exchange multipli e markets multipli in modo ordinato.",
"updated": 1614791724096
}
]
},
{
"style": "List",
"text": "The Exchange Data Tasks and Market Data Tasks nodes may control all tasks in the exchange and market respectively."
"text": "The Exchange Data Tasks and Market Data Tasks nodes may control all tasks in the exchange and market respectively.",
"translations": [
{
"language": "IT",
"text": "I nodi Exchange Data Tasks e Market Data Tasks controllano tutte le tasks rispettivamente in un exchange e in un market.",
"updated": 1614791806588
}
]
},
{
"style": "Callout",
"text": "Go out and check those nodes and their menus!"
"text": "Go out and check those nodes and their menus!",
"translations": [
{
"language": "IT",
"text": "Dai un'occhiata a quei nodi e ai loro menu!",
"updated": 1614791842750
}
]
}
]
}
@@ -7,20 +7,48 @@
"project": "Superalgos",
"name": "data-mine-tasks"
},
"text": "Within each market, the operation is organized by Data Mine. Superalgos ships with several open-source data mines, each with multiple indicators."
"text": "Within each market, the operation is organized by Data Mine. Superalgos ships with several open-source data mines, each with multiple indicators.",
"translations": [
{
"language": "IT",
"text": "All'interno di ogni market i processi sono organizzati dal Data Mine. Superalgos è equipaggiato con alcuni data mines open-source, ognuno dei quali ha diversi indicatori.",
"updated": 1614845425485
}
]
},
"paragraphs": [
{
"style": "Text",
"text": "Think of data mines as plugins that developers may create to extend the data analysis capacity of the system. An Indicator Bot may process data other indicators produce, hence adding value and producing deeper and richer analysis."
"text": "Think of data mines as plugins that developers may create to extend the data analysis capacity of the system. An Indicator Bot may process data other indicators produce, hence adding value and producing deeper and richer analysis.",
"translations": [
{
"language": "IT",
"text": "Puoi vedere i data mines come plugins che gli sviluppatori possono creare per ampliare la capacità di analisi del sistema. Un Indicator Bot può processare dati che altri indicatori producono, producendo così analisi più ricche e approfondite.",
"updated": 1614845409717
}
]
},
{
"style": "Callout",
"text": "If you have a basic understanding of JavaScript, you may create indicators too!"
"text": "If you have a basic understanding of JavaScript, you may create indicators too!",
"translations": [
{
"language": "IT",
"text": "Se hai una conoscenza base di JavaScript, puoi creare indicatori anche tu!",
"updated": 1614845457577
}
]
},
{
"style": "Text",
"text": "But I'm getting ahead of myself talking about building data mines at this point! Let's get back on track!"
"text": "But I'm getting ahead of myself talking about building data mines at this point! Let's get back on track!",
"translations": [
{
"language": "IT",
"text": "Ma sto correndo troppo parlando di costruire data mines a questo punto! Torniamo dove eravamo rimasti!",
"updated": 1614845542277
}
]
}
]
}
@@ -7,22 +7,50 @@
"project": "Superalgos",
"name": "task"
},
"text": "The core of a data mining operation are tasks running bots. One Task controls one bot, and a Task Manager may control multiple tasks."
"text": "The core of a data mining operation are tasks running bots. One Task controls one bot, and a Task Manager may control multiple tasks.",
"translations": [
{
"language": "IT",
"text": "Il cuore di un'operazione di data mining è composto da tasks che eseguono vari bots. Una Task controlla un bot, e un Task Manager controlla varie tasks.",
"updated": 1614845644365
}
]
},
"paragraphs": [
{
"style": "Text",
"text": "By now you've learned about six different devices that you may use to control each bot in your data mining operation. At the highest level, the Data Tasks node controls all data mining bots in the Network Node.",
"updated": 1610614923203
"updated": 1610614923203,
"translations": [
{
"language": "IT",
"text": "Finora hai imparato di sei differenti strumenti che puoi usare per controllare i bot nella tua operazione di data mining. A un livello superiore, il nodo Data Tasks controlla tutti i data mining bots nel Network Node.",
"updated": 1614845713171
}
]
},
{
"style": "Callout",
"text": "We'll talk about network nodes in a minute..."
"text": "We'll talk about network nodes in a minute...",
"translations": [
{
"language": "IT",
"text": "Parleremo dei network nodes tra un attimo...",
"updated": 1614845732408
}
]
},
{
"style": "Text",
"text": "At the lowest level, an individual Task controls a single bot. The nodes in between are organizational nodes that help keep the operation in order, and allow granular control over the different sections.",
"updated": 1610614976513
"updated": 1610614976513,
"translations": [
{
"language": "IT",
"text": "Al livello più basso, una singola Task controlla un singolo bot. I nodi nel mezzo hanno scopo organizzativo e aiutano a mantenere un ordine tra le operazioni, permettendo un controllo granulare sulle differenti fasi.",
"updated": 1614845793674
}
]
}
]
}
@@ -7,20 +7,48 @@
"project": "Superalgos",
"name": "indicator-process-instance"
},
"text": "By now, all processes should be at 100%. When that happens, we refer to the data mining operation as being up to date."
"text": "By now, all processes should be at 100%. When that happens, we refer to the data mining operation as being up to date.",
"translations": [
{
"language": "IT",
"text": "Ormai tutti i processi dovrebbero essere al 100%. Quando ciò accade, diciamo che l`operazione di data mining è up to date.",
"updated": 1614845999951
}
]
},
"paragraphs": [
{
"style": "Text",
"text": "When all processes are up to date, the bots keep running, processing information in realtime as it is produced at the exchange. That is, the data mining operation doesn't stop unless you stop it!"
"text": "When all processes are up to date, the bots keep running, processing information in realtime as it is produced at the exchange. That is, the data mining operation doesn't stop unless you stop it!",
"translations": [
{
"language": "IT",
"text": "Quando i processi sono up to date, i bots continuano a lavorare e processare dati in tempo reale man mano che sono prodotti dall'exchange. Quindi l'operazione di mining non si ferma a meno che non la stoppi tu!",
"updated": 1614845991321
}
]
},
{
"style": "Callout",
"text": "Look around and see if all processes are at 100%"
"text": "Look around and see if all processes are at 100%",
"translations": [
{
"language": "IT",
"text": "Controlla se tutti i processi sono al 100%",
"updated": 1614846041698
}
]
},
{
"style": "Text",
"text": "To run a Live Trading Session, you need a constant feed of information from the exchange, being processed in realtime, so that the Trading Bot may apply the rules of your Trading System to make live trading decisions."
"text": "To run a Live Trading Session, you need a constant feed of information from the exchange, being processed in realtime, so that the Trading Bot may apply the rules of your Trading System to make live trading decisions.",
"translations": [
{
"language": "IT",
"text": "Per una Live Trading Session hai bisogno di un feed costante di dati dall'exchange che vengono processae in tempo realte, cosicchè il Trading Bot possa applicare le regole del tuo Trading System per prendere decisioni.",
"updated": 1614846102542
}
]
}
]
}
@@ -7,27 +7,62 @@
"project": "Superalgos",
"name": "stop"
},
"text": "We are not going to run a Live Trading Session just yet, so there is no point in keeping our data mining running at this point."
"text": "We are not going to run a Live Trading Session just yet, so there is no point in keeping our data mining running at this point.",
"translations": [
{
"language": "IT",
"text": "Non ci lanceremo subito in una Live Trading Session, quindi non c'è motivo di mantenere attivo il data mining.",
"updated": 1614846160007
}
]
},
"paragraphs": [
{
"style": "Text",
"text": "There are two main reasons to run Data Tasks:",
"updated": 1610616990837
"updated": 1610616990837,
"translations": [
{
"language": "IT",
"text": "Ci sono due motivi principali per eseguire Data Tasks:",
"updated": 1614846176409
}
]
},
{
"style": "List",
"text": "To process historic data: You may want to process a datetime range of any given Market to run a Backtesting Session, or to process new indicators.",
"updated": 1610617009486
"updated": 1610617009486,
"translations": [
{
"language": "IT",
"text": "<b>Per processare dati storici:</b> potresti voler elaborare un intervallo di tempo di un Market per una Backtesting Session, o per generare nuovi indicatori.",
"updated": 1614846254449
}
]
},
{
"style": "List",
"text": "To run a live session: Live sessions of different types, like Paper Trading Session, Forward Testing Session, and Live Trading Session, all need a live market feed.",
"updated": 1610619757862
"updated": 1610619757862,
"translations": [
{
"language": "IT",
"text": "<b>Per eseguire una live session:</b> live session di tipo diverso, come Paper Trading Session, Forward Testing Session e Live Trading Session, hanno tutte bisogno di un market feed live.",
"updated": 1614846320422
}
]
},
{
"style": "Callout",
"text": "If all processes are up to date, then select Stop All Tasks in the Masters Task Manager"
"text": "If all processes are up to date, then select Stop All Tasks in the Masters Task Manager",
"translations": [
{
"language": "IT",
"text": "Se tutti i processi sono up to date, seleziona Stop All Tasks nel Task Manager.",
"updated": 1614846354737
}
]
}
]
}
@@ -7,16 +7,37 @@
"project": "Superalgos",
"name": "dataset-definition"
},
"text": "It may take up to one minute for all tasks to come to a halt. You should never close the system before all tasks stop."
"text": "It may take up to one minute for all tasks to come to a halt. You should never close the system before all tasks stop.",
"translations": [
{
"language": "IT",
"text": "Può volerci fino a un minuto perchè tutte le tasks si fermino. Il sistema non deve assolutamente essere chiuso prima che ciò accada.",
"updated": 1614846504651
}
]
},
"paragraphs": [
{
"style": "Callout",
"text": "Take another quick look at the console app to see how tasks get stopped!"
"text": "Take another quick look at the console app to see how tasks get stopped!",
"translations": [
{
"language": "IT",
"text": "Dai un'occhiata alla console app per vedere come le tasks ricevono il segnale di stop!",
"updated": 1614846474138
}
]
},
{
"style": "Warning",
"text": "Closing the Client before tasks stop may cause your data to become corrupt."
"text": "Closing the Client before tasks stop may cause your data to become corrupt.",
"translations": [
{
"language": "IT",
"text": "Chiudere il Client prima che le tasks si fermino può corromperne i dati.",
"updated": 1614846530784
}
]
}
]
}
@@ -7,17 +7,38 @@
"project": "Superalgos",
"name": "charting-space"
},
"text": "So far, you've been confined to the dark side of Superalgos. Get ready to be exposed to the bright side: the Charting Space."
"text": "So far, you've been confined to the dark side of Superalgos. Get ready to be exposed to the bright side: the Charting Space.",
"translations": [
{
"language": "IT",
"text": "Finora sei rimasto confinato nel lato oscuro di Superalgos. Preparati a incontrare il lato chiaro: il Charting Space.",
"updated": 1614846601940
}
]
},
"paragraphs": [
{
"style": "Text",
"text": "The charting space lives on top of the design space, separated by a turquoise slider. As you will come to expect from Superalgos, the charting space is configurable and highly flexible. Everything that happens there is defined on the Charting Space hierarchy.",
"updated": 1610538092491
"updated": 1610538092491,
"translations": [
{
"language": "IT",
"text": "Il Charting Space si trova al di sopra del Design Space, separato da uno slider turchese. Come imparerai ad aspettarti da Superalgos, il Charting Space è configurabile e molto flessibile. Tutto ciò che accade al suo interno è definito nella gerarchia del Charting Space.",
"updated": 1614846709741
}
]
},
{
"style": "Warning",
"text": "The charting space is known for blowing people's minds. Please, refrain from continuing with this tutorial if you are currently under the influence of psychoactive substances."
"text": "The charting space is known for blowing people's minds. Please, refrain from continuing with this tutorial if you are currently under the influence of psychoactive substances.",
"translations": [
{
"language": "IT",
"text": "Il Charting Space può sbalordire al punto da far girare la testa. Non proseguire questo tutorial se sei sotto l'effetto di sostanze psicoattive.",
"updated": 1614846855335
}
]
}
]
}
@@ -7,16 +7,37 @@
"project": "Superalgos",
"name": "full-board"
},
"text": "I'll get you up to speed with moving around and browsing the charting space in no time... Let's deal with the slider first!"
"text": "I'll get you up to speed with moving around and browsing the charting space in no time... Let's deal with the slider first!",
"translations": [
{
"language": "IT",
"text": "Ti insegnerò a muoverti e navigare nel Charting Space in un attimo...occupiamoci prima dello slider!",
"updated": 1614846929188
}
]
},
"paragraphs": [
{
"style": "Callout",
"text": "Click it and drag it down to close the design space and open the charting space. Do the opposite for the reversed effect. To do it with the keyboard, hit Ctrl + Shift + ↓. Try ↑ ← → too!"
"text": "Click it and drag it down to close the design space and open the charting space. Do the opposite for the reversed effect. To do it with the keyboard, hit Ctrl + Shift + ↓. Try ↑ ← → too!",
"translations": [
{
"language": "IT",
"text": "Clicca lo slider e trascinalo verso il basso per chiudere il design space e aprire lo charting space. Trascinalo verso l'alto per ottenere il risultato opposto. Per farlo con la tastiera, usa Ctrl + Shift + ↓. Prova anche con ↑ ← → !",
"updated": 1614847060275
}
]
},
{
"style": "Note",
"text": "Unless you need both spaces to be partially open, it's always a good idea to fully close either of them to save computing resources in your machine."
"text": "Unless you need both spaces to be partially open, it's always a good idea to fully close either of them to save computing resources in your machine.",
"translations": [
{
"language": "IT",
"text": "A meno che tu non abbia bisogno di tenere parzialmente aperti entrambi gli spazi, è sempre una buona idea chiudere del tutto uno dei due per non consumare troppe risorse sul tuo computer.",
"updated": 1614847125222
}
]
}
]
}
@@ -7,17 +7,38 @@
"project": "Superalgos",
"name": "mouse-right-click"
},
"text": "Just like the design space, the charting space features a huge area where you may set up charts... as many as your hardware can cope with!"
"text": "Just like the design space, the charting space features a huge area where you may set up charts... as many as your hardware can cope with!",
"translations": [
{
"language": "IT",
"text": "Proprio come il Design Space, il Charting Space ha un'enorme area dove puoi inserire grafici...tanti quanti il tuo hardware ne riesce a gestire!",
"updated": 1614847190845
}
]
},
"paragraphs": [
{
"style": "Text",
"text": "There are only two charts in this Getting Started Workspace, to keep things simple for newcomers. Advanced users monitor charts from multiple exchanges and multiple markets.",
"updated": 1610619913827
"updated": 1610619913827,
"translations": [
{
"language": "IT",
"text": "Ci sono solo due charts in questo Workspace Getting Started, per mantenere le cose semplici per i novellini. Utenti avanzati confrontano diversi grafici di diversi exchanges e diversi market.",
"updated": 1614847284524
}
]
},
{
"style": "Callout",
"text": "To move around the charting space, click and drag using your mouse. <br/><br/>The keyboard combination is Shift plus the arrow keys ↑ ← → ↓"
"text": "To move around the charting space, click and drag using your mouse. <br/><br/>The keyboard combination is Shift plus the arrow keys ↑ ← → ↓",
"translations": [
{
"language": "IT",
"text": "Per muoverti nel Charting Space, clicca e trascina usando il tuo mouse. La combinazione di tasti è Shift più i tasti freccia ↑ ← → ↓",
"updated": 1614847340001
}
]
}
]
}
@@ -7,21 +7,49 @@
"project": "Superalgos",
"name": "time-machine"
},
"text": "I mentioned earlier there are two charts in this workspace. In Superalgos, we call each of these a Time Machine."
"text": "I mentioned earlier there are two charts in this workspace. In Superalgos, we call each of these a Time Machine.",
"translations": [
{
"language": "IT",
"text": "Poco fa ho detto che ci sono due grafici in questo workspace. In Superalgos, chiamiamo ognuno di questi grafici una Time Machine.",
"updated": 1614847393489
}
]
},
"paragraphs": [
{
"style": "Text",
"text": "A time machine may hold one Timeline Chart or more. We call them time machines because all timeline charts within a time machine are synchronized in time. This feature of time machines allows to superimpose different layers of data sharing the same Time Scale."
"text": "A time machine may hold one Timeline Chart or more. We call them time machines because all timeline charts within a time machine are synchronized in time. This feature of time machines allows to superimpose different layers of data sharing the same Time Scale.",
"translations": [
{
"language": "IT",
"text": "Una Time Machine può contenere una o più Timeline Chart. Le chiamiamo così perchè tutti i Timeline Chart in una Time Machine sono sincronizzati nel tempo. Ciò permette di sovrapporre differenti livelli di dati che usano la stessa Time Scale.",
"updated": 1614847651838
}
]
},
{
"style": "Callout",
"text": "Hover your mouse pointer over the time machines!"
"text": "Hover your mouse pointer over the time machines!",
"translations": [
{
"language": "IT",
"text": "Sposta il puntatore del mouse sopra le Time Machine!",
"updated": 1614847549742
}
]
},
{
"style": "Text",
"text": "Notice the label emerging on the left-hand side showing which exchanges and markets the data is associated with. A single time machine may hold data from multiple markets and multiple exchanges!",
"updated": 1610622145377
"updated": 1610622145377,
"translations": [
{
"language": "IT",
"text": "Le label che spuntano da sinistra mostrano a quale exchange e market si riferiscono i dati. Una singola Time Machine può contenere dati da diversi markets e exchanges!",
"updated": 1614847670664
}
]
}
]
}
@@ -7,20 +7,48 @@
"project": "Superalgos",
"name": "time-machine"
},
"text": "Ok... maybe it's not actually like bending, but, bear with me... You'll love how you can shape time machines to whatever format you wish."
"text": "Ok... maybe it's not actually like bending, but, bear with me... You'll love how you can shape time machines to whatever format you wish.",
"translations": [
{
"language": "IT",
"text": "Ok...forse non è proprio come controllare il tempo, ma facciamo finta... Adorerai come puoi configurare le Time Machine in qualsiasi modo tu desideri.",
"updated": 1614847760593
}
]
},
"paragraphs": [
{
"style": "Text",
"text": "Hover your mouse pointer over any of the edges of the turquoise frame defining the time machine and see what happens. See how the edge is highlighted in yellow?"
"text": "Hover your mouse pointer over any of the edges of the turquoise frame defining the time machine and see what happens. See how the edge is highlighted in yellow?",
"translations": [
{
"language": "IT",
"text": "Sposta il puntatore su uno qualsiasi dei lati della cornice turchese che definisce la Time Machine, e osserva cosa succede. Vedi come il lato si evidenzia in giallo?",
"updated": 1614847838157
}
]
},
{
"style": "Callout",
"text": "Cool! Now, left-click the frame and pull!"
"text": "Cool! Now, left-click the frame and pull!",
"translations": [
{
"language": "IT",
"text": "Forte! Ora cliccalo con il tasto sinistro e tira!",
"updated": 1614847870184
}
]
},
{
"style": "Note",
"text": "This is how you may shape time machines to your liking."
"text": "This is how you may shape time machines to your liking.",
"translations": [
{
"language": "IT",
"text": "In questo modo puoi dare alle tue time machines la forma e aspetto che preferisci.",
"updated": 1614847900032
}
]
}
]
}
@@ -7,22 +7,50 @@
"project": "Superalgos",
"name": "time-machine"
},
"text": "How about shaping the time machine to the exact aspect ratio of your screen?"
"text": "How about shaping the time machine to the exact aspect ratio of your screen?",
"translations": [
{
"language": "IT",
"text": "Che ne dici di adattare perfettamente la Time Machine al formato del tuo schermo?",
"updated": 1614848136114
}
]
},
"paragraphs": [
{
"style": "Text",
"text": "Matching the aspect ratio of your time machines to the aspect ratio of your screen is crucial for charts to fit your screen tightly!"
"text": "Matching the aspect ratio of your time machines to the aspect ratio of your screen is crucial for charts to fit your screen tightly!",
"translations": [
{
"language": "IT",
"text": "Dare alle tue time machines lo stesso aspect ratio del tuo schermo è importante perchè si adattino perfettamente ad esso.",
"updated": 1614848156397
}
]
},
{
"style": "Callout",
"text": "Point your mouse at one of the time machines and hit Ctrl + Shift + Key-A. Do the same with the other one!",
"updated": 1610134929741
"updated": 1610134929741,
"translations": [
{
"language": "IT",
"text": "Sposta il mouse su una delle time machines e premi Ctrl + Shift + Key-A. Fai lo stesso con l'altra.",
"updated": 1614848104941
}
]
},
{
"style": "Success",
"text": "Leave the two time machines matching the aspect ratio of your screen. from now on!",
"updated": 1610622263656
"updated": 1610622263656,
"translations": [
{
"language": "IT",
"text": "D'ora in poi, lascia le due time machines con lo stesso aspect ratio del tuo schermo!",
"updated": 1614848186502
}
]
}
]
}
@@ -7,21 +7,49 @@
"project": "Superalgos",
"name": "hand-drag"
},
"text": "One more thing before we dive into the charts. You need to know how to put the house in order!"
"text": "One more thing before we dive into the charts. You need to know how to put the house in order!",
"translations": [
{
"language": "IT",
"text": "Un'ultima cosa prima di tuffarci nei grafici. Devi sapere come tenere il tuo regno in ordine!",
"updated": 1614848223577
}
]
},
"paragraphs": [
{
"style": "Text",
"text": "The time will come in which you may be working with tens of charts. You already know how to change their format... Now you need to know how to move them around, so that you may create whatever arrangements you require. It's quite easy:"
"text": "The time will come in which you may be working with tens of charts. You already know how to change their format... Now you need to know how to move them around, so that you may create whatever arrangements you require. It's quite easy:",
"translations": [
{
"language": "IT",
"text": "Arriverà il momento in cui potresti dover lavorare con decine di grafici contemporaneamente. Sai già come modificare il loro formato, ma devi sapere come spostarli in modo da configurarli esattamente come vuoi tu. Tranquillo, è facile:",
"updated": 1614848290495
}
]
},
{
"style": "Callout",
"text": "Hit Shift, left-click, and drag!",
"updated": 1610622311803
"updated": 1610622311803,
"translations": [
{
"language": "IT",
"text": "Premi Shift, clicca con il tasto sinistro e trascina!",
"updated": 1614848320456
}
]
},
{
"style": "Text",
"text": "I believe we've covered everything about how to manage the charting space. It's time to dive into the charts!"
"text": "I believe we've covered everything about how to manage the charting space. It's time to dive into the charts!",
"translations": [
{
"language": "IT",
"text": "Bene, direi che abbiamo coperto tutto ciò che serve per configurare il Charting Space. È ora di tuffarci tra i grafici!",
"updated": 1614848393942
}
]
}
]
}
@@ -7,21 +7,49 @@
"project": "Superalgos",
"name": "mouse-wheel-up"
},
"text": "It's time to dive into a Time Machine and see what happens! Are you ready for a full-on immersive experience?"
"text": "It's time to dive into a Time Machine and see what happens! Are you ready for a full-on immersive experience?",
"translations": [
{
"language": "IT",
"text": "È il momento di tuffarci in una Time Machine e vedere che succede! Sei pronto per questa esperienza?",
"updated": 1614892693632
}
]
},
"paragraphs": [
{
"style": "Text",
"text": "The charting space is like the Google Maps of market charts. As you already know, you left-click and drag to move around the landscape... but, how do you zoom in to see the details?"
"text": "The charting space is like the Google Maps of market charts. As you already know, you left-click and drag to move around the landscape... but, how do you zoom in to see the details?",
"translations": [
{
"language": "IT",
"text": "Il Charting Space è un po'come il Google Maps dei grafici di mercato. Come sai già, si clicca e si trascina per spostarsi al suo interno...ma come si zoomma per vedere i dettagli?",
"updated": 1614892771662
}
]
},
{
"style": "Callout",
"text": "With the wheel of the mouse! Try it!"
"text": "With the wheel of the mouse! Try it!",
"translations": [
{
"language": "IT",
"text": "Con la rotella del mouse! Provaci!",
"updated": 1614892781701
}
]
},
{
"style": "Text",
"text": "Exactly! Just like in Google Maps! Point the mouse to the area of interest, then roll the wheel of the mouse forwards to zoom in, and backwards to zoom out!",
"updated": 1610622413974
"updated": 1610622413974,
"translations": [
{
"language": "IT",
"text": "Esatto! Proprio come su Google Maps! Posiziona il mouse su un'area di interesse e gira la rotella in avanti per aumentare lo zoom, e all'indietro per diminuirlo!",
"updated": 1614892836540
}
]
}
]
}
@@ -7,21 +7,49 @@
"project": "Superalgos",
"name": "mouse-pointer"
},
"text": "I know! Zooming into a random spot is unlikely to position the chart squared with your screen, right? No worries..."
"text": "I know! Zooming into a random spot is unlikely to position the chart squared with your screen, right? No worries...",
"translations": [
{
"language": "IT",
"text": "Lo so, zoommare su un punto a caso difficilmente farà sì che il grafico si adatti al tuo schermo, vero? No problem...",
"updated": 1614893061080
}
]
},
"paragraphs": [
{
"style": "Text",
"text": "I'll show you how to get into a chart so that everything fits nicely. First, use the Ctrl + Shift + Key-A keys to adjust the aspect ratio to fit your screen. Then, zoom out fully with your mouse. From this position...",
"updated": 1610134957920
"updated": 1610134957920,
"translations": [
{
"language": "IT",
"text": "Ti mostro come entrare in un grafico lasciando tutto in ordine. Usa Ctrl + Shift + Key-A per adattarlo all'aspect ratio del tuo schermo. Poi, zoomma all'indietro con il mouse. Da qui...",
"updated": 1614893079786
}
]
},
{
"style": "Callout",
"text": "Double-click on the time machine on top! Twice!"
"text": "Double-click on the time machine on top! Twice!",
"translations": [
{
"language": "IT",
"text": "Fai doppio click sulla Time Machine in cima! Due volte!",
"updated": 1614893194631
}
]
},
{
"style": "Text",
"text": "The first double-click centers the chart, and takes you to a certain level of zoom; some margin is left to fit the name of the chart and the tab on the top-left corner. The second double-click takes you all the way in, to the zoom level on which layer managers emerge."
"text": "The first double-click centers the chart, and takes you to a certain level of zoom; some margin is left to fit the name of the chart and the tab on the top-left corner. The second double-click takes you all the way in, to the zoom level on which layer managers emerge.",
"translations": [
{
"language": "IT",
"text": "Il primo doppio click centra il grafico e lo zoomma, lasciando un po' di margine per mostrare il nome e la tab in alto a sinistra. Il secondo doppio-click ti trasporta al suo interno, al livello di zoom dove emergono i layer managers.",
"updated": 1614893166373
}
]
}
]
}
@@ -7,20 +7,48 @@
"project": "Superalgos",
"name": "mouse-left-click"
},
"text": "So, you are finally inside a chart. The first thing you'll want to do is move around and learn what these charts may do for you."
"text": "So, you are finally inside a chart. The first thing you'll want to do is move around and learn what these charts may do for you.",
"translations": [
{
"language": "IT",
"text": "Ecco, sei finalmente dentro un grafico. La prima cosa che vorrai fare sarà farci un giro e imparare cosa può fare per te.",
"updated": 1614893263479
}
]
},
"paragraphs": [
{
"style": "Text",
"text": "Let's get on with that! Like in the design space&mdash;when inside a time machine&mdash;you move by using your mouse and your keyboard. This is how:"
"text": "Let's get on with that! Like in the design space&mdash;when inside a time machine&mdash;you move by using your mouse and your keyboard. This is how:",
"translations": [
{
"language": "IT",
"text": "Facciamolo subito! Proprio come nel Design Space, puoi muoverti usando mouse e tastiera. Ecco come:",
"updated": 1614893324158
}
]
},
{
"style": "Callout",
"text": "With the mouse, left-click and drag. With the keyboard, use the arrow keys: ← → ↑ ↓"
"text": "With the mouse, left-click and drag. With the keyboard, use the arrow keys: ← → ↑ ↓",
"translations": [
{
"language": "IT",
"text": "Con il mouse, fai click con il tasto sinistro e trascina. Con la tastiera, usa le frecce: ← → ↑ ↓",
"updated": 1614893357947
}
]
},
{
"style": "Note",
"text": "What? It's not working? Are you stuck with a frozen chart? Like in the video on the next step? Don't worry! I know what's going on..."
"text": "What? It's not working? Are you stuck with a frozen chart? Like in the video on the next step? Don't worry! I know what's going on...",
"translations": [
{
"language": "IT",
"text": "Come? Non funziona? Il grafico resta fermo? Proprio come nel video nel prossimo step? Ah, non preoccuparti! Lo so io cosa sta succedendo...",
"updated": 1614893399468
}
]
}
]
}
@@ -3,7 +3,14 @@
"pageNumber": 41,
"type": "Tutorial Step - Welcome Charts Scales Auto Locked",
"definition": {
"text": "This step will play a video in full screen mode."
"text": "This step will play a video in full screen mode.",
"translations": [
{
"language": "IT",
"text": "Questo step eseguirà un video in modalità schermo intero.",
"updated": 1614893428433
}
]
},
"paragraphs": [
{
@@ -7,20 +7,48 @@
"project": "Superalgos",
"name": "time-scale"
},
"text": "The reason why you can't move is that scales are locked in the automatic mode so that you may easily find the data after your first data mining operation."
"text": "The reason why you can't move is that scales are locked in the automatic mode so that you may easily find the data after your first data mining operation.",
"translations": [
{
"language": "IT",
"text": "Il motivo per cui non ti puoi muovere è che le scale sono bloccate in modalità automatica, così puoi trovare facilmente i dati dopo la tua prima operazione di mining.",
"updated": 1614893522639
}
]
},
"paragraphs": [
{
"style": "Text",
"text": "Setting the Time Scale in automatic mode forces the whole datetime range of available data into the chart."
"text": "Setting the Time Scale in automatic mode forces the whole datetime range of available data into the chart.",
"translations": [
{
"language": "IT",
"text": "Settare la Time Scale in modalità automatica fa sì che i dati sull'intera scala temporale vengano mostrati insieme sul grafico.",
"updated": 1614893577134
}
]
},
{
"style": "Callout",
"text": "To toggle between the various automatic modes and manual mode, hit Shift and make a gentle one-step roll with the wheel of your mouse on top of the time scale box."
"text": "To toggle between the various automatic modes and manual mode, hit Shift and make a gentle one-step roll with the wheel of your mouse on top of the time scale box.",
"translations": [
{
"language": "IT",
"text": "Per cambiare tra automatico e manuale, premi Shift e ruota una volta la rotella del mouse sopra a una time scale box.",
"updated": 1614893644877
}
]
},
{
"style": "Text",
"text": "Once you've taken care of that, you should be able to move freely on the X-axis, that is, the time axis of the chart. See the video on the next step for clarity."
"text": "Once you've taken care of that, you should be able to move freely on the X-axis, that is, the time axis of the chart. See the video on the next step for clarity.",
"translations": [
{
"language": "IT",
"text": "Fatto questo, dovresti essere libero di muoverti liberamente sull'asse X, quello del tempo. Guarda il prossimo video per maggiori dettagli.",
"updated": 1614893688199
}
]
}
]
}
@@ -3,7 +3,14 @@
"pageNumber": 43,
"type": "Tutorial Step - Welcome Charts Scales Unlock Time Scale",
"definition": {
"text": "This step will play a video in full screen mode."
"text": "This step will play a video in full screen mode.",
"translations": [
{
"language": "IT",
"text": "Questo step eseguirà il video in modalità schermo intero.",
"updated": 1614893704588
}
]
},
"paragraphs": [
{
@@ -7,20 +7,48 @@
"project": "Superalgos",
"name": "time-scale"
},
"text": "Did you pick up the trick to scale time from the previous video? If not, go to the previous step and watch attentively!"
"text": "Did you pick up the trick to scale time from the previous video? If not, go to the previous step and watch attentively!",
"translations": [
{
"language": "IT",
"text": "Sei riuscito a mettere in pratica il trucchetto nel video precedente? Se non ce l'hai fatta, torna all'ultimo step e guarda bene!",
"updated": 1614893781372
}
]
},
"paragraphs": [
{
"style": "Text",
"text": "That's it! Scroll it, my friend!"
"text": "That's it! Scroll it, my friend!",
"translations": [
{
"language": "IT",
"text": "Esatto! Ruota quella rotella, amico!",
"updated": 1614893806439
}
]
},
{
"style": "Callout",
"text": "Scrolling the wheel of the mouse on top of the time scale box shrinks and expands time!"
"text": "Scrolling the wheel of the mouse on top of the time scale box shrinks and expands time!",
"translations": [
{
"language": "IT",
"text": "Ruotare la rotella del mouse su una time scale box espande e comprime il tempo!",
"updated": 1614893833795
}
]
},
{
"style": "Note",
"text": "There's one more interesting detail worth noting in the previous video: when the time scale exits the automatic mode, the two tiny green triangles indicating each end of the automatic scale disappear!"
"text": "There's one more interesting detail worth noting in the previous video: when the time scale exits the automatic mode, the two tiny green triangles indicating each end of the automatic scale disappear!",
"translations": [
{
"language": "IT",
"text": "C'è un dettaglio interessante nel video precedente: quando la time scale esce dalla modalità automatica, i due piccoli triangoli verdi che indicano gli estremi della scala automatica scompaiono!",
"updated": 1614893892461
}
]
}
]
}
@@ -7,20 +7,48 @@
"project": "Superalgos",
"name": "rate-scale"
},
"text": "Do I need to tell you how the Rate Scale works or can you figure it out on your own? Ok... I'll give you a hint..."
"text": "Do I need to tell you how the Rate Scale works or can you figure it out on your own? Ok... I'll give you a hint...",
"translations": [
{
"language": "IT",
"text": "Vuoi che ti spieghi come funziona il Rate Scale, o lo immagini già? Ok, ti darò un suggerimento...",
"updated": 1614893948589
}
]
},
"paragraphs": [
{
"style": "Callout",
"text": "The rate scale works like the time scale! Check the video coming next for clarity!"
"text": "The rate scale works like the time scale! Check the video coming next for clarity!",
"translations": [
{
"language": "IT",
"text": "Funziona esattamente come il Time Scale! Guarda il video al prossimo step per i dettagli.",
"updated": 1614893978290
}
]
},
{
"style": "Note",
"text": "There's one more scale to work with. I'll tell you all about it after the video."
"text": "There's one more scale to work with. I'll tell you all about it after the video.",
"translations": [
{
"language": "IT",
"text": "C'è ancora una scala con cui lavorare. Te ne parlerò meglio dopo il video.",
"updated": 1614893999920
}
]
},
{
"style": "Success",
"text": "Play with the semi-automatic scale modes too! You know, when a single tiny triangle remains visible after a few flicks of the mouse wheel."
"text": "Play with the semi-automatic scale modes too! You know, when a single tiny triangle remains visible after a few flicks of the mouse wheel.",
"translations": [
{
"language": "IT",
"text": "Prova anche la modalità semi-automatica per le differenti scale! Ruota la rotella del mouse finchè non vedi un singolo triangolino verde.",
"updated": 1614894098439
}
]
}
]
}
@@ -3,7 +3,14 @@
"pageNumber": 46,
"type": "Tutorial Step - Welcome Charts Scales Unlock Rate Scale",
"definition": {
"text": "This step will play a video in full screen mode."
"text": "This step will play a video in full screen mode.",
"translations": [
{
"language": "IT",
"text": "Questo step eseguirà un video in modalità schermo intero.",
"updated": 1614894117992
}
]
},
"paragraphs": [
{
@@ -7,16 +7,37 @@
"project": "Superalgos",
"name": "time-frame-scale"
},
"text": "News-flash about the Time Frame Scale: there is no automatic mode!"
"text": "News-flash about the Time Frame Scale: there is no automatic mode!",
"translations": [
{
"language": "IT",
"text": "Notizia lampo sulla Time Frame Scale: non esiste una modalità automatica!",
"updated": 1614894147285
}
]
},
"paragraphs": [
{
"style": "Text",
"text": "You may freely toggle through all available time frames! In descending order: 24, 8, 6, 4, 3, 2, and 1 hours, and 45, 40, 30, 20, 15, 10, 5, 4, 3, 2, and 1 minutes."
"text": "You may freely toggle through all available time frames! In descending order: 24, 8, 6, 4, 3, 2, and 1 hours, and 45, 40, 30, 20, 15, 10, 5, 4, 3, 2, and 1 minutes.",
"translations": [
{
"language": "IT",
"text": "Puoi scegliere liberamente tra tutti i time frame disponibili! In ordine decrescente: 24, 8, 6, 4, 3, 2, e 1 ore, e 45, 40, 30, 20, 15, 10, 5, 4, 3, 2, e 1 minuti.",
"updated": 1614894203571
}
]
},
{
"style": "Important",
"text": "Beware when you switch the time frame scale to lower time frames! Dropping time frames too fast and without adjusting the time scale may cause too much information to be rendered on-screen at a time, slowing down your computer. How much information density your hardware may handle depends on its CPU and GPU performance."
"text": "Beware when you switch the time frame scale to lower time frames! Dropping time frames too fast and without adjusting the time scale may cause too much information to be rendered on-screen at a time, slowing down your computer. How much information density your hardware may handle depends on its CPU and GPU performance.",
"translations": [
{
"language": "IT",
"text": "Fai attenzione quando selezioni time frame con intervalli di tempo più brevi! Scalare i time frame verso il basso troppo rapidamente può causare il rendering sullo schermo di troppi dati contemporanamente e ciò può rallentare il computer. I limiti a questo proposito dipendono dal tuo hardware.",
"updated": 1614894385185
}
]
}
]
}
@@ -3,7 +3,14 @@
"pageNumber": 48,
"type": "Tutorial Step - Welcome Charts Scales Time Frame Scale",
"definition": {
"text": "This step will play a video in full screen mode."
"text": "This step will play a video in full screen mode.",
"translations": [
{
"language": "IT",
"text": "Questo step eseguirà un video in modalità schermo intero.",
"updated": 1614894425390
}
]
},
"paragraphs": [
{
@@ -7,17 +7,38 @@
"project": "Superalgos",
"name": "balance"
},
"text": "You just learned the basics about the three scales governing the charts, but there's more!"
"text": "You just learned the basics about the three scales governing the charts, but there's more!",
"translations": [
{
"language": "IT",
"text": "Hai imparato le basi delle tre scale che governano i grafici, ma c'è di più!",
"updated": 1614894499111
}
]
},
"paragraphs": [
{
"style": "Text",
"text": "Remember I mentioned that a Time Machine may feature multiple charts from multiple exchanges and markets? There is no limit as to how you may visualize data in Superalgos, and scales play a major role in more complex configurations than the ones we are exploring at this point."
"text": "Remember I mentioned that a Time Machine may feature multiple charts from multiple exchanges and markets? There is no limit as to how you may visualize data in Superalgos, and scales play a major role in more complex configurations than the ones we are exploring at this point.",
"translations": [
{
"language": "IT",
"text": "Ricordi quando ti ho detto che una Time Machine può contenere più grafici provenienti da molteplici exchange e markets? Non c'è limite al numero di modi in cui puoi visualizzare i dati in Superalgos, e le scale giocano un ruolo chiave in configurazioni più complesse di quelle che abbiamo esplorato finora.",
"updated": 1614894601856
}
]
},
{
"style": "Callout",
"text": "If you wish to learn all the details, feel free to go through the Scales section of the documentation.",
"updated": 1610539789707
"updated": 1610539789707,
"translations": [
{
"language": "IT",
"text": "Se vuoi imparare tutti i dettagli, consulta la sezione Scales nella documentazione completa.",
"updated": 1614894588673
}
]
}
]
}
@@ -4,6 +4,7 @@ exports.newSuperalgosBotModulesHistoricOHLCVs = function (processIndex) {
const MODULE_NAME = "Historic OHLCVs";
const CANDLES_FOLDER_NAME = "Candles/One-Min";
const VOLUMES_FOLDER_NAME = "Volumes/One-Min";
const OHLCVS_FOLDER_NAME = "OHLCVs/One-Min";
thisObject = {
initialize: initialize,
@@ -16,6 +17,11 @@ exports.newSuperalgosBotModulesHistoricOHLCVs = function (processIndex) {
const MAX_OHLCVs_PER_EXECUTION = 10000000
const symbol = TS.projects.superalgos.globals.taskConstants.TASK_NODE.parentNode.parentNode.parentNode.referenceParent.baseAsset.referenceParent.config.codeName + '/' + TS.projects.superalgos.globals.taskConstants.TASK_NODE.parentNode.parentNode.parentNode.referenceParent.quotedAsset.referenceParent.config.codeName
const ccxt = require('ccxt')
/*
This next is required when using an exchange that uses fetchTrades in place of fetchOHLCVs
in order to be able to access the method that builds the OHLCVs, and this method is inside the CCTX library.
*/
const ccxtMisc = require('./node_modules/ccxt/js/base/functions/misc')
let fetchType = "by Time"
let lastId
@@ -30,10 +36,29 @@ exports.newSuperalgosBotModulesHistoricOHLCVs = function (processIndex) {
let rateLimit = 500
let exchange
let uiStartDate = new Date(TS.projects.superalgos.globals.taskConstants.TASK_NODE.bot.config.startDate)
let fisrtTimeThisProcessRun = false
let firstTimeThisProcessRun = false
let limit = 1000 // This is the default value
let hostname
let lastCandleOfTheDay
/*
The following variables are used for exchanges that do not provide any method in their API to retrieve OHLCV data.
In the CCTX library, such exchanges have the fetchOHLCV method as being "emulated", and as such, you can only
retrieve raw trade data using the fetchTrades method, and then you have to manually aggregate the received trades
into OHLCV data.
An example of such an exchange is Luno (codeName:luno).
To ensure that the code for other exchanges is not impacted, it is necessary to add into the desired exchange's
UI API settings, the two items shown below. It is also important to set the "rateLimit" in the API correctly to
match what the exchange is prepared to offer when fetching trades. Furthermore, the "limit" in the API also needs
to be set to a value that allows the UI to update at regular intervals (e.g. 200). Finally, do not forget to put
in the UI API settings the "method": "fetch_ohlcv", otherwise none of these other settings will work !
useFetchTradesForFetchOHLCVs - this must be set to true to indicate that the code will be using fetchTrades instead
of fetchOHLCVs (or similar exchange-specific method).
maxTradesPerFetch - this is set to a number that indicates the maximum number of trades the exchange will return in
the fetchTrades method (e.g. for the Luno exchange, this number is 100).
*/
let useFetchTradesForFetchOHLCVs = false
let maxTradesPerFetch = 100
return thisObject;
@@ -48,8 +73,8 @@ exports.newSuperalgosBotModulesHistoricOHLCVs = function (processIndex) {
/* Applying the parameters defined by the user at the Exchange Node Config */
if (TS.projects.superalgos.globals.taskConstants.TASK_NODE.parentNode.parentNode.parentNode.referenceParent.parentNode.parentNode.config.API !== undefined) {
/*
The config all ow us to define for the API different parameters for different
methods calls. At this point we are only interested of the parameters for the
The config allows us to define for the API different parameters for different
methods calls. At this point we are only interested in the parameters for the
fetch_ohlcv method, so we ignore the rest.
*/
for (let i = 0; i < TS.projects.superalgos.globals.taskConstants.TASK_NODE.parentNode.parentNode.parentNode.referenceParent.parentNode.parentNode.config.API.length; i++) {
@@ -78,6 +103,12 @@ exports.newSuperalgosBotModulesHistoricOHLCVs = function (processIndex) {
if (API.limit !== undefined) {
limit = API.limit
}
if (API.useFetchTradesForFetchOHLCVs !== undefined) {
useFetchTradesForFetchOHLCVs = API.useFetchTradesForFetchOHLCVs
if (API.maxExchangeTrades !== undefined) {
maxTradesPerFetch = API.maxTradesPerFetch
}
}
}
}
}
@@ -129,6 +160,7 @@ exports.newSuperalgosBotModulesHistoricOHLCVs = function (processIndex) {
data from the exchange.
*/
let rawDataArray = []
let mustLoadRawData = false
if (TS.projects.superalgos.globals.taskVariables.IS_TASK_STOPPING === true) {
callBackFunction(TS.projects.superalgos.globals.standardResponses.DEFAULT_OK_RESPONSE);
@@ -155,7 +187,7 @@ exports.newSuperalgosBotModulesHistoricOHLCVs = function (processIndex) {
function getContextVariables() {
try {
let reportKey;
let reportKey
reportKey = "Masters" + "-" + "Exchange-Raw-Data" + "-" + "Historic-OHLCVs"
TS.projects.superalgos.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
@@ -170,13 +202,13 @@ exports.newSuperalgosBotModulesHistoricOHLCVs = function (processIndex) {
thisReport = statusDependencies.statusReports.get(reportKey)
if (thisReport.file.beginingOfMarket !== undefined) { // This means this is not the first time this process run.
if (thisReport.file.beginingOfMarket !== undefined) { // This means this is not the first time this process has run.
beginingOfMarket = new Date(thisReport.file.beginingOfMarket.year + "-" + thisReport.file.beginingOfMarket.month + "-" + thisReport.file.beginingOfMarket.days + " " + thisReport.file.beginingOfMarket.hours + ":" + thisReport.file.beginingOfMarket.minutes + TS.projects.superalgos.globals.timeConstants.GMT_SECONDS);
lastFile = new Date(thisReport.file.lastFile.year + "-" + thisReport.file.lastFile.month + "-" + thisReport.file.lastFile.days + " " + thisReport.file.lastFile.hours + ":" + thisReport.file.lastFile.minutes + TS.projects.superalgos.globals.timeConstants.GMT_SECONDS);
lastId = thisReport.file.lastId
lastCandleOfTheDay = thisReport.file.lastCandleOfTheDay
} else { // This means this is the first time this process run.
fisrtTimeThisProcessRun = true
} else { // This means this is the first time this process has run.
firstTimeThisProcessRun = true
beginingOfMarket = new Date(uiStartDate.valueOf())
}
@@ -187,23 +219,85 @@ exports.newSuperalgosBotModulesHistoricOHLCVs = function (processIndex) {
} else {
thisReport.file.uiStartDate = new Date(thisReport.file.uiStartDate)
}
if (uiStartDate.valueOf() !== thisReport.file.uiStartDate.valueOf()) {
since = uiStartDate.valueOf()
initialProcessTimestamp = since
fisrtTimeThisProcessRun = true
firstTimeThisProcessRun = true
beginingOfMarket = new Date(uiStartDate.valueOf())
} else {
if (lastFile !== undefined) {
since = lastFile.valueOf()
initialProcessTimestamp = lastFile.valueOf()
if (thisReport.file.mustLoadRawData !== undefined) {
mustLoadRawData = thisReport.file.mustLoadRawData
}
} else {
since = uiStartDate.valueOf()
initialProcessTimestamp = uiStartDate.valueOf()
}
}
}
if (mustLoadRawData) { // there is raw data to load
getRawDataArray() // so fetch it from the file wehere it was saved on the last run of this process
}
function getRawDataArray() {
mustLoadRawData = false
let fileName = "Data.json"
let datetime = new Date(lastFile.valueOf())
let dateForPath = datetime.getUTCFullYear() + '/' +
TS.projects.superalgos.utilities.miscellaneousFunctions.pad(datetime.getUTCMonth() + 1, 2) + '/' +
TS.projects.superalgos.utilities.miscellaneousFunctions.pad(datetime.getUTCDate(), 2)
let filePath = TS.projects.superalgos.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).FILE_PATH_ROOT + "/Output/" + OHLCVS_FOLDER_NAME + '/' + dateForPath;
let fullFileName = filePath + '/' + fileName
fileStorage.getTextFile(fullFileName, onFileReceived)
TS.projects.superalgos.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[INFO] start -> getRawDataArray -> from file = " + fullFileName)
function onFileReceived(err, text) {
try {
if (err.result === TS.projects.superalgos.globals.standardResponses.DEFAULT_OK_RESPONSE.result) {
try {
rawDataArray = JSON.parse(text);
let dataLength = rawDataArray.length
if (dataLength > 1) {
let lastData = rawDataArray[dataLength - 1]
let lastTimeStamp = lastData[0]
rawDataArray.pop() // ditch the last ohlcv since it may be incomplete
dataLength = rawDataArray.length
since = lastTimeStamp // we will now start again from the last full ohlvc we had (instead of the beginning of the day)
} else {
rawDataArrayFile = [] // we got less than two ohlcvs so we might as well start again from the beginning of the day
}
} catch (err) {
TS.projects.superalgos.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[ERROR] start -> getRawDataArray -> onFileReceived -> Error Parsing JSON -> err = " + err.stack)
TS.projects.superalgos.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[WARN] start -> getRawDataArray -> onFileReceived -> Falling back to default start with empty rawDataArray.");
return
}
} else {
if (err.message === 'File does not exist.' || err.code === 'The specified key does not exist.') {
TS.projects.superalgos.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[WARN] start -> getRawDataArray -> onFileReceived -> File not found -> err = " + err.stack)
TS.projects.superalgos.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[WARN] start -> getRawDataArray -> onFileReceived -> Falling back to default start with empty rawDataArray.");
return
} else {
TS.projects.superalgos.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[ERROR] start -> getRawDataArray -> onFileReceived -> Error Received -> err = " + err.stack)
callBackFunction(err);
return
}
}
} catch (err) {
TS.projects.superalgos.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).UNEXPECTED_ERROR = err
TS.projects.superalgos.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[ERROR] start -> getRawDataArray -> onFileReceived -> err = " + err.stack);
callBackFunction(TS.projects.superalgos.globals.standardResponses.DEFAULT_FAIL_RESPONSE);
}
}
}
}
} catch (err) {
TS.projects.superalgos.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).UNEXPECTED_ERROR = err
TS.projects.superalgos.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
@@ -288,7 +382,9 @@ exports.newSuperalgosBotModulesHistoricOHLCVs = function (processIndex) {
/* Fetching the OHLCVs from the exchange.*/
await new Promise(resolve => setTimeout(resolve, rateLimit)) // rate limit
const OHLCVs = await exchange.fetchOHLCV(symbol, '1m', since, limit, params)
const OHLCVs = useFetchTradesForFetchOHLCVs ?
await fetchTradesForOHLCV(symbol, '1m', since, limit, params) :
await exchange.fetchOHLCV(symbol, '1m', since, limit, params)
/*
OHLCV Structure
@@ -310,20 +406,20 @@ exports.newSuperalgosBotModulesHistoricOHLCVs = function (processIndex) {
TS.projects.superalgos.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[INFO] start -> getOHLCVs -> OHLCVs Fetched = " + OHLCVs.length)
if (OHLCVs.length > 0) {
let beginDate = new Date(OHLCVs[0].timestamp)
let endDate = new Date(OHLCVs[OHLCVs.length - 1].timestamp)
let beginDate = new Date(OHLCVs[0][0])
let endDate = new Date(OHLCVs[OHLCVs.length - 1][0])
TS.projects.superalgos.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[INFO] start -> getOHLCVs -> OHLCVs Fetched From " + beginDate + " -> timestamp = " + OHLCVs[0].timestamp)
"[INFO] start -> getOHLCVs -> OHLCVs Fetched From " + beginDate + " -> timestamp = " + OHLCVs[0][0])
TS.projects.superalgos.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[INFO] start -> getOHLCVs -> OHLCVs Fetched to " + endDate + " -> timestamp = " + OHLCVs[OHLCVs.length - 1].timestamp)
"[INFO] start -> getOHLCVs -> OHLCVs Fetched to " + endDate + " -> timestamp = " + OHLCVs[OHLCVs.length - 1][0])
if (fisrtTimeThisProcessRun === true) {
if (firstTimeThisProcessRun === true) {
let OHLCV = OHLCVs[0]
initialProcessTimestamp = OHLCV[0] // 'timestamp'
beginingOfMarket = new Date(Math.trunc(OHLCV[0] / TS.projects.superalgos.globals.timeConstants.ONE_DAY_IN_MILISECONDS) * TS.projects.superalgos.globals.timeConstants.ONE_DAY_IN_MILISECONDS) // 'timestamp'
fromDate = new Date(beginingOfMarket.valueOf())
fisrtTimeThisProcessRun = false
firstTimeThisProcessRun = false
}
}
@@ -331,7 +427,7 @@ exports.newSuperalgosBotModulesHistoricOHLCVs = function (processIndex) {
previousSince = since
since = OHLCVs[OHLCVs.length - 1][0] // 'timestamp'
if (since === previousSince) {
since++ // this prevents requesting in a loop OHLCVs with the same timestamp, that can happen when all the records fetched comes with exactly the same timestamp.
since++ // this prevents requesting in a loop OHLCVs with the same timestamp, that can happen when all the records fetched come with exactly the same timestamp.
}
@@ -386,16 +482,53 @@ exports.newSuperalgosBotModulesHistoricOHLCVs = function (processIndex) {
}
}
async function fetchTradesForOHLCV(symbol, timeframe = '1m', since = undefined, limit = undefined, params = {}) {
let ohlcvcArray = [] // the array where the trades will be accumulated into ohlcvs
let startOfFetchTrades = since
let endOfFetchTrades
if (lastFile === undefined) {
endOfFetchTrades = (Math.trunc(since / TS.projects.superalgos.globals.timeConstants.ONE_DAY_IN_MILISECONDS) * TS.projects.superalgos.globals.timeConstants.ONE_DAY_IN_MILISECONDS)
} else {
endOfFetchTrades = lastFile.valueOf()
}
endOfFetchTrades += TS.projects.superalgos.globals.timeConstants.ONE_DAY_IN_MILISECONDS
while (TS.projects.superalgos.globals.taskVariables.IS_TASK_STOPPING !== true) {
var trades = await exchange.fetchTrades(symbol, startOfFetchTrades, limit, params)
if (trades.length > 0) {
let lastRetrievedTrade = trades[trades.length - 1]
startOfFetchTrades = lastRetrievedTrade.timestamp + 1
const ohlcvc = ccxtMisc.buildOHLCVC (trades, timeframe, since, limit)
ohlcvcArray = ohlcvcArray.concat(ohlcvc) // add the latest ohlcvs to the accumulation array
if (startOfFetchTrades > endOfFetchTrades) {
break // end of the day
} else {
if (trades.length < maxTradesPerFetch) {
break // end of the market
} else {
if (ohlcvcArray.length > limit) {
break // get enough ohlcvs for this process loop
} else {
await new Promise(resolve => setTimeout(resolve, rateLimit)) // wait for exchanges rateLimit before requesting again
}
}
}
} else {
break // exchange has no more trades
}
}
return ohlcvcArray.map ((c) => c.slice (0, -1))
}
async function saveOHLCVs() {
/*
What we are going to do in this function is to save all the candles
received from the exchage. We need to partition the batch of candles
received from the exchange. We need to partition the batch of candles
into 1 day files. At the same time we need to take care of the situation
that some exchanges send inconsitent data. We have detected some cases
where candles do not begin at second 0 of the minute but are a little
bit shifted. We will try to detectthis and fix it as we go.
bit shifted. We will try to detect this and fix it as we go.
We have the data received from the exchage at the arrary rawDataArray
We have the data received from the exchange at the arrary rawDataArray
*/
try {
@@ -448,10 +581,10 @@ exports.newSuperalgosBotModulesHistoricOHLCVs = function (processIndex) {
let filesCreated = 0
/*
We will loop aroud all the possible 1 minute candles that be found
We will loop around all the possible 1 minute candles that have been found
on a single day. For each minute of the day, we will try to find
the matching OHLCV. This would be an easy task if the exchanges
would allways return consistent data, but that is not the case.
would always return consistent data, but that is not the case.
Sometimes, some candles are missing. We have seen also candles that
do not start at an UTC minute, they are shifted in time some seconds.
In order to address all these inconsistencies the process gets a little
@@ -463,7 +596,7 @@ exports.newSuperalgosBotModulesHistoricOHLCVs = function (processIndex) {
We initialize our candle and volume objecs positioning them
at the current minute of the day of the current day. We also
initialize them with the last candle and volume property values.
The reason we do this last thing is because we don't knwo if
The reason we do this last thing is because we don't know if
we are going to find or not a matching OHLCV. If we do find one
these property values will be overwritten, and if not, they will
hold at least the last know value.
@@ -512,13 +645,13 @@ exports.newSuperalgosBotModulesHistoricOHLCVs = function (processIndex) {
*/
logAndHeartBeat()
/* We exit the loop and we aint comming back*/
/* We exit the loop and we ain't coming back*/
return
}
/*
We initialize here the OHLCV object. These initial
values should be overrided unless there are no
values should be overridden unless there are no
OHLVCs fetched from the exchange. We need the
timestamp in order to calculate OHLCVMinute.
*/
@@ -672,7 +805,7 @@ exports.newSuperalgosBotModulesHistoricOHLCVs = function (processIndex) {
}
function logAndHeartBeat() {
/* We need thi processing date for logging purposes only */
/* We need the processing date for logging purposes only */
let processingDate = new Date(candle.begin)
processingDate =
processingDate.getUTCFullYear() + '-' +
@@ -703,6 +836,7 @@ exports.newSuperalgosBotModulesHistoricOHLCVs = function (processIndex) {
function saveFile(day) {
candlesFileContent = candlesFileContent + ']'
volumesFileContent = volumesFileContent + ']'
ohlcvsFileContent = getRawDataToSave(day)
let fileName = 'Data.json'
@@ -712,16 +846,60 @@ exports.newSuperalgosBotModulesHistoricOHLCVs = function (processIndex) {
filesToCreate++
fileStorage.createTextFile(getFilePath(day * TS.projects.superalgos.globals.timeConstants.ONE_DAY_IN_MILISECONDS, VOLUMES_FOLDER_NAME) + '/' + fileName, volumesFileContent + '\n', onFileCreated);
if (ohlcvsFileContent !== undefined) {
filesToCreate++
fileStorage.createTextFile(getFilePath(day * TS.projects.superalgos.globals.timeConstants.ONE_DAY_IN_MILISECONDS, OHLCVS_FOLDER_NAME) + '/' + fileName, ohlcvsFileContent + '\n', onFileCreated);
mustLoadRawData = true
} else {
mustLoadRawData = false
}
candlesFileContent = '['
volumesFileContent = '['
needSeparator = false
}
function getRawDataToSave(day) {
/*
What we are doing here is determining whether the currently accumulated raw OHCLV's should be saved or not,
so that the next time the bot process runs, it must continue from where the raw OHLCV's ended.
If the current end of the array contains elements beyond the day being processed, it means that the full
day has been successfully downloaded, so it is not necessary to save this data.
*/
let rawDataFileData
let dataLength = rawDataArray.length
if (dataLength > 0) {
// first get the start of the day after this day we are checking
let timestamp = (day * TS.projects.superalgos.globals.timeConstants.ONE_DAY_IN_MILISECONDS) +
TS.projects.superalgos.globals.timeConstants.ONE_DAY_IN_MILISECONDS
if (rawDataArray[dataLength - 1][0] < timestamp) {
// there is no data for the next day, so now trim this day's data to remove anything before it
timestamp -= TS.projects.superalgos.globals.timeConstants.ONE_DAY_IN_MILISECONDS
let dataIndex = 0
while (dataIndex < dataLength - 1) {
if (rawDataArray[dataIndex][0] < timestamp) { // this data is from a previous day
dataIndex++
} else {
break // found the beginning of this day's data
}
}
if (dataIndex > 0) {
rawDataArray = rawDataArray.slice(dataIndex, dataLength) // remove data from previous days
dataLength = rawDataArray.length
}
if (dataLength > 0) {
rawDataFileData = JSON.stringify(rawDataArray) // finally we have what we need to save
}
}
}
return rawDataFileData
}
function onFileCreated(err) {
if (err.result !== TS.projects.superalgos.globals.standardResponses.DEFAULT_OK_RESPONSE.result) {
TS.projects.superalgos.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[ERROR] start -> OHLCVsReadyToBeSaved -> onFileBCreated -> err = " + JSON.stringify(err));
error = err // This allows the loop to be breaked.
error = err // This allows the loop to be broken.
return;
}
filesCreated++
@@ -826,7 +1004,8 @@ exports.newSuperalgosBotModulesHistoricOHLCVs = function (processIndex) {
minutes: beginingOfMarket.getUTCMinutes()
},
uiStartDate: uiStartDate.toUTCString(),
lastCandleOfTheDay: lastCandleOfTheDay
lastCandleOfTheDay: lastCandleOfTheDay,
mustLoadRawData: mustLoadRawData
};
if (fetchType === "by Id") {
Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

+7 -14
View File
@@ -31,8 +31,7 @@
"project": "Superalgos",
"autoAdd": true
}
],
"icon": "tensorflow"
]
},
{
"type": "Machine Learning",
@@ -142,8 +141,7 @@
"type": "node",
"childType": "Self Learning"
}
],
"icon": "tensorflow"
]
},
{
"type": "Supervised Learning",
@@ -178,8 +176,7 @@
"type": "node",
"childType": "Artificial Neural Network"
}
],
"icon": "tensorflow"
]
},
{
"type": "Unsupervised Learning",
@@ -322,8 +319,7 @@
"type": "node",
"childType": "Model"
}
],
"icon": "tensorflow"
]
},
{
"type": "Model",
@@ -410,8 +406,7 @@
"type": "node",
"childType": "Fit Dataset"
}
],
"icon": "tensorflow"
]
},
{
"type": "Compile",
@@ -3305,8 +3300,7 @@
"childType": "Environment Flags",
"autoAdd": true
}
],
"icon": "tensorflow"
]
},
{
"type": "Environment Flags",
@@ -3424,8 +3418,7 @@
"compatibleTypes": "->Execution Environment->"
},
"propertyNameAtParent": "backend",
"childrenNodesProperties": [],
"icon": "tensorflow"
"childrenNodesProperties": []
},
{
"type": "WASM Backend",
+4 -4
View File
@@ -18,7 +18,7 @@ Node JS is an open-source server environment required to run Superalgos.
**c.** Run the installer with the default configuration — just click Next until Node.JS is fully installed.
**Raspberry Pi Users:** From the SSH Terminal, send the following commands to install Node. ::NOTE:: It is best to use the most current and updated version of the FULL PiOS image.
**NOTE FOR RASPBERRY PI USERS:** From the SSH Terminal, send the following commands to install Node. **NOTE:** It is best to use the most current and updated version of the FULL PiOS image.
```
curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash -
```
@@ -51,7 +51,7 @@ Git is an open-source distributed version control system required to download an
**NOTE FOR MAC USERS:** Depending on your setup, installing Git may be optional. The native XCode Command Line Developer Tools seems to work well. If you do install Git, we have tested Tim Harper's binary installer successfully.
**Raspberry Pi Users:**
**NOTE FOR RASPBERRY PI USERS:**
send the SSH Terminal command to install git. The most recent version of PiOS has Git already installed, so this may give you an error. The error will not affect your installation.
```
sudo apt-get install git
@@ -73,7 +73,7 @@ Before you begin, it is recommended that you set up Chrome/Safari as your defaul
**1.** Scroll the page all the way to the top. Find and click the **Fork** button to create your fork/copy of this repository. To fork Superalgos you need a GitHub account. If you don't have one, go ahead and create it.
**NOTE:** A Fork is required for your contributions to the project. Superalgos will soon be moving into a new phase of development by incentivizing contributions. Incentives will be retroactive. The earlier in the life of the project you start contributing, the juicier your incentives will be, as the impact of contributions in a Community-driven project is clearly a function of time. This is an open invitation for you to become a vested member of the community!
**NOTE:** A Fork is required for your contributions to the project. The reason why Superalgos is free and open-source is that the project has set up a <a href="https://superalgos.org/community-business.shtml" target="_blank">Collective Business</a> in which all users may participate. The way to participate is to <a href="https://superalgos.org/community-contribute.shtml" target="_blank">contribute</a> to make Superalgos better. The project's <a href="https://superalgos.org/token-overview.shtml" target="_blank">token</a> is distributed among contributors.
**2.** Once the fork is created, you will land on the page of your fork. Copy the URL from your browser's address bar.
@@ -339,7 +339,7 @@ Or follow [Superalgos on Facebook](https://www.facebook.com/superalgos).
# Contributing
Superalgos is a Community Project built by Contributors for Contributors. Learn [how to become a Contributor](https://superalgos.org/community-contribute.shtml).
Superalgos is a Community Project built by users for users. Learn [how you may contribute](https://superalgos.org/community-contribute.shtml).
## Top Contributors