1183 lines
40 KiB
JavaScript
1183 lines
40 KiB
JavaScript
function newChainAttachDetach () {
|
|
thisObject = {
|
|
chainDetachNode: chainDetachNode,
|
|
chainAttachNode: chainAttachNode
|
|
}
|
|
|
|
return thisObject
|
|
|
|
function chainDetachNode (node, rootNodes) {
|
|
switch (node.type) {
|
|
case 'Definition': {
|
|
return
|
|
}
|
|
case 'Network': {
|
|
return
|
|
}
|
|
case 'Team': {
|
|
return
|
|
}
|
|
case 'Sensor Bot': {
|
|
let payload = node.payload
|
|
for (let i = 0; i < payload.parentNode.sensorBots.length; i++) {
|
|
let sensorBot = payload.parentNode.sensorBots[i]
|
|
if (sensorBot.id === node.id) {
|
|
payload.parentNode.sensorBots.splice(i, 1)
|
|
}
|
|
}
|
|
completeDetachment(node, rootNodes)
|
|
return
|
|
}
|
|
case 'Indicator Bot': {
|
|
let payload = node.payload
|
|
for (let i = 0; i < payload.parentNode.indicatorBots.length; i++) {
|
|
let indicatorBot = payload.parentNode.indicatorBots[i]
|
|
if (indicatorBot.id === node.id) {
|
|
payload.parentNode.indicatorBots.splice(i, 1)
|
|
}
|
|
}
|
|
completeDetachment(node, rootNodes)
|
|
return
|
|
}
|
|
case 'Trading Bot': {
|
|
let payload = node.payload
|
|
for (let i = 0; i < payload.parentNode.tradingBots.length; i++) {
|
|
let tradingBot = payload.parentNode.tradingBots[i]
|
|
if (tradingBot.id === node.id) {
|
|
payload.parentNode.tradingBots.splice(i, 1)
|
|
}
|
|
}
|
|
completeDetachment(node, rootNodes)
|
|
return
|
|
}
|
|
case 'Process Definition': {
|
|
let payload = node.payload
|
|
for (let i = 0; i < payload.parentNode.processes.length; i++) {
|
|
let process = payload.parentNode.processes[i]
|
|
if (process.id === node.id) {
|
|
payload.parentNode.processes.splice(i, 1)
|
|
}
|
|
}
|
|
completeDetachment(node, rootNodes)
|
|
return
|
|
}
|
|
case 'Process Output': {
|
|
node.payload.parentNode.processOutput = undefined
|
|
completeDetachment(node, rootNodes)
|
|
return
|
|
}
|
|
case 'Process Dependencies': {
|
|
node.payload.parentNode.processDependencies = undefined
|
|
completeDetachment(node, rootNodes)
|
|
return
|
|
}
|
|
case 'Status Report': {
|
|
node.payload.parentNode.statusReport = undefined
|
|
completeDetachment(node, rootNodes)
|
|
return
|
|
}
|
|
case 'Execution Started Event': {
|
|
node.payload.parentNode.executionStartedEvent = undefined
|
|
completeDetachment(node, rootNodes)
|
|
return
|
|
}
|
|
case 'Execution Finished Event': {
|
|
node.payload.parentNode.executionFinishedEvent = undefined
|
|
completeDetachment(node, rootNodes)
|
|
return
|
|
}
|
|
case 'Calculations Procedure': {
|
|
node.payload.parentNode.calculations = undefined
|
|
completeDetachment(node, rootNodes)
|
|
return
|
|
}
|
|
case 'Data Building Procedure': {
|
|
node.payload.parentNode.dataBuilding = undefined
|
|
completeDetachment(node, rootNodes)
|
|
return
|
|
}
|
|
case 'Procedure Initialization': {
|
|
node.payload.parentNode.initialization = undefined
|
|
completeDetachment(node, rootNodes)
|
|
return
|
|
}
|
|
case 'Procedure Loop': {
|
|
node.payload.parentNode.loop = undefined
|
|
completeDetachment(node, rootNodes)
|
|
return
|
|
}
|
|
case 'Output Dataset': {
|
|
let payload = node.payload
|
|
for (let i = 0; i < payload.parentNode.outputDatasets.length; i++) {
|
|
let outputDataset = payload.parentNode.outputDatasets[i]
|
|
if (outputDataset.id === node.id) {
|
|
payload.parentNode.outputDatasets.splice(i, 1)
|
|
}
|
|
}
|
|
completeDetachment(node, rootNodes)
|
|
return
|
|
}
|
|
case 'Status Dependency': {
|
|
let payload = node.payload
|
|
for (let i = 0; i < payload.parentNode.statusDependencies.length; i++) {
|
|
let statusDependency = payload.parentNode.statusDependencies[i]
|
|
if (statusDependency.id === node.id) {
|
|
payload.parentNode.statusDependencies.splice(i, 1)
|
|
}
|
|
}
|
|
completeDetachment(node, rootNodes)
|
|
return
|
|
}
|
|
case 'Data Dependency': {
|
|
let payload = node.payload
|
|
for (let i = 0; i < payload.parentNode.dataDependencies.length; i++) {
|
|
let dataDependency = payload.parentNode.dataDependencies[i]
|
|
if (dataDependency.id === node.id) {
|
|
payload.parentNode.dataDependencies.splice(i, 1)
|
|
}
|
|
}
|
|
completeDetachment(node, rootNodes)
|
|
return
|
|
}
|
|
case 'Product Definition': {
|
|
let payload = node.payload
|
|
for (let i = 0; i < payload.parentNode.products.length; i++) {
|
|
let product = payload.parentNode.products[i]
|
|
if (product.id === node.id) {
|
|
payload.parentNode.products.splice(i, 1)
|
|
}
|
|
}
|
|
completeDetachment(node, rootNodes)
|
|
return
|
|
}
|
|
case 'Record Definition': {
|
|
node.payload.parentNode.record = undefined
|
|
completeDetachment(node, rootNodes)
|
|
return
|
|
}
|
|
case 'Record Property': {
|
|
let payload = node.payload
|
|
for (let i = 0; i < payload.parentNode.properties.length; i++) {
|
|
let property = payload.parentNode.properties[i]
|
|
if (property.id === node.id) {
|
|
payload.parentNode.properties.splice(i, 1)
|
|
}
|
|
}
|
|
completeDetachment(node, rootNodes)
|
|
return
|
|
}
|
|
case 'Dataset Definition': {
|
|
let payload = node.payload
|
|
for (let i = 0; i < payload.parentNode.datasets.length; i++) {
|
|
let dataset = payload.parentNode.datasets[i]
|
|
if (dataset.id === node.id) {
|
|
payload.parentNode.datasets.splice(i, 1)
|
|
}
|
|
}
|
|
completeDetachment(node, rootNodes)
|
|
return
|
|
}
|
|
case 'Plotter': {
|
|
let payload = node.payload
|
|
for (let i = 0; i < payload.parentNode.plotters.length; i++) {
|
|
let plotter = payload.parentNode.plotters[i]
|
|
if (plotter.id === node.id) {
|
|
payload.parentNode.plotters.splice(i, 1)
|
|
}
|
|
}
|
|
completeDetachment(node, rootNodes)
|
|
return
|
|
}
|
|
case 'Plotter Module': {
|
|
let payload = node.payload
|
|
for (let i = 0; i < payload.parentNode.modules.length; i++) {
|
|
let module = payload.parentNode.modules[i]
|
|
if (module.id === node.id) {
|
|
payload.parentNode.modules.splice(i, 1)
|
|
}
|
|
}
|
|
completeDetachment(node, rootNodes)
|
|
return
|
|
}
|
|
case 'Network Node': {
|
|
let payload = node.payload
|
|
for (let i = 0; i < payload.parentNode.networkNodes.length; i++) {
|
|
let networkNode = payload.parentNode.networkNodes[i]
|
|
if (networkNode.id === node.id) {
|
|
payload.parentNode.networkNodes.splice(i, 1)
|
|
}
|
|
}
|
|
completeDetachment(node, rootNodes)
|
|
return
|
|
}
|
|
case 'Personal Data': {
|
|
node.payload.parentNode.personalData = undefined
|
|
completeDetachment(node, rootNodes)
|
|
return
|
|
}
|
|
case 'Exchange Account': {
|
|
let payload = node.payload
|
|
for (let i = 0; i < payload.parentNode.exchangeAccounts.length; i++) {
|
|
let strategy = payload.parentNode.exchangeAccounts[i]
|
|
if (strategy.id === node.id) {
|
|
payload.parentNode.exchangeAccounts.splice(i, 1)
|
|
}
|
|
}
|
|
completeDetachment(node, rootNodes)
|
|
return
|
|
}
|
|
case 'Exchange Account Asset': {
|
|
let payload = node.payload
|
|
for (let i = 0; i < payload.parentNode.assets.length; i++) {
|
|
let asset = payload.parentNode.assets[i]
|
|
if (asset.id === node.id) {
|
|
payload.parentNode.assets.splice(i, 1)
|
|
}
|
|
}
|
|
completeDetachment(node, rootNodes)
|
|
return
|
|
}
|
|
case 'Exchange Account Key': {
|
|
let payload = node.payload
|
|
if (payload.parentNode.keys !== undefined) {
|
|
for (let i = 0; i < payload.parentNode.keys.length; i++) {
|
|
let key = payload.parentNode.keys[i]
|
|
if (key.id === node.id) {
|
|
payload.parentNode.keys.splice(i, 1)
|
|
}
|
|
}
|
|
}
|
|
if (payload.parentNode.key !== undefined) {
|
|
payload.parentNode.key = undefined
|
|
}
|
|
completeDetachment(node, rootNodes)
|
|
return
|
|
}
|
|
case 'Social Bots': {
|
|
node.payload.parentNode.socialBots = undefined
|
|
completeDetachment(node, rootNodes)
|
|
return
|
|
}
|
|
case 'Telegram Bot': {
|
|
let payload = node.payload
|
|
for (let i = 0; i < payload.parentNode.bots.length; i++) {
|
|
let bot = payload.parentNode.bots[i]
|
|
if (bot.id === node.id) {
|
|
payload.parentNode.bots.splice(i, 1)
|
|
}
|
|
}
|
|
completeDetachment(node, rootNodes)
|
|
return
|
|
}
|
|
case 'Announcement': {
|
|
let payload = node.payload
|
|
for (let i = 0; i < payload.parentNode.announcements.length; i++) {
|
|
let announcement = payload.parentNode.announcements[i]
|
|
if (announcement.id === node.id) {
|
|
payload.parentNode.announcements.splice(i, 1)
|
|
}
|
|
}
|
|
completeDetachment(node, rootNodes)
|
|
return
|
|
}
|
|
case 'Layer Manager': {
|
|
node.payload.parentNode.layerManager = undefined
|
|
completeDetachment(node, rootNodes)
|
|
return
|
|
}
|
|
case 'Layer': {
|
|
let payload = node.payload
|
|
for (let i = 0; i < payload.parentNode.layers.length; i++) {
|
|
let layer = payload.parentNode.layers[i]
|
|
if (layer.id === node.id) {
|
|
payload.parentNode.layers.splice(i, 1)
|
|
}
|
|
}
|
|
completeDetachment(node, rootNodes)
|
|
return
|
|
}
|
|
case 'Task Manager': {
|
|
let payload = node.payload
|
|
for (let i = 0; i < payload.parentNode.taskManagers.length; i++) {
|
|
let taskManager = payload.parentNode.taskManagers[i]
|
|
if (taskManager.id === node.id) {
|
|
payload.parentNode.taskManagers.splice(i, 1)
|
|
}
|
|
}
|
|
completeDetachment(node, rootNodes)
|
|
return
|
|
}
|
|
case 'Task': {
|
|
let payload = node.payload
|
|
for (let i = 0; i < payload.parentNode.tasks.length; i++) {
|
|
let task = payload.parentNode.tasks[i]
|
|
if (task.id === node.id) {
|
|
payload.parentNode.tasks.splice(i, 1)
|
|
}
|
|
}
|
|
completeDetachment(node, rootNodes)
|
|
return
|
|
}
|
|
case 'Sensor Bot Instance': {
|
|
node.payload.parentNode.bot = undefined
|
|
completeDetachment(node, rootNodes)
|
|
return
|
|
}
|
|
case 'Indicator Bot Instance': {
|
|
node.payload.parentNode.bot = undefined
|
|
completeDetachment(node, rootNodes)
|
|
return
|
|
}
|
|
case 'Trading Bot Instance': {
|
|
node.payload.parentNode.bot = undefined
|
|
completeDetachment(node, rootNodes)
|
|
return
|
|
}
|
|
case 'Backtesting Session': {
|
|
node.payload.parentNode.session = undefined
|
|
completeDetachment(node, rootNodes)
|
|
return
|
|
}
|
|
case 'Live Trading Session': {
|
|
node.payload.parentNode.session = undefined
|
|
completeDetachment(node, rootNodes)
|
|
return
|
|
}
|
|
case 'Fordward Testing Session': {
|
|
node.payload.parentNode.session = undefined
|
|
completeDetachment(node, rootNodes)
|
|
return
|
|
}
|
|
case 'Paper Trading Session': {
|
|
node.payload.parentNode.session = undefined
|
|
completeDetachment(node, rootNodes)
|
|
return
|
|
}
|
|
case 'Process Instance': {
|
|
let payload = node.payload
|
|
for (let i = 0; i < payload.parentNode.processes.length; i++) {
|
|
let process = payload.parentNode.processes[i]
|
|
if (process.id === node.id) {
|
|
payload.parentNode.processes.splice(i, 1)
|
|
}
|
|
}
|
|
completeDetachment(node, rootNodes)
|
|
return
|
|
}
|
|
case 'Trading System': {
|
|
node.payload.parentNode.tradingSystem = undefined
|
|
completeDetachment(node, rootNodes)
|
|
return
|
|
}
|
|
case 'Base Asset': {
|
|
node.payload.parentNode.baseAsset = undefined
|
|
completeDetachment(node, rootNodes)
|
|
return
|
|
}
|
|
case 'Time Range': {
|
|
node.payload.parentNode.timeRange = undefined
|
|
completeDetachment(node, rootNodes)
|
|
return
|
|
}
|
|
case 'Time Period': {
|
|
node.payload.parentNode.timePeriod = undefined
|
|
completeDetachment(node, rootNodes)
|
|
return
|
|
}
|
|
case 'Slippage': {
|
|
node.payload.parentNode.slippage = undefined
|
|
completeDetachment(node, rootNodes)
|
|
return
|
|
}
|
|
case 'Fee Structure': {
|
|
node.payload.parentNode.feeStructure = undefined
|
|
completeDetachment(node, rootNodes)
|
|
return
|
|
}
|
|
case 'Parameters': {
|
|
node.payload.parentNode.parameters = undefined
|
|
completeDetachment(node, rootNodes)
|
|
return
|
|
}
|
|
case 'Strategy': {
|
|
let payload = node.payload
|
|
for (let i = 0; i < payload.parentNode.strategies.length; i++) {
|
|
let strategy = payload.parentNode.strategies[i]
|
|
if (strategy.id === node.id) {
|
|
payload.parentNode.strategies.splice(i, 1)
|
|
}
|
|
}
|
|
completeDetachment(node, rootNodes)
|
|
return
|
|
}
|
|
case 'Trigger Stage': {
|
|
node.payload.parentNode.triggerStage = undefined
|
|
completeDetachment(node, rootNodes)
|
|
return
|
|
}
|
|
case 'Open Stage': {
|
|
node.payload.parentNode.openStage = undefined
|
|
completeDetachment(node, rootNodes)
|
|
return
|
|
}
|
|
case 'Manage Stage': {
|
|
node.payload.parentNode.manageStage = undefined
|
|
completeDetachment(node, rootNodes)
|
|
return
|
|
}
|
|
case 'Close Stage': {
|
|
node.payload.parentNode.closeStage = undefined
|
|
completeDetachment(node, rootNodes)
|
|
return
|
|
}
|
|
case 'Position Size': {
|
|
node.payload.parentNode.positionSize = undefined
|
|
completeDetachment(node, rootNodes)
|
|
return
|
|
}
|
|
case 'Position Rate': {
|
|
node.payload.parentNode.positionRate = undefined
|
|
completeDetachment(node, rootNodes)
|
|
return
|
|
}
|
|
case 'Trigger On Event': {
|
|
node.payload.parentNode.triggerOn = undefined
|
|
completeDetachment(node, rootNodes)
|
|
return
|
|
}
|
|
case 'Trigger Off Event': {
|
|
node.payload.parentNode.triggerOff = undefined
|
|
completeDetachment(node, rootNodes)
|
|
return
|
|
}
|
|
case 'Take Position Event': {
|
|
node.payload.parentNode.takePosition = undefined
|
|
completeDetachment(node, rootNodes)
|
|
return
|
|
}
|
|
case 'Initial Definition': {
|
|
node.payload.parentNode.initialDefinition = undefined
|
|
completeDetachment(node, rootNodes)
|
|
return
|
|
}
|
|
case 'Open Execution': {
|
|
node.payload.parentNode.openExecution = undefined
|
|
completeDetachment(node, rootNodes)
|
|
return
|
|
}
|
|
case 'Close Execution': {
|
|
node.payload.parentNode.closeExecution = undefined
|
|
completeDetachment(node, rootNodes)
|
|
return
|
|
}
|
|
case 'Stop': {
|
|
node.payload.parentNode.stopLoss = undefined
|
|
completeDetachment(node, rootNodes)
|
|
return
|
|
}
|
|
case 'Take Profit': {
|
|
node.payload.parentNode.takeProfit = undefined
|
|
completeDetachment(node, rootNodes)
|
|
return
|
|
}
|
|
case 'Formula': {
|
|
node.payload.parentNode.formula = undefined
|
|
completeDetachment(node, rootNodes)
|
|
return
|
|
}
|
|
case 'Next Phase Event': {
|
|
node.payload.parentNode.nextPhaseEvent = undefined
|
|
completeDetachment(node, rootNodes)
|
|
return
|
|
}
|
|
case 'Javascript Code': {
|
|
node.payload.parentNode.javascriptCode = undefined
|
|
completeDetachment(node, rootNodes)
|
|
return
|
|
}
|
|
case 'Condition': {
|
|
let payload = node.payload
|
|
for (let i = 0; i < payload.parentNode.conditions.length; i++) {
|
|
let condition = payload.parentNode.conditions[i]
|
|
if (condition.id === node.id) {
|
|
payload.parentNode.conditions.splice(i, 1)
|
|
}
|
|
}
|
|
completeDetachment(node, rootNodes)
|
|
return
|
|
}
|
|
case 'Situation': {
|
|
let payload = node.payload
|
|
for (let i = 0; i < payload.parentNode.situations.length; i++) {
|
|
let situation = payload.parentNode.situations[i]
|
|
if (situation.id === node.id) {
|
|
payload.parentNode.situations.splice(i, 1)
|
|
}
|
|
}
|
|
completeDetachment(node, rootNodes)
|
|
return
|
|
}
|
|
case 'Phase': {
|
|
let payload = node.payload
|
|
for (let i = 0; i < payload.parentNode.phases.length; i++) {
|
|
let phase = payload.parentNode.phases[i]
|
|
if (phase.id === node.id) {
|
|
if (i < payload.parentNode.phases.length - 1) {
|
|
let nextPhase = payload.parentNode.phases[i + 1]
|
|
if (i > 0) {
|
|
let previousPhase = payload.parentNode.phases[i - 1]
|
|
nextPhase.payload.chainParent = previousPhase
|
|
} else {
|
|
nextPhase.payload.chainParent = payload.parentNode
|
|
}
|
|
}
|
|
payload.parentNode.phases.splice(i, 1)
|
|
completeDetachment(node, rootNodes)
|
|
return
|
|
}
|
|
}
|
|
return
|
|
}
|
|
default: {
|
|
let nodeDefinition = APP_SCHEMA_MAP.get(node.type)
|
|
if (nodeDefinition !== undefined) {
|
|
/* Detach from parent */
|
|
if (node.payload.parentNode !== undefined) {
|
|
let parentNodeDefinition = APP_SCHEMA_MAP.get(node.payload.parentNode.type)
|
|
if (parentNodeDefinition !== undefined) {
|
|
if (parentNodeDefinition.properties !== undefined) {
|
|
for (let i = 0; i < parentNodeDefinition.properties.length; i++) {
|
|
let property = parentNodeDefinition.properties[i]
|
|
if (nodeDefinition.propertyNameAtParent === property.name) {
|
|
switch (property.type) {
|
|
case 'node': {
|
|
node.payload.parentNode[property.name] = undefined
|
|
}
|
|
break
|
|
case 'array': {
|
|
let nodePropertyArray = node.payload.parentNode[property.name]
|
|
if (nodePropertyArray !== undefined) {
|
|
for (let j = 0; j < nodePropertyArray.length; j++) {
|
|
let arrayItem = nodePropertyArray[j]
|
|
if (arrayItem.id === node.id) {
|
|
nodePropertyArray.splice(j, 1)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
break
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
completeDetachment(node, rootNodes)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function chainAttachNode (node, attachToNode, rootNodes) {
|
|
switch (node.type) {
|
|
case 'Sensor Bot': {
|
|
node.payload.parentNode = attachToNode
|
|
node.payload.chainParent = attachToNode
|
|
node.payload.parentNode.sensorBots.push(node)
|
|
completeAttachment(node, rootNodes)
|
|
}
|
|
break
|
|
case 'Indicator Bot': {
|
|
node.payload.parentNode = attachToNode
|
|
node.payload.chainParent = attachToNode
|
|
node.payload.parentNode.indicatorBots.push(node)
|
|
completeAttachment(node, rootNodes)
|
|
}
|
|
break
|
|
case 'Trading Bot': {
|
|
node.payload.parentNode = attachToNode
|
|
node.payload.chainParent = attachToNode
|
|
node.payload.parentNode.tradingBots.push(node)
|
|
completeAttachment(node, rootNodes)
|
|
}
|
|
break
|
|
case 'Process Definition': {
|
|
node.payload.parentNode = attachToNode
|
|
node.payload.chainParent = attachToNode
|
|
node.payload.parentNode.processes.push(node)
|
|
completeAttachment(node, rootNodes)
|
|
}
|
|
break
|
|
case 'Process Output': {
|
|
node.payload.parentNode = attachToNode
|
|
node.payload.chainParent = attachToNode
|
|
node.payload.parentNode.processOutput = node
|
|
completeAttachment(node, rootNodes)
|
|
}
|
|
break
|
|
case 'Process Dependencies': {
|
|
node.payload.parentNode = attachToNode
|
|
node.payload.chainParent = attachToNode
|
|
node.payload.parentNode.processDependencies = node
|
|
completeAttachment(node, rootNodes)
|
|
}
|
|
break
|
|
case 'Status Report': {
|
|
node.payload.parentNode = attachToNode
|
|
node.payload.chainParent = attachToNode
|
|
node.payload.parentNode.statusReport = node
|
|
completeAttachment(node, rootNodes)
|
|
}
|
|
break
|
|
case 'Execution Started Event': {
|
|
node.payload.parentNode = attachToNode
|
|
node.payload.chainParent = attachToNode
|
|
node.payload.parentNode.executionStartedEvent = node
|
|
completeAttachment(node, rootNodes)
|
|
}
|
|
break
|
|
case 'Execution Finished Event': {
|
|
node.payload.parentNode = attachToNode
|
|
node.payload.chainParent = attachToNode
|
|
node.payload.parentNode.executionFinishedEvent = node
|
|
completeAttachment(node, rootNodes)
|
|
}
|
|
break
|
|
case 'Calculations Procedure': {
|
|
node.payload.parentNode = attachToNode
|
|
node.payload.chainParent = attachToNode
|
|
node.payload.parentNode.calculations = node
|
|
completeAttachment(node, rootNodes)
|
|
}
|
|
break
|
|
case 'Data Building Procedure': {
|
|
node.payload.parentNode = attachToNode
|
|
node.payload.chainParent = attachToNode
|
|
node.payload.parentNode.dataBuilding = node
|
|
completeAttachment(node, rootNodes)
|
|
}
|
|
break
|
|
case 'Procedure Initialization': {
|
|
node.payload.parentNode = attachToNode
|
|
node.payload.chainParent = attachToNode
|
|
node.payload.parentNode.initialization = node
|
|
completeAttachment(node, rootNodes)
|
|
}
|
|
break
|
|
case 'Procedure Loop': {
|
|
node.payload.parentNode = attachToNode
|
|
node.payload.chainParent = attachToNode
|
|
node.payload.parentNode.loop = node
|
|
completeAttachment(node, rootNodes)
|
|
}
|
|
break
|
|
case 'Output Dataset': {
|
|
node.payload.parentNode = attachToNode
|
|
node.payload.chainParent = attachToNode
|
|
node.payload.parentNode.outputDatasets.push(node)
|
|
completeAttachment(node, rootNodes)
|
|
}
|
|
break
|
|
case 'Status Dependency': {
|
|
node.payload.parentNode = attachToNode
|
|
node.payload.chainParent = attachToNode
|
|
node.payload.parentNode.statusDependencies.push(node)
|
|
completeAttachment(node, rootNodes)
|
|
}
|
|
break
|
|
case 'Data Dependency': {
|
|
node.payload.parentNode = attachToNode
|
|
node.payload.chainParent = attachToNode
|
|
node.payload.parentNode.dataDependencies.push(node)
|
|
completeAttachment(node, rootNodes)
|
|
}
|
|
break
|
|
case 'Product Definition': {
|
|
node.payload.parentNode = attachToNode
|
|
node.payload.chainParent = attachToNode
|
|
node.payload.parentNode.products.push(node)
|
|
completeAttachment(node, rootNodes)
|
|
}
|
|
break
|
|
case 'Record Definition': {
|
|
node.payload.parentNode = attachToNode
|
|
node.payload.chainParent = attachToNode
|
|
node.payload.parentNode.record = node
|
|
completeAttachment(node, rootNodes)
|
|
}
|
|
break
|
|
case 'Record Property': {
|
|
node.payload.parentNode = attachToNode
|
|
node.payload.chainParent = attachToNode
|
|
node.payload.parentNode.properties.push(node)
|
|
completeAttachment(node, rootNodes)
|
|
}
|
|
break
|
|
case 'Dataset Definition': {
|
|
node.payload.parentNode = attachToNode
|
|
node.payload.chainParent = attachToNode
|
|
node.payload.parentNode.datasets.push(node)
|
|
completeAttachment(node, rootNodes)
|
|
}
|
|
break
|
|
case 'Plotter': {
|
|
node.payload.parentNode = attachToNode
|
|
node.payload.chainParent = attachToNode
|
|
node.payload.parentNode.plotters.push(node)
|
|
completeAttachment(node, rootNodes)
|
|
}
|
|
break
|
|
case 'Plotter Module': {
|
|
node.payload.parentNode = attachToNode
|
|
node.payload.chainParent = attachToNode
|
|
node.payload.parentNode.modules.push(node)
|
|
completeAttachment(node, rootNodes)
|
|
}
|
|
break
|
|
case 'Network Node': {
|
|
node.payload.parentNode = attachToNode
|
|
node.payload.chainParent = attachToNode
|
|
node.payload.parentNode.networkNodes.push(node)
|
|
completeAttachment(node, rootNodes)
|
|
}
|
|
break
|
|
case 'Social Bots': {
|
|
node.payload.parentNode = attachToNode
|
|
node.payload.chainParent = attachToNode
|
|
node.payload.parentNode.socialBots = node
|
|
completeAttachment(node, rootNodes)
|
|
}
|
|
break
|
|
case 'Telegram Bot': {
|
|
node.payload.parentNode = attachToNode
|
|
node.payload.chainParent = attachToNode
|
|
node.payload.parentNode.bots.push(node)
|
|
completeAttachment(node, rootNodes)
|
|
}
|
|
break
|
|
case 'Announcement': {
|
|
node.payload.parentNode = attachToNode
|
|
node.payload.chainParent = attachToNode
|
|
node.payload.parentNode.announcements.push(node)
|
|
completeAttachment(node, rootNodes)
|
|
}
|
|
break
|
|
case 'Layer Manager': {
|
|
node.payload.parentNode = attachToNode
|
|
node.payload.chainParent = attachToNode
|
|
node.payload.parentNode.layerManager = node
|
|
completeAttachment(node, rootNodes)
|
|
}
|
|
break
|
|
case 'Layer': {
|
|
node.payload.parentNode = attachToNode
|
|
node.payload.chainParent = attachToNode
|
|
node.payload.parentNode.layers.push(node)
|
|
completeAttachment(node, rootNodes)
|
|
}
|
|
break
|
|
case 'Task Manager': {
|
|
node.payload.parentNode = attachToNode
|
|
node.payload.chainParent = attachToNode
|
|
node.payload.parentNode.taskManagers.push(node)
|
|
completeAttachment(node, rootNodes)
|
|
}
|
|
break
|
|
case 'Task': {
|
|
node.payload.parentNode = attachToNode
|
|
node.payload.chainParent = attachToNode
|
|
node.payload.parentNode.tasks.push(node)
|
|
completeAttachment(node, rootNodes)
|
|
}
|
|
break
|
|
case 'Sensor Bot Instance': {
|
|
node.payload.parentNode = attachToNode
|
|
node.payload.chainParent = attachToNode
|
|
node.payload.parentNode.bot = node
|
|
completeAttachment(node, rootNodes)
|
|
}
|
|
break
|
|
case 'Indicator Bot Instance': {
|
|
node.payload.parentNode = attachToNode
|
|
node.payload.chainParent = attachToNode
|
|
node.payload.parentNode.bot = node
|
|
completeAttachment(node, rootNodes)
|
|
}
|
|
break
|
|
case 'Trading Bot Instance': {
|
|
node.payload.parentNode = attachToNode
|
|
node.payload.chainParent = attachToNode
|
|
node.payload.parentNode.bot = node
|
|
completeAttachment(node, rootNodes)
|
|
}
|
|
break
|
|
case 'Process Instance': {
|
|
node.payload.parentNode = attachToNode
|
|
node.payload.chainParent = attachToNode
|
|
node.payload.parentNode.processes.push(node)
|
|
completeAttachment(node, rootNodes)
|
|
}
|
|
break
|
|
case 'Backtesting Session': {
|
|
node.payload.parentNode = attachToNode
|
|
node.payload.chainParent = attachToNode
|
|
node.payload.parentNode.session = node
|
|
completeAttachment(node, rootNodes)
|
|
}
|
|
break
|
|
case 'Live Trading Session': {
|
|
node.payload.parentNode = attachToNode
|
|
node.payload.chainParent = attachToNode
|
|
node.payload.parentNode.session = node
|
|
completeAttachment(node, rootNodes)
|
|
}
|
|
break
|
|
case 'Fordward Testing Session': {
|
|
node.payload.parentNode = attachToNode
|
|
node.payload.chainParent = attachToNode
|
|
node.payload.parentNode.session = node
|
|
completeAttachment(node, rootNodes)
|
|
}
|
|
break
|
|
case 'Paper Trading Session': {
|
|
node.payload.parentNode = attachToNode
|
|
node.payload.chainParent = attachToNode
|
|
node.payload.parentNode.session = node
|
|
completeAttachment(node, rootNodes)
|
|
}
|
|
break
|
|
case 'Personal Data': {
|
|
node.payload.parentNode = attachToNode
|
|
node.payload.chainParent = attachToNode
|
|
node.payload.parentNode.personalData = node
|
|
completeAttachment(node, rootNodes)
|
|
}
|
|
break
|
|
case 'Exchange Account': {
|
|
node.payload.parentNode = attachToNode
|
|
node.payload.chainParent = attachToNode
|
|
node.payload.parentNode.exchangeAccounts.push(node)
|
|
completeAttachment(node, rootNodes)
|
|
}
|
|
break
|
|
case 'Exchange Account Asset': {
|
|
node.payload.parentNode = attachToNode
|
|
node.payload.chainParent = attachToNode
|
|
node.payload.parentNode.assets.push(node)
|
|
completeAttachment(node, rootNodes)
|
|
}
|
|
break
|
|
case 'Exchange Account Key': {
|
|
node.payload.parentNode = attachToNode
|
|
node.payload.chainParent = attachToNode
|
|
if (node.payload.parentNode.keys !== undefined) {
|
|
node.payload.parentNode.keys.push(node)
|
|
} else {
|
|
node.payload.parentNode.key = node
|
|
}
|
|
completeAttachment(node, rootNodes)
|
|
}
|
|
break
|
|
case 'Parameters': {
|
|
node.payload.parentNode = attachToNode
|
|
node.payload.chainParent = attachToNode
|
|
node.payload.parentNode.parameters = node
|
|
completeAttachment(node, rootNodes)
|
|
}
|
|
break
|
|
case 'Base Asset': {
|
|
node.payload.parentNode = attachToNode
|
|
node.payload.chainParent = attachToNode
|
|
node.payload.parentNode.baseAsset = node
|
|
completeAttachment(node, rootNodes)
|
|
}
|
|
break
|
|
case 'Time Range': {
|
|
node.payload.parentNode = attachToNode
|
|
node.payload.chainParent = attachToNode
|
|
node.payload.parentNode.timeRange = node
|
|
completeAttachment(node, rootNodes)
|
|
}
|
|
break
|
|
case 'Time Period': {
|
|
node.payload.parentNode = attachToNode
|
|
node.payload.chainParent = attachToNode
|
|
node.payload.parentNode.timePeriod = node
|
|
completeAttachment(node, rootNodes)
|
|
}
|
|
break
|
|
case 'Slippage': {
|
|
node.payload.parentNode = attachToNode
|
|
node.payload.chainParent = attachToNode
|
|
node.payload.parentNode.slippage = node
|
|
completeAttachment(node, rootNodes)
|
|
}
|
|
break
|
|
case 'Fee Structure': {
|
|
node.payload.parentNode = attachToNode
|
|
node.payload.chainParent = attachToNode
|
|
node.payload.parentNode.feeStructure = node
|
|
completeAttachment(node, rootNodes)
|
|
}
|
|
break
|
|
case 'Trading System': {
|
|
node.payload.parentNode = attachToNode
|
|
node.payload.chainParent = attachToNode
|
|
node.payload.parentNode.tradingSystem = node
|
|
completeAttachment(node, rootNodes)
|
|
}
|
|
break
|
|
case 'Strategy': {
|
|
node.payload.parentNode = attachToNode
|
|
node.payload.chainParent = attachToNode
|
|
node.payload.parentNode.strategies.push(node)
|
|
completeAttachment(node, rootNodes)
|
|
}
|
|
break
|
|
case 'Trigger Stage': {
|
|
node.payload.parentNode = attachToNode
|
|
node.payload.chainParent = attachToNode
|
|
node.payload.parentNode.triggerStage = node
|
|
completeAttachment(node, rootNodes)
|
|
}
|
|
break
|
|
case 'Open Stage': {
|
|
node.payload.parentNode = attachToNode
|
|
node.payload.chainParent = attachToNode
|
|
node.payload.parentNode.openStage = node
|
|
completeAttachment(node, rootNodes)
|
|
}
|
|
break
|
|
case 'Manage Stage': {
|
|
node.payload.parentNode = attachToNode
|
|
node.payload.chainParent = attachToNode
|
|
node.payload.parentNode.manageStage = node
|
|
completeAttachment(node, rootNodes)
|
|
}
|
|
break
|
|
case 'Close Stage': {
|
|
node.payload.parentNode = attachToNode
|
|
node.payload.chainParent = attachToNode
|
|
node.payload.parentNode.closeStage = node
|
|
completeAttachment(node, rootNodes)
|
|
}
|
|
break
|
|
case 'Position Size': {
|
|
node.payload.parentNode = attachToNode
|
|
node.payload.chainParent = attachToNode
|
|
node.payload.parentNode.positionSize = node
|
|
completeAttachment(node, rootNodes)
|
|
}
|
|
break
|
|
case 'Position Rate': {
|
|
node.payload.parentNode = attachToNode
|
|
node.payload.chainParent = attachToNode
|
|
node.payload.parentNode.positionRate = node
|
|
completeAttachment(node, rootNodes)
|
|
}
|
|
break
|
|
case 'Initial Definition': {
|
|
node.payload.parentNode = attachToNode
|
|
node.payload.chainParent = attachToNode
|
|
node.payload.parentNode.initialDefinition = node
|
|
completeAttachment(node, rootNodes)
|
|
}
|
|
break
|
|
case 'Open Execution': {
|
|
node.payload.parentNode = attachToNode
|
|
node.payload.chainParent = attachToNode
|
|
node.payload.parentNode.openExecution = node
|
|
completeAttachment(node, rootNodes)
|
|
}
|
|
break
|
|
case 'Close Execution': {
|
|
node.payload.parentNode = attachToNode
|
|
node.payload.chainParent = attachToNode
|
|
node.payload.parentNode.closeExecution = node
|
|
completeAttachment(node, rootNodes)
|
|
}
|
|
break
|
|
case 'Trigger On Event': {
|
|
node.payload.parentNode = attachToNode
|
|
node.payload.chainParent = attachToNode
|
|
node.payload.parentNode.triggerOn = node
|
|
completeAttachment(node, rootNodes)
|
|
}
|
|
break
|
|
case 'Trigger Off Event': {
|
|
node.payload.parentNode = attachToNode
|
|
node.payload.chainParent = attachToNode
|
|
node.payload.parentNode.triggerOff = node
|
|
completeAttachment(node, rootNodes)
|
|
}
|
|
break
|
|
case 'Take Position Event': {
|
|
node.payload.parentNode = attachToNode
|
|
node.payload.chainParent = attachToNode
|
|
node.payload.parentNode.takePosition = node
|
|
completeAttachment(node, rootNodes)
|
|
}
|
|
break
|
|
case 'Stop': {
|
|
node.payload.parentNode = attachToNode
|
|
node.payload.chainParent = attachToNode
|
|
node.payload.parentNode.stopLoss = node
|
|
completeAttachment(node, rootNodes)
|
|
}
|
|
break
|
|
case 'Take Profit': {
|
|
node.payload.parentNode = attachToNode
|
|
node.payload.chainParent = attachToNode
|
|
node.payload.parentNode.takeProfit = node
|
|
completeAttachment(node, rootNodes)
|
|
}
|
|
break
|
|
case 'Formula': {
|
|
node.payload.parentNode = attachToNode
|
|
node.payload.chainParent = attachToNode
|
|
node.payload.parentNode.formula = node
|
|
completeAttachment(node, rootNodes)
|
|
}
|
|
break
|
|
case 'Next Phase Event': {
|
|
node.payload.parentNode = attachToNode
|
|
node.payload.chainParent = attachToNode
|
|
node.payload.parentNode.nextPhaseEvent = node
|
|
completeAttachment(node, rootNodes)
|
|
}
|
|
break
|
|
case 'Phase': {
|
|
switch (attachToNode.type) {
|
|
case 'Stop': {
|
|
if (attachToNode.maxPhases !== undefined) {
|
|
if (attachToNode.phases.length >= attachToNode.maxPhases) {
|
|
return
|
|
}
|
|
}
|
|
node.payload.parentNode = attachToNode
|
|
if (attachToNode.phases.length > 0) {
|
|
let phase = attachToNode.phases[attachToNode.phases.length - 1]
|
|
node.payload.chainParent = phase
|
|
} else {
|
|
node.payload.chainParent = attachToNode
|
|
}
|
|
attachToNode.phases.push(node)
|
|
completeAttachment(node, rootNodes)
|
|
}
|
|
break
|
|
case 'Take Profit': {
|
|
if (attachToNode.maxPhases !== undefined) {
|
|
if (attachToNode.phases.length >= attachToNode.maxPhases) {
|
|
return
|
|
}
|
|
}
|
|
node.payload.parentNode = attachToNode
|
|
if (attachToNode.phases.length > 0) {
|
|
let phase = attachToNode.phases[attachToNode.phases.length - 1]
|
|
node.payload.chainParent = phase
|
|
} else {
|
|
node.payload.chainParent = attachToNode
|
|
}
|
|
attachToNode.phases.push(node)
|
|
completeAttachment(node, rootNodes)
|
|
}
|
|
break
|
|
case 'Phase': {
|
|
node.payload.parentNode = attachToNode.payload.parentNode
|
|
for (let i = 0; i < node.payload.parentNode.phases.length; i++) {
|
|
let phase = node.payload.parentNode.phases[i]
|
|
if (attachToNode.id === phase.id) {
|
|
if (i === node.payload.parentNode.phases.length - 1) {
|
|
node.payload.chainParent = attachToNode
|
|
node.payload.parentNode.phases.push(node)
|
|
completeAttachment(node, rootNodes)
|
|
} else {
|
|
node.payload.chainParent = attachToNode
|
|
let nextPhase = node.payload.parentNode.phases[i + 1]
|
|
nextPhase.payload.chainParent = node
|
|
node.payload.parentNode.phases.splice(i + 1, 0, node)
|
|
completeAttachment(node, rootNodes)
|
|
return
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
break
|
|
case 'Situation': {
|
|
node.payload.parentNode = attachToNode
|
|
node.payload.chainParent = attachToNode
|
|
node.payload.parentNode.situations.push(node)
|
|
completeAttachment(node, rootNodes)
|
|
}
|
|
break
|
|
case 'Condition': {
|
|
node.payload.parentNode = attachToNode
|
|
node.payload.chainParent = attachToNode
|
|
node.payload.parentNode.conditions.push(node)
|
|
completeAttachment(node, rootNodes)
|
|
}
|
|
break
|
|
case 'Javascript Code': {
|
|
node.payload.parentNode = attachToNode
|
|
node.payload.chainParent = attachToNode
|
|
node.payload.parentNode.javascriptCode = node
|
|
completeAttachment(node, rootNodes)
|
|
}
|
|
break
|
|
default: {
|
|
let nodeDefinition = APP_SCHEMA_MAP.get(node.type)
|
|
if (nodeDefinition !== undefined) {
|
|
node.payload.parentNode = attachToNode
|
|
node.payload.chainParent = attachToNode
|
|
/* Attach to new parent */
|
|
if (node.payload.parentNode !== undefined) {
|
|
let parentNodeDefinition = APP_SCHEMA_MAP.get(node.payload.parentNode.type)
|
|
if (parentNodeDefinition !== undefined) {
|
|
if (parentNodeDefinition.properties !== undefined) {
|
|
for (let i = 0; i < parentNodeDefinition.properties.length; i++) {
|
|
let property = parentNodeDefinition.properties[i]
|
|
if (nodeDefinition.propertyNameAtParent === property.name) {
|
|
switch (property.type) {
|
|
case 'node': {
|
|
node.payload.parentNode[property.name] = node
|
|
}
|
|
break
|
|
case 'array': {
|
|
if (node.payload.parentNode[property.name] === undefined) {
|
|
node.payload.parentNode[property.name] = []
|
|
}
|
|
let nodePropertyArray = node.payload.parentNode[property.name]
|
|
nodePropertyArray.push(node)
|
|
}
|
|
break
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
completeAttachment(node, rootNodes)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function completeDetachment (node, rootNodes) {
|
|
node.payload.parentNode = undefined
|
|
node.payload.chainParent = undefined
|
|
rootNodes.push(node)
|
|
}
|
|
|
|
function completeAttachment (node, rootNodes) {
|
|
for (let i = 0; i < rootNodes.length; i++) {
|
|
let rootNode = rootNodes[i]
|
|
if (rootNode.id === node.id) {
|
|
rootNodes.splice(i, 1)
|
|
return
|
|
}
|
|
}
|
|
}
|
|
}
|