Merge remote-tracking branch 'upstream/develop' into develop

This commit is contained in:
Philip Love committed 2021-05-17 10:24:13 -04:00
commit 0ff245bdd5
39 files changed
+728 -51

No files matched your search

@@ -0,0 +1,58 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="-703 270 512 512" style="enable-background:new -703 270 512 512;" xml:space="preserve">
<style type="text/css">
.st0{fill:#E6EAEA;}
.st1{fill:#9BAAAB;}
.st2{fill:#CDD4D5;}
.st3{fill:#687F82;}
.st4{fill:#4ACFD9;}
.st5{fill:#FF8C29;}
.st6{fill:#F0353D;}
.st7{fill:#FFFFFF;}
.st8{fill:#FD6A33;}
.st9{fill:#FFD1A9;}
</style>
<text transform="matrix(0.9049 0 0 1 -19.9131 667.6094)" style="font-family:'SegoeUIBlack'; font-size:276.9418px;">{...}</text>
<text transform="matrix(0.9049 0 0 1 -25.0001 953.3604)" style="font-family:'SegoeUIBlack'; font-size:276.9418px;">{ ; }</text>
<text transform="matrix(0.9049 0 0 1 -25.0001 387.4814)" style="font-family:'SegoeUIBlack'; font-size:276.9418px;">&lt;/&gt;</text>
<path class="st0" d="M-199,278.6h-496c-4.4,0-8,3.6-8,8V774c0,4.4,3.6,8,8,8h166.5c-5.5-5.1-9-12.5-9-20.6v-9.6
c-21.4-7.6-36.8-28-36.8-52v-73.1c0-24,15.4-44.4,36.8-52v-88.8c0-30.4,24.7-55.1,55.1-55.1s55.1,24.7,55.1,55.1v49.7h52.7
c14.7,0,28.6,5.8,39,16.2c10.4,10.4,16.1,24.2,16,38.9v170.7c0,8.1-3.5,15.5-9,20.6H-199c4.4,0,8-3.6,8-8V286.6
C-191,282.2-194.6,278.6-199,278.6z"/>
<path class="st1" d="M-199,278.6h-496c-4.4,0-8,3.6-8,8v110.6h512V286.6C-191,282.2-194.6,278.6-199,278.6z"/>
<path class="st2" d="M-537.6,761.4v-9.6c-21.4-7.6-36.8-28-36.8-52v-73.1c0-24,15.4-44.4,36.8-52v-88.8c0-30.4,24.7-55.1,55.1-55.1
c13.5,0,25.9,4.9,35.5,13V278.6h-248c-4.4,0-8,3.6-8,8V774c0,4.4,3.6,8,8,8h166.5C-534.1,776.9-537.6,769.5-537.6,761.4z"/>
<path class="st3" d="M-695,278.6c-4.4,0-8,3.6-8,8v110.6h256V278.6H-695z"/>
<path class="st4" d="M-438.4,304.2c-18.6,0-33.7,15.1-33.7,33.7s15.1,33.7,33.7,33.7s33.7-15.1,33.7-33.7S-419.9,304.2-438.4,304.2z
"/>
<path class="st5" d="M-532.5,304.2c-18.6,0-33.7,15.1-33.7,33.7s15.1,33.7,33.7,33.7s33.7-15.1,33.7-33.7S-513.9,304.2-532.5,304.2z
"/>
<path class="st6" d="M-626.6,304.2c-18.6,0-33.7,15.1-33.7,33.7s15.1,33.7,33.7,33.7c18.6,0,33.7-15.1,33.7-33.7
S-608,304.2-626.6,304.2z"/>
<g>
<path class="st7" d="M-276,328.8h-94c-4.4,0-8-3.6-8-8s3.6-8,8-8h94c4.4,0,8,3.6,8,8S-271.5,328.8-276,328.8z"/>
<path class="st7" d="M-233.2,328.8h-17.1c-4.4,0-8-3.6-8-8s3.6-8,8-8h17.1c4.4,0,8,3.6,8,8S-228.8,328.8-233.2,328.8z"/>
</g>
<path class="st6" d="M-645.8,477.8c-3.8,7.4-5.7,19.1-5.7,35v22.7c0,16.4-6.1,24.6-18.2,24.6v30.3c12.2,0,18.2,8.1,18.2,24.3V639
c0,15.1,1.9,26.4,5.8,33.7c3.9,7.3,10.2,12.8,18.9,16.2c8.7,3.5,20.6,5.2,35.7,5.2v-30.3c-7,0-12-1.7-15.1-5.1
c-3-3.4-4.5-9.1-4.5-17.2v-17.2c0-13.1-1.5-23.6-4.6-31.6c-3.1-8-8-13.8-14.7-17.4v-0.5c6.9-3.6,11.8-9.3,14.8-17
c3-7.8,4.5-17.8,4.5-30v-19.2c0-8,1.6-13.7,4.8-17c3.2-3.3,8.1-5,14.8-5v-30.3c-15.3,0-27.3,1.7-36,5.2
C-635.8,464.9-642,470.4-645.8,477.8z"/>
<path class="st8" d="M-218.5,590.4c-12.2,0-18.2,8.2-18.2,24.6v22.7c0,15.9-1.9,27.5-5.7,35c-3.8,7.4-10,12.9-18.7,16.4
s-20.7,5.2-36,5.2V664c6.8,0,11.7-1.7,14.9-5c3.1-3.3,4.7-9,4.7-17v-19.2c0-12.2,1.5-22.1,4.5-29.9s7.9-13.5,14.9-17.2v-0.5
c-6.8-3.7-11.7-9.6-14.7-17.7c-3.1-8.1-4.6-18.6-4.6-31.4v-17c0-8-1.5-13.8-4.4-17.2c-2.9-3.5-8-5.2-15.2-5.2v-30.3
c15.2,0,27.1,1.7,35.8,5.2c8.7,3.5,15,8.9,18.8,16.2c3.9,7.3,5.8,18.6,5.8,33.7v24.3c0,16.2,6.1,24.3,18.2,24.3L-218.5,590.4
L-218.5,590.4z"/>
<path class="st8" d="M-374.7,555.6h-72.7v-69.7c0-19.3-15.7-35.1-35.1-35.1c-19.4,0-35.1,15.7-35.1,35.1v105.7h-1.7
c-19.3,0-35.1,15.7-35.1,35.1v73.1c0,19.3,15.7,35.1,35.1,35.1h1.7v39c0,4.5,3.6,8.1,8.1,8.1h161.7c4.5,0,8.1-3.6,8.1-8.1V590.7
C-339.6,571.4-355.3,555.6-374.7,555.6z"/>
<path class="st5" d="M-374.7,555.6h-72.7v-69.7c0-19.3-15.7-35.1-35.1-35.1c-19.4,0-35.1,15.7-35.1,35.1v105.7h-1.7
c-19.3,0-35.1,15.7-35.1,35.1v73.1c0,19.3,15.7,35.1,35.1,35.1h1.7v26.5c0,4.5,3.6,8.1,8.1,8.1h161.7c4.5,0,8.1-3.6,8.1-8.1V590.7
C-339.6,571.4-355.3,555.6-374.7,555.6z"/>
<g>
<path class="st9" d="M-447.8,599.7c0.1,4.5,3.7,8.1,8.2,8.1s8.1-3.6,8.1-8.1v-44.1h-16.3L-447.8,599.7z"/>
<path class="st9" d="M-405.5,599.7c0.1,4.5,3.7,8.1,8.2,8.1s8.1-3.6,8.1-8.1v-44.1h-16.3L-405.5,599.7z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.1 KiB

@@ -0,0 +1,78 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="-703 270 512 512" style="enable-background:new -703 270 512 512;" xml:space="preserve">
<style type="text/css">
.st0{fill:#E6EAEA;}
.st1{fill:#9BAAAB;}
.st2{fill:#CDD4D5;}
.st3{fill:#687F82;}
.st4{fill:#FFFFFF;}
.st5{enable-background:new ;}
.st6{fill:#F0353D;}
.st7{fill:#FD6A33;}
</style>
<path class="st0" d="M-199-325.7h-496c-4.4,0-8,3.6-8,8v487.4c0,4.4,3.6,8,8,8h496c4.4,0,8-3.6,8-8v-487.4
C-191-322.1-194.6-325.7-199-325.7z"/>
<path class="st1" d="M-199-325.7h-496c-4.4,0-8,3.6-8,8v110.6h512v-110.6C-191-322.1-194.6-325.7-199-325.7z"/>
<path class="st2" d="M-695-325.7c-4.4,0-8,3.6-8,8v487.4c0,4.4,3.6,8,8,8h248v-503.4H-695z"/>
<path class="st3" d="M-695-325.7c-4.4,0-8,3.6-8,8v110.6h256v-118.6H-695z"/>
<g>
<path class="st4" d="M-276-275.5h-94c-4.4,0-8-3.6-8-8s3.6-8,8-8h94c4.4,0,8,3.6,8,8S-271.5-275.5-276-275.5z"/>
<path class="st4" d="M-233.2-275.5h-17.1c-4.4,0-8-3.6-8-8s3.6-8,8-8h17.1c4.4,0,8,3.6,8,8S-228.8-275.5-233.2-275.5z"/>
</g>
<g class="st5">
<path d="M150,953.4H95.8L83.3,886c-1.6-8.1-2.3-15.3-2.3-21.5h-0.7c-0.9,9.6-1.8,16.5-2.7,20.7L64,953.4H9.9l-33.2-138.5h52.4
l10.8,80.6l1.8,18h0.7c1.1-10.5,1.8-16.7,2.2-18.5l16-80.1h49.7l13.8,80.1l1.1,9.6l0.6,8.7h0.7l0.4-3.9l11.1-94.4H185L150,953.4z"
/>
<path d="M372,879.7l40.4,73.7h-60l-13.5-31.5c-1.6-3.5-3.3-8.3-5.3-14.5h-0.5c-1.7,6.1-2.8,9.9-3.3,11.3c-0.5,1.4-5.3,13-14.3,34.7
H256l41.6-69.8l-39.2-68.7h60.2l13.5,32.2c1.8,3.7,3.6,8.7,5.4,15.1h0.5c2.4-7.8,4-13,5-15.4l12.7-31.9h56.9L372,879.7z"/>
<path d="M11.8,1350.7c-4.9,0-10.2-0.5-15.8-1.4c-5.6-0.9-10.6-2.3-15.1-4.1v-43.4c2,1.7,5.1,3.3,9.1,4.7c4,1.4,7.9,2.2,11.4,2.2
c9.7,0,16.2-4.2,19.3-12.7l4-10.8l-52.4-137.9h57.6l15.2,66.8c2.9,12.4,4.5,20.8,4.8,25.2h0.5c0.2-2,0.6-4.2,1-6.6
c0.4-2.4,6.8-30.9,19-85.3h50.7l-46.1,142.4c-6.9,21.8-15.5,37.5-25.8,46.9C39.2,1346,26.7,1350.7,11.8,1350.7z"/>
<path d="M260,1245.8h51.6v39.9h-120v-26.6l56.3-71.9h-51v-39.9h113.7v32.7L260,1245.8z"/>
</g>
<text transform="matrix(0.9049 0 0 1 -25.0001 387.4814)" style="font-family:'SegoeUIBlack'; font-size:276.9418px;">&lt;/&gt;</text>
<g>
<path class="st6" d="M-1402.6,438.1c-3.8,7.4-5.7,19.1-5.7,35v22.7c0,16.4-6.1,24.6-18.2,24.6v30.3c12.2,0,18.2,8.1,18.2,24.3v24.3
c0,15.1,1.9,26.4,5.8,33.7c3.9,7.3,10.2,12.8,18.9,16.2c8.7,3.5,20.6,5.2,35.7,5.2v-30.3c-7,0-12-1.7-15.1-5.1
c-3-3.4-4.5-9.1-4.5-17.2v-17.2c0-13.1-1.5-23.6-4.6-31.6c-3.1-8-8-13.8-14.7-17.4v-0.5c6.9-3.6,11.8-9.3,14.8-17
c3-7.8,4.5-17.8,4.5-30v-19.3c0-8,1.6-13.7,4.8-17c3.2-3.3,8.1-5,14.8-5v-30.3c-15.3,0-27.3,1.7-36,5.2
C-1392.5,425.3-1398.8,430.6-1402.6,438.1z"/>
<path class="st6" d="M-1274.4,567.1c-5.3-4.9-12.3-7.4-21-7.4c-8.9,0-16,2.5-21.2,7.4c-5.3,4.9-7.9,11.3-7.9,19.3
c0,7.8,2.7,14.3,8,19.5c5.3,5.3,12.2,7.9,20.6,7.9c9.2,0,16.4-2.5,21.7-7.6c5.2-5,7.8-11.7,7.8-19.9
C-1266.4,578.5-1269.1,572-1274.4,567.1z"/>
<path class="st7" d="M-1186.3,586.3c0-7.9-2.7-14.4-8-19.3c-5.1-4.7-11.7-7.1-19.8-7.3v54c8.4-0.3,15.1-2.8,20-7.5
C-1188.9,601.3-1186.3,594.5-1186.3,586.3z"/>
<path class="st6" d="M-1215.3,559.8c-8.9,0-16,2.5-21.2,7.4c-5.3,4.9-7.9,11.3-7.9,19.3c0,7.8,2.7,14.3,8,19.5
c5.3,5.3,12.2,7.9,20.6,7.9c0.6,0,1.1,0,1.7,0v-54C-1214.5,559.8-1214.9,559.8-1215.3,559.8z"/>
<path class="st7" d="M-1106.1,586.3c0,8.2-2.6,14.8-7.8,19.9c-5.2,5-12.4,7.6-21.7,7.6c-8.4,0-15.3-2.6-20.6-7.9
c-5.3-5.3-8-11.8-8-19.5c0-7.9,2.6-14.4,7.9-19.3c5.3-4.9,12.3-7.4,21.2-7.4c8.6,0,15.6,2.5,21,7.4
C-1108.8,572-1106.1,578.5-1106.1,586.3z"/>
<path class="st7" d="M-1004.2,550.6c-12.2,0-18.2,8.2-18.2,24.6V598c0,15.9-1.9,27.5-5.7,35c-3.8,7.4-10,12.9-18.7,16.4
c-8.7,3.5-20.7,5.2-36,5.2v-30.3c6.8,0,11.7-1.7,14.9-5c3.1-3.3,4.7-9,4.7-17V583c0-12.2,1.5-22.1,4.5-29.9s7.9-13.5,14.9-17.2
v-0.5c-6.8-3.7-11.7-9.6-14.7-17.7c-3.1-8.1-4.6-18.6-4.6-31.4v-17c0-8-1.5-13.8-4.4-17.2c-2.9-3.5-8-5.2-15.2-5.2v-30.3
c15.2,0,27.1,1.7,35.8,5.2s15,8.9,18.8,16.2c3.9,7.3,5.8,18.6,5.8,33.7V496c0,16.2,6.1,24.3,18.2,24.3L-1004.2,550.6L-1004.2,550.6
z"/>
</g>
<g>
<polygon class="st6" points="-1425.9,271.3 -1304.7,327.3 -1304.7,287.8 -1390.7,255.8 -1390.7,255.2 -1304.7,223.3 -1304.7,183.8
-1425.9,238.9 "/>
<polygon class="st7" points="-1151.6,136.4 -1197.5,136.4 -1214.1,179.8 -1214.1,299.3 "/>
<polygon class="st6" points="-1238.3,362.5 -1214.1,299.3 -1214.1,179.8 -1284.2,362.5 "/>
<path class="st7" d="M-1126,324.5v-39.9l85.7-31.5v-0.6l-85.7-31.6V181l121.3,55.2v32.3L-1126,324.5z"/>
</g>
<text transform="matrix(0.9049 0 0 1 511 882.3604)" class="st5"><tspan x="0" y="0" style="font-family:'SegoeUIBlack'; font-size:276.9418px;">w x </tspan><tspan x="0" y="332.3" style="font-family:'SegoeUIBlack'; font-size:276.9418px;">y z</tspan></text>
<path class="st0" d="M-447,270v512c141.4,0,256-114.6,256-256S-305.6,270-447,270z"/>
<path class="st2" d="M-703,526c0,141.4,114.6,256,256,256V270C-588.4,270-703,384.6-703,526z"/>
<path class="st6" d="M-562.9,526.7c0-21.5,3-42,8.9-61.7c5.9-19.7,15-39,27.2-57.9h-41.1c-27.2,35.9-40.9,75.8-40.9,119.7
c0,23.5,3.3,44.9,10,64.2c6.7,19.3,17,37.3,31.1,54.1h41.1c-12.3-18.5-21.5-37.3-27.4-56.3C-559.9,569.6-562.9,548.9-562.9,526.7z"
/>
<path class="st7" d="M-368.7,462.4h-56.9l-12.7,31.9c-1,2.4-2.7,7.6-5,15.4h-0.5c-1.1-3.8-2.1-7.1-3.2-9.9v57
c1.7,5.2,3.3,9.4,4.7,12.6l13.5,31.5h60l-40.4-73.7L-368.7,462.4z"/>
<path class="st6" d="M-449.2,494.6l-13.5-32.2h-60.2l39.2,68.7l-41.6,69.8h59.6c9.1-21.7,13.8-33.3,14.3-34.7
c0.5-1.4,1.6-5.2,3.3-11.3h0.5c0.2,0.6,0.4,1.3,0.6,1.9v-57C-447.7,497.9-448.5,496.1-449.2,494.6z"/>
<path class="st7" d="M-285.2,526.7c0,23.7-3.4,45.2-10.1,64.5s-17.1,37.2-31,53.8h-41.1c24.4-36.2,36.6-75.6,36.6-118.3
c0-21-2.9-41.4-8.7-61.1c-5.8-19.7-15-39.2-27.6-58.6h41.1C-298.9,442.7-285.2,482.6-285.2,526.7z"/>
<text transform="matrix(0.9049 0 0 1 516.0869 596.6094)" style="font-family:'SegoeUIBlack'; font-size:276.9418px;">(x)</text>
</svg>

After

Width:  |  Height:  |  Size: 5.9 KiB

@@ -0,0 +1,110 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="-703 270 512 512" style="enable-background:new -703 270 512 512;" xml:space="preserve">
<style type="text/css">
.st0{display:none;fill:#E6EAEA;}
.st1{display:none;fill:#9BAAAB;}
.st2{display:none;fill:#CDD4D5;}
.st3{display:none;fill:#687F82;}
.st4{fill:#F0353D;}
.st5{fill:#FD6A33;}
.st6{fill:#E6EAEA;}
.st7{fill:#CDD4D5;}
.st8{fill:#4ACFD9;}
.st9{fill:#0295AA;}
.st10{fill:#FF8C29;}
.st11{fill:#FFD1A9;}
.st12{display:none;}
.st13{display:inline;fill:#FFFFFF;}
.st14{display:inline;fill:#E6EAEA;}
.st15{display:inline;fill:#FD6A33;}
.st16{display:inline;fill:#FF8C29;}
.st17{display:inline;fill:#4ACFD9;}
.st18{display:inline;fill:#0295AA;}
</style>
<path class="st0" d="M-199,270h-496c-4.4,0-8,3.6-8,8v487.4c0,4.4,3.6,8,8,8h496c4.4,0,8-3.6,8-8V278C-191,273.6-194.6,270-199,270z
"/>
<path class="st1" d="M-199,270h-496c-4.4,0-8,3.6-8,8v110.6h512V278C-191,273.6-194.6,270-199,270z"/>
<path class="st2" d="M-695,270c-4.4,0-8,3.6-8,8v487.4c0,4.4,3.6,8,8,8h248V270H-695z"/>
<path class="st3" d="M-695,270c-4.4,0-8,3.6-8,8v110.6h256V270H-695z"/>
<text transform="matrix(0.9049 0 0 1 -25.0001 387.4814)" style="font-family:'SegoeUIBlack'; font-size:276.9418px;">&lt;/&gt;</text>
<g>
<path class="st4" d="M-1402.6,438.1c-3.8,7.4-5.7,19.1-5.7,35v22.7c0,16.4-6.1,24.6-18.2,24.6v30.3c12.2,0,18.2,8.1,18.2,24.3v24.3
c0,15.1,1.9,26.4,5.8,33.7c3.9,7.3,10.2,12.8,18.9,16.2c8.7,3.5,20.6,5.2,35.7,5.2v-30.3c-7,0-12-1.7-15.1-5.1
c-3-3.4-4.5-9.1-4.5-17.2v-17.2c0-13.1-1.5-23.6-4.6-31.6c-3.1-8-8-13.8-14.7-17.4v-0.5c6.9-3.6,11.8-9.3,14.8-17
c3-7.8,4.5-17.8,4.5-30v-19.3c0-8,1.6-13.7,4.8-17c3.2-3.3,8.1-5,14.8-5v-30.3c-15.3,0-27.3,1.7-36,5.2
C-1392.5,425.3-1398.8,430.6-1402.6,438.1z"/>
<path class="st4" d="M-1274.4,567.1c-5.3-4.9-12.3-7.4-21-7.4c-8.9,0-16,2.5-21.2,7.4c-5.3,4.9-7.9,11.3-7.9,19.3
c0,7.8,2.7,14.3,8,19.5c5.3,5.3,12.2,7.9,20.6,7.9c9.2,0,16.4-2.5,21.7-7.6c5.2-5,7.8-11.7,7.8-19.9
C-1266.4,578.5-1269.1,572-1274.4,567.1z"/>
<path class="st5" d="M-1186.3,586.3c0-7.9-2.7-14.4-8-19.3c-5.1-4.7-11.7-7.1-19.8-7.3v54c8.4-0.3,15.1-2.8,20-7.5
C-1188.9,601.3-1186.3,594.5-1186.3,586.3z"/>
<path class="st4" d="M-1215.3,559.8c-8.9,0-16,2.5-21.2,7.4c-5.3,4.9-7.9,11.3-7.9,19.3c0,7.8,2.7,14.3,8,19.5
c5.3,5.3,12.2,7.9,20.6,7.9c0.6,0,1.1,0,1.7,0v-54C-1214.5,559.8-1214.9,559.8-1215.3,559.8z"/>
<path class="st5" d="M-1106.1,586.3c0,8.2-2.6,14.8-7.8,19.9c-5.2,5-12.4,7.6-21.7,7.6c-8.4,0-15.3-2.6-20.6-7.9
c-5.3-5.3-8-11.8-8-19.5c0-7.9,2.6-14.4,7.9-19.3c5.3-4.9,12.3-7.4,21.2-7.4c8.6,0,15.6,2.5,21,7.4
C-1108.8,572-1106.1,578.5-1106.1,586.3z"/>
<path class="st5" d="M-1004.2,550.6c-12.2,0-18.2,8.2-18.2,24.6V598c0,15.9-1.9,27.5-5.7,35c-3.8,7.4-10,12.9-18.7,16.4
c-8.7,3.5-20.7,5.2-36,5.2v-30.3c6.8,0,11.7-1.7,14.9-5c3.1-3.3,4.7-9,4.7-17V583c0-12.2,1.5-22.1,4.5-29.9s7.9-13.5,14.9-17.2
v-0.5c-6.8-3.7-11.7-9.6-14.7-17.7c-3.1-8.1-4.6-18.6-4.6-31.4v-17c0-8-1.5-13.8-4.4-17.2c-2.9-3.5-8-5.2-15.2-5.2v-30.3
c15.2,0,27.1,1.7,35.8,5.2s15,8.9,18.8,16.2c3.9,7.3,5.8,18.6,5.8,33.7V496c0,16.2,6.1,24.3,18.2,24.3L-1004.2,550.6L-1004.2,550.6
z"/>
</g>
<g>
<polygon class="st4" points="-1425.9,271.3 -1304.7,327.3 -1304.7,287.8 -1390.7,255.8 -1390.7,255.2 -1304.7,223.3 -1304.7,183.8
-1425.9,238.9 "/>
<polygon class="st5" points="-1151.6,136.4 -1197.5,136.4 -1214.1,179.8 -1214.1,299.3 "/>
<polygon class="st4" points="-1238.3,362.5 -1214.1,299.3 -1214.1,179.8 -1284.2,362.5 "/>
<path class="st5" d="M-1126,324.5v-39.9l85.7-31.5v-0.6l-85.7-31.6V181l121.3,55.2v32.3L-1126,324.5z"/>
</g>
<text transform="matrix(0.9049 0 0 1 511 882.3604)" style="enable-background:new ;"><tspan x="0" y="0" style="font-family:'SegoeUIBlack'; font-size:276.9418px;">w x </tspan><tspan x="0" y="332.3" style="font-family:'SegoeUIBlack'; font-size:276.9418px;">y z</tspan></text>
<path class="st6" d="M-1186.3-498V14c141.4,0,256-114.6,256-256S-1044.9-498-1186.3-498z"/>
<path class="st7" d="M-1442.3-242c0,141.4,114.6,256,256,256v-512C-1327.7-498-1442.3-383.3-1442.3-242z"/>
<path class="st4" d="M-1302.2-241.3c0-21.5,3-42,8.9-61.7c5.9-19.7,15-39,27.2-57.9h-41.1c-27.2,35.9-40.9,75.8-40.9,119.7
c0,23.5,3.3,44.9,10,64.2c6.7,19.3,17,37.3,31.1,54.1h41.1c-12.3-18.5-21.5-37.3-27.4-56.3C-1299.2-198.4-1302.2-219-1302.2-241.3z"
/>
<path class="st5" d="M-1108-305.5h-56.9l-12.7,31.9c-1,2.4-2.7,7.6-5,15.4h-0.5c-1.1-3.8-2.1-7.1-3.2-9.9v57
c1.7,5.2,3.3,9.4,4.7,12.6l13.5,31.5h60l-40.4-73.7L-1108-305.5z"/>
<path class="st4" d="M-1188.5-273.3l-13.5-32.2h-60.2l39.2,68.7l-41.6,69.8h59.6c9.1-21.7,13.8-33.3,14.3-34.7
c0.5-1.4,1.6-5.2,3.3-11.3h0.5c0.2,0.6,0.4,1.3,0.6,1.9v-57C-1187-270.1-1187.8-271.8-1188.5-273.3z"/>
<path class="st5" d="M-1024.5-241.3c0,23.7-3.4,45.2-10.1,64.5s-17.1,37.2-31,53.8h-41.1c24.4-36.2,36.6-75.6,36.6-118.3
c0-21-2.9-41.4-8.7-61.1c-5.8-19.7-15-39.2-27.6-58.6h41.1C-1038.1-325.3-1024.5-285.4-1024.5-241.3z"/>
<text transform="matrix(0.9049 0 0 1 516.0869 596.6094)" style="font-family:'SegoeUIBlack'; font-size:276.9418px;">(x)</text>
<path class="st1" d="M-695,782h496c4.4,0,8-3.6,8-8V663.4h-512V774C-703,778.4-699.4,782-695,782z"/>
<path class="st2" d="M-199,782c4.4,0,8-3.6,8-8V663.4h-256V782H-199z"/>
<path class="st4" d="M-257.8,397.4l50.1,91.4h-74.4l-16.7-39.1c-1.9-4.4-4.1-10.3-6.5-18h-0.6c-2.1,7.6-3.5,12.3-4.1,14
c-0.6,1.7-6.5,16.1-17.8,43h-73.9l51.6-86.6l-48.6-85.2h74.7l16.7,39.9c2.2,4.6,4.5,10.9,6.7,18.8h0.6c2.9-9.7,5-16.1,6.2-19.1
L-278,317h70.6L-257.8,397.4z"/>
<path class="st8" d="M-654.3,522.5c-6.1,0-12.6-0.6-19.6-1.8c-7-1.2-13.2-2.9-18.7-5.1v-53.9c2.5,2.1,6.3,4.1,11.3,5.9
c5,1.8,9.7,2.7,14.2,2.7c12,0,20-5.3,24-15.8l5-13.4L-703,270h71.5l18.8,82.9c3.6,15.4,5.6,25.8,5.9,31.2h0.6
c0.3-2.5,0.7-5.2,1.3-8.2c0.6-3,8.4-38.3,23.6-105.9h62.9l-57.2,176.7c-8.6,27.1-19.3,46.5-32,58.2
C-620.3,516.6-635.8,522.5-654.3,522.5z"/>
<path class="st9" d="M-618.1,732.5h64.1V782H-703v-33.1l69.8-89.3h-63.3v-49.5h141v40.6L-618.1,732.5z"/>
<g>
<path class="st5" d="M-227,555.6h-72.7v-69.7c0-19.3-15.7-35.1-35.1-35.1s-35.1,15.7-35.1,35.1v105.7h-1.7
c-19.3,0-35.1,15.7-35.1,35.1v73.1c0,19.3,15.7,35.1,35.1,35.1h1.7v39c0,4.5,3.6,8.1,8.1,8.1h161.7c4.5,0,8.1-3.6,8.1-8.1V590.7
C-191.9,571.4-207.6,555.6-227,555.6z"/>
<path class="st10" d="M-227,555.6h-72.7v-69.7c0-19.3-15.7-35.1-35.1-35.1s-35.1,15.7-35.1,35.1v105.7h-1.7
c-19.3,0-35.1,15.7-35.1,35.1v73.1c0,19.3,15.7,35.1,35.1,35.1h1.7v26.5c0,4.5,3.6,8.1,8.1,8.1h161.7c4.5,0,8.1-3.6,8.1-8.1V590.7
C-191.9,571.4-207.6,555.6-227,555.6z"/>
<g>
<path class="st11" d="M-300.1,599.7L-300.1,599.7c0.1,4.5,3.7,8.1,8.2,8.1s8.1-3.6,8.1-8.1v-44.1h-16.3L-300.1,599.7L-300.1,599.7
z"/>
<path class="st11" d="M-257.8,599.7L-257.8,599.7c0.1,4.5,3.7,8.1,8.2,8.1c4.5,0,8.1-3.6,8.1-8.1v-44.1h-16.3L-257.8,599.7
L-257.8,599.7z"/>
</g>
</g>
<g class="st12">
<path class="st13" d="M-202.7-75.2h-147.8V8.2h147.8c6.6,0,12-5.4,12-12v-59.4C-190.7-69.8-196.1-75.2-202.7-75.2z"/>
<path class="st14" d="M-495.9-75.2c-6.6,0-12,5.4-12,12v59.4c0,6.6,5.4,12,12,12h145.5v-83.4L-495.9-75.2L-495.9-75.2z"/>
<circle class="st15" cx="-442.5" cy="-33.5" r="11.5"/>
<circle class="st15" cx="-350.5" cy="-33.5" r="11.5"/>
<circle class="st16" cx="-258.5" cy="-33.5" r="11.5"/>
<path class="st17" d="M-350,14h145c10.5,0,19-8.5,19-19v-57c0-10.5-8.5-19-19-19h-145v10h145c5,0,9,4,9,9v57c0,5-4,9-9,9h-145V14z"
/>
<path class="st18" d="M-350,4h-145c-5,0-9-4-9-9v-57c0-5,4-9,9-9h145v-10h-145c-10.5,0-19,8.5-19,19v57c0,10.5,8.5,19,19,19h145V4z
"/>
<path class="st16" d="M-350-22c6.1-0.3,11-5.3,11-11.5s-4.9-11.2-11-11.5V-22z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

@@ -1 +1 @@
{"type":"Trading Engine","name":"Low-Frequency","project":"Superalgos","tradingCurrent":{"type":"Trading Current","name":"New Trading Current","project":"Superalgos","tradingEpisode":{"type":"Trading Episode","name":"New Trading Episode","project":"Superalgos","serialNumber":{"type":"Serial Number","name":"New Serial Number","config":"{\n\"initialValue\": 0\n}","project":"Superalgos","id":"5eb83933-432a-4029-8a3e-e4d8d760dd27","savedPayload":{"position":{"x":31059.265561534645,"y":23985.998158670987},"targetPosition":{"x":31631.862254589007,"y":24343.430707696967},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"identifier":{"type":"Identifier","name":"New Identifier","config":"{\n\"initialValue\": \"\"\n}","project":"Superalgos","id":"8ba7fe0c-c5df-408e-be8a-ebde90f2a50d","savedPayload":{"position":{"x":31125.906498063745,"y":23896.62675467176},"targetPosition":{"x":31631.862254589007,"y":24343.430707696967},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"begin":{"type":"Begin","name":"New Begin","config":"{\n\"initialValue\": 0\n}","project":"Superalgos","id":"d7faf864-3fa8-4280-b7d3-a022338b0dfe","savedPayload":{"position":{"x":31206.348588702636,"y":23819.442997780083},"targetPosition":{"x":31631.862254589007,"y":24343.430707696967},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"end":{"type":"End","name":"New End","config":"{\n\"initialValue\": 0\n}","project":"Superalgos","id":"f6722d05-77f9-4a68-ba69-38f56cdc7e91","savedPayload":{"position":{"x":31298.397582915564,"y":23756.55225968092},"targetPosition":{"x":31631.862254589007,"y":24343.430707696967},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"beginRate":{"type":"Begin Rate","name":"New Begin Rate","config":"{\n\"initialValue\": 0\n}","project":"Superalgos","id":"613903ae-45e4-4eee-a178-d6ec049490ec","savedPayload":{"position":{"x":31399.542624094225,"y":23709.670035765703},"targetPosition":{"x":31631.862254589007,"y":24343.430707696967},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"endRate":{"type":"End Rate","name":"New End Rate","config":"{\n\"initialValue\": 0\n}","project":"Superalgos","id":"b2bfb20d-64d5-4c98-b0cd-a466654c1e6a","savedPayload":{"position":{"x":31507.024739180706,"y":23680.07515089},"targetPosition":{"x":31631.862254589007,"y":24343.430707696967},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"status":{"type":"Status","name":"New Status","config":"{\n\"initialValue\": \"Not Open\"\n}","project":"Superalgos","id":"2615490b-e968-4607-a6e5-009c3ae78957","savedPayload":{"position":{"x":31617.912096260407,"y":23668.574876365114},"targetPosition":{"x":31631.862254589007,"y":24343.430707696967},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"exitType":{"type":"Exit Type","name":"New Exit Type","config":"{\n\"initialValue\": \"No Exit\"\n}","project":"Superalgos","id":"6bcc264b-a189-4aca-8397-d3520bdf4078","savedPayload":{"position":{"x":31729.179977293967,"y":23675.482909701106},"targetPosition":{"x":31631.862254589007,"y":24343.430707696967},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"headOfTheMarket":{"type":"Head Of The Market","name":"New Head Of The Market","config":"{\n\"initialValue\": false\n}","project":"Superalgos","id":"f7e00135-13b1-4265-95da-dd3a2c763b6f","savedPayload":{"position":{"x":31837.7932845405,"y":23700.610817756467},"targetPosition":{"x":31631.862254589007,"y":24343.430707696967},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"processDate":{"type":"Process Date","name":"New Process Date","config":"{\n\"initialValue\": 0\n}","project":"Superalgos","id":"d9163f6e-0d50-4ddd-b13b-14f7b4124ec8","savedPayload":{"position":{"x":31940.789330112093,"y":23743.273176703016},"targetPosition":{"x":31631.862254589007,"y":24343.430707696967},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"episodeBaseAsset":{"type":"Episode Base Asset","name":"New Episode Base Asset","project":"Superalgos","balance":{"type":"Balance","name":"Base Asset","config":"{\n\"initialValue\": 0\n}","project":"Superalgos","id":"72f6a6b6-f35b-4d8Line truncated
{"type":"Trading Engine","name":"Low-Frequency","project":"Superalgos","tradingCurrent":{"type":"Trading Current","name":"New Trading Current","project":"Superalgos","tradingEpisode":{"type":"Trading Episode","name":"New Trading Episode","project":"Superalgos","serialNumber":{"type":"Serial Number","name":"New Serial Number","config":"{\n\"initialValue\": 0\n}","project":"Superalgos","id":"5eb83933-432a-4029-8a3e-e4d8d760dd27","savedPayload":{"position":{"x":31059.265561534645,"y":23985.998158670987},"targetPosition":{"x":31631.862254589007,"y":24343.430707696967},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"identifier":{"type":"Identifier","name":"New Identifier","config":"{\n\"initialValue\": \"\"\n}","project":"Superalgos","id":"8ba7fe0c-c5df-408e-be8a-ebde90f2a50d","savedPayload":{"position":{"x":31125.906498063745,"y":23896.62675467176},"targetPosition":{"x":31631.862254589007,"y":24343.430707696967},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"begin":{"type":"Begin","name":"New Begin","config":"{\n\"initialValue\": 0\n}","project":"Superalgos","id":"d7faf864-3fa8-4280-b7d3-a022338b0dfe","savedPayload":{"position":{"x":31206.348588702636,"y":23819.442997780083},"targetPosition":{"x":31631.862254589007,"y":24343.430707696967},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"end":{"type":"End","name":"New End","config":"{\n\"initialValue\": 0\n}","project":"Superalgos","id":"f6722d05-77f9-4a68-ba69-38f56cdc7e91","savedPayload":{"position":{"x":31298.397582915564,"y":23756.55225968092},"targetPosition":{"x":31631.862254589007,"y":24343.430707696967},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"beginRate":{"type":"Begin Rate","name":"New Begin Rate","config":"{\n\"initialValue\": 0\n}","project":"Superalgos","id":"613903ae-45e4-4eee-a178-d6ec049490ec","savedPayload":{"position":{"x":31399.542624094225,"y":23709.670035765703},"targetPosition":{"x":31631.862254589007,"y":24343.430707696967},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"endRate":{"type":"End Rate","name":"New End Rate","config":"{\n\"initialValue\": 0\n}","project":"Superalgos","id":"b2bfb20d-64d5-4c98-b0cd-a466654c1e6a","savedPayload":{"position":{"x":31507.024739180706,"y":23680.07515089},"targetPosition":{"x":31631.862254589007,"y":24343.430707696967},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"status":{"type":"Status","name":"New Status","config":"{\n\"initialValue\": \"Not Open\"\n}","project":"Superalgos","id":"2615490b-e968-4607-a6e5-009c3ae78957","savedPayload":{"position":{"x":31617.912096260407,"y":23668.574876365114},"targetPosition":{"x":31631.862254589007,"y":24343.430707696967},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"exitType":{"type":"Exit Type","name":"New Exit Type","config":"{\n\"initialValue\": \"No Exit\"\n}","project":"Superalgos","id":"6bcc264b-a189-4aca-8397-d3520bdf4078","savedPayload":{"position":{"x":31729.179977293967,"y":23675.482909701106},"targetPosition":{"x":31631.862254589007,"y":24343.430707696967},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"headOfTheMarket":{"type":"Head Of The Market","name":"New Head Of The Market","config":"{\n\"initialValue\": false\n}","project":"Superalgos","id":"f7e00135-13b1-4265-95da-dd3a2c763b6f","savedPayload":{"position":{"x":31837.7932845405,"y":23700.610817756467},"targetPosition":{"x":31631.862254589007,"y":24343.430707696967},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"processDate":{"type":"Process Date","name":"New Process Date","config":"{\n\"initialValue\": 0\n}","project":"Superalgos","id":"d9163f6e-0d50-4ddd-b13b-14f7b4124ec8","savedPayload":{"position":{"x":31940.789330112093,"y":23743.273176703016},"targetPosition":{"x":31631.862254589007,"y":24343.430707696967},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"episodeBaseAsset":{"type":"Episode Base Asset","name":"New Episode Base Asset","project":"Superalgos","balance":{"type":"Balance","name":"Base Asset","config":"{\n\"initialValue\": 0\n}","project":"Superalgos","id":"72f6a6b6-f35b-4d8Line truncated
@@ -1 +1 @@
{"type":"Trading System","name":"BB Top Bounce","config":"{ \n\"codeName\": \"\"\n}","project":"Superalgos","tradingStrategies":[{"type":"Trading Strategy","name":"S1 - 3H Down","project":"Superalgos","triggerStage":{"type":"Trigger Stage","name":"New Trigger Stage","project":"Superalgos","triggerOn":{"type":"Trigger On Event","name":"New Trigger On Event","project":"Superalgos","situations":[{"type":"Situation","name":"New Situation","project":"Superalgos","conditions":[{"type":"Condition","name":"Previous Breakup","project":"Superalgos","javascriptCode":{"type":"Javascript Code","name":"New Javascript Code","code":"chart.at01hs.candle.previous.close > chart.at01hs.bollingerBand.previous.movingAverage + chart.at01hs.bollingerBand.previous.deviation","project":"Superalgos","id":"99948a6e-e866-4339-86ba-eac367226312","savedPayload":{"position":{"x":30780.386277758334,"y":30051.498744389715},"targetPosition":{"x":31072.097253877637,"y":30121.53235354649},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"id":"f0534c68-ab47-4370-b1fd-b3be4c1c262f","savedPayload":{"position":{"x":31072.097253877637,"y":30121.53235354649},"targetPosition":{"x":31363.80822999694,"y":30191.565962703262},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Condition","name":"Current Close In","project":"Superalgos","javascriptCode":{"type":"Javascript Code","name":"New Javascript Code","code":"chart.at01hs.candle.close < chart.at01hs.bollingerBand.movingAverage + chart.at01hs.bollingerBand.deviation","project":"Superalgos","id":"d3bd1690-1f94-484b-ac3c-7be2c7be85ed","savedPayload":{"position":{"x":30878.398033371974,"y":29838.894811327777},"targetPosition":{"x":31121.103131684456,"y":30015.23038701552},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"id":"e2d7334d-cf52-44d9-a20e-5be201ca6799","savedPayload":{"position":{"x":31121.103131684456,"y":30015.23038701552},"targetPosition":{"x":31363.80822999694,"y":30191.565962703262},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Condition","name":"Current Red Candle","project":"Superalgos","javascriptCode":{"type":"Javascript Code","name":"New Javascript Code","code":"chart.at01hs.candle.close < chart.at01hs.candle.open","project":"Superalgos","id":"d1fa707f-eb75-4b1c-8117-688b9b94e539","savedPayload":{"position":{"x":31050.30909116737,"y":29679.98186409081},"targetPosition":{"x":31207.058660582155,"y":29935.773913397035},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"id":"fb71bcfb-2a40-4e8a-b8e8-b492128350a0","savedPayload":{"position":{"x":31207.058660582155,"y":29935.773913397035},"targetPosition":{"x":31363.80822999694,"y":30191.565962703262},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Condition","name":"3H Down","code":"chart.at03hs.bollingerChannel.direction * chart.atAnyTimeFrame.externalSignal.timestamp > chart.atAnyTimeFrame.externalSignal.timestamp","project":"Superalgos","javascriptCode":{"type":"Javascript Code","name":"New Javascript Code","code":"chart.at03hs.bollingerChannel.direction === \"Down\"","project":"Superalgos","id":"8c8c5128-b88b-44a5-8e36-d5c61127404f","savedPayload":{"position":{"x":31269.9475509728,"y":29598.95295834618},"targetPosition":{"x":31316.87789048487,"y":29895.25946052472},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"id":"22246178-a8f9-4ec8-b55b-36cf7a24fbff","savedPayload":{"position":{"x":31316.87789048487,"y":29895.25946052472},"targetPosition":{"x":31363.80822999694,"y":30191.565962703262},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Condition","name":"3H Medium, Steep or Extreme","project":"Superalgos","javascriptCode":{"type":"Javascript Code","name":"New Javascript Code","code":"chart.at03hs.bollingerSubChannel.slope === \"Medium\" || chart.at03hs.bollingerSubChannel.slope === \"Steep\" || chart.at03hs.bollingerSubChannel.slope === \"Extreme\" ","project":"Superalgos","id":"bf8df41c-c62f-4cd6-840e-1dd538359c3b","savedPayload":{"position":{"x":31503.875448310486,"y":29608.144010464657},"targetPosition":{"x":31433.841839153712,"y":29899.85498658396},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"diLine truncated
{"type":"Trading System","name":"BB Top Bounce","config":"{ \n\"codeName\": \"\"\n}","project":"Superalgos","tradingStrategies":[{"type":"Trading Strategy","name":"S1 - 3H Down","project":"Superalgos","triggerStage":{"type":"Trigger Stage","name":"New Trigger Stage","project":"Superalgos","triggerOn":{"type":"Trigger On Event","name":"New Trigger On Event","project":"Superalgos","situations":[{"type":"Situation","name":"New Situation","project":"Superalgos","conditions":[{"type":"Condition","name":"Previous Breakup","project":"Superalgos","javascriptCode":{"type":"Javascript Code","name":"New Javascript Code","code":"chart.at01hs.candle.previous.close > chart.at01hs.bollingerBand.previous.movingAverage + chart.at01hs.bollingerBand.previous.deviation","project":"Superalgos","id":"99948a6e-e866-4339-86ba-eac367226312","savedPayload":{"position":{"x":30780.386277758334,"y":30051.498744389715},"targetPosition":{"x":31072.097253877637,"y":30121.53235354649},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"id":"f0534c68-ab47-4370-b1fd-b3be4c1c262f","savedPayload":{"position":{"x":31072.097253877637,"y":30121.53235354649},"targetPosition":{"x":31363.80822999694,"y":30191.565962703262},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Condition","name":"Current Close In","project":"Superalgos","javascriptCode":{"type":"Javascript Code","name":"New Javascript Code","code":"chart.at01hs.candle.close < chart.at01hs.bollingerBand.movingAverage + chart.at01hs.bollingerBand.deviation","project":"Superalgos","id":"d3bd1690-1f94-484b-ac3c-7be2c7be85ed","savedPayload":{"position":{"x":30878.398033371974,"y":29838.894811327777},"targetPosition":{"x":31121.103131684456,"y":30015.23038701552},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"id":"e2d7334d-cf52-44d9-a20e-5be201ca6799","savedPayload":{"position":{"x":31121.103131684456,"y":30015.23038701552},"targetPosition":{"x":31363.80822999694,"y":30191.565962703262},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Condition","name":"Current Red Candle","project":"Superalgos","javascriptCode":{"type":"Javascript Code","name":"New Javascript Code","code":"chart.at01hs.candle.close < chart.at01hs.candle.open","project":"Superalgos","id":"d1fa707f-eb75-4b1c-8117-688b9b94e539","savedPayload":{"position":{"x":31050.30909116737,"y":29679.98186409081},"targetPosition":{"x":31207.058660582155,"y":29935.773913397035},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"id":"fb71bcfb-2a40-4e8a-b8e8-b492128350a0","savedPayload":{"position":{"x":31207.058660582155,"y":29935.773913397035},"targetPosition":{"x":31363.80822999694,"y":30191.565962703262},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Condition","name":"3H Down","code":"chart.at03hs.bollingerChannel.direction * chart.atAnyTimeFrame.externalSignal.timestamp > chart.atAnyTimeFrame.externalSignal.timestamp","project":"Superalgos","javascriptCode":{"type":"Javascript Code","name":"New Javascript Code","code":"chart.at03hs.bollingerChannel.direction === \"Down\"","project":"Superalgos","id":"8c8c5128-b88b-44a5-8e36-d5c61127404f","savedPayload":{"position":{"x":31269.9475509728,"y":29598.95295834618},"targetPosition":{"x":31316.87789048487,"y":29895.25946052472},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"id":"22246178-a8f9-4ec8-b55b-36cf7a24fbff","savedPayload":{"position":{"x":31316.87789048487,"y":29895.25946052472},"targetPosition":{"x":31363.80822999694,"y":30191.565962703262},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Condition","name":"3H Medium, Steep or Extreme","project":"Superalgos","javascriptCode":{"type":"Javascript Code","name":"New Javascript Code","code":"chart.at03hs.bollingerSubChannel.slope === \"Medium\" || chart.at03hs.bollingerSubChannel.slope === \"Steep\" || chart.at03hs.bollingerSubChannel.slope === \"Extreme\" ","project":"Superalgos","id":"bf8df41c-c62f-4cd6-840e-1dd538359c3b","savedPayload":{"position":{"x":31503.875448310486,"y":29608.144010464657},"targetPosition":{"x":31433.841839153712,"y":29899.85498658396},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"diLine truncated
@@ -1 +1 @@
{"type":"Workspace","name":"API Fetcher Demo","rootNodes":[{"type":"Network","name":"My Network","project":"Superalgos","networkNodes":[{"type":"Network Node","name":"My Computer","config":"{ \n\"host\": \"localhost\", \n\"webPort\": \"34248\", \n\"webSocketsPort\": \"18041\"\n}","project":"Superalgos","dataTasks":{"type":"Data Tasks","name":"New Data Tasks","project":"Superalgos","projectDataTasks":[{"type":"Project Data Tasks","name":"Superalgos","project":"Superalgos","exchangeDataTasks":[{"type":"Exchange Data Tasks","name":"Binance","project":"Superalgos","marketDataTasks":[{"type":"Market Data Tasks","name":"Binance BTC/USDT","project":"Superalgos","dataMineTasks":[{"type":"Data Mine Tasks","name":"Masters","project":"Superalgos","taskManagers":[{"type":"Task Manager","name":"Masters","project":"Superalgos","tasks":[{"type":"Task","name":"Exchange Raw Data","project":"Superalgos","bot":{"type":"Sensor Bot Instance","name":"Exchange Raw Data","config":"{ \n\"startDate\": \"2020-01-01\"\n}","project":"Superalgos","processes":[{"type":"Sensor Process Instance","name":"Exchange Raw Data Historic-OHLCVs","project":"Superalgos","id":"407b3902-312f-4074-a7b2-f4e9ce72db07","savedPayload":{"position":{"x":23468.38111670686,"y":30308.75940440786},"targetPosition":{"x":23685.50132813838,"y":30101.73570096323},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Historic-OHLCVs","id":"5eb11d6a-022e-4f60-97c4-d6cf90b249dc"}}}],"id":"4b5fb696-c41e-4cf0-92e2-e5a64a3871e4","savedPayload":{"position":{"x":23685.50132813838,"y":30101.73570096323},"targetPosition":{"x":23902.6215395699,"y":29894.711997518596},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"id":"a5933e2f-5aa8-45dd-8f13-e50a42b795b2","savedPayload":{"position":{"x":23902.6215395699,"y":29894.711997518596},"targetPosition":{"x":24119.74175100142,"y":29687.688294073963},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Task","name":"Webhooks","project":"Superalgos","bot":{"type":"Sensor Bot Instance","name":"Webhooks","config":"{ \n\"startDate\": \"2020-01-01\"\n}","project":"Superalgos","processes":[{"type":"Sensor Process Instance","name":"Webhooks Check-Webhook","project":"Superalgos","id":"c5bc3847-e5b9-4345-92a7-319b3248a40e","savedPayload":{"position":{"x":23319.78984721199,"y":30100.092163628633},"targetPosition":{"x":23586.440481808466,"y":29962.62420711041},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Check-Webhook","id":"69f37820-ab16-4e19-bfd8-386dd6e249a3"}}}],"id":"64cef381-ea35-4f33-bb53-8e06ea009225","savedPayload":{"position":{"x":23586.440481808466,"y":29962.62420711041},"targetPosition":{"x":23853.091116404943,"y":29825.156250592187},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"id":"d3837a8f-361a-4a28-9691-e0afac2fb8f0","savedPayload":{"position":{"x":23853.091116404943,"y":29825.156250592187},"targetPosition":{"x":24119.74175100142,"y":29687.688294073963},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Task","name":"Candles Volumes","project":"Superalgos","bot":{"type":"Indicator Bot Instance","name":"Candles Volumes","config":"{ \n\"parameter1\": \"Value for parameter1 defined at the Product Definition\"\n}","project":"Superalgos","processes":[{"type":"Indicator Process Instance","name":"Candles Volumes Multi-Period-Market","project":"Superalgos","id":"1e1ea090-43a5-457e-ac5a-d8c23e242b03","savedPayload":{"position":{"x":23260.73799407062,"y":29932.322394401017},"targetPosition":{"x":23530.5845326438,"y":29801.23904069021},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Multi-Period-Market","id":"9f683143-a33f-42c1-9fa8-c601f01ee4e1"}}},{"type":"Indicator Process Instance","name":"Candles Volumes Multi-Period-Daily","project":"Superalgos","id":"3bb72ff9-6ce3-42ac-86c5-33f6a3e980c3","savedPayload":{"position":{"x":23231.348898260723,"y":29779.83728573044},"targetPosition":{"x":23530.5845326438,"y":29801.23904069021},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObjLine truncated
{"type":"Workspace","name":"API Fetcher Demo","rootNodes":[{"type":"Network","name":"My Network","project":"Superalgos","networkNodes":[{"type":"Network Node","name":"My Computer","config":"{ \n\"host\": \"localhost\", \n\"webPort\": \"34248\", \n\"webSocketsPort\": \"18041\"\n}","project":"Superalgos","dataTasks":{"type":"Data Tasks","name":"New Data Tasks","project":"Superalgos","projectDataTasks":[{"type":"Project Data Tasks","name":"Superalgos","project":"Superalgos","exchangeDataTasks":[{"type":"Exchange Data Tasks","name":"Binance","project":"Superalgos","marketDataTasks":[{"type":"Market Data Tasks","name":"Binance BTC/USDT","project":"Superalgos","dataMineTasks":[{"type":"Data Mine Tasks","name":"Masters","project":"Superalgos","taskManagers":[{"type":"Task Manager","name":"Masters","project":"Superalgos","tasks":[{"type":"Task","name":"Exchange Raw Data","project":"Superalgos","bot":{"type":"Sensor Bot Instance","name":"Exchange Raw Data","config":"{ \n\"startDate\": \"2020-01-01\"\n}","project":"Superalgos","processes":[{"type":"Sensor Process Instance","name":"Exchange Raw Data Historic-OHLCVs","project":"Superalgos","id":"de1b311f-5a2e-475e-a013-ff9bf81040db","savedPayload":{"position":{"x":23219.74175100142,"y":29687.688294073963},"targetPosition":{"x":23519.74175100142,"y":29687.688294073963},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":true},"referenceParent":{"type":"Process Definition","name":"Historic-OHLCVs","id":"5eb11d6a-022e-4f60-97c4-d6cf90b249dc"}}}],"id":"60dd9ff6-0240-4c42-b9b4-7564a3d9ba11","savedPayload":{"position":{"x":23519.74175100142,"y":29687.688294073963},"targetPosition":{"x":23819.74175100142,"y":29687.688294073963},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"id":"06a29ced-2d0a-449d-9acb-e92c293f67f8","savedPayload":{"position":{"x":23819.74175100142,"y":29687.688294073963},"targetPosition":{"x":24119.74175100142,"y":29687.688294073963},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":true}}},{"type":"Task","name":"Candles Volumes","project":"Superalgos","bot":{"type":"Indicator Bot Instance","name":"Candles Volumes","config":"{ \n\"parameter1\": \"Value for parameter1 defined at the Product Definition\"\n}","project":"Superalgos","processes":[{"type":"Indicator Process Instance","name":"Candles Volumes Multi-Period-Market","project":"Superalgos","id":"a8499fe8-a233-4b13-811b-8b34ebaea826","savedPayload":{"position":{"x":23607.609716645457,"y":28955.941017447334},"targetPosition":{"x":23819.74175100142,"y":29168.073051803298},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":true},"referenceParent":{"type":"Process Definition","name":"Multi-Period-Market","id":"9f683143-a33f-42c1-9fa8-c601f01ee4e1"}}},{"type":"Indicator Process Instance","name":"Candles Volumes Multi-Period-Daily","project":"Superalgos","id":"fab839a8-34bc-461f-bee9-4515480930f3","savedPayload":{"position":{"x":23742.096037470663,"y":28878.295303916577},"targetPosition":{"x":23819.74175100142,"y":29168.073051803298},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":true},"referenceParent":{"type":"Process Definition","name":"Multi-Period-Daily","id":"980ceb1d-7be6-454f-90d9-01ba1fd4a65d"}}}],"id":"64d9b2ad-3ef2-4e66-b63a-a2f9edaa7535","savedPayload":{"position":{"x":23819.74175100142,"y":29168.073051803298},"targetPosition":{"x":23969.74175100142,"y":29427.88067293863},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"id":"ad3cb918-196e-488a-a8fc-6131732409d8","savedPayload":{"position":{"x":23969.74175100142,"y":29427.88067293863},"targetPosition":{"x":24119.74175100142,"y":29687.688294073963},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":true}}}],"id":"bc03b3cc-1836-4c20-9ac2-361b7eb0becf","savedPayload":{"position":{"x":24119.74175100142,"y":29687.688294073963},"targetPosition":{"x":24379.549372136753,"y":29837.688294073963},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":true}}}],"id":"2dc6e7aa-78ac-4b70-be65-56e1498b580c","savedPayload":{"position":{"x":24379.549372136753,"y":29837.688294073963},"targetPosition":{"x":24639.356993272086,"y":29987.688294073963},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapseLine truncated
@@ -28,7 +28,7 @@
"config": true
},
"initialValues": {
"config": "{\"protocol\": \"https\",\"portNumber\":\"\"\"portNumber\":\"\",\"hostName\": \"\",\"path\": \"\"}"
"config": "{\"protocol\": \"https\",\"portNumber\":\"\",\"hostName\": \"\",\"path\": \"\"}"
},
"isTitleAllwaysVisible": true,
"isHierarchyHead": true,
@@ -127,9 +127,9 @@
"autoAdd": true
},
{
"name": "userVariables",
"name": "userDefinedVariables",
"type": "node",
"childType": "User Variables",
"childType": "User Defined Variables",
"autoAdd": false
}
]
@@ -36,7 +36,7 @@
"addLeftIcons": true,
"level": 3,
"attachingRules": {
"compatibleTypes": "->User Variables->"
"compatibleTypes": "->User Defined Variables->"
},
"propertyNameAtParent": "userDefinedVariable",
"editors": {
@@ -1,5 +1,5 @@
{
"type": "User Variables",
"type": "User Defined Variables",
"menuItems": [
{
"action": "Add UI Object",
@@ -22,7 +22,7 @@
"attachingRules": {
"compatibleTypes": "->Trading Episode->"
},
"propertyNameAtParent": "userVariables",
"propertyNameAtParent": "userDefinedVariables",
"childrenNodesProperties": [
{
"name": "userDefinedVariable",
@@ -0,0 +1,13 @@
{
"type": "API Data Fetcher Bot Instance",
"definition": {
"text": "This node represents an instance of an API Data Fetcher Bot. ",
"updated": 1621023247380
},
"paragraphs": [
{
"style": "Text",
"text": "Right click and select the pencil button to enter edit mode."
}
]
}
@@ -0,0 +1,14 @@
{
"type": "API Data Fetcher Bot",
"definition": {
"text": "It is a type of bot that can fetch data from any API on the internet as long as it is provided with a API Map at runtime.",
"updated": 1621022644745
},
"paragraphs": [
{
"style": "Text",
"text": "An API Data Fetcher Bots is similar to a Sensor Bot, except that the second extracts data from exchanges, while the first one can do it from any reachable API, including exchanges.",
"updated": 1621022763112
}
]
}
@@ -0,0 +1,13 @@
{
"type": "API Data Fetcher Process Instance",
"definition": {
"text": "This node represents an instance of a API Data Fetcher process. When running it will display the process's status.",
"updated": 1621023315985
},
"paragraphs": [
{
"style": "Text",
"text": "Right click and select the pencil button to enter edit mode."
}
]
}
@@ -0,0 +1,13 @@
{
"type": "API Endpoint",
"definition": {
"text": "Endpoints are important aspects of interacting with server-side web APIs, as they specify where resources lie that can be accessed by third party software. Usually the access is via a URI to which HTTP requests are posted, and from which the response is thus expected.",
"updated": 1621017376741
},
"paragraphs": [
{
"style": "Text",
"text": "Right click and select the pencil button to enter edit mode."
}
]
}
@@ -0,0 +1,13 @@
{
"type": "API Map Reference",
"definition": {
"text": "This node allows users to define a reference to an API Map, so that when the bot is ran, it uses that API Map to exctract data from.",
"updated": 1621023375333
},
"paragraphs": [
{
"style": "Text",
"text": "Right click and select the pencil button to enter edit mode."
}
]
}
@@ -0,0 +1,39 @@
{
"type": "API Map",
"definition": {
"text": "An API Map represents the mapping of an API so that is can be consumed by bots within Superalgos. API Maps are created by users and shared as Plugins so that any other community member can use them with their bots. ",
"updated": 1621016177698
},
"paragraphs": [
{
"style": "Text",
"text": "The way to create an API Map is to read the API's documentation and for each command and their responses, generate the node structure that represents it.",
"updated": 1621016234649
},
{
"style": "Subtitle",
"text": "Configuration"
},
{
"style": "List",
"text": "protocol: the protocol to be used to access the API. For now either http or https."
},
{
"style": "List",
"text": "portNumber: the port at which the API server is listening."
},
{
"style": "List",
"text": "hostName: the domain name or IP address of the API server."
},
{
"style": "List",
"text": "path: the URL path to where the API is located within the remote server.",
"updated": 1621016495461
},
{
"style": "List",
"text": "millisecondsBetweenCalls: [Optional] the number of milliseconds to wait before calling the remote host. This is particuary usefull if there is pagination, so that there is a delay before requesting each page."
}
]
}
@@ -0,0 +1,23 @@
{
"type": "API Path Parameter",
"definition": {
"text": "Path parameter is the type of parameters that is embedded as part of an URL path. It could be fixed string of text or it could be a parameter that is replaced by the API Fetcher Bot for some value at runtime.",
"updated": 1621018173339
},
"paragraphs": [
{
"style": "Subtitle",
"text": "Configuration",
"updated": 1621018220723
},
{
"style": "Text",
"text": "Important Properties"
},
{
"style": "List",
"text": "replaceBy: this property allows you to instruct the API Fetcher Bot to set a value to this parameter. The possible values are: @BaseAsset and @QuotedAsset",
"updated": 1621018303336
}
]
}
@@ -0,0 +1,14 @@
{
"type": "API Path Parameters",
"definition": {
"text": "Path parameters are the type of parameters that are embedded as part of an URL path. They could be fixed string of texts or they could be a parameter that is replaced by the API Fetcher Bot for some value at runtime.",
"updated": 1621018106262
},
"paragraphs": [
{
"style": "Text",
"text": "When found at an API Map they define the default values for each parameter, whicle when found at a Data Mine, they define the actual values to be used, which overrides the defaults.",
"updated": 1621022867854
}
]
}
@@ -0,0 +1,23 @@
{
"type": "API Query Parameter",
"definition": {
"text": "This node represent a single query string parameter.",
"updated": 1621022326307
},
"paragraphs": [
{
"style": "Subtitle",
"text": "Configuration",
"updated": 1621022390398
},
{
"style": "List",
"text": "codeName: This must match with the name of the query parameter defined at the API docs."
},
{
"style": "List",
"text": "value: It is the value to be used at this parameter. The API Map can define the value, that would be considered a default value. The same parameter defined at the Data Mine will have the actual value to be used replacing the default.",
"updated": 1621022463369
}
]
}
@@ -0,0 +1,14 @@
{
"type": "API Query Parameters",
"definition": {
"text": "Is a query string, that is a part of a uniform resource locator (URL) that assigns values to specified parameters. The query parameters commonly includes fields added to the base URL.",
"updated": 1621022301794
},
"paragraphs": [
{
"style": "Text",
"text": "When found at the API Map will define the default values for each parameter. When found at the Data Mine will define the actual values to be used, these would replace the defaults.",
"updated": 1621022566230
}
]
}
@@ -0,0 +1,22 @@
{
"type": "API Query Response",
"definition": {
"text": "This node enables the definition of a particular response of the API call. ",
"updated": 1621021001505
},
"paragraphs": [
{
"style": "Subtitle",
"text": "Configuration",
"updated": 1621021155356
},
{
"style": "List",
"text": "codeName: At the codeName property, the API Fetcher Bot will expect to find the http response code for the API call. You will need to have at least one of these nodes with a codeName = \"200\" that is the standard code for success."
},
{
"style": "Success",
"text": "If you wish to be able to react to other error codes, you should also have more of this nodes with the codeName of each of the status you want to cover."
}
]
}
@@ -0,0 +1,13 @@
{
"type": "API Query Responses",
"definition": {
"text": "API calls producee responses. Under this section they are defined.",
"updated": 1621020920908
},
"paragraphs": [
{
"style": "Text",
"text": "Right click and select the pencil button to enter edit mode."
}
]
}
@@ -0,0 +1,18 @@
{
"type": "API Response Field Reference",
"definition": {
"text": "This node allow users to reference an API Data Field from a Record Property. In other words it allows to link each piece of data the user wants to be saved locally to the field at the API Map that will hold the data at runtime.",
"updated": 1621022976968
},
"paragraphs": [
{
"style": "Text",
"text": "Once created, you need to reference an API Data Field.",
"updated": 1621023087914
},
{
"style": "Important",
"text": "All references originating at the same Record Definition must be to API Data Field s living at the same API Endpoint."
}
]
}
@@ -0,0 +1,24 @@
{
"type": "API Response Field",
"definition": {
"text": "The API responds with a JSON object. Each property of the object is mapped as node of this type. This node can have children of the same type allowing users to map a complex data structure.",
"updated": 1621021740145
},
"paragraphs": [
{
"style": "Subtitle",
"text": "Configuration",
"updated": 1621021763335
},
{
"style": "List",
"text": "codeName: The codeName needs to be the exact name of the property at the response JSON object holding the value. For the first object, since it is a special case, we usually use the codeName of rootObject.",
"updated": 1621021843683
},
{
"style": "List",
"text": "fieldType: This property declares if the data is number, a string an object or an array, those are the 4 possible values.",
"updated": 1621022104672
}
]
}
@@ -0,0 +1,18 @@
{
"type": "API Response Schema",
"definition": {
"text": "This node represents the mapping of the JSON response of the API into a data structure built by API Response Field nodes.",
"updated": 1621021486718
},
"paragraphs": [
{
"style": "Subtitle",
"text": "Configuration",
"updated": 1621021492973
},
{
"style": "List",
"text": "nodePath: the response from the server might include some header type of data and the actual data requested. Since the response is a JSON object, then the actual data might be located somewhere within the structure of that object. This property allows you to declare the path to the actual data requested, so as to jump the header-like information."
}
]
}
@@ -0,0 +1,13 @@
{
"type": "API Version",
"definition": {
"text": "An API might have different versions. This node is used for specifying the version that it's children are defining. At the codeName property we expect the version string as needed on the URL when calling the API Server.",
"updated": 1621016746266
},
"paragraphs": [
{
"style": "Text",
"text": "Right click and select the pencil button to enter edit mode."
}
]
}
@@ -28,7 +28,8 @@
},
{
"style": "List",
"text": "codeName is the name of the dataset as used within the code."
"text": "codeName is the name of the dataset as used within the code. 'Single-File'is a special value. Use it for datasets that do not depend on Time Frames and that have a timestamp Record Property instead of the regular Begin and End. When this type of datasets are a dependency of Market or Daily datasets, they need the codeName'Single-File'in order to be found on disk.",
"updated": 1621100190528
},
{
"style": "List",
@@ -0,0 +1,15 @@
{
"review": "Superalgos Project Review",
"pageNumber": 12,
"type": "Superalgos Review - elcoder's Superalgos Review",
"definition": {
"text": "\nI've just started using Superalgos and so far I'm blown away. The way the design is structured and the fact that everything is visualized makes it very intuitive and easier to grasp than comparable systems that are lacking in these areas. On top of that, this makes every structure (trading strategy, data mining, backtesting, etc...) highly configurable without the need for programming experience. \n\nLike I said, I'm very new to this project and for the short time I've used it I am falling in love with it. After delving into the first 3 tutorials it becomes quite obviouse that the potencial for both the Superalgos project and its'users are through the roof.\n\nelCoderCP4H",
"updated": 1620862380685
},
"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 docs.save to save your changes and app.contribute to send it to the main repository."
}
]
}
@@ -199,6 +199,26 @@
"text": "If you did install Git and you are experiencing the issue described above, restarting your PC may help things sort themselves out.",
"updated": 1610910739376
},
{
"style": "Subtitle",
"text": "Linux and iOS",
"updated": 1621085154588
},
{
"style": "Success",
"text": "Input your personal authentication token (PAT) in place of your password and hit enter. ",
"updated": 1621085095513
},
{
"style": "Text",
"text": "If you don't want to keep entering in your token then you can have git cach your credentials:",
"updated": 1621085196186
},
{
"style": "Link",
"text": "How to Cache your Git Credentials->docs.github.com/en/github/getting-started-with-github/caching-your-github-credentials-in-git",
"updated": 1621085386878
},
{
"style": "Text",
"text": ""
@@ -74,9 +74,19 @@
"style": "Text",
"text": "Data collections of different products may begin and end at different points in time. For example, it takes 20 candles to build the first bollingerBands object of the Bollinger Bands indicator, or 200 candles to build the first popularSMAs object of the SMA indicator. Therefore, the record in i position in the array of one product may not correspond to the same period of time of the record in the same position of a different product."
},
{
"style": "Subtitle",
"text": "getElement Function"
},
{
"style": "Text",
"text": "To overcome that hurdle, the getElement function, which takes two parameters, may be used:"
"text": "This function allows users to locate an object at a dataset whose objects does not have a begin and end property but instead, they have a timestamp property. It receives an arbitrary begin / end object and the function will search within the dependency dataset for the first record whose timestamp is whitin the begin and end of the received reference objet. For example, a user can get the News record that belong to a certain Candle object.",
"updated": 1621105823745
},
{
"style": "Text",
"text": "The getElement function, which takes two parameters, may be used:",
"updated": 1621105837484
},
{
"style": "List",
@@ -96,8 +106,27 @@
},
{
"style": "Javascript",
"text": "let candle = record.current // Calling \"Candles\"\nlet basicCandle = getElement ('basicCandles', candle) // Calling \"Basic Candles\"",
"updated": 1611430980056
"text": "let candle = record.current // Calling \"Candles\"\nlet basicCandle = getElement ('basicCandles', candle) // Calling \"Basic Candles\"",
"updated": 1621105552115
},
{
"style": "Subtitle",
"text": "getTimestampElement Function",
"updated": 1621105629181
},
{
"style": "Text",
"text": "Indicators might have parameters that influences it's calculations. These parameters are defined at the Product Definition config, and their values are set at the Process Instance config. Parameters are extracted at the Procedure Initialization Code. In order to facilitate this extraction we will create an object here that will be accesed from the Procedure Initialization with all parameters and their defined values.",
"updated": 1621105691314
},
{
"style": "Text",
"text": ""
},
{
"style": "Javascript",
"text": "let currentAssetMetrics = getTimestampElement('assetMetrics', record.current)",
"updated": 1621105716567
},
{
"style": "Title",
@@ -135,10 +135,11 @@ exports.newSuperalgosBotModulesFetchingProcess = function (processIndex) {
let existingFileContent // This holds the data of the existing dataset file.
let queryString = "" // This holds the query string to be sent at the API call.
let pathString = "" // This holds the path string to be sent at the API call.
let apiDataReceived // This hold the data received from the latest API call.
let apiData // This holds the specific object containing the data to be stored inside the structure received by the API call.
let apiResponseReceivedText // This hold the whole text received from the latest API call.
let apiResponseReceivedObject // This is the whole response received turned into a JSON object.
let apiData // This holds the specific object containing the data -to be stored- inside the structure received by the API call.
let dataReceivedArray = [] // This hold the cumulative data received from all calls to the API (multiple pages of data).
let dataReceivedObject // This hold a single data object when there is no pagination.
let dataReceivedObject // This hold a single data object when there is no pagination. The Data object is a node within the whole response received from the API.
let pageNumberParameter // This holds the node that represents a Page Number parameter.
let pageQueryString = "" // This holds the node part of query sting that deals with page numbers
let recordPropertiesNodePathMap = new Map() // This holds the calculated nodePath for each record property, in order to help find the property value on the data received.
@@ -456,7 +457,7 @@ exports.newSuperalgosBotModulesFetchingProcess = function (processIndex) {
}
function onEnd() {
apiDataReceived = Buffer.concat(chunks).toString('utf8')
apiResponseReceivedText = Buffer.concat(chunks).toString('utf8')
/*
If we received an errror code, we abort the processing at this point.
*/
@@ -473,9 +474,9 @@ exports.newSuperalgosBotModulesFetchingProcess = function (processIndex) {
If we did not received an object, that probably means something is not
good, and we got an HTML with the reason inside.
*/
if (apiDataReceived.substring(0, 1) !== "{") {
if (apiResponseReceivedText.substring(0, 1) !== "{") {
TS.projects.superalgos.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[WARN] start -> startProcess -> fetchAllPages -> fetchAPIData -> onResponse -> onEnd -> Unexpected Response. Not an JSON Object. -> apiDataReceived = " + apiDataReceived);
"[WARN] start -> startProcess -> fetchAllPages -> fetchAPIData -> onResponse -> onEnd -> Unexpected Response. Not an JSON Object. -> apiResponseReceivedText = " + apiResponseReceivedText);
resolve('UNEXPECTED_API_RESPONSE')
return
}
@@ -486,9 +487,9 @@ exports.newSuperalgosBotModulesFetchingProcess = function (processIndex) {
If we did not received an array, that probably means something is not
good, and we got an HTML with the reason inside.
*/
if (apiDataReceived.substring(0, 1) !== "[") {
if (apiResponseReceivedText.substring(0, 1) !== "[") {
TS.projects.superalgos.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[WARN] start -> startProcess -> fetchAllPages -> fetchAPIData -> onResponse -> onEnd -> Unexpected Response. Not an Array with Data. -> apiDataReceived = " + apiDataReceived);
"[WARN] start -> startProcess -> fetchAllPages -> fetchAPIData -> onResponse -> onEnd -> Unexpected Response. Not an Array with Data. -> apiResponseReceivedText = " + apiResponseReceivedText);
resolve('UNEXPECTED_API_RESPONSE')
return
}
@@ -498,9 +499,9 @@ exports.newSuperalgosBotModulesFetchingProcess = function (processIndex) {
/*
The actual data we need could be anywhere within the data structure received.
The exact place is configured at the apiResponseSchemaNode property nodePath.
We will eval the nodePath property (this assumes that the apiDataObject is defined)
We will eval the nodePath property (this assumes that the apiResponseReceivedObject is defined)
*/
let apiDataObject = JSON.parse(apiDataReceived)
apiResponseReceivedObject = JSON.parse(apiResponseReceivedText)
apiData = eval(apiResponseSchemaNode.config.nodePath)
/*
We will expect the apiData to be an Array. Depending if it has data or not we will return
@@ -549,7 +550,7 @@ exports.newSuperalgosBotModulesFetchingProcess = function (processIndex) {
function appendToExistingDataset() {
/*
We are going to append the curernt apiDataReceived to the existing file.
We are going to append the curernt apiResponseReceivedText to the existing file.
*/
let existingFileArray = JSON.parse(existingFileContent)
/*
@@ -644,15 +645,35 @@ exports.newSuperalgosBotModulesFetchingProcess = function (processIndex) {
let apiResponseField = recordProperty.apiResponseFieldReference.referenceParent
/*
We will need to get the nodePath for this property, representing the path
to the value on the received data.
to the value on the received data. There are 2 ways to get this nodePath.
1) It is explicitly declared at the node. If this exists then we will use it.
2) It was calculated automatically.
*/
let nodePath = recordPropertiesNodePathMap.get(recordProperty.config.codeName)
let nodePath = recordProperty.config.nodePath
if (nodePath === undefined) {
nodePath = recordPropertiesNodePathMap.get(recordProperty.config.codeName)
}
let value = eval(nodePath)
if (recordProperty.config.isDate === true) {
value = (new Date(value)).valueOf()
}
/*
Check that we do not accept values that will break the JSON format of the file.
*/
if (isNaN(value)) { value = 0 }
if (recordProperty.config.isString !== true && recordProperty.config.isBoolean !== true) {
/*
At this point Dates have been converted to numbers, so if the Record Property is not a string
then it must be a number.
*/
if (isNaN(value)) { value = 0 }
}
if (value === null || value === undefined) { value = 0 }
record.values.push(value)
record.headers.push(recordProperty.config.codeName)
@@ -75,7 +75,17 @@
function getFile() {
let fileName = "Data.json";
let filePath = dependency.referenceParent.parentNode.config.codeName + '/' + dependency.referenceParent.config.codeName + "/" + timeFrameLabel;
let filePath
/*
For datasets that are not dependent on a Time Frame we will build the file path without the timeFrameLabel
*/
if (dependency.referenceParent.config.codeName === "Single-File") {
filePath= dependency.referenceParent.parentNode.config.codeName + '/' + dependency.referenceParent.config.codeName
} else {
filePath= dependency.referenceParent.parentNode.config.codeName + '/' + dependency.referenceParent.config.codeName + "/" + timeFrameLabel
}
datasetModule.getTextFile(filePath, fileName, onFileReceived)
function onFileReceived(err, text) {
@@ -335,17 +335,44 @@
let dataDependencyMap = new Map()
for (let j = 0; j < dataDependecyArray.length; j++) {
let record = dataDependecyArray[j]
let key = record.begin.toString() + '-' + record.end.toString()
dataDependencyMap.set(key, record)
let key
if (record.begin !== undefined && record.end !== undefined) {
key = record.begin.toString() + '-' + record.end.toString()
dataDependencyMap.set(key, record)
} else {
/*
Datasets with objects that do not have a begin and end can not be part of the map.
*/
}
}
dataDependencies[dataDependencyName] = dataDependencyMap
}
}
/*
This function allows users to locate an object at a dataset based on the begins and end properties
of another object provided to the function as a parameter. For example, users can localte the
bollinger band object that has the same begin and end than a candle object.
*/
function getElement(dependencyName, currentRecordPrimaryDataDependency) {
let key = currentRecordPrimaryDataDependency.begin.toString() + '-' + currentRecordPrimaryDataDependency.end.toString()
return dataDependencies[dependencyName].get(key)
}
/*
This function allows users to locate an object at a dataset whose objects does not have a begin and end
property but instead, they have a timestamp property. It receives an arbitrary begin / end object and
the function will search within the dependency dataset for the first record whose timestamp is whitin
the begin and end of the received reference objet. For example, a user can get the News record that belong
to a certain Candle object.
*/
function getTimestampElement(dependencyName, currentRecordPrimaryDataDependency) {
let dependencyArray = products[dependencyName]
for (let i = 0; i < dependencyArray.length; i++) {
let record = dependencyArray[i]
if (record.timestamp >= currentRecordPrimaryDataDependency.begin && record.timestamp <= currentRecordPrimaryDataDependency.end) {
return record
}
}
}
/*
Indicators might have parameters that influences it's calculations. These parameters
@@ -147,7 +147,7 @@ function newSuperalgosFunctionLibraryTradingSessionFunctions() {
'Serial Number->Identifier->Begin->End->Begin Rate->End Rate->Strategy Name->Status->Exit Type->' +
'Balance->Begin Balance->End Balance->' +
'Index->Situation Name->Formula->Periods->' +
'User Variables->User Defined Variable->'
'User Defined Variables->User Defined Variable->'
let tradingEngine = UI.projects.superalgos.functionLibraries.protocolNode.getProtocolNode(node.tradingEngineReference.payload.referenceParent, false, true, true, false, false, lightingPath)
+40 -19
View File
@@ -1,26 +1,40 @@
# Superalgos Beta 10 - Getting Started Guide
All procedures are the same for Windows, Linux, or Mac OS. Raspberry Pi terminal commands have been included for ease of use.
Superalgos is not just another open-source project. We are an open and welcoming community devised, nurtured, and incentivized with the project's native <a href="https://superalgos.org/token-overview.shtml" target="_blank">Superalgos (SA) token</a> to grow into a massive trading collaboration. You will notice the difference as soon as you join the [Telegram Community Group](https://t.me/superalgoscommunity) or the new [Discord Server](https://discord.gg/CGeKC6WQQb).
> **IMPORTANT:** Minimalist hardware —both virtual and physical— is better suited for production deployments, where the use of the GUI is minimal. We highly recommend learning Superalgos in a local installation. Mastering the system takes time, and the use of the GUI to go through in-app tutorials is crucial during the learning process. Your experience will be orders of magnitude better if you follow this advice: leave minimalist hardware for when you are ready to start trading live.
Superalgos is the ultimate market research and trading automation platform. The software is contributor-centric, built by contributors, for contributors. It is also free and open-source. Can't wait to contribute? No need to wait! You may start by giving a star to this repository in the top-right corner of this page!
![superalgos-readme](https://user-images.githubusercontent.com/13994516/106380124-844d8980-63b0-11eb-9bd9-4f977b6c183b.gif)
# Getting Started Guide
All procedures are the same for Windows, Linux, or Mac OS. Raspberry Pi terminal commands have been included for ease of use.
> **IMPORTANT:** Remote installations and minimalist hardware —both virtual and physical— are better suited for production deployments, where the use of the GUI is minimal. We highly recommend learning Superalgos in a local installation. Mastering the system takes time, and the use of the GIU to go through in-app tutorials is crucial during the learning process. Your experience will be orders of magnitude better if you follow this advice: leave remote installations and minimalist hardware for when you are ready to start trading live.
# Pre-Requisites
## 1. Node JS
## 1. Node JS Installation
If you don't have it yet, download and install Node.js.
Node JS is an open-source server environment required to run Superalgos.
**a.** Go to the Node JS [download page](https://nodejs.org/en/download/).
**A.** Go to the Node JS [download page](https://nodejs.org/en/download/).
**b.** Download your system’s installer. Select *LTS Recommended for Most Users* and click the big Windows or macOS Installer button. If you are on Linux, the installer is listed further down the page.
**B.** Download your system’s installer. Select *LTS Recommended for Most Users* and click the big Windows or macOS Installer button. If you are on Linux, the installer is listed further down the page.
**c.** Run the installer with the default configuration — just click Next until Node.JS is fully installed.
**C.** Run the installer with the default configuration — just click Next until Node.JS is fully installed. That's it! You can continue with step 2 (Git Installation).
**NOTE FOR RASPBERRY PI USERS:** You may install Node.JS just like you would on any other machine as per the above instructions. As an alternative, you may also try the following from the SSH Terminal. **NOTE:** It is best to use the most current and updated version of the FULL PiOS image.
<hr>
**NODE JS INSTALLATION FOR RASPBERRY PI USERS**
You may install Node.JS just like you would on any other machine as per the above instructions. As an alternative, you may also try the following from the SSH Terminal.
**NOTE:** It is best to use the most current and updated version of the FULL PiOS image.
```
curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash -
@@ -37,35 +51,42 @@ you may also type the following to verify the Node.js installation and version.
```
node -v
```
<hr>
## 2. Git
## 2. Git Installation
Download and install Git.
Git is an open-source distributed version control system required to download and stay up to date with Superalgos.
**a.** Go to the Git [download page](https://git-scm.com/downloads).
**A.** Go to the Git [download page](https://git-scm.com/downloads).
**b.** Download the version for your Operating System.
**B.** Download the version for your Operating System.
**c.** Run the installer with the default configuration — just click Next until Git is fully installed.
**C.** Run the installer with the default configuration — just click Next until Git is fully installed.
**IMPORTANT:** The latest version of Git is required to handle the authentication with GitHub.com.
**NOTE FOR MAC USERS:** Depending on your setup, installing Git may be optional. The native XCode Command Line Developer Tools seems to work well. If you do install Git, we have tested Tim Harper's binary installer successfully.
**NOTE FOR RASPBERRY PI USERS:** Just like with Node.JS, you may follow the above instructions to install Git, or us the SSH Terminal command. The most recent version of PiOS has Git already installed, so this may give you an error. The error will not affect your installation.
<hr>
**GIT INSTALLATION FOR RASPBERRY PI USERS**
Just like with Node.JS, you may follow the above instructions to install Git, or use the SSH Terminal command. The most recent version of PiOS has Git already installed, so this may give you an error. The error will not affect your installation.
```
sudo apt-get install git
```
<hr>
## 3. Google Chrome or Safari
Use Chrome, or Safari on Mac. These are the only tested browsers.
**a.** Go to the Chrome [download page](https://www.google.com/chrome/).
**A.** Go to the Chrome [download page](https://www.google.com/chrome/).
**b.** Run the installer.
**B.** Run the installer.
Before you begin, it is recommended that you set up Chrome/Safari as your default browser.
@@ -109,7 +130,7 @@ This creates the `Superalgos` folder in the current directory, which contains th
## 4. Migrating from Superalgos Beta 9
### Refactorings
### Refactorings
In order to migrate your own workspaces to Beta 10, you will need to open My Workspaces folder with an IDE like VS Code and do some refactorings. This is what you need to find and replace:
@@ -142,7 +163,7 @@ then
node run minMemo noBrowser
```
## 2. Add a Desktop/Launcher Shortcut for Superalgos
## 2. Add a Desktop/Launcher Shortcut for Superalgos
There are a number of scripts available to help make lauching Superalgos easier and feel more native. To use these scripts, follow the steps for your operating system.
@@ -150,7 +171,7 @@ There are a number of scripts available to help make lauching Superalgos easier
Open a file browser and navigate to the Superalgos Directory.
Under the folder titled `Launch-Scripts` double-click the script `create-shortcut-windows.bat`.
Under the folder titled `Launch-Scripts` double-click the script `create-shortcut-windows.bat`.
After running this script there will be two shortcuts added. One to your start menu and one to your desktop. You can now lauch Superalgos from any of these shortcuts, or search `Superalgos` in the start menu search bar.
@@ -191,7 +212,7 @@ Now both shortcuts will launch Superalgos like any other program on your compute
We are testing the UI on Google Chrome and Safari on macOS only. It may work on other browsers as well &mdash; or not. If you are running on a different browser and ever need support, make sure you mention that fact upfront, or even better, try on Chrome/Safari first.
**TIP:** If your computer has 8 GB of RAM or less, use ```node run minMemo``` to run the system with minimal RAM requirements.
# Running Superalgos on a Headless Linux Server as a Daemon
If you’re running Superalgos on a headless linux server like a Raspberry Pi, you might want to run it as a daemon so it isn’t attached to your current login session. The easiest, most standard way to go about this is probably using `systemd`. Most linux distributions use it as default init system/service manager.
@@ -243,7 +264,7 @@ If you have installed shortcuts for Superalgos you can remove them as follows:
Open a file browser and navigate to the Superalgos directory.
Under the folder titled `Launch-Scripts` double-click the script `uninstall-shortcut-windows.bat`.
Under the folder titled `Launch-Scripts` double-click the script `uninstall-shortcut-windows.bat`.
## For **Ubuntu** Users