Latest iteration ready

This commit is contained in:
Luis Fernando Molina committed 2020-08-06 15:40:17 +02:00
1 parent 81779c49a3
commit 8199198637
12 files changed
+594 -382

No files matched your search

+295 -181
View File
@@ -3839,9 +3839,15 @@
"propertyNameAtParent": "positionBaseAsset",
"properties": [
{
"name": "size",
"name": "entryTargetSize",
"type": "node",
"childType": "Size",
"childType": "Entry Target Size",
"autoAdd": true
},
{
"name": "exitTargetSize",
"type": "node",
"childType": "Exit Target Size",
"autoAdd": true
},
{
@@ -3892,9 +3898,15 @@
"propertyNameAtParent": "positionQuotedAsset",
"properties": [
{
"name": "size",
"name": "entryTargetSize",
"type": "node",
"childType": "Size",
"childType": "Entry Target Size",
"autoAdd": true
},
{
"name": "exitTargetSize",
"type": "node",
"childType": "Exit Target Size",
"autoAdd": true
},
{
@@ -6042,9 +6054,15 @@
"autoAdd": true
},
{
"name": "rate",
"name": "entryTargetRate",
"type": "node",
"childType": "Rate",
"childType": "Entry Target Rate",
"autoAdd": true
},
{
"name": "exitTargetRate",
"type": "node",
"childType": "Exit Target Rate",
"autoAdd": true
},
{
@@ -6144,11 +6162,79 @@
"addLeftIcons": true,
"level": 3,
"chainAttachesTo": {
"compatibleTypes": "->Position->Market Order->Limit Order->"
"compatibleTypes": "->Market Order->Limit Order->"
},
"icon": "pantone",
"propertyNameAtParent": "rate"
},
{
"type": "Entry Target Rate",
"menuItems": [
{
"action": "Configure This",
"label": "Configure This",
"iconPathOn": "settings",
"iconPathOff": "settings",
"actionFunction": "uiObject.configEditor.activate"
},
{
"action": "Delete UI Object",
"askConfirmation": true,
"confirmationLabel": "Confirm to Delete",
"label": "Delete This",
"iconPathOn": "delete",
"iconPathOff": "delete",
"actionFunction": "payload.onMenuItemClick"
}
],
"editors": {
"config": true
},
"initialValues": {
"config": "{\n\"initialValue\": 0\n}"
},
"addLeftIcons": true,
"level": 3,
"chainAttachesTo": {
"compatibleTypes": "->Position->"
},
"icon": "pantone",
"propertyNameAtParent": "entryTargetRate"
},
{
"type": "Exit Target Rate",
"menuItems": [
{
"action": "Configure This",
"label": "Configure This",
"iconPathOn": "settings",
"iconPathOff": "settings",
"actionFunction": "uiObject.configEditor.activate"
},
{
"action": "Delete UI Object",
"askConfirmation": true,
"confirmationLabel": "Confirm to Delete",
"label": "Delete This",
"iconPathOn": "delete",
"iconPathOff": "delete",
"actionFunction": "payload.onMenuItemClick"
}
],
"editors": {
"config": true
},
"initialValues": {
"config": "{\n\"initialValue\": 0\n}"
},
"addLeftIcons": true,
"level": 3,
"chainAttachesTo": {
"compatibleTypes": "->Position->"
},
"icon": "pantone",
"propertyNameAtParent": "exitTargetRate"
},
{
"type": "Size",
"menuItems": [
@@ -6178,11 +6264,79 @@
"addLeftIcons": true,
"level": 3,
"chainAttachesTo": {
"compatibleTypes": "->Position->Order Base Asset->Order Quoted Asset->Position Base Asset->Position Quoted Asset->"
"compatibleTypes": "->Order Base Asset->Order Quoted Asset->"
},
"icon": "upload",
"propertyNameAtParent": "size"
},
{
"type": "Entry Target Size",
"menuItems": [
{
"action": "Configure This",
"label": "Configure This",
"iconPathOn": "settings",
"iconPathOff": "settings",
"actionFunction": "uiObject.configEditor.activate"
},
{
"action": "Delete UI Object",
"askConfirmation": true,
"confirmationLabel": "Confirm to Delete",
"label": "Delete This",
"iconPathOn": "delete",
"iconPathOff": "delete",
"actionFunction": "payload.onMenuItemClick"
}
],
"editors": {
"config": true
},
"initialValues": {
"config": "{\n\"initialValue\": 0\n}"
},
"addLeftIcons": true,
"level": 3,
"chainAttachesTo": {
"compatibleTypes": "->Position Base Asset->Position Quoted Asset->"
},
"icon": "upload",
"propertyNameAtParent": "entryTargetSize"
},
{
"type": "Exit Target Size",
"menuItems": [
{
"action": "Configure This",
"label": "Configure This",
"iconPathOn": "settings",
"iconPathOff": "settings",
"actionFunction": "uiObject.configEditor.activate"
},
{
"action": "Delete UI Object",
"askConfirmation": true,
"confirmationLabel": "Confirm to Delete",
"label": "Delete This",
"iconPathOn": "delete",
"iconPathOff": "delete",
"actionFunction": "payload.onMenuItemClick"
}
],
"editors": {
"config": true
},
"initialValues": {
"config": "{\n\"initialValue\": 0\n}"
},
"addLeftIcons": true,
"level": 3,
"chainAttachesTo": {
"compatibleTypes": "->Position Base Asset->Position Quoted Asset->"
},
"icon": "upload",
"propertyNameAtParent": "exitTargetSize"
},
{
"type": "Size Placed",
"menuItems": [
@@ -8715,7 +8869,7 @@
},
"level": 4,
"chainAttachesTo": {
"compatibleTypes": "->Position Size->Position Rate->Phase->Record Property->Simulated Actual Rate->Situation->"
"compatibleTypes": "->Target Size In Base Asset->Target Size In Quoted Asset->Target Rate->Phase->Record Property->Simulated Actual Rate->Situation->"
},
"icon": "pipette",
"propertyNameAtParent": "formula"
@@ -9356,29 +9510,11 @@
"docURL": "https://docs.superalgos.org/suite-hierarchy-trading-system.html#open-stage",
"menuItems": [
{
"action": "Add UI Object",
"disableIfPropertyIsDefined": true,
"propertyToCheckFor": "initialDefinition",
"label": "Add Initial Definition",
"action": "Add Missing Children",
"label": "Add Missing Items",
"relatedUiObject": "Initial Definition",
"actionFunction": "payload.onMenuItemClick"
},
{
"action": "Add UI Object",
"disableIfPropertyIsDefined": true,
"propertyToCheckFor": "openExecution",
"label": "Add Open Execution",
"relatedUiObject": "Open Execution",
"actionFunction": "payload.onMenuItemClick"
},
{
"action": "Add UI Object",
"disableIfPropertyIsDefined": true,
"propertyToCheckFor": "closeStageEvent",
"label": "Add Close Stage Event",
"relatedUiObject": "Close Stage Event",
"actionFunction": "payload.onMenuItemClick"
},
{
"action": "Add UI Object",
"label": "Add Announcement",
@@ -9402,6 +9538,12 @@
},
"icon": "stage-open",
"properties": [
{
"name": "initialTargets",
"type": "node",
"childType": "Initial Targets",
"autoAdd": true
},
{
"name": "initialDefinition",
"type": "node",
@@ -9512,28 +9654,57 @@
"type": "node",
"childType": "Initial Take Profit",
"autoAdd": true
},
{
"name": "positionSizeInBaseAsset",
"type": "node",
"childType": "Position Size In Base Asset",
"autoAdd": true
},
{
"name": "positionSizeInQuotedAsset",
"type": "node",
"childType": "Position Size In Quoted Asset",
"autoAdd": true
},
{
"name": "positionRate",
"type": "node",
"childType": "Position Rate",
"autoAdd": true
}
],
"propertyNameAtParent": "initialDefinition"
},
{
"type": "Initial Targets",
"menuItems": [
{
"action": "Add Missing Children",
"label": "Add Missing Items",
"relatedUiObject": "Initial Definition",
"actionFunction": "payload.onMenuItemClick"
},
{
"action": "Delete UI Object",
"askConfirmation": true,
"confirmationLabel": "Confirm to Delete",
"label": "Delete This",
"iconPathOn": "delete",
"iconPathOff": "delete",
"actionFunction": "payload.onMenuItemClick"
}
],
"addLeftIcons": true,
"level": 2,
"chainAttachesTo": {
"compatibleTypes": "->Open Stage->Close Stage->"
},
"icon": "targeting",
"properties": [
{
"name": "targetRate",
"type": "node",
"childType": "Target Rate",
"autoAdd": true
},
{
"name": "targetSizeInBaseAsset",
"type": "node",
"childType": "Target Size In Base Asset",
"autoAdd": true
},
{
"name": "targetSizeInQuotedAsset",
"type": "node",
"childType": "Target Size In Quoted Asset",
"autoAdd": true
}
],
"propertyNameAtParent": "initialTargets"
},
{
"type": "Managed Stop Loss",
"docURL": "https://docs.superalgos.org/suite-hierarchy-trading-system.html#stop",
@@ -9852,7 +10023,7 @@
"propertyNameAtParent": "initialTakeProfit"
},
{
"type": "Position Size In Base Asset",
"type": "Target Size In Base Asset",
"menuItems": [
{
"action": "Add UI Object",
@@ -9875,7 +10046,7 @@
"addLeftIcons": true,
"level": 4,
"chainAttachesTo": {
"compatibleTypes": "->Initial Definition->"
"compatibleTypes": "->Initial Targets->"
},
"icon": "stage-open-position-size",
"properties": [
@@ -9886,10 +10057,10 @@
"autoAdd": true
}
],
"propertyNameAtParent": "positionSizeInBaseAsset"
"propertyNameAtParent": "targetSizeInBaseAsset"
},
{
"type": "Position Size In Quoted Asset",
"type": "Target Size In Quoted Asset",
"menuItems": [
{
"action": "Add UI Object",
@@ -9912,7 +10083,7 @@
"addLeftIcons": true,
"level": 4,
"chainAttachesTo": {
"compatibleTypes": "->Initial Definition->"
"compatibleTypes": "->Initial Targets->"
},
"icon": "stage-open-position-size",
"properties": [
@@ -9923,85 +10094,10 @@
"autoAdd": true
}
],
"propertyNameAtParent": "positionSizeInQuotedAsset"
"propertyNameAtParent": "targetSizeInQuotedAsset"
},
{
"type": "Size In Base Asset",
"menuItems": [
{
"action": "Add UI Object",
"disableIfPropertyIsDefined": true,
"propertyToCheckFor": "formula",
"label": "Add Formula",
"relatedUiObject": "Formula",
"actionFunction": "payload.onMenuItemClick"
},
{
"action": "Delete UI Object",
"askConfirmation": true,
"confirmationLabel": "Confirm to Delete",
"label": "Delete This",
"iconPathOn": "delete",
"iconPathOff": "delete",
"actionFunction": "payload.onMenuItemClick"
}
],
"addLeftIcons": true,
"level": 4,
"chainAttachesTo": {
"compatibleTypes": "->Execution Algorithm->"
},
"icon": "eos",
"properties": [
{
"name": "formula",
"type": "node",
"childType": "Formula",
"autoAdd": true
}
],
"propertyNameAtParent": "sizeInBaseAsset"
},
{
"type": "Size In Quoted Asset",
"menuItems": [
{
"action": "Add UI Object",
"disableIfPropertyIsDefined": true,
"propertyToCheckFor": "formula",
"label": "Add Formula",
"relatedUiObject": "Formula",
"actionFunction": "payload.onMenuItemClick"
},
{
"action": "Delete UI Object",
"askConfirmation": true,
"confirmationLabel": "Confirm to Delete",
"label": "Delete This",
"iconPathOn": "delete",
"iconPathOff": "delete",
"actionFunction": "payload.onMenuItemClick"
}
],
"addLeftIcons": true,
"level": 4,
"chainAttachesTo": {
"compatibleTypes": "->Execution Algorithm->"
},
"icon": "eos",
"properties": [
{
"name": "formula",
"type": "node",
"childType": "Formula",
"autoAdd": true
}
],
"propertyNameAtParent": "sizeInQuotedAsset"
},
{
"type": "Position Rate",
"docURL": "https://docs.superalgos.org/suite-hierarchy-trading-system.html#position-rate",
"type": "Target Rate",
"menuItems": [
{
"action": "Add UI Object",
@@ -10024,7 +10120,7 @@
"addLeftIcons": true,
"level": 5,
"chainAttachesTo": {
"compatibleTypes": "->Initial Definition->Limit Buy Order->Limit Sell Order->"
"compatibleTypes": "->Initial Targets->"
},
"icon": "stage-open-postion-rate",
"properties": [
@@ -10035,7 +10131,44 @@
"autoAdd": true
}
],
"propertyNameAtParent": "positionRate"
"propertyNameAtParent": "targetRate"
},
{
"type": "Order Rate",
"menuItems": [
{
"action": "Add UI Object",
"disableIfPropertyIsDefined": true,
"propertyToCheckFor": "formula",
"label": "Add Formula",
"relatedUiObject": "Formula",
"actionFunction": "payload.onMenuItemClick"
},
{
"action": "Delete UI Object",
"askConfirmation": true,
"confirmationLabel": "Confirm to Delete",
"label": "Delete This",
"iconPathOn": "delete",
"iconPathOff": "delete",
"actionFunction": "payload.onMenuItemClick"
}
],
"addLeftIcons": true,
"level": 5,
"chainAttachesTo": {
"compatibleTypes": "->Limit Buy Order->Limit Sell Order->"
},
"icon": "stage-open-postion-rate",
"properties": [
{
"name": "formula",
"type": "node",
"childType": "Formula",
"autoAdd": true
}
],
"propertyNameAtParent": "orderRate"
},
{
"type": "Open Execution",
@@ -10076,20 +10209,11 @@
"type": "Execution Algorithm",
"menuItems": [
{
"action": "Add UI Object",
"disableIfPropertyIsDefined": true,
"propertyToCheckFor": "sizeInBaseAsset",
"label": "Add Size In Base Asset",
"relatedUiObject": "Size In Base Asset",
"actionFunction": "payload.onMenuItemClick"
},
{
"action": "Add UI Object",
"disableIfPropertyIsDefined": true,
"propertyToCheckFor": "sizeInQuotedAsset",
"label": "Add Size In Quoted Asset",
"relatedUiObject": "Size In Quoted Asset",
"actionFunction": "payload.onMenuItemClick"
"action": "Configure This",
"actionFunction": "uiObject.configEditor.activate",
"label": "Configure This",
"iconPathOn": "html",
"iconPathOff": "html"
},
{
"action": "Add UI Object",
@@ -10125,6 +10249,12 @@
"actionFunction": "payload.onMenuItemClick"
}
],
"initialValues": {
"config": "{\n\"percentageOfStageTargetSize\": 100 \n}"
},
"editors": {
"config": true
},
"addLeftIcons": true,
"level": 4,
"chainAttachesTo": {
@@ -10133,18 +10263,6 @@
"icon": "execution-algorithm",
"propertyNameAtParent": "executionAlgorithms",
"properties": [
{
"name": "sizeInBaseAsset",
"type": "node",
"childType": "Size In Base Asset",
"autoAdd": true
},
{
"name": "sizeInQuotedAsset",
"type": "node",
"childType": "Size In Quoted Asset",
"autoAdd": true
},
{
"name": "marketBuyOrders",
"type": "array",
@@ -10204,7 +10322,7 @@
}
],
"initialValues": {
"config": "{\n\"positionSizePercentage\": 100, \n\"spawnMultipleOrders\": false \n}"
"config": "{\n\"percentageOfAlgorithmSize\": 100, \n\"spawnMultipleOrders\": false \n}"
},
"editors": {
"config": true
@@ -10314,9 +10432,9 @@
{
"action": "Add UI Object",
"disableIfPropertyIsDefined": true,
"propertyToCheckFor": "positionRate",
"label": "Add Position Rate",
"relatedUiObject": "Position Rate",
"propertyToCheckFor": "orderRate",
"label": "Add Order Rate",
"relatedUiObject": "Order Rate",
"actionFunction": "payload.onMenuItemClick"
},
{
@@ -10371,9 +10489,9 @@
"propertyNameAtParent": "limitBuyOrders",
"properties": [
{
"name": "positionRate",
"name": "orderRate",
"type": "node",
"childType": "Position Rate",
"childType": "Order Rate",
"autoAdd": true
},
{
@@ -10407,9 +10525,9 @@
{
"action": "Add UI Object",
"disableIfPropertyIsDefined": true,
"propertyToCheckFor": "positionRate",
"label": "Add Position Rate",
"relatedUiObject": "Position Rate",
"propertyToCheckFor": "orderRate",
"label": "Add Order Rate",
"relatedUiObject": "Order Rate",
"actionFunction": "payload.onMenuItemClick"
},
{
@@ -10464,9 +10582,9 @@
"propertyNameAtParent": "limitSellOrders",
"properties": [
{
"name": "positionRate",
"name": "orderRate",
"type": "node",
"childType": "Position Rate",
"childType": "Order Rate",
"autoAdd": true
},
{
@@ -10807,11 +10925,9 @@
"docURL": "https://docs.superalgos.org/suite-hierarchy-trading-system.html#close-stage",
"menuItems": [
{
"action": "Add UI Object",
"disableIfPropertyIsDefined": true,
"propertyToCheckFor": "closeExecution",
"label": "Add Close Execution",
"relatedUiObject": "Close Execution",
"action": "Add Missing Children",
"label": "Add Missing Items",
"relatedUiObject": "Initial Definition",
"actionFunction": "payload.onMenuItemClick"
},
{
@@ -10820,14 +10936,6 @@
"relatedUiObject": "Announcement",
"actionFunction": "payload.onMenuItemClick"
},
{
"action": "Add UI Object",
"disableIfPropertyIsDefined": true,
"propertyToCheckFor": "closeStageEvent",
"label": "Add Close Stage Event",
"relatedUiObject": "Close Stage Event",
"actionFunction": "payload.onMenuItemClick"
},
{
"action": "Delete UI Object",
"askConfirmation": true,
@@ -10845,6 +10953,12 @@
},
"icon": "stage-close",
"properties": [
{
"name": "initialTargets",
"type": "node",
"childType": "Initial Targets",
"autoAdd": true
},
{
"name": "closeExecution",
"type": "node",
@@ -27,15 +27,16 @@ function newSessionFunctions() {
'Trading Strategy->' +
'Trigger Stage->Trigger On Event->Trigger Off Event->Take Position Event->' +
'Announcement->Announcement Formula->' +
'Open Stage->Initial Definition->Open Execution->' +
'Position Size In Base Asset->Position Size In Quoted Asset->Position Rate->Formula->' +
'Initial Stop->Initial Take Profit->' +
'Open Stage->' +
'Initial Definition->Initial Stop->Initial Take Profit->' +
'Manage Stage->' +
'Managed Stop Loss->Managed Take Profit->' +
'Phase->Formula->Next Phase Event->Move To Phase Event->Phase->' +
'Situation->Condition->Javascript Code->' +
'Close Stage->Close Execution->' +
'Close Stage->' +
'Initial Targets->Target Size In Base Asset->Target Size In Quoted Asset->Target Rate->Formula->' +
'Announcement->Announcement Formula->' +
'Open Execution->Close Execution->' +
'Execution Algorithm->Market Buy Order->Market Sell Order->Limit Buy Order->Limit Sell Order->' +
'Create Order Event->Cancel Order Event->' +
'Size In Base Asset->Size In Quoted Asset->Position Rate->Formula->' +
@@ -62,12 +63,12 @@ function newSessionFunctions() {
'Serial Number->Identifier->Begin->End->Strategy Name->Index->Status->Begin Rate->End Rate->Situation Name->' +
'Strategy Counters->Periods->' +
'Position->' +
'Serial Number->Identifier->Begin->End->Rate->Exit Type->Status->Begin Rate->End Rate->Situation Name->' +
'Serial Number->Identifier->Begin->End->Entry Target Rate->Exit Target Rate->Exit Type->Status->Begin Rate->End Rate->Situation Name->' +
'Stop Loss->Stop Loss Stage->Stop Loss Phase->Stop Loss Position->' +
'Take Profit->Take Profit Stage->Take Profit Phase->Take Profit Position->' +
'Position Counters->Periods->' +
'Position Statistics->Days->User Defined Statistic->' +
'Position Base Asset->Position Quoted Asset->Size->Profit Loss->ROI->Hit Fail->' +
'Position Base Asset->Position Quoted Asset->Entry Target Size->Exit Target Size->Profit Loss->ROI->Hit Fail->' +
'Formula->' +
'Exchange Orders->Market Buy Orders->Market Sell Orders->Limit Buy Orders->Limit Sell Orders->' +
'Market Order->Limit Order->' +
+11 -6
View File
@@ -459,9 +459,9 @@ function newFloatingObject() {
function thisObjectPhysics() {
// The radius also have a target.
let ANIMATION_STEP = Math.abs(thisObject.targetRadius - thisObject.rawRadius) / 5
let ANIMATION_STEP = Math.abs(thisObject.targetRadius - thisObject.rawRadius) / 2
if (ANIMATION_STEP === 0) { ANIMATION_STEP = 10 }
if (ANIMATION_STEP === 0) { ANIMATION_STEP = thisObject.rawRadius }
if (Math.abs(thisObject.container.frame.radius - thisObject.targetRadius) >= ANIMATION_STEP) {
if (thisObject.container.frame.radius < thisObject.targetRadius) {
@@ -471,26 +471,30 @@ function newFloatingObject() {
}
thisObject.container.eventHandler.raiseEvent('Dimmensions Changed', event)
} else {
thisObject.container.frame.radius = thisObject.targetRadius
}
// The imageSize also have a target.
if (Math.abs(thisObject.currentImageSize - thisObject.targetImageSize) >= ANIMATION_STEP) {
if (thisObject.currentImageSize < thisObject.targetImageSize) {
thisObject.currentImageSize = thisObject.currentImageSize + ANIMATION_STEP
} else {
thisObject.currentImageSize = thisObject.currentImageSize - ANIMATION_STEP
}
} else {
thisObject.currentImageSize = thisObject.targetImageSize
}
// The fontSize also have a target.
if (Math.abs(thisObject.currentFontSize - thisObject.targetFontSize) >= ANIMATION_STEP / 10) {
if (thisObject.currentFontSize < thisObject.targetFontSize) {
thisObject.currentFontSize = thisObject.currentFontSize + ANIMATION_STEP / 10
} else {
thisObject.currentFontSize = thisObject.currentFontSize - ANIMATION_STEP / 10
}
} else {
thisObject.currentFontSize = thisObject.targetFontSize
}
if (Math.abs(thisObject.currentHierarchyRing - thisObject.targetHierarchyRing) >= ANIMATION_STEP) {
@@ -499,10 +503,11 @@ function newFloatingObject() {
} else {
thisObject.currentHierarchyRing = thisObject.currentHierarchyRing - ANIMATION_STEP
}
} else {
thisObject.currentHierarchyRing = thisObject.targetHierarchyRing
}
/* Floating object position in screen coordinates */
thisObject.payload.position.x = thisObject.container.frame.position.x
thisObject.payload.position.y = thisObject.container.frame.position.y
}
@@ -616,7 +621,7 @@ function newFloatingObject() {
thisObject.rawRadius = radius
thisObject.targetRadius = radius
thisObject.container.frame.radius = radius / 5
thisObject.container.frame.radius = radius
thisObject.container.eventHandler.raiseEvent('Dimmensions Changed', event)
}
+1 -1
View File
@@ -1323,7 +1323,7 @@ function newUiObject() {
position = canvas.floatingSpace.transformPointToMap(position)
}
let radius = thisObject.container.frame.radius
let radius = thisObject.payload.floatingObject.container.frame.radius
/* Label Text */
let labelPoint
let fontSize = thisObject.payload.floatingObject.currentFontSize
+1 -1
View File
@@ -1 +1 @@
{"type":"Data Mine","name":"Masters-Trading","config":"{ \n\"codeName\": \"Masters-Trading\"\n}","sensorBots":[],"indicatorBots":[],"tradingBots":[{"type":"Trading Bot","name":"Low Frequency","config":"{\n\"codeName\": \"Low-Frequency\"\n}","processes":[{"type":"Process Definition","name":"Trading","config":"{\n \"codeName\": \"Trading\",\n \"liveTradingWaitTime\": 0,\n \"paperTradingWaitTime\": 0,\n \"fordwardTestingWaitTime\": 0,\n \"backtestingWaitTime\": 0,\n \"sessionRunWaitTime\": 5000,\n \"retryWaitTime\": 10000,\n \"framework\": {\n \"name\": \"Low-Frequency-Trading-Process\"\n }\n }","processOutput":{"type":"Process Output","name":"New Process Output","outputDatasets":[{"type":"Output Dataset","name":"Multi-Period-Market Episode Counters","id":"6fc3054e-5034-4fc7-bddf-02360e0a6acf","savedPayload":{"position":{"x":15723.286067012163,"y":14691.452358358745},"targetPosition":{"x":19339.49171426391,"y":13174.630201482603},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Period-Market","id":"db063d7b-db05-4bf6-941f-999e1ccb38fc"}}},{"type":"Output Dataset","name":"Multi-Period-Daily Episode Counters","id":"c3c2240f-514b-40de-825f-674037117d0b","savedPayload":{"position":{"x":15661.068828320313,"y":14534.623356920203},"targetPosition":{"x":19339.49171426391,"y":13174.630201482603},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Period-Daily","id":"0764aaaf-d970-4f23-9df8-55fe5b7dd273"}}},{"type":"Output Dataset","name":"Multi-Period-Market Episode Statistics","id":"1dfdfc0d-842f-4e63-a591-256ac8a06b0f","savedPayload":{"position":{"x":15605.684950713085,"y":14375.417211070198},"targetPosition":{"x":19339.49171426391,"y":13174.630201482603},"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","id":"39360c55-5ba8-413b-b0bd-cac3789ebf5f","savedPayload":{"position":{"x":15557.234264268895,"y":14214.013724663686},"targetPosition":{"x":19339.49171426391,"y":13174.630201482603},"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 Current Candle","id":"ba614415-6e4f-4979-97a5-34c72a59e67c","savedPayload":{"position":{"x":15515.806073587833,"y":14050.694613167838},"targetPosition":{"x":19339.49171426391,"y":13174.630201482603},"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 Current Candle","id":"1a2e3461-33e6-45b1-bcc1-c56a8c5d275c","savedPayload":{"position":{"x":15481.476972643579,"y":13885.757353327504},"targetPosition":{"x":19339.49171426391,"y":13174.630201482603},"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 Current Balance","id":"567e4dc9-4deb-41e4-9ac9-dde943fb91ba","savedPayload":{"position":{"x":15454.310482593217,"y":13719.505427234359},"targetPosition":{"x":19339.49171426391,"y":13174.630201482603},"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 Current Balance","id":"e94b9bb3-9f0c-4550-94e1-09de444780a8","savedPayload":{"position":{"x":15434.356886328966,"y":13552.245779307135},"targetPosition":{"x":19339.49171426391,"y":13174.630201482603},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Period-Daily","id":"213b8fe8-f772-41ea-a3f5-97867be555f7"}}},{"type":"Output Dataset","name":"Multi-Period-Market Distance To Event","id":"a30e7306-7be9-41b6-Line truncated
{"type":"Data Mine","name":"Masters-Trading","config":"{ \n\"codeName\": \"Masters-Trading\"\n}","sensorBots":[],"indicatorBots":[],"tradingBots":[{"type":"Trading Bot","name":"Low Frequency","config":"{\n\"codeName\": \"Low-Frequency\"\n}","processes":[{"type":"Process Definition","name":"Trading","config":"{\n \"codeName\": \"Trading\",\n \"liveTradingWaitTime\": 0,\n \"paperTradingWaitTime\": 0,\n \"fordwardTestingWaitTime\": 0,\n \"backtestingWaitTime\": 0,\n \"sessionRunWaitTime\": 5000,\n \"retryWaitTime\": 10000,\n \"framework\": {\n \"name\": \"Low-Frequency-Trading-Process\"\n }\n }","processOutput":{"type":"Process Output","name":"New Process Output","outputDatasets":[{"type":"Output Dataset","name":"Multi-Period-Market Episode Counters","id":"6fc3054e-5034-4fc7-bddf-02360e0a6acf","savedPayload":{"position":{"x":15723.286067012163,"y":14691.452358358745},"targetPosition":{"x":19339.49171426391,"y":13174.630201482603},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Period-Market","id":"db063d7b-db05-4bf6-941f-999e1ccb38fc"}}},{"type":"Output Dataset","name":"Multi-Period-Daily Episode Counters","id":"c3c2240f-514b-40de-825f-674037117d0b","savedPayload":{"position":{"x":15661.068828320313,"y":14534.623356920203},"targetPosition":{"x":19339.49171426391,"y":13174.630201482603},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Period-Daily","id":"0764aaaf-d970-4f23-9df8-55fe5b7dd273"}}},{"type":"Output Dataset","name":"Multi-Period-Market Episode Statistics","id":"1dfdfc0d-842f-4e63-a591-256ac8a06b0f","savedPayload":{"position":{"x":15605.684950713085,"y":14375.417211070198},"targetPosition":{"x":19339.49171426391,"y":13174.630201482603},"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","id":"39360c55-5ba8-413b-b0bd-cac3789ebf5f","savedPayload":{"position":{"x":15557.234264268895,"y":14214.013724663686},"targetPosition":{"x":19339.49171426391,"y":13174.630201482603},"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 Current Candle","id":"ba614415-6e4f-4979-97a5-34c72a59e67c","savedPayload":{"position":{"x":15515.806073587833,"y":14050.694613167838},"targetPosition":{"x":19339.49171426391,"y":13174.630201482603},"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 Current Candle","id":"1a2e3461-33e6-45b1-bcc1-c56a8c5d275c","savedPayload":{"position":{"x":15481.476972643579,"y":13885.757353327504},"targetPosition":{"x":19339.49171426391,"y":13174.630201482603},"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 Current Balance","id":"567e4dc9-4deb-41e4-9ac9-dde943fb91ba","savedPayload":{"position":{"x":15454.310482593217,"y":13719.505427234359},"targetPosition":{"x":19339.49171426391,"y":13174.630201482603},"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 Current Balance","id":"e94b9bb3-9f0c-4550-94e1-09de444780a8","savedPayload":{"position":{"x":15434.356886328966,"y":13552.245779307135},"targetPosition":{"x":19339.49171426391,"y":13174.630201482603},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Period-Daily","id":"213b8fe8-f772-41ea-a3f5-97867be555f7"}}},{"type":"Output Dataset","name":"Multi-Period-Market Distance To Event","id":"a30e7306-7be9-41b6-Line truncated
+1 -1
View File
@@ -1 +1 @@
{"type":"Workspace","name":"Beta 6 - Testing WHB","rootNodes":[{"type":"Network","name":"Superalgos","networkNodes":[{"type":"Network Node","name":"My Computer","config":"{ \n\"host\": \"localhost\", \n\"webPort\": \"34248\", \n\"webSocketsPort\": \"8081\"\n}","dataStorage":{"type":"Data Storage","name":"New Data Storage","sessionIndependentData":{"type":"Session Independent Data","name":"New Session Independent Data","exchangeDataProducts":[{"type":"Exchange Data Products","name":"Binance","singleMarketData":[{"type":"Single Market Data","name":"Binance BTC/USDT","dataProducts":[{"type":"Data Product","name":"Candles","id":"dd7c8795-bb24-4438-9d77-b37a9000ad7f","savedPayload":{"position":{"x":23357.055360727853,"y":29739.13668562185},"targetPosition":{"x":24208.69903024272,"y":28943.27543890267},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Product Definition","name":"Candles","id":"fe6065ec-4d2d-47a0-bae0-8647f0e195d7"}}},{"type":"Data Product","name":"Volumes","id":"98e6c917-f4b7-4b71-9215-de3ccaf3dc0c","savedPayload":{"position":{"x":23291.030236843966,"y":29662.131374764274},"targetPosition":{"x":24208.69903024272,"y":28943.27543890267},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Product Definition","name":"Volumes","id":"1a366aef-efef-470e-88e0-2a6fbe4dd91f"}}},{"type":"Data Product","name":"Candles Channels","id":"1d7dd537-5f6f-4eb2-8e56-ddba0aef720f","savedPayload":{"position":{"x":23231.77091792585,"y":29579.512296539906},"targetPosition":{"x":24208.69903024272,"y":28943.27543890267},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Product Definition","name":"Candles Channels","id":"8c81d378-0947-4e9d-be25-58e69120152e"}}},{"type":"Data Product","name":"Candles Channels Objects","id":"221c8d22-8a7f-4014-a7ed-0bafc886b123","savedPayload":{"position":{"x":23179.942027683566,"y":29492.078725813997},"targetPosition":{"x":24208.69903024272,"y":28943.27543890267},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Product Definition","name":"Candles Channels Objects","id":"ba5dbb67-2030-42a0-9ff8-1ee80874f047"}}},{"type":"Data Product","name":"Bollinger Bands","id":"6929ebe7-6486-4299-add5-ed0282500d91","savedPayload":{"position":{"x":23135.872351370694,"y":29400.352192197388},"targetPosition":{"x":24208.69903024272,"y":28943.27543890267},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Product Definition","name":"Bollinger Bands","id":"29088877-8d63-4217-8d34-8742afc262f4"}}},{"type":"Data Product","name":"Percentage Bandwidth","id":"4a3ed8eb-a73e-4fb4-835a-681cf47d7373","savedPayload":{"position":{"x":23099.965969252025,"y":29305.112951112584},"targetPosition":{"x":24208.69903024272,"y":28943.27543890267},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Product Definition","name":"Percentage Bandwidth","id":"3b7885a0-cd72-4a3f-a38b-3dc8c47bd068"}}},{"type":"Data Product","name":"Bollinger Channels Objects","id":"5ffc6a67-e33b-422b-8e36-f9711f93c723","savedPayload":{"position":{"x":23072.49341713892,"y":29207.0453495464},"targetPosition":{"x":24208.69903024272,"y":28943.27543890267},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Product Definition","name":"Bollinger Channels Objects","id":"1f111f72-624f-4166-9f99-ab8d785d5267"}}},{"type":"Data Product","name":"Bollinger Sub-Channels Objects","id":"48f7953c-f62d-4292-b042-d1ac05f8f80f","savedPayload":{"position":{"x":23053.683458829226,"y":29106.890611883788},"targetPosition":{"x":24208.69903024272,"y":28943.27543890267},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Product Definition","name":"Bollinger Sub-Channels Objects","id":"080c87fc-4546-4482-ab11-180a33f6d9ab"}}},{"type":"Data Product","name":"Popular SMAs","id":"3b9a3c93-6d41-440e-89a2-2fd1b2dde603","savedPayload":{"position":{"x":23043.701100505998,"y":29005.50001492274},"targetPosition":{"x":24208.69903024272,"y":28943.27543890267},"floatingObject":{"isPinned":false,"isFrozen"Line truncated
{"type":"Workspace","name":"Beta 6 - Testing WHB","rootNodes":[{"type":"Network","name":"Superalgos","networkNodes":[{"type":"Network Node","name":"My Computer","config":"{ \n\"host\": \"localhost\", \n\"webPort\": \"34248\", \n\"webSocketsPort\": \"8081\"\n}","dataStorage":{"type":"Data Storage","name":"New Data Storage","sessionIndependentData":{"type":"Session Independent Data","name":"New Session Independent Data","exchangeDataProducts":[{"type":"Exchange Data Products","name":"Binance","singleMarketData":[{"type":"Single Market Data","name":"Binance BTC/USDT","dataProducts":[{"type":"Data Product","name":"Candles","id":"dd7c8795-bb24-4438-9d77-b37a9000ad7f","savedPayload":{"position":{"x":23357.055360727853,"y":29739.13668562185},"targetPosition":{"x":24208.69903024272,"y":28943.27543890267},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Product Definition","name":"Candles","id":"fe6065ec-4d2d-47a0-bae0-8647f0e195d7"}}},{"type":"Data Product","name":"Volumes","id":"98e6c917-f4b7-4b71-9215-de3ccaf3dc0c","savedPayload":{"position":{"x":23291.030236843966,"y":29662.131374764274},"targetPosition":{"x":24208.69903024272,"y":28943.27543890267},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Product Definition","name":"Volumes","id":"1a366aef-efef-470e-88e0-2a6fbe4dd91f"}}},{"type":"Data Product","name":"Candles Channels","id":"1d7dd537-5f6f-4eb2-8e56-ddba0aef720f","savedPayload":{"position":{"x":23231.77091792585,"y":29579.512296539906},"targetPosition":{"x":24208.69903024272,"y":28943.27543890267},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Product Definition","name":"Candles Channels","id":"8c81d378-0947-4e9d-be25-58e69120152e"}}},{"type":"Data Product","name":"Candles Channels Objects","id":"221c8d22-8a7f-4014-a7ed-0bafc886b123","savedPayload":{"position":{"x":23179.942027683566,"y":29492.078725813997},"targetPosition":{"x":24208.69903024272,"y":28943.27543890267},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Product Definition","name":"Candles Channels Objects","id":"ba5dbb67-2030-42a0-9ff8-1ee80874f047"}}},{"type":"Data Product","name":"Bollinger Bands","id":"6929ebe7-6486-4299-add5-ed0282500d91","savedPayload":{"position":{"x":23135.872351370694,"y":29400.352192197388},"targetPosition":{"x":24208.69903024272,"y":28943.27543890267},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Product Definition","name":"Bollinger Bands","id":"29088877-8d63-4217-8d34-8742afc262f4"}}},{"type":"Data Product","name":"Percentage Bandwidth","id":"4a3ed8eb-a73e-4fb4-835a-681cf47d7373","savedPayload":{"position":{"x":23099.965969252025,"y":29305.112951112584},"targetPosition":{"x":24208.69903024272,"y":28943.27543890267},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Product Definition","name":"Percentage Bandwidth","id":"3b7885a0-cd72-4a3f-a38b-3dc8c47bd068"}}},{"type":"Data Product","name":"Bollinger Channels Objects","id":"5ffc6a67-e33b-422b-8e36-f9711f93c723","savedPayload":{"position":{"x":23072.49341713892,"y":29207.0453495464},"targetPosition":{"x":24208.69903024272,"y":28943.27543890267},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Product Definition","name":"Bollinger Channels Objects","id":"1f111f72-624f-4166-9f99-ab8d785d5267"}}},{"type":"Data Product","name":"Bollinger Sub-Channels Objects","id":"48f7953c-f62d-4292-b042-d1ac05f8f80f","savedPayload":{"position":{"x":23053.683458829226,"y":29106.890611883788},"targetPosition":{"x":24208.69903024272,"y":28943.27543890267},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Product Definition","name":"Bollinger Sub-Channels Objects","id":"080c87fc-4546-4482-ab11-180a33f6d9ab"}}},{"type":"Data Product","name":"Popular SMAs","id":"3b9a3c93-6d41-440e-89a2-2fd1b2dde603","savedPayload":{"position":{"x":23043.701100505998,"y":29005.50001492274},"targetPosition":{"x":24208.69903024272,"y":28943.27543890267},"floatingObject":{"isPinned":false,"isFrozen"Line truncated
-1
View File
@@ -1 +0,0 @@
{"type":"Workspace","name":"Beta 6","rootNodes":[{"type":"Network","name":"Superalgos","networkNodes":[{"type":"Network Node","name":"My Computer","config":"{ \n\"host\": \"localhost\", \n\"webPort\": \"34248\", \n\"webSocketsPort\": \"8081\"\n}","dataStorage":{"type":"Data Storage","name":"New Data Storage","sessionIndependentData":{"type":"Session Independent Data","name":"New Session Independent Data","exchangeDataProducts":[{"type":"Exchange Data Products","name":"Binance","singleMarketData":[{"type":"Single Market Data","name":"Binance BTC/USDT","dataProducts":[{"type":"Data Product","name":"Candles","id":"dd7c8795-bb24-4438-9d77-b37a9000ad7f","savedPayload":{"position":{"x":23357.055360727853,"y":29739.13668562185},"targetPosition":{"x":24208.69903024272,"y":28943.27543890267},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Product Definition","name":"Candles","id":"fe6065ec-4d2d-47a0-bae0-8647f0e195d7"}}},{"type":"Data Product","name":"Volumes","id":"98e6c917-f4b7-4b71-9215-de3ccaf3dc0c","savedPayload":{"position":{"x":23291.030236843966,"y":29662.131374764274},"targetPosition":{"x":24208.69903024272,"y":28943.27543890267},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Product Definition","name":"Volumes","id":"1a366aef-efef-470e-88e0-2a6fbe4dd91f"}}},{"type":"Data Product","name":"Candles Channels","id":"1d7dd537-5f6f-4eb2-8e56-ddba0aef720f","savedPayload":{"position":{"x":23231.77091792585,"y":29579.512296539906},"targetPosition":{"x":24208.69903024272,"y":28943.27543890267},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Product Definition","name":"Candles Channels","id":"8c81d378-0947-4e9d-be25-58e69120152e"}}},{"type":"Data Product","name":"Candles Channels Objects","id":"221c8d22-8a7f-4014-a7ed-0bafc886b123","savedPayload":{"position":{"x":23179.942027683566,"y":29492.078725813997},"targetPosition":{"x":24208.69903024272,"y":28943.27543890267},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Product Definition","name":"Candles Channels Objects","id":"ba5dbb67-2030-42a0-9ff8-1ee80874f047"}}},{"type":"Data Product","name":"Bollinger Bands","id":"6929ebe7-6486-4299-add5-ed0282500d91","savedPayload":{"position":{"x":23135.872351370694,"y":29400.352192197388},"targetPosition":{"x":24208.69903024272,"y":28943.27543890267},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Product Definition","name":"Bollinger Bands","id":"29088877-8d63-4217-8d34-8742afc262f4"}}},{"type":"Data Product","name":"Percentage Bandwidth","id":"4a3ed8eb-a73e-4fb4-835a-681cf47d7373","savedPayload":{"position":{"x":23099.965969252025,"y":29305.112951112584},"targetPosition":{"x":24208.69903024272,"y":28943.27543890267},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Product Definition","name":"Percentage Bandwidth","id":"3b7885a0-cd72-4a3f-a38b-3dc8c47bd068"}}},{"type":"Data Product","name":"Bollinger Channels Objects","id":"5ffc6a67-e33b-422b-8e36-f9711f93c723","savedPayload":{"position":{"x":23072.49341713892,"y":29207.0453495464},"targetPosition":{"x":24208.69903024272,"y":28943.27543890267},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Product Definition","name":"Bollinger Channels Objects","id":"1f111f72-624f-4166-9f99-ab8d785d5267"}}},{"type":"Data Product","name":"Bollinger Sub-Channels Objects","id":"48f7953c-f62d-4292-b042-d1ac05f8f80f","savedPayload":{"position":{"x":23053.683458829226,"y":29106.890611883788},"targetPosition":{"x":24208.69903024272,"y":28943.27543890267},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Product Definition","name":"Bollinger Sub-Channels Objects","id":"080c87fc-4546-4482-ab11-180a33f6d9ab"}}},{"type":"Data Product","name":"Popular SMAs","id":"3b9a3c93-6d41-440e-89a2-2fd1b2dde603","savedPayload":{"position":{"x":23043.701100505998,"y":29005.50001492274},"targetPosition":{"x":24208.69903024272,"y":28943.27543890267},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollLine truncated
@@ -80,7 +80,7 @@ exports.newTradingExecution = function newTradingExecution(bot, logger, tradingE
let tradingSystemOrder = orders[i]
/* Trading System Validations */
if (tradingSystemOrder.config.positionSizePercentage === undefined) { badDefinitionUnhandledException(undefined, 'tradingSystemOrder.config.positionSizePercentage === undefined', tradingSystemOrder) }
if (tradingSystemOrder.config.percentageOfAlgorithmSize === undefined) { badDefinitionUnhandledException(undefined, 'tradingSystemOrder.config.percentageOfAlgorithmSize === undefined', tradingSystemOrder) }
if (tradingSystemOrder.referenceParent === undefined) { badDefinitionUnhandledException(undefined, 'tradingSystemOrder.referenceParent === undefined', tradingSystemOrder) }
let tradingEngineOrder = tradingEngineModule.getNodeById(tradingSystemOrder.referenceParent.id)
@@ -204,11 +204,13 @@ exports.newTradingExecution = function newTradingExecution(bot, logger, tradingE
tradingEngineOrder.situationName.value = situationName
function calculateOrderRate() {
/* Order Rate Calculation */
tradingEngineOrder.rate.value = tradingEngine.current.position.rate.value // By default this is the order rate.
if (tradingSystemOrder.positionRate !== undefined) {
if (tradingSystemOrder.positionRate.formula !== undefined) {
tradingEngineOrder.rate.value = tradingSystem.formulas.get(tradingSystemOrder.positionRate.formula.id)
/* By default this is the order rate and it is the rate that applies to Market Orders */
tradingEngineOrder.rate.value = tradingEngine.current.candle.close.value
/* Optional Rate Definition */
if (tradingSystemOrder.orderRate !== undefined) {
if (tradingSystemOrder.orderRate.formula !== undefined) {
tradingEngineOrder.rate.value = tradingSystem.formulas.get(tradingSystemOrder.orderRate.formula.id)
if (tradingEngineOrder.rate.value === undefined) { badDefinitionUnhandledException(undefined, 'tradingEngineOrder.rate.value === undefined', tradingEngineOrder) }
if (isNaN(tradingEngineOrder.rate.value) === true) { badDefinitionUnhandledException(undefined, 'isNaN(tradingEngineOrder.rate.value) === true', tradingEngineOrder) }
@@ -220,45 +222,24 @@ exports.newTradingExecution = function newTradingExecution(bot, logger, tradingE
}
function calculateOrderSize() {
/*
If the position size was defined in Base Asset, then
the algorithm needs to define its size also in Base Asset.
The same if it was deined in Quoted Asset.
*/
let sizeFormula
if (tradingEngine.current.position.positionBaseAsset.size.value > 0) {
/* Position was defined in Base Asset */
if (executionAlgorithm.sizeInBaseAsset === undefined) { badDefinitionUnhandledException(undefined, 'executionAlgorithm.sizeInBaseAsset === undefined', executionAlgorithm) }
if (executionAlgorithm.sizeInBaseAsset.formula === undefined) { badDefinitionUnhandledException(undefined, 'executionAlgorithm.sizeInBaseAsset.formula === undefined', executionAlgorithm.sizeInBaseAsset) }
sizeFormula = executionAlgorithm.sizeInBaseAsset.formula
} else {
/* Position was defined in Quoted Asset */
if (executionAlgorithm.sizeInQuotedAsset === undefined) { badDefinitionUnhandledException(undefined, 'executionAlgorithm.sizeInQuotedAsset === undefined', executionAlgorithm) }
if (executionAlgorithm.sizeInQuotedAsset.formula === undefined) { badDefinitionUnhandledException(undefined, 'executionAlgorithm.sizeInQuotedAsset.formula === undefined', executionAlgorithm.sizeInBaseAsset) }
sizeFormula = executionAlgorithm.sizeInQuotedAsset.formula
}
/* Validate that this config exists */
if (executionAlgorithm.config.percentageOfStageTargetSize === undefined) { badDefinitionUnhandledException(undefined, 'executionAlgorithm.config.percentageOfStageTargetSize === undefined', executionAlgorithm) }
if (isNaN(executionAlgorithm.config.percentageOfStageTargetSize) === true) { badDefinitionUnhandledException(undefined, 'isNaN(executionAlgorithm.config.percentageOfStageTargetSize) === true', executionAlgorithm) }
/* Order Size Calculation */
let algorithmSize = tradingSystem.formulas.get(sizeFormula.id)
if (algorithmSize === undefined) { badDefinitionUnhandledException(undefined, 'algorithmSize === undefined', sizeFormula) }
if (isNaN(algorithmSize) === true) { badDefinitionUnhandledException(undefined, 'isNaN(algorithmSize) === true', sizeFormula) }
let algorithmSizeInBaseAsset = tradingEngineStage.stageBaseAsset.targetSize.value * executionAlgorithm.config.percentageOfStageTargetSize / 100
let algorithmSizeInQuotedAsset = tradingEngineStage.stageQuotedAsset.targetSize.value * executionAlgorithm.config.percentageOfStageTargetSize / 100
/* Validate that this config exists */
if (tradingSystemOrder.config.positionSizePercentage === undefined) { badDefinitionUnhandledException(undefined, 'tradingSystemOrder.config.positionSizePercentage === undefined', executionAlgorithm) }
if (tradingSystemOrder.config.percentageOfAlgorithmSize === undefined) { badDefinitionUnhandledException(undefined, 'tradingSystemOrder.config.percentageOfAlgorithmSize === undefined', tradingSystemOrder) }
if (isNaN(tradingSystemOrder.config.percentageOfAlgorithmSize) === true) { badDefinitionUnhandledException(undefined, 'isNaN(tradingSystemOrder.config.percentageOfAlgorithmSize) === true', tradingSystemOrder) }
if (tradingEngine.current.position.positionBaseAsset.size.value > 0) {
/* Position was defined in Base Asset */
tradingEngineOrder.orderBaseAsset.size.value = algorithmSize * tradingSystemOrder.config.positionSizePercentage / 100
tradingEngineOrder.orderQuotedAsset.size.value = tradingEngineOrder.orderBaseAsset.size.value * tradingEngineOrder.rate.value
} else {
/* Position was defined in Quoted Asset */
tradingEngineOrder.orderQuotedAsset.size.value = algorithmSize * tradingSystemOrder.config.positionSizePercentage / 100
tradingEngineOrder.orderBaseAsset.size.value = tradingEngineOrder.orderQuotedAsset.size.value / tradingEngineOrder.rate.value
}
tradingEngineOrder.orderBaseAsset.size.value = global.PRECISE(tradingEngineOrder.orderBaseAsset.size.value, 10)
tradingEngineOrder.orderBaseAsset.size.value = global.PRECISE(tradingEngineOrder.orderBaseAsset.size.value, 10)
/* Size in Base Asset */
tradingEngineOrder.orderBaseAsset.size.value = algorithmSizeInBaseAsset * tradingSystemOrder.config.percentageOfAlgorithmSize / 100
/* Check against the Stage Size Limit */
/* Size in Quoted Asset */
tradingEngineOrder.orderQuotedAsset.size.value = algorithmSizeInQuotedAsset * tradingSystemOrder.config.percentageOfAlgorithmSize / 100
/* Check that the Size calculated would not surpass Stage Target Size */
if (
tradingEngineOrder.orderBaseAsset.size.value + tradingEngineStage.stageBaseAsset.sizePlaced.value >
tradingEngineStage.stageBaseAsset.targetSize.value
@@ -271,6 +252,9 @@ exports.newTradingExecution = function newTradingExecution(bot, logger, tradingE
) {
tradingEngineOrder.orderQuotedAsset.size.value = tradingEngineStage.stageQuotedAsset.targetSize.value - tradingEngineStage.stageQuotedAsset.sizePlaced.value
}
tradingEngineOrder.orderBaseAsset.size.value = global.PRECISE(tradingEngineOrder.orderBaseAsset.size.value, 10)
tradingEngineOrder.orderQuotedAsset.size.value = global.PRECISE(tradingEngineOrder.orderQuotedAsset.size.value, 10)
}
async function createOrderAtExchange(tradingSystemOrder, tradingEngineOrder) {
@@ -319,7 +303,9 @@ exports.newTradingExecution = function newTradingExecution(bot, logger, tradingE
}
/* Filter by what is defined at the Strategy */
if (tradingSystemOrder.simulatedExchangeEvents === undefined) { return }
if (tradingSystemOrder.simulatedExchangeEvents === undefined) {
badDefinitionUnhandledException(undefined, 'tradingSystemOrder.simulatedExchangeEvents === undefined', tradingSystemOrder)
}
let previousBaseAssetSizeFilled = tradingEngineOrder.orderBaseAsset.sizeFilled.value
let previousQuotedAssetSizeFilled = tradingEngineOrder.orderQuotedAsset.sizeFilled.value
@@ -481,11 +467,11 @@ exports.newTradingExecution = function newTradingExecution(bot, logger, tradingE
function sizeFilledSimulation() {
/* Size Filled */
tradingEngineOrder.orderBaseAsset.sizeFilled.value =
tradingEngineOrder.orderBaseAsset.size.value *
(tradingEngineOrder.orderBaseAsset.size.value - tradingEngineOrder.orderBaseAsset.feesPaid.value) *
tradingEngineOrder.orderStatistics.percentageFilled.value / 100
tradingEngineOrder.orderQuotedAsset.sizeFilled.value =
tradingEngineOrder.orderQuotedAsset.size.value *
(tradingEngineOrder.orderQuotedAsset.size.value - tradingEngineOrder.orderQuotedAsset.feesPaid.value) *
tradingEngineOrder.orderStatistics.percentageFilled.value / 100
tradingEngineOrder.orderBaseAsset.sizeFilled.value = global.PRECISE(tradingEngineOrder.orderBaseAsset.sizeFilled.value, 10)
+118 -76
View File
@@ -11,7 +11,7 @@ exports.newTradingPosition = function newTradingPosition(bot, logger, tradingEng
applyTakeProfitFormula: applyTakeProfitFormula,
updateStopLoss: updateStopLoss,
updateTakeProfit: updateTakeProfit,
initializePositionSizeAndRate: initializePositionSizeAndRate,
initialTargets: initialTargets,
updateEnds: updateEnds,
updateStatus: updateStatus,
updateCounters: updateCounters,
@@ -100,93 +100,122 @@ exports.newTradingPosition = function newTradingPosition(bot, logger, tradingEng
tradingEngine.current.position.takeProfit.takeProfitStage.value = stage
}
function initializePositionSizeAndRate() {
function initialTargets(stageNode) {
setPositionSize()
setPositionRate()
if (stageNode.initialTargets === undefined) {
const message = 'Stage without Initial Targets node. Add one please.'
badDefinitionUnhandledException(undefined, message, stageNode)
}
tradingEngine.current.position.beginRate.value = tradingEngine.current.position.rate.value
setTargetRate()
setTargetSize()
function setPositionSize() {
let strategy = tradingSystem.tradingStrategies[tradingEngine.current.strategy.index.value]
/* Basic Validation */
if (
strategy.openStage.initialDefinition.positionSizeInBaseAsset !== undefined &&
strategy.openStage.initialDefinition.positionSizeInQuotedAsset !== undefined
) {
const errorText = 'Only Position Size In Base Asset or Position Size In Quoted Asset is allowed. Remove one of them please.'
tradingSystem.errors.push([strategy.openStage.initialDefinition.id, errorText])
throw (errorText)
function setTargetRate() {
if (stageNode.initialTargets.targetRate === undefined) {
const message = 'Target Rate Node not Found. Fix this please.'
badDefinitionUnhandledException(undefined, message, stageNode.initialTargets)
}
if (stageNode.initialTargets.targetRate.formula === undefined) {
const message = 'Formula of Target Rate Node not Found. Fix this please.'
badDefinitionUnhandledException(undefined, message, stageNode.initialTargets.targetRate)
}
/* Position In Base Asset */
if (strategy.openStage.initialDefinition.positionSizeInBaseAsset !== undefined) {
if (strategy.openStage.initialDefinition.positionSizeInBaseAsset.formula !== undefined) {
let value = tradingSystem.formulas.get(strategy.openStage.initialDefinition.positionSizeInBaseAsset.formula.id)
if (value === undefined) {
const errorText = 'Position Size In Base Asset cannot be undefined. Fix this please.'
tradingSystem.errors.push([strategy.openStage.initialDefinition.positionSizeInBaseAsset.formula.id, errorText])
throw (errorText)
}
if (value === undefined) {
const errorText = 'Position Size In Base Asset cannot be zero. Fix this please.'
tradingSystem.errors.push([strategy.openStage.initialDefinition.positionSizeInBaseAsset.formula.id, errorText])
throw (errorText)
}
tradingEngine.current.position.positionBaseAsset.size.value = global.PRECISE(value, 10)
} else {
const errorText = 'You need to specify a Formula for this.'
tradingSystem.errors.push([strategy.openStage.initialDefinition.positionSizeInBaseAsset.id, errorText])
throw (errorText)
let value = tradingSystem.formulas.get(stageNode.initialTargets.targetRate.formula.id)
if (value === undefined) {
const message = 'Target Rate can not be undefined. Fix this please.'
badDefinitionUnhandledException(undefined, message, stageNode.initialTargets.targetRate.formula)
}
if (isNaN(value)) {
const message = 'Target Rate must be a number. Fix this please.'
badDefinitionUnhandledException(undefined, message, stageNode.initialTargets.targetRate.formula)
}
switch (stageNode.type) {
case 'Open Stage': {
tradingEngine.current.position.entryTargetRate.value = global.PRECISE(value, 10)
break
}
}
/* Position In Quoted Asset */
if (strategy.openStage.initialDefinition.positionSizeInQuotedAsset !== undefined) {
if (strategy.openStage.initialDefinition.positionSizeInQuotedAsset.formula !== undefined) {
let value = tradingSystem.formulas.get(strategy.openStage.initialDefinition.positionSizeInQuotedAsset.formula.id)
if (value === undefined) {
const errorText = 'Position Size In Quoted Asset cannot be undefined. Fix this please.'
tradingSystem.errors.push([strategy.openStage.initialDefinition.positionSizeInQuotedAsset.formula.id, errorText])
throw (errorText)
}
if (value === undefined) {
const errorText = 'Position Size In Quoted Asset cannot be zero. Fix this please.'
tradingSystem.errors.push([strategy.openStage.initialDefinition.positionSizeInQuotedAsset.formula.id, errorText])
throw (errorText)
}
tradingEngine.current.position.positionQuotedAsset.size.value = global.PRECISE(value, 10)
} else {
const errorText = 'You need to specify a Formula for this.'
tradingSystem.errors.push([strategy.openStage.initialDefinition.positionSizeInQuotedAsset.id, errorText])
throw (errorText)
case 'Close Stage': {
tradingEngine.current.position.exitTargetRate.value = global.PRECISE(value, 10)
break
}
}
}
function setPositionRate() {
let strategy = tradingSystem.tradingStrategies[tradingEngine.current.strategy.index.value]
if (strategy.openStage.initialDefinition.positionRate === undefined) {
const errorText = 'Position Rate Node not Found. Fix this please.'
tradingSystem.errors.push([strategy.openStage.initialDefinition.id, errorText])
throw (errorText)
}
if (strategy.openStage.initialDefinition.positionRate.formula === undefined) {
const errorText = 'Formula of Position Rate Node not Found. Fix this please.'
tradingSystem.errors.push([strategy.openStage.initialDefinition.positionRate.id, errorText])
throw (errorText)
function setTargetSize() {
/* Basic Validation */
if (
stageNode.initialTargets.targetSizeInBaseAsset !== undefined &&
stageNode.initialTargets.targetSizeInQuotedAsset !== undefined
) {
const message = 'Only Target Size In Base Asset or Target Size In Quoted Asset is allowed. Remove one of them please.'
badDefinitionUnhandledException(undefined, message, stageNode)
}
let value = tradingSystem.formulas.get(strategy.openStage.initialDefinition.positionRate.formula.id)
if (value === undefined) {
const errorText = 'Position Rate can not be undefined. Fix this please.'
tradingSystem.errors.push([strategy.openStage.initialDefinition.positionRate.formula.id, errorText])
throw (errorText)
/* Position In Base Asset */
if (stageNode.initialTargets.targetSizeInBaseAsset !== undefined) {
if (stageNode.initialTargets.targetSizeInBaseAsset.formula !== undefined) {
let value = tradingSystem.formulas.get(stageNode.initialTargets.targetSizeInBaseAsset.formula.id)
if (value === undefined) {
const message = 'Target Size In Base Asset cannot be undefined. Fix this please.'
badDefinitionUnhandledException(undefined, message, stageNode.initialTargets.targetSizeInBaseAsset.formula)
}
if (value === undefined) {
const message = 'Target Size In Base Asset cannot be zero. Fix this please.'
badDefinitionUnhandledException(undefined, message, stageNode.initialTargets.targetSizeInBaseAsset.formula)
}
switch (stageNode.type) {
case 'Open Stage': {
tradingEngine.current.position.positionBaseAsset.entryTargetSize.value = global.PRECISE(value, 10)
tradingEngine.current.position.positionQuotedAsset.entryTargetSize.value =
global.PRECISE(value * tradingEngine.current.position.entryTargetRate.value, 10)
break
}
case 'Close Stage': {
tradingEngine.current.position.positionBaseAsset.exitTargetSize.value = global.PRECISE(value, 10)
tradingEngine.current.position.positionQuotedAsset.exitTargetSize.value =
global.PRECISE(value * tradingEngine.current.position.exitTargetRate.value, 10)
break
}
}
} else {
const message = 'You need to specify a Formula for this.'
badDefinitionUnhandledException(undefined, message, stageNode.initialTargets.targetSizeInBaseAsset)
}
}
tradingEngine.current.position.rate.value = value
/* Position In Quoted Asset */
if (stageNode.initialTargets.targetSizeInQuotedAsset !== undefined) {
if (stageNode.initialTargets.targetSizeInQuotedAsset.formula !== undefined) {
let value = tradingSystem.formulas.get(stageNode.initialTargets.targetSizeInQuotedAsset.formula.id)
if (value === undefined) {
const message = 'Target Size In Quoted Asset cannot be undefined. Fix this please.'
badDefinitionUnhandledException(undefined, message, stageNode.initialTargets.targetSizeInQuotedAsset.formula)
}
if (value === undefined) {
const message = 'Target Size In Quoted Asset cannot be zero. Fix this please.'
badDefinitionUnhandledException(undefined, message, stageNode.initialTargets.targetSizeInQuotedAsset.formula)
}
switch (stageNode.type) {
case 'Open Stage': {
tradingEngine.current.position.positionQuotedAsset.entryTargetSize.value = global.PRECISE(value, 10)
tradingEngine.current.position.positionBaseAsset.entryTargetSize.value =
global.PRECISE(value / tradingEngine.current.position.entryTargetRate.value, 10)
break
}
case 'Close Stage': {
tradingEngine.current.position.positionQuotedAsset.exitTargetSize.value = global.PRECISE(value, 10)
tradingEngine.current.position.positionBaseAsset.exitTargetSize.value =
global.PRECISE(value / tradingEngine.current.position.exitTargetRate.value, 10)
break
}
}
} else {
const errorText = 'You need to specify a Formula for this.'
badDefinitionUnhandledException(undefined, message, stageNode.initialTargets.targetSizeInQuotedAsset.formula)
}
}
}
}
@@ -233,11 +262,11 @@ exports.newTradingPosition = function newTradingPosition(bot, logger, tradingEng
/* ROI Calculation */
tradingEngine.current.position.positionBaseAsset.ROI.value =
tradingEngine.current.position.positionBaseAsset.profitLoss.value * 100 /
tradingEngine.current.position.positionBaseAsset.size.value
tradingEngine.current.position.positionBaseAsset.entryTargetSize.value
tradingEngine.current.position.positionQuotedAsset.ROI.value =
tradingEngine.current.position.positionQuotedAsset.profitLoss.value * 100 /
tradingEngine.current.position.positionQuotedAsset.size.value
tradingEngine.current.position.positionQuotedAsset.entryTargetSize.value
tradingEngine.current.position.positionBaseAsset.ROI.value = global.PRECISE(tradingEngine.current.position.positionBaseAsset.ROI.value, 10)
@@ -253,4 +282,17 @@ exports.newTradingPosition = function newTradingPosition(bot, logger, tradingEng
tradingEngine.current.position.positionQuotedAsset.hitFail.value = 'FAIL'
}
}
function badDefinitionUnhandledException(err, message, node) {
tradingSystem.errors.push([node.id, message])
logger.write(MODULE_NAME, "[ERROR] -> " + message);
logger.write(MODULE_NAME, "[ERROR] -> node.name = " + node.name);
logger.write(MODULE_NAME, "[ERROR] -> node.type = " + node.type);
logger.write(MODULE_NAME, "[ERROR] -> node.config = " + JSON.stringify(node.config));
if (err !== undefined) {
logger.write(MODULE_NAME, "[ERROR] -> err.stack = " + err.stack);
}
throw 'It is not safe to continue with a Definition Error like this. Please fix the problem and try again.'
}
}
+108 -57
View File
@@ -343,9 +343,10 @@ exports.newTradingStages = function newTradingStages(bot, logger, tradingEngineM
tradingEngine.previous.balance.baseAsset.value = tradingEngine.current.balance.baseAsset.value
tradingEngine.previous.balance.quotedAsset.value = tradingEngine.current.balance.quotedAsset.value
/* Position size and rate */
tradingPositionModule.initializePositionSizeAndRate()
initializeOpenStageSizeTarget()
/* Entry Position size and rate */
tradingSystem.evalFormulas(stageNode, 'Initial Targets')
tradingPositionModule.initialTargets(stageNode)
initializeStageTargetSize()
/* Check Execution at open stage node */
tradingSystem.evalConditions(stageNode, 'Open Execution')
@@ -381,16 +382,36 @@ exports.newTradingStages = function newTradingStages(bot, logger, tradingEngineM
tradingEngine.current.strategyOpenStage
)
/*
The Open is finished when the fillSize + feesPaid reaches the Position Size.
This can happens at any time when we update the sizeFilled value when we see
at the exchange that orders were filled.
The Open is finished when the placedSize reaches the targetSize in any of the
stage assets, and the fillSize + feesPaid reaches the placedSize also in any
of the stage Assets.
This can happens at any time when we update the sizeFilled and the feesPaid values
when we see at the exchange that orders were filled.
*/
if (
tradingEngine.current.strategyOpenStage.stageBaseAsset.sizeFilled.value +
tradingEngine.current.strategyOpenStage.stageBaseAsset.feesPaid.value >=
tradingEngine.current.strategyOpenStage.stageBaseAsset.sizePlaced.value * 0.999) {
(
tradingEngine.current.strategyOpenStage.stageBaseAsset.sizePlaced >=
tradingEngine.current.strategyOpenStage.stageBaseAsset.targetSize
||
tradingEngine.current.strategyOpenStage.stageQuotedAsset.sizePlaced >=
tradingEngine.current.strategyOpenStage.stageQuotedAsset.targetSize
)
&&
(
tradingEngine.current.strategyOpenStage.stageBaseAsset.sizeFilled.value +
tradingEngine.current.strategyOpenStage.stageBaseAsset.feesPaid.value >=
tradingEngine.current.strategyOpenStage.stageBaseAsset.sizePlaced.value
||
tradingEngine.current.strategyOpenStage.stageQuotedAsset.sizeFilled.value +
tradingEngine.current.strategyOpenStage.stageQuotedAsset.feesPaid.value >=
tradingEngine.current.strategyOpenStage.stageQuotedAsset.sizePlaced.value
)
) {
changeStageStatus('Open Stage', 'Closed', 'Position Size Filled')
initializeCloseStageSizeTarget()
} else {
/* Check the Close Stage Event */
tradingSystem.evalConditions(stageNode, 'Close Stage Event')
@@ -409,63 +430,51 @@ exports.newTradingStages = function newTradingStages(bot, logger, tradingEngineM
let stageNode = tradingSystem.tradingStrategies[tradingEngine.current.strategy.index.value].openStage
let executionNode = stageNode.openExecution
/* Check if there are unfilled orders */
if (
tradingEngine.current.strategyOpenStage.stageBaseAsset.sizeFilled.value +
tradingEngine.current.strategyOpenStage.stageBaseAsset.feesPaid.value <
tradingEngine.current.strategyOpenStage.stageBaseAsset.sizePlaced.value * 0.999) {
/* There are unfilled orders, we will check if they were executed, and cancel the ones that were not. */
/*
Check if there are unfilled orders, we will check if they were executed,
and cancel the ones that were not.
*/
tradingSystem.evalConditions(stageNode, 'Open Execution')
tradingSystem.evalFormulas(stageNode, 'Open Execution')
tradingSystem.evalConditions(stageNode, 'Open Execution')
tradingSystem.evalFormulas(stageNode, 'Open Execution')
await tradingExecutionModule.runExecution(
executionNode,
true,
tradingEngine.current.strategyOpenStage
)
}
await tradingExecutionModule.runExecution(
executionNode,
true,
tradingEngine.current.strategyOpenStage
)
/*
The Closing is finished when the fillSize + feesPaid reaches the ordersSize.
This can happens either because we update the sizeFilled value when we see
at the exchange that orders were filled, or we reduce the ordersSize when
we cancel not yet filled orders.
we cancel not yet filled orders. Here it does not matter the targetSize since
this status represent a force closure of this stage.
*/
if (
tradingEngine.current.strategyOpenStage.stageBaseAsset.sizeFilled.value +
tradingEngine.current.strategyOpenStage.stageBaseAsset.feesPaid.value >=
tradingEngine.current.strategyOpenStage.stageBaseAsset.sizePlaced.value * 0.999) {
tradingEngine.current.strategyOpenStage.stageBaseAsset.sizePlaced.value
||
tradingEngine.current.strategyOpenStage.stageQuotedAsset.sizeFilled.value +
tradingEngine.current.strategyOpenStage.stageQuotedAsset.feesPaid.value >=
tradingEngine.current.strategyOpenStage.stageQuotedAsset.sizePlaced.value
) {
changeStageStatus('Open Stage', 'Closed')
initializeCloseStageSizeTarget()
}
}
function initializeOpenStageSizeTarget() {
function initializeStageTargetSize() {
/*
Here we will transform the position size into targets for each asset of the stage.
*/
if (tradingEngine.current.position.positionBaseAsset.size.value > 0) {
tradingEngine.current.strategyOpenStage.stageBaseAsset.targetSize.value = tradingEngine.current.position.positionBaseAsset.size.value
tradingEngine.current.strategyOpenStage.stageQuotedAsset.targetSize.value =
tradingEngine.current.position.positionBaseAsset.size.value * tradingEngine.current.position.rate.value
} else {
tradingEngine.current.strategyOpenStage.stageQuotedAsset.targetSize.value = tradingEngine.current.position.positionQuotedAsset.size.value
tradingEngine.current.strategyOpenStage.stageBaseAsset.targetSize.value =
tradingEngine.current.position.positionQuotedAsset.size.value / tradingEngine.current.position.rate.value
}
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.current.strategyOpenStage.stageBaseAsset.targetSize.value = global.PRECISE(tradingEngine.current.strategyOpenStage.stageBaseAsset.targetSize.value, 10)
tradingEngine.current.strategyOpenStage.stageQuotedAsset.targetSize.value = global.PRECISE(tradingEngine.current.strategyOpenStage.stageQuotedAsset.targetSize.value, 10)
}
function initializeCloseStageSizeTarget() {
/*
Here we will move the size filled of the open stage to the size target of the close stage.
*/
tradingEngine.current.strategyCloseStage.stageBaseAsset.targetSize.value = tradingEngine.current.strategyOpenStage.stageBaseAsset.sizeFilled.value
tradingEngine.current.strategyCloseStage.stageQuotedAsset.targetSize.value = tradingEngine.current.strategyOpenStage.stageQuotedAsset.sizeFilled.value
}
}
function runManageStage() {
@@ -577,7 +586,7 @@ exports.newTradingStages = function newTradingStages(bot, logger, tradingEngineM
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.rate.value) {
if (tradingEngine.current.position.stopLoss.value > tradingEngine.current.position.entryTargetRate.value) {
tradingEngine.current.position.stopLoss.stopLossPosition.value = 'Above'
} else {
tradingEngine.current.position.stopLoss.stopLossPosition.value = 'Below'
@@ -593,7 +602,7 @@ exports.newTradingStages = function newTradingStages(bot, logger, tradingEngineM
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.rate.value) {
if (tradingEngine.current.position.takeProfit.value > tradingEngine.current.position.entryTargetRate.value) {
tradingEngine.current.position.takeProfit.takeProfitPosition.value = 'Above'
} else {
tradingEngine.current.position.takeProfit.takeProfitPosition.value = 'Below'
@@ -876,6 +885,13 @@ exports.newTradingStages = function newTradingStages(bot, logger, tradingEngineM
the total filled size of the Open Stage. By skiping execution now
we allow the open stage to get a final value for sizeFilled that we can use.
*/
let stageNode = tradingSystem.tradingStrategies[tradingEngine.current.strategy.index.value].closeStage
/* Exit Position size and rate */
tradingSystem.evalFormulas(stageNode, 'Initial Targets')
tradingPositionModule.initialTargets(stageNode)
initializeStageTargetSize()
changeStageStatus('Close Stage', 'Open')
return
}
@@ -898,14 +914,35 @@ exports.newTradingStages = function newTradingStages(bot, logger, tradingEngineM
)
/*
The Close Stage is finished when the fillSize + feesPaid reaches the Open Fill Size.
This can happens at any time when we update the sizeFilled value when we see
at the exchange that orders were filled.
The Open is finished when the placedSize reaches the targetSize in any of the
stage assets, and the fillSize + feesPaid reaches the placedSize also in any
of the stage Assets.
This can happens at any time when we update the sizeFilled and the feesPaid values
when we see at the exchange that orders were filled.
*/
if (
tradingEngine.current.strategyCloseStage.stageBaseAsset.sizeFilled.value +
tradingEngine.current.strategyCloseStage.stageBaseAsset.feesPaid.value >=
tradingEngine.current.strategyCloseStage.stageBaseAsset.sizePlaced.value * 0.999) {
(
tradingEngine.current.strategyCloseStage.stageBaseAsset.sizePlaced >=
tradingEngine.current.strategyCloseStage.stageBaseAsset.targetSize
||
tradingEngine.current.strategyCloseStage.stageQuotedAsset.sizePlaced >=
tradingEngine.current.strategyCloseStage.stageQuotedAsset.targetSize
)
&&
(
tradingEngine.current.strategyCloseStage.stageBaseAsset.sizeFilled.value +
tradingEngine.current.strategyCloseStage.stageBaseAsset.feesPaid.value >=
tradingEngine.current.strategyCloseStage.stageBaseAsset.sizePlaced.value
||
tradingEngine.current.strategyCloseStage.stageQuotedAsset.sizeFilled.value +
tradingEngine.current.strategyCloseStage.stageQuotedAsset.feesPaid.value >=
tradingEngine.current.strategyCloseStage.stageQuotedAsset.sizePlaced.value
)
) {
changeStageStatus('Close Stage', 'Closed', 'Size Placed Filled')
} else {
/* Check the Close Stage Event */
@@ -942,6 +979,17 @@ exports.newTradingStages = function newTradingStages(bot, logger, tradingEngineM
exitPositionAndStrategy()
}
function initializeStageTargetSize() {
/*
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.current.strategyCloseStage.stageBaseAsset.targetSize.value = global.PRECISE(tradingEngine.current.strategyCloseStage.stageBaseAsset.targetSize.value, 10)
tradingEngine.current.strategyCloseStage.stageQuotedAsset.targetSize.value = global.PRECISE(tradingEngine.current.strategyCloseStage.stageQuotedAsset.targetSize.value, 10)
}
function exitPositionAndStrategy() {
/* Position Statistics & Results */
@@ -1187,15 +1235,18 @@ exports.newTradingStages = function newTradingStages(bot, logger, tradingEngineM
function updateStatus() {
if (tradingEngine.current.strategyTriggerStage.status.value === 'Closed') {
resetStage(tradingEngine.current.strategyTriggerStage)
resetStage(tradingEngine.current.strategyTriggerStage.status)
}
if (tradingEngine.current.strategyOpenStage.status.value === 'Closed') {
resetStage(tradingEngine.current.strategyOpenStage)
resetStage(tradingEngine.current.strategyOpenStage.status)
}
if (tradingEngine.current.strategyManageStage.status.value === 'Closed') {
resetStage(tradingEngine.current.strategyManageStage)
resetStage(tradingEngine.current.strategyManageStage.status)
}
if (tradingEngine.current.strategyCloseStage.status.value === 'Closed') {
resetStage(tradingEngine.current.strategyTriggerStage)
resetStage(tradingEngine.current.strategyOpenStage)
resetStage(tradingEngine.current.strategyManageStage)
resetStage(tradingEngine.current.strategyCloseStage)
}
}
@@ -118,17 +118,31 @@ exports.newTradingSystem = function newTradingSystem(bot, logger, tradingEngineM
}
async function run() {
/* Run the Trigger Stage */
tradingStagesModule.runTriggerStage()
try {
/* Run the Trigger Stage */
tradingStagesModule.runTriggerStage()
/* Run the Open Stage */
await tradingStagesModule.runOpenStage()
/* Run the Open Stage */
await tradingStagesModule.runOpenStage()
/* Run the Manage Stage */
tradingStagesModule.runManageStage()
/* Run the Manage Stage */
tradingStagesModule.runManageStage()
/* Run the Close Stage */
await tradingStagesModule.runCloseStage()
/* Run the Close Stage */
await tradingStagesModule.runCloseStage()
} catch (err) {
/*
If an error ocurred during execution, it was alreeady logged and
included at the errors array. That means we need to do nothing here,
just prevent the execution to be halted for not handling exceptions.
*/
if (typeof err === 'string' || err instanceof String) {
logger.write(MODULE_NAME, '[ERROR] runExecution -> err = ' + err)
}
if (err.stack !== undefined) {
logger.write(MODULE_NAME, '[ERROR] runExecution -> err = ' + err.stack)
}
}
}
function evalNode(node, evaluating, descendentOfNodeType, isDescendent) {
+1 -1
View File
@@ -41,7 +41,7 @@ global.UNIQUE_ID = function () {
}
global.PRECISE = function (floatNumber, precision) {
return parseFloat(Number.parseFloat(floatNumber).toPrecision(precision))
return this.parseFloat(floatNumber.toFixed(precision))
}
process.on('uncaughtException', function (err) {