Massive Refactoring of Current for Trading Current
This commit is contained in:
1 parent
575546ceea
commit
b9ff1ecd47
55 files changed
+766
-766
No files matched your search
File renamed without changes.
@@ -1 +1 @@
|
||||
{"type":"Learning Mine","name":"Masters","config":"{ \n\"codeName\": \"Masters\"\n}","project":"Superalgos","learningBots":[{"type":"Learning Bot","name":"Low Frequency","config":"{\n\"codeName\": \"Low-Frequency\"\n}","project":"Superalgos","processes":[{"type":"Process Definition","name":"Learning","config":"{\n \"codeName\": \"Learning\",\n \"sessionRunWaitTime\": 5000,\n \"retryWaitTime\": 10000,\n \"framework\": {\n \"name\": \"Low-Frequency-Learning-Process\"\n }\n }","project":"Superalgos","processOutput":{"type":"Process Output","name":"New Process Output","project":"Superalgos","outputDatasets":[],"outputDatasetFolders":[{"type":"Output Dataset Folder","name":"Learning Engine","project":"Superalgos","outputDatasets":[],"outputDatasetFolders":[{"type":"Output Dataset Folder","name":"Episode","project":"Superalgos","outputDatasets":[{"type":"Output Dataset","name":"Multi-Period-Market Episode Counters","project":"Superalgos","id":"c0de6b69-60e2-4574-890a-35743f75c569","savedPayload":{"position":{"x":11131.109355831457,"y":18399.62641535906},"targetPosition":{"x":10916.997186924276,"y":18003.828513487584},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Period-Market","id":"ac1bc967-9c9f-47f0-8815-535abd7cb777"}}},{"type":"Output Dataset","name":"Multi-Period-Daily Episode Counters","project":"Superalgos","id":"da23a8ff-8b3d-4caa-a27c-f59352911212","savedPayload":{"position":{"x":11054.736015653314,"y":18432.230211733928},"targetPosition":{"x":10916.997186924276,"y":18003.828513487584},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Period-Daily","id":"6881069e-a4d1-4b41-892f-557d2031adea"}}},{"type":"Output Dataset","name":"Multi-Period-Market Episode Statistics","project":"Superalgos","id":"dfdcb71e-c123-429e-bc2d-cf33963378d6","savedPayload":{"position":{"x":10973.672144862325,"y":18450.245302086223},"targetPosition":{"x":10916.997186924276,"y":18003.828513487584},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Period-Market","id":"8408c316-e04d-4b0d-8c81-1bf3b4126894"}}},{"type":"Output Dataset","name":"Multi-Period-Daily Episode Statistics","project":"Superalgos","id":"fa9e000d-199c-4ed4-b10f-6c586bfc2fa5","savedPayload":{"position":{"x":10890.678276352872,"y":18453.05820412071},"targetPosition":{"x":10916.997186924276,"y":18003.828513487584},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Period-Daily","id":"553a0b49-2a61-41c4-ac95-f762051c1cab"}}},{"type":"Output Dataset","name":"Multi-Period-Market Episode Candle","project":"Superalgos","id":"a9a7b1fe-ecff-4d08-bd3b-297e4263c703","savedPayload":{"position":{"x":10808.580666776874,"y":18440.573127832315},"targetPosition":{"x":10916.997186924276,"y":18003.828513487584},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Period-Market","id":"a08a3974-75ac-4a2b-bc09-f80547a61381"}}},{"type":"Output Dataset","name":"Multi-Period-Daily Episode Candle","project":"Superalgos","id":"d80bea92-bca6-4826-aa32-34bc7c13f952","savedPayload":{"position":{"x":10730.175051763214,"y":18413.21523751984},"targetPosition":{"x":10916.997186924276,"y":18003.828513487584},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Period-Daily","id":"46221186-fff7-4333-a087-a32a649e9ce8"}}},{"type":"Output Dataset","name":"Multi-Period-Market Episode Balances","project":"Superalgos","id":"7f1463e2-38f8-4850-8198-bf9cee6507df","savedPayload":{"position":{"x":10658.13144049401,"y":18371.916173325702},"targetPosition":{"x":10916.997186924276,"y":18003.828513487584},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Period-Market","id":"ee987e46-ed3c-4ade-8ab8-e6e503f46963"}}},{"type":"Output Dataset","name":"Multi-Period-Daily Episode Balances","project":"Superalgos","id":"3651b117-ece2-4a25-b2a4-21a54a737d50","savedPayload":{"position":{"x":10594.903191744248,"y":18318.082325348263},"targetPosition":{"x":10916.997186924276,"y":18003.828513487584},"floatingObject":{"isPiLine truncated
|
||||
{"type":"Learning Mine","name":"Masters","config":"{ \n\"codeName\": \"Masters\"\n}","project":"Superalgos","learningBots":[{"type":"Learning Bot","name":"Low Frequency","config":"{\n\"codeName\": \"Low-Frequency\"\n}","project":"Superalgos","processes":[{"type":"Process Definition","name":"Learning","config":"{\n \"codeName\": \"Learning\",\n \"sessionRunWaitTime\": 5000,\n \"retryWaitTime\": 10000,\n \"framework\": {\n \"name\": \"Low-Frequency-Learning-Process\"\n }\n }","project":"Superalgos","processOutput":{"type":"Process Output","name":"New Process Output","project":"Superalgos","outputDatasets":[],"outputDatasetFolders":[{"type":"Output Dataset Folder","name":"Learning Engine","project":"Superalgos","outputDatasets":[],"outputDatasetFolders":[{"type":"Output Dataset Folder","name":"Episode","project":"Superalgos","outputDatasets":[{"type":"Output Dataset","name":"Multi-Period-Market Episode Counters","project":"Superalgos","id":"c0de6b69-60e2-4574-890a-35743f75c569","savedPayload":{"position":{"x":11131.109355831457,"y":18399.62641535906},"targetPosition":{"x":10916.997186924276,"y":18003.828513487584},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Period-Market","id":"ac1bc967-9c9f-47f0-8815-535abd7cb777"}}},{"type":"Output Dataset","name":"Multi-Period-Daily Episode Counters","project":"Superalgos","id":"da23a8ff-8b3d-4caa-a27c-f59352911212","savedPayload":{"position":{"x":11054.736015653314,"y":18432.230211733928},"targetPosition":{"x":10916.997186924276,"y":18003.828513487584},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Period-Daily","id":"6881069e-a4d1-4b41-892f-557d2031adea"}}},{"type":"Output Dataset","name":"Multi-Period-Market Episode Statistics","project":"Superalgos","id":"dfdcb71e-c123-429e-bc2d-cf33963378d6","savedPayload":{"position":{"x":10973.672144862325,"y":18450.245302086223},"targetPosition":{"x":10916.997186924276,"y":18003.828513487584},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Period-Market","id":"8408c316-e04d-4b0d-8c81-1bf3b4126894"}}},{"type":"Output Dataset","name":"Multi-Period-Daily Episode Statistics","project":"Superalgos","id":"fa9e000d-199c-4ed4-b10f-6c586bfc2fa5","savedPayload":{"position":{"x":10890.678276352872,"y":18453.05820412071},"targetPosition":{"x":10916.997186924276,"y":18003.828513487584},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Period-Daily","id":"553a0b49-2a61-41c4-ac95-f762051c1cab"}}},{"type":"Output Dataset","name":"Multi-Period-Market Episode Candle","project":"Superalgos","id":"a9a7b1fe-ecff-4d08-bd3b-297e4263c703","savedPayload":{"position":{"x":10808.580666776874,"y":18440.573127832315},"targetPosition":{"x":10916.997186924276,"y":18003.828513487584},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Period-Market","id":"a08a3974-75ac-4a2b-bc09-f80547a61381"}}},{"type":"Output Dataset","name":"Multi-Period-Daily Episode Candle","project":"Superalgos","id":"d80bea92-bca6-4826-aa32-34bc7c13f952","savedPayload":{"position":{"x":10730.175051763214,"y":18413.21523751984},"targetPosition":{"x":10916.997186924276,"y":18003.828513487584},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Period-Daily","id":"46221186-fff7-4333-a087-a32a649e9ce8"}}},{"type":"Output Dataset","name":"Multi-Period-Market Episode Balances","project":"Superalgos","id":"7f1463e2-38f8-4850-8198-bf9cee6507df","savedPayload":{"position":{"x":10658.13144049401,"y":18371.916173325702},"targetPosition":{"x":10916.997186924276,"y":18003.828513487584},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Period-Market","id":"ee987e46-ed3c-4ade-8ab8-e6e503f46963"}}},{"type":"Output Dataset","name":"Multi-Period-Daily Episode Balances","project":"Superalgos","id":"3651b117-ece2-4a25-b2a4-21a54a737d50","savedPayload":{"position":{"x":10594.903191744248,"y":18318.082325348263},"targetPosition":{"x":10916.997186924276,"y":18003.828513487584},"floatingObject":{"isPiLine truncated
|
||||
@@ -1 +1 @@
|
||||
{"type":"Trading Engine","name":"Low-Frequency","project":"Superalgos","current":{"type":"Current","name":"New Current","project":"Superalgos","episode":{"type":"Episode","name":"New 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":25079.57302866531,"y":38997.25347206287},"targetPosition":{"x":25648.862254589007,"y":39359.93070769697},"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":25151.200052242173,"y":38903.9073175564},"targetPosition":{"x":25648.862254589007,"y":39359.93070769697},"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":25237.94829000812,"y":38824.41720300039},"targetPosition":{"x":25648.862254589007,"y":39359.93070769697},"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":25337.18194065536,"y":38761.19839530167},"targetPosition":{"x":25648.862254589007,"y":39359.93070769697},"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":25445.885839923623,"y":38716.171765941916},"targetPosition":{"x":25648.862254589007,"y":39359.93070769697},"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":25560.757074840472,"y":38690.70542626965},"targetPosition":{"x":25648.862254589007,"y":39359.93070769697},"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":25678.305341060608,"y":38685.57315812922},"targetPosition":{"x":25648.862254589007,"y":39359.93070769697},"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":25794.958993997225,"y":38700.930902891014},"targetPosition":{"x":25648.862254589007,"y":39359.93070769697},"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":25907.173571435444,"y":38736.312023251856},"targetPosition":{"x":25648.862254589007,"y":39359.93070769697},"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":26011.539490223113,"y":38790.64148177327},"targetPosition":{"x":25648.862254589007,"y":39359.93070769697},"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-4d80-b8ad-4a4ed55f2387","savedPayload":{"position":{"x":26631.Line truncated
|
||||
{"type":"Trading Engine","name":"Low-Frequency","project":"Superalgos","tradingCurrent":{"type":"Trading Current","name":"New Trading Current","project":"Superalgos","episode":{"type":"Episode","name":"New 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":31062.57302866531,"y":23980.75347206287},"targetPosition":{"x":31631.862254589007,"y":24343.43070769697},"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":31134.200052242173,"y":23887.407317556397},"targetPosition":{"x":31631.862254589007,"y":24343.43070769697},"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":31220.94829000812,"y":23807.91720300039},"targetPosition":{"x":31631.862254589007,"y":24343.43070769697},"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":31320.18194065536,"y":23744.698395301668},"targetPosition":{"x":31631.862254589007,"y":24343.43070769697},"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":31428.885839923623,"y":23699.671765941916},"targetPosition":{"x":31631.862254589007,"y":24343.43070769697},"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":31543.757074840472,"y":23674.205426269647},"targetPosition":{"x":31631.862254589007,"y":24343.43070769697},"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":31661.305341060608,"y":23669.07315812922},"targetPosition":{"x":31631.862254589007,"y":24343.43070769697},"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":31777.958993997225,"y":23684.430902891014},"targetPosition":{"x":31631.862254589007,"y":24343.43070769697},"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":31890.173571435444,"y":23719.812023251856},"targetPosition":{"x":31631.862254589007,"y":24343.43070769697},"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":31994.539490223113,"y":23774.141481773273},"targetPosition":{"x":31631.862254589007,"y":24343.43070769697},"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-4d80-b8ad-4a4ed55f2387","savedPaylLine truncated
|
||||
@@ -1 +1 @@
|
||||
{"type":"Trading Mine","name":"Masters","config":"{ \n\"codeName\": \"Masters\"\n}","project":"Superalgos","tradingBots":[{"type":"Trading Bot","name":"Low Frequency","config":"{\n\"codeName\": \"Low-Frequency\"\n}","project":"Superalgos","processes":[{"type":"Process Definition","name":"Trading","config":"{\n \"codeName\": \"Trading\",\n \"sessionRunWaitTime\": 5000,\n \"retryWaitTime\": 10000,\n \"framework\": {\n \"name\": \"Low-Frequency-Trading-Process\"\n }\n }","project":"Superalgos","processOutput":{"type":"Process Output","name":"New Process Output","project":"Superalgos","outputDatasets":[],"outputDatasetFolders":[{"type":"Output Dataset Folder","name":"Trading Engine","project":"Superalgos","outputDatasets":[],"outputDatasetFolders":[{"type":"Output Dataset Folder","name":"Episode","project":"Superalgos","outputDatasets":[{"type":"Output Dataset","name":"Multi-Period-Market Episode Counters","project":"Superalgos","id":"ec8d74ba-a4ad-417a-b479-6bae95b8a1fe","savedPayload":{"position":{"x":24910.97457254189,"y":18457.46644293786},"targetPosition":{"x":24696.86240363471,"y":18061.668541066385},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Period-Market","id":"3ed03a02-381d-43fe-9faa-761728c53bd8"}}},{"type":"Output Dataset","name":"Multi-Period-Daily Episode Counters","project":"Superalgos","id":"22b0af33-8c2f-4194-839b-affd18f298d5","savedPayload":{"position":{"x":24834.601232363748,"y":18490.07023931273},"targetPosition":{"x":24696.86240363471,"y":18061.668541066385},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Period-Daily","id":"15f5b150-f1cf-403c-8cb9-2c7c4e1db8e8"}}},{"type":"Output Dataset","name":"Multi-Period-Market Episode Statistics","project":"Superalgos","id":"23ab91ae-2e78-4993-bb69-855f69cef1ce","savedPayload":{"position":{"x":24753.53736157276,"y":18508.085329665024},"targetPosition":{"x":24696.86240363471,"y":18061.668541066385},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Period-Market","id":"fc9dc0f7-35e0-4548-bb91-f920825d694f"}}},{"type":"Output Dataset","name":"Multi-Period-Daily Episode Statistics","project":"Superalgos","id":"d0a4515a-279d-4c27-8de2-168108861242","savedPayload":{"position":{"x":24670.543493063306,"y":18510.89823169951},"targetPosition":{"x":24696.86240363471,"y":18061.668541066385},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Period-Daily","id":"91953362-8751-4440-a898-21245cd47c15"}}},{"type":"Output Dataset","name":"Multi-Period-Market Episode Candle","project":"Superalgos","id":"7fc80977-5b37-413e-8107-0a89a16e08b0","savedPayload":{"position":{"x":24588.445883487308,"y":18498.413155411115},"targetPosition":{"x":24696.86240363471,"y":18061.668541066385},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Period-Market","id":"17fb41f5-61b5-4433-9a10-950ff8216a7e"}}},{"type":"Output Dataset","name":"Multi-Period-Daily Episode Candle","project":"Superalgos","id":"a6888750-1043-420c-9253-633e1399c5e4","savedPayload":{"position":{"x":24510.040268473647,"y":18471.05526509864},"targetPosition":{"x":24696.86240363471,"y":18061.668541066385},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Period-Daily","id":"bbc9467d-28bf-432b-9e49-582d1bcabfb9"}}},{"type":"Output Dataset","name":"Multi-Period-Market Episode Balances","project":"Superalgos","id":"0ad114df-f076-4a86-8c62-4c4a146da73c","savedPayload":{"position":{"x":24437.996657204443,"y":18429.756200904503},"targetPosition":{"x":24696.86240363471,"y":18061.668541066385},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Period-Market","id":"acddff59-b51b-4b45-b58f-71d4077755ee"}}},{"type":"Output Dataset","name":"Multi-Period-Daily Episode Balances","project":"Superalgos","id":"04b51302-957d-4365-ad55-9f89d60e261c","savedPayload":{"position":{"x":24374.76840845468,"y":18375.922352927064},"targetPosition":{"x":24696.86240363471,"y":18061.668541066385},"floatingObject":{"isPinned":false,"isFroLine truncated
|
||||
{"type":"Trading Mine","name":"Masters","config":"{ \n\"codeName\": \"Masters\"\n}","project":"Superalgos","tradingBots":[{"type":"Trading Bot","name":"Low Frequency","config":"{\n\"codeName\": \"Low-Frequency\"\n}","project":"Superalgos","processes":[{"type":"Process Definition","name":"Trading","config":"{\n \"codeName\": \"Trading\",\n \"sessionRunWaitTime\": 5000,\n \"retryWaitTime\": 10000,\n \"framework\": {\n \"name\": \"Low-Frequency-Trading-Process\"\n }\n }","project":"Superalgos","processOutput":{"type":"Process Output","name":"New Process Output","project":"Superalgos","outputDatasets":[],"outputDatasetFolders":[{"type":"Output Dataset Folder","name":"Trading Engine","project":"Superalgos","outputDatasets":[],"outputDatasetFolders":[{"type":"Output Dataset Folder","name":"Episode","project":"Superalgos","outputDatasets":[{"type":"Output Dataset","name":"Multi-Period-Market Episode Counters","project":"Superalgos","id":"ec8d74ba-a4ad-417a-b479-6bae95b8a1fe","savedPayload":{"position":{"x":24910.97457254189,"y":18457.46644293786},"targetPosition":{"x":24696.86240363471,"y":18061.668541066385},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Period-Market","id":"3ed03a02-381d-43fe-9faa-761728c53bd8"}}},{"type":"Output Dataset","name":"Multi-Period-Daily Episode Counters","project":"Superalgos","id":"22b0af33-8c2f-4194-839b-affd18f298d5","savedPayload":{"position":{"x":24834.601232363748,"y":18490.07023931273},"targetPosition":{"x":24696.86240363471,"y":18061.668541066385},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Period-Daily","id":"15f5b150-f1cf-403c-8cb9-2c7c4e1db8e8"}}},{"type":"Output Dataset","name":"Multi-Period-Market Episode Statistics","project":"Superalgos","id":"23ab91ae-2e78-4993-bb69-855f69cef1ce","savedPayload":{"position":{"x":24753.53736157276,"y":18508.085329665024},"targetPosition":{"x":24696.86240363471,"y":18061.668541066385},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Period-Market","id":"fc9dc0f7-35e0-4548-bb91-f920825d694f"}}},{"type":"Output Dataset","name":"Multi-Period-Daily Episode Statistics","project":"Superalgos","id":"d0a4515a-279d-4c27-8de2-168108861242","savedPayload":{"position":{"x":24670.543493063306,"y":18510.89823169951},"targetPosition":{"x":24696.86240363471,"y":18061.668541066385},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Period-Daily","id":"91953362-8751-4440-a898-21245cd47c15"}}},{"type":"Output Dataset","name":"Multi-Period-Market Episode Candle","project":"Superalgos","id":"7fc80977-5b37-413e-8107-0a89a16e08b0","savedPayload":{"position":{"x":24588.445883487308,"y":18498.413155411115},"targetPosition":{"x":24696.86240363471,"y":18061.668541066385},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Period-Market","id":"17fb41f5-61b5-4433-9a10-950ff8216a7e"}}},{"type":"Output Dataset","name":"Multi-Period-Daily Episode Candle","project":"Superalgos","id":"a6888750-1043-420c-9253-633e1399c5e4","savedPayload":{"position":{"x":24510.040268473647,"y":18471.05526509864},"targetPosition":{"x":24696.86240363471,"y":18061.668541066385},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Period-Daily","id":"bbc9467d-28bf-432b-9e49-582d1bcabfb9"}}},{"type":"Output Dataset","name":"Multi-Period-Market Episode Balances","project":"Superalgos","id":"0ad114df-f076-4a86-8c62-4c4a146da73c","savedPayload":{"position":{"x":24437.996657204443,"y":18429.756200904503},"targetPosition":{"x":24696.86240363471,"y":18061.668541066385},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Period-Market","id":"acddff59-b51b-4b45-b58f-71d4077755ee"}}},{"type":"Output Dataset","name":"Multi-Period-Daily Episode Balances","project":"Superalgos","id":"04b51302-957d-4365-ad55-9f89d60e261c","savedPayload":{"position":{"x":24374.76840845468,"y":18375.922352927064},"targetPosition":{"x":24696.86240363471,"y":18061.668541066385},"floatingObject":{"isPinned":false,"isFroLine 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":"Trading System","name":"Lightning Strike","config":"{ \n\"codeName\": \"Lightning Strike\"\n}","project":"Superalgos","tradingStrategies":[{"type":"Trading Strategy","name":"My Trading Strategy","project":"Superalgos","triggerStage":{"type":"Trigger Stage","project":"Superalgos","triggerOn":{"type":"Trigger On Event","project":"Superalgos","situations":[{"type":"Situation","name":"Inmediate Trigger On","project":"Superalgos","conditions":[{"type":"Condition","name":"New Condition","project":"Superalgos","javascriptCode":{"type":"Javascript Code","name":"New Javascript Code","code":"true","project":"Superalgos","id":"e2ea7ded-2be1-43a3-a7fa-de3d9b8eeec4","savedPayload":{"position":{"x":30914.345537114667,"y":38604.01436324851},"targetPosition":{"x":31359.096259318965,"y":38830.60964671243},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"id":"e693623c-e11f-49e3-99da-1897c7a47563","savedPayload":{"position":{"x":31359.096259318965,"y":38830.60964671243},"targetPosition":{"x":31803.948096117412,"y":39057.27709300647},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}}],"id":"9135663f-deeb-4b3f-8855-91750810a406","savedPayload":{"position":{"x":31803.948096117412,"y":39057.27709300647},"targetPosition":{"x":32249.606420886405,"y":39284.23888962723},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}}],"announcements":[],"id":"05f2f6b7-15ab-4386-a299-91a949de634e","savedPayload":{"position":{"x":32249.606420886405,"y":39284.23888962723},"targetPosition":{"x":32695.222935590078,"y":39511.15601095159},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"triggerOff":{"type":"Trigger Off Event","project":"Superalgos","situations":[{"type":"Situation","name":"Never Trigger Off","project":"Superalgos","conditions":[{"type":"Condition","name":"Close Above MA","project":"Superalgos","javascriptCode":{"type":"Javascript Code","code":"false","project":"Superalgos","id":"0eb59e3b-ccc8-4eab-a1f2-a7c8dea28949","savedPayload":{"position":{"x":32077.836612408217,"y":37610.39742636277},"targetPosition":{"x":32232.059454816794,"y":38085.06041310742},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"id":"31ab47dd-fe2d-47ac-9a77-08ec8beee068","savedPayload":{"position":{"x":32232.059454816794,"y":38085.06041310742},"targetPosition":{"x":32386.31006690743,"y":38559.9136542021},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}}],"id":"fa93a965-e836-42b3-9784-79acda1468dd","savedPayload":{"position":{"x":32386.31006690743,"y":38559.9136542021},"targetPosition":{"x":32540.740280232243,"y":39035.59720645897},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}}],"announcements":[],"id":"8a46ebed-4ed4-4b70-882b-416ffa1b37f6","savedPayload":{"position":{"x":32540.740280232243,"y":39035.59720645897},"targetPosition":{"x":32695.222935590078,"y":39511.15601095159},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"takePosition":{"type":"Take Position Event","project":"Superalgos","situations":[{"type":"Situation","name":"Inmediate Take Position","project":"Superalgos","conditions":[{"type":"Condition","name":"New Condition","project":"Superalgos","javascriptCode":{"type":"Javascript Code","name":"New Javascript Code","code":"true","project":"Superalgos","id":"90dda64b-17fd-469c-8066-3855596795ab","savedPayload":{"position":{"x":33610.303575265214,"y":37702.976973794255},"targetPosition":{"x":33383.88254713001,"y":38147.76160391372},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"id":"4054a522-7863-4ac2-9eab-26db2a6f037f","savedPayload":{"position":{"x":33383.88254713001,"y":38147.76160391372},"targetPosition":{"x":33148.83631252263,"y":38619.95922965271},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}}],"id":"0b8d71ab-6430-4e3f-840a-162745ab8d22","savedPayload":{"position":{"x":33148.83631252263,"y":38619.95922965271},"targetPosition":{"x":32922.00489673196,"y":39065.5515863614},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":falsLine truncated
|
||||
{"type":"Trading System","name":"Lightning Strike","config":"{ \n\"codeName\": \"Lightning Strike\"\n}","project":"Superalgos","tradingStrategies":[{"type":"Trading Strategy","name":"My Trading Strategy","project":"Superalgos","triggerStage":{"type":"Trigger Stage","project":"Superalgos","triggerOn":{"type":"Trigger On Event","project":"Superalgos","situations":[{"type":"Situation","name":"Inmediate Trigger On","project":"Superalgos","conditions":[{"type":"Condition","name":"New Condition","project":"Superalgos","javascriptCode":{"type":"Javascript Code","name":"New Javascript Code","code":"true","project":"Superalgos","id":"e2ea7ded-2be1-43a3-a7fa-de3d9b8eeec4","savedPayload":{"position":{"x":30914.345537114667,"y":38604.01436324851},"targetPosition":{"x":31359.096259318965,"y":38830.60964671243},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"id":"e693623c-e11f-49e3-99da-1897c7a47563","savedPayload":{"position":{"x":31359.096259318965,"y":38830.60964671243},"targetPosition":{"x":31803.948096117412,"y":39057.27709300647},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}}],"id":"9135663f-deeb-4b3f-8855-91750810a406","savedPayload":{"position":{"x":31803.948096117412,"y":39057.27709300647},"targetPosition":{"x":32249.606420886405,"y":39284.23888962723},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}}],"announcements":[],"id":"05f2f6b7-15ab-4386-a299-91a949de634e","savedPayload":{"position":{"x":32249.606420886405,"y":39284.23888962723},"targetPosition":{"x":32695.222935590078,"y":39511.15601095159},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"triggerOff":{"type":"Trigger Off Event","project":"Superalgos","situations":[{"type":"Situation","name":"Never Trigger Off","project":"Superalgos","conditions":[{"type":"Condition","name":"Close Above MA","project":"Superalgos","javascriptCode":{"type":"Javascript Code","code":"false","project":"Superalgos","id":"0eb59e3b-ccc8-4eab-a1f2-a7c8dea28949","savedPayload":{"position":{"x":32077.836612408217,"y":37610.39742636277},"targetPosition":{"x":32232.059454816794,"y":38085.06041310742},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"id":"31ab47dd-fe2d-47ac-9a77-08ec8beee068","savedPayload":{"position":{"x":32232.059454816794,"y":38085.06041310742},"targetPosition":{"x":32386.31006690743,"y":38559.9136542021},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}}],"id":"fa93a965-e836-42b3-9784-79acda1468dd","savedPayload":{"position":{"x":32386.31006690743,"y":38559.9136542021},"targetPosition":{"x":32540.740280232243,"y":39035.59720645897},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}}],"announcements":[],"id":"8a46ebed-4ed4-4b70-882b-416ffa1b37f6","savedPayload":{"position":{"x":32540.740280232243,"y":39035.59720645897},"targetPosition":{"x":32695.222935590078,"y":39511.15601095159},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"takePosition":{"type":"Take Position Event","project":"Superalgos","situations":[{"type":"Situation","name":"Inmediate Take Position","project":"Superalgos","conditions":[{"type":"Condition","name":"New Condition","project":"Superalgos","javascriptCode":{"type":"Javascript Code","name":"New Javascript Code","code":"true","project":"Superalgos","id":"90dda64b-17fd-469c-8066-3855596795ab","savedPayload":{"position":{"x":33610.303575265214,"y":37702.976973794255},"targetPosition":{"x":33383.88254713001,"y":38147.76160391372},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"id":"4054a522-7863-4ac2-9eab-26db2a6f037f","savedPayload":{"position":{"x":33383.88254713001,"y":38147.76160391372},"targetPosition":{"x":33148.83631252263,"y":38619.95922965271},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}}],"id":"0b8d71ab-6430-4e3f-840a-162745ab8d22","savedPayload":{"position":{"x":33148.83631252263,"y":38619.95922965271},"targetPosition":{"x":32922.00489673196,"y":39065.5515863614},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":falsLine truncated
|
||||
@@ -1 +1 @@
|
||||
{"type":"Trading System","name":"WHB v2","config":"{ \n\"codeName\": \"Sparta-WHB-BTC-USDT\"\n}","project":"Superalgos","tradingStrategies":[{"type":"Trading Strategy","name":"Steep","project":"Superalgos","triggerStage":{"type":"Trigger Stage","project":"Superalgos","triggerOn":{"type":"Trigger On Event","project":"Superalgos","situations":[{"type":"Situation","name":"Steep","project":"Superalgos","conditions":[{"type":"Condition","name":"3 Closes Below MA","project":"Superalgos","javascriptCode":{"type":"Javascript Code","code":"chart.at01hs.candle.close < chart.at01hs.bollingerBand.movingAverage && \nchart.at01hs.candle.previous.close < chart.at01hs.bollingerBand.previous.movingAverage && \nchart.at01hs.candle.previous.previous.close < chart.at01hs.bollingerBand.previous.previous.movingAverage","project":"Superalgos","id":"123b1af6-9639-4b6d-a4c3-7a8a9287169c","savedPayload":{"position":{"x":31075.323254310468,"y":29934.630604067414},"targetPosition":{"x":31240.97284151726,"y":29966.829622037207},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":2,"arrangementStyle":0},"uiObject":{}}},"id":"427da1e1-cc4a-4c78-88f6-c254d87cc88f","savedPayload":{"position":{"x":31240.97284151726,"y":29966.829622037207},"targetPosition":{"x":31572.27201593085,"y":30031.22765797679},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Condition","name":"Breakdown","project":"Superalgos","javascriptCode":{"type":"Javascript Code","code":"chart.at01hs.candle.close < chart.at01hs.bollingerBand.movingAverage - chart.at01hs.bollingerBand.deviation","project":"Superalgos","id":"1b9e755e-eefe-4b0d-addd-1e19b6a597b6","savedPayload":{"position":{"x":31138.331069950404,"y":29770.489632553574},"targetPosition":{"x":31282.978051943886,"y":29857.402307694647},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":2,"arrangementStyle":0},"uiObject":{}}},"id":"55bf7721-7fb2-42f0-8a3c-c2b97e278a29","savedPayload":{"position":{"x":31282.978051943886,"y":29857.402307694647},"targetPosition":{"x":31572.27201593085,"y":30031.22765797679},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Condition","name":"2H Down","project":"Superalgos","javascriptCode":{"type":"Javascript Code","code":"chart.at02hs.bollingerChannel.direction === \"Down\"","project":"Superalgos","id":"e8db5fac-2f00-47fe-ac57-dc93ad15f2b5","savedPayload":{"position":{"x":31253.678567961866,"y":29637.797514989197},"targetPosition":{"x":31359.876383951527,"y":29768.940895985063},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":2,"arrangementStyle":0},"uiObject":{}}},"id":"11e00b31-e7eb-4fe9-b006-dcd640dbbd3b","savedPayload":{"position":{"x":31359.876383951527,"y":29768.940895985063},"targetPosition":{"x":31572.27201593085,"y":30031.22765797679},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Condition","name":"Deviation > 200","project":"Superalgos","javascriptCode":{"type":"Javascript Code","code":"chart.at01hs.bollingerBand.deviation > 200","project":"Superalgos","id":"7671ca91-4b4c-40c5-b0c2-199169b013e8","savedPayload":{"position":{"x":31407.45313773691,"y":29552.558879079636},"targetPosition":{"x":31462.392763801556,"y":29712.11513871202},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":2,"arrangementStyle":0},"uiObject":{}}},"id":"dd938286-61b3-41e4-bfbb-db34971ffa47","savedPayload":{"position":{"x":31462.392763801556,"y":29712.11513871202},"targetPosition":{"x":31572.27201593085,"y":30031.22765797679},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Condition","name":"Candle Size < 750","project":"Superalgos","javascriptCode":{"type":"Javascript Code","code":"chart.at01hs.candle.max - chart.at01hs.candle.min < 750","project":"Superalgos","id":"19b7edeb-b180-429f-9adf-61bf47262033","savedPayload":{"position":{"x":31581.107296689723,"y":29525.054762303866},"targetPosition":{"x":31578.16220310343,"y":29693.779060861507},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":2,"arrangementStyle":0},"uiObject":{}}},"id":"8f94ab97-1574-4136-9404-b66dfc1e3b9f","savedPayload":{"position":{"x":31578.16220310343,"y":29693.779060861507},"targetPosition":{"x":31572.27201593085,"y":30031.22765797679},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrLine truncated
|
||||
{"type":"Trading System","name":"WHB v2","config":"{ \n\"codeName\": \"Sparta-WHB-BTC-USDT\"\n}","project":"Superalgos","tradingStrategies":[{"type":"Trading Strategy","name":"Steep","project":"Superalgos","triggerStage":{"type":"Trigger Stage","project":"Superalgos","triggerOn":{"type":"Trigger On Event","project":"Superalgos","situations":[{"type":"Situation","name":"Steep","project":"Superalgos","conditions":[{"type":"Condition","name":"3 Closes Below MA","project":"Superalgos","javascriptCode":{"type":"Javascript Code","code":"chart.at01hs.candle.close < chart.at01hs.bollingerBand.movingAverage && \nchart.at01hs.candle.previous.close < chart.at01hs.bollingerBand.previous.movingAverage && \nchart.at01hs.candle.previous.previous.close < chart.at01hs.bollingerBand.previous.previous.movingAverage","project":"Superalgos","id":"123b1af6-9639-4b6d-a4c3-7a8a9287169c","savedPayload":{"position":{"x":31075.323254310468,"y":29934.630604067414},"targetPosition":{"x":31240.97284151726,"y":29966.829622037207},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":2,"arrangementStyle":0},"uiObject":{}}},"id":"427da1e1-cc4a-4c78-88f6-c254d87cc88f","savedPayload":{"position":{"x":31240.97284151726,"y":29966.829622037207},"targetPosition":{"x":31572.27201593085,"y":30031.22765797679},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Condition","name":"Breakdown","project":"Superalgos","javascriptCode":{"type":"Javascript Code","code":"chart.at01hs.candle.close < chart.at01hs.bollingerBand.movingAverage - chart.at01hs.bollingerBand.deviation","project":"Superalgos","id":"1b9e755e-eefe-4b0d-addd-1e19b6a597b6","savedPayload":{"position":{"x":31138.331069950404,"y":29770.489632553574},"targetPosition":{"x":31282.978051943886,"y":29857.402307694647},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":2,"arrangementStyle":0},"uiObject":{}}},"id":"55bf7721-7fb2-42f0-8a3c-c2b97e278a29","savedPayload":{"position":{"x":31282.978051943886,"y":29857.402307694647},"targetPosition":{"x":31572.27201593085,"y":30031.22765797679},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Condition","name":"2H Down","project":"Superalgos","javascriptCode":{"type":"Javascript Code","code":"chart.at02hs.bollingerChannel.direction === \"Down\"","project":"Superalgos","id":"e8db5fac-2f00-47fe-ac57-dc93ad15f2b5","savedPayload":{"position":{"x":31253.678567961866,"y":29637.797514989197},"targetPosition":{"x":31359.876383951527,"y":29768.940895985063},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":2,"arrangementStyle":0},"uiObject":{}}},"id":"11e00b31-e7eb-4fe9-b006-dcd640dbbd3b","savedPayload":{"position":{"x":31359.876383951527,"y":29768.940895985063},"targetPosition":{"x":31572.27201593085,"y":30031.22765797679},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Condition","name":"Deviation > 200","project":"Superalgos","javascriptCode":{"type":"Javascript Code","code":"chart.at01hs.bollingerBand.deviation > 200","project":"Superalgos","id":"7671ca91-4b4c-40c5-b0c2-199169b013e8","savedPayload":{"position":{"x":31407.45313773691,"y":29552.558879079636},"targetPosition":{"x":31462.392763801556,"y":29712.11513871202},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":2,"arrangementStyle":0},"uiObject":{}}},"id":"dd938286-61b3-41e4-bfbb-db34971ffa47","savedPayload":{"position":{"x":31462.392763801556,"y":29712.11513871202},"targetPosition":{"x":31572.27201593085,"y":30031.22765797679},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Condition","name":"Candle Size < 750","project":"Superalgos","javascriptCode":{"type":"Javascript Code","code":"chart.at01hs.candle.max - chart.at01hs.candle.min < 750","project":"Superalgos","id":"19b7edeb-b180-429f-9adf-61bf47262033","savedPayload":{"position":{"x":31581.107296689723,"y":29525.054762303866},"targetPosition":{"x":31578.16220310343,"y":29693.779060861507},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":2,"arrangementStyle":0},"uiObject":{}}},"id":"8f94ab97-1574-4136-9404-b66dfc1e3b9f","savedPayload":{"position":{"x":31578.16220310343,"y":29693.779060861507},"targetPosition":{"x":31572.27201593085,"y":30031.22765797679},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrLine truncated
|
||||
@@ -1 +1 @@
|
||||
{"type":"Workspace","name":"BB Top Bounce","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":"Sparta","project":"Superalgos","taskManagers":[{"type":"Task Manager","name":"Sparta","project":"Superalgos","tasks":[{"type":"Task","name":"Simple Moving Average (SMA)","project":"Superalgos","bot":{"type":"Indicator Bot Instance","name":"Simple Moving Average (SMA)","config":"{}","project":"Superalgos","processes":[{"type":"Indicator Process Instance","name":"Simple Moving Average (SMA) Multi-Period-Market","project":"Superalgos","id":"64a0f312-b72e-494c-8802-70ebb6238c8b","savedPayload":{"position":{"x":24860.356993272086,"y":30929.11115747996},"targetPosition":{"x":24927.356993272086,"y":31018.11115747996},"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":"456269f6-9849-4d5f-9c8c-7cd7d1eef297"}}},{"type":"Indicator Process Instance","name":"Simple Moving Average (SMA) Multi-Period-Daily","project":"Superalgos","id":"7a44ff20-1251-4157-9741-a4c2881b179e","savedPayload":{"position":{"x":24962.356993272086,"y":31086.11115747996},"targetPosition":{"x":24927.356993272086,"y":31018.11115747996},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Multi-Period-Daily","id":"333ae5d7-7ec1-4f08-b206-91e3b4f2c99f"}}}],"id":"ef39e485-c27d-443b-aa74-b10b8f8d10ad","savedPayload":{"position":{"x":24927.356993272086,"y":31018.11115747996},"targetPosition":{"x":24963.356993272086,"y":31085.11115747996},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"id":"01a5f038-ab20-44fe-99b0-0d5d3c0d4bcb","savedPayload":{"position":{"x":24963.356993272086,"y":31085.11115747996},"targetPosition":{"x":24878.356993272086,"y":31053.11115747996},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Task","name":"Exponential Moving Average (EMA)","project":"Superalgos","bot":{"type":"Indicator Bot Instance","name":"Exponential Moving Average (EMA)","config":"{}","project":"Superalgos","processes":[{"type":"Indicator Process Instance","name":"Exponential Moving Average (EMA) Multi-Period-Market","project":"Superalgos","id":"c95597e5-5d5c-4dd7-9510-99874a022eac","savedPayload":{"position":{"x":24816.356993272086,"y":31085.11115747996},"targetPosition":{"x":24789.356993272086,"y":31068.11115747996},"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":"278c34a7-199d-400e-8a06-087149e3d391"}}},{"type":"Indicator Process Instance","name":"Exponential Moving Average (EMA) Multi-Period-Daily","project":"Superalgos","id":"e588dc58-d99c-4938-aaab-747d23408301","savedPayload":{"position":{"x":24833.356993272086,"y":31119.11115747996},"targetPosition":{"x":24789.356993272086,"y":31068.11115747996},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Multi-Period-Daily","id":"943ea24f-ee24-4eae-9b4b-e8a73122b1c2"}}}],"id":"44fefa5e-341a-43c7-8967-7545a6e229ad","savedPayload":{"position":{"x":24789.356993272086,"y":31068.11115747996},"targetPosition":{"x":24874.356993272086,"y":31135.11115747996},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"id":"1e55a456-ff9c-48bf-b9ea-01082495fcc9","savedPayload":{"position":{"x":24874.356993272086,"y":31135.11115747996},"targetPosition":{"x":24878.356993272086,"y":31053.11115747996},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Task"Line truncated
|
||||
{"type":"Workspace","name":"BB Top Bounce","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":"Sparta","project":"Superalgos","taskManagers":[{"type":"Task Manager","name":"Sparta","project":"Superalgos","tasks":[{"type":"Task","name":"Simple Moving Average (SMA)","project":"Superalgos","bot":{"type":"Indicator Bot Instance","name":"Simple Moving Average (SMA)","config":"{}","project":"Superalgos","processes":[{"type":"Indicator Process Instance","name":"Simple Moving Average (SMA) Multi-Period-Market","project":"Superalgos","id":"64a0f312-b72e-494c-8802-70ebb6238c8b","savedPayload":{"position":{"x":24860.356993272086,"y":30929.11115747996},"targetPosition":{"x":24927.356993272086,"y":31018.11115747996},"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":"456269f6-9849-4d5f-9c8c-7cd7d1eef297"}}},{"type":"Indicator Process Instance","name":"Simple Moving Average (SMA) Multi-Period-Daily","project":"Superalgos","id":"7a44ff20-1251-4157-9741-a4c2881b179e","savedPayload":{"position":{"x":24962.356993272086,"y":31086.11115747996},"targetPosition":{"x":24927.356993272086,"y":31018.11115747996},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Multi-Period-Daily","id":"333ae5d7-7ec1-4f08-b206-91e3b4f2c99f"}}}],"id":"ef39e485-c27d-443b-aa74-b10b8f8d10ad","savedPayload":{"position":{"x":24927.356993272086,"y":31018.11115747996},"targetPosition":{"x":24963.356993272086,"y":31085.11115747996},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"id":"01a5f038-ab20-44fe-99b0-0d5d3c0d4bcb","savedPayload":{"position":{"x":24963.356993272086,"y":31085.11115747996},"targetPosition":{"x":24878.356993272086,"y":31053.11115747996},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Task","name":"Exponential Moving Average (EMA)","project":"Superalgos","bot":{"type":"Indicator Bot Instance","name":"Exponential Moving Average (EMA)","config":"{}","project":"Superalgos","processes":[{"type":"Indicator Process Instance","name":"Exponential Moving Average (EMA) Multi-Period-Market","project":"Superalgos","id":"c95597e5-5d5c-4dd7-9510-99874a022eac","savedPayload":{"position":{"x":24816.356993272086,"y":31085.11115747996},"targetPosition":{"x":24789.356993272086,"y":31068.11115747996},"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":"278c34a7-199d-400e-8a06-087149e3d391"}}},{"type":"Indicator Process Instance","name":"Exponential Moving Average (EMA) Multi-Period-Daily","project":"Superalgos","id":"e588dc58-d99c-4938-aaab-747d23408301","savedPayload":{"position":{"x":24833.356993272086,"y":31119.11115747996},"targetPosition":{"x":24789.356993272086,"y":31068.11115747996},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Multi-Period-Daily","id":"943ea24f-ee24-4eae-9b4b-e8a73122b1c2"}}}],"id":"44fefa5e-341a-43c7-8967-7545a6e229ad","savedPayload":{"position":{"x":24789.356993272086,"y":31068.11115747996},"targetPosition":{"x":24874.356993272086,"y":31135.11115747996},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"id":"1e55a456-ff9c-48bf-b9ea-01082495fcc9","savedPayload":{"position":{"x":24874.356993272086,"y":31135.11115747996},"targetPosition":{"x":24878.356993272086,"y":31053.11115747996},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Task"Line truncated
|
||||
@@ -1 +1 @@
|
||||
{"type":"Workspace","name":"Exchange Keys Tests","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\": \"2017-01-01\"\n}","project":"Superalgos","processes":[{"type":"Sensor Process Instance","name":"Exchange Raw Data Historic-OHLCVs","project":"Superalgos","id":"f17f9567-af83-4292-a0dc-7c1c9dbf53b8","savedPayload":{"position":{"x":23148.696821492267,"y":29710.450985700143},"targetPosition":{"x":23448.696821492267,"y":29710.450985700143},"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":"9eaa4440-c8bc-4daa-b858-efa1845087de","savedPayload":{"position":{"x":23448.696821492267,"y":29710.450985700143},"targetPosition":{"x":23748.696821492267,"y":29710.450985700143},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"id":"97e5a05e-9463-41a4-8255-a9487df56496","savedPayload":{"position":{"x":23748.696821492267,"y":29710.450985700143},"targetPosition":{"x":24048.696821492267,"y":29710.450985700143},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Task","name":"Candles Volumes","project":"Superalgos","bot":{"type":"Indicator Bot Instance","name":"Candles Volumes","config":"{}","project":"Superalgos","processes":[{"type":"Indicator Process Instance","name":"Candles Volumes Multi-Period-Market","project":"Superalgos","id":"1ef6762d-a20c-46e0-8183-6aac6dd9073a","savedPayload":{"position":{"x":23364.625131645007,"y":29136.186916988216},"targetPosition":{"x":23624.43275278034,"y":29286.186916988216},"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":"7b44275e-9446-4807-b9c2-4ba1107a5295","savedPayload":{"position":{"x":23474.43275278034,"y":29026.379295852883},"targetPosition":{"x":23624.43275278034,"y":29286.186916988216},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Multi-Period-Daily","id":"980ceb1d-7be6-454f-90d9-01ba1fd4a65d"}}}],"id":"78c835ef-be5b-4e74-8b0c-610afbbef304","savedPayload":{"position":{"x":23624.43275278034,"y":29286.186916988216},"targetPosition":{"x":23836.564787136303,"y":29498.31895134418},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"id":"b4da2db7-fcae-4918-b38a-5e6966a9994b","savedPayload":{"position":{"x":23836.564787136303,"y":29498.31895134418},"targetPosition":{"x":24048.696821492267,"y":29710.450985700143},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Task","name":"Bollinger Bands","project":"Superalgos","bot":{"type":"Indicator Bot Instance","name":"Bollinger Bands","config":"{}","project":"Superalgos","processes":[{"type":"Indicator Process Instance","name":"Bollinger Bands Multi-Period-Market","project":"Superalgos","id":"22a8694f-078e-4f1f-8470-7a7b25237397","savedPayload":{"position":{"x":23971.05110796151,"y":28820.673237813422},"targetPosition":{"x":24048.696821492267,"y":29110.450985700143},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"ProcLine truncated
|
||||
{"type":"Workspace","name":"Exchange Keys Tests","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\": \"2017-01-01\"\n}","project":"Superalgos","processes":[{"type":"Sensor Process Instance","name":"Exchange Raw Data Historic-OHLCVs","project":"Superalgos","id":"f17f9567-af83-4292-a0dc-7c1c9dbf53b8","savedPayload":{"position":{"x":23148.696821492267,"y":29710.450985700143},"targetPosition":{"x":23448.696821492267,"y":29710.450985700143},"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":"9eaa4440-c8bc-4daa-b858-efa1845087de","savedPayload":{"position":{"x":23448.696821492267,"y":29710.450985700143},"targetPosition":{"x":23748.696821492267,"y":29710.450985700143},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"id":"97e5a05e-9463-41a4-8255-a9487df56496","savedPayload":{"position":{"x":23748.696821492267,"y":29710.450985700143},"targetPosition":{"x":24048.696821492267,"y":29710.450985700143},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Task","name":"Candles Volumes","project":"Superalgos","bot":{"type":"Indicator Bot Instance","name":"Candles Volumes","config":"{}","project":"Superalgos","processes":[{"type":"Indicator Process Instance","name":"Candles Volumes Multi-Period-Market","project":"Superalgos","id":"1ef6762d-a20c-46e0-8183-6aac6dd9073a","savedPayload":{"position":{"x":23364.625131645007,"y":29136.186916988216},"targetPosition":{"x":23624.43275278034,"y":29286.186916988216},"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":"7b44275e-9446-4807-b9c2-4ba1107a5295","savedPayload":{"position":{"x":23474.43275278034,"y":29026.379295852883},"targetPosition":{"x":23624.43275278034,"y":29286.186916988216},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Multi-Period-Daily","id":"980ceb1d-7be6-454f-90d9-01ba1fd4a65d"}}}],"id":"78c835ef-be5b-4e74-8b0c-610afbbef304","savedPayload":{"position":{"x":23624.43275278034,"y":29286.186916988216},"targetPosition":{"x":23836.564787136303,"y":29498.31895134418},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"id":"b4da2db7-fcae-4918-b38a-5e6966a9994b","savedPayload":{"position":{"x":23836.564787136303,"y":29498.31895134418},"targetPosition":{"x":24048.696821492267,"y":29710.450985700143},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Task","name":"Bollinger Bands","project":"Superalgos","bot":{"type":"Indicator Bot Instance","name":"Bollinger Bands","config":"{}","project":"Superalgos","processes":[{"type":"Indicator Process Instance","name":"Bollinger Bands Multi-Period-Market","project":"Superalgos","id":"22a8694f-078e-4f1f-8470-7a7b25237397","savedPayload":{"position":{"x":23971.05110796151,"y":28820.673237813422},"targetPosition":{"x":24048.696821492267,"y":29110.450985700143},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"ProcLine truncated
|
||||
@@ -1 +1 @@
|
||||
{"type":"Workspace","name":"Trading System Design Tutorials","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":"d0ff77d8-76de-4d50-840a-e50a55ad7d1b","savedPayload":{"position":{"x":23464.287287440642,"y":29377.997434862405},"targetPosition":{"x":23762.643856051123,"y":29409.355973842703},"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":"b4e33f51-f9ff-4ef3-a9b7-ccb904163cae","savedPayload":{"position":{"x":23762.643856051123,"y":29409.355973842703},"targetPosition":{"x":24061.000424661604,"y":29440.714512823},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"id":"23ae53f9-b478-4eb4-96e7-12d07d7ae4f0","savedPayload":{"position":{"x":24061.000424661604,"y":29440.714512823},"targetPosition":{"x":24359.356993272086,"y":29472.073051803298},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Task","name":"Candles Volumes","project":"Superalgos","bot":{"type":"Indicator Bot Instance","name":"Candles Volumes","config":"{}","project":"Superalgos","processes":[{"type":"Indicator Process Instance","name":"Candles Volumes Multi-Period-Market","project":"Superalgos","id":"dcf3d790-5362-4a95-b977-82d0cf0e07f1","savedPayload":{"position":{"x":23646.16814072914,"y":28934.397538066118},"targetPosition":{"x":23913.47009798565,"y":29070.59468798798},"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":"775fadbd-5b55-41b2-81ac-454f5e52dca6","savedPayload":{"position":{"x":23750.078387481142,"y":28818.993517604355},"targetPosition":{"x":23913.47009798565,"y":29070.59468798798},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Multi-Period-Daily","id":"980ceb1d-7be6-454f-90d9-01ba1fd4a65d"}}}],"id":"fc478301-77ac-4396-bd3b-915b4c681fa0","savedPayload":{"position":{"x":23913.47009798565,"y":29070.59468798798},"targetPosition":{"x":24136.413545628868,"y":29271.33386989564},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"id":"30054a4b-7c93-4a3a-a6db-2e0d38507b2e","savedPayload":{"position":{"x":24136.413545628868,"y":29271.33386989564},"targetPosition":{"x":24359.356993272086,"y":29472.073051803298},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Task","name":"Bollinger Bands","project":"Superalgos","bot":{"type":"Indicator Bot Instance","name":"Bollinger Bands","config":"{}","project":"Superalgos","processes":[{"type":"Indicator Process Instance","name":"Bollinger Bands Multi-Period-Market","project":"Superalgos","id":"bf0f739f-98b7-4c73-ae06-8d3fe83147ce","savedPayload":{"position":{"x":24098.412828859568,"y":28617.882534106506},"targetPosition":{"x":24234.60997878143,"y":28885.184491363016},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"PLine truncated
|
||||
{"type":"Workspace","name":"Trading System Design Tutorials","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":"d0ff77d8-76de-4d50-840a-e50a55ad7d1b","savedPayload":{"position":{"x":23464.287287440642,"y":29377.997434862405},"targetPosition":{"x":23762.643856051123,"y":29409.355973842703},"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":"b4e33f51-f9ff-4ef3-a9b7-ccb904163cae","savedPayload":{"position":{"x":23762.643856051123,"y":29409.355973842703},"targetPosition":{"x":24061.000424661604,"y":29440.714512823},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"id":"23ae53f9-b478-4eb4-96e7-12d07d7ae4f0","savedPayload":{"position":{"x":24061.000424661604,"y":29440.714512823},"targetPosition":{"x":24359.356993272086,"y":29472.073051803298},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Task","name":"Candles Volumes","project":"Superalgos","bot":{"type":"Indicator Bot Instance","name":"Candles Volumes","config":"{}","project":"Superalgos","processes":[{"type":"Indicator Process Instance","name":"Candles Volumes Multi-Period-Market","project":"Superalgos","id":"dcf3d790-5362-4a95-b977-82d0cf0e07f1","savedPayload":{"position":{"x":23646.16814072914,"y":28934.397538066118},"targetPosition":{"x":23913.47009798565,"y":29070.59468798798},"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":"775fadbd-5b55-41b2-81ac-454f5e52dca6","savedPayload":{"position":{"x":23750.078387481142,"y":28818.993517604355},"targetPosition":{"x":23913.47009798565,"y":29070.59468798798},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Multi-Period-Daily","id":"980ceb1d-7be6-454f-90d9-01ba1fd4a65d"}}}],"id":"fc478301-77ac-4396-bd3b-915b4c681fa0","savedPayload":{"position":{"x":23913.47009798565,"y":29070.59468798798},"targetPosition":{"x":24136.413545628868,"y":29271.33386989564},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"id":"30054a4b-7c93-4a3a-a6db-2e0d38507b2e","savedPayload":{"position":{"x":24136.413545628868,"y":29271.33386989564},"targetPosition":{"x":24359.356993272086,"y":29472.073051803298},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Task","name":"Bollinger Bands","project":"Superalgos","bot":{"type":"Indicator Bot Instance","name":"Bollinger Bands","config":"{}","project":"Superalgos","processes":[{"type":"Indicator Process Instance","name":"Bollinger Bands Multi-Period-Market","project":"Superalgos","id":"bf0f739f-98b7-4c73-ae06-8d3fe83147ce","savedPayload":{"position":{"x":24098.412828859568,"y":28617.882534106506},"targetPosition":{"x":24234.60997878143,"y":28885.184491363016},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"PLine truncated
|
||||
@@ -2989,9 +2989,9 @@
|
||||
"level": 0,
|
||||
"childrenNodesProperties": [
|
||||
{
|
||||
"name": "current",
|
||||
"name": "tradingCurrent",
|
||||
"type": "node",
|
||||
"childType": "Current",
|
||||
"childType": "Trading Current",
|
||||
"autoAdd": true
|
||||
},
|
||||
{
|
||||
@@ -3138,7 +3138,7 @@
|
||||
"addLeftIcons": true,
|
||||
"level": 3,
|
||||
"attachingRules": {
|
||||
"compatibleTypes": "->Current->"
|
||||
"compatibleTypes": "->Trading Current->"
|
||||
},
|
||||
"propertyNameAtParent": "episode",
|
||||
"childrenNodesProperties": [
|
||||
@@ -5715,7 +5715,7 @@
|
||||
"propertyNameAtParent": "hitFail"
|
||||
},
|
||||
{
|
||||
"type": "Current",
|
||||
"type": "Trading Current",
|
||||
"menuItems": [
|
||||
{
|
||||
"action": "Add Missing Children",
|
||||
@@ -5738,7 +5738,7 @@
|
||||
"attachingRules": {
|
||||
"compatibleTypes": "->Trading Engine->"
|
||||
},
|
||||
"propertyNameAtParent": "current",
|
||||
"propertyNameAtParent": "tradingCurrent",
|
||||
"childrenNodesProperties": [
|
||||
{
|
||||
"name": "episode",
|
||||
@@ -6536,7 +6536,7 @@
|
||||
"addLeftIcons": true,
|
||||
"level": 3,
|
||||
"attachingRules": {
|
||||
"compatibleTypes": "->Current->"
|
||||
"compatibleTypes": "->Trading Current->"
|
||||
},
|
||||
"propertyNameAtParent": "strategyTriggerStage",
|
||||
"childrenNodesProperties": [
|
||||
@@ -6600,7 +6600,7 @@
|
||||
"addLeftIcons": true,
|
||||
"level": 3,
|
||||
"attachingRules": {
|
||||
"compatibleTypes": "->Current->"
|
||||
"compatibleTypes": "->Trading Current->"
|
||||
},
|
||||
"propertyNameAtParent": "strategyManageStage",
|
||||
"childrenNodesProperties": [
|
||||
@@ -6664,7 +6664,7 @@
|
||||
"addLeftIcons": true,
|
||||
"level": 3,
|
||||
"attachingRules": {
|
||||
"compatibleTypes": "->Current->"
|
||||
"compatibleTypes": "->Trading Current->"
|
||||
},
|
||||
"propertyNameAtParent": "strategyOpenStage",
|
||||
"childrenNodesProperties": [
|
||||
@@ -6746,7 +6746,7 @@
|
||||
"addLeftIcons": true,
|
||||
"level": 3,
|
||||
"attachingRules": {
|
||||
"compatibleTypes": "->Current->"
|
||||
"compatibleTypes": "->Trading Current->"
|
||||
},
|
||||
"propertyNameAtParent": "strategyCloseStage",
|
||||
"childrenNodesProperties": [
|
||||
@@ -6828,7 +6828,7 @@
|
||||
"addLeftIcons": true,
|
||||
"level": 3,
|
||||
"attachingRules": {
|
||||
"compatibleTypes": "->Current->Last->"
|
||||
"compatibleTypes": "->Trading Current->Last->"
|
||||
},
|
||||
"propertyNameAtParent": "strategy",
|
||||
"childrenNodesProperties": [
|
||||
@@ -7956,7 +7956,7 @@
|
||||
"addLeftIcons": true,
|
||||
"level": 3,
|
||||
"attachingRules": {
|
||||
"compatibleTypes": "->Current->Last->"
|
||||
"compatibleTypes": "->Trading Current->Last->"
|
||||
},
|
||||
"propertyNameAtParent": "position",
|
||||
"childrenNodesProperties": [
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
},
|
||||
{
|
||||
"style": "Javascript",
|
||||
"text": "tradingEngine.current.episode.episodeBaseAsset.annualizedRateOfReturn.value = \n((( tradingEngine.current.episode.episodeBaseAsset.beginBalance.value +\ntradingEngine.current.episode.episodeBaseAsset.profitLoss.value ) / \ntradingEngine.current.episode.episodeBaseAsset.beginBalance.value) ^\n(365 / tradingEngine.current.episode.episodeStatistics.days.value)) - 1\n\ntradingEngine.current.episode.episodeQuotedAsset.annualizedRateOfReturn.value = \n((( tradingEngine.current.episode.episodeQuotedAsset.beginBalance.value +\ntradingEngine.current.episode.episodeQuotedAsset.profitLoss.value ) / \ntradingEngine.current.episode.episodeQuotedAsset.beginBalance.value) ^\n(365 / tradingEngine.current.episode.episodeStatistics.days.value)) - 1",
|
||||
"text": "tradingEngine.tradingCurrent.episode.episodeBaseAsset.annualizedRateOfReturn.value = \n((( tradingEngine.tradingCurrent.episode.episodeBaseAsset.beginBalance.value +\ntradingEngine.current.episode.episodeBaseAsset.profitLoss.value ) / \ntradingEngine.current.episode.episodeBaseAsset.beginBalance.value) ^\n(365 / tradingEngine.tradingCurrent.episode.episodeStatistics.days.value)) - 1\n\ntradingEngine.current.episode.episodeQuotedAsset.annualizedRateOfReturn.value = \n((( tradingEngine.tradingCurrent.episode.episodeQuotedAsset.beginBalance.value +\ntradingEngine.current.episode.episodeQuotedAsset.profitLoss.value ) / \ntradingEngine.current.episode.episodeQuotedAsset.beginBalance.value) ^\n(365 / tradingEngine.tradingCurrent.episode.episodeStatistics.days.value)) - 1",
|
||||
"updated": 1609925166406
|
||||
},
|
||||
{
|
||||
@@ -40,7 +40,7 @@
|
||||
},
|
||||
{
|
||||
"style": "Javascript",
|
||||
"text": "tradingEngine.current.episode.episodeBaseAsset.annualizedRateOfReturn.value = \nMath.pow(\n ( tradingEngine.current.episode.episodeBaseAsset.beginBalance.value +\n tradingEngine.current.episode.episodeBaseAsset.profitLoss.value ) / \n tradingEngine.current.episode.episodeBaseAsset.beginBalance.value\n , \n (365 / tradingEngine.current.episode.episodeStatistics.days.value)\n ) - 1\n\ntradingEngine.current.episode.episodeQuotedAsset.annualizedRateOfReturn.value = \nMath.pow(\n ( tradingEngine.current.episode.episodeQuotedAsset.beginBalance.value +\n tradingEngine.current.episode.episodeQuotedAsset.profitLoss.value ) / \n tradingEngine.current.episode.episodeQuotedAsset.beginBalance.value\n , \n (365 / tradingEngine.current.episode.episodeStatistics.days.value)\n ) - 1",
|
||||
"text": "tradingEngine.tradingCurrent.episode.episodeBaseAsset.annualizedRateOfReturn.value = \nMath.pow(\n ( tradingEngine.tradingCurrent.episode.episodeBaseAsset.beginBalance.value +\n tradingEngine.tradingCurrent.episode.episodeBaseAsset.profitLoss.value ) / \n tradingEngine.tradingCurrent.episode.episodeBaseAsset.beginBalance.value\n , \n (365 / tradingEngine.tradingCurrent.episode.episodeStatistics.days.value)\n ) - 1\n\ntradingEngine.current.episode.episodeQuotedAsset.annualizedRateOfReturn.value = \nMath.pow(\n ( tradingEngine.tradingCurrent.episode.episodeQuotedAsset.beginBalance.value +\n tradingEngine.tradingCurrent.episode.episodeQuotedAsset.profitLoss.value ) / \n tradingEngine.tradingCurrent.episode.episodeQuotedAsset.beginBalance.value\n , \n (365 / tradingEngine.tradingCurrent.episode.episodeStatistics.days.value)\n ) - 1",
|
||||
"updated": 1609925205928
|
||||
},
|
||||
{
|
||||
@@ -57,7 +57,7 @@
|
||||
},
|
||||
{
|
||||
"style": "Javascript",
|
||||
"text": "tradingEngine.current.episode.episodeStatistics.annualizedRateOfReturn.value =\nMath.pow(\n (\n tradingEngine.current.episode.episodeBaseAsset.beginBalance.value * \n tradingEngine.current.episode.beginRate.value +\n tradingEngine.current.episode.episodeQuotedAsset.beginBalance.value +\n tradingEngine.current.episode.episodeBaseAsset.profitLoss.value +\n tradingEngine.current.episode.episodeQuotedAsset.profitLoss.value\n ) / \n (\n tradingEngine.current.episode.episodeBaseAsset.beginBalance.value * \n tradingEngine.current.episode.beginRate.value +\n tradingEngine.current.episode.episodeQuotedAsset.beginBalance.value \n ) \n , \n (\n 365 / tradingEngine.current.episode.episodeStatistics.days.value\n ) \n ) - 1",
|
||||
"text": "tradingEngine.tradingCurrent.episode.episodeStatistics.annualizedRateOfReturn.value =\nMath.pow(\n (\n tradingEngine.tradingCurrent.episode.episodeBaseAsset.beginBalance.value * \n tradingEngine.tradingCurrent.episode.beginRate.value +\n tradingEngine.tradingCurrent.episode.episodeQuotedAsset.beginBalance.value +\n tradingEngine.tradingCurrent.episode.episodeBaseAsset.profitLoss.value +\n tradingEngine.tradingCurrent.episode.episodeQuotedAsset.profitLoss.value\n ) / \n (\n tradingEngine.tradingCurrent.episode.episodeBaseAsset.beginBalance.value * \n tradingEngine.tradingCurrent.episode.beginRate.value +\n tradingEngine.tradingCurrent.episode.episodeQuotedAsset.beginBalance.value \n ) \n , \n (\n 365 / tradingEngine.tradingCurrent.episode.episodeStatistics.days.value\n ) \n ) - 1",
|
||||
"updated": 1609925262959
|
||||
},
|
||||
{
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
},
|
||||
{
|
||||
"style": "Json",
|
||||
"text": "tradingEngine.current.position.entryTargetRate.value * 1.03"
|
||||
"text": "tradingEngine.tradingCurrent.position.entryTargetRate.value * 1.03"
|
||||
},
|
||||
{
|
||||
"style": "Note",
|
||||
@@ -59,7 +59,7 @@
|
||||
},
|
||||
{
|
||||
"style": "Javascript",
|
||||
"text": "if (chart.at01hs.bollingerBand.movingAverage * 0.98 > \ntradingEngine.current.position.stopLoss.value)\n{chart.at01hs.bollingerBand.movingAverage * 0.98}\nelse\n{tradingEngine.current.position.stopLoss.value}\n",
|
||||
"text": "if (chart.at01hs.bollingerBand.movingAverage * 0.98 > \ntradingEngine.current.position.stopLoss.value)\n{chart.at01hs.bollingerBand.movingAverage * 0.98}\nelse\n{tradingEngine.tradingCurrent.position.stopLoss.value}\n",
|
||||
"updated": 1609346601773
|
||||
},
|
||||
{
|
||||
@@ -82,7 +82,7 @@
|
||||
},
|
||||
{
|
||||
"style": "Javascript",
|
||||
"text": "function orderRate() {\nconst ORDER_STEP_NUMBER = 1 // Secuential step number, starting with 1 from the closest to the price.\nconst BUY_SELL_SIGN = -1 // 1 for buy orders, -1 for sell orders.\nconst STEP_SEPARATION = 0.15 // % of separation of stair steps between them.\nconst BASE_FACTOR = 0.2 // % above or below bollinger band without bias.\nconst BIAS_FACTOR = 0.3 // % to move the whole stair of orders up or down depending on the bias.\nconst BAND_RATE = chart.at01min.bollingerBand.lowerBand // Upper Bollinger Band for sell orders, and Lower for buy orders.\nlet inbalance = tradingEngine.current.episode.episodeBaseAsset.beginBalance.value - tradingEngine.current.episode.episodeBaseAsset.balance.value\nlet BIAS_SIGN\nif (inbalance === 0) {\nBIAS_SIGN = 0\n}\nif (inbalance < 0) {\nBIAS_SIGN = + 1\n}\nif (inbalance > 0) {\nBIAS_SIGN = - 1\n}\nlet rate = BAND_RATE + BUY_SELL_SIGN BAND_RATE (BASE_FACTOR + ORDER_STEP_NUMBER STEP_SEPARATION + BIAS_SIGN BIAS_FACTOR) / 100\nreturn rate\n}\norderRate()",
|
||||
"text": "function orderRate() {\nconst ORDER_STEP_NUMBER = 1 // Secuential step number, starting with 1 from the closest to the price.\nconst BUY_SELL_SIGN = -1 // 1 for buy orders, -1 for sell orders.\nconst STEP_SEPARATION = 0.15 // % of separation of stair steps between them.\nconst BASE_FACTOR = 0.2 // % above or below bollinger band without bias.\nconst BIAS_FACTOR = 0.3 // % to move the whole stair of orders up or down depending on the bias.\nconst BAND_RATE = chart.at01min.bollingerBand.lowerBand // Upper Bollinger Band for sell orders, and Lower for buy orders.\nlet inbalance = tradingEngine.tradingCurrent.episode.episodeBaseAsset.beginBalance.value - tradingEngine.tradingCurrent.episode.episodeBaseAsset.balance.value\nlet BIAS_SIGN\nif (inbalance === 0) {\nBIAS_SIGN = 0\n}\nif (inbalance < 0) {\nBIAS_SIGN = + 1\n}\nif (inbalance > 0) {\nBIAS_SIGN = - 1\n}\nlet rate = BAND_RATE + BUY_SELL_SIGN BAND_RATE (BASE_FACTOR + ORDER_STEP_NUMBER STEP_SEPARATION + BIAS_SIGN BIAS_FACTOR) / 100\nreturn rate\n}\norderRate()",
|
||||
"updated": 1609346807464
|
||||
}
|
||||
]
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
},
|
||||
{
|
||||
"style": "Javascript",
|
||||
"text": "tradingEngine.current.episode.episodeBaseAsset.profitLoss.value =\n tradingEngine.current.episode.episodeBaseAsset.balance.value -\n sessionParameters.sessionBaseAsset.config.initialBalance\n \ntradingEngine.current.episode.episodeQuotedAsset.profitLoss.value =\n tradingEngine.current.episode.episodeQuotedAsset.balance.value -\n sessionParameters.sessionQuotedAsset.config.initialBalance",
|
||||
"text": "tradingEngine.tradingCurrent.episode.episodeBaseAsset.profitLoss.value =\n tradingEngine.tradingCurrent.episode.episodeBaseAsset.balance.value -\n sessionParameters.sessionBaseAsset.config.initialBalance\n \ntradingEngine.current.episode.episodeQuotedAsset.profitLoss.value =\n tradingEngine.tradingCurrent.episode.episodeQuotedAsset.balance.value -\n sessionParameters.sessionQuotedAsset.config.initialBalance",
|
||||
"updated": 1609880593226
|
||||
},
|
||||
{
|
||||
@@ -45,7 +45,7 @@
|
||||
},
|
||||
{
|
||||
"style": "Javascript",
|
||||
"text": "tradingEngine.current.position.positionBaseAsset.profitLoss.value =\n tradingEngine.current.episode.episodeBaseAsset.balance.value -\n tradingEngine.current.position.positionBaseAsset.beginBalance\n \ntradingEngine.current.position.positionQuotedAsset.profitLoss.value =\n tradingEngine.current.episode.episodeQuotedAsset.balance.value -\n tradingEngine.current.position.positionQuotedAsset.beginBalance",
|
||||
"text": "tradingEngine.tradingCurrent.position.positionBaseAsset.profitLoss.value =\n tradingEngine.tradingCurrent.episode.episodeBaseAsset.balance.value -\n tradingEngine.tradingCurrent.position.positionBaseAsset.beginBalance\n \ntradingEngine.current.position.positionQuotedAsset.profitLoss.value =\n tradingEngine.tradingCurrent.episode.episodeQuotedAsset.balance.value -\n tradingEngine.tradingCurrent.position.positionQuotedAsset.beginBalance",
|
||||
"updated": 1609880668611
|
||||
},
|
||||
{
|
||||
@@ -66,7 +66,7 @@
|
||||
},
|
||||
{
|
||||
"style": "Javascript",
|
||||
"text": "tradingEngine.current.episode.episodeStatistics.profitLoss.value =\n tradingEngine.current.episode.episodeBaseAsset.profitLoss.value * \n tradingEngine.current.episode.candle.close.value +\n tradingEngine.current.episode.episodeQuotedAsset.profitLoss.value",
|
||||
"text": "tradingEngine.tradingCurrent.episode.episodeStatistics.profitLoss.value =\n tradingEngine.tradingCurrent.episode.episodeBaseAsset.profitLoss.value * \n tradingEngine.tradingCurrent.episode.candle.close.value +\n tradingEngine.tradingCurrent.episode.episodeQuotedAsset.profitLoss.value",
|
||||
"updated": 1609880717964
|
||||
},
|
||||
{
|
||||
@@ -75,7 +75,7 @@
|
||||
},
|
||||
{
|
||||
"style": "Javascript",
|
||||
"text": "tradingEngine.current.position.positionStatistics.profitLoss.value =\n tradingEngine.current.episode.episodeBaseAsset.profitLoss.value * \n tradingEngine.current.position.endRate.value +\n tradingEngine.current.episode.episodeQuotedAsset.profitLoss.value",
|
||||
"text": "tradingEngine.tradingCurrent.position.positionStatistics.profitLoss.value =\n tradingEngine.tradingCurrent.episode.episodeBaseAsset.profitLoss.value * \n tradingEngine.tradingCurrent.position.endRate.value +\n tradingEngine.tradingCurrent.episode.episodeQuotedAsset.profitLoss.value",
|
||||
"updated": 1609880790493
|
||||
},
|
||||
{
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
},
|
||||
{
|
||||
"style": "Javascript",
|
||||
"text": "tradingEngine.current.episode.episodeBaseAsset.ROI.value =\n tradingEngine.current.episode.episodeBaseAsset.profitLoss.value /\n tradingEngine.current.episode.episodeBaseAsset.beginBalance.value * 100 \n \ntradingEngine.current.episode.episodeQuotedAsset.ROI.value =\n tradingEngine.current.episode.episodeQuotedAsset.profitLoss.value /\n tradingEngine.current.episode.episodeQuotedAsset.beginBalance.value * 100",
|
||||
"text": "tradingEngine.tradingCurrent.episode.episodeBaseAsset.ROI.value =\n tradingEngine.tradingCurrent.episode.episodeBaseAsset.profitLoss.value /\n tradingEngine.tradingCurrent.episode.episodeBaseAsset.beginBalance.value * 100 \n \ntradingEngine.current.episode.episodeQuotedAsset.ROI.value =\n tradingEngine.tradingCurrent.episode.episodeQuotedAsset.profitLoss.value /\n tradingEngine.tradingCurrent.episode.episodeQuotedAsset.beginBalance.value * 100",
|
||||
"updated": 1611332768337
|
||||
},
|
||||
{
|
||||
@@ -53,7 +53,7 @@
|
||||
},
|
||||
{
|
||||
"style": "Javascript",
|
||||
"text": "tradingEngine.current.position.positionBaseAsset.ROI.value =\n tradingEngine.current.position.positionBaseAsset.profitLoss.value * 100 /\n tradingEngine.current.strategyOpenStage.stageBaseAsset.sizeFilled.value\n \ntradingEngine.current.position.positionQuotedAsset.ROI.value =\n tradingEngine.current.position.positionQuotedAsset.profitLoss.value * 100 /\n tradingEngine.current.strategyOpenStage.stageQuotedAsset.sizeFilled.value",
|
||||
"text": "tradingEngine.tradingCurrent.position.positionBaseAsset.ROI.value =\n tradingEngine.tradingCurrent.position.positionBaseAsset.profitLoss.value * 100 /\n tradingEngine.tradingCurrent.strategyOpenStage.stageBaseAsset.sizeFilled.value\n \ntradingEngine.current.position.positionQuotedAsset.ROI.value =\n tradingEngine.tradingCurrent.position.positionQuotedAsset.profitLoss.value * 100 /\n tradingEngine.tradingCurrent.strategyOpenStage.stageQuotedAsset.sizeFilled.value",
|
||||
"updated": 1611332799800
|
||||
},
|
||||
{
|
||||
@@ -71,7 +71,7 @@
|
||||
},
|
||||
{
|
||||
"style": "Javascript",
|
||||
"text": "tradingEngine.current.episode.episodeStatistics.ROI.value =\n (\n tradingEngine.current.episode.episodeBaseAsset.profitLoss.value * \n tradingEngine.current.episode.endRate.value +\n tradingEngine.current.episode.episodeQuotedAsset.profitLoss.value\n ) / (\n tradingEngine.current.episode.episodeBaseAsset.beginBalance.value * \n tradingEngine.current.episode.beginRate.value +\n tradingEngine.current.episode.episodeQuotedAsset.beginBalance.value\n ) * 100",
|
||||
"text": "tradingEngine.tradingCurrent.episode.episodeStatistics.ROI.value =\n (\n tradingEngine.tradingCurrent.episode.episodeBaseAsset.profitLoss.value * \n tradingEngine.tradingCurrent.episode.endRate.value +\n tradingEngine.tradingCurrent.episode.episodeQuotedAsset.profitLoss.value\n ) / (\n tradingEngine.tradingCurrent.episode.episodeBaseAsset.beginBalance.value * \n tradingEngine.tradingCurrent.episode.beginRate.value +\n tradingEngine.tradingCurrent.episode.episodeQuotedAsset.beginBalance.value\n ) * 100",
|
||||
"updated": 1611332824026
|
||||
},
|
||||
{
|
||||
|
||||
@@ -49,7 +49,7 @@
|
||||
},
|
||||
{
|
||||
"style": "Text",
|
||||
"text": "For example, tradingEngine.current.position.entryTargetRate.value or tradingEngine.current.position.exitTargetRate.value."
|
||||
"text": "For example, tradingEngine.tradingCurrent.position.entryTargetRate.value or tradingEngine.tradingCurrent.position.exitTargetRate.value."
|
||||
},
|
||||
{
|
||||
"style": "Title",
|
||||
@@ -72,7 +72,7 @@
|
||||
},
|
||||
{
|
||||
"style": "Text",
|
||||
"text": "The horizontal segment marks the target rate defined at the open stage. If you are using market orders to take the position, then using tradingEngine.current.episode.candle.close.value may offer a good representation of the rate of market orders. If you are using limit orders, then you may decide at which rate you wish to take the position, and the horizontal segment of the triangle will match the chosen rate."
|
||||
"text": "The horizontal segment marks the target rate defined at the open stage. If you are using market orders to take the position, then using tradingEngine.tradingCurrent.episode.candle.close.value may offer a good representation of the rate of market orders. If you are using limit orders, then you may decide at which rate you wish to take the position, and the horizontal segment of the triangle will match the chosen rate."
|
||||
},
|
||||
{
|
||||
"style": "Text",
|
||||
@@ -105,7 +105,7 @@
|
||||
},
|
||||
{
|
||||
"style": "Text",
|
||||
"text": "The difference in rate between the moment in time the target is hit and the time the 1-hour candle closes may be significant. As a result, if the close stage target rate is defined as tradingEngine.current.episode.candle.close.value, the resulting simulation may show significant slippage, and diverge from what the trade would look like if running on the 1-minute time frame, like you would when trading live."
|
||||
"text": "The difference in rate between the moment in time the target is hit and the time the 1-hour candle closes may be significant. As a result, if the close stage target rate is defined as tradingEngine.tradingCurrent.episode.candle.close.value, the resulting simulation may show significant slippage, and diverge from what the trade would look like if running on the 1-minute time frame, like you would when trading live."
|
||||
},
|
||||
{
|
||||
"style": "Text",
|
||||
@@ -113,7 +113,7 @@
|
||||
},
|
||||
{
|
||||
"style": "Javascript",
|
||||
"text": "targetRate()\n\nfunction targetRate() {\n switch (tradingEngine.current.position.exitType.value) {\n case 'No Exit': {\n return tradingEngine.current.episode.candle.close.value\n break\n }\n case 'Take Profit': {\n return tradingEngine.current.position.takeProfit.finalValue.value\n break\n }\n case 'Stop Loss': {\n return tradingEngine.current.position.stopLoss.finalValue.value\n break\n }\n }\n}",
|
||||
"text": "targetRate()\n\nfunction targetRate() {\n switch (tradingEngine.tradingCurrent.position.exitType.value) {\n case 'No Exit': {\n return tradingEngine.tradingCurrent.episode.candle.close.value\n break\n }\n case 'Take Profit': {\n return tradingEngine.tradingCurrent.position.takeProfit.finalValue.value\n break\n }\n case 'Stop Loss': {\n return tradingEngine.tradingCurrent.position.stopLoss.finalValue.value\n break\n }\n }\n}",
|
||||
"updated": 1609596984516
|
||||
},
|
||||
{
|
||||
|
||||
@@ -50,7 +50,7 @@
|
||||
},
|
||||
{
|
||||
"style": "Text",
|
||||
"text": "tradingEngine.current.episode.episodeBaseAsset.balance.value"
|
||||
"text": "tradingEngine.tradingCurrent.episode.episodeBaseAsset.balance.value"
|
||||
},
|
||||
{
|
||||
"style": "Text",
|
||||
@@ -58,7 +58,7 @@
|
||||
},
|
||||
{
|
||||
"style": "Text",
|
||||
"text": "tradingEngine.current.episode.episodeQuotedAsset.balance.value"
|
||||
"text": "tradingEngine.tradingCurrent.episode.episodeQuotedAsset.balance.value"
|
||||
},
|
||||
{
|
||||
"style": "Text",
|
||||
@@ -66,7 +66,7 @@
|
||||
},
|
||||
{
|
||||
"style": "Text",
|
||||
"text": "tradingEngine.current.strategyOpenStage.stageBaseAsset.sizeFilled.value - tradingEngine.current.strategyOpenStage.stageBaseAsset.feesPaid.value"
|
||||
"text": "tradingEngine.tradingCurrent.strategyOpenStage.stageBaseAsset.sizeFilled.value - tradingEngine.tradingCurrent.strategyOpenStage.stageBaseAsset.feesPaid.value"
|
||||
},
|
||||
{
|
||||
"style": "Text",
|
||||
|
||||
@@ -75,7 +75,7 @@
|
||||
},
|
||||
{
|
||||
"style": "Javascript",
|
||||
"text": "targetRate()\n\nfunction targetRate() {\n switch (tradingEngine.current.position.exitType.value) {\n case 'No Exit': {\n return tradingEngine.current.episode.candle.close.value\n break\n }\n case 'Take Profit': {\n return tradingEngine.current.position.takeProfit.finalValue.value\n break\n }\n case 'Stop Loss': {\n return tradingEngine.current.position.stopLoss.finalValue.value\n break\n }\n }\n}",
|
||||
"text": "targetRate()\n\nfunction targetRate() {\n switch (tradingEngine.tradingCurrent.position.exitType.value) {\n case 'No Exit': {\n return tradingEngine.tradingCurrent.episode.candle.close.value\n break\n }\n case 'Take Profit': {\n return tradingEngine.tradingCurrent.position.takeProfit.finalValue.value\n break\n }\n case 'Stop Loss': {\n return tradingEngine.tradingCurrent.position.stopLoss.finalValue.value\n break\n }\n }\n}",
|
||||
"updated": 1611866140829
|
||||
},
|
||||
{
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"type": "Current",
|
||||
"type": "Trading Current",
|
||||
"definition": {
|
||||
"text": "The current object refers to the context in which instances of several other objects exist—like episode, strategy, position, strategy stages, and so on—in particular, the instances that are open at the time of evaluation, hence the adjective current."
|
||||
},
|
||||
+2
-2
@@ -36,7 +36,7 @@
|
||||
},
|
||||
{
|
||||
"style": "Javascript",
|
||||
"text": "(tradingEngine.current.episode.cycle.value === 'First')"
|
||||
"text": "(tradingEngine.tradingCurrent.episode.cycle.value === 'First')"
|
||||
},
|
||||
{
|
||||
"style": "List",
|
||||
@@ -78,7 +78,7 @@
|
||||
},
|
||||
{
|
||||
"style": "Javascript",
|
||||
"text": "(tradingEngine.current.episode.cycle.value === 'Second')"
|
||||
"text": "(tradingEngine.tradingCurrent.episode.cycle.value === 'Second')"
|
||||
},
|
||||
{
|
||||
"style": "List",
|
||||
|
||||
@@ -60,7 +60,7 @@
|
||||
},
|
||||
{
|
||||
"style": "Javascript",
|
||||
"text": "tradingEngineOrder.rate.value = tradingEngine.current.episode.candle.close.value",
|
||||
"text": "tradingEngineOrder.rate.value = tradingEngine.tradingCurrent.episode.candle.close.value",
|
||||
"updated": 1610220056132
|
||||
},
|
||||
{
|
||||
@@ -209,7 +209,7 @@
|
||||
},
|
||||
{
|
||||
"style": "Javascript",
|
||||
"text": "tradingEngine.current.episode.episodeQuotedAsset.balance.value -\ntradingEngineOrder.orderQuotedAsset.size.value => 0",
|
||||
"text": "tradingEngine.tradingCurrent.episode.episodeQuotedAsset.balance.value -\ntradingEngineOrder.orderQuotedAsset.size.value => 0",
|
||||
"updated": 1610220335526
|
||||
},
|
||||
{
|
||||
|
||||
+2
-2
@@ -270,7 +270,7 @@
|
||||
},
|
||||
{
|
||||
"style": "Javascript",
|
||||
"text": "tradingEngine.current.episode.candle.min.value <=\ntradingEngineOrder.actualRate.value",
|
||||
"text": "tradingEngine.tradingCurrent.episode.candle.min.value <=\ntradingEngineOrder.actualRate.value",
|
||||
"updated": 1610223130690
|
||||
},
|
||||
{
|
||||
@@ -279,7 +279,7 @@
|
||||
},
|
||||
{
|
||||
"style": "Javascript",
|
||||
"text": "tradingEngine.current.episode.candle.max.value >=\ntradingEngineOrder.actualRate.value",
|
||||
"text": "tradingEngine.tradingCurrent.episode.candle.max.value >=\ntradingEngineOrder.actualRate.value",
|
||||
"updated": 1610223149566
|
||||
},
|
||||
{
|
||||
|
||||
@@ -82,7 +82,7 @@
|
||||
},
|
||||
{
|
||||
"style": "Javascript",
|
||||
"text": "tradingEngine.current.episode.episodeBaseAsset.balance.value =\ntradingEngine.current.episode.episodeBaseAsset.balance.value +\npreviousBaseAssetSizeFilled",
|
||||
"text": "tradingEngine.tradingCurrent.episode.episodeBaseAsset.balance.value =\ntradingEngine.current.episode.episodeBaseAsset.balance.value +\npreviousBaseAssetSizeFilled",
|
||||
"updated": 1610224035951
|
||||
},
|
||||
{
|
||||
@@ -92,7 +92,7 @@
|
||||
},
|
||||
{
|
||||
"style": "Javascript",
|
||||
"text": "tradingEngine.current.episode.episodeBaseAsset.balance.value =\ntradingEngine.current.episode.episodeBaseAsset.balance.value -\ntradingEngineOrder.orderBaseAsset.sizeFilled.value",
|
||||
"text": "tradingEngine.tradingCurrent.episode.episodeBaseAsset.balance.value =\ntradingEngine.current.episode.episodeBaseAsset.balance.value -\ntradingEngineOrder.orderBaseAsset.sizeFilled.value",
|
||||
"updated": 1610224081072
|
||||
},
|
||||
{
|
||||
@@ -102,7 +102,7 @@
|
||||
},
|
||||
{
|
||||
"style": "Javascript",
|
||||
"text": "tradingEngine.current.episode.episodeQuotedAsset.balance.value =\ntradingEngine.current.episode.episodeQuotedAsset.balance.value -\npreviousQuotedAssetSizeFilled +\npreviousQuotedAssetFeesPaid",
|
||||
"text": "tradingEngine.tradingCurrent.episode.episodeQuotedAsset.balance.value =\ntradingEngine.current.episode.episodeQuotedAsset.balance.value -\npreviousQuotedAssetSizeFilled +\npreviousQuotedAssetFeesPaid",
|
||||
"updated": 1610224107848
|
||||
},
|
||||
{
|
||||
@@ -112,7 +112,7 @@
|
||||
},
|
||||
{
|
||||
"style": "Javascript",
|
||||
"text": "tradingEngine.current.episode.episodeQuotedAsset.balance.value =\ntradingEngine.current.episode.episodeQuotedAsset.balance.value +\ntradingEngineOrder.orderQuotedAsset.sizeFilled.value -\ntradingEngineOrder.orderQuotedAsset.feesPaid.value",
|
||||
"text": "tradingEngine.tradingCurrent.episode.episodeQuotedAsset.balance.value =\ntradingEngine.current.episode.episodeQuotedAsset.balance.value +\ntradingEngineOrder.orderQuotedAsset.sizeFilled.value -\ntradingEngineOrder.orderQuotedAsset.feesPaid.value",
|
||||
"updated": 1610224148958
|
||||
},
|
||||
{
|
||||
@@ -126,7 +126,7 @@
|
||||
},
|
||||
{
|
||||
"style": "Javascript",
|
||||
"text": "tradingEngine.current.episode.episodeBaseAsset.balance.value =\ntradingEngine.current.episode.episodeBaseAsset.balance.value -\npreviousBaseAssetSizeFilled +\npreviousBaseAssetFeesPaid",
|
||||
"text": "tradingEngine.tradingCurrent.episode.episodeBaseAsset.balance.value =\ntradingEngine.current.episode.episodeBaseAsset.balance.value -\npreviousBaseAssetSizeFilled +\npreviousBaseAssetFeesPaid",
|
||||
"updated": 1610224182969
|
||||
},
|
||||
{
|
||||
@@ -136,7 +136,7 @@
|
||||
},
|
||||
{
|
||||
"style": "Javascript",
|
||||
"text": "tradingEngine.current.episode.episodeBaseAsset.balance.value =\ntradingEngine.current.episode.episodeBaseAsset.balance.value +\ntradingEngineOrder.orderBaseAsset.sizeFilled.value -\ntradingEngineOrder.orderBaseAsset.feesPaid.value",
|
||||
"text": "tradingEngine.tradingCurrent.episode.episodeBaseAsset.balance.value =\ntradingEngine.current.episode.episodeBaseAsset.balance.value +\ntradingEngineOrder.orderBaseAsset.sizeFilled.value -\ntradingEngineOrder.orderBaseAsset.feesPaid.value",
|
||||
"updated": 1610224202075
|
||||
},
|
||||
{
|
||||
@@ -146,7 +146,7 @@
|
||||
},
|
||||
{
|
||||
"style": "Javascript",
|
||||
"text": "tradingEngine.current.episode.episodeQuotedAsset.balance.value =\ntradingEngine.current.episode.episodeQuotedAsset.balance.value +\npreviousQuotedAssetSizeFilled",
|
||||
"text": "tradingEngine.tradingCurrent.episode.episodeQuotedAsset.balance.value =\ntradingEngine.current.episode.episodeQuotedAsset.balance.value +\npreviousQuotedAssetSizeFilled",
|
||||
"updated": 1610224219415
|
||||
},
|
||||
{
|
||||
@@ -156,7 +156,7 @@
|
||||
},
|
||||
{
|
||||
"style": "Javascript",
|
||||
"text": "tradingEngine.current.episode.episodeQuotedAsset.balance.value =\ntradingEngine.current.episode.episodeQuotedAsset.balance.value -\ntradingEngineOrder.orderQuotedAsset.sizeFilled.value",
|
||||
"text": "tradingEngine.tradingCurrent.episode.episodeQuotedAsset.balance.value =\ntradingEngine.current.episode.episodeQuotedAsset.balance.value -\ntradingEngineOrder.orderQuotedAsset.sizeFilled.value",
|
||||
"updated": 1610224237924
|
||||
},
|
||||
{
|
||||
|
||||
+4
-4
@@ -26,17 +26,17 @@
|
||||
},
|
||||
{
|
||||
"style": "Title",
|
||||
"text": "Current",
|
||||
"text": "Trading Current",
|
||||
"updated": 1611254496763
|
||||
},
|
||||
{
|
||||
"style": "Include",
|
||||
"text": "Superalgos->Node->Current->Definition",
|
||||
"text": "Superalgos->Node->Trading Current->Definition",
|
||||
"updated": 1611254540559
|
||||
},
|
||||
{
|
||||
"style": "Include",
|
||||
"text": "Superalgos->Node->Current->Content"
|
||||
"text": "Superalgos->Node->Trading Current->Content"
|
||||
},
|
||||
{
|
||||
"style": "Include",
|
||||
@@ -45,7 +45,7 @@
|
||||
},
|
||||
{
|
||||
"style": "Hierarchy",
|
||||
"text": "Superalgos->Current->2",
|
||||
"text": "Superalgos->Trading Current->2",
|
||||
"updated": 1611254736085
|
||||
},
|
||||
{
|
||||
|
||||
+3
-3
@@ -19,7 +19,7 @@
|
||||
},
|
||||
{
|
||||
"style": "Javascript",
|
||||
"text": "tradingEngine.current.strategyOpenStage.begin.value"
|
||||
"text": "tradingEngine.tradingCurrent.strategyOpenStage.begin.value"
|
||||
},
|
||||
{
|
||||
"style": "Text",
|
||||
@@ -28,7 +28,7 @@
|
||||
},
|
||||
{
|
||||
"style": "Javascript",
|
||||
"text": "tradingEngine.current.strategyOpenStage.stageQuotedAsset.targetSize.value"
|
||||
"text": "tradingEngine.tradingCurrent.strategyOpenStage.stageQuotedAsset.targetSize.value"
|
||||
},
|
||||
{
|
||||
"style": "Note",
|
||||
@@ -62,7 +62,7 @@
|
||||
},
|
||||
{
|
||||
"style": "Javascript",
|
||||
"text": "tradingEngine.current.position.entryTargetRate.value * 1.03",
|
||||
"text": "tradingEngine.tradingCurrent.position.entryTargetRate.value * 1.03",
|
||||
"updated": 1610216926922
|
||||
},
|
||||
{
|
||||
|
||||
+2
-2
@@ -50,7 +50,7 @@
|
||||
},
|
||||
{
|
||||
"style": "Javascript",
|
||||
"text": "\"The condition with the following code: \" + \ntradingSystem.tradingStrategies[tradingEngine.current.strategy.index.value].triggerStage.takePositionEvent.situations[0].conditions[0].code +\n\" triggered the take position event.\"",
|
||||
"text": "\"The condition with the following code: \" + \ntradingSystem.tradingStrategies[tradingEngine.tradingCurrent.strategy.index.value].triggerStage.takePositionEvent.situations[0].conditions[0].code +\n\" triggered the take position event.\"",
|
||||
"updated": 1610217276846
|
||||
},
|
||||
{
|
||||
@@ -60,7 +60,7 @@
|
||||
},
|
||||
{
|
||||
"style": "Javascript",
|
||||
"text": "[tradingEngine.current.strategy.index.value]"
|
||||
"text": "[tradingEngine.tradingCurrent.strategy.index.value]"
|
||||
},
|
||||
{
|
||||
"style": "Text",
|
||||
|
||||
+1
-1
@@ -16,7 +16,7 @@
|
||||
},
|
||||
{
|
||||
"style": "Text",
|
||||
"text": "The following string should end up in your clipboard:<br/>tradingEngine.current.episode.<br/>episodeBaseAsset.balance.value"
|
||||
"text": "The following string should end up in your clipboard:<br/>tradingEngine.tradingCurrent.episode.<br/>episodeBaseAsset.balance.value"
|
||||
},
|
||||
{
|
||||
"style": "Note",
|
||||
|
||||
+1
-1
@@ -22,7 +22,7 @@
|
||||
},
|
||||
{
|
||||
"style": "Javascript",
|
||||
"text": "tradingEngine.current.position.entryTargetRate.value * 1.03"
|
||||
"text": "tradingEngine.tradingCurrent.position.entryTargetRate.value * 1.03"
|
||||
},
|
||||
{
|
||||
"style": "Success",
|
||||
|
||||
+1
-1
@@ -17,7 +17,7 @@
|
||||
},
|
||||
{
|
||||
"style": "Javascript",
|
||||
"text": "tradingEngine.current.position.entryTargetRate.value * 0.9"
|
||||
"text": "tradingEngine.tradingCurrent.position.entryTargetRate.value * 0.9"
|
||||
},
|
||||
{
|
||||
"style": "Callout",
|
||||
|
||||
+1
-1
@@ -25,7 +25,7 @@
|
||||
},
|
||||
{
|
||||
"style": "Javascript",
|
||||
"text": "tradingEngine.current.strategyOpenStage.stageQuotedAsset.sizeFilled.value - \ntradingEngine.current.strategyOpenStage.stageQuotedAsset.feesPaid.value",
|
||||
"text": "tradingEngine.tradingCurrent.strategyOpenStage.stageQuotedAsset.sizeFilled.value - \ntradingEngine.current.strategyOpenStage.stageQuotedAsset.feesPaid.value",
|
||||
"updated": 1610473148011
|
||||
}
|
||||
]
|
||||
|
||||
+1
-1
@@ -5,7 +5,7 @@
|
||||
"definition": {
|
||||
"icon": {
|
||||
"project": "Superalgos",
|
||||
"name": "current"
|
||||
"name": "trading-current"
|
||||
},
|
||||
"text": "So, we turned on the Episode Counters and the Current Episode layers... let's take a look at the hierarchy..."
|
||||
},
|
||||
|
||||
+1
-1
@@ -21,7 +21,7 @@
|
||||
},
|
||||
{
|
||||
"style": "Text",
|
||||
"text": "tradingEngine.current.position.exitTargetRate.value"
|
||||
"text": "tradingEngine.tradingCurrent.position.exitTargetRate.value"
|
||||
},
|
||||
{
|
||||
"style": "Text",
|
||||
|
||||
+1
-1
@@ -17,7 +17,7 @@
|
||||
},
|
||||
{
|
||||
"style": "Text",
|
||||
"text": "tradingEngine.current.position.exitTargetRate.value"
|
||||
"text": "tradingEngine.tradingCurrent.position.exitTargetRate.value"
|
||||
},
|
||||
{
|
||||
"style": "Callout",
|
||||
|
||||
+1
-1
@@ -20,7 +20,7 @@
|
||||
},
|
||||
{
|
||||
"style": "List",
|
||||
"text": "Turn on the Current Position layer on the Trading Engine layers manager. I chose this layer because it corresponds to this section of the hierarchy... tradingEngine.current.position, remember ?",
|
||||
"text": "Turn on the Current Position layer on the Trading Engine layers manager. I chose this layer because it corresponds to this section of the hierarchy... tradingEngine.tradingCurrent.position, remember ?",
|
||||
"updated": 1610536718614
|
||||
},
|
||||
{
|
||||
|
||||
+21
-21
@@ -56,36 +56,36 @@ exports.newSuperalgosBotModulesLearningEngine = function (processIndex) {
|
||||
}
|
||||
|
||||
function setCurrentCandle(candle) {
|
||||
learningEngine.current.episode.candle.begin.value = candle.begin
|
||||
learningEngine.current.episode.candle.end.value = candle.end
|
||||
learningEngine.current.episode.candle.open.value = candle.open
|
||||
learningEngine.current.episode.candle.close.value = candle.close
|
||||
learningEngine.current.episode.candle.min.value = candle.min
|
||||
learningEngine.current.episode.candle.max.value = candle.max
|
||||
learningEngine.learningCurrent.episode.candle.begin.value = candle.begin
|
||||
learningEngine.learningCurrent.episode.candle.end.value = candle.end
|
||||
learningEngine.learningCurrent.episode.candle.open.value = candle.open
|
||||
learningEngine.learningCurrent.episode.candle.close.value = candle.close
|
||||
learningEngine.learningCurrent.episode.candle.min.value = candle.min
|
||||
learningEngine.learningCurrent.episode.candle.max.value = candle.max
|
||||
}
|
||||
|
||||
function setCurrentCycle(cycle) {
|
||||
learningEngine.current.episode.cycle.value = cycle
|
||||
learningEngine.current.episode.cycle.lastBegin.value = learningEngine.current.episode.cycle.begin.value
|
||||
learningEngine.current.episode.cycle.lastEnd.value = learningEngine.current.episode.cycle.end.value
|
||||
learningEngine.learningCurrent.episode.cycle.value = cycle
|
||||
learningEngine.learningCurrent.episode.cycle.lastBegin.value = learningEngine.learningCurrent.episode.cycle.begin.value
|
||||
learningEngine.learningCurrent.episode.cycle.lastEnd.value = learningEngine.learningCurrent.episode.cycle.end.value
|
||||
switch (cycle) {
|
||||
case 'First': {
|
||||
learningEngine.current.episode.cycle.begin.value =
|
||||
learningEngine.current.episode.candle.begin.value +
|
||||
learningEngine.learningCurrent.episode.cycle.begin.value =
|
||||
learningEngine.learningCurrent.episode.candle.begin.value +
|
||||
sessionParameters.timeFrame.config.value
|
||||
learningEngine.current.episode.cycle.end.value =
|
||||
learningEngine.current.episode.candle.begin.value +
|
||||
learningEngine.learningCurrent.episode.cycle.end.value =
|
||||
learningEngine.learningCurrent.episode.candle.begin.value +
|
||||
sessionParameters.timeFrame.config.value +
|
||||
sessionParameters.timeFrame.config.value / 2 - 1
|
||||
break
|
||||
}
|
||||
case 'Second': {
|
||||
learningEngine.current.episode.cycle.begin.value =
|
||||
learningEngine.current.episode.candle.begin.value +
|
||||
learningEngine.learningCurrent.episode.cycle.begin.value =
|
||||
learningEngine.learningCurrent.episode.candle.begin.value +
|
||||
sessionParameters.timeFrame.config.value +
|
||||
sessionParameters.timeFrame.config.value / 2
|
||||
learningEngine.current.episode.cycle.end.value =
|
||||
learningEngine.current.episode.candle.begin.value +
|
||||
learningEngine.learningCurrent.episode.cycle.end.value =
|
||||
learningEngine.learningCurrent.episode.candle.begin.value +
|
||||
sessionParameters.timeFrame.config.value +
|
||||
sessionParameters.timeFrame.config.value * 4 / 4 - 1
|
||||
break
|
||||
@@ -96,11 +96,11 @@ exports.newSuperalgosBotModulesLearningEngine = function (processIndex) {
|
||||
objects starting with lastBegin in zero to being saved on file. For that reason
|
||||
we will do this:
|
||||
*/
|
||||
if (learningEngine.current.episode.cycle.lastBegin.value === 0) {
|
||||
learningEngine.current.episode.cycle.lastBegin.value = learningEngine.current.episode.cycle.begin.value
|
||||
if (learningEngine.learningCurrent.episode.cycle.lastBegin.value === 0) {
|
||||
learningEngine.learningCurrent.episode.cycle.lastBegin.value = learningEngine.learningCurrent.episode.cycle.begin.value
|
||||
}
|
||||
if (learningEngine.current.episode.cycle.lastEnd.value === 0) {
|
||||
learningEngine.current.episode.cycle.lastEnd.value = learningEngine.current.episode.cycle.end.value
|
||||
if (learningEngine.learningCurrent.episode.cycle.lastEnd.value === 0) {
|
||||
learningEngine.learningCurrent.episode.cycle.lastEnd.value = learningEngine.learningCurrent.episode.cycle.end.value
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+109
-109
@@ -49,69 +49,69 @@ exports.newSuperalgosBotModulesLearningEpisode = function (processIndex) {
|
||||
must be opened there, since it might happen that it is looping at the end of the market
|
||||
or the task / session was restarted. We will only execute if the episode was never opened before.
|
||||
*/
|
||||
if (learningEngine.current.episode.begin.value !== learningEngine.current.episode.begin.config.initialValue) { return }
|
||||
if (learningEngine.learningCurrent.episode.begin.value !== learningEngine.learningCurrent.episode.begin.config.initialValue) { return }
|
||||
|
||||
/* Starting begin and end */
|
||||
learningEngine.current.episode.begin.value = learningEngine.current.episode.candle.begin.value
|
||||
learningEngine.current.episode.end.value = learningEngine.current.episode.candle.end.value
|
||||
learningEngine.learningCurrent.episode.begin.value = learningEngine.learningCurrent.episode.candle.begin.value
|
||||
learningEngine.learningCurrent.episode.end.value = learningEngine.learningCurrent.episode.candle.end.value
|
||||
|
||||
/* Getting the begin Balance from the session configuration */
|
||||
learningEngine.current.episode.episodeBaseAsset.beginBalance.value = sessionParameters.sessionBaseAsset.config.initialBalance
|
||||
learningEngine.current.episode.episodeQuotedAsset.beginBalance.value = sessionParameters.sessionQuotedAsset.config.initialBalance
|
||||
learningEngine.learningCurrent.episode.episodeBaseAsset.beginBalance.value = sessionParameters.sessionBaseAsset.config.initialBalance
|
||||
learningEngine.learningCurrent.episode.episodeQuotedAsset.beginBalance.value = sessionParameters.sessionQuotedAsset.config.initialBalance
|
||||
|
||||
/* The current balance is also the begin balance, that is how this starts. */
|
||||
learningEngine.current.episode.episodeBaseAsset.balance.value = sessionParameters.sessionBaseAsset.config.initialBalance
|
||||
learningEngine.current.episode.episodeQuotedAsset.balance.value = sessionParameters.sessionQuotedAsset.config.initialBalance
|
||||
learningEngine.learningCurrent.episode.episodeBaseAsset.balance.value = sessionParameters.sessionBaseAsset.config.initialBalance
|
||||
learningEngine.learningCurrent.episode.episodeQuotedAsset.balance.value = sessionParameters.sessionQuotedAsset.config.initialBalance
|
||||
|
||||
/* Recording the opening at the Learning Engine Data Structure */
|
||||
learningEngine.current.episode.status.value = 'Open'
|
||||
learningEngine.current.episode.serialNumber.value = 1
|
||||
learningEngine.current.episode.identifier.value = TS.projects.superalgos.utilities.miscellaneousFunctions.genereteUniqueId()
|
||||
learningEngine.current.episode.beginRate.value = learningEngine.current.episode.candle.close.value
|
||||
learningEngine.learningCurrent.episode.status.value = 'Open'
|
||||
learningEngine.learningCurrent.episode.serialNumber.value = 1
|
||||
learningEngine.learningCurrent.episode.identifier.value = TS.projects.superalgos.utilities.miscellaneousFunctions.genereteUniqueId()
|
||||
learningEngine.learningCurrent.episode.beginRate.value = learningEngine.learningCurrent.episode.candle.close.value
|
||||
}
|
||||
|
||||
function updateExitType(exitType) {
|
||||
learningEngine.current.episode.exitType.value = exitType
|
||||
learningEngine.learningCurrent.episode.exitType.value = exitType
|
||||
}
|
||||
|
||||
function closeEpisode() {
|
||||
learningEngine.current.episode.status.value = 'Closed'
|
||||
learningEngine.current.episode.end.value = learningEngine.current.episode.candle.end.value
|
||||
learningEngine.current.episode.endRate.value = learningEngine.current.episode.candle.close.value
|
||||
learningEngine.current.episode.episodeBaseAsset.endBalance.value = learningEngine.current.episode.episodeBaseAsset.balance.value
|
||||
learningEngine.current.episode.episodeQuotedAsset.endBalance.value = learningEngine.current.episode.episodeQuotedAsset.balance.value
|
||||
learningEngine.learningCurrent.episode.status.value = 'Closed'
|
||||
learningEngine.learningCurrent.episode.end.value = learningEngine.learningCurrent.episode.candle.end.value
|
||||
learningEngine.learningCurrent.episode.endRate.value = learningEngine.learningCurrent.episode.candle.close.value
|
||||
learningEngine.learningCurrent.episode.episodeBaseAsset.endBalance.value = learningEngine.learningCurrent.episode.episodeBaseAsset.balance.value
|
||||
learningEngine.learningCurrent.episode.episodeQuotedAsset.endBalance.value = learningEngine.learningCurrent.episode.episodeQuotedAsset.balance.value
|
||||
}
|
||||
|
||||
function resetEpisode() {
|
||||
TS.projects.superalgos.globals.processModuleObjects.MODULE_OBJECTS_BY_PROCESS_INDEX_MAP.get(processIndex).TRADING_ENGINE_MODULE_OBJECT.initializeNode(learningEngine.current.episode)
|
||||
TS.projects.superalgos.globals.processModuleObjects.MODULE_OBJECTS_BY_PROCESS_INDEX_MAP.get(processIndex).TRADING_ENGINE_MODULE_OBJECT.initializeNode(learningEngine.learningCurrent.episode)
|
||||
}
|
||||
|
||||
function updateEnds() {
|
||||
if (learningEngine.current.episode.status.value === 'Open') {
|
||||
learningEngine.current.episode.end.value = learningEngine.current.episode.end.value + sessionParameters.timeFrame.config.value
|
||||
learningEngine.current.episode.endRate.value = learningEngine.current.episode.candle.close.value
|
||||
learningEngine.current.episode.episodeBaseAsset.endBalance.value = learningEngine.current.episode.episodeBaseAsset.balance.value
|
||||
learningEngine.current.episode.episodeQuotedAsset.endBalance.value = learningEngine.current.episode.episodeQuotedAsset.balance.value
|
||||
if (learningEngine.learningCurrent.episode.status.value === 'Open') {
|
||||
learningEngine.learningCurrent.episode.end.value = learningEngine.learningCurrent.episode.end.value + sessionParameters.timeFrame.config.value
|
||||
learningEngine.learningCurrent.episode.endRate.value = learningEngine.learningCurrent.episode.candle.close.value
|
||||
learningEngine.learningCurrent.episode.episodeBaseAsset.endBalance.value = learningEngine.learningCurrent.episode.episodeBaseAsset.balance.value
|
||||
learningEngine.learningCurrent.episode.episodeQuotedAsset.endBalance.value = learningEngine.learningCurrent.episode.episodeQuotedAsset.balance.value
|
||||
}
|
||||
}
|
||||
|
||||
function resetLearningEngineDataStructure() {
|
||||
if (learningEngine.current.episode.status.value === 'Closed') {
|
||||
if (learningEngine.learningCurrent.episode.status.value === 'Closed') {
|
||||
resetEpisode()
|
||||
}
|
||||
}
|
||||
|
||||
function updateCounters() {
|
||||
if (learningEngine.current.episode.status.value === 'Open') {
|
||||
learningEngine.current.episode.episodeCounters.periods.value++
|
||||
if (learningEngine.learningCurrent.episode.status.value === 'Open') {
|
||||
learningEngine.learningCurrent.episode.episodeCounters.periods.value++
|
||||
}
|
||||
}
|
||||
|
||||
function updateStatistics() {
|
||||
|
||||
/* Daus Calculation */
|
||||
learningEngine.current.episode.episodeStatistics.days.value =
|
||||
learningEngine.current.episode.episodeCounters.periods.value *
|
||||
learningEngine.learningCurrent.episode.episodeStatistics.days.value =
|
||||
learningEngine.learningCurrent.episode.episodeCounters.periods.value *
|
||||
sessionParameters.timeFrame.config.value /
|
||||
TS.projects.superalgos.globals.timeConstants.ONE_DAY_IN_MILISECONDS
|
||||
}
|
||||
@@ -123,45 +123,45 @@ exports.newSuperalgosBotModulesLearningEpisode = function (processIndex) {
|
||||
|
||||
function calculateAssetsStatistics() {
|
||||
/* Updating Profit Loss */
|
||||
learningEngine.current.episode.episodeBaseAsset.profitLoss.value =
|
||||
learningEngine.current.episode.episodeBaseAsset.balance.value -
|
||||
learningEngine.learningCurrent.episode.episodeBaseAsset.profitLoss.value =
|
||||
learningEngine.learningCurrent.episode.episodeBaseAsset.balance.value -
|
||||
sessionParameters.sessionBaseAsset.config.initialBalance
|
||||
|
||||
learningEngine.current.episode.episodeQuotedAsset.profitLoss.value =
|
||||
learningEngine.current.episode.episodeQuotedAsset.balance.value -
|
||||
learningEngine.learningCurrent.episode.episodeQuotedAsset.profitLoss.value =
|
||||
learningEngine.learningCurrent.episode.episodeQuotedAsset.balance.value -
|
||||
sessionParameters.sessionQuotedAsset.config.initialBalance
|
||||
|
||||
learningEngine.current.episode.episodeBaseAsset.profitLoss.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(learningEngine.current.episode.episodeBaseAsset.profitLoss.value, 10)
|
||||
learningEngine.current.episode.episodeQuotedAsset.profitLoss.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(learningEngine.current.episode.episodeQuotedAsset.profitLoss.value, 10)
|
||||
learningEngine.learningCurrent.episode.episodeBaseAsset.profitLoss.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(learningEngine.learningCurrent.episode.episodeBaseAsset.profitLoss.value, 10)
|
||||
learningEngine.learningCurrent.episode.episodeQuotedAsset.profitLoss.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(learningEngine.learningCurrent.episode.episodeQuotedAsset.profitLoss.value, 10)
|
||||
|
||||
/*
|
||||
Updating ROI
|
||||
|
||||
https://www.investopedia.com/articles/basics/10/guide-to-calculating-roi.asp
|
||||
*/
|
||||
learningEngine.current.episode.episodeBaseAsset.ROI.value =
|
||||
learningEngine.current.episode.episodeBaseAsset.profitLoss.value /
|
||||
learningEngine.current.episode.episodeBaseAsset.beginBalance.value * 100
|
||||
learningEngine.learningCurrent.episode.episodeBaseAsset.ROI.value =
|
||||
learningEngine.learningCurrent.episode.episodeBaseAsset.profitLoss.value /
|
||||
learningEngine.learningCurrent.episode.episodeBaseAsset.beginBalance.value * 100
|
||||
|
||||
learningEngine.current.episode.episodeQuotedAsset.ROI.value =
|
||||
learningEngine.current.episode.episodeQuotedAsset.profitLoss.value /
|
||||
learningEngine.current.episode.episodeQuotedAsset.beginBalance.value * 100
|
||||
learningEngine.learningCurrent.episode.episodeQuotedAsset.ROI.value =
|
||||
learningEngine.learningCurrent.episode.episodeQuotedAsset.profitLoss.value /
|
||||
learningEngine.learningCurrent.episode.episodeQuotedAsset.beginBalance.value * 100
|
||||
|
||||
learningEngine.current.episode.episodeBaseAsset.ROI.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(learningEngine.current.episode.episodeBaseAsset.ROI.value, 10)
|
||||
learningEngine.current.episode.episodeQuotedAsset.ROI.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(learningEngine.current.episode.episodeQuotedAsset.ROI.value, 10)
|
||||
learningEngine.learningCurrent.episode.episodeBaseAsset.ROI.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(learningEngine.learningCurrent.episode.episodeBaseAsset.ROI.value, 10)
|
||||
learningEngine.learningCurrent.episode.episodeQuotedAsset.ROI.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(learningEngine.learningCurrent.episode.episodeQuotedAsset.ROI.value, 10)
|
||||
|
||||
/* Updating Hit Ratio */
|
||||
if (learningEngine.current.episode.episodeCounters.positions.value > 0) {
|
||||
learningEngine.current.episode.episodeBaseAsset.hitRatio.value =
|
||||
learningEngine.current.episode.episodeBaseAsset.hits.value /
|
||||
learningEngine.current.episode.episodeCounters.positions.value
|
||||
if (learningEngine.learningCurrent.episode.episodeCounters.positions.value > 0) {
|
||||
learningEngine.learningCurrent.episode.episodeBaseAsset.hitRatio.value =
|
||||
learningEngine.learningCurrent.episode.episodeBaseAsset.hits.value /
|
||||
learningEngine.learningCurrent.episode.episodeCounters.positions.value
|
||||
|
||||
learningEngine.current.episode.episodeQuotedAsset.hitRatio.value =
|
||||
learningEngine.current.episode.episodeQuotedAsset.hits.value /
|
||||
learningEngine.current.episode.episodeCounters.positions.value
|
||||
learningEngine.learningCurrent.episode.episodeQuotedAsset.hitRatio.value =
|
||||
learningEngine.learningCurrent.episode.episodeQuotedAsset.hits.value /
|
||||
learningEngine.learningCurrent.episode.episodeCounters.positions.value
|
||||
|
||||
learningEngine.current.episode.episodeBaseAsset.hitRatio.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(learningEngine.current.episode.episodeBaseAsset.hitRatio.value, 10)
|
||||
learningEngine.current.episode.episodeQuotedAsset.hitRatio.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(learningEngine.current.episode.episodeQuotedAsset.hitRatio.value, 10)
|
||||
learningEngine.learningCurrent.episode.episodeBaseAsset.hitRatio.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(learningEngine.learningCurrent.episode.episodeBaseAsset.hitRatio.value, 10)
|
||||
learningEngine.learningCurrent.episode.episodeQuotedAsset.hitRatio.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(learningEngine.learningCurrent.episode.episodeQuotedAsset.hitRatio.value, 10)
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -169,94 +169,94 @@ exports.newSuperalgosBotModulesLearningEpisode = function (processIndex) {
|
||||
|
||||
https://www.investopedia.com/terms/a/annualized-rate.asp
|
||||
*/
|
||||
learningEngine.current.episode.episodeBaseAsset.annualizedRateOfReturn.value =
|
||||
learningEngine.learningCurrent.episode.episodeBaseAsset.annualizedRateOfReturn.value =
|
||||
Math.pow(
|
||||
(
|
||||
learningEngine.current.episode.episodeBaseAsset.beginBalance.value +
|
||||
learningEngine.current.episode.episodeBaseAsset.profitLoss.value
|
||||
) / learningEngine.current.episode.episodeBaseAsset.beginBalance.value
|
||||
learningEngine.learningCurrent.episode.episodeBaseAsset.beginBalance.value +
|
||||
learningEngine.learningCurrent.episode.episodeBaseAsset.profitLoss.value
|
||||
) / learningEngine.learningCurrent.episode.episodeBaseAsset.beginBalance.value
|
||||
,
|
||||
(365 / learningEngine.current.episode.episodeStatistics.days.value)
|
||||
(365 / learningEngine.learningCurrent.episode.episodeStatistics.days.value)
|
||||
) - 1
|
||||
|
||||
learningEngine.current.episode.episodeQuotedAsset.annualizedRateOfReturn.value =
|
||||
learningEngine.learningCurrent.episode.episodeQuotedAsset.annualizedRateOfReturn.value =
|
||||
Math.pow(
|
||||
(
|
||||
learningEngine.current.episode.episodeQuotedAsset.beginBalance.value +
|
||||
learningEngine.current.episode.episodeQuotedAsset.profitLoss.value
|
||||
) / learningEngine.current.episode.episodeQuotedAsset.beginBalance.value
|
||||
learningEngine.learningCurrent.episode.episodeQuotedAsset.beginBalance.value +
|
||||
learningEngine.learningCurrent.episode.episodeQuotedAsset.profitLoss.value
|
||||
) / learningEngine.learningCurrent.episode.episodeQuotedAsset.beginBalance.value
|
||||
,
|
||||
(365 / learningEngine.current.episode.episodeStatistics.days.value)
|
||||
(365 / learningEngine.learningCurrent.episode.episodeStatistics.days.value)
|
||||
) - 1
|
||||
|
||||
learningEngine.current.episode.episodeBaseAsset.annualizedRateOfReturn.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(learningEngine.current.episode.episodeBaseAsset.annualizedRateOfReturn.value, 10)
|
||||
learningEngine.current.episode.episodeQuotedAsset.annualizedRateOfReturn.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(learningEngine.current.episode.episodeQuotedAsset.annualizedRateOfReturn.value, 10)
|
||||
learningEngine.learningCurrent.episode.episodeBaseAsset.annualizedRateOfReturn.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(learningEngine.learningCurrent.episode.episodeBaseAsset.annualizedRateOfReturn.value, 10)
|
||||
learningEngine.learningCurrent.episode.episodeQuotedAsset.annualizedRateOfReturn.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(learningEngine.learningCurrent.episode.episodeQuotedAsset.annualizedRateOfReturn.value, 10)
|
||||
|
||||
/* Updating Hit or Fail */
|
||||
if (learningEngine.current.episode.episodeBaseAsset.profitLoss.value > 0) {
|
||||
learningEngine.current.episode.episodeBaseAsset.hitFail.value = 'Hit'
|
||||
if (learningEngine.learningCurrent.episode.episodeBaseAsset.profitLoss.value > 0) {
|
||||
learningEngine.learningCurrent.episode.episodeBaseAsset.hitFail.value = 'Hit'
|
||||
} else {
|
||||
learningEngine.current.episode.episodeBaseAsset.hitFail.value = 'Fail'
|
||||
learningEngine.learningCurrent.episode.episodeBaseAsset.hitFail.value = 'Fail'
|
||||
}
|
||||
if (learningEngine.current.episode.episodeQuotedAsset.profitLoss.value > 0) {
|
||||
learningEngine.current.episode.episodeQuotedAsset.hitFail.value = 'Hit'
|
||||
if (learningEngine.learningCurrent.episode.episodeQuotedAsset.profitLoss.value > 0) {
|
||||
learningEngine.learningCurrent.episode.episodeQuotedAsset.hitFail.value = 'Hit'
|
||||
} else {
|
||||
learningEngine.current.episode.episodeQuotedAsset.hitFail.value = 'Fail'
|
||||
learningEngine.learningCurrent.episode.episodeQuotedAsset.hitFail.value = 'Fail'
|
||||
}
|
||||
}
|
||||
|
||||
function calculateEpisodeStatistics() {
|
||||
/* Updating Profit Loss */
|
||||
learningEngine.current.episode.episodeStatistics.profitLoss.value =
|
||||
learningEngine.current.episode.episodeBaseAsset.profitLoss.value * learningEngine.current.episode.candle.close.value +
|
||||
learningEngine.current.episode.episodeQuotedAsset.profitLoss.value
|
||||
learningEngine.learningCurrent.episode.episodeStatistics.profitLoss.value =
|
||||
learningEngine.learningCurrent.episode.episodeBaseAsset.profitLoss.value * learningEngine.learningCurrent.episode.candle.close.value +
|
||||
learningEngine.learningCurrent.episode.episodeQuotedAsset.profitLoss.value
|
||||
|
||||
learningEngine.current.episode.episodeStatistics.profitLoss.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(learningEngine.current.episode.episodeStatistics.profitLoss.value, 10)
|
||||
learningEngine.learningCurrent.episode.episodeStatistics.profitLoss.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(learningEngine.learningCurrent.episode.episodeStatistics.profitLoss.value, 10)
|
||||
|
||||
/*
|
||||
Updating ROI
|
||||
|
||||
https://www.investopedia.com/articles/basics/10/guide-to-calculating-roi.asp
|
||||
*/
|
||||
learningEngine.current.episode.episodeStatistics.ROI.value =
|
||||
learningEngine.learningCurrent.episode.episodeStatistics.ROI.value =
|
||||
(
|
||||
learningEngine.current.episode.episodeBaseAsset.profitLoss.value * learningEngine.current.episode.endRate.value +
|
||||
learningEngine.current.episode.episodeQuotedAsset.profitLoss.value
|
||||
learningEngine.learningCurrent.episode.episodeBaseAsset.profitLoss.value * learningEngine.learningCurrent.episode.endRate.value +
|
||||
learningEngine.learningCurrent.episode.episodeQuotedAsset.profitLoss.value
|
||||
) / (
|
||||
learningEngine.current.episode.episodeBaseAsset.beginBalance.value * learningEngine.current.episode.beginRate.value +
|
||||
learningEngine.current.episode.episodeQuotedAsset.beginBalance.value
|
||||
learningEngine.learningCurrent.episode.episodeBaseAsset.beginBalance.value * learningEngine.learningCurrent.episode.beginRate.value +
|
||||
learningEngine.learningCurrent.episode.episodeQuotedAsset.beginBalance.value
|
||||
) * 100
|
||||
|
||||
learningEngine.current.episode.episodeStatistics.ROI.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(learningEngine.current.episode.episodeStatistics.ROI.value, 10)
|
||||
learningEngine.learningCurrent.episode.episodeStatistics.ROI.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(learningEngine.learningCurrent.episode.episodeStatistics.ROI.value, 10)
|
||||
|
||||
/*
|
||||
Updating Annualized Rate Of Return
|
||||
|
||||
https://www.investopedia.com/terms/a/annualized-rate.asp
|
||||
*/
|
||||
learningEngine.current.episode.episodeStatistics.annualizedRateOfReturn.value =
|
||||
learningEngine.learningCurrent.episode.episodeStatistics.annualizedRateOfReturn.value =
|
||||
Math.pow(
|
||||
(
|
||||
learningEngine.current.episode.episodeBaseAsset.beginBalance.value * learningEngine.current.episode.beginRate.value +
|
||||
learningEngine.current.episode.episodeQuotedAsset.beginBalance.value +
|
||||
learningEngine.current.episode.episodeBaseAsset.profitLoss.value +
|
||||
learningEngine.current.episode.episodeQuotedAsset.profitLoss.value
|
||||
learningEngine.learningCurrent.episode.episodeBaseAsset.beginBalance.value * learningEngine.learningCurrent.episode.beginRate.value +
|
||||
learningEngine.learningCurrent.episode.episodeQuotedAsset.beginBalance.value +
|
||||
learningEngine.learningCurrent.episode.episodeBaseAsset.profitLoss.value +
|
||||
learningEngine.learningCurrent.episode.episodeQuotedAsset.profitLoss.value
|
||||
) /
|
||||
(
|
||||
learningEngine.current.episode.episodeBaseAsset.beginBalance.value * learningEngine.current.episode.beginRate.value +
|
||||
learningEngine.current.episode.episodeQuotedAsset.beginBalance.value
|
||||
learningEngine.learningCurrent.episode.episodeBaseAsset.beginBalance.value * learningEngine.learningCurrent.episode.beginRate.value +
|
||||
learningEngine.learningCurrent.episode.episodeQuotedAsset.beginBalance.value
|
||||
)
|
||||
,
|
||||
(365 / learningEngine.current.episode.episodeStatistics.days.value)
|
||||
(365 / learningEngine.learningCurrent.episode.episodeStatistics.days.value)
|
||||
) - 1
|
||||
|
||||
learningEngine.current.episode.episodeStatistics.annualizedRateOfReturn.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(learningEngine.current.episode.episodeStatistics.annualizedRateOfReturn.value, 10)
|
||||
learningEngine.learningCurrent.episode.episodeStatistics.annualizedRateOfReturn.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(learningEngine.learningCurrent.episode.episodeStatistics.annualizedRateOfReturn.value, 10)
|
||||
|
||||
/* Updating Hit or Fail */
|
||||
if (learningEngine.current.episode.episodeStatistics.profitLoss.value > 0) {
|
||||
learningEngine.current.episode.episodeStatistics.hitFail.value = 'Hit'
|
||||
if (learningEngine.learningCurrent.episode.episodeStatistics.profitLoss.value > 0) {
|
||||
learningEngine.learningCurrent.episode.episodeStatistics.hitFail.value = 'Hit'
|
||||
} else {
|
||||
learningEngine.current.episode.episodeStatistics.hitFail.value = 'Fail'
|
||||
learningEngine.learningCurrent.episode.episodeStatistics.hitFail.value = 'Fail'
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -264,57 +264,57 @@ exports.newSuperalgosBotModulesLearningEpisode = function (processIndex) {
|
||||
function updateDistanceToEventsCounters() {
|
||||
/* Keeping Distance Counters Up-to-date while avoinding counting before the first event happens. */
|
||||
if (
|
||||
learningEngine.current.episode.distanceToEvent.triggerOn.value > 0
|
||||
learningEngine.learningCurrent.episode.distanceToEvent.triggerOn.value > 0
|
||||
) {
|
||||
learningEngine.current.episode.distanceToEvent.triggerOn.value++
|
||||
learningEngine.learningCurrent.episode.distanceToEvent.triggerOn.value++
|
||||
}
|
||||
|
||||
if (
|
||||
learningEngine.current.episode.distanceToEvent.triggerOff.value > 0
|
||||
learningEngine.learningCurrent.episode.distanceToEvent.triggerOff.value > 0
|
||||
) {
|
||||
learningEngine.current.episode.distanceToEvent.triggerOff.value++
|
||||
learningEngine.learningCurrent.episode.distanceToEvent.triggerOff.value++
|
||||
}
|
||||
|
||||
if (
|
||||
learningEngine.current.episode.distanceToEvent.takePosition.value > 0
|
||||
learningEngine.learningCurrent.episode.distanceToEvent.takePosition.value > 0
|
||||
) {
|
||||
learningEngine.current.episode.distanceToEvent.takePosition.value++
|
||||
learningEngine.learningCurrent.episode.distanceToEvent.takePosition.value++
|
||||
}
|
||||
|
||||
if (
|
||||
learningEngine.current.episode.distanceToEvent.closePosition.value > 0
|
||||
learningEngine.learningCurrent.episode.distanceToEvent.closePosition.value > 0
|
||||
) {
|
||||
learningEngine.current.episode.distanceToEvent.closePosition.value++
|
||||
learningEngine.learningCurrent.episode.distanceToEvent.closePosition.value++
|
||||
}
|
||||
|
||||
if (
|
||||
learningEngine.current.episode.distanceToEvent.nextPhase.value > 0
|
||||
learningEngine.learningCurrent.episode.distanceToEvent.nextPhase.value > 0
|
||||
) {
|
||||
learningEngine.current.episode.distanceToEvent.nextPhase.value++
|
||||
learningEngine.learningCurrent.episode.distanceToEvent.nextPhase.value++
|
||||
}
|
||||
|
||||
if (
|
||||
learningEngine.current.episode.distanceToEvent.moveToPhase.value > 0
|
||||
learningEngine.learningCurrent.episode.distanceToEvent.moveToPhase.value > 0
|
||||
) {
|
||||
learningEngine.current.episode.distanceToEvent.moveToPhase.value++
|
||||
learningEngine.learningCurrent.episode.distanceToEvent.moveToPhase.value++
|
||||
}
|
||||
|
||||
if (
|
||||
learningEngine.current.episode.distanceToEvent.createOrder.value > 0
|
||||
learningEngine.learningCurrent.episode.distanceToEvent.createOrder.value > 0
|
||||
) {
|
||||
learningEngine.current.episode.distanceToEvent.createOrder.value++
|
||||
learningEngine.learningCurrent.episode.distanceToEvent.createOrder.value++
|
||||
}
|
||||
|
||||
if (
|
||||
learningEngine.current.episode.distanceToEvent.cancelOrder.value > 0
|
||||
learningEngine.learningCurrent.episode.distanceToEvent.cancelOrder.value > 0
|
||||
) {
|
||||
learningEngine.current.episode.distanceToEvent.cancelOrder.value++
|
||||
learningEngine.learningCurrent.episode.distanceToEvent.cancelOrder.value++
|
||||
}
|
||||
|
||||
if (
|
||||
learningEngine.current.episode.distanceToEvent.closeOrder.value > 0
|
||||
learningEngine.learningCurrent.episode.distanceToEvent.closeOrder.value > 0
|
||||
) {
|
||||
learningEngine.current.episode.distanceToEvent.closeOrder.value++
|
||||
learningEngine.learningCurrent.episode.distanceToEvent.closeOrder.value++
|
||||
}
|
||||
}
|
||||
}
|
||||
+4
-4
@@ -57,7 +57,7 @@
|
||||
This variable tell us which day we are standing at, specially while working
|
||||
with Daily Files. From this Date is that we are going to load the Daily Files.
|
||||
*/
|
||||
TS.projects.superalgos.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).SIMULATION_STATE.learningEngine.current.episode.processDate.value =
|
||||
TS.projects.superalgos.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).SIMULATION_STATE.learningEngine.learningCurrent.episode.processDate.value =
|
||||
TS.projects.superalgos.utilities.dateTimeFunctions.removeTime(TS.projects.superalgos.globals.processConstants.CONSTANTS_BY_PROCESS_INDEX_MAP.get(processIndex).SESSION_NODE.learningParameters.timeRange.config.initialDatetime).valueOf()
|
||||
}
|
||||
|
||||
@@ -70,7 +70,7 @@
|
||||
the simulation loop, once we discover that all candles from a certain date have benn processed.
|
||||
Here is the point where we sync one and the other.
|
||||
*/
|
||||
let learningProcessDate = TS.projects.superalgos.utilities.dateTimeFunctions.removeTime(TS.projects.superalgos.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).SIMULATION_STATE.learningEngine.current.episode.processDate.value)
|
||||
let learningProcessDate = TS.projects.superalgos.utilities.dateTimeFunctions.removeTime(TS.projects.superalgos.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).SIMULATION_STATE.learningEngine.learningCurrent.episode.processDate.value)
|
||||
|
||||
if (
|
||||
await TS.projects.superalgos.functionLibraries.dataDependenciesFunctions.processSingleFiles(
|
||||
@@ -151,7 +151,7 @@
|
||||
use it to save Output Files and later the Data Ranges. This is the point where
|
||||
the date calculated by the Simulation is applied at the Learning Process Level.
|
||||
*/
|
||||
learningProcessDate = TS.projects.superalgos.utilities.dateTimeFunctions.removeTime(TS.projects.superalgos.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).SIMULATION_STATE.learningEngine.current.episode.processDate.value)
|
||||
learningProcessDate = TS.projects.superalgos.utilities.dateTimeFunctions.removeTime(TS.projects.superalgos.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).SIMULATION_STATE.learningEngine.learningCurrent.episode.processDate.value)
|
||||
|
||||
if (checkStopTaskGracefully() === false) { break }
|
||||
if (checkStopProcessing() === false) { break }
|
||||
@@ -240,7 +240,7 @@
|
||||
indicators to be built and continue the processing once this process is called
|
||||
again.
|
||||
*/
|
||||
if (TS.projects.superalgos.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).SIMULATION_STATE.learningEngine.current.episode.headOfTheMarket.value === true) {
|
||||
if (TS.projects.superalgos.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).SIMULATION_STATE.learningEngine.learningCurrent.episode.headOfTheMarket.value === true) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
+4
-4
@@ -58,13 +58,13 @@ exports.newSuperalgosBotModulesLearningRecords = function (processIndex) {
|
||||
There are a few products configured to be saved only at an specific cycle.
|
||||
*/
|
||||
if (product.config.saveAtCycle !== undefined) {
|
||||
if (learningEngine.current.episode.cycle.value !== product.config.saveAtCycle) {
|
||||
if (learningEngine.learningCurrent.episode.cycle.value !== product.config.saveAtCycle) {
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
/* Clean the file from information of previous executions */
|
||||
//pruneOutputFile(product, outputDatasetArray, learningEngine.current.episode.candle.end.value)
|
||||
//pruneOutputFile(product, outputDatasetArray, learningEngine.learningCurrent.episode.candle.end.value)
|
||||
|
||||
/* Clean Open Records */
|
||||
if (product.config.saveAsObjects === true) {
|
||||
@@ -256,8 +256,8 @@ exports.newSuperalgosBotModulesLearningRecords = function (processIndex) {
|
||||
of the day? Easy: the end of the candle must be 1 millisecod before the next day. That happens at any
|
||||
time frame.
|
||||
*/
|
||||
let currentDay = new Date(learningEngine.current.episode.candle.end.value)
|
||||
let nextDay = new Date(learningEngine.current.episode.candle.end.value + 1)
|
||||
let currentDay = new Date(learningEngine.learningCurrent.episode.candle.end.value)
|
||||
let nextDay = new Date(learningEngine.learningCurrent.episode.candle.end.value + 1)
|
||||
if (currentDay.getUTCDate() !== nextDay.getUTCDate()) {
|
||||
/*
|
||||
We will save the object only if it is closed, becasuse we are at the last candle of the day.
|
||||
|
||||
+35
-35
@@ -55,7 +55,7 @@ exports.newSuperalgosBotModulesLearningSimulation = function (processIndex) {
|
||||
let dailyCandles = []
|
||||
for (let i = 0; i < candles.length; i++) {
|
||||
let candle = candles[i]
|
||||
if (candle.begin >= TS.projects.superalgos.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).SIMULATION_STATE.learningEngine.current.episode.processDate.value) {
|
||||
if (candle.begin >= TS.projects.superalgos.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).SIMULATION_STATE.learningEngine.learningCurrent.episode.processDate.value) {
|
||||
dailyCandles.push(candle)
|
||||
}
|
||||
}
|
||||
@@ -99,7 +99,7 @@ exports.newSuperalgosBotModulesLearningSimulation = function (processIndex) {
|
||||
In this case we already have at the last candle index the next candle to be
|
||||
processed. We will just continue with this candle.
|
||||
*/
|
||||
initialCandle = learningEngine.current.episode.candle.index.value
|
||||
initialCandle = learningEngine.learningCurrent.episode.candle.index.value
|
||||
}
|
||||
/*
|
||||
Main Simulation Loop
|
||||
@@ -113,7 +113,7 @@ exports.newSuperalgosBotModulesLearningSimulation = function (processIndex) {
|
||||
loop is not empty, then the lascCandle() check will override this value
|
||||
depending on if we really are at the head of the market or not.
|
||||
*/
|
||||
learningEngine.current.episode.headOfTheMarket.value = true
|
||||
learningEngine.learningCurrent.episode.headOfTheMarket.value = true
|
||||
/*
|
||||
This is the main simulation loop. It will go through the initial candle
|
||||
until one less than the last candle available. We will never process the last
|
||||
@@ -121,10 +121,10 @@ exports.newSuperalgosBotModulesLearningSimulation = function (processIndex) {
|
||||
that still can change. So effectively will be processing all closed candles.
|
||||
*/
|
||||
for (let i = initialCandle; i < candles.length - 1; i++) {
|
||||
learningEngine.current.episode.candle.index.value = i
|
||||
learningEngine.learningCurrent.episode.candle.index.value = i
|
||||
|
||||
/* This is the current candle the Simulation is working at. */
|
||||
let candle = candles[learningEngine.current.episode.candle.index.value]
|
||||
let candle = candles[learningEngine.learningCurrent.episode.candle.index.value]
|
||||
|
||||
TS.projects.superalgos.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
|
||||
'[INFO] runSimulation -> loop -> Candle Begin @ ' + (new Date(candle.begin)).toUTCString())
|
||||
@@ -210,7 +210,7 @@ exports.newSuperalgosBotModulesLearningSimulation = function (processIndex) {
|
||||
learningEpisodeModuleObject.reset()
|
||||
TS.projects.superalgos.globals.processModuleObjects.MODULE_OBJECTS_BY_PROCESS_INDEX_MAP.get(processIndex).TRADING_ENGINE_MODULE_OBJECT.reset()
|
||||
|
||||
let infoMessage = 'Processing candle # ' + learningEngine.current.episode.candle.index.value + ' @ the ' + learningEngine.current.episode.cycle.value + ' cycle.'
|
||||
let infoMessage = 'Processing candle # ' + learningEngine.learningCurrent.episode.candle.index.value + ' @ the ' + learningEngine.learningCurrent.episode.cycle.value + ' cycle.'
|
||||
TS.projects.superalgos.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
|
||||
'[INFO] runSimulation -> loop -> ' + infoMessage)
|
||||
|
||||
@@ -222,8 +222,8 @@ exports.newSuperalgosBotModulesLearningSimulation = function (processIndex) {
|
||||
}
|
||||
|
||||
contextInfo = {
|
||||
candleIndex: learningEngine.current.episode.candle.index.value,
|
||||
cycle: learningEngine.current.episode.cycle.value
|
||||
candleIndex: learningEngine.learningCurrent.episode.candle.index.value,
|
||||
cycle: learningEngine.learningCurrent.episode.cycle.value
|
||||
}
|
||||
TS.projects.superalgos.utilities.docsFunctions.buildPlaceholder(docs, undefined, undefined, undefined, undefined, undefined, contextInfo)
|
||||
|
||||
@@ -302,7 +302,7 @@ exports.newSuperalgosBotModulesLearningSimulation = function (processIndex) {
|
||||
if (sessionParameters.heartbeats.config.date === true || sessionParameters.heartbeats.config.candleIndex === true) {
|
||||
/* We will produce a simulation level heartbeat in order to inform the user this is running. */
|
||||
|
||||
heartBeatDate = new Date(Math.trunc(learningEngine.current.episode.candle.begin.value / TS.projects.superalgos.globals.timeConstants.ONE_DAY_IN_MILISECONDS) * TS.projects.superalgos.globals.timeConstants.ONE_DAY_IN_MILISECONDS)
|
||||
heartBeatDate = new Date(Math.trunc(learningEngine.learningCurrent.episode.candle.begin.value / TS.projects.superalgos.globals.timeConstants.ONE_DAY_IN_MILISECONDS) * TS.projects.superalgos.globals.timeConstants.ONE_DAY_IN_MILISECONDS)
|
||||
|
||||
let fromDate = new Date(sessionParameters.timeRange.config.initialDatetime)
|
||||
let lastDate = new Date(sessionParameters.timeRange.config.finalDatetime)
|
||||
@@ -320,7 +320,7 @@ exports.newSuperalgosBotModulesLearningSimulation = function (processIndex) {
|
||||
let processingDate = heartBeatDate.getUTCFullYear() + '-' + TS.projects.superalgos.utilities.miscellaneousFunctions.pad(heartBeatDate.getUTCMonth() + 1, 2) + '-' + TS.projects.superalgos.utilities.miscellaneousFunctions.pad(heartBeatDate.getUTCDate(), 2)
|
||||
|
||||
TS.projects.superalgos.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
|
||||
'[INFO] runSimulation -> loop -> Simulation ' + TS.projects.superalgos.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).SESSION_KEY + ' Loop # ' + learningEngine.current.episode.candle.index.value + ' @ ' + processingDate)
|
||||
'[INFO] runSimulation -> loop -> Simulation ' + TS.projects.superalgos.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).SESSION_KEY + ' Loop # ' + learningEngine.learningCurrent.episode.candle.index.value + ' @ ' + processingDate)
|
||||
|
||||
/* Logging to console and disk */
|
||||
if (TS.projects.superalgos.utilities.dateTimeFunctions.areTheseDatesEqual(currentDate, new Date()) === false) {
|
||||
@@ -344,7 +344,7 @@ exports.newSuperalgosBotModulesLearningSimulation = function (processIndex) {
|
||||
if (sessionParameters.heartbeats.config.date === true) {
|
||||
hartbeatText = hartbeatText + currentDateString
|
||||
}
|
||||
hartbeatText = hartbeatText + ' Candle # ' + learningEngine.current.episode.candle.index.value
|
||||
hartbeatText = hartbeatText + ' Candle # ' + learningEngine.learningCurrent.episode.candle.index.value
|
||||
TS.projects.superalgos.functionLibraries.processFunctions.processHeartBeat(processIndex, hartbeatText, percentage)
|
||||
}
|
||||
}
|
||||
@@ -448,15 +448,15 @@ exports.newSuperalgosBotModulesLearningSimulation = function (processIndex) {
|
||||
for (let i = 0; i < pArray.length; i++) {
|
||||
element = pArray[i]
|
||||
|
||||
if (learningEngine.current.episode.candle.end.value === element.end) { // when there is an exact match at the end we take that element
|
||||
if (learningEngine.learningCurrent.episode.candle.end.value === element.end) { // when there is an exact match at the end we take that element
|
||||
return element
|
||||
} else {
|
||||
if (
|
||||
i > 0 &&
|
||||
element.end > learningEngine.current.episode.candle.end.value
|
||||
element.end > learningEngine.learningCurrent.episode.candle.end.value
|
||||
) {
|
||||
let previousElement = pArray[i - 1]
|
||||
if (previousElement.end < learningEngine.current.episode.candle.end.value) {
|
||||
if (previousElement.end < learningEngine.learningCurrent.episode.candle.end.value) {
|
||||
return previousElement // If one elements goes into the future of currentCandle, then we stop and take the previous element.
|
||||
} else {
|
||||
return
|
||||
@@ -485,7 +485,7 @@ exports.newSuperalgosBotModulesLearningSimulation = function (processIndex) {
|
||||
The second +1 is because we need to compare the next candle (remember that the loops allways avoid the
|
||||
last candle of the dataset available.)
|
||||
*/
|
||||
if (learningEngine.current.episode.candle.index.value + 1 + 1 === candles.length) {
|
||||
if (learningEngine.learningCurrent.episode.candle.index.value + 1 + 1 === candles.length) {
|
||||
/*
|
||||
When processing daily files, we need a mechanism to turn from one day to the next one.
|
||||
That mechanism is the one implemented here. If we detect that the next candle is the last candle of
|
||||
@@ -495,7 +495,7 @@ exports.newSuperalgosBotModulesLearningSimulation = function (processIndex) {
|
||||
let candlesPerDay = TS.projects.superalgos.globals.timeConstants.ONE_DAY_IN_MILISECONDS / sessionParameters.timeFrame.config.value
|
||||
if (
|
||||
TS.projects.superalgos.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).TRADING_PROCESSING_DAILY_FILES &&
|
||||
learningEngine.current.episode.candle.index.value + 1 + 1 === candlesPerDay
|
||||
learningEngine.learningCurrent.episode.candle.index.value + 1 + 1 === candlesPerDay
|
||||
) {
|
||||
/*
|
||||
Here we found that the next candle of the dataset is the last candle of the day.
|
||||
@@ -504,9 +504,9 @@ exports.newSuperalgosBotModulesLearningSimulation = function (processIndex) {
|
||||
the first candle of the new dataset we shall receive. The first candle of the next day starts
|
||||
at index 0, so we will position the index now at zero.
|
||||
*/
|
||||
learningEngine.current.episode.candle.index.value = 0
|
||||
learningEngine.current.episode.processDate.value =
|
||||
learningEngine.current.episode.processDate.value + TS.projects.superalgos.globals.timeConstants.ONE_DAY_IN_MILISECONDS
|
||||
learningEngine.learningCurrent.episode.candle.index.value = 0
|
||||
learningEngine.learningCurrent.episode.processDate.value =
|
||||
learningEngine.learningCurrent.episode.processDate.value + TS.projects.superalgos.globals.timeConstants.ONE_DAY_IN_MILISECONDS
|
||||
return false
|
||||
}
|
||||
|
||||
@@ -516,21 +516,21 @@ exports.newSuperalgosBotModulesLearningSimulation = function (processIndex) {
|
||||
next execution it will likely have more candles at the dataset. And if it does not,
|
||||
it will just wait there until it does.
|
||||
*/
|
||||
learningEngine.current.episode.headOfTheMarket.value = true
|
||||
learningEngine.current.episode.candle.index.value++
|
||||
learningEngine.learningCurrent.episode.headOfTheMarket.value = true
|
||||
learningEngine.learningCurrent.episode.candle.index.value++
|
||||
return false
|
||||
} else {
|
||||
|
||||
/* Wd did not reach the head of the market */
|
||||
learningEngine.current.episode.headOfTheMarket.value = false
|
||||
learningEngine.current.episode.candle.index.value++
|
||||
learningEngine.learningCurrent.episode.headOfTheMarket.value = false
|
||||
learningEngine.learningCurrent.episode.candle.index.value++
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
function checkInitialDatetime() {
|
||||
/* Here we check that the current candle is not before the initial datetime defined at the session parameters.*/
|
||||
if (learningEngine.current.episode.candle.end.value < sessionParameters.timeRange.config.initialDatetime) {
|
||||
if (learningEngine.learningCurrent.episode.candle.end.value < sessionParameters.timeRange.config.initialDatetime) {
|
||||
TS.projects.superalgos.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
|
||||
'[INFO] runSimulation -> checkInitialAndFinalDatetime -> Skipping Candle before the sessionParameters.timeRange.config.initialDatetime.')
|
||||
return false
|
||||
@@ -540,7 +540,7 @@ exports.newSuperalgosBotModulesLearningSimulation = function (processIndex) {
|
||||
|
||||
function checkFinalDatetime() {
|
||||
/* Here we check that the next candle is not after of the user-defined final datetime at the session parameters.*/
|
||||
if (learningEngine.current.episode.candle.begin.value + sessionParameters.timeFrame.config.value > sessionParameters.timeRange.config.finalDatetime) {
|
||||
if (learningEngine.learningCurrent.episode.candle.begin.value + sessionParameters.timeFrame.config.value > sessionParameters.timeRange.config.finalDatetime) {
|
||||
TS.projects.superalgos.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
|
||||
'[INFO] runSimulation -> checkInitialAndFinalDatetime -> Skipping Candle after the sessionParameters.timeRange.config.finalDatetime.')
|
||||
return false
|
||||
@@ -551,17 +551,17 @@ exports.newSuperalgosBotModulesLearningSimulation = function (processIndex) {
|
||||
function checkMinimunAndMaximunBalance() {
|
||||
/* Checks for Minimun and Maximun Balance. We do the check while not inside any strategy only. */
|
||||
if (
|
||||
learningEngine.current.strategy.index.value === learningEngine.current.strategy.index.config.initialValue
|
||||
learningEngine.learningCurrent.strategy.index.value === learningEngine.learningCurrent.strategy.index.config.initialValue
|
||||
) {
|
||||
/*
|
||||
We will perform this check only when we are not inside a position,
|
||||
because there the balances have shifted from their resting position.
|
||||
*/
|
||||
|
||||
let stopRunningDate = (new Date(learningEngine.current.episode.candle.begin.value)).toUTCString()
|
||||
let stopRunningDate = (new Date(learningEngine.learningCurrent.episode.candle.begin.value)).toUTCString()
|
||||
|
||||
if (sessionParameters.sessionBaseAsset.config.minimumBalance !== undefined) {
|
||||
if (learningEngine.current.episode.episodeBaseAsset.balance.value <= sessionParameters.sessionBaseAsset.config.minimumBalance) {
|
||||
if (learningEngine.learningCurrent.episode.episodeBaseAsset.balance.value <= sessionParameters.sessionBaseAsset.config.minimumBalance) {
|
||||
const errorMessage = 'Min Balance reached @ ' + stopRunningDate
|
||||
|
||||
let docs = {
|
||||
@@ -573,7 +573,7 @@ exports.newSuperalgosBotModulesLearningSimulation = function (processIndex) {
|
||||
|
||||
let contextInfo = {
|
||||
timestamp: stopRunningDate,
|
||||
episodeBaseAssetBalance: learningEngine.current.episode.episodeBaseAsset.balance.value,
|
||||
episodeBaseAssetBalance: learningEngine.learningCurrent.episode.episodeBaseAsset.balance.value,
|
||||
sessionBaseAssetMinimumBalance: sessionParameters.sessionBaseAsset.config.minimumBalance
|
||||
}
|
||||
|
||||
@@ -587,7 +587,7 @@ exports.newSuperalgosBotModulesLearningSimulation = function (processIndex) {
|
||||
}
|
||||
|
||||
if (sessionParameters.sessionBaseAsset.config.maximumBalance !== undefined) {
|
||||
if (learningEngine.current.episode.episodeBaseAsset.balance.value >= sessionParameters.sessionBaseAsset.config.maximumBalance) {
|
||||
if (learningEngine.learningCurrent.episode.episodeBaseAsset.balance.value >= sessionParameters.sessionBaseAsset.config.maximumBalance) {
|
||||
const errorMessage = 'Max Balance reached @ ' + stopRunningDate
|
||||
|
||||
let docs = {
|
||||
@@ -599,7 +599,7 @@ exports.newSuperalgosBotModulesLearningSimulation = function (processIndex) {
|
||||
|
||||
let contextInfo = {
|
||||
timestamp: stopRunningDate,
|
||||
episodeBaseAssetBalance: learningEngine.current.episode.episodeBaseAsset.balance.value,
|
||||
episodeBaseAssetBalance: learningEngine.learningCurrent.episode.episodeBaseAsset.balance.value,
|
||||
sessionBaseAssetMaximumBalance: sessionParameters.sessionBaseAsset.config.maximumBalance
|
||||
}
|
||||
|
||||
@@ -613,7 +613,7 @@ exports.newSuperalgosBotModulesLearningSimulation = function (processIndex) {
|
||||
}
|
||||
|
||||
if (sessionParameters.sessionQuotedAsset.config.minimumBalance !== undefined) {
|
||||
if (learningEngine.current.episode.episodeQuotedAsset.balance.value <= sessionParameters.sessionQuotedAsset.config.minimumBalance) {
|
||||
if (learningEngine.learningCurrent.episode.episodeQuotedAsset.balance.value <= sessionParameters.sessionQuotedAsset.config.minimumBalance) {
|
||||
const errorMessage = 'Min Balance reached @ ' + stopRunningDate
|
||||
|
||||
let docs = {
|
||||
@@ -625,7 +625,7 @@ exports.newSuperalgosBotModulesLearningSimulation = function (processIndex) {
|
||||
|
||||
let contextInfo = {
|
||||
timestamp: stopRunningDate,
|
||||
episodeQuotedAssetBalance: learningEngine.current.episode.episodeQuotedAsset.balance.value,
|
||||
episodeQuotedAssetBalance: learningEngine.learningCurrent.episode.episodeQuotedAsset.balance.value,
|
||||
sessionQuotedAssetMinimumBalance: sessionParameters.sessionQuotedAsset.config.minimumBalance
|
||||
}
|
||||
|
||||
@@ -639,7 +639,7 @@ exports.newSuperalgosBotModulesLearningSimulation = function (processIndex) {
|
||||
}
|
||||
|
||||
if (sessionParameters.sessionQuotedAsset.config.maximumBalance !== undefined) {
|
||||
if (learningEngine.current.episode.episodeQuotedAsset.balance.value >= sessionParameters.sessionQuotedAsset.config.maximumBalance) {
|
||||
if (learningEngine.learningCurrent.episode.episodeQuotedAsset.balance.value >= sessionParameters.sessionQuotedAsset.config.maximumBalance) {
|
||||
const errorMessage = 'Max Balance reached @ ' + stopRunningDate
|
||||
|
||||
let docs = {
|
||||
@@ -651,7 +651,7 @@ exports.newSuperalgosBotModulesLearningSimulation = function (processIndex) {
|
||||
|
||||
let contextInfo = {
|
||||
timestamp: stopRunningDate,
|
||||
episodeQuotedAssetBalance: learningEngine.current.episode.episodeQuotedAsset.balance.value,
|
||||
episodeQuotedAssetBalance: learningEngine.learningCurrent.episode.episodeQuotedAsset.balance.value,
|
||||
sessionQuotedAssetMaximumBalance: sessionParameters.sessionQuotedAsset.config.maximumBalance
|
||||
}
|
||||
|
||||
|
||||
+3
-3
@@ -75,7 +75,7 @@ exports.newSuperalgosBotModulesLearningSystem = function (processIndex) {
|
||||
This rate will later help plotting the error at the
|
||||
charts.
|
||||
*/
|
||||
let rate = learningEngine.current.episode.candle.close.value
|
||||
let rate = learningEngine.learningCurrent.episode.candle.close.value
|
||||
errorDataArray.push(rate)
|
||||
learningSystem.errors.push(errorDataArray)
|
||||
}
|
||||
@@ -86,7 +86,7 @@ exports.newSuperalgosBotModulesLearningSystem = function (processIndex) {
|
||||
This rate will later help plotting the warning at the
|
||||
charts.
|
||||
*/
|
||||
let rate = learningEngine.current.episode.candle.close.value
|
||||
let rate = learningEngine.learningCurrent.episode.candle.close.value
|
||||
warningDataArray.push(rate)
|
||||
learningSystem.warnings.push(warningDataArray)
|
||||
}
|
||||
@@ -97,7 +97,7 @@ exports.newSuperalgosBotModulesLearningSystem = function (processIndex) {
|
||||
This rate will later help plotting the warning at the
|
||||
charts.
|
||||
*/
|
||||
let rate = learningEngine.current.episode.candle.close.value
|
||||
let rate = learningEngine.learningCurrent.episode.candle.close.value
|
||||
infoDataArray.push(rate)
|
||||
learningSystem.infos.push(infoDataArray)
|
||||
}
|
||||
|
||||
+10
-10
@@ -207,7 +207,7 @@ exports.newSuperalgosBotModulesOrdersSimulations = function (processIndex) {
|
||||
*/
|
||||
switch (true) {
|
||||
case tradingSystemOrder.type === 'Market Buy Order' || tradingSystemOrder.type === 'Limit Buy Order': {
|
||||
if (tradingEngineOrder.orderStatistics.actualRate.value > tradingEngine.current.episode.candle.max.value) {
|
||||
if (tradingEngineOrder.orderStatistics.actualRate.value > tradingEngine.tradingCurrent.episode.candle.max.value) {
|
||||
|
||||
const message = 'Simulating - Actual Rate Too Hight'
|
||||
let docs = {
|
||||
@@ -218,23 +218,23 @@ exports.newSuperalgosBotModulesOrdersSimulations = function (processIndex) {
|
||||
}
|
||||
contextInfo = {
|
||||
previousActualRate: tradingEngineOrder.orderStatistics.actualRate.value,
|
||||
recalculatedActualRate: tradingEngine.current.episode.candle.max.value
|
||||
recalculatedActualRate: tradingEngine.tradingCurrent.episode.candle.max.value
|
||||
}
|
||||
TS.projects.superalgos.utilities.docsFunctions.buildPlaceholder(docs, undefined, undefined, undefined, undefined, undefined, contextInfo)
|
||||
|
||||
tradingSystem.addWarning(
|
||||
[
|
||||
[tradingEngineOrder.orderStatistics.actualRate.id, tradingEngine.current.episode.candle.max.id],
|
||||
[tradingEngineOrder.orderStatistics.actualRate.id, tradingEngine.tradingCurrent.episode.candle.max.id],
|
||||
message,
|
||||
docs
|
||||
]
|
||||
)
|
||||
tradingEngineOrder.orderStatistics.actualRate.value = tradingEngine.current.episode.candle.max.value
|
||||
tradingEngineOrder.orderStatistics.actualRate.value = tradingEngine.tradingCurrent.episode.candle.max.value
|
||||
}
|
||||
break
|
||||
}
|
||||
case tradingSystemOrder.type === 'Market Sell Order' || tradingSystemOrder.type === 'Limit Sell Order': {
|
||||
if (tradingEngineOrder.orderStatistics.actualRate.value < tradingEngine.current.episode.candle.min.value) {
|
||||
if (tradingEngineOrder.orderStatistics.actualRate.value < tradingEngine.tradingCurrent.episode.candle.min.value) {
|
||||
|
||||
const message = 'Simulating - Actual Rate Too Low'
|
||||
let docs = {
|
||||
@@ -245,18 +245,18 @@ exports.newSuperalgosBotModulesOrdersSimulations = function (processIndex) {
|
||||
}
|
||||
contextInfo = {
|
||||
previousActualRate: tradingEngineOrder.orderStatistics.actualRate.value,
|
||||
recalculatedActualRate: tradingEngine.current.episode.candle.max.value
|
||||
recalculatedActualRate: tradingEngine.tradingCurrent.episode.candle.max.value
|
||||
}
|
||||
TS.projects.superalgos.utilities.docsFunctions.buildPlaceholder(docs, undefined, undefined, undefined, undefined, undefined, contextInfo)
|
||||
|
||||
tradingSystem.addWarning(
|
||||
[
|
||||
[tradingEngineOrder.orderStatistics.actualRate.id, tradingEngine.current.episode.candle.min.id],
|
||||
[tradingEngineOrder.orderStatistics.actualRate.id, tradingEngine.tradingCurrent.episode.candle.min.id],
|
||||
message,
|
||||
docs
|
||||
]
|
||||
)
|
||||
tradingEngineOrder.orderStatistics.actualRate.value = tradingEngine.current.episode.candle.min.value
|
||||
tradingEngineOrder.orderStatistics.actualRate.value = tradingEngine.tradingCurrent.episode.candle.min.value
|
||||
}
|
||||
break
|
||||
}
|
||||
@@ -390,13 +390,13 @@ exports.newSuperalgosBotModulesOrdersSimulations = function (processIndex) {
|
||||
let orderWasHit
|
||||
switch (tradingSystemOrder.type) {
|
||||
case 'Limit Buy Order': {
|
||||
if (tradingEngine.current.episode.candle.min.value <= tradingEngineOrder.orderStatistics.actualRate.value) {
|
||||
if (tradingEngine.tradingCurrent.episode.candle.min.value <= tradingEngineOrder.orderStatistics.actualRate.value) {
|
||||
orderWasHit = true
|
||||
}
|
||||
break
|
||||
}
|
||||
case 'Limit Sell Order': {
|
||||
if (tradingEngine.current.episode.candle.max.value >= tradingEngineOrder.orderStatistics.actualRate.value) {
|
||||
if (tradingEngine.tradingCurrent.episode.candle.max.value >= tradingEngineOrder.orderStatistics.actualRate.value) {
|
||||
orderWasHit = true
|
||||
}
|
||||
break
|
||||
|
||||
@@ -96,7 +96,7 @@ exports.newSuperalgosBotModulesSnapshots = function (processIndex) {
|
||||
}
|
||||
|
||||
function strategyExit() {
|
||||
getResults(tradingEngine.current.strategy.begin.value, tradingEngine.current.strategy.end.value)
|
||||
getResults(tradingEngine.tradingCurrent.strategy.begin.value, tradingEngine.tradingCurrent.strategy.end.value)
|
||||
let valuesArray = closeValues.concat(strategyValues)
|
||||
snapshots.strategies.push(valuesArray)
|
||||
}
|
||||
@@ -115,7 +115,7 @@ exports.newSuperalgosBotModulesSnapshots = function (processIndex) {
|
||||
}
|
||||
|
||||
function positionExit() {
|
||||
getResults(tradingEngine.current.position.begin.value, tradingEngine.current.position.end.value)
|
||||
getResults(tradingEngine.tradingCurrent.position.begin.value, tradingEngine.tradingCurrent.position.end.value)
|
||||
let valuesArray = closeValues.concat(positionValues)
|
||||
snapshots.positions.push(valuesArray)
|
||||
}
|
||||
@@ -294,17 +294,17 @@ exports.newSuperalgosBotModulesSnapshots = function (processIndex) {
|
||||
|
||||
let closeHeaders = ['Trade Number', 'Open Datetime', 'Close Datetime', 'Strategy Name', 'Trigger On Situation', 'Take Position Situation', 'Result In Base Asset', 'Result In Quoted Asset', 'ROI in Base Asset', 'ROI in Quoted Asset', 'Exit Type']
|
||||
closeValues = [
|
||||
tradingEngine.current.episode.episodeCounters.positions.value, // Position Number
|
||||
tradingEngine.tradingCurrent.episode.episodeCounters.positions.value, // Position Number
|
||||
(new Date(openDatetime)).toISOString(), // Open Datetime
|
||||
(new Date(closeDatetime)).toISOString(), // Open Datetime
|
||||
tradingEngine.current.strategy.strategyName.value, // Strategy Name
|
||||
tradingEngine.current.strategy.situationName.value, // Trigger On Situation
|
||||
tradingEngine.current.position.situationName.value, // Take Position Situation
|
||||
tradingEngine.current.position.positionBaseAsset.hitFail.value, // Result in Base Asset
|
||||
tradingEngine.current.position.positionQuotedAsset.hitFail.value, // Result in Base Asset
|
||||
tradingEngine.current.position.positionBaseAsset.ROI.value, // ROI in Base Asseet
|
||||
tradingEngine.current.position.positionQuotedAsset.ROI.value, // ROI in Quoted Asset
|
||||
tradingEngine.current.position.exitType.value // Exit Type
|
||||
tradingEngine.tradingCurrent.strategy.strategyName.value, // Strategy Name
|
||||
tradingEngine.tradingCurrent.strategy.situationName.value, // Trigger On Situation
|
||||
tradingEngine.tradingCurrent.position.situationName.value, // Take Position Situation
|
||||
tradingEngine.tradingCurrent.position.positionBaseAsset.hitFail.value, // Result in Base Asset
|
||||
tradingEngine.tradingCurrent.position.positionQuotedAsset.hitFail.value, // Result in Base Asset
|
||||
tradingEngine.tradingCurrent.position.positionBaseAsset.ROI.value, // ROI in Base Asseet
|
||||
tradingEngine.tradingCurrent.position.positionQuotedAsset.ROI.value, // ROI in Quoted Asset
|
||||
tradingEngine.tradingCurrent.position.exitType.value // Exit Type
|
||||
]
|
||||
|
||||
if (createCloseHeaders === true) {
|
||||
|
||||
+21
-21
@@ -56,36 +56,36 @@ exports.newSuperalgosBotModulesTradingEngine = function (processIndex) {
|
||||
}
|
||||
|
||||
function setCurrentCandle(candle) {
|
||||
tradingEngine.current.episode.candle.begin.value = candle.begin
|
||||
tradingEngine.current.episode.candle.end.value = candle.end
|
||||
tradingEngine.current.episode.candle.open.value = candle.open
|
||||
tradingEngine.current.episode.candle.close.value = candle.close
|
||||
tradingEngine.current.episode.candle.min.value = candle.min
|
||||
tradingEngine.current.episode.candle.max.value = candle.max
|
||||
tradingEngine.tradingCurrent.episode.candle.begin.value = candle.begin
|
||||
tradingEngine.tradingCurrent.episode.candle.end.value = candle.end
|
||||
tradingEngine.tradingCurrent.episode.candle.open.value = candle.open
|
||||
tradingEngine.tradingCurrent.episode.candle.close.value = candle.close
|
||||
tradingEngine.tradingCurrent.episode.candle.min.value = candle.min
|
||||
tradingEngine.tradingCurrent.episode.candle.max.value = candle.max
|
||||
}
|
||||
|
||||
function setCurrentCycle(cycle) {
|
||||
tradingEngine.current.episode.cycle.value = cycle
|
||||
tradingEngine.current.episode.cycle.lastBegin.value = tradingEngine.current.episode.cycle.begin.value
|
||||
tradingEngine.current.episode.cycle.lastEnd.value = tradingEngine.current.episode.cycle.end.value
|
||||
tradingEngine.tradingCurrent.episode.cycle.value = cycle
|
||||
tradingEngine.tradingCurrent.episode.cycle.lastBegin.value = tradingEngine.tradingCurrent.episode.cycle.begin.value
|
||||
tradingEngine.tradingCurrent.episode.cycle.lastEnd.value = tradingEngine.tradingCurrent.episode.cycle.end.value
|
||||
switch (cycle) {
|
||||
case 'First': {
|
||||
tradingEngine.current.episode.cycle.begin.value =
|
||||
tradingEngine.current.episode.candle.begin.value +
|
||||
tradingEngine.tradingCurrent.episode.cycle.begin.value =
|
||||
tradingEngine.tradingCurrent.episode.candle.begin.value +
|
||||
sessionParameters.timeFrame.config.value
|
||||
tradingEngine.current.episode.cycle.end.value =
|
||||
tradingEngine.current.episode.candle.begin.value +
|
||||
tradingEngine.tradingCurrent.episode.cycle.end.value =
|
||||
tradingEngine.tradingCurrent.episode.candle.begin.value +
|
||||
sessionParameters.timeFrame.config.value +
|
||||
sessionParameters.timeFrame.config.value / 2 - 1
|
||||
break
|
||||
}
|
||||
case 'Second': {
|
||||
tradingEngine.current.episode.cycle.begin.value =
|
||||
tradingEngine.current.episode.candle.begin.value +
|
||||
tradingEngine.tradingCurrent.episode.cycle.begin.value =
|
||||
tradingEngine.tradingCurrent.episode.candle.begin.value +
|
||||
sessionParameters.timeFrame.config.value +
|
||||
sessionParameters.timeFrame.config.value / 2
|
||||
tradingEngine.current.episode.cycle.end.value =
|
||||
tradingEngine.current.episode.candle.begin.value +
|
||||
tradingEngine.tradingCurrent.episode.cycle.end.value =
|
||||
tradingEngine.tradingCurrent.episode.candle.begin.value +
|
||||
sessionParameters.timeFrame.config.value +
|
||||
sessionParameters.timeFrame.config.value * 4 / 4 - 1
|
||||
break
|
||||
@@ -96,11 +96,11 @@ exports.newSuperalgosBotModulesTradingEngine = function (processIndex) {
|
||||
objects starting with lastBegin in zero to being saved on file. For that reason
|
||||
we will do this:
|
||||
*/
|
||||
if (tradingEngine.current.episode.cycle.lastBegin.value === 0) {
|
||||
tradingEngine.current.episode.cycle.lastBegin.value = tradingEngine.current.episode.cycle.begin.value
|
||||
if (tradingEngine.tradingCurrent.episode.cycle.lastBegin.value === 0) {
|
||||
tradingEngine.tradingCurrent.episode.cycle.lastBegin.value = tradingEngine.tradingCurrent.episode.cycle.begin.value
|
||||
}
|
||||
if (tradingEngine.current.episode.cycle.lastEnd.value === 0) {
|
||||
tradingEngine.current.episode.cycle.lastEnd.value = tradingEngine.current.episode.cycle.end.value
|
||||
if (tradingEngine.tradingCurrent.episode.cycle.lastEnd.value === 0) {
|
||||
tradingEngine.tradingCurrent.episode.cycle.lastEnd.value = tradingEngine.tradingCurrent.episode.cycle.end.value
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+109
-109
@@ -49,69 +49,69 @@ exports.newSuperalgosBotModulesTradingEpisode = function (processIndex) {
|
||||
must be opened there, since it might happen that it is looping at the end of the market
|
||||
or the task / session was restarted. We will only execute if the episode was never opened before.
|
||||
*/
|
||||
if (tradingEngine.current.episode.begin.value !== tradingEngine.current.episode.begin.config.initialValue) { return }
|
||||
if (tradingEngine.tradingCurrent.episode.begin.value !== tradingEngine.tradingCurrent.episode.begin.config.initialValue) { return }
|
||||
|
||||
/* Starting begin and end */
|
||||
tradingEngine.current.episode.begin.value = tradingEngine.current.episode.candle.begin.value
|
||||
tradingEngine.current.episode.end.value = tradingEngine.current.episode.candle.end.value
|
||||
tradingEngine.tradingCurrent.episode.begin.value = tradingEngine.tradingCurrent.episode.candle.begin.value
|
||||
tradingEngine.tradingCurrent.episode.end.value = tradingEngine.tradingCurrent.episode.candle.end.value
|
||||
|
||||
/* Getting the begin Balance from the session configuration */
|
||||
tradingEngine.current.episode.episodeBaseAsset.beginBalance.value = sessionParameters.sessionBaseAsset.config.initialBalance
|
||||
tradingEngine.current.episode.episodeQuotedAsset.beginBalance.value = sessionParameters.sessionQuotedAsset.config.initialBalance
|
||||
tradingEngine.tradingCurrent.episode.episodeBaseAsset.beginBalance.value = sessionParameters.sessionBaseAsset.config.initialBalance
|
||||
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.beginBalance.value = sessionParameters.sessionQuotedAsset.config.initialBalance
|
||||
|
||||
/* The current balance is also the begin balance, that is how this starts. */
|
||||
tradingEngine.current.episode.episodeBaseAsset.balance.value = sessionParameters.sessionBaseAsset.config.initialBalance
|
||||
tradingEngine.current.episode.episodeQuotedAsset.balance.value = sessionParameters.sessionQuotedAsset.config.initialBalance
|
||||
tradingEngine.tradingCurrent.episode.episodeBaseAsset.balance.value = sessionParameters.sessionBaseAsset.config.initialBalance
|
||||
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.balance.value = sessionParameters.sessionQuotedAsset.config.initialBalance
|
||||
|
||||
/* Recording the opening at the Trading Engine Data Structure */
|
||||
tradingEngine.current.episode.status.value = 'Open'
|
||||
tradingEngine.current.episode.serialNumber.value = 1
|
||||
tradingEngine.current.episode.identifier.value = TS.projects.superalgos.utilities.miscellaneousFunctions.genereteUniqueId()
|
||||
tradingEngine.current.episode.beginRate.value = tradingEngine.current.episode.candle.close.value
|
||||
tradingEngine.tradingCurrent.episode.status.value = 'Open'
|
||||
tradingEngine.tradingCurrent.episode.serialNumber.value = 1
|
||||
tradingEngine.tradingCurrent.episode.identifier.value = TS.projects.superalgos.utilities.miscellaneousFunctions.genereteUniqueId()
|
||||
tradingEngine.tradingCurrent.episode.beginRate.value = tradingEngine.tradingCurrent.episode.candle.close.value
|
||||
}
|
||||
|
||||
function updateExitType(exitType) {
|
||||
tradingEngine.current.episode.exitType.value = exitType
|
||||
tradingEngine.tradingCurrent.episode.exitType.value = exitType
|
||||
}
|
||||
|
||||
function closeEpisode() {
|
||||
tradingEngine.current.episode.status.value = 'Closed'
|
||||
tradingEngine.current.episode.end.value = tradingEngine.current.episode.candle.end.value
|
||||
tradingEngine.current.episode.endRate.value = tradingEngine.current.episode.candle.close.value
|
||||
tradingEngine.current.episode.episodeBaseAsset.endBalance.value = tradingEngine.current.episode.episodeBaseAsset.balance.value
|
||||
tradingEngine.current.episode.episodeQuotedAsset.endBalance.value = tradingEngine.current.episode.episodeQuotedAsset.balance.value
|
||||
tradingEngine.tradingCurrent.episode.status.value = 'Closed'
|
||||
tradingEngine.tradingCurrent.episode.end.value = tradingEngine.tradingCurrent.episode.candle.end.value
|
||||
tradingEngine.tradingCurrent.episode.endRate.value = tradingEngine.tradingCurrent.episode.candle.close.value
|
||||
tradingEngine.tradingCurrent.episode.episodeBaseAsset.endBalance.value = tradingEngine.tradingCurrent.episode.episodeBaseAsset.balance.value
|
||||
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.endBalance.value = tradingEngine.tradingCurrent.episode.episodeQuotedAsset.balance.value
|
||||
}
|
||||
|
||||
function resetEpisode() {
|
||||
TS.projects.superalgos.globals.processModuleObjects.MODULE_OBJECTS_BY_PROCESS_INDEX_MAP.get(processIndex).TRADING_ENGINE_MODULE_OBJECT.initializeNode(tradingEngine.current.episode)
|
||||
TS.projects.superalgos.globals.processModuleObjects.MODULE_OBJECTS_BY_PROCESS_INDEX_MAP.get(processIndex).TRADING_ENGINE_MODULE_OBJECT.initializeNode(tradingEngine.tradingCurrent.episode)
|
||||
}
|
||||
|
||||
function updateEnds() {
|
||||
if (tradingEngine.current.episode.status.value === 'Open') {
|
||||
tradingEngine.current.episode.end.value = tradingEngine.current.episode.end.value + sessionParameters.timeFrame.config.value
|
||||
tradingEngine.current.episode.endRate.value = tradingEngine.current.episode.candle.close.value
|
||||
tradingEngine.current.episode.episodeBaseAsset.endBalance.value = tradingEngine.current.episode.episodeBaseAsset.balance.value
|
||||
tradingEngine.current.episode.episodeQuotedAsset.endBalance.value = tradingEngine.current.episode.episodeQuotedAsset.balance.value
|
||||
if (tradingEngine.tradingCurrent.episode.status.value === 'Open') {
|
||||
tradingEngine.tradingCurrent.episode.end.value = tradingEngine.tradingCurrent.episode.end.value + sessionParameters.timeFrame.config.value
|
||||
tradingEngine.tradingCurrent.episode.endRate.value = tradingEngine.tradingCurrent.episode.candle.close.value
|
||||
tradingEngine.tradingCurrent.episode.episodeBaseAsset.endBalance.value = tradingEngine.tradingCurrent.episode.episodeBaseAsset.balance.value
|
||||
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.endBalance.value = tradingEngine.tradingCurrent.episode.episodeQuotedAsset.balance.value
|
||||
}
|
||||
}
|
||||
|
||||
function resetTradingEngineDataStructure() {
|
||||
if (tradingEngine.current.episode.status.value === 'Closed') {
|
||||
if (tradingEngine.tradingCurrent.episode.status.value === 'Closed') {
|
||||
resetEpisode()
|
||||
}
|
||||
}
|
||||
|
||||
function updateCounters() {
|
||||
if (tradingEngine.current.episode.status.value === 'Open') {
|
||||
tradingEngine.current.episode.episodeCounters.periods.value++
|
||||
if (tradingEngine.tradingCurrent.episode.status.value === 'Open') {
|
||||
tradingEngine.tradingCurrent.episode.episodeCounters.periods.value++
|
||||
}
|
||||
}
|
||||
|
||||
function updateStatistics() {
|
||||
|
||||
/* Daus Calculation */
|
||||
tradingEngine.current.episode.episodeStatistics.days.value =
|
||||
tradingEngine.current.episode.episodeCounters.periods.value *
|
||||
tradingEngine.tradingCurrent.episode.episodeStatistics.days.value =
|
||||
tradingEngine.tradingCurrent.episode.episodeCounters.periods.value *
|
||||
sessionParameters.timeFrame.config.value /
|
||||
TS.projects.superalgos.globals.timeConstants.ONE_DAY_IN_MILISECONDS
|
||||
}
|
||||
@@ -123,45 +123,45 @@ exports.newSuperalgosBotModulesTradingEpisode = function (processIndex) {
|
||||
|
||||
function calculateAssetsStatistics() {
|
||||
/* Updating Profit Loss */
|
||||
tradingEngine.current.episode.episodeBaseAsset.profitLoss.value =
|
||||
tradingEngine.current.episode.episodeBaseAsset.balance.value -
|
||||
tradingEngine.tradingCurrent.episode.episodeBaseAsset.profitLoss.value =
|
||||
tradingEngine.tradingCurrent.episode.episodeBaseAsset.balance.value -
|
||||
sessionParameters.sessionBaseAsset.config.initialBalance
|
||||
|
||||
tradingEngine.current.episode.episodeQuotedAsset.profitLoss.value =
|
||||
tradingEngine.current.episode.episodeQuotedAsset.balance.value -
|
||||
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.profitLoss.value =
|
||||
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.balance.value -
|
||||
sessionParameters.sessionQuotedAsset.config.initialBalance
|
||||
|
||||
tradingEngine.current.episode.episodeBaseAsset.profitLoss.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(tradingEngine.current.episode.episodeBaseAsset.profitLoss.value, 10)
|
||||
tradingEngine.current.episode.episodeQuotedAsset.profitLoss.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(tradingEngine.current.episode.episodeQuotedAsset.profitLoss.value, 10)
|
||||
tradingEngine.tradingCurrent.episode.episodeBaseAsset.profitLoss.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(tradingEngine.tradingCurrent.episode.episodeBaseAsset.profitLoss.value, 10)
|
||||
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.profitLoss.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(tradingEngine.tradingCurrent.episode.episodeQuotedAsset.profitLoss.value, 10)
|
||||
|
||||
/*
|
||||
Updating ROI
|
||||
|
||||
https://www.investopedia.com/articles/basics/10/guide-to-calculating-roi.asp
|
||||
*/
|
||||
tradingEngine.current.episode.episodeBaseAsset.ROI.value =
|
||||
tradingEngine.current.episode.episodeBaseAsset.profitLoss.value /
|
||||
tradingEngine.current.episode.episodeBaseAsset.beginBalance.value * 100
|
||||
tradingEngine.tradingCurrent.episode.episodeBaseAsset.ROI.value =
|
||||
tradingEngine.tradingCurrent.episode.episodeBaseAsset.profitLoss.value /
|
||||
tradingEngine.tradingCurrent.episode.episodeBaseAsset.beginBalance.value * 100
|
||||
|
||||
tradingEngine.current.episode.episodeQuotedAsset.ROI.value =
|
||||
tradingEngine.current.episode.episodeQuotedAsset.profitLoss.value /
|
||||
tradingEngine.current.episode.episodeQuotedAsset.beginBalance.value * 100
|
||||
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.ROI.value =
|
||||
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.profitLoss.value /
|
||||
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.beginBalance.value * 100
|
||||
|
||||
tradingEngine.current.episode.episodeBaseAsset.ROI.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(tradingEngine.current.episode.episodeBaseAsset.ROI.value, 10)
|
||||
tradingEngine.current.episode.episodeQuotedAsset.ROI.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(tradingEngine.current.episode.episodeQuotedAsset.ROI.value, 10)
|
||||
tradingEngine.tradingCurrent.episode.episodeBaseAsset.ROI.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(tradingEngine.tradingCurrent.episode.episodeBaseAsset.ROI.value, 10)
|
||||
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.ROI.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(tradingEngine.tradingCurrent.episode.episodeQuotedAsset.ROI.value, 10)
|
||||
|
||||
/* Updating Hit Ratio */
|
||||
if (tradingEngine.current.episode.episodeCounters.positions.value > 0) {
|
||||
tradingEngine.current.episode.episodeBaseAsset.hitRatio.value =
|
||||
tradingEngine.current.episode.episodeBaseAsset.hits.value /
|
||||
tradingEngine.current.episode.episodeCounters.positions.value
|
||||
if (tradingEngine.tradingCurrent.episode.episodeCounters.positions.value > 0) {
|
||||
tradingEngine.tradingCurrent.episode.episodeBaseAsset.hitRatio.value =
|
||||
tradingEngine.tradingCurrent.episode.episodeBaseAsset.hits.value /
|
||||
tradingEngine.tradingCurrent.episode.episodeCounters.positions.value
|
||||
|
||||
tradingEngine.current.episode.episodeQuotedAsset.hitRatio.value =
|
||||
tradingEngine.current.episode.episodeQuotedAsset.hits.value /
|
||||
tradingEngine.current.episode.episodeCounters.positions.value
|
||||
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.hitRatio.value =
|
||||
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.hits.value /
|
||||
tradingEngine.tradingCurrent.episode.episodeCounters.positions.value
|
||||
|
||||
tradingEngine.current.episode.episodeBaseAsset.hitRatio.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(tradingEngine.current.episode.episodeBaseAsset.hitRatio.value, 10)
|
||||
tradingEngine.current.episode.episodeQuotedAsset.hitRatio.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(tradingEngine.current.episode.episodeQuotedAsset.hitRatio.value, 10)
|
||||
tradingEngine.tradingCurrent.episode.episodeBaseAsset.hitRatio.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(tradingEngine.tradingCurrent.episode.episodeBaseAsset.hitRatio.value, 10)
|
||||
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.hitRatio.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(tradingEngine.tradingCurrent.episode.episodeQuotedAsset.hitRatio.value, 10)
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -169,94 +169,94 @@ exports.newSuperalgosBotModulesTradingEpisode = function (processIndex) {
|
||||
|
||||
https://www.investopedia.com/terms/a/annualized-rate.asp
|
||||
*/
|
||||
tradingEngine.current.episode.episodeBaseAsset.annualizedRateOfReturn.value =
|
||||
tradingEngine.tradingCurrent.episode.episodeBaseAsset.annualizedRateOfReturn.value =
|
||||
Math.pow(
|
||||
(
|
||||
tradingEngine.current.episode.episodeBaseAsset.beginBalance.value +
|
||||
tradingEngine.current.episode.episodeBaseAsset.profitLoss.value
|
||||
) / tradingEngine.current.episode.episodeBaseAsset.beginBalance.value
|
||||
tradingEngine.tradingCurrent.episode.episodeBaseAsset.beginBalance.value +
|
||||
tradingEngine.tradingCurrent.episode.episodeBaseAsset.profitLoss.value
|
||||
) / tradingEngine.tradingCurrent.episode.episodeBaseAsset.beginBalance.value
|
||||
,
|
||||
(365 / tradingEngine.current.episode.episodeStatistics.days.value)
|
||||
(365 / tradingEngine.tradingCurrent.episode.episodeStatistics.days.value)
|
||||
) - 1
|
||||
|
||||
tradingEngine.current.episode.episodeQuotedAsset.annualizedRateOfReturn.value =
|
||||
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.annualizedRateOfReturn.value =
|
||||
Math.pow(
|
||||
(
|
||||
tradingEngine.current.episode.episodeQuotedAsset.beginBalance.value +
|
||||
tradingEngine.current.episode.episodeQuotedAsset.profitLoss.value
|
||||
) / tradingEngine.current.episode.episodeQuotedAsset.beginBalance.value
|
||||
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.beginBalance.value +
|
||||
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.profitLoss.value
|
||||
) / tradingEngine.tradingCurrent.episode.episodeQuotedAsset.beginBalance.value
|
||||
,
|
||||
(365 / tradingEngine.current.episode.episodeStatistics.days.value)
|
||||
(365 / tradingEngine.tradingCurrent.episode.episodeStatistics.days.value)
|
||||
) - 1
|
||||
|
||||
tradingEngine.current.episode.episodeBaseAsset.annualizedRateOfReturn.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(tradingEngine.current.episode.episodeBaseAsset.annualizedRateOfReturn.value, 10)
|
||||
tradingEngine.current.episode.episodeQuotedAsset.annualizedRateOfReturn.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(tradingEngine.current.episode.episodeQuotedAsset.annualizedRateOfReturn.value, 10)
|
||||
tradingEngine.tradingCurrent.episode.episodeBaseAsset.annualizedRateOfReturn.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(tradingEngine.tradingCurrent.episode.episodeBaseAsset.annualizedRateOfReturn.value, 10)
|
||||
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.annualizedRateOfReturn.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(tradingEngine.tradingCurrent.episode.episodeQuotedAsset.annualizedRateOfReturn.value, 10)
|
||||
|
||||
/* Updating Hit or Fail */
|
||||
if (tradingEngine.current.episode.episodeBaseAsset.profitLoss.value > 0) {
|
||||
tradingEngine.current.episode.episodeBaseAsset.hitFail.value = 'Hit'
|
||||
if (tradingEngine.tradingCurrent.episode.episodeBaseAsset.profitLoss.value > 0) {
|
||||
tradingEngine.tradingCurrent.episode.episodeBaseAsset.hitFail.value = 'Hit'
|
||||
} else {
|
||||
tradingEngine.current.episode.episodeBaseAsset.hitFail.value = 'Fail'
|
||||
tradingEngine.tradingCurrent.episode.episodeBaseAsset.hitFail.value = 'Fail'
|
||||
}
|
||||
if (tradingEngine.current.episode.episodeQuotedAsset.profitLoss.value > 0) {
|
||||
tradingEngine.current.episode.episodeQuotedAsset.hitFail.value = 'Hit'
|
||||
if (tradingEngine.tradingCurrent.episode.episodeQuotedAsset.profitLoss.value > 0) {
|
||||
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.hitFail.value = 'Hit'
|
||||
} else {
|
||||
tradingEngine.current.episode.episodeQuotedAsset.hitFail.value = 'Fail'
|
||||
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.hitFail.value = 'Fail'
|
||||
}
|
||||
}
|
||||
|
||||
function calculateEpisodeStatistics() {
|
||||
/* Updating Profit Loss */
|
||||
tradingEngine.current.episode.episodeStatistics.profitLoss.value =
|
||||
tradingEngine.current.episode.episodeBaseAsset.profitLoss.value * tradingEngine.current.episode.candle.close.value +
|
||||
tradingEngine.current.episode.episodeQuotedAsset.profitLoss.value
|
||||
tradingEngine.tradingCurrent.episode.episodeStatistics.profitLoss.value =
|
||||
tradingEngine.tradingCurrent.episode.episodeBaseAsset.profitLoss.value * tradingEngine.tradingCurrent.episode.candle.close.value +
|
||||
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.profitLoss.value
|
||||
|
||||
tradingEngine.current.episode.episodeStatistics.profitLoss.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(tradingEngine.current.episode.episodeStatistics.profitLoss.value, 10)
|
||||
tradingEngine.tradingCurrent.episode.episodeStatistics.profitLoss.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(tradingEngine.tradingCurrent.episode.episodeStatistics.profitLoss.value, 10)
|
||||
|
||||
/*
|
||||
Updating ROI
|
||||
|
||||
https://www.investopedia.com/articles/basics/10/guide-to-calculating-roi.asp
|
||||
*/
|
||||
tradingEngine.current.episode.episodeStatistics.ROI.value =
|
||||
tradingEngine.tradingCurrent.episode.episodeStatistics.ROI.value =
|
||||
(
|
||||
tradingEngine.current.episode.episodeBaseAsset.profitLoss.value * tradingEngine.current.episode.endRate.value +
|
||||
tradingEngine.current.episode.episodeQuotedAsset.profitLoss.value
|
||||
tradingEngine.tradingCurrent.episode.episodeBaseAsset.profitLoss.value * tradingEngine.tradingCurrent.episode.endRate.value +
|
||||
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.profitLoss.value
|
||||
) / (
|
||||
tradingEngine.current.episode.episodeBaseAsset.beginBalance.value * tradingEngine.current.episode.beginRate.value +
|
||||
tradingEngine.current.episode.episodeQuotedAsset.beginBalance.value
|
||||
tradingEngine.tradingCurrent.episode.episodeBaseAsset.beginBalance.value * tradingEngine.tradingCurrent.episode.beginRate.value +
|
||||
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.beginBalance.value
|
||||
) * 100
|
||||
|
||||
tradingEngine.current.episode.episodeStatistics.ROI.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(tradingEngine.current.episode.episodeStatistics.ROI.value, 10)
|
||||
tradingEngine.tradingCurrent.episode.episodeStatistics.ROI.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(tradingEngine.tradingCurrent.episode.episodeStatistics.ROI.value, 10)
|
||||
|
||||
/*
|
||||
Updating Annualized Rate Of Return
|
||||
|
||||
https://www.investopedia.com/terms/a/annualized-rate.asp
|
||||
*/
|
||||
tradingEngine.current.episode.episodeStatistics.annualizedRateOfReturn.value =
|
||||
tradingEngine.tradingCurrent.episode.episodeStatistics.annualizedRateOfReturn.value =
|
||||
Math.pow(
|
||||
(
|
||||
tradingEngine.current.episode.episodeBaseAsset.beginBalance.value * tradingEngine.current.episode.beginRate.value +
|
||||
tradingEngine.current.episode.episodeQuotedAsset.beginBalance.value +
|
||||
tradingEngine.current.episode.episodeBaseAsset.profitLoss.value +
|
||||
tradingEngine.current.episode.episodeQuotedAsset.profitLoss.value
|
||||
tradingEngine.tradingCurrent.episode.episodeBaseAsset.beginBalance.value * tradingEngine.tradingCurrent.episode.beginRate.value +
|
||||
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.beginBalance.value +
|
||||
tradingEngine.tradingCurrent.episode.episodeBaseAsset.profitLoss.value +
|
||||
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.profitLoss.value
|
||||
) /
|
||||
(
|
||||
tradingEngine.current.episode.episodeBaseAsset.beginBalance.value * tradingEngine.current.episode.beginRate.value +
|
||||
tradingEngine.current.episode.episodeQuotedAsset.beginBalance.value
|
||||
tradingEngine.tradingCurrent.episode.episodeBaseAsset.beginBalance.value * tradingEngine.tradingCurrent.episode.beginRate.value +
|
||||
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.beginBalance.value
|
||||
)
|
||||
,
|
||||
(365 / tradingEngine.current.episode.episodeStatistics.days.value)
|
||||
(365 / tradingEngine.tradingCurrent.episode.episodeStatistics.days.value)
|
||||
) - 1
|
||||
|
||||
tradingEngine.current.episode.episodeStatistics.annualizedRateOfReturn.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(tradingEngine.current.episode.episodeStatistics.annualizedRateOfReturn.value, 10)
|
||||
tradingEngine.tradingCurrent.episode.episodeStatistics.annualizedRateOfReturn.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(tradingEngine.tradingCurrent.episode.episodeStatistics.annualizedRateOfReturn.value, 10)
|
||||
|
||||
/* Updating Hit or Fail */
|
||||
if (tradingEngine.current.episode.episodeStatistics.profitLoss.value > 0) {
|
||||
tradingEngine.current.episode.episodeStatistics.hitFail.value = 'Hit'
|
||||
if (tradingEngine.tradingCurrent.episode.episodeStatistics.profitLoss.value > 0) {
|
||||
tradingEngine.tradingCurrent.episode.episodeStatistics.hitFail.value = 'Hit'
|
||||
} else {
|
||||
tradingEngine.current.episode.episodeStatistics.hitFail.value = 'Fail'
|
||||
tradingEngine.tradingCurrent.episode.episodeStatistics.hitFail.value = 'Fail'
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -264,57 +264,57 @@ exports.newSuperalgosBotModulesTradingEpisode = function (processIndex) {
|
||||
function updateDistanceToEventsCounters() {
|
||||
/* Keeping Distance Counters Up-to-date while avoinding counting before the first event happens. */
|
||||
if (
|
||||
tradingEngine.current.episode.distanceToEvent.triggerOn.value > 0
|
||||
tradingEngine.tradingCurrent.episode.distanceToEvent.triggerOn.value > 0
|
||||
) {
|
||||
tradingEngine.current.episode.distanceToEvent.triggerOn.value++
|
||||
tradingEngine.tradingCurrent.episode.distanceToEvent.triggerOn.value++
|
||||
}
|
||||
|
||||
if (
|
||||
tradingEngine.current.episode.distanceToEvent.triggerOff.value > 0
|
||||
tradingEngine.tradingCurrent.episode.distanceToEvent.triggerOff.value > 0
|
||||
) {
|
||||
tradingEngine.current.episode.distanceToEvent.triggerOff.value++
|
||||
tradingEngine.tradingCurrent.episode.distanceToEvent.triggerOff.value++
|
||||
}
|
||||
|
||||
if (
|
||||
tradingEngine.current.episode.distanceToEvent.takePosition.value > 0
|
||||
tradingEngine.tradingCurrent.episode.distanceToEvent.takePosition.value > 0
|
||||
) {
|
||||
tradingEngine.current.episode.distanceToEvent.takePosition.value++
|
||||
tradingEngine.tradingCurrent.episode.distanceToEvent.takePosition.value++
|
||||
}
|
||||
|
||||
if (
|
||||
tradingEngine.current.episode.distanceToEvent.closePosition.value > 0
|
||||
tradingEngine.tradingCurrent.episode.distanceToEvent.closePosition.value > 0
|
||||
) {
|
||||
tradingEngine.current.episode.distanceToEvent.closePosition.value++
|
||||
tradingEngine.tradingCurrent.episode.distanceToEvent.closePosition.value++
|
||||
}
|
||||
|
||||
if (
|
||||
tradingEngine.current.episode.distanceToEvent.nextPhase.value > 0
|
||||
tradingEngine.tradingCurrent.episode.distanceToEvent.nextPhase.value > 0
|
||||
) {
|
||||
tradingEngine.current.episode.distanceToEvent.nextPhase.value++
|
||||
tradingEngine.tradingCurrent.episode.distanceToEvent.nextPhase.value++
|
||||
}
|
||||
|
||||
if (
|
||||
tradingEngine.current.episode.distanceToEvent.moveToPhase.value > 0
|
||||
tradingEngine.tradingCurrent.episode.distanceToEvent.moveToPhase.value > 0
|
||||
) {
|
||||
tradingEngine.current.episode.distanceToEvent.moveToPhase.value++
|
||||
tradingEngine.tradingCurrent.episode.distanceToEvent.moveToPhase.value++
|
||||
}
|
||||
|
||||
if (
|
||||
tradingEngine.current.episode.distanceToEvent.createOrder.value > 0
|
||||
tradingEngine.tradingCurrent.episode.distanceToEvent.createOrder.value > 0
|
||||
) {
|
||||
tradingEngine.current.episode.distanceToEvent.createOrder.value++
|
||||
tradingEngine.tradingCurrent.episode.distanceToEvent.createOrder.value++
|
||||
}
|
||||
|
||||
if (
|
||||
tradingEngine.current.episode.distanceToEvent.cancelOrder.value > 0
|
||||
tradingEngine.tradingCurrent.episode.distanceToEvent.cancelOrder.value > 0
|
||||
) {
|
||||
tradingEngine.current.episode.distanceToEvent.cancelOrder.value++
|
||||
tradingEngine.tradingCurrent.episode.distanceToEvent.cancelOrder.value++
|
||||
}
|
||||
|
||||
if (
|
||||
tradingEngine.current.episode.distanceToEvent.closeOrder.value > 0
|
||||
tradingEngine.tradingCurrent.episode.distanceToEvent.closeOrder.value > 0
|
||||
) {
|
||||
tradingEngine.current.episode.distanceToEvent.closeOrder.value++
|
||||
tradingEngine.tradingCurrent.episode.distanceToEvent.closeOrder.value++
|
||||
}
|
||||
}
|
||||
}
|
||||
+47
-47
@@ -52,22 +52,22 @@ exports.newSuperalgosBotModulesTradingOrders = function (processIndex) {
|
||||
|
||||
function mantainReset(mantain, reset) {
|
||||
|
||||
if (tradingEngine.current.strategy.index.value === tradingEngine.current.strategy.index.config.initialValue) { return }
|
||||
if (tradingEngine.tradingCurrent.strategy.index.value === tradingEngine.tradingCurrent.strategy.index.config.initialValue) { return }
|
||||
|
||||
let stageNode
|
||||
let executionNode
|
||||
|
||||
stageNode = tradingSystem.tradingStrategies[tradingEngine.current.strategy.index.value].openStage
|
||||
stageNode = tradingSystem.tradingStrategies[tradingEngine.tradingCurrent.strategy.index.value].openStage
|
||||
|
||||
if (stageNode !== undefined) { // The Open Stage is optional. It might be undefined.
|
||||
executionNode = stageNode.openExecution
|
||||
processExecutionNode(executionNode, tradingEngine.current.strategyOpenStage.status.value)
|
||||
processExecutionNode(executionNode, tradingEngine.tradingCurrent.strategyOpenStage.status.value)
|
||||
}
|
||||
|
||||
stageNode = tradingSystem.tradingStrategies[tradingEngine.current.strategy.index.value].closeStage
|
||||
stageNode = tradingSystem.tradingStrategies[tradingEngine.tradingCurrent.strategy.index.value].closeStage
|
||||
if (stageNode !== undefined) { // The Close Stage is optional. It might be undefined.
|
||||
executionNode = stageNode.closeExecution
|
||||
processExecutionNode(executionNode, tradingEngine.current.strategyCloseStage.status.value)
|
||||
processExecutionNode(executionNode, tradingEngine.tradingCurrent.strategyCloseStage.status.value)
|
||||
}
|
||||
|
||||
function processExecutionNode(executionNode, stageStatus) {
|
||||
@@ -121,7 +121,7 @@ exports.newSuperalgosBotModulesTradingOrders = function (processIndex) {
|
||||
case 'Not Open': {
|
||||
{
|
||||
/* During the First cycle we can not create new orders. That is reserved for the Second cycle. */
|
||||
if (tradingEngine.current.episode.cycle.value === 'First') { continue }
|
||||
if (tradingEngine.tradingCurrent.episode.cycle.value === 'First') { continue }
|
||||
/* When the stage is closing we can not create new orders */
|
||||
if (tradingEngineStage.status.value === 'Closing') { continue }
|
||||
/*
|
||||
@@ -156,7 +156,7 @@ exports.newSuperalgosBotModulesTradingOrders = function (processIndex) {
|
||||
}
|
||||
case 'Open': {
|
||||
/* During the Second cycle we can not cancel orders. That is reserved for the First cycle. */
|
||||
if (tradingEngine.current.episode.cycle.value === 'Second') { continue }
|
||||
if (tradingEngine.tradingCurrent.episode.cycle.value === 'Second') { continue }
|
||||
|
||||
/* Simulate Events that happens at the Exchange, if needed. */
|
||||
simulateCheckExchangeEvents(tradingEngineStage, tradingSystemOrder, tradingEngineOrder)
|
||||
@@ -354,17 +354,17 @@ exports.newSuperalgosBotModulesTradingOrders = function (processIndex) {
|
||||
tradingEngineStage.stageQuotedAsset.sizePlaced.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(tradingEngineStage.stageQuotedAsset.sizePlaced.value, 10)
|
||||
|
||||
/* Updating Episode Counters */
|
||||
tradingEngine.current.episode.episodeCounters.orders.value++
|
||||
tradingEngine.tradingCurrent.episode.episodeCounters.orders.value++
|
||||
|
||||
/* Initialize this */
|
||||
tradingEngine.current.episode.distanceToEvent.createOrder.value = 1
|
||||
tradingEngine.tradingCurrent.episode.distanceToEvent.createOrder.value = 1
|
||||
|
||||
/* Create Order Procedure */
|
||||
tradingEngineOrder.status.value = 'Open'
|
||||
tradingEngineOrder.identifier.value = TS.projects.superalgos.utilities.miscellaneousFunctions.genereteUniqueId()
|
||||
tradingEngineOrder.begin.value = tradingEngine.current.episode.cycle.begin.value
|
||||
tradingEngineOrder.end.value = tradingEngine.current.episode.cycle.end.value
|
||||
tradingEngineOrder.serialNumber.value = tradingEngine.current.episode.episodeCounters.orders.value
|
||||
tradingEngineOrder.begin.value = tradingEngine.tradingCurrent.episode.cycle.begin.value
|
||||
tradingEngineOrder.end.value = tradingEngine.tradingCurrent.episode.cycle.end.value
|
||||
tradingEngineOrder.serialNumber.value = tradingEngine.tradingCurrent.episode.episodeCounters.orders.value
|
||||
tradingEngineOrder.orderName.value = tradingSystemOrder.name
|
||||
tradingEngineOrder.algorithmName.value = executionAlgorithm.name
|
||||
tradingEngineOrder.situationName.value = situationName
|
||||
@@ -390,7 +390,7 @@ exports.newSuperalgosBotModulesTradingOrders = function (processIndex) {
|
||||
For Market Orders, the rate is irrelevant, since it is not sent to the Exchange.
|
||||
We store at this field the last know price as a reference.
|
||||
*/
|
||||
tradingEngineOrder.rate.value = tradingEngine.current.episode.candle.close.value
|
||||
tradingEngineOrder.rate.value = tradingEngine.tradingCurrent.episode.candle.close.value
|
||||
}
|
||||
}
|
||||
|
||||
@@ -529,7 +529,7 @@ exports.newSuperalgosBotModulesTradingOrders = function (processIndex) {
|
||||
switch (true) {
|
||||
case tradingSystemOrder.type === 'Market Buy Order' || tradingSystemOrder.type === 'Limit Buy Order': {
|
||||
if (
|
||||
tradingEngine.current.episode.episodeQuotedAsset.balance.value - tradingEngineOrder.orderQuotedAsset.size.value < 0
|
||||
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.balance.value - tradingEngineOrder.orderQuotedAsset.size.value < 0
|
||||
) {
|
||||
const message = 'Possible Negative Balance'
|
||||
let docs = {
|
||||
@@ -540,26 +540,26 @@ exports.newSuperalgosBotModulesTradingOrders = function (processIndex) {
|
||||
}
|
||||
contextInfo = {
|
||||
orderQuotedAssetSize: tradingEngineOrder.orderQuotedAsset.size.value,
|
||||
episodeQuotedAssetBalance: tradingEngine.current.episode.episodeQuotedAsset.balance.value
|
||||
episodeQuotedAssetBalance: tradingEngine.tradingCurrent.episode.episodeQuotedAsset.balance.value
|
||||
}
|
||||
TS.projects.superalgos.utilities.docsFunctions.buildPlaceholder(docs, undefined, undefined, undefined, undefined, undefined, contextInfo)
|
||||
|
||||
tradingSystem.addWarning(
|
||||
[
|
||||
[tradingEngine.current.episode.episodeQuotedAsset.balance.id, tradingEngineOrder.orderQuotedAsset.size.id],
|
||||
[tradingEngine.tradingCurrent.episode.episodeQuotedAsset.balance.id, tradingEngineOrder.orderQuotedAsset.size.id],
|
||||
message,
|
||||
docs
|
||||
]
|
||||
)
|
||||
|
||||
tradingEngineOrder.orderQuotedAsset.size.value = tradingEngine.current.episode.episodeQuotedAsset.balance.value
|
||||
tradingEngineOrder.orderQuotedAsset.size.value = tradingEngine.tradingCurrent.episode.episodeQuotedAsset.balance.value
|
||||
tradingEngineOrder.orderBaseAsset.size.value = tradingEngineOrder.orderQuotedAsset.size.value / tradingEngineOrder.rate.value
|
||||
}
|
||||
break
|
||||
}
|
||||
case tradingSystemOrder.type === 'Market Sell Order' || tradingSystemOrder.type === 'Limit Sell Order': {
|
||||
if (
|
||||
tradingEngine.current.episode.episodeBaseAsset.balance.value - tradingEngineOrder.orderBaseAsset.size.value < 0
|
||||
tradingEngine.tradingCurrent.episode.episodeBaseAsset.balance.value - tradingEngineOrder.orderBaseAsset.size.value < 0
|
||||
) {
|
||||
const message = 'Possible Negative Balance'
|
||||
let docs = {
|
||||
@@ -570,19 +570,19 @@ exports.newSuperalgosBotModulesTradingOrders = function (processIndex) {
|
||||
}
|
||||
contextInfo = {
|
||||
orderBaseAssetSize: tradingEngineOrder.orderBaseAsset.size.value,
|
||||
episodeBaseAssetBalance: tradingEngine.current.episode.episodeBaseAsset.balance.value
|
||||
episodeBaseAssetBalance: tradingEngine.tradingCurrent.episode.episodeBaseAsset.balance.value
|
||||
}
|
||||
TS.projects.superalgos.utilities.docsFunctions.buildPlaceholder(docs, undefined, undefined, undefined, undefined, undefined, contextInfo)
|
||||
|
||||
tradingSystem.addWarning(
|
||||
[
|
||||
[tradingEngine.current.episode.episodeBaseAsset.balance.id, tradingEngineOrder.orderBaseAsset.size.id],
|
||||
[tradingEngine.tradingCurrent.episode.episodeBaseAsset.balance.id, tradingEngineOrder.orderBaseAsset.size.id],
|
||||
message,
|
||||
docs
|
||||
]
|
||||
)
|
||||
|
||||
tradingEngineOrder.orderBaseAsset.size.value = tradingEngine.current.episode.episodeBaseAsset.balance.value
|
||||
tradingEngineOrder.orderBaseAsset.size.value = tradingEngine.tradingCurrent.episode.episodeBaseAsset.balance.value
|
||||
tradingEngineOrder.orderQuotedAsset.size.value = tradingEngineOrder.orderBaseAsset.size.value * tradingEngineOrder.rate.value
|
||||
}
|
||||
break
|
||||
@@ -674,7 +674,7 @@ exports.newSuperalgosBotModulesTradingOrders = function (processIndex) {
|
||||
tradingEngineOrder.exitType.value = 'Filled'
|
||||
|
||||
/* Initialize this */
|
||||
tradingEngine.current.episode.distanceToEvent.closeOrder.value = 1
|
||||
tradingEngine.tradingCurrent.episode.distanceToEvent.closeOrder.value = 1
|
||||
|
||||
await updateEndsWithCycle(tradingEngineOrder)
|
||||
|
||||
@@ -701,7 +701,7 @@ exports.newSuperalgosBotModulesTradingOrders = function (processIndex) {
|
||||
tradingEngineOrder.status.value = 'Closed'
|
||||
tradingEngineOrder.exitType.value = 'Closed at the Exchange'
|
||||
/* Initialize this */
|
||||
tradingEngine.current.episode.distanceToEvent.closeOrder.value = 1
|
||||
tradingEngine.tradingCurrent.episode.distanceToEvent.closeOrder.value = 1
|
||||
|
||||
await updateEndsWithCycle(tradingEngineOrder)
|
||||
|
||||
@@ -737,7 +737,7 @@ exports.newSuperalgosBotModulesTradingOrders = function (processIndex) {
|
||||
tradingEngineOrder.exitType.value = 'Cancelled at the Exchange'
|
||||
}
|
||||
/* Initialize this */
|
||||
tradingEngine.current.episode.distanceToEvent.closeOrder.value = 1
|
||||
tradingEngine.tradingCurrent.episode.distanceToEvent.closeOrder.value = 1
|
||||
|
||||
await updateEndsWithCycle(tradingEngineOrder)
|
||||
|
||||
@@ -808,7 +808,7 @@ exports.newSuperalgosBotModulesTradingOrders = function (processIndex) {
|
||||
tradingEngineOrder.exitType.value = 'Filled'
|
||||
|
||||
/* Initialize this */
|
||||
tradingEngine.current.episode.distanceToEvent.closeOrder.value = 1
|
||||
tradingEngine.tradingCurrent.episode.distanceToEvent.closeOrder.value = 1
|
||||
|
||||
updateEndsWithCycle(tradingEngineOrder)
|
||||
|
||||
@@ -961,24 +961,24 @@ exports.newSuperalgosBotModulesTradingOrders = function (processIndex) {
|
||||
case tradingSystemOrder.type === 'Market Sell Order' || tradingSystemOrder.type === 'Limit Sell Order': {
|
||||
|
||||
/* Balance Base Asset: Undo the previous accounting */
|
||||
tradingEngine.current.episode.episodeBaseAsset.balance.value =
|
||||
tradingEngine.current.episode.episodeBaseAsset.balance.value +
|
||||
tradingEngine.tradingCurrent.episode.episodeBaseAsset.balance.value =
|
||||
tradingEngine.tradingCurrent.episode.episodeBaseAsset.balance.value +
|
||||
previousBaseAssetSizeFilled
|
||||
|
||||
/* Balance Base Asset: Account the current filling and fees */
|
||||
tradingEngine.current.episode.episodeBaseAsset.balance.value =
|
||||
tradingEngine.current.episode.episodeBaseAsset.balance.value -
|
||||
tradingEngine.tradingCurrent.episode.episodeBaseAsset.balance.value =
|
||||
tradingEngine.tradingCurrent.episode.episodeBaseAsset.balance.value -
|
||||
tradingEngineOrder.orderBaseAsset.sizeFilled.value
|
||||
|
||||
/* Balance Quoted Asset: Undo the previous accounting */
|
||||
tradingEngine.current.episode.episodeQuotedAsset.balance.value =
|
||||
tradingEngine.current.episode.episodeQuotedAsset.balance.value -
|
||||
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.balance.value =
|
||||
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.balance.value -
|
||||
previousQuotedAssetSizeFilled +
|
||||
previousQuotedAssetFeesPaid
|
||||
|
||||
/* Balance Quoted Asset: Account the current filling and fees */
|
||||
tradingEngine.current.episode.episodeQuotedAsset.balance.value =
|
||||
tradingEngine.current.episode.episodeQuotedAsset.balance.value +
|
||||
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.balance.value =
|
||||
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.balance.value +
|
||||
tradingEngineOrder.orderQuotedAsset.sizeFilled.value -
|
||||
tradingEngineOrder.orderQuotedAsset.feesPaid.value
|
||||
break
|
||||
@@ -989,31 +989,31 @@ exports.newSuperalgosBotModulesTradingOrders = function (processIndex) {
|
||||
case tradingSystemOrder.type === 'Market Buy Order' || tradingSystemOrder.type === 'Limit Buy Order': {
|
||||
|
||||
/* Balance Base Asset: Undo the previous accounting */
|
||||
tradingEngine.current.episode.episodeBaseAsset.balance.value =
|
||||
tradingEngine.current.episode.episodeBaseAsset.balance.value -
|
||||
tradingEngine.tradingCurrent.episode.episodeBaseAsset.balance.value =
|
||||
tradingEngine.tradingCurrent.episode.episodeBaseAsset.balance.value -
|
||||
previousBaseAssetSizeFilled +
|
||||
previousBaseAssetFeesPaid
|
||||
|
||||
/* Balance Base Asset: Account the current filling and fees */
|
||||
tradingEngine.current.episode.episodeBaseAsset.balance.value =
|
||||
tradingEngine.current.episode.episodeBaseAsset.balance.value +
|
||||
tradingEngine.tradingCurrent.episode.episodeBaseAsset.balance.value =
|
||||
tradingEngine.tradingCurrent.episode.episodeBaseAsset.balance.value +
|
||||
tradingEngineOrder.orderBaseAsset.sizeFilled.value -
|
||||
tradingEngineOrder.orderBaseAsset.feesPaid.value
|
||||
|
||||
/* Balance Quoted Asset: Undo the previous accounting */
|
||||
tradingEngine.current.episode.episodeQuotedAsset.balance.value =
|
||||
tradingEngine.current.episode.episodeQuotedAsset.balance.value +
|
||||
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.balance.value =
|
||||
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.balance.value +
|
||||
previousQuotedAssetSizeFilled
|
||||
|
||||
/* Balance Quoted Asset: Account the current filling and fees */
|
||||
tradingEngine.current.episode.episodeQuotedAsset.balance.value =
|
||||
tradingEngine.current.episode.episodeQuotedAsset.balance.value -
|
||||
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.balance.value =
|
||||
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.balance.value -
|
||||
tradingEngineOrder.orderQuotedAsset.sizeFilled.value
|
||||
break
|
||||
}
|
||||
}
|
||||
tradingEngine.current.episode.episodeBaseAsset.balance.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(tradingEngine.current.episode.episodeBaseAsset.balance.value, 10)
|
||||
tradingEngine.current.episode.episodeQuotedAsset.balance.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(tradingEngine.current.episode.episodeQuotedAsset.balance.value, 10)
|
||||
tradingEngine.tradingCurrent.episode.episodeBaseAsset.balance.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(tradingEngine.tradingCurrent.episode.episodeBaseAsset.balance.value, 10)
|
||||
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.balance.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(tradingEngine.tradingCurrent.episode.episodeQuotedAsset.balance.value, 10)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1040,7 +1040,7 @@ exports.newSuperalgosBotModulesTradingOrders = function (processIndex) {
|
||||
tradingEngineOrder.exitType.value = exitType
|
||||
|
||||
/* Initialize this */
|
||||
tradingEngine.current.episode.distanceToEvent.closeOrder.value = 1
|
||||
tradingEngine.tradingCurrent.episode.distanceToEvent.closeOrder.value = 1
|
||||
|
||||
updateEndsWithCycle(tradingEngineOrder)
|
||||
|
||||
@@ -1122,7 +1122,7 @@ exports.newSuperalgosBotModulesTradingOrders = function (processIndex) {
|
||||
tradingEngineOrder.status.value = 'Closed'
|
||||
|
||||
/* Initialize this */
|
||||
tradingEngine.current.episode.distanceToEvent.closeOrder.value = 1
|
||||
tradingEngine.tradingCurrent.episode.distanceToEvent.closeOrder.value = 1
|
||||
|
||||
await updateEndsWithCycle(tradingEngineOrder)
|
||||
|
||||
@@ -1238,12 +1238,12 @@ exports.newSuperalgosBotModulesTradingOrders = function (processIndex) {
|
||||
|
||||
function updateEnds(tradingEngineOrder) {
|
||||
if (tradingEngineOrder.status.value === 'Open') {
|
||||
tradingEngineOrder.end.value = tradingEngine.current.episode.candle.end.value
|
||||
tradingEngineOrder.end.value = tradingEngine.tradingCurrent.episode.candle.end.value
|
||||
}
|
||||
}
|
||||
|
||||
async function updateEndsWithCycle(tradingEngineOrder) {
|
||||
tradingEngineOrder.end.value = tradingEngine.current.episode.cycle.end.value
|
||||
tradingEngineOrder.end.value = tradingEngine.tradingCurrent.episode.cycle.end.value
|
||||
}
|
||||
|
||||
function updateCounters(tradingEngineOrder) {
|
||||
|
||||
+114
-114
@@ -52,36 +52,36 @@ exports.newSuperalgosBotModulesTradingPosition = function (processIndex) {
|
||||
function openPosition(situationName) {
|
||||
|
||||
/* Starting begin and end */
|
||||
tradingEngine.current.position.begin.value = tradingEngine.current.episode.cycle.lastBegin.value
|
||||
tradingEngine.current.position.end.value = tradingEngine.current.episode.cycle.lastEnd.value
|
||||
tradingEngine.tradingCurrent.position.begin.value = tradingEngine.tradingCurrent.episode.cycle.lastBegin.value
|
||||
tradingEngine.tradingCurrent.position.end.value = tradingEngine.tradingCurrent.episode.cycle.lastEnd.value
|
||||
|
||||
/* Recording the opening at the Trading Engine Data Structure */
|
||||
tradingEngine.current.position.status.value = 'Open'
|
||||
tradingEngine.current.position.serialNumber.value = tradingEngine.current.episode.episodeCounters.positions.value + 1
|
||||
tradingEngine.current.position.identifier.value = TS.projects.superalgos.utilities.miscellaneousFunctions.genereteUniqueId()
|
||||
tradingEngine.current.position.beginRate.value = tradingEngine.current.episode.candle.close.value
|
||||
tradingEngine.current.position.positionBaseAsset.beginBalance.value = tradingEngine.current.episode.episodeBaseAsset.balance.value
|
||||
tradingEngine.current.position.positionQuotedAsset.beginBalance.value = tradingEngine.current.episode.episodeQuotedAsset.balance.value
|
||||
tradingEngine.current.position.situationName.value = situationName
|
||||
tradingEngine.tradingCurrent.position.status.value = 'Open'
|
||||
tradingEngine.tradingCurrent.position.serialNumber.value = tradingEngine.tradingCurrent.episode.episodeCounters.positions.value + 1
|
||||
tradingEngine.tradingCurrent.position.identifier.value = TS.projects.superalgos.utilities.miscellaneousFunctions.genereteUniqueId()
|
||||
tradingEngine.tradingCurrent.position.beginRate.value = tradingEngine.tradingCurrent.episode.candle.close.value
|
||||
tradingEngine.tradingCurrent.position.positionBaseAsset.beginBalance.value = tradingEngine.tradingCurrent.episode.episodeBaseAsset.balance.value
|
||||
tradingEngine.tradingCurrent.position.positionQuotedAsset.beginBalance.value = tradingEngine.tradingCurrent.episode.episodeQuotedAsset.balance.value
|
||||
tradingEngine.tradingCurrent.position.situationName.value = situationName
|
||||
|
||||
/* Initializing Stop and Take Phase */
|
||||
tradingEngine.current.position.stopLoss.stopLossPhase.value = 1
|
||||
tradingEngine.current.position.takeProfit.takeProfitPhase.value = 1
|
||||
tradingEngine.tradingCurrent.position.stopLoss.stopLossPhase.value = 1
|
||||
tradingEngine.tradingCurrent.position.takeProfit.takeProfitPhase.value = 1
|
||||
|
||||
/* Updating Episode Counters */
|
||||
tradingEngine.current.episode.episodeCounters.positions.value++
|
||||
tradingEngine.tradingCurrent.episode.episodeCounters.positions.value++
|
||||
|
||||
/* Inicializing this counter */
|
||||
tradingEngine.current.episode.distanceToEvent.takePosition.value = 1
|
||||
tradingEngine.tradingCurrent.episode.distanceToEvent.takePosition.value = 1
|
||||
|
||||
/* Remember the balance we had before taking the position to later calculate profit or loss */
|
||||
tradingEngine.current.position.positionBaseAsset.beginBalance = tradingEngine.current.episode.episodeBaseAsset.balance.value
|
||||
tradingEngine.current.position.positionQuotedAsset.beginBalance = tradingEngine.current.episode.episodeQuotedAsset.balance.value
|
||||
tradingEngine.tradingCurrent.position.positionBaseAsset.beginBalance = tradingEngine.tradingCurrent.episode.episodeBaseAsset.balance.value
|
||||
tradingEngine.tradingCurrent.position.positionQuotedAsset.beginBalance = tradingEngine.tradingCurrent.episode.episodeQuotedAsset.balance.value
|
||||
}
|
||||
|
||||
function closingPosition(exitType) {
|
||||
tradingEngine.current.position.status.value = 'Closing'
|
||||
tradingEngine.current.position.exitType.value = exitType
|
||||
tradingEngine.tradingCurrent.position.status.value = 'Closing'
|
||||
tradingEngine.tradingCurrent.position.exitType.value = exitType
|
||||
|
||||
/*
|
||||
By the time we figured out that the stop loss or take profit were hit, or
|
||||
@@ -89,51 +89,51 @@ exports.newSuperalgosBotModulesTradingPosition = function (processIndex) {
|
||||
stop loss values for the next candle have already been calculated. In order
|
||||
to avoid being plotted, we will put them in zero.
|
||||
*/
|
||||
tradingEngine.current.position.stopLoss.value = 0
|
||||
tradingEngine.current.position.takeProfit.value = 0
|
||||
tradingEngine.tradingCurrent.position.stopLoss.value = 0
|
||||
tradingEngine.tradingCurrent.position.takeProfit.value = 0
|
||||
}
|
||||
|
||||
function closePosition() {
|
||||
tradingEngine.current.position.status.value = 'Closed'
|
||||
tradingEngine.current.position.end.value = tradingEngine.current.episode.cycle.lastEnd.value
|
||||
tradingEngine.current.position.endRate.value = tradingEngine.current.episode.candle.close.value
|
||||
tradingEngine.current.position.positionBaseAsset.endBalance.value = tradingEngine.current.episode.episodeBaseAsset.balance.value
|
||||
tradingEngine.current.position.positionQuotedAsset.endBalance.value = tradingEngine.current.episode.episodeQuotedAsset.balance.value
|
||||
tradingEngine.tradingCurrent.position.status.value = 'Closed'
|
||||
tradingEngine.tradingCurrent.position.end.value = tradingEngine.tradingCurrent.episode.cycle.lastEnd.value
|
||||
tradingEngine.tradingCurrent.position.endRate.value = tradingEngine.tradingCurrent.episode.candle.close.value
|
||||
tradingEngine.tradingCurrent.position.positionBaseAsset.endBalance.value = tradingEngine.tradingCurrent.episode.episodeBaseAsset.balance.value
|
||||
tradingEngine.tradingCurrent.position.positionQuotedAsset.endBalance.value = tradingEngine.tradingCurrent.episode.episodeQuotedAsset.balance.value
|
||||
|
||||
/*
|
||||
Now that the position is closed, it is the right time to move this position from current to last at the Trading Engine data structure.
|
||||
*/
|
||||
TS.projects.superalgos.globals.processModuleObjects.MODULE_OBJECTS_BY_PROCESS_INDEX_MAP.get(processIndex).TRADING_ENGINE_MODULE_OBJECT.cloneValues(tradingEngine.current.position, tradingEngine.last.position)
|
||||
TS.projects.superalgos.globals.processModuleObjects.MODULE_OBJECTS_BY_PROCESS_INDEX_MAP.get(processIndex).TRADING_ENGINE_MODULE_OBJECT.cloneValues(tradingEngine.tradingCurrent.position, tradingEngine.last.position)
|
||||
|
||||
cycleBasedStatistics()
|
||||
|
||||
/* Updating Hits & Fails */
|
||||
if (tradingEngine.current.position.positionBaseAsset.profitLoss.value > 0) {
|
||||
tradingEngine.current.episode.episodeBaseAsset.hits.value++
|
||||
if (tradingEngine.tradingCurrent.position.positionBaseAsset.profitLoss.value > 0) {
|
||||
tradingEngine.tradingCurrent.episode.episodeBaseAsset.hits.value++
|
||||
}
|
||||
if (tradingEngine.current.position.positionBaseAsset.profitLoss.value < 0) {
|
||||
tradingEngine.current.episode.episodeBaseAsset.fails.value++
|
||||
if (tradingEngine.tradingCurrent.position.positionBaseAsset.profitLoss.value < 0) {
|
||||
tradingEngine.tradingCurrent.episode.episodeBaseAsset.fails.value++
|
||||
}
|
||||
if (tradingEngine.current.position.positionQuotedAsset.profitLoss.value > 0) {
|
||||
tradingEngine.current.episode.episodeQuotedAsset.hits.value++
|
||||
if (tradingEngine.tradingCurrent.position.positionQuotedAsset.profitLoss.value > 0) {
|
||||
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.hits.value++
|
||||
}
|
||||
if (tradingEngine.current.position.positionQuotedAsset.profitLoss.value < 0) {
|
||||
tradingEngine.current.episode.episodeQuotedAsset.fails.value++
|
||||
if (tradingEngine.tradingCurrent.position.positionQuotedAsset.profitLoss.value < 0) {
|
||||
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.fails.value++
|
||||
}
|
||||
}
|
||||
|
||||
function applyStopLossFormula(formulas, formulaId) {
|
||||
updateStopLossTakeProfitFinalValue(tradingEngine.current.position.stopLoss)
|
||||
tradingEngine.current.position.stopLoss.value = formulas.get(formulaId)
|
||||
updateStopLossTakeProfitInitialValue(tradingEngine.current.position.stopLoss)
|
||||
updateStopLossTakeProfitBeginEnd(tradingEngine.current.position.stopLoss)
|
||||
updateStopLossTakeProfitFinalValue(tradingEngine.tradingCurrent.position.stopLoss)
|
||||
tradingEngine.tradingCurrent.position.stopLoss.value = formulas.get(formulaId)
|
||||
updateStopLossTakeProfitInitialValue(tradingEngine.tradingCurrent.position.stopLoss)
|
||||
updateStopLossTakeProfitBeginEnd(tradingEngine.tradingCurrent.position.stopLoss)
|
||||
}
|
||||
|
||||
function applyTakeProfitFormula(formulas, formulaId) {
|
||||
updateStopLossTakeProfitFinalValue(tradingEngine.current.position.takeProfit)
|
||||
tradingEngine.current.position.takeProfit.value = formulas.get(formulaId)
|
||||
updateStopLossTakeProfitInitialValue(tradingEngine.current.position.takeProfit)
|
||||
updateStopLossTakeProfitBeginEnd(tradingEngine.current.position.takeProfit)
|
||||
updateStopLossTakeProfitFinalValue(tradingEngine.tradingCurrent.position.takeProfit)
|
||||
tradingEngine.tradingCurrent.position.takeProfit.value = formulas.get(formulaId)
|
||||
updateStopLossTakeProfitInitialValue(tradingEngine.tradingCurrent.position.takeProfit)
|
||||
updateStopLossTakeProfitBeginEnd(tradingEngine.tradingCurrent.position.takeProfit)
|
||||
}
|
||||
|
||||
function updateStopLossTakeProfitInitialValue(node) {
|
||||
@@ -163,19 +163,19 @@ exports.newSuperalgosBotModulesTradingPosition = function (processIndex) {
|
||||
end of the position itself.
|
||||
*/
|
||||
node.begin.value =
|
||||
tradingEngine.current.episode.candle.begin.value +
|
||||
tradingEngine.tradingCurrent.episode.candle.begin.value +
|
||||
sessionParameters.timeFrame.config.value
|
||||
node.end.value =
|
||||
tradingEngine.current.episode.candle.end.value +
|
||||
tradingEngine.tradingCurrent.episode.candle.end.value +
|
||||
sessionParameters.timeFrame.config.value
|
||||
}
|
||||
|
||||
function updateStopLoss(phase) {
|
||||
tradingEngine.current.position.stopLoss.stopLossPhase.value = phase
|
||||
tradingEngine.tradingCurrent.position.stopLoss.stopLossPhase.value = phase
|
||||
}
|
||||
|
||||
function updateTakeProfit(phase) {
|
||||
tradingEngine.current.position.takeProfit.takeProfitPhase.value = phase
|
||||
tradingEngine.tradingCurrent.position.takeProfit.takeProfitPhase.value = phase
|
||||
}
|
||||
|
||||
function initialTargets(tradingSystemStageNode, tradingEngineStageNode) {
|
||||
@@ -252,11 +252,11 @@ exports.newSuperalgosBotModulesTradingPosition = function (processIndex) {
|
||||
|
||||
switch (tradingSystemStageNode.type) {
|
||||
case 'Open Stage': {
|
||||
tradingEngine.current.position.entryTargetRate.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(value, 10)
|
||||
tradingEngine.tradingCurrent.position.entryTargetRate.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(value, 10)
|
||||
break
|
||||
}
|
||||
case 'Close Stage': {
|
||||
tradingEngine.current.position.exitTargetRate.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(value, 10)
|
||||
tradingEngine.tradingCurrent.position.exitTargetRate.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(value, 10)
|
||||
break
|
||||
}
|
||||
}
|
||||
@@ -312,15 +312,15 @@ exports.newSuperalgosBotModulesTradingPosition = function (processIndex) {
|
||||
|
||||
switch (tradingSystemStageNode.type) {
|
||||
case 'Open Stage': {
|
||||
tradingEngine.current.position.positionBaseAsset.entryTargetSize.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(value, 10)
|
||||
tradingEngine.current.position.positionQuotedAsset.entryTargetSize.value =
|
||||
TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(value * tradingEngine.current.position.entryTargetRate.value, 10)
|
||||
tradingEngine.tradingCurrent.position.positionBaseAsset.entryTargetSize.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(value, 10)
|
||||
tradingEngine.tradingCurrent.position.positionQuotedAsset.entryTargetSize.value =
|
||||
TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(value * tradingEngine.tradingCurrent.position.entryTargetRate.value, 10)
|
||||
break
|
||||
}
|
||||
case 'Close Stage': {
|
||||
tradingEngine.current.position.positionBaseAsset.exitTargetSize.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(value, 10)
|
||||
tradingEngine.current.position.positionQuotedAsset.exitTargetSize.value =
|
||||
TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(value * tradingEngine.current.position.exitTargetRate.value, 10)
|
||||
tradingEngine.tradingCurrent.position.positionBaseAsset.exitTargetSize.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(value, 10)
|
||||
tradingEngine.tradingCurrent.position.positionQuotedAsset.exitTargetSize.value =
|
||||
TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(value * tradingEngine.tradingCurrent.position.exitTargetRate.value, 10)
|
||||
break
|
||||
}
|
||||
}
|
||||
@@ -371,15 +371,15 @@ exports.newSuperalgosBotModulesTradingPosition = function (processIndex) {
|
||||
}
|
||||
switch (tradingSystemStageNode.type) {
|
||||
case 'Open Stage': {
|
||||
tradingEngine.current.position.positionQuotedAsset.entryTargetSize.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(value, 10)
|
||||
tradingEngine.current.position.positionBaseAsset.entryTargetSize.value =
|
||||
TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(value / tradingEngine.current.position.entryTargetRate.value, 10)
|
||||
tradingEngine.tradingCurrent.position.positionQuotedAsset.entryTargetSize.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(value, 10)
|
||||
tradingEngine.tradingCurrent.position.positionBaseAsset.entryTargetSize.value =
|
||||
TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(value / tradingEngine.tradingCurrent.position.entryTargetRate.value, 10)
|
||||
break
|
||||
}
|
||||
case 'Close Stage': {
|
||||
tradingEngine.current.position.positionQuotedAsset.exitTargetSize.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(value, 10)
|
||||
tradingEngine.current.position.positionBaseAsset.exitTargetSize.value =
|
||||
TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(value / tradingEngine.current.position.exitTargetRate.value, 10)
|
||||
tradingEngine.tradingCurrent.position.positionQuotedAsset.exitTargetSize.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(value, 10)
|
||||
tradingEngine.tradingCurrent.position.positionBaseAsset.exitTargetSize.value =
|
||||
TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(value / tradingEngine.tradingCurrent.position.exitTargetRate.value, 10)
|
||||
break
|
||||
}
|
||||
}
|
||||
@@ -403,23 +403,23 @@ exports.newSuperalgosBotModulesTradingPosition = function (processIndex) {
|
||||
}
|
||||
|
||||
function updateEnds() {
|
||||
if (tradingEngine.current.position.status.value === 'Open') {
|
||||
tradingEngine.current.position.end.value = tradingEngine.current.position.end.value + sessionParameters.timeFrame.config.value
|
||||
tradingEngine.current.position.endRate.value = tradingEngine.current.episode.candle.close.value
|
||||
tradingEngine.current.position.positionBaseAsset.endBalance.value = tradingEngine.current.episode.episodeBaseAsset.balance.value
|
||||
tradingEngine.current.position.positionQuotedAsset.endBalance.value = tradingEngine.current.episode.episodeQuotedAsset.balance.value
|
||||
if (tradingEngine.tradingCurrent.position.status.value === 'Open') {
|
||||
tradingEngine.tradingCurrent.position.end.value = tradingEngine.tradingCurrent.position.end.value + sessionParameters.timeFrame.config.value
|
||||
tradingEngine.tradingCurrent.position.endRate.value = tradingEngine.tradingCurrent.episode.candle.close.value
|
||||
tradingEngine.tradingCurrent.position.positionBaseAsset.endBalance.value = tradingEngine.tradingCurrent.episode.episodeBaseAsset.balance.value
|
||||
tradingEngine.tradingCurrent.position.positionQuotedAsset.endBalance.value = tradingEngine.tradingCurrent.episode.episodeQuotedAsset.balance.value
|
||||
}
|
||||
}
|
||||
|
||||
function resetTradingEngineDataStructure() {
|
||||
if (tradingEngine.current.position.status.value === 'Closed') {
|
||||
TS.projects.superalgos.globals.processModuleObjects.MODULE_OBJECTS_BY_PROCESS_INDEX_MAP.get(processIndex).TRADING_ENGINE_MODULE_OBJECT.initializeNode(tradingEngine.current.position)
|
||||
if (tradingEngine.tradingCurrent.position.status.value === 'Closed') {
|
||||
TS.projects.superalgos.globals.processModuleObjects.MODULE_OBJECTS_BY_PROCESS_INDEX_MAP.get(processIndex).TRADING_ENGINE_MODULE_OBJECT.initializeNode(tradingEngine.tradingCurrent.position)
|
||||
}
|
||||
}
|
||||
|
||||
function updateCounters() {
|
||||
if (tradingEngine.current.position.status.value === 'Open') {
|
||||
tradingEngine.current.position.positionCounters.periods.value++
|
||||
if (tradingEngine.tradingCurrent.position.status.value === 'Open') {
|
||||
tradingEngine.tradingCurrent.position.positionCounters.periods.value++
|
||||
}
|
||||
}
|
||||
|
||||
@@ -430,89 +430,89 @@ exports.newSuperalgosBotModulesTradingPosition = function (processIndex) {
|
||||
|
||||
function calculateAssetsStatistics() {
|
||||
/* Profit Loss Calculation */
|
||||
tradingEngine.current.position.positionBaseAsset.profitLoss.value =
|
||||
tradingEngine.current.episode.episodeBaseAsset.balance.value -
|
||||
tradingEngine.current.position.positionBaseAsset.beginBalance
|
||||
tradingEngine.tradingCurrent.position.positionBaseAsset.profitLoss.value =
|
||||
tradingEngine.tradingCurrent.episode.episodeBaseAsset.balance.value -
|
||||
tradingEngine.tradingCurrent.position.positionBaseAsset.beginBalance
|
||||
|
||||
tradingEngine.current.position.positionQuotedAsset.profitLoss.value =
|
||||
tradingEngine.current.episode.episodeQuotedAsset.balance.value -
|
||||
tradingEngine.current.position.positionQuotedAsset.beginBalance
|
||||
tradingEngine.tradingCurrent.position.positionQuotedAsset.profitLoss.value =
|
||||
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.balance.value -
|
||||
tradingEngine.tradingCurrent.position.positionQuotedAsset.beginBalance
|
||||
|
||||
tradingEngine.current.position.positionBaseAsset.profitLoss.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(tradingEngine.current.position.positionBaseAsset.profitLoss.value, 10)
|
||||
tradingEngine.current.position.positionQuotedAsset.profitLoss.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(tradingEngine.current.position.positionQuotedAsset.profitLoss.value, 10)
|
||||
tradingEngine.tradingCurrent.position.positionBaseAsset.profitLoss.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(tradingEngine.tradingCurrent.position.positionBaseAsset.profitLoss.value, 10)
|
||||
tradingEngine.tradingCurrent.position.positionQuotedAsset.profitLoss.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(tradingEngine.tradingCurrent.position.positionQuotedAsset.profitLoss.value, 10)
|
||||
|
||||
/* ROI Calculation */
|
||||
tradingEngine.current.position.positionBaseAsset.ROI.value =
|
||||
tradingEngine.current.position.positionBaseAsset.profitLoss.value * 100 /
|
||||
tradingEngine.current.strategyOpenStage.stageBaseAsset.targetSize.value
|
||||
tradingEngine.tradingCurrent.position.positionBaseAsset.ROI.value =
|
||||
tradingEngine.tradingCurrent.position.positionBaseAsset.profitLoss.value * 100 /
|
||||
tradingEngine.tradingCurrent.strategyOpenStage.stageBaseAsset.targetSize.value
|
||||
|
||||
tradingEngine.current.position.positionQuotedAsset.ROI.value =
|
||||
tradingEngine.current.position.positionQuotedAsset.profitLoss.value * 100 /
|
||||
tradingEngine.current.strategyOpenStage.stageQuotedAsset.targetSize.value
|
||||
tradingEngine.tradingCurrent.position.positionQuotedAsset.ROI.value =
|
||||
tradingEngine.tradingCurrent.position.positionQuotedAsset.profitLoss.value * 100 /
|
||||
tradingEngine.tradingCurrent.strategyOpenStage.stageQuotedAsset.targetSize.value
|
||||
|
||||
tradingEngine.current.position.positionBaseAsset.ROI.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(tradingEngine.current.position.positionBaseAsset.ROI.value, 10)
|
||||
tradingEngine.current.position.positionQuotedAsset.ROI.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(tradingEngine.current.position.positionQuotedAsset.ROI.value, 10)
|
||||
tradingEngine.tradingCurrent.position.positionBaseAsset.ROI.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(tradingEngine.tradingCurrent.position.positionBaseAsset.ROI.value, 10)
|
||||
tradingEngine.tradingCurrent.position.positionQuotedAsset.ROI.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(tradingEngine.tradingCurrent.position.positionQuotedAsset.ROI.value, 10)
|
||||
|
||||
/* Hit Fail Calculation */
|
||||
if (tradingEngine.current.position.positionBaseAsset.ROI.value > 0) {
|
||||
tradingEngine.current.position.positionBaseAsset.hitFail.value = 'Hit'
|
||||
if (tradingEngine.tradingCurrent.position.positionBaseAsset.ROI.value > 0) {
|
||||
tradingEngine.tradingCurrent.position.positionBaseAsset.hitFail.value = 'Hit'
|
||||
}
|
||||
if (tradingEngine.current.position.positionBaseAsset.ROI.value < 0) {
|
||||
tradingEngine.current.position.positionBaseAsset.hitFail.value = 'Fail'
|
||||
if (tradingEngine.tradingCurrent.position.positionBaseAsset.ROI.value < 0) {
|
||||
tradingEngine.tradingCurrent.position.positionBaseAsset.hitFail.value = 'Fail'
|
||||
}
|
||||
if (tradingEngine.current.position.positionBaseAsset.ROI.value === 0) {
|
||||
tradingEngine.current.position.positionBaseAsset.hitFail.value = 'Even'
|
||||
if (tradingEngine.tradingCurrent.position.positionBaseAsset.ROI.value === 0) {
|
||||
tradingEngine.tradingCurrent.position.positionBaseAsset.hitFail.value = 'Even'
|
||||
}
|
||||
if (tradingEngine.current.position.positionQuotedAsset.ROI.value > 0) {
|
||||
tradingEngine.current.position.positionQuotedAsset.hitFail.value = 'Hit'
|
||||
if (tradingEngine.tradingCurrent.position.positionQuotedAsset.ROI.value > 0) {
|
||||
tradingEngine.tradingCurrent.position.positionQuotedAsset.hitFail.value = 'Hit'
|
||||
}
|
||||
if (tradingEngine.current.position.positionQuotedAsset.ROI.value < 0) {
|
||||
tradingEngine.current.position.positionQuotedAsset.hitFail.value = 'Fail'
|
||||
if (tradingEngine.tradingCurrent.position.positionQuotedAsset.ROI.value < 0) {
|
||||
tradingEngine.tradingCurrent.position.positionQuotedAsset.hitFail.value = 'Fail'
|
||||
}
|
||||
if (tradingEngine.current.position.positionQuotedAsset.ROI.value === 0) {
|
||||
tradingEngine.current.position.positionQuotedAsset.hitFail.value = 'Even'
|
||||
if (tradingEngine.tradingCurrent.position.positionQuotedAsset.ROI.value === 0) {
|
||||
tradingEngine.tradingCurrent.position.positionQuotedAsset.hitFail.value = 'Even'
|
||||
}
|
||||
}
|
||||
|
||||
function calculatePositionStatistics() {
|
||||
/* Profit Loss Calculation */
|
||||
tradingEngine.current.position.positionStatistics.profitLoss.value =
|
||||
tradingEngine.tradingCurrent.position.positionStatistics.profitLoss.value =
|
||||
(
|
||||
tradingEngine.current.episode.episodeBaseAsset.profitLoss.value * tradingEngine.current.position.endRate.value +
|
||||
tradingEngine.current.episode.episodeQuotedAsset.profitLoss.value
|
||||
tradingEngine.tradingCurrent.episode.episodeBaseAsset.profitLoss.value * tradingEngine.tradingCurrent.position.endRate.value +
|
||||
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.profitLoss.value
|
||||
)
|
||||
|
||||
tradingEngine.current.position.positionStatistics.profitLoss.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(tradingEngine.current.position.positionStatistics.profitLoss.value, 10)
|
||||
tradingEngine.tradingCurrent.position.positionStatistics.profitLoss.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(tradingEngine.tradingCurrent.position.positionStatistics.profitLoss.value, 10)
|
||||
|
||||
/* ROI Calculation */
|
||||
tradingEngine.current.position.positionStatistics.ROI.value =
|
||||
tradingEngine.tradingCurrent.position.positionStatistics.ROI.value =
|
||||
(
|
||||
tradingEngine.current.position.positionStatistics.profitLoss.value
|
||||
tradingEngine.tradingCurrent.position.positionStatistics.profitLoss.value
|
||||
)
|
||||
* 100 /
|
||||
(
|
||||
tradingEngine.current.position.positionBaseAsset.beginBalance * tradingEngine.current.position.beginRate.value +
|
||||
tradingEngine.current.position.positionQuotedAsset.beginBalance
|
||||
tradingEngine.tradingCurrent.position.positionBaseAsset.beginBalance * tradingEngine.tradingCurrent.position.beginRate.value +
|
||||
tradingEngine.tradingCurrent.position.positionQuotedAsset.beginBalance
|
||||
)
|
||||
tradingEngine.current.position.positionStatistics.ROI.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(tradingEngine.current.position.positionStatistics.ROI.value, 10)
|
||||
tradingEngine.tradingCurrent.position.positionStatistics.ROI.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(tradingEngine.tradingCurrent.position.positionStatistics.ROI.value, 10)
|
||||
|
||||
/* Hit Fail Calculation */
|
||||
if (tradingEngine.current.position.positionStatistics.ROI.value > 0) {
|
||||
tradingEngine.current.position.positionStatistics.hitFail.value = 'Hit'
|
||||
if (tradingEngine.tradingCurrent.position.positionStatistics.ROI.value > 0) {
|
||||
tradingEngine.tradingCurrent.position.positionStatistics.hitFail.value = 'Hit'
|
||||
}
|
||||
if (tradingEngine.current.position.positionStatistics.ROI.value < 0) {
|
||||
tradingEngine.current.position.positionStatistics.hitFail.value = 'Fail'
|
||||
if (tradingEngine.tradingCurrent.position.positionStatistics.ROI.value < 0) {
|
||||
tradingEngine.tradingCurrent.position.positionStatistics.hitFail.value = 'Fail'
|
||||
}
|
||||
if (tradingEngine.current.position.positionStatistics.ROI.value === 0) {
|
||||
tradingEngine.current.position.positionStatistics.hitFail.value = 'Even'
|
||||
if (tradingEngine.tradingCurrent.position.positionStatistics.ROI.value === 0) {
|
||||
tradingEngine.tradingCurrent.position.positionStatistics.hitFail.value = 'Even'
|
||||
}
|
||||
|
||||
/* Days Calculation */
|
||||
tradingEngine.current.position.positionStatistics.days.value =
|
||||
tradingEngine.current.position.positionCounters.periods.value *
|
||||
tradingEngine.tradingCurrent.position.positionStatistics.days.value =
|
||||
tradingEngine.tradingCurrent.position.positionCounters.periods.value *
|
||||
sessionParameters.timeFrame.config.value / TS.projects.superalgos.globals.timeConstants.ONE_DAY_IN_MILISECONDS
|
||||
|
||||
tradingEngine.current.position.positionStatistics.days.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(tradingEngine.current.position.positionStatistics.days.value, 10)
|
||||
tradingEngine.tradingCurrent.position.positionStatistics.days.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(tradingEngine.tradingCurrent.position.positionStatistics.days.value, 10)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+4
-4
@@ -57,7 +57,7 @@
|
||||
This variable tell us which day we are standing at, specially while working
|
||||
with Daily Files. From this Date is that we are going to load the Daily Files.
|
||||
*/
|
||||
TS.projects.superalgos.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).SIMULATION_STATE.tradingEngine.current.episode.processDate.value =
|
||||
TS.projects.superalgos.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).SIMULATION_STATE.tradingEngine.tradingCurrent.episode.processDate.value =
|
||||
TS.projects.superalgos.utilities.dateTimeFunctions.removeTime(TS.projects.superalgos.globals.processConstants.CONSTANTS_BY_PROCESS_INDEX_MAP.get(processIndex).SESSION_NODE.tradingParameters.timeRange.config.initialDatetime).valueOf()
|
||||
}
|
||||
|
||||
@@ -70,7 +70,7 @@
|
||||
the simulation loop, once we discover that all candles from a certain date have benn processed.
|
||||
Here is the point where we sync one and the other.
|
||||
*/
|
||||
let tradingProcessDate = TS.projects.superalgos.utilities.dateTimeFunctions.removeTime(TS.projects.superalgos.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).SIMULATION_STATE.tradingEngine.current.episode.processDate.value)
|
||||
let tradingProcessDate = TS.projects.superalgos.utilities.dateTimeFunctions.removeTime(TS.projects.superalgos.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).SIMULATION_STATE.tradingEngine.tradingCurrent.episode.processDate.value)
|
||||
|
||||
if (
|
||||
await TS.projects.superalgos.functionLibraries.dataDependenciesFunctions.processSingleFiles(
|
||||
@@ -151,7 +151,7 @@
|
||||
use it to save Output Files and later the Data Ranges. This is the point where
|
||||
the date calculated by the Simulation is applied at the Trading Process Level.
|
||||
*/
|
||||
tradingProcessDate = TS.projects.superalgos.utilities.dateTimeFunctions.removeTime(TS.projects.superalgos.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).SIMULATION_STATE.tradingEngine.current.episode.processDate.value)
|
||||
tradingProcessDate = TS.projects.superalgos.utilities.dateTimeFunctions.removeTime(TS.projects.superalgos.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).SIMULATION_STATE.tradingEngine.tradingCurrent.episode.processDate.value)
|
||||
|
||||
if (checkStopTaskGracefully() === false) { break }
|
||||
if (checkStopProcessing() === false) { break }
|
||||
@@ -240,7 +240,7 @@
|
||||
indicators to be built and continue the processing once this process is called
|
||||
again.
|
||||
*/
|
||||
if (TS.projects.superalgos.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).SIMULATION_STATE.tradingEngine.current.episode.headOfTheMarket.value === true) {
|
||||
if (TS.projects.superalgos.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).SIMULATION_STATE.tradingEngine.tradingCurrent.episode.headOfTheMarket.value === true) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
+4
-4
@@ -58,13 +58,13 @@ exports.newSuperalgosBotModulesTradingRecords = function (processIndex) {
|
||||
There are a few products configured to be saved only at an specific cycle.
|
||||
*/
|
||||
if (product.config.saveAtCycle !== undefined) {
|
||||
if (tradingEngine.current.episode.cycle.value !== product.config.saveAtCycle) {
|
||||
if (tradingEngine.tradingCurrent.episode.cycle.value !== product.config.saveAtCycle) {
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
/* Clean the file from information of previous executions */
|
||||
//pruneOutputFile(product, outputDatasetArray, tradingEngine.current.episode.candle.end.value)
|
||||
//pruneOutputFile(product, outputDatasetArray, tradingEngine.tradingCurrent.episode.candle.end.value)
|
||||
|
||||
/* Clean Open Records */
|
||||
if (product.config.saveAsObjects === true) {
|
||||
@@ -256,8 +256,8 @@ exports.newSuperalgosBotModulesTradingRecords = function (processIndex) {
|
||||
of the day? Easy: the end of the candle must be 1 millisecod before the next day. That happens at any
|
||||
time frame.
|
||||
*/
|
||||
let currentDay = new Date(tradingEngine.current.episode.candle.end.value)
|
||||
let nextDay = new Date(tradingEngine.current.episode.candle.end.value + 1)
|
||||
let currentDay = new Date(tradingEngine.tradingCurrent.episode.candle.end.value)
|
||||
let nextDay = new Date(tradingEngine.tradingCurrent.episode.candle.end.value + 1)
|
||||
if (currentDay.getUTCDate() !== nextDay.getUTCDate()) {
|
||||
/*
|
||||
We will save the object only if it is closed, becasuse we are at the last candle of the day.
|
||||
|
||||
+35
-35
@@ -55,7 +55,7 @@ exports.newSuperalgosBotModulesTradingSimulation = function (processIndex) {
|
||||
let dailyCandles = []
|
||||
for (let i = 0; i < candles.length; i++) {
|
||||
let candle = candles[i]
|
||||
if (candle.begin >= TS.projects.superalgos.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).SIMULATION_STATE.tradingEngine.current.episode.processDate.value) {
|
||||
if (candle.begin >= TS.projects.superalgos.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).SIMULATION_STATE.tradingEngine.tradingCurrent.episode.processDate.value) {
|
||||
dailyCandles.push(candle)
|
||||
}
|
||||
}
|
||||
@@ -99,7 +99,7 @@ exports.newSuperalgosBotModulesTradingSimulation = function (processIndex) {
|
||||
In this case we already have at the last candle index the next candle to be
|
||||
processed. We will just continue with this candle.
|
||||
*/
|
||||
initialCandle = tradingEngine.current.episode.candle.index.value
|
||||
initialCandle = tradingEngine.tradingCurrent.episode.candle.index.value
|
||||
}
|
||||
/*
|
||||
Main Simulation Loop
|
||||
@@ -113,7 +113,7 @@ exports.newSuperalgosBotModulesTradingSimulation = function (processIndex) {
|
||||
loop is not empty, then the lascCandle() check will override this value
|
||||
depending on if we really are at the head of the market or not.
|
||||
*/
|
||||
tradingEngine.current.episode.headOfTheMarket.value = true
|
||||
tradingEngine.tradingCurrent.episode.headOfTheMarket.value = true
|
||||
/*
|
||||
This is the main simulation loop. It will go through the initial candle
|
||||
until one less than the last candle available. We will never process the last
|
||||
@@ -121,10 +121,10 @@ exports.newSuperalgosBotModulesTradingSimulation = function (processIndex) {
|
||||
that still can change. So effectively will be processing all closed candles.
|
||||
*/
|
||||
for (let i = initialCandle; i < candles.length - 1; i++) {
|
||||
tradingEngine.current.episode.candle.index.value = i
|
||||
tradingEngine.tradingCurrent.episode.candle.index.value = i
|
||||
|
||||
/* This is the current candle the Simulation is working at. */
|
||||
let candle = candles[tradingEngine.current.episode.candle.index.value]
|
||||
let candle = candles[tradingEngine.tradingCurrent.episode.candle.index.value]
|
||||
|
||||
TS.projects.superalgos.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
|
||||
'[INFO] runSimulation -> loop -> Candle Begin @ ' + (new Date(candle.begin)).toUTCString())
|
||||
@@ -210,7 +210,7 @@ exports.newSuperalgosBotModulesTradingSimulation = function (processIndex) {
|
||||
tradingEpisodeModuleObject.reset()
|
||||
TS.projects.superalgos.globals.processModuleObjects.MODULE_OBJECTS_BY_PROCESS_INDEX_MAP.get(processIndex).TRADING_ENGINE_MODULE_OBJECT.reset()
|
||||
|
||||
let infoMessage = 'Processing candle # ' + tradingEngine.current.episode.candle.index.value + ' @ the ' + tradingEngine.current.episode.cycle.value + ' cycle.'
|
||||
let infoMessage = 'Processing candle # ' + tradingEngine.tradingCurrent.episode.candle.index.value + ' @ the ' + tradingEngine.tradingCurrent.episode.cycle.value + ' cycle.'
|
||||
TS.projects.superalgos.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
|
||||
'[INFO] runSimulation -> loop -> ' + infoMessage)
|
||||
|
||||
@@ -222,8 +222,8 @@ exports.newSuperalgosBotModulesTradingSimulation = function (processIndex) {
|
||||
}
|
||||
|
||||
contextInfo = {
|
||||
candleIndex: tradingEngine.current.episode.candle.index.value,
|
||||
cycle: tradingEngine.current.episode.cycle.value
|
||||
candleIndex: tradingEngine.tradingCurrent.episode.candle.index.value,
|
||||
cycle: tradingEngine.tradingCurrent.episode.cycle.value
|
||||
}
|
||||
TS.projects.superalgos.utilities.docsFunctions.buildPlaceholder(docs, undefined, undefined, undefined, undefined, undefined, contextInfo)
|
||||
|
||||
@@ -302,7 +302,7 @@ exports.newSuperalgosBotModulesTradingSimulation = function (processIndex) {
|
||||
if (sessionParameters.heartbeats.config.date === true || sessionParameters.heartbeats.config.candleIndex === true) {
|
||||
/* We will produce a simulation level heartbeat in order to inform the user this is running. */
|
||||
|
||||
heartBeatDate = new Date(Math.trunc(tradingEngine.current.episode.candle.begin.value / TS.projects.superalgos.globals.timeConstants.ONE_DAY_IN_MILISECONDS) * TS.projects.superalgos.globals.timeConstants.ONE_DAY_IN_MILISECONDS)
|
||||
heartBeatDate = new Date(Math.trunc(tradingEngine.tradingCurrent.episode.candle.begin.value / TS.projects.superalgos.globals.timeConstants.ONE_DAY_IN_MILISECONDS) * TS.projects.superalgos.globals.timeConstants.ONE_DAY_IN_MILISECONDS)
|
||||
|
||||
let fromDate = new Date(sessionParameters.timeRange.config.initialDatetime)
|
||||
let lastDate = new Date(sessionParameters.timeRange.config.finalDatetime)
|
||||
@@ -320,7 +320,7 @@ exports.newSuperalgosBotModulesTradingSimulation = function (processIndex) {
|
||||
let processingDate = heartBeatDate.getUTCFullYear() + '-' + TS.projects.superalgos.utilities.miscellaneousFunctions.pad(heartBeatDate.getUTCMonth() + 1, 2) + '-' + TS.projects.superalgos.utilities.miscellaneousFunctions.pad(heartBeatDate.getUTCDate(), 2)
|
||||
|
||||
TS.projects.superalgos.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
|
||||
'[INFO] runSimulation -> loop -> Simulation ' + TS.projects.superalgos.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).SESSION_KEY + ' Loop # ' + tradingEngine.current.episode.candle.index.value + ' @ ' + processingDate)
|
||||
'[INFO] runSimulation -> loop -> Simulation ' + TS.projects.superalgos.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).SESSION_KEY + ' Loop # ' + tradingEngine.tradingCurrent.episode.candle.index.value + ' @ ' + processingDate)
|
||||
|
||||
/* Logging to console and disk */
|
||||
if (TS.projects.superalgos.utilities.dateTimeFunctions.areTheseDatesEqual(currentDate, new Date()) === false) {
|
||||
@@ -344,7 +344,7 @@ exports.newSuperalgosBotModulesTradingSimulation = function (processIndex) {
|
||||
if (sessionParameters.heartbeats.config.date === true) {
|
||||
hartbeatText = hartbeatText + currentDateString
|
||||
}
|
||||
hartbeatText = hartbeatText + ' Candle # ' + tradingEngine.current.episode.candle.index.value
|
||||
hartbeatText = hartbeatText + ' Candle # ' + tradingEngine.tradingCurrent.episode.candle.index.value
|
||||
TS.projects.superalgos.functionLibraries.processFunctions.processHeartBeat(processIndex, hartbeatText, percentage)
|
||||
}
|
||||
}
|
||||
@@ -448,15 +448,15 @@ exports.newSuperalgosBotModulesTradingSimulation = function (processIndex) {
|
||||
for (let i = 0; i < pArray.length; i++) {
|
||||
element = pArray[i]
|
||||
|
||||
if (tradingEngine.current.episode.candle.end.value === element.end) { // when there is an exact match at the end we take that element
|
||||
if (tradingEngine.tradingCurrent.episode.candle.end.value === element.end) { // when there is an exact match at the end we take that element
|
||||
return element
|
||||
} else {
|
||||
if (
|
||||
i > 0 &&
|
||||
element.end > tradingEngine.current.episode.candle.end.value
|
||||
element.end > tradingEngine.tradingCurrent.episode.candle.end.value
|
||||
) {
|
||||
let previousElement = pArray[i - 1]
|
||||
if (previousElement.end < tradingEngine.current.episode.candle.end.value) {
|
||||
if (previousElement.end < tradingEngine.tradingCurrent.episode.candle.end.value) {
|
||||
return previousElement // If one elements goes into the future of currentCandle, then we stop and take the previous element.
|
||||
} else {
|
||||
return
|
||||
@@ -485,7 +485,7 @@ exports.newSuperalgosBotModulesTradingSimulation = function (processIndex) {
|
||||
The second +1 is because we need to compare the next candle (remember that the loops allways avoid the
|
||||
last candle of the dataset available.)
|
||||
*/
|
||||
if (tradingEngine.current.episode.candle.index.value + 1 + 1 === candles.length) {
|
||||
if (tradingEngine.tradingCurrent.episode.candle.index.value + 1 + 1 === candles.length) {
|
||||
/*
|
||||
When processing daily files, we need a mechanism to turn from one day to the next one.
|
||||
That mechanism is the one implemented here. If we detect that the next candle is the last candle of
|
||||
@@ -495,7 +495,7 @@ exports.newSuperalgosBotModulesTradingSimulation = function (processIndex) {
|
||||
let candlesPerDay = TS.projects.superalgos.globals.timeConstants.ONE_DAY_IN_MILISECONDS / sessionParameters.timeFrame.config.value
|
||||
if (
|
||||
TS.projects.superalgos.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).TRADING_PROCESSING_DAILY_FILES &&
|
||||
tradingEngine.current.episode.candle.index.value + 1 + 1 === candlesPerDay
|
||||
tradingEngine.tradingCurrent.episode.candle.index.value + 1 + 1 === candlesPerDay
|
||||
) {
|
||||
/*
|
||||
Here we found that the next candle of the dataset is the last candle of the day.
|
||||
@@ -504,9 +504,9 @@ exports.newSuperalgosBotModulesTradingSimulation = function (processIndex) {
|
||||
the first candle of the new dataset we shall receive. The first candle of the next day starts
|
||||
at index 0, so we will position the index now at zero.
|
||||
*/
|
||||
tradingEngine.current.episode.candle.index.value = 0
|
||||
tradingEngine.current.episode.processDate.value =
|
||||
tradingEngine.current.episode.processDate.value + TS.projects.superalgos.globals.timeConstants.ONE_DAY_IN_MILISECONDS
|
||||
tradingEngine.tradingCurrent.episode.candle.index.value = 0
|
||||
tradingEngine.tradingCurrent.episode.processDate.value =
|
||||
tradingEngine.tradingCurrent.episode.processDate.value + TS.projects.superalgos.globals.timeConstants.ONE_DAY_IN_MILISECONDS
|
||||
return false
|
||||
}
|
||||
|
||||
@@ -516,21 +516,21 @@ exports.newSuperalgosBotModulesTradingSimulation = function (processIndex) {
|
||||
next execution it will likely have more candles at the dataset. And if it does not,
|
||||
it will just wait there until it does.
|
||||
*/
|
||||
tradingEngine.current.episode.headOfTheMarket.value = true
|
||||
tradingEngine.current.episode.candle.index.value++
|
||||
tradingEngine.tradingCurrent.episode.headOfTheMarket.value = true
|
||||
tradingEngine.tradingCurrent.episode.candle.index.value++
|
||||
return false
|
||||
} else {
|
||||
|
||||
/* Wd did not reach the head of the market */
|
||||
tradingEngine.current.episode.headOfTheMarket.value = false
|
||||
tradingEngine.current.episode.candle.index.value++
|
||||
tradingEngine.tradingCurrent.episode.headOfTheMarket.value = false
|
||||
tradingEngine.tradingCurrent.episode.candle.index.value++
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
function checkInitialDatetime() {
|
||||
/* Here we check that the current candle is not before the initial datetime defined at the session parameters.*/
|
||||
if (tradingEngine.current.episode.candle.end.value < sessionParameters.timeRange.config.initialDatetime) {
|
||||
if (tradingEngine.tradingCurrent.episode.candle.end.value < sessionParameters.timeRange.config.initialDatetime) {
|
||||
TS.projects.superalgos.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
|
||||
'[INFO] runSimulation -> checkInitialAndFinalDatetime -> Skipping Candle before the sessionParameters.timeRange.config.initialDatetime.')
|
||||
return false
|
||||
@@ -540,7 +540,7 @@ exports.newSuperalgosBotModulesTradingSimulation = function (processIndex) {
|
||||
|
||||
function checkFinalDatetime() {
|
||||
/* Here we check that the next candle is not after of the user-defined final datetime at the session parameters.*/
|
||||
if (tradingEngine.current.episode.candle.begin.value + sessionParameters.timeFrame.config.value > sessionParameters.timeRange.config.finalDatetime) {
|
||||
if (tradingEngine.tradingCurrent.episode.candle.begin.value + sessionParameters.timeFrame.config.value > sessionParameters.timeRange.config.finalDatetime) {
|
||||
TS.projects.superalgos.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
|
||||
'[INFO] runSimulation -> checkInitialAndFinalDatetime -> Skipping Candle after the sessionParameters.timeRange.config.finalDatetime.')
|
||||
return false
|
||||
@@ -551,17 +551,17 @@ exports.newSuperalgosBotModulesTradingSimulation = function (processIndex) {
|
||||
function checkMinimunAndMaximunBalance() {
|
||||
/* Checks for Minimun and Maximun Balance. We do the check while not inside any strategy only. */
|
||||
if (
|
||||
tradingEngine.current.strategy.index.value === tradingEngine.current.strategy.index.config.initialValue
|
||||
tradingEngine.tradingCurrent.strategy.index.value === tradingEngine.tradingCurrent.strategy.index.config.initialValue
|
||||
) {
|
||||
/*
|
||||
We will perform this check only when we are not inside a position,
|
||||
because there the balances have shifted from their resting position.
|
||||
*/
|
||||
|
||||
let stopRunningDate = (new Date(tradingEngine.current.episode.candle.begin.value)).toUTCString()
|
||||
let stopRunningDate = (new Date(tradingEngine.tradingCurrent.episode.candle.begin.value)).toUTCString()
|
||||
|
||||
if (sessionParameters.sessionBaseAsset.config.minimumBalance !== undefined) {
|
||||
if (tradingEngine.current.episode.episodeBaseAsset.balance.value <= sessionParameters.sessionBaseAsset.config.minimumBalance) {
|
||||
if (tradingEngine.tradingCurrent.episode.episodeBaseAsset.balance.value <= sessionParameters.sessionBaseAsset.config.minimumBalance) {
|
||||
const errorMessage = 'Min Balance reached @ ' + stopRunningDate
|
||||
|
||||
let docs = {
|
||||
@@ -573,7 +573,7 @@ exports.newSuperalgosBotModulesTradingSimulation = function (processIndex) {
|
||||
|
||||
let contextInfo = {
|
||||
timestamp: stopRunningDate,
|
||||
episodeBaseAssetBalance: tradingEngine.current.episode.episodeBaseAsset.balance.value,
|
||||
episodeBaseAssetBalance: tradingEngine.tradingCurrent.episode.episodeBaseAsset.balance.value,
|
||||
sessionBaseAssetMinimumBalance: sessionParameters.sessionBaseAsset.config.minimumBalance
|
||||
}
|
||||
|
||||
@@ -587,7 +587,7 @@ exports.newSuperalgosBotModulesTradingSimulation = function (processIndex) {
|
||||
}
|
||||
|
||||
if (sessionParameters.sessionBaseAsset.config.maximumBalance !== undefined) {
|
||||
if (tradingEngine.current.episode.episodeBaseAsset.balance.value >= sessionParameters.sessionBaseAsset.config.maximumBalance) {
|
||||
if (tradingEngine.tradingCurrent.episode.episodeBaseAsset.balance.value >= sessionParameters.sessionBaseAsset.config.maximumBalance) {
|
||||
const errorMessage = 'Max Balance reached @ ' + stopRunningDate
|
||||
|
||||
let docs = {
|
||||
@@ -599,7 +599,7 @@ exports.newSuperalgosBotModulesTradingSimulation = function (processIndex) {
|
||||
|
||||
let contextInfo = {
|
||||
timestamp: stopRunningDate,
|
||||
episodeBaseAssetBalance: tradingEngine.current.episode.episodeBaseAsset.balance.value,
|
||||
episodeBaseAssetBalance: tradingEngine.tradingCurrent.episode.episodeBaseAsset.balance.value,
|
||||
sessionBaseAssetMaximumBalance: sessionParameters.sessionBaseAsset.config.maximumBalance
|
||||
}
|
||||
|
||||
@@ -613,7 +613,7 @@ exports.newSuperalgosBotModulesTradingSimulation = function (processIndex) {
|
||||
}
|
||||
|
||||
if (sessionParameters.sessionQuotedAsset.config.minimumBalance !== undefined) {
|
||||
if (tradingEngine.current.episode.episodeQuotedAsset.balance.value <= sessionParameters.sessionQuotedAsset.config.minimumBalance) {
|
||||
if (tradingEngine.tradingCurrent.episode.episodeQuotedAsset.balance.value <= sessionParameters.sessionQuotedAsset.config.minimumBalance) {
|
||||
const errorMessage = 'Min Balance reached @ ' + stopRunningDate
|
||||
|
||||
let docs = {
|
||||
@@ -625,7 +625,7 @@ exports.newSuperalgosBotModulesTradingSimulation = function (processIndex) {
|
||||
|
||||
let contextInfo = {
|
||||
timestamp: stopRunningDate,
|
||||
episodeQuotedAssetBalance: tradingEngine.current.episode.episodeQuotedAsset.balance.value,
|
||||
episodeQuotedAssetBalance: tradingEngine.tradingCurrent.episode.episodeQuotedAsset.balance.value,
|
||||
sessionQuotedAssetMinimumBalance: sessionParameters.sessionQuotedAsset.config.minimumBalance
|
||||
}
|
||||
|
||||
@@ -639,7 +639,7 @@ exports.newSuperalgosBotModulesTradingSimulation = function (processIndex) {
|
||||
}
|
||||
|
||||
if (sessionParameters.sessionQuotedAsset.config.maximumBalance !== undefined) {
|
||||
if (tradingEngine.current.episode.episodeQuotedAsset.balance.value >= sessionParameters.sessionQuotedAsset.config.maximumBalance) {
|
||||
if (tradingEngine.tradingCurrent.episode.episodeQuotedAsset.balance.value >= sessionParameters.sessionQuotedAsset.config.maximumBalance) {
|
||||
const errorMessage = 'Max Balance reached @ ' + stopRunningDate
|
||||
|
||||
let docs = {
|
||||
@@ -651,7 +651,7 @@ exports.newSuperalgosBotModulesTradingSimulation = function (processIndex) {
|
||||
|
||||
let contextInfo = {
|
||||
timestamp: stopRunningDate,
|
||||
episodeQuotedAssetBalance: tradingEngine.current.episode.episodeQuotedAsset.balance.value,
|
||||
episodeQuotedAssetBalance: tradingEngine.tradingCurrent.episode.episodeQuotedAsset.balance.value,
|
||||
sessionQuotedAssetMaximumBalance: sessionParameters.sessionQuotedAsset.config.maximumBalance
|
||||
}
|
||||
|
||||
|
||||
+134
-134
@@ -107,7 +107,7 @@ exports.newSuperalgosBotModulesTradingStages = function (processIndex) {
|
||||
|
||||
function checkTriggerOn() {
|
||||
if (
|
||||
tradingEngine.current.strategy.index.value === tradingEngine.current.strategy.index.config.initialValue
|
||||
tradingEngine.tradingCurrent.strategy.index.value === tradingEngine.tradingCurrent.strategy.index.config.initialValue
|
||||
) {
|
||||
/*
|
||||
To pick a new strategy we will check that any of the situations of the trigger on is true.
|
||||
@@ -119,7 +119,7 @@ exports.newSuperalgosBotModulesTradingStages = function (processIndex) {
|
||||
|
||||
for (let j = 0; j < tradingSystem.tradingStrategies.length; j++) {
|
||||
if ( // If a strategy was already picked during the loop, we exit the loop
|
||||
tradingEngine.current.strategy.index.value !== tradingEngine.current.strategy.index.config.initialValue
|
||||
tradingEngine.tradingCurrent.strategy.index.value !== tradingEngine.tradingCurrent.strategy.index.config.initialValue
|
||||
) { continue }
|
||||
|
||||
let strategy = tradingSystem.tradingStrategies[j]
|
||||
@@ -145,7 +145,7 @@ exports.newSuperalgosBotModulesTradingStages = function (processIndex) {
|
||||
tradingStrategyModuleObject.openStrategy(j, situation.name, strategy.name)
|
||||
|
||||
/* Initialize this */
|
||||
tradingEngine.current.episode.distanceToEvent.triggerOn.value = 1
|
||||
tradingEngine.tradingCurrent.episode.distanceToEvent.triggerOn.value = 1
|
||||
|
||||
announcementsModuleObject.makeAnnoucements(triggerStage.triggerOn)
|
||||
announcementsModuleObject.makeAnnoucements(triggerStage)
|
||||
@@ -168,9 +168,9 @@ exports.newSuperalgosBotModulesTradingStages = function (processIndex) {
|
||||
}
|
||||
|
||||
function checkTriggerOff() {
|
||||
if (tradingEngine.current.strategyTriggerStage.status.value === 'Open') {
|
||||
if (tradingEngine.tradingCurrent.strategyTriggerStage.status.value === 'Open') {
|
||||
|
||||
let strategy = tradingSystem.tradingStrategies[tradingEngine.current.strategy.index.value]
|
||||
let strategy = tradingSystem.tradingStrategies[tradingEngine.tradingCurrent.strategy.index.value]
|
||||
let triggerStage = strategy.triggerStage
|
||||
|
||||
tradingSystem.evalConditions(strategy, 'Trigger Off Event')
|
||||
@@ -192,7 +192,7 @@ exports.newSuperalgosBotModulesTradingStages = function (processIndex) {
|
||||
tradingSystem.highlights.push(triggerStage.triggerOff.id)
|
||||
tradingSystem.highlights.push(triggerStage.id)
|
||||
|
||||
tradingEngine.current.episode.distanceToEvent.triggerOff.value = 1
|
||||
tradingEngine.tradingCurrent.episode.distanceToEvent.triggerOff.value = 1
|
||||
announcementsModuleObject.makeAnnoucements(triggerStage.triggerOff)
|
||||
changeStageStatus('Trigger Stage', 'Closed', 'Trigger Off Event')
|
||||
tradingStrategyModuleObject.closeStrategy('Trigger Off')
|
||||
@@ -205,9 +205,9 @@ exports.newSuperalgosBotModulesTradingStages = function (processIndex) {
|
||||
|
||||
function checkTakePosition() {
|
||||
if (
|
||||
tradingEngine.current.strategyTriggerStage.status.value === 'Open'
|
||||
tradingEngine.tradingCurrent.strategyTriggerStage.status.value === 'Open'
|
||||
) {
|
||||
let strategy = tradingSystem.tradingStrategies[tradingEngine.current.strategy.index.value]
|
||||
let strategy = tradingSystem.tradingStrategies[tradingEngine.tradingCurrent.strategy.index.value]
|
||||
let triggerStage = strategy.triggerStage
|
||||
|
||||
tradingSystem.evalConditions(strategy, 'Take Position Event')
|
||||
@@ -263,7 +263,7 @@ exports.newSuperalgosBotModulesTradingStages = function (processIndex) {
|
||||
|
||||
function checkIfWeNeedToAbortTheStage() {
|
||||
/* Abort Open Stage Check */
|
||||
if (tradingEngine.current.strategyOpenStage.status.value === 'Open' && tradingEngine.current.strategyCloseStage.status.value === 'Open') {
|
||||
if (tradingEngine.tradingCurrent.strategyOpenStage.status.value === 'Open' && tradingEngine.tradingCurrent.strategyCloseStage.status.value === 'Open') {
|
||||
/*
|
||||
if the Close stage is opened while the open stage is still open that means that
|
||||
we need to stop placing orders, check what happened to the orders already placed,
|
||||
@@ -275,21 +275,21 @@ exports.newSuperalgosBotModulesTradingStages = function (processIndex) {
|
||||
|
||||
function runWhenStatusIsOpening() {
|
||||
/* Opening Status Procedure */
|
||||
if (tradingEngine.current.strategyOpenStage.status.value === 'Opening') {
|
||||
if (tradingEngine.tradingCurrent.strategyOpenStage.status.value === 'Opening') {
|
||||
/*
|
||||
The system allows the user not to define an Open Stage, because the Open Stage is optional.
|
||||
Here we are going to see if that is the case and if it is, we will inmidiatelly consider
|
||||
the Open Stage as closed.
|
||||
*/
|
||||
if (tradingSystem.tradingStrategies[tradingEngine.current.strategy.index.value].openStage === undefined) {
|
||||
if (tradingSystem.tradingStrategies[tradingEngine.tradingCurrent.strategy.index.value].openStage === undefined) {
|
||||
changeStageStatus('Open Stage', 'Closed', 'Open Stage Undefined')
|
||||
changeStageStatus('Close Stage', 'Opening')
|
||||
return
|
||||
}
|
||||
|
||||
/* This procedure is intended to run only once */
|
||||
let tradingSystemStage = tradingSystem.tradingStrategies[tradingEngine.current.strategy.index.value].openStage
|
||||
let tradingEngineStage = tradingEngine.current.strategyOpenStage
|
||||
let tradingSystemStage = tradingSystem.tradingStrategies[tradingEngine.tradingCurrent.strategy.index.value].openStage
|
||||
let tradingEngineStage = tradingEngine.tradingCurrent.strategyOpenStage
|
||||
|
||||
/* Reset the Exchange Orders data structure to its initial value */
|
||||
TS.projects.superalgos.globals.processModuleObjects.MODULE_OBJECTS_BY_PROCESS_INDEX_MAP.get(processIndex).TRADING_ENGINE_MODULE_OBJECT.initializeNode(tradingEngine.exchangeOrders)
|
||||
@@ -306,13 +306,13 @@ exports.newSuperalgosBotModulesTradingStages = function (processIndex) {
|
||||
|
||||
async function runWhenStatusIsOpen() {
|
||||
/* Open Status Procedure */
|
||||
if (tradingEngine.current.strategyOpenStage.status.value === 'Open') {
|
||||
if (tradingEngine.tradingCurrent.strategyOpenStage.status.value === 'Open') {
|
||||
/*
|
||||
While the Open Stage is Open, we do our regular stuff: place orders and check
|
||||
what happened to the orders already placed.
|
||||
*/
|
||||
let tradingSystemStage = tradingSystem.tradingStrategies[tradingEngine.current.strategy.index.value].openStage
|
||||
let tradingEngineStage = tradingEngine.current.strategyOpenStage
|
||||
let tradingSystemStage = tradingSystem.tradingStrategies[tradingEngine.tradingCurrent.strategy.index.value].openStage
|
||||
let tradingEngineStage = tradingEngine.tradingCurrent.strategyOpenStage
|
||||
let executionNode = tradingSystemStage.openExecution
|
||||
|
||||
/* Evaluate conditions and formulas so they are ready during the execution run */
|
||||
@@ -329,12 +329,12 @@ exports.newSuperalgosBotModulesTradingStages = function (processIndex) {
|
||||
|
||||
async function runWhenStatusIsClosing() {
|
||||
/* Closing Status Procedure */
|
||||
if (tradingEngine.current.strategyOpenStage.status.value === 'Closing') {
|
||||
if (tradingEngine.tradingCurrent.strategyOpenStage.status.value === 'Closing') {
|
||||
/*
|
||||
During the closing stage status, we do not place new orders, just check
|
||||
if the ones placed were filled, and cancel the ones not filled.
|
||||
*/
|
||||
let tradingSystemStage = tradingSystem.tradingStrategies[tradingEngine.current.strategy.index.value].openStage
|
||||
let tradingSystemStage = tradingSystem.tradingStrategies[tradingEngine.tradingCurrent.strategy.index.value].openStage
|
||||
let executionNode = tradingSystemStage.openExecution
|
||||
|
||||
/*
|
||||
@@ -346,7 +346,7 @@ exports.newSuperalgosBotModulesTradingStages = function (processIndex) {
|
||||
|
||||
await tradingExecutionModuleObject.runExecution(
|
||||
executionNode,
|
||||
tradingEngine.current.strategyOpenStage
|
||||
tradingEngine.tradingCurrent.strategyOpenStage
|
||||
)
|
||||
|
||||
/*
|
||||
@@ -356,11 +356,11 @@ exports.newSuperalgosBotModulesTradingStages = function (processIndex) {
|
||||
we cancel not yet filled orders. Here it does not matter the targetSize since
|
||||
this status represent a force closure of this stage.
|
||||
*/
|
||||
switch (tradingEngine.current.strategyOpenStage.stageDefinedIn.value) {
|
||||
switch (tradingEngine.tradingCurrent.strategyOpenStage.stageDefinedIn.value) {
|
||||
case 'Base Asset': {
|
||||
if (
|
||||
tradingEngine.current.strategyOpenStage.stageBaseAsset.sizeFilled.value >=
|
||||
tradingEngine.current.strategyOpenStage.stageBaseAsset.sizePlaced.value
|
||||
tradingEngine.tradingCurrent.strategyOpenStage.stageBaseAsset.sizeFilled.value >=
|
||||
tradingEngine.tradingCurrent.strategyOpenStage.stageBaseAsset.sizePlaced.value
|
||||
) {
|
||||
changeStageStatus('Open Stage', 'Closed')
|
||||
}
|
||||
@@ -368,8 +368,8 @@ exports.newSuperalgosBotModulesTradingStages = function (processIndex) {
|
||||
}
|
||||
case 'Quoted Asset': {
|
||||
if (
|
||||
tradingEngine.current.strategyOpenStage.stageQuotedAsset.sizeFilled.value >=
|
||||
tradingEngine.current.strategyOpenStage.stageQuotedAsset.sizePlaced.value
|
||||
tradingEngine.tradingCurrent.strategyOpenStage.stageQuotedAsset.sizeFilled.value >=
|
||||
tradingEngine.tradingCurrent.strategyOpenStage.stageQuotedAsset.sizePlaced.value
|
||||
) {
|
||||
changeStageStatus('Open Stage', 'Closed')
|
||||
}
|
||||
@@ -383,37 +383,37 @@ exports.newSuperalgosBotModulesTradingStages = function (processIndex) {
|
||||
/*
|
||||
Validations that all needed nodes are there.
|
||||
*/
|
||||
if (tradingEngine.current.strategyOpenStage.stageBaseAsset === undefined) { badDefinitionUnhandledException(undefined, 'Stage Base Asset Node Missing', tradingEngine.current.strategyOpenStage) }
|
||||
if (tradingEngine.current.strategyOpenStage.stageBaseAsset.targetSize === undefined) { badDefinitionUnhandledException(undefined, 'Target Size Node Missing', tradingEngine.current.strategyOpenStage.stageBaseAsset) }
|
||||
if (tradingEngine.current.strategyOpenStage.stageQuotedAsset === undefined) { badDefinitionUnhandledException(undefined, 'Stage Quoted Asset Node Missing', tradingEngine.current.strategyOpenStage) }
|
||||
if (tradingEngine.current.strategyOpenStage.stageQuotedAsset.targetSize === undefined) { badDefinitionUnhandledException(undefined, 'Target Size Node Missing', tradingEngine.current.strategyOpenStage.stageQuotedAsset) }
|
||||
if (tradingEngine.tradingCurrent.strategyOpenStage.stageBaseAsset === undefined) { badDefinitionUnhandledException(undefined, 'Stage Base Asset Node Missing', tradingEngine.tradingCurrent.strategyOpenStage) }
|
||||
if (tradingEngine.tradingCurrent.strategyOpenStage.stageBaseAsset.targetSize === undefined) { badDefinitionUnhandledException(undefined, 'Target Size Node Missing', tradingEngine.tradingCurrent.strategyOpenStage.stageBaseAsset) }
|
||||
if (tradingEngine.tradingCurrent.strategyOpenStage.stageQuotedAsset === undefined) { badDefinitionUnhandledException(undefined, 'Stage Quoted Asset Node Missing', tradingEngine.tradingCurrent.strategyOpenStage) }
|
||||
if (tradingEngine.tradingCurrent.strategyOpenStage.stageQuotedAsset.targetSize === undefined) { badDefinitionUnhandledException(undefined, 'Target Size Node Missing', tradingEngine.tradingCurrent.strategyOpenStage.stageQuotedAsset) }
|
||||
/*
|
||||
Here we will transform the position size into targets for each asset of the stage.
|
||||
*/
|
||||
tradingEngine.current.strategyOpenStage.stageBaseAsset.targetSize.value = tradingEngine.current.position.positionBaseAsset.entryTargetSize.value
|
||||
tradingEngine.current.strategyOpenStage.stageQuotedAsset.targetSize.value = tradingEngine.current.position.positionQuotedAsset.entryTargetSize.value
|
||||
tradingEngine.tradingCurrent.strategyOpenStage.stageBaseAsset.targetSize.value = tradingEngine.tradingCurrent.position.positionBaseAsset.entryTargetSize.value
|
||||
tradingEngine.tradingCurrent.strategyOpenStage.stageQuotedAsset.targetSize.value = tradingEngine.tradingCurrent.position.positionQuotedAsset.entryTargetSize.value
|
||||
|
||||
tradingEngine.current.strategyOpenStage.stageBaseAsset.targetSize.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(tradingEngine.current.strategyOpenStage.stageBaseAsset.targetSize.value, 10)
|
||||
tradingEngine.current.strategyOpenStage.stageQuotedAsset.targetSize.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(tradingEngine.current.strategyOpenStage.stageQuotedAsset.targetSize.value, 10)
|
||||
tradingEngine.tradingCurrent.strategyOpenStage.stageBaseAsset.targetSize.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(tradingEngine.tradingCurrent.strategyOpenStage.stageBaseAsset.targetSize.value, 10)
|
||||
tradingEngine.tradingCurrent.strategyOpenStage.stageQuotedAsset.targetSize.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(tradingEngine.tradingCurrent.strategyOpenStage.stageQuotedAsset.targetSize.value, 10)
|
||||
}
|
||||
}
|
||||
|
||||
function runManageStage() {
|
||||
|
||||
if (tradingEngine.current.episode.cycle.value !== 'First') { return }
|
||||
if (tradingEngine.tradingCurrent.episode.cycle.value !== 'First') { return }
|
||||
|
||||
runWhenStatusIsOpening()
|
||||
runWhenStatusIsOpen()
|
||||
|
||||
function runWhenStatusIsOpening() {
|
||||
/* Opening Status Procedure */
|
||||
if (tradingEngine.current.strategyManageStage.status.value === 'Opening') {
|
||||
if (tradingEngine.tradingCurrent.strategyManageStage.status.value === 'Opening') {
|
||||
/*
|
||||
The system allows the user not to define a Manage Stage, because the Manage Stage is optional.
|
||||
Here we are goint to see if that is the case and if it is, we will inmidiatelly consider
|
||||
the Manage Stage as closed.
|
||||
*/
|
||||
if (tradingSystem.tradingStrategies[tradingEngine.current.strategy.index.value].manageStage === undefined) {
|
||||
if (tradingSystem.tradingStrategies[tradingEngine.tradingCurrent.strategy.index.value].manageStage === undefined) {
|
||||
changeStageStatus('Manage Stage', 'Closed', 'Manage Stage Undefined')
|
||||
changeStageStatus('Close Stage', 'Opening')
|
||||
return
|
||||
@@ -426,8 +426,8 @@ exports.newSuperalgosBotModulesTradingStages = function (processIndex) {
|
||||
|
||||
function runWhenStatusIsOpen() {
|
||||
/* Open Status Procedure */
|
||||
if (tradingEngine.current.strategyManageStage.status.value === 'Open') {
|
||||
let strategy = tradingSystem.tradingStrategies[tradingEngine.current.strategy.index.value]
|
||||
if (tradingEngine.tradingCurrent.strategyManageStage.status.value === 'Open') {
|
||||
let strategy = tradingSystem.tradingStrategies[tradingEngine.tradingCurrent.strategy.index.value]
|
||||
let manageStage = strategy.manageStage
|
||||
|
||||
/* Evaluate all the stage conditions and formulas to have them ready */
|
||||
@@ -449,22 +449,22 @@ exports.newSuperalgosBotModulesTradingStages = function (processIndex) {
|
||||
}
|
||||
|
||||
function calculateStopLoss() {
|
||||
let strategy = tradingSystem.tradingStrategies[tradingEngine.current.strategy.index.value]
|
||||
let strategy = tradingSystem.tradingStrategies[tradingEngine.tradingCurrent.strategy.index.value]
|
||||
let manageStage = strategy.manageStage
|
||||
let phase
|
||||
|
||||
if (manageStage !== undefined) {
|
||||
if (manageStage.managedStopLoss !== undefined) {
|
||||
phase = manageStage.managedStopLoss.phases[tradingEngine.current.position.stopLoss.stopLossPhase.value - 1]
|
||||
phase = manageStage.managedStopLoss.phases[tradingEngine.tradingCurrent.position.stopLoss.stopLossPhase.value - 1]
|
||||
}
|
||||
}
|
||||
|
||||
if (phase !== undefined) {
|
||||
if (phase.formula !== undefined) {
|
||||
let previousValue = tradingEngine.current.position.stopLoss.value
|
||||
let previousValue = tradingEngine.tradingCurrent.position.stopLoss.value
|
||||
tradingPositionModuleObject.applyStopLossFormula(tradingSystem.formulas, phase.formula.id)
|
||||
|
||||
if (tradingEngine.current.position.stopLoss.value !== previousValue) {
|
||||
if (tradingEngine.tradingCurrent.position.stopLoss.value !== previousValue) {
|
||||
announcementsModuleObject.makeAnnoucements(phase)
|
||||
}
|
||||
}
|
||||
@@ -472,22 +472,22 @@ exports.newSuperalgosBotModulesTradingStages = function (processIndex) {
|
||||
}
|
||||
|
||||
function calculateTakeProfit() {
|
||||
let strategy = tradingSystem.tradingStrategies[tradingEngine.current.strategy.index.value]
|
||||
let strategy = tradingSystem.tradingStrategies[tradingEngine.tradingCurrent.strategy.index.value]
|
||||
let manageStage = strategy.manageStage
|
||||
let phase
|
||||
|
||||
if (manageStage !== undefined) {
|
||||
if (manageStage.managedTakeProfit !== undefined) {
|
||||
phase = manageStage.managedTakeProfit.phases[tradingEngine.current.position.takeProfit.takeProfitPhase.value - 1]
|
||||
phase = manageStage.managedTakeProfit.phases[tradingEngine.tradingCurrent.position.takeProfit.takeProfitPhase.value - 1]
|
||||
}
|
||||
}
|
||||
|
||||
if (phase !== undefined) {
|
||||
if (phase.formula !== undefined) {
|
||||
let previousValue = tradingEngine.current.position.takeProfit.value
|
||||
let previousValue = tradingEngine.tradingCurrent.position.takeProfit.value
|
||||
tradingPositionModuleObject.applyTakeProfitFormula(tradingSystem.formulas, phase.formula.id)
|
||||
|
||||
if (tradingEngine.current.position.takeProfit.value !== previousValue) {
|
||||
if (tradingEngine.tradingCurrent.position.takeProfit.value !== previousValue) {
|
||||
announcementsModuleObject.makeAnnoucements(phase)
|
||||
}
|
||||
}
|
||||
@@ -501,11 +501,11 @@ exports.newSuperalgosBotModulesTradingStages = function (processIndex) {
|
||||
the first values of the simulation of the Stop Loss we check if it is above or below
|
||||
the Position Rate, and we assign the values Above or Below to it.
|
||||
*/
|
||||
if (tradingEngine.current.position.stopLoss.stopLossPosition.value === tradingEngine.current.position.stopLoss.stopLossPosition.config.initialValue) {
|
||||
if (tradingEngine.current.position.stopLoss.value > tradingEngine.current.position.entryTargetRate.value) {
|
||||
tradingEngine.current.position.stopLoss.stopLossPosition.value = 'Above'
|
||||
if (tradingEngine.tradingCurrent.position.stopLoss.stopLossPosition.value === tradingEngine.tradingCurrent.position.stopLoss.stopLossPosition.config.initialValue) {
|
||||
if (tradingEngine.tradingCurrent.position.stopLoss.value > tradingEngine.tradingCurrent.position.entryTargetRate.value) {
|
||||
tradingEngine.tradingCurrent.position.stopLoss.stopLossPosition.value = 'Above'
|
||||
} else {
|
||||
tradingEngine.current.position.stopLoss.stopLossPosition.value = 'Below'
|
||||
tradingEngine.tradingCurrent.position.stopLoss.stopLossPosition.value = 'Below'
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -517,17 +517,17 @@ exports.newSuperalgosBotModulesTradingStages = function (processIndex) {
|
||||
the first values of the simulation of the Take Profits we check if it is above or below
|
||||
the Position Rates, and we assign the values Above or Below to it.
|
||||
*/
|
||||
if (tradingEngine.current.position.takeProfit.takeProfitPosition.value === tradingEngine.current.position.takeProfit.takeProfitPosition.config.initialValue) {
|
||||
if (tradingEngine.current.position.takeProfit.value > tradingEngine.current.position.entryTargetRate.value) {
|
||||
tradingEngine.current.position.takeProfit.takeProfitPosition.value = 'Above'
|
||||
if (tradingEngine.tradingCurrent.position.takeProfit.takeProfitPosition.value === tradingEngine.tradingCurrent.position.takeProfit.takeProfitPosition.config.initialValue) {
|
||||
if (tradingEngine.tradingCurrent.position.takeProfit.value > tradingEngine.tradingCurrent.position.entryTargetRate.value) {
|
||||
tradingEngine.tradingCurrent.position.takeProfit.takeProfitPosition.value = 'Above'
|
||||
} else {
|
||||
tradingEngine.current.position.takeProfit.takeProfitPosition.value = 'Below'
|
||||
tradingEngine.tradingCurrent.position.takeProfit.takeProfitPosition.value = 'Below'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function checkStopPhasesEvents() {
|
||||
let strategy = tradingSystem.tradingStrategies[tradingEngine.current.strategy.index.value]
|
||||
let strategy = tradingSystem.tradingStrategies[tradingEngine.tradingCurrent.strategy.index.value]
|
||||
let manageStage = strategy.manageStage
|
||||
let parentNode
|
||||
let phaseIndex
|
||||
@@ -537,7 +537,7 @@ exports.newSuperalgosBotModulesTradingStages = function (processIndex) {
|
||||
if (manageStage !== undefined) {
|
||||
if (manageStage.managedStopLoss !== undefined) {
|
||||
parentNode = manageStage
|
||||
phaseIndex = tradingEngine.current.position.stopLoss.stopLossPhase.value - 1
|
||||
phaseIndex = tradingEngine.tradingCurrent.position.stopLoss.stopLossPhase.value - 1
|
||||
stopLoss = manageStage.managedStopLoss
|
||||
phase = stopLoss.phases[phaseIndex]
|
||||
}
|
||||
@@ -567,12 +567,12 @@ exports.newSuperalgosBotModulesTradingStages = function (processIndex) {
|
||||
tradingSystem.highlights.push(parentNode.id)
|
||||
tradingSystem.highlights.push(manageStage.id)
|
||||
|
||||
tradingPositionModuleObject.updateStopLoss(tradingEngine.current.position.stopLoss.stopLossPhase.value + 1)
|
||||
tradingPositionModuleObject.updateStopLoss(tradingEngine.tradingCurrent.position.stopLoss.stopLossPhase.value + 1)
|
||||
|
||||
announcementsModuleObject.makeAnnoucements(nextPhaseEvent)
|
||||
|
||||
/* Reset this counter */
|
||||
tradingEngine.current.episode.distanceToEvent.nextPhase.value = 1
|
||||
tradingEngine.tradingCurrent.episode.distanceToEvent.nextPhase.value = 1
|
||||
return // only one event can pass at the time
|
||||
}
|
||||
}
|
||||
@@ -623,7 +623,7 @@ exports.newSuperalgosBotModulesTradingStages = function (processIndex) {
|
||||
announcementsModuleObject.makeAnnoucements(moveToPhaseEvent)
|
||||
|
||||
/* Reset this counter */
|
||||
tradingEngine.current.episode.distanceToEvent.moveToPhase.value = 1
|
||||
tradingEngine.tradingCurrent.episode.distanceToEvent.moveToPhase.value = 1
|
||||
return // only one event can pass at the time
|
||||
}
|
||||
}
|
||||
@@ -633,7 +633,7 @@ exports.newSuperalgosBotModulesTradingStages = function (processIndex) {
|
||||
}
|
||||
|
||||
function checkTakeProfitPhaseEvents() {
|
||||
let strategy = tradingSystem.tradingStrategies[tradingEngine.current.strategy.index.value]
|
||||
let strategy = tradingSystem.tradingStrategies[tradingEngine.tradingCurrent.strategy.index.value]
|
||||
let openStage = strategy.openStage
|
||||
let manageStage = strategy.manageStage
|
||||
let parentNode
|
||||
@@ -644,7 +644,7 @@ exports.newSuperalgosBotModulesTradingStages = function (processIndex) {
|
||||
if (manageStage !== undefined) {
|
||||
if (manageStage.managedTakeProfit !== undefined) {
|
||||
parentNode = manageStage
|
||||
phaseIndex = tradingEngine.current.position.takeProfit.takeProfitPhase.value - 1
|
||||
phaseIndex = tradingEngine.tradingCurrent.position.takeProfit.takeProfitPhase.value - 1
|
||||
takeProfit = manageStage.managedTakeProfit
|
||||
phase = takeProfit.phases[phaseIndex]
|
||||
}
|
||||
@@ -674,12 +674,12 @@ exports.newSuperalgosBotModulesTradingStages = function (processIndex) {
|
||||
tradingSystem.highlights.push(parentNode.id)
|
||||
tradingSystem.highlights.push(manageStage.id)
|
||||
|
||||
tradingPositionModuleObject.updateTakeProfit(tradingEngine.current.position.takeProfit.takeProfitPhase.value + 1)
|
||||
tradingPositionModuleObject.updateTakeProfit(tradingEngine.tradingCurrent.position.takeProfit.takeProfitPhase.value + 1)
|
||||
|
||||
announcementsModuleObject.makeAnnoucements(nextPhaseEvent)
|
||||
|
||||
/* Reset this counter */
|
||||
tradingEngine.current.episode.distanceToEvent.nextPhase.value = 1
|
||||
tradingEngine.tradingCurrent.episode.distanceToEvent.nextPhase.value = 1
|
||||
return // only one event can pass at the time
|
||||
}
|
||||
}
|
||||
@@ -730,7 +730,7 @@ exports.newSuperalgosBotModulesTradingStages = function (processIndex) {
|
||||
announcementsModuleObject.makeAnnoucements(moveToPhaseEvent)
|
||||
|
||||
/* Reset this counter */
|
||||
tradingEngine.current.episode.distanceToEvent.moveToPhase.value = 1
|
||||
tradingEngine.tradingCurrent.episode.distanceToEvent.moveToPhase.value = 1
|
||||
return // only one event can pass at the time
|
||||
}
|
||||
}
|
||||
@@ -741,7 +741,7 @@ exports.newSuperalgosBotModulesTradingStages = function (processIndex) {
|
||||
|
||||
function checkStopLossOrTakeProfitWasHit() {
|
||||
{
|
||||
let strategy = tradingSystem.tradingStrategies[tradingEngine.current.strategy.index.value]
|
||||
let strategy = tradingSystem.tradingStrategies[tradingEngine.tradingCurrent.strategy.index.value]
|
||||
/*
|
||||
Checking what happened since the last execution. We need to know if the Stop Loss
|
||||
or our Take Profit were hit.
|
||||
@@ -750,12 +750,12 @@ exports.newSuperalgosBotModulesTradingStages = function (processIndex) {
|
||||
/* Stop Loss condition: Here we verify if the Stop Loss was hitted or not. */
|
||||
if (
|
||||
(
|
||||
tradingEngine.current.position.stopLoss.stopLossPosition.value === 'Above' &&
|
||||
tradingEngine.current.episode.candle.max.value >= tradingEngine.current.position.stopLoss.value
|
||||
tradingEngine.tradingCurrent.position.stopLoss.stopLossPosition.value === 'Above' &&
|
||||
tradingEngine.tradingCurrent.episode.candle.max.value >= tradingEngine.tradingCurrent.position.stopLoss.value
|
||||
) ||
|
||||
(
|
||||
tradingEngine.current.position.stopLoss.stopLossPosition.value === 'Below' &&
|
||||
tradingEngine.current.episode.candle.min.value <= tradingEngine.current.position.stopLoss.value
|
||||
tradingEngine.tradingCurrent.position.stopLoss.stopLossPosition.value === 'Below' &&
|
||||
tradingEngine.tradingCurrent.episode.candle.min.value <= tradingEngine.tradingCurrent.position.stopLoss.value
|
||||
)
|
||||
) {
|
||||
TS.projects.superalgos.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME, '[INFO] checkStopLossOrTakeProfitWasHit -> Stop Loss was hit.')
|
||||
@@ -770,12 +770,12 @@ exports.newSuperalgosBotModulesTradingStages = function (processIndex) {
|
||||
/* Take Profit condition: Here we verify if the Take Profit was hit or not. */
|
||||
if (
|
||||
(
|
||||
tradingEngine.current.position.takeProfit.takeProfitPosition.value === 'Below' &&
|
||||
tradingEngine.current.episode.candle.min.value <= tradingEngine.current.position.takeProfit.value
|
||||
tradingEngine.tradingCurrent.position.takeProfit.takeProfitPosition.value === 'Below' &&
|
||||
tradingEngine.tradingCurrent.episode.candle.min.value <= tradingEngine.tradingCurrent.position.takeProfit.value
|
||||
) ||
|
||||
(
|
||||
tradingEngine.current.position.takeProfit.takeProfitPosition.value === 'Above' &&
|
||||
tradingEngine.current.episode.candle.max.value >= tradingEngine.current.position.takeProfit.value
|
||||
tradingEngine.tradingCurrent.position.takeProfit.takeProfitPosition.value === 'Above' &&
|
||||
tradingEngine.tradingCurrent.episode.candle.max.value >= tradingEngine.tradingCurrent.position.takeProfit.value
|
||||
)
|
||||
) {
|
||||
TS.projects.superalgos.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME, '[INFO] checkStopLossOrTakeProfitWasHit -> Take Profit was hit.')
|
||||
@@ -800,13 +800,13 @@ exports.newSuperalgosBotModulesTradingStages = function (processIndex) {
|
||||
function runWhenStatusIsOpening() {
|
||||
|
||||
/* Opening Status Procedure */
|
||||
if (tradingEngine.current.strategyCloseStage.status.value === 'Opening') {
|
||||
if (tradingEngine.tradingCurrent.strategyCloseStage.status.value === 'Opening') {
|
||||
/*
|
||||
The system allows the user not to define a close stage, because the close stage is optional.
|
||||
Here we are goint to see if that is the case and if it is, we will inmidiatelly consider
|
||||
the close stage as closed.
|
||||
*/
|
||||
if (tradingSystem.tradingStrategies[tradingEngine.current.strategy.index.value].closeStage === undefined) {
|
||||
if (tradingSystem.tradingStrategies[tradingEngine.tradingCurrent.strategy.index.value].closeStage === undefined) {
|
||||
changeStageStatus('Close Stage', 'Closed', 'Close Stage Undefined')
|
||||
return
|
||||
}
|
||||
@@ -814,11 +814,11 @@ exports.newSuperalgosBotModulesTradingStages = function (processIndex) {
|
||||
/*
|
||||
This will happen only once, as soon as the Take Profit or Stop was hit.
|
||||
*/
|
||||
let tradingSystemStage = tradingSystem.tradingStrategies[tradingEngine.current.strategy.index.value].closeStage
|
||||
let tradingSystemStage = tradingSystem.tradingStrategies[tradingEngine.tradingCurrent.strategy.index.value].closeStage
|
||||
|
||||
/* Exit Position size and rate */
|
||||
tradingSystem.evalFormulas(tradingSystemStage, 'Initial Targets')
|
||||
tradingPositionModuleObject.initialTargets(tradingSystemStage, tradingEngine.current.strategyCloseStage)
|
||||
tradingPositionModuleObject.initialTargets(tradingSystemStage, tradingEngine.tradingCurrent.strategyCloseStage)
|
||||
|
||||
initializeStageTargetSize()
|
||||
changeStageStatus('Close Stage', 'Open')
|
||||
@@ -832,17 +832,17 @@ exports.newSuperalgosBotModulesTradingStages = function (processIndex) {
|
||||
to be known before we start placing orders at the Close Stage.
|
||||
*/
|
||||
if (
|
||||
tradingEngine.current.strategyCloseStage.status.value === 'Open' &&
|
||||
tradingEngine.tradingCurrent.strategyCloseStage.status.value === 'Open' &&
|
||||
(
|
||||
tradingEngine.current.strategyOpenStage.status.value === 'Closed' ||
|
||||
tradingEngine.current.strategyOpenStage.status.value === tradingEngine.current.strategyOpenStage.status.config.initialValue
|
||||
tradingEngine.tradingCurrent.strategyOpenStage.status.value === 'Closed' ||
|
||||
tradingEngine.tradingCurrent.strategyOpenStage.status.value === tradingEngine.tradingCurrent.strategyOpenStage.status.config.initialValue
|
||||
)
|
||||
) {
|
||||
/*
|
||||
This will happen as long as the Close Stage is Open.
|
||||
*/
|
||||
let tradingSystemStage = tradingSystem.tradingStrategies[tradingEngine.current.strategy.index.value].closeStage
|
||||
let tradingEngineStage = tradingEngine.current.strategyCloseStage
|
||||
let tradingSystemStage = tradingSystem.tradingStrategies[tradingEngine.tradingCurrent.strategy.index.value].closeStage
|
||||
let tradingEngineStage = tradingEngine.tradingCurrent.strategyCloseStage
|
||||
let executionNode = tradingSystemStage.closeExecution
|
||||
|
||||
tradingSystem.evalConditions(tradingSystemStage, 'Close Execution')
|
||||
@@ -850,7 +850,7 @@ exports.newSuperalgosBotModulesTradingStages = function (processIndex) {
|
||||
|
||||
await tradingExecutionModuleObject.runExecution(
|
||||
executionNode,
|
||||
tradingEngine.current.strategyCloseStage
|
||||
tradingEngine.tradingCurrent.strategyCloseStage
|
||||
)
|
||||
|
||||
checkIfStageNeedsToBeClosed(tradingEngineStage, tradingSystemStage, 'Close Stage')
|
||||
@@ -861,18 +861,18 @@ exports.newSuperalgosBotModulesTradingStages = function (processIndex) {
|
||||
/*
|
||||
Validations that all needed nodes are there.
|
||||
*/
|
||||
if (tradingEngine.current.strategyCloseStage.stageBaseAsset === undefined) { badDefinitionUnhandledException(undefined, 'Stage Base Asset Node Missing', tradingEngine.current.strategyCloseStage) }
|
||||
if (tradingEngine.current.strategyCloseStage.stageBaseAsset.targetSize === undefined) { badDefinitionUnhandledException(undefined, 'Target Size Node Missing', tradingEngine.current.strategyCloseStage.stageBaseAsset) }
|
||||
if (tradingEngine.current.strategyCloseStage.stageQuotedAsset === undefined) { badDefinitionUnhandledException(undefined, 'Stage Quoted Asset Node Missing', tradingEngine.current.strategyCloseStage) }
|
||||
if (tradingEngine.current.strategyCloseStage.stageQuotedAsset.targetSize === undefined) { badDefinitionUnhandledException(undefined, 'Target Size Node Missing', tradingEngine.current.strategyCloseStage.stageQuotedAsset) }
|
||||
if (tradingEngine.tradingCurrent.strategyCloseStage.stageBaseAsset === undefined) { badDefinitionUnhandledException(undefined, 'Stage Base Asset Node Missing', tradingEngine.tradingCurrent.strategyCloseStage) }
|
||||
if (tradingEngine.tradingCurrent.strategyCloseStage.stageBaseAsset.targetSize === undefined) { badDefinitionUnhandledException(undefined, 'Target Size Node Missing', tradingEngine.tradingCurrent.strategyCloseStage.stageBaseAsset) }
|
||||
if (tradingEngine.tradingCurrent.strategyCloseStage.stageQuotedAsset === undefined) { badDefinitionUnhandledException(undefined, 'Stage Quoted Asset Node Missing', tradingEngine.tradingCurrent.strategyCloseStage) }
|
||||
if (tradingEngine.tradingCurrent.strategyCloseStage.stageQuotedAsset.targetSize === undefined) { badDefinitionUnhandledException(undefined, 'Target Size Node Missing', tradingEngine.tradingCurrent.strategyCloseStage.stageQuotedAsset) }
|
||||
/*
|
||||
Here we will transform the position size into targets for each asset of the stage.
|
||||
*/
|
||||
tradingEngine.current.strategyCloseStage.stageBaseAsset.targetSize.value = tradingEngine.current.position.positionBaseAsset.exitTargetSize.value
|
||||
tradingEngine.current.strategyCloseStage.stageQuotedAsset.targetSize.value = tradingEngine.current.position.positionQuotedAsset.exitTargetSize.value
|
||||
tradingEngine.tradingCurrent.strategyCloseStage.stageBaseAsset.targetSize.value = tradingEngine.tradingCurrent.position.positionBaseAsset.exitTargetSize.value
|
||||
tradingEngine.tradingCurrent.strategyCloseStage.stageQuotedAsset.targetSize.value = tradingEngine.tradingCurrent.position.positionQuotedAsset.exitTargetSize.value
|
||||
|
||||
tradingEngine.current.strategyCloseStage.stageBaseAsset.targetSize.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(tradingEngine.current.strategyCloseStage.stageBaseAsset.targetSize.value, 10)
|
||||
tradingEngine.current.strategyCloseStage.stageQuotedAsset.targetSize.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(tradingEngine.current.strategyCloseStage.stageQuotedAsset.targetSize.value, 10)
|
||||
tradingEngine.tradingCurrent.strategyCloseStage.stageBaseAsset.targetSize.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(tradingEngine.tradingCurrent.strategyCloseStage.stageBaseAsset.targetSize.value, 10)
|
||||
tradingEngine.tradingCurrent.strategyCloseStage.stageQuotedAsset.targetSize.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(tradingEngine.tradingCurrent.strategyCloseStage.stageQuotedAsset.targetSize.value, 10)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -882,25 +882,25 @@ exports.newSuperalgosBotModulesTradingStages = function (processIndex) {
|
||||
or at their initial default value. The last is becasue after Closed objects are
|
||||
initialized to their defualts.
|
||||
*/
|
||||
if (tradingEngine.current.position.status.value !== 'Open' && tradingEngine.current.position.status.value !== 'Closing') { return }
|
||||
if (tradingEngine.tradingCurrent.position.status.value !== 'Open' && tradingEngine.tradingCurrent.position.status.value !== 'Closing') { return }
|
||||
if (
|
||||
(
|
||||
tradingEngine.current.strategyTriggerStage.status.value === 'Closed' ||
|
||||
tradingEngine.current.strategyTriggerStage.status.value === tradingEngine.current.strategyTriggerStage.status.config.initialValue
|
||||
tradingEngine.tradingCurrent.strategyTriggerStage.status.value === 'Closed' ||
|
||||
tradingEngine.tradingCurrent.strategyTriggerStage.status.value === tradingEngine.tradingCurrent.strategyTriggerStage.status.config.initialValue
|
||||
)
|
||||
&&
|
||||
(
|
||||
tradingEngine.current.strategyOpenStage.status.value === 'Closed' ||
|
||||
tradingEngine.current.strategyOpenStage.status.value === tradingEngine.current.strategyOpenStage.status.config.initialValue
|
||||
tradingEngine.tradingCurrent.strategyOpenStage.status.value === 'Closed' ||
|
||||
tradingEngine.tradingCurrent.strategyOpenStage.status.value === tradingEngine.tradingCurrent.strategyOpenStage.status.config.initialValue
|
||||
)
|
||||
&&
|
||||
(
|
||||
tradingEngine.current.strategyManageStage.status.value === 'Closed' ||
|
||||
tradingEngine.current.strategyManageStage.status.value === tradingEngine.current.strategyManageStage.status.config.initialValue
|
||||
tradingEngine.tradingCurrent.strategyManageStage.status.value === 'Closed' ||
|
||||
tradingEngine.tradingCurrent.strategyManageStage.status.value === tradingEngine.tradingCurrent.strategyManageStage.status.config.initialValue
|
||||
)
|
||||
&&
|
||||
(
|
||||
tradingEngine.current.strategyCloseStage.status.value === 'Closed'
|
||||
tradingEngine.tradingCurrent.strategyCloseStage.status.value === 'Closed'
|
||||
)
|
||||
) {
|
||||
|
||||
@@ -933,8 +933,8 @@ exports.newSuperalgosBotModulesTradingStages = function (processIndex) {
|
||||
tradingStrategyModuleObject.closeStrategy('Position Closed')
|
||||
|
||||
/* Distance to Events Updates */
|
||||
tradingEngine.current.episode.distanceToEvent.closePosition.value = 1
|
||||
tradingEngine.current.episode.distanceToEvent.triggerOff.value = 1
|
||||
tradingEngine.tradingCurrent.episode.distanceToEvent.closePosition.value = 1
|
||||
tradingEngine.tradingCurrent.episode.distanceToEvent.triggerOff.value = 1
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1033,19 +1033,19 @@ exports.newSuperalgosBotModulesTradingStages = function (processIndex) {
|
||||
let stage
|
||||
switch (stageName) {
|
||||
case 'Trigger Stage': {
|
||||
stage = tradingEngine.current.strategyTriggerStage
|
||||
stage = tradingEngine.tradingCurrent.strategyTriggerStage
|
||||
break
|
||||
}
|
||||
case 'Open Stage': {
|
||||
stage = tradingEngine.current.strategyOpenStage
|
||||
stage = tradingEngine.tradingCurrent.strategyOpenStage
|
||||
break
|
||||
}
|
||||
case 'Manage Stage': {
|
||||
stage = tradingEngine.current.strategyManageStage
|
||||
stage = tradingEngine.tradingCurrent.strategyManageStage
|
||||
break
|
||||
}
|
||||
case 'Close Stage': {
|
||||
stage = tradingEngine.current.strategyCloseStage
|
||||
stage = tradingEngine.tradingCurrent.strategyCloseStage
|
||||
break
|
||||
}
|
||||
}
|
||||
@@ -1073,15 +1073,15 @@ exports.newSuperalgosBotModulesTradingStages = function (processIndex) {
|
||||
*/
|
||||
function openStage(stage) {
|
||||
/* Recording the opening at the Trading Engine Data Structure */
|
||||
stage.begin.value = tradingEngine.current.episode.cycle.lastBegin.value
|
||||
stage.end.value = tradingEngine.current.episode.cycle.lastEnd.value
|
||||
stage.beginRate.value = tradingEngine.current.episode.candle.close.value
|
||||
stage.begin.value = tradingEngine.tradingCurrent.episode.cycle.lastBegin.value
|
||||
stage.end.value = tradingEngine.tradingCurrent.episode.cycle.lastEnd.value
|
||||
stage.beginRate.value = tradingEngine.tradingCurrent.episode.candle.close.value
|
||||
}
|
||||
|
||||
function closeStage(stage) {
|
||||
/* Recording the closing at the Trading Engine Data Structure */
|
||||
stage.end.value = tradingEngine.current.episode.cycle.lastEnd.value
|
||||
stage.endRate.value = tradingEngine.current.episode.candle.close.value
|
||||
stage.end.value = tradingEngine.tradingCurrent.episode.cycle.lastEnd.value
|
||||
stage.endRate.value = tradingEngine.tradingCurrent.episode.candle.close.value
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1090,43 +1090,43 @@ exports.newSuperalgosBotModulesTradingStages = function (processIndex) {
|
||||
Note that we can not use the cycle here because this is executed via mantain
|
||||
which in turn is executed before the first cycle for this candle is set.
|
||||
*/
|
||||
if (tradingEngine.current.strategyTriggerStage.status.value === 'Open') {
|
||||
tradingEngine.current.strategyTriggerStage.end.value = tradingEngine.current.strategyTriggerStage.end.value + sessionParameters.timeFrame.config.value
|
||||
tradingEngine.current.strategyTriggerStage.endRate.value = tradingEngine.current.episode.candle.close.value
|
||||
if (tradingEngine.tradingCurrent.strategyTriggerStage.status.value === 'Open') {
|
||||
tradingEngine.tradingCurrent.strategyTriggerStage.end.value = tradingEngine.tradingCurrent.strategyTriggerStage.end.value + sessionParameters.timeFrame.config.value
|
||||
tradingEngine.tradingCurrent.strategyTriggerStage.endRate.value = tradingEngine.tradingCurrent.episode.candle.close.value
|
||||
}
|
||||
if (tradingEngine.current.strategyOpenStage.status.value === 'Open') {
|
||||
tradingEngine.current.strategyOpenStage.end.value = tradingEngine.current.strategyOpenStage.end.value + sessionParameters.timeFrame.config.value
|
||||
tradingEngine.current.strategyOpenStage.endRate.value = tradingEngine.current.episode.candle.close.value
|
||||
if (tradingEngine.tradingCurrent.strategyOpenStage.status.value === 'Open') {
|
||||
tradingEngine.tradingCurrent.strategyOpenStage.end.value = tradingEngine.tradingCurrent.strategyOpenStage.end.value + sessionParameters.timeFrame.config.value
|
||||
tradingEngine.tradingCurrent.strategyOpenStage.endRate.value = tradingEngine.tradingCurrent.episode.candle.close.value
|
||||
}
|
||||
if (tradingEngine.current.strategyManageStage.status.value === 'Open') {
|
||||
tradingEngine.current.strategyManageStage.end.value = tradingEngine.current.strategyManageStage.end.value + sessionParameters.timeFrame.config.value
|
||||
tradingEngine.current.strategyManageStage.endRate.value = tradingEngine.current.episode.candle.close.value
|
||||
if (tradingEngine.tradingCurrent.strategyManageStage.status.value === 'Open') {
|
||||
tradingEngine.tradingCurrent.strategyManageStage.end.value = tradingEngine.tradingCurrent.strategyManageStage.end.value + sessionParameters.timeFrame.config.value
|
||||
tradingEngine.tradingCurrent.strategyManageStage.endRate.value = tradingEngine.tradingCurrent.episode.candle.close.value
|
||||
}
|
||||
if (tradingEngine.current.strategyCloseStage.status.value === 'Open') {
|
||||
tradingEngine.current.strategyCloseStage.end.value = tradingEngine.current.strategyCloseStage.end.value + sessionParameters.timeFrame.config.value
|
||||
tradingEngine.current.strategyCloseStage.endRate.value = tradingEngine.current.episode.candle.close.value
|
||||
if (tradingEngine.tradingCurrent.strategyCloseStage.status.value === 'Open') {
|
||||
tradingEngine.tradingCurrent.strategyCloseStage.end.value = tradingEngine.tradingCurrent.strategyCloseStage.end.value + sessionParameters.timeFrame.config.value
|
||||
tradingEngine.tradingCurrent.strategyCloseStage.endRate.value = tradingEngine.tradingCurrent.episode.candle.close.value
|
||||
}
|
||||
}
|
||||
|
||||
function resetTradingEngineDataStructure() {
|
||||
if (tradingEngine.current.strategyTriggerStage.status.value === 'Closed') {
|
||||
resetStage(tradingEngine.current.strategyTriggerStage.status)
|
||||
if (tradingEngine.tradingCurrent.strategyTriggerStage.status.value === 'Closed') {
|
||||
resetStage(tradingEngine.tradingCurrent.strategyTriggerStage.status)
|
||||
}
|
||||
if (tradingEngine.current.strategyOpenStage.status.value === 'Closed') {
|
||||
resetStage(tradingEngine.current.strategyOpenStage.status)
|
||||
if (tradingEngine.tradingCurrent.strategyOpenStage.status.value === 'Closed') {
|
||||
resetStage(tradingEngine.tradingCurrent.strategyOpenStage.status)
|
||||
}
|
||||
if (tradingEngine.current.strategyManageStage.status.value === 'Closed') {
|
||||
resetStage(tradingEngine.current.strategyManageStage.status)
|
||||
if (tradingEngine.tradingCurrent.strategyManageStage.status.value === 'Closed') {
|
||||
resetStage(tradingEngine.tradingCurrent.strategyManageStage.status)
|
||||
}
|
||||
if (tradingEngine.current.strategyCloseStage.status.value === 'Closed') {
|
||||
resetStage(tradingEngine.current.strategyCloseStage.status)
|
||||
if (tradingEngine.tradingCurrent.strategyCloseStage.status.value === 'Closed') {
|
||||
resetStage(tradingEngine.tradingCurrent.strategyCloseStage.status)
|
||||
}
|
||||
|
||||
if (tradingEngine.current.position.status.value === 'Closed') {
|
||||
resetStage(tradingEngine.current.strategyTriggerStage)
|
||||
resetStage(tradingEngine.current.strategyOpenStage)
|
||||
resetStage(tradingEngine.current.strategyManageStage)
|
||||
resetStage(tradingEngine.current.strategyCloseStage)
|
||||
if (tradingEngine.tradingCurrent.position.status.value === 'Closed') {
|
||||
resetStage(tradingEngine.tradingCurrent.strategyTriggerStage)
|
||||
resetStage(tradingEngine.tradingCurrent.strategyOpenStage)
|
||||
resetStage(tradingEngine.tradingCurrent.strategyManageStage)
|
||||
resetStage(tradingEngine.tradingCurrent.strategyCloseStage)
|
||||
}
|
||||
function resetStage(stage) {
|
||||
TS.projects.superalgos.globals.processModuleObjects.MODULE_OBJECTS_BY_PROCESS_INDEX_MAP.get(processIndex).TRADING_ENGINE_MODULE_OBJECT.initializeNode(stage)
|
||||
|
||||
+22
-22
@@ -38,50 +38,50 @@ exports.newSuperalgosBotModulesTradingStrategy = function (processIndex) {
|
||||
|
||||
function openStrategy(index, situationName, strategyName) {
|
||||
/* Starting begin and end */
|
||||
tradingEngine.current.strategy.begin.value = tradingEngine.current.episode.cycle.lastBegin.value
|
||||
tradingEngine.current.strategy.end.value = tradingEngine.current.episode.cycle.lastEnd.value
|
||||
tradingEngine.tradingCurrent.strategy.begin.value = tradingEngine.tradingCurrent.episode.cycle.lastBegin.value
|
||||
tradingEngine.tradingCurrent.strategy.end.value = tradingEngine.tradingCurrent.episode.cycle.lastEnd.value
|
||||
|
||||
/* Recording the opening at the Trading Engine Data Structure */
|
||||
tradingEngine.current.strategy.status.value = 'Open'
|
||||
tradingEngine.current.strategy.serialNumber.value = tradingEngine.current.episode.episodeCounters.strategies.value
|
||||
tradingEngine.current.strategy.identifier.value = TS.projects.superalgos.utilities.miscellaneousFunctions.genereteUniqueId()
|
||||
tradingEngine.current.strategy.beginRate.value = tradingEngine.current.episode.candle.min.value
|
||||
tradingEngine.tradingCurrent.strategy.status.value = 'Open'
|
||||
tradingEngine.tradingCurrent.strategy.serialNumber.value = tradingEngine.tradingCurrent.episode.episodeCounters.strategies.value
|
||||
tradingEngine.tradingCurrent.strategy.identifier.value = TS.projects.superalgos.utilities.miscellaneousFunctions.genereteUniqueId()
|
||||
tradingEngine.tradingCurrent.strategy.beginRate.value = tradingEngine.tradingCurrent.episode.candle.min.value
|
||||
|
||||
tradingEngine.current.strategy.index.value = index
|
||||
tradingEngine.current.strategy.situationName.value = situationName
|
||||
tradingEngine.current.strategy.strategyName.value = strategyName
|
||||
tradingEngine.tradingCurrent.strategy.index.value = index
|
||||
tradingEngine.tradingCurrent.strategy.situationName.value = situationName
|
||||
tradingEngine.tradingCurrent.strategy.strategyName.value = strategyName
|
||||
|
||||
/* Updating Episode Counters */
|
||||
tradingEngine.current.episode.episodeCounters.strategies.value++
|
||||
tradingEngine.tradingCurrent.episode.episodeCounters.strategies.value++
|
||||
}
|
||||
|
||||
function closeStrategy(exitType) {
|
||||
tradingEngine.current.strategy.status.value = 'Closed'
|
||||
tradingEngine.current.strategy.exitType.value = exitType
|
||||
tradingEngine.current.strategy.end.value = tradingEngine.current.episode.cycle.lastEnd.value
|
||||
tradingEngine.current.strategy.endRate.value = tradingEngine.current.episode.candle.min.value
|
||||
tradingEngine.tradingCurrent.strategy.status.value = 'Closed'
|
||||
tradingEngine.tradingCurrent.strategy.exitType.value = exitType
|
||||
tradingEngine.tradingCurrent.strategy.end.value = tradingEngine.tradingCurrent.episode.cycle.lastEnd.value
|
||||
tradingEngine.tradingCurrent.strategy.endRate.value = tradingEngine.tradingCurrent.episode.candle.min.value
|
||||
/*
|
||||
Now that the strategy is closed, it is the right time to move this strategy from current to last at the Trading Engine data structure.
|
||||
*/
|
||||
TS.projects.superalgos.globals.processModuleObjects.MODULE_OBJECTS_BY_PROCESS_INDEX_MAP.get(processIndex).TRADING_ENGINE_MODULE_OBJECT.cloneValues(tradingEngine.current.strategy, tradingEngine.last.strategy)
|
||||
TS.projects.superalgos.globals.processModuleObjects.MODULE_OBJECTS_BY_PROCESS_INDEX_MAP.get(processIndex).TRADING_ENGINE_MODULE_OBJECT.cloneValues(tradingEngine.tradingCurrent.strategy, tradingEngine.last.strategy)
|
||||
}
|
||||
|
||||
function updateEnds() {
|
||||
if (tradingEngine.current.strategy.status.value === 'Open') {
|
||||
tradingEngine.current.strategy.end.value = tradingEngine.current.strategy.end.value + sessionParameters.timeFrame.config.value
|
||||
tradingEngine.current.strategy.endRate.value = tradingEngine.current.episode.candle.close.value
|
||||
if (tradingEngine.tradingCurrent.strategy.status.value === 'Open') {
|
||||
tradingEngine.tradingCurrent.strategy.end.value = tradingEngine.tradingCurrent.strategy.end.value + sessionParameters.timeFrame.config.value
|
||||
tradingEngine.tradingCurrent.strategy.endRate.value = tradingEngine.tradingCurrent.episode.candle.close.value
|
||||
}
|
||||
}
|
||||
|
||||
function resetTradingEngineDataStructure() {
|
||||
if (tradingEngine.current.strategy.status.value === 'Closed') {
|
||||
TS.projects.superalgos.globals.processModuleObjects.MODULE_OBJECTS_BY_PROCESS_INDEX_MAP.get(processIndex).TRADING_ENGINE_MODULE_OBJECT.initializeNode(tradingEngine.current.strategy)
|
||||
if (tradingEngine.tradingCurrent.strategy.status.value === 'Closed') {
|
||||
TS.projects.superalgos.globals.processModuleObjects.MODULE_OBJECTS_BY_PROCESS_INDEX_MAP.get(processIndex).TRADING_ENGINE_MODULE_OBJECT.initializeNode(tradingEngine.tradingCurrent.strategy)
|
||||
}
|
||||
}
|
||||
|
||||
function updateCounters() {
|
||||
if (tradingEngine.current.strategy.status.value === 'Open') {
|
||||
tradingEngine.current.strategy.strategyCounters.periods.value++
|
||||
if (tradingEngine.tradingCurrent.strategy.status.value === 'Open') {
|
||||
tradingEngine.tradingCurrent.strategy.strategyCounters.periods.value++
|
||||
}
|
||||
}
|
||||
}
|
||||
+3
-3
@@ -75,7 +75,7 @@ exports.newSuperalgosBotModulesTradingSystem = function (processIndex) {
|
||||
This rate will later help plotting the error at the
|
||||
charts.
|
||||
*/
|
||||
let rate = tradingEngine.current.episode.candle.close.value
|
||||
let rate = tradingEngine.tradingCurrent.episode.candle.close.value
|
||||
errorDataArray.push(rate)
|
||||
tradingSystem.errors.push(errorDataArray)
|
||||
}
|
||||
@@ -86,7 +86,7 @@ exports.newSuperalgosBotModulesTradingSystem = function (processIndex) {
|
||||
This rate will later help plotting the warning at the
|
||||
charts.
|
||||
*/
|
||||
let rate = tradingEngine.current.episode.candle.close.value
|
||||
let rate = tradingEngine.tradingCurrent.episode.candle.close.value
|
||||
warningDataArray.push(rate)
|
||||
tradingSystem.warnings.push(warningDataArray)
|
||||
}
|
||||
@@ -97,7 +97,7 @@ exports.newSuperalgosBotModulesTradingSystem = function (processIndex) {
|
||||
This rate will later help plotting the warning at the
|
||||
charts.
|
||||
*/
|
||||
let rate = tradingEngine.current.episode.candle.close.value
|
||||
let rate = tradingEngine.tradingCurrent.episode.candle.close.value
|
||||
infoDataArray.push(rate)
|
||||
tradingSystem.infos.push(infoDataArray)
|
||||
}
|
||||
|
||||
@@ -31,7 +31,7 @@ exports.newSuperalgosFunctionLibrariesOutputManagementFunctions = function () {
|
||||
if (TS.projects.superalgos.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).IS_SESSION_FIRST_LOOP === true && TS.projects.superalgos.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).IS_SESSION_RESUMING === false) {
|
||||
await initializeOutputs()
|
||||
} else {
|
||||
if (TS.projects.superalgos.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).SIMULATION_STATE.tradingEngine.current.episode.headOfTheMarket.value === true) {
|
||||
if (TS.projects.superalgos.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).SIMULATION_STATE.tradingEngine.tradingCurrent.episode.headOfTheMarket.value === true) {
|
||||
await loadFiles()
|
||||
} else {
|
||||
await initializeOutputs()
|
||||
|
||||
@@ -89,7 +89,7 @@ function newSuperalgosFunctionLibraryLearningSessionFunctions() {
|
||||
lightingPath = '' +
|
||||
'Learning Engine->' +
|
||||
'Dynamic Indicators->Indicator Function->' +
|
||||
'Current->Last->Previous->' +
|
||||
'Trading Current->Last->Previous->' +
|
||||
'Episode->' +
|
||||
'Episode Base Asset->Episode Quoted Asset->Episode Counters->Episode Statistics->' +
|
||||
'Strategies->Positions->Orders->Hits->Fails->' +
|
||||
|
||||
@@ -89,7 +89,7 @@ function newSuperalgosFunctionLibraryTradingSessionFunctions() {
|
||||
lightingPath = '' +
|
||||
'Trading Engine->' +
|
||||
'Dynamic Indicators->Indicator Function->' +
|
||||
'Current->Last->Previous->' +
|
||||
'Trading Current->Last->Previous->' +
|
||||
'Episode->' +
|
||||
'Episode Base Asset->Episode Quoted Asset->Episode Counters->Episode Statistics->' +
|
||||
'Strategies->Positions->Orders->Hits->Fails->' +
|
||||
|
||||
Reference in new issue
Block a user