406 lines
17 KiB
JavaScript
406 lines
17 KiB
JavaScript
function newSuperScriptsFunctions () {
|
|
thisObject = {
|
|
runSuperScript: runSuperScript
|
|
}
|
|
|
|
return thisObject
|
|
|
|
function runSuperScript (node, functionLibraryNodeCloning, functionLibraryUiObjectsFromNodes) {
|
|
try {
|
|
let clone = functionLibraryNodeCloning.getNodeClone
|
|
let executionResult = true
|
|
|
|
function setup (templateClone, target) {
|
|
spawnPosition.x = target.payload.position.x
|
|
spawnPosition.y = target.payload.position.y
|
|
|
|
functionLibraryUiObjectsFromNodes.createUiObjectFromNode(templateClone, target, target)
|
|
}
|
|
|
|
/* Validations */
|
|
if (executionResult === true && node.payload.parentNode === undefined) {
|
|
node.payload.uiObject.setErrorMessage('Super Action node needs a Parent Node.')
|
|
executionResult = false
|
|
}
|
|
if (executionResult === true && node.payload.referenceParent === undefined) {
|
|
node.payload.uiObject.setErrorMessage('Super Action node needs to reference a Master Script Node.')
|
|
executionResult = false
|
|
}
|
|
if (executionResult === true && node.payload.referenceParent.javascriptCode === undefined) {
|
|
node.payload.uiObject.setErrorMessage('Master Script Node needs to have a child Javascript Code Node.')
|
|
executionResult = false
|
|
}
|
|
|
|
let superAction = node
|
|
let masterScript = node.payload.referenceParent
|
|
|
|
/*
|
|
Master Script
|
|
*/
|
|
function newNewMasterScriptInstance () {
|
|
let thisObject = {
|
|
runValidations: runValidations,
|
|
runScript: runScript
|
|
}
|
|
return thisObject
|
|
|
|
function runValidations (superAction, masterScript) {
|
|
/* Validations */
|
|
if (superAction.payload.parentNode.type !== 'Market') {
|
|
superAction.payload.uiObject.setErrorMessage('Super Action Parent Node needs to be of type Market.')
|
|
return
|
|
}
|
|
if (superAction.payload.parentNode.baseAsset === undefined) {
|
|
superAction.payload.uiObject.setErrorMessage('Market Node needs to have a child Market Base Asset.')
|
|
return
|
|
}
|
|
if (superAction.payload.parentNode.quotedAsset === undefined) {
|
|
superAction.payload.uiObject.setErrorMessage('Market Node needs to have a child Market Quoted Asset.')
|
|
return
|
|
}
|
|
if (superAction.payload.parentNode.baseAsset.payload.referenceParent === undefined) {
|
|
superAction.payload.uiObject.setErrorMessage('Market Base Asset Node needs to reference an Asset.')
|
|
return
|
|
}
|
|
if (superAction.payload.parentNode.quotedAsset.payload.referenceParent === undefined) {
|
|
superAction.payload.uiObject.setErrorMessage('Market Quoted Asset Node needs to reference an Asset.')
|
|
return
|
|
}
|
|
if (superAction.payload.parentNode.baseAsset.payload.referenceParent.payload.parentNode === undefined) {
|
|
superAction.payload.uiObject.setErrorMessage('Asset Node needs to be a child of Exchange Assets.')
|
|
return
|
|
}
|
|
if (superAction.payload.parentNode.quotedAsset.payload.referenceParent.payload.parentNode === undefined) {
|
|
superAction.payload.uiObject.setErrorMessage('Asset Node needs to be a child of Exchange Assets.')
|
|
return
|
|
}
|
|
if (superAction.payload.parentNode.baseAsset.payload.referenceParent.payload.parentNode.payload.parentNode === undefined) {
|
|
superAction.payload.uiObject.setErrorMessage('Exchange Assets needs to be a child of an Exchange Node.')
|
|
return
|
|
}
|
|
if (superAction.payload.parentNode.quotedAsset.payload.referenceParent.payload.parentNode.payload.parentNode === undefined) {
|
|
superAction.payload.uiObject.setErrorMessage('Exchange Assets needs to be a child of an Exchange Node.')
|
|
return
|
|
}
|
|
if (superAction.payload.parentNode.baseAsset.payload.referenceParent.payload.parentNode.payload.parentNode.id !== superAction.payload.parentNode.quotedAsset.payload.referenceParent.payload.parentNode.payload.parentNode.id) {
|
|
superAction.payload.uiObject.setErrorMessage('Assets must be from the same Exchange.')
|
|
return
|
|
}
|
|
if (superAction.payload.parentNode.payload.parentNode === undefined) {
|
|
superAction.payload.uiObject.setErrorMessage('Market needs to be a child of Exchange Markets.')
|
|
return
|
|
}
|
|
if (superAction.payload.parentNode.payload.parentNode.payload.parentNode === undefined) {
|
|
superAction.payload.uiObject.setErrorMessage('Exchange Markets needs to be a child of an Exchange.')
|
|
return
|
|
}
|
|
if (superAction.payload.parentNode.payload.parentNode.payload.parentNode.id !== superAction.payload.parentNode.baseAsset.payload.referenceParent.payload.parentNode.payload.parentNode.id) {
|
|
superAction.payload.uiObject.setErrorMessage('Assets and Market must be defined at the same Exchange.')
|
|
return
|
|
}
|
|
if (superAction.payload.parentNode.payload.parentNode.payload.parentNode.exchangeAccounts === undefined) {
|
|
superAction.payload.uiObject.setErrorMessage('Exchange Markets needs have a child Exchange Accounts.')
|
|
return
|
|
}
|
|
|
|
for (let i = 0; i < masterScript.templateScripts.length; i++) {
|
|
let templateScript = masterScript.templateScripts[i]
|
|
|
|
if (templateScript.javascriptCode === undefined) {
|
|
superAction.payload.uiObject.setErrorMessage('Template Script must have a child Javascript Code.')
|
|
return
|
|
}
|
|
if (templateScript.templateStructure === undefined) {
|
|
superAction.payload.uiObject.setErrorMessage('Template Script must have a child Template Structure.')
|
|
return
|
|
}
|
|
if (templateScript.templateTarget === undefined) {
|
|
superAction.payload.uiObject.setErrorMessage('Template Script must have a child Template Target.')
|
|
return
|
|
}
|
|
if (templateScript.templateTarget.payload.referenceParent === undefined) {
|
|
superAction.payload.uiObject.setErrorMessage('Template Target must have a Reference Parent.')
|
|
return
|
|
}
|
|
try {
|
|
let templateScriptConstructor
|
|
|
|
eval(templateScript.javascriptCode.code)
|
|
|
|
let executionResult = true
|
|
let templateScriptInstance = templateScriptConstructor()
|
|
|
|
if (executionResult === true) {
|
|
executionResult = templateScriptInstance.runValidations(superAction)
|
|
}
|
|
|
|
if (executionResult !== true) { return false }
|
|
} catch (err) {
|
|
console.log(err.stack)
|
|
superAction.payload.uiObject.setErrorMessage(err.message)
|
|
return false
|
|
}
|
|
}
|
|
|
|
return true
|
|
}
|
|
|
|
function runScript (superAction, masterScript) {
|
|
let market = superAction.payload.parentNode
|
|
let singleMarketData // we expect this variable to be set by a template script.
|
|
let backSessionReference
|
|
let paperSessionReference
|
|
let liveSessionReference
|
|
let testingEnvironmentTaskManager
|
|
let fordwardSessionReference
|
|
let productionEnvironmentTaskManager
|
|
let timeMachine
|
|
|
|
for (let i = 0; i < masterScript.templateScripts.length; i++) {
|
|
let templateScript = masterScript.templateScripts[i]
|
|
|
|
try {
|
|
let templateScriptConstructor
|
|
|
|
eval(templateScript.javascriptCode.code)
|
|
|
|
let executionResult = true
|
|
let templateClone
|
|
let templateScriptInstance = templateScriptConstructor()
|
|
|
|
if (executionResult === true) {
|
|
templateClone = templateScriptInstance.runScript(superAction, templateScript)
|
|
}
|
|
|
|
if (executionResult !== true) { return false }
|
|
|
|
switch (templateClone.payload.parentNode.type) {
|
|
case 'Session Independent Data': {
|
|
singleMarketData = templateClone
|
|
break
|
|
}
|
|
case 'Session Based Data': {
|
|
switch (templateClone.templateType) {
|
|
case 'Backtesting Session': {
|
|
backSessionReference = templateClone
|
|
break
|
|
}
|
|
case 'Paper Trading Session': {
|
|
paperSessionReference = templateClone
|
|
break
|
|
}
|
|
case 'Live Trading Session': {
|
|
liveSessionReference = templateClone
|
|
break
|
|
}
|
|
case 'Fordward Testing Session': {
|
|
fordwardSessionReference = templateClone
|
|
break
|
|
}
|
|
}
|
|
break
|
|
}
|
|
case 'Testing Environment': {
|
|
testingEnvironmentTaskManager = templateClone
|
|
break
|
|
}
|
|
case 'Production Environment': {
|
|
productionEnvironmentTaskManager = templateClone
|
|
break
|
|
}
|
|
case 'Dashboard': {
|
|
timeMachine = templateClone
|
|
break
|
|
}
|
|
}
|
|
|
|
if (executionResult !== true) { return false }
|
|
} catch (err) {
|
|
console.log(err.stack)
|
|
superAction.payload.uiObject.setErrorMessage(err.message)
|
|
return false
|
|
}
|
|
}
|
|
|
|
/* Here we will find the sessions within the tasks in order to put them as a reference of the Session Reference nodes we already have */
|
|
let session
|
|
session = findSession('Backtesting Session', testingEnvironmentTaskManager)
|
|
backSessionReference.payload.referenceParent = session
|
|
session = findSession('Paper Trading Session', testingEnvironmentTaskManager)
|
|
paperSessionReference.payload.referenceParent = session
|
|
session = findSession('Live Trading Session', productionEnvironmentTaskManager)
|
|
liveSessionReference.payload.referenceParent = session
|
|
session = findSession('Fordward Testing Session', productionEnvironmentTaskManager)
|
|
fordwardSessionReference.payload.referenceParent = session
|
|
|
|
function findSession (sessionType, taskManager) {
|
|
for (let i = 0; i < taskManager.tasks.length; i++) {
|
|
let task = taskManager.tasks[i]
|
|
if (task.bot !== undefined) {
|
|
if (task.bot.processes !== undefined) {
|
|
for (let j = 0; j < task.bot.processes.length; j++) {
|
|
let process = task.bot.processes[j]
|
|
if (process.session !== undefined) {
|
|
if (process.session.type === sessionType) {
|
|
return process.session
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/* Here, we are going to connect the layers of the charts at the Time Machine */
|
|
for (let i = 0; i < timeMachine.timelineCharts.length; i++) {
|
|
let timelineChart = timeMachine.timelineCharts[i]
|
|
switch (timelineChart.name) {
|
|
case 'Indicators': {
|
|
for (let j = 0; j < timelineChart.layersManager.layers.length; j++) {
|
|
let layer = timelineChart.layersManager.layers[j]
|
|
switch (j) {
|
|
case 0: {
|
|
let dataProduct = findDataProduct(singleMarketData, 'Candles')
|
|
layer.payload.referenceParent = dataProduct
|
|
break
|
|
}
|
|
case 1: {
|
|
let dataProduct = findDataProduct(singleMarketData, 'Bollinger Bands')
|
|
layer.payload.referenceParent = dataProduct
|
|
break
|
|
}
|
|
case 2: {
|
|
let dataProduct = findDataProduct(singleMarketData, 'Bollinger Channels Objects')
|
|
layer.payload.referenceParent = dataProduct
|
|
break
|
|
}
|
|
case 3: {
|
|
let dataProduct = findDataProduct(singleMarketData, 'Bollinger Sub-Channels Objects')
|
|
layer.payload.referenceParent = dataProduct
|
|
break
|
|
}
|
|
case 4: {
|
|
let dataProduct = findDataProduct(singleMarketData, 'Candles-Stairs')
|
|
layer.payload.referenceParent = dataProduct
|
|
break
|
|
}
|
|
}
|
|
}
|
|
break
|
|
}
|
|
case 'Volumes': {
|
|
for (let j = 0; j < timelineChart.layersManager.layers.length; j++) {
|
|
let layer = timelineChart.layersManager.layers[j]
|
|
switch (j) {
|
|
case 0: {
|
|
let dataProduct = findDataProduct(singleMarketData, 'Volumes')
|
|
layer.payload.referenceParent = dataProduct
|
|
break
|
|
}
|
|
case 1: {
|
|
let dataProduct = findDataProduct(singleMarketData, 'Volume-Stairs')
|
|
layer.payload.referenceParent = dataProduct
|
|
break
|
|
}
|
|
}
|
|
}
|
|
break
|
|
}
|
|
case 'Oscilators': {
|
|
for (let j = 0; j < timelineChart.layersManager.layers.length; j++) {
|
|
let layer = timelineChart.layersManager.layers[j]
|
|
switch (j) {
|
|
case 0: {
|
|
let dataProduct = findDataProduct(singleMarketData, 'Percentage Bandwidth')
|
|
layer.payload.referenceParent = dataProduct
|
|
break
|
|
}
|
|
}
|
|
}
|
|
break
|
|
}
|
|
case 'Backtesting': {
|
|
setupSessionReference(timelineChart, backSessionReference)
|
|
break
|
|
}
|
|
case 'Paper Trading': {
|
|
setupSessionReference(timelineChart, paperSessionReference)
|
|
break
|
|
}
|
|
case 'Live Trading': {
|
|
setupSessionReference(timelineChart, liveSessionReference)
|
|
break
|
|
}
|
|
case 'Fordward Trading': {
|
|
setupSessionReference(timelineChart, fordwardSessionReference)
|
|
break
|
|
}
|
|
}
|
|
}
|
|
|
|
function findDataProduct (singleMarketData, name) {
|
|
for (let i = 0; i < singleMarketData.dataProducts.length; i++) {
|
|
let dataProduct = singleMarketData.dataProducts[i]
|
|
if (dataProduct.name === name) {
|
|
return dataProduct
|
|
}
|
|
}
|
|
}
|
|
function setupSessionReference (timelineChart, sessionReference) {
|
|
for (let j = 0; j < timelineChart.layersManager.layers.length; j++) {
|
|
let layer = timelineChart.layersManager.layers[j]
|
|
switch (j) {
|
|
case 0: {
|
|
let dataProduct = findDataProduct(sessionReference.singleMarketData, 'Simulation')
|
|
layer.payload.referenceParent = dataProduct
|
|
break
|
|
}
|
|
case 1: {
|
|
let dataProduct = findDataProduct(sessionReference.singleMarketData, 'Conditions')
|
|
layer.payload.referenceParent = dataProduct
|
|
break
|
|
}
|
|
case 2: {
|
|
let dataProduct = findDataProduct(sessionReference.singleMarketData, 'Trades')
|
|
layer.payload.referenceParent = dataProduct
|
|
break
|
|
}
|
|
case 3: {
|
|
let dataProduct = findDataProduct(sessionReference.singleMarketData, 'Strategies')
|
|
layer.payload.referenceParent = dataProduct
|
|
break
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
timeMachine.name = superAction.payload.parentNode.payload.parentNode.payload.parentNode.name + ' ' + market.name
|
|
return true
|
|
}
|
|
}
|
|
/*
|
|
End Manster Script
|
|
*/
|
|
|
|
// eval(masterScript.javascriptCode.code)
|
|
|
|
let masterScriptInstance = newNewMasterScriptInstance()
|
|
|
|
if (executionResult === true) {
|
|
executionResult = masterScriptInstance.runValidations(superAction, masterScript)
|
|
}
|
|
if (executionResult === true) {
|
|
executionResult = masterScriptInstance.runScript(superAction, masterScript)
|
|
}
|
|
if (executionResult === true) {
|
|
superAction.payload.uiObject.setValue('Execution Completed Successfully')
|
|
} else {
|
|
superAction.payload.uiObject.setValue('Execution Failed')
|
|
}
|
|
} catch (err) {
|
|
superAction.payload.uiObject.setErrorMessage(err.message)
|
|
superAction.payload.uiObject.setValue('Execution Failed')
|
|
}
|
|
}
|
|
}
|