From d501d4aeef792d576afc9188088cf0f5201d3825 Mon Sep 17 00:00:00 2001 From: Matias Benitez Date: Sat, 30 Jun 2018 18:07:26 -0300 Subject: [PATCH] Updates for the 1st competition --- Trading-Process/User.Bot.js | 337 ++++++++++++++++++++++++++---------- this.bot.config.json | 327 +++++++++++++++++----------------- 2 files changed, 411 insertions(+), 253 deletions(-) diff --git a/Trading-Process/User.Bot.js b/Trading-Process/User.Bot.js index 8e209c1be..06bee8e02 100644 --- a/Trading-Process/User.Bot.js +++ b/Trading-Process/User.Bot.js @@ -3,7 +3,7 @@ const MODULE_NAME = "User Bot"; const FULL_LOG = true; const LOG_INFO = true; - + let thisObject = { initialize: initialize, start: start @@ -32,11 +32,17 @@ callBackFunction(global.DEFAULT_FAIL_RESPONSE); } } - + function start(callBackFunction) { if (LOG_INFO === true) { logger.write(MODULE_NAME, "[INFO] start -> Entering function."); } + const LAST_BUY_RATE_KEY = "AAVikings" + "-" + "AAArtudito" + "-" + "Trading-Process" + "-" + "lastBuyRate"; + let market = global.MARKET; + let periodName = "30-min"; + + let stopLossEnabled = true; + let stopLossPorcentage = 0.02; /* This trading bot will use an strategy based on the interpretation of the Linear Regression Curve Channel. @@ -46,8 +52,8 @@ function onDone(err) { try { - switch (err.result) { - case global.DEFAULT_OK_RESPONSE.result: { + switch (err.result) { + case global.DEFAULT_OK_RESPONSE.result: { logger.write(MODULE_NAME, "[INFO] start -> onDone -> Execution finished well. :-)"); callBackFunction(global.DEFAULT_OK_RESPONSE); return; @@ -70,33 +76,33 @@ } function businessLogic(callBack) { - if (LOG_INFO === true) { logger.write(MODULE_NAME, "[INFO] start -> businessLogic -> Entering function."); } + if (LOG_INFO === true) { logger.write(MODULE_NAME, "[INFO] start -> businessLogic -> Entering function."); } + + getChannelTilt(botDecision); - getChannelTilt(botDecision); - function botDecision(err, channelTilt) { try { - if (LOG_INFO === true) { logger.write(MODULE_NAME, "[INFO] start -> businessLogic -> botDecision -> LRC Channel Tilt:" + channelTilt); } + if (LOG_INFO === true) { logger.write(MODULE_NAME, "[INFO] start -> businessLogic -> botDecision -> Entering Function."); } - if (err.result !== global.DEFAULT_OK_RESPONSE.result) { + if (err.result !== global.DEFAULT_OK_RESPONSE.result) { logger.write(MODULE_NAME, "[ERROR] start -> businessLogic -> botDecision -> err = " + err.message); callBack(global.DEFAULT_FAIL_RESPONSE); - } else { - if (channelTilt == 1) { - createBuyPosition(callBack); - } else if (channelTilt == -1) { - createSellPosition(callBack); - } else { + } else { + if (channelTilt == 1) { + createBuyPosition(callBack); + } else if (channelTilt == -1) { + createSellPosition(callBack); + } else { if (LOG_INFO === true) { logger.write(MODULE_NAME, "[INFO] start -> businessLogic -> botDecision -> Nothing to do, there isn't a sell or buy oportunity."); } - - callBack(global.DEFAULT_OK_RESPONSE); - } + + callBack(global.DEFAULT_OK_RESPONSE); + } } } catch (err) { logger.write(MODULE_NAME, "[ERROR] start -> businessLogic -> botDecision -> err = " + err.message); callBackFunction(global.DEFAULT_FAIL_RESPONSE); } - } + } } function getChannelTilt(callBack) { @@ -127,6 +133,7 @@ mid: lrcPointsFile[i][3], max: lrcPointsFile[i][4] }; + if (i >= 1) { let previous = i - 1; previousLRCPoint = { @@ -238,120 +245,258 @@ if (lrcPoint.min < previousLRCPoint.min && lrcPoint.mid <= previousLRCPoint.mid) { // 15 AND 30 changed direction from up to down - channelTilt = CHANNEL_DOWN; - ruleApplied += "Rule_3a."; + if (checkToSellWithStopLoss()) { + channelTilt = CHANNEL_DOWN; + ruleApplied += "Rule_3a."; + } } if (lrcPoint.min > previousLRCPoint.min && lrcPoint.mid >= previousLRCPoint.mid) { // 15 AND 30 changed direction from down to up - channelTilt = CHANNEL_UP; - ruleApplied += "Rule_3b."; + getLastCandleFromOlivia(onLastCandleFromOliviaReceived); + + function onLastCandleFromOliviaReceived(candle) { + if (candle !== undefined && candle.close >= candle.open) { + //We will only fast buy if the current candle close, is greater than the open + channelTilt = CHANNEL_UP; + ruleApplied += "Rule_3b."; + } + + let logMessage = bot.processDatetime.toISOString() + ". Rule: " + ruleApplied + "Tilt: " + channelTilt + " (" + Number(lrcPoint.min).toLocaleString() + "|" + Number(lrcPoint.mid).toLocaleString() + "|" + Number(lrcPoint.max).toLocaleString() + ")"; + if (LOG_INFO === true) { logger.write(MODULE_NAME, "[INFO] start -> getChannelTilt -> applyBotRules -> Results: " + logMessage); } + + callBack(global.DEFAULT_OK_RESPONSE, channelTilt); + } + } else { + + let logMessage = bot.processDatetime.toISOString() + ". Rule: " + ruleApplied + "Tilt: " + channelTilt + " (" + Number(lrcPoint.min).toLocaleString() + "|" + Number(lrcPoint.mid).toLocaleString() + "|" + Number(lrcPoint.max).toLocaleString() + ")"; + if (LOG_INFO === true) { logger.write(MODULE_NAME, "[INFO] start -> getChannelTilt -> applyBotRules -> Results: " + logMessage); } + + callBack(global.DEFAULT_OK_RESPONSE, channelTilt); } + } - let logMessage = bot.processDatetime.toISOString() + "\t" + ruleApplied + "\t" + channelTilt + "\t" + lrcPoint.min + "\t" + lrcPoint.mid + "\t" + lrcPoint.max; - if (LOG_INFO === true) { logger.write(MODULE_NAME, "[INFO] start -> getChannelTilt -> applyBotRules -> Results: " + logMessage); } + function getLastCandleFromOlivia(callback) { + if (LOG_INFO === true) { logger.write(MODULE_NAME, "[INFO] start -> getChannelTilt -> applyBotRules -> getLastCandleFromOlivia -> Entering Function."); } - callBack(global.DEFAULT_OK_RESPONSE, channelTilt); + let key = "AAMasters-AAOlivia-Candles-Multi-Period-Daily-dataSet.V1"; + let oliviaStorage = assistant.dataDependencies.dataSets.get(key); + + let dateTime = new Date(lrcPoint.begin); + let datePath = dateTime.getUTCFullYear() + "/" + pad(dateTime.getUTCMonth() + 1, 2) + "/" + pad(dateTime.getUTCDate(), 2); + let filePath = "Candles/Multi-Period-Daily/" + periodName + "/" + datePath; + let fileName = market.assetA + '_' + market.assetB + ".json" + + oliviaStorage.getTextFile(filePath, fileName, onFileReceived); + + function onFileReceived(err, text) { + try { + if (err.result === global.DEFAULT_OK_RESPONSE.result) { + if (LOG_INFO === true) { logger.write(MODULE_NAME, "[INFO] getLastCandleFromOlivia -> onFileReceived-> Entering Function."); } + + let candleFile = JSON.parse(text); + let lastCandleOlivia; + for (let i = 0; i < candleFile.length; i++) { + if (candleFile[i][4] == lrcPoint.begin) { + lastCandleOlivia = { + open: candleFile[i][2], + close: candleFile[i][3], + min: candleFile[i][0], + max: candleFile[i][1], + begin: candleFile[i][4], + end: candleFile[i][5] + }; + break; + } + } + + callback(lastCandleOlivia); + } else { + logger.write(MODULE_NAME, "[WARN] getLastCandleFromOlivia -> onFileReceived -> Failed to get the file."); + callback(undefined); + } + } catch (err) { + logger.write(MODULE_NAME, "[ERROR] getLastCandleFromOlivia -> onFileReceived -> err = " + err.message); + callBackFunction(global.DEFAULT_RETRY_RESPONSE); + } + } + } + + function checkToSellWithStopLoss() { + let assetBBalance = assistant.getAvailableBalance().assetB; + let currentRate = assistant.getMarketRate(); + let amountB = assistant.getAvailableBalance().assetB; + let amountA = amountB * currentRate; + let lastBuyRate = assistant.remindMeOf(LAST_BUY_RATE_KEY); + + if (stopLossEnabled && assetBBalance > 0) { + if (LOG_INFO === true) { logger.write(MODULE_NAME, "[INFO] start -> getChannelTilt -> applyBotRules -> manageStopLossConfiguration -> Stop Loss Enabled, checking to sell."); } + + // Get the current investment value + let investment = 0; + if (assistant.getAvailableBalance() !== undefined) { + //Get our last buy, if any + if (lastBuyRate === undefined) + lastBuyRate = currentRate; // We assume we just bought + + investment = assistant.getAvailableBalance().assetB * lastBuyRate; + } + + // Calculate maximum loss setup + let currentLoss = amountA - investment; + let stopLossValue = investment * stopLossPorcentage; + + if (currentLoss >= 0) { + return true; // If we are winning sell. + } else if (currentLoss < 0) { + if (Math.abs(currentLoss) > stopLossValue) { + let message = "Selling to avoid loss more than " + Number(stopLossPorcentage * 100).toLocaleString() + "% of our initial investment. "; + + message += "Combined ROI on current execution: "; + if (assistant.getCombinedProfits().assetA > 0) { + message += Number(assistant.getCombinedProfits().assetA).toLocaleString() + "%. "; + } else { + message += Number(assistant.getCombinedProfits().assetB).toLocaleString() + "%. "; + } + + if (LOG_INFO === true) { logger.write(MODULE_NAME, "[INFO] start -> getChannelTilt -> applyBotRules -> manageStopLossConfiguration -> Stop loss: " + message); } + + assistant.sendMessage(3, "Stop Loss", message); + + return true; + + } else { + let currentRisk = currentLoss / investment; + let message = "Not selling now. Risking " + Number(currentRisk * 100).toLocaleString() + "% of our initial investment"; + message += ". Last Buy: $" + Number(lastBuyRate).toLocaleString(); + message += ". Not selling at: $" + Number(currentRate).toLocaleString(); + + if (LOG_INFO === true) { logger.write(MODULE_NAME, "[INFO] start -> getChannelTilt -> applyBotRules -> manageStopLossConfiguration -> Stop loss: " + message); } + + assistant.sendMessage(3, "Stop Loss", message); + + return false; + } + } + } else { + return true; + } } } function getLRCPointsFile(dateTime, callback) { - if (FULL_LOG === true) { logger.write(MODULE_NAME, "[INFO] start -> businessLogic -> getLRCPointsFile -> Entering function."); } + if (FULL_LOG === true) { logger.write(MODULE_NAME, "[INFO] start -> businessLogic -> getLRCPointsFile -> Entering function."); } - let periodName = "30-min"; - let datePath = dateTime.getUTCFullYear() + "/" + pad(dateTime.getUTCMonth() + 1, 2) + "/" + pad(dateTime.getUTCDate(), 2); - let filePath = "LRC-Points/Multi-Period-Daily/" + periodName + "/" + datePath; - let fileName = market.assetA + '_' + market.assetB + ".json" + let datePath = dateTime.getUTCFullYear() + "/" + pad(dateTime.getUTCMonth() + 1, 2) + "/" + pad(dateTime.getUTCDate(), 2); + let filePath = "LRC-Points/Multi-Period-Daily/" + periodName + "/" + datePath; + let fileName = market.assetA + '_' + market.assetB + ".json" - gaussStorage.getTextFile(filePath, fileName, onFileReceived); + gaussStorage.getTextFile(filePath, fileName, onFileReceived); - function onFileReceived(err, text) { - if (err.result === global.DEFAULT_OK_RESPONSE.result) { - if (FULL_LOG === true) { logger.write(MODULE_NAME, "[INFO] start -> getChannelTilt -> getLRCPointsFile -> onFileReceived > Entering Function."); } + function onFileReceived(err, text) { + if (err.result === global.DEFAULT_OK_RESPONSE.result) { + if (FULL_LOG === true) { logger.write(MODULE_NAME, "[INFO] start -> getChannelTilt -> getLRCPointsFile -> onFileReceived > Entering Function."); } - let lrcPointsFile = JSON.parse(text); - callback(global.DEFAULT_OK_RESPONSE, lrcPointsFile); - } else { - logger.write(MODULE_NAME, "[ERROR] start -> getChannelTilt -> getLRCPointsFile -> onFileReceived -> Failed to get the file. Will abort the process and request a retry."); - callBackFunction(global.DEFAULT_RETRY_RESPONSE); - return; - } - } + let lrcPointsFile = JSON.parse(text); + + callback(global.DEFAULT_OK_RESPONSE, lrcPointsFile); + } else { + logger.write(MODULE_NAME, "[ERROR] start -> getChannelTilt -> getLRCPointsFile -> onFileReceived -> Failed to get the file. Will abort the process and request a retry."); + callBackFunction(global.DEFAULT_RETRY_RESPONSE); + return; + } + } } function createBuyPosition(callBack) { if (LOG_INFO === true) { logger.write(MODULE_NAME, "[INFO] start -> businessLogic -> createBuyPosition -> Entering function."); } - - let positions = assistant.getPositions(); + + let positions = assistant.getPositions(); let assetABalance = assistant.getAvailableBalance().assetA; let currentRate = assistant.getMarketRate(); let amountA = assistant.getAvailableBalance().assetA; let amountB = amountA / currentRate; - - if (positions.length > 0 && positions[0].type === "buy" && positions[0].status !== "executed" && (bot.processDatetime.valueOf() - positions[0].date) > (60000 * 15)){ - - assistant.movePosition(positions[0], currentRate, callBack); - - if (LOG_INFO === true) { logger.write(MODULE_NAME, "[INFO] start -> businessLogic -> createBuyPosition -> Moving an existing position to a new rate: " + currentRate.toFixed(8)); } - - let message = "Moving an existing buy position to a new price: " + Number(currentRate).toLocaleString(); - assistant.sendMessage(2, "Moving Position", message); - - } else if(assetABalance > 0){ - - assistant.putPosition("buy", currentRate, amountA, amountB, callBack); + if (positions.length > 0 && positions[0].type === "buy" && positions[0].status !== "executed" && (bot.processDatetime.valueOf() - positions[0].date) > (60000 * 15)) { - let message = "Creating a new buy position. Price: " + Number(currentRate).toLocaleString(); - if (assistant.getROI() !== undefined) { - message += ". ROI on current execution: " + MARKET.assetA + ": " + assistant.getROI().assetA + ". " + MARKET.assetB + ": " + assistant.getROI().assetB; + if (LOG_INFO === true) { logger.write(MODULE_NAME, "[INFO] start -> businessLogic -> createBuyPosition -> Moving an existing position to a new price: $" + Number(currentRate).toLocaleString()); } + let message = "Moving an existing buy position to a new price: $" + Number(currentRate).toLocaleString(); + assistant.sendMessage(6, "Moving Position", message); + + assistant.rememberThis(LAST_BUY_RATE_KEY, currentRate); + + assistant.movePosition(positions[0], currentRate, callBack); + + + } else if (assetABalance > 0) { + + if (LOG_INFO === true) { logger.write(MODULE_NAME, "[INFO] start -> businessLogic -> createSellPosition -> Artuditu put a new BUY position at price: $" + Number(currentRate).toLocaleString()); } + + let message = "Creating a new buy position. Price: $" + Number(currentRate).toLocaleString(); + if (assistant.getCombinedProfits() !== undefined) { + message += ". Combined ROI on current execution: "; + if (assistant.getCombinedProfits().assetA > 0) { + message += Number(assistant.getCombinedProfits().assetA).toLocaleString() + "%. "; + } else { + message += Number(assistant.getCombinedProfits().assetB).toLocaleString() + "%. "; + } } - assistant.sendMessage(2, "Buying", message); - - } else { - if (LOG_INFO === true) { logger.write(MODULE_NAME, "[INFO] start -> businessLogic -> createBuyPosition -> There is not enough available balance to buy. Available balance: " + assetABalance ); } - - callBack(global.DEFAULT_OK_RESPONSE); - } + + assistant.sendMessage(7, "Buying", message); + + assistant.rememberThis(LAST_BUY_RATE_KEY, currentRate); + + assistant.putPosition("buy", currentRate, amountA, amountB, callBack); + + + } else { + if (LOG_INFO === true) { logger.write(MODULE_NAME, "[INFO] start -> businessLogic -> createBuyPosition -> Not enough available balance to buy."); } + + callBack(global.DEFAULT_OK_RESPONSE); + } } - + function createSellPosition(callBack) { if (LOG_INFO === true) { logger.write(MODULE_NAME, "[INFO] start -> businessLogic -> createSellPosition -> Entering function."); } - - let positions = assistant.getPositions(); - let assetBBalance = assistant.getAvailableBalance().assetB; + + let positions = assistant.getPositions(); + let assetBBalance = assistant.getAvailableBalance().assetB; let currentRate = assistant.getMarketRate(); let amountB = assistant.getAvailableBalance().assetB; let amountA = amountB * currentRate; - if (positions.length > 0 && positions[0].type === "sell" && positions[0].status !== "executed" && (bot.processDatetime.valueOf() - positions[0].date) > (60000 * 15)){ - - assistant.movePosition(positions[0], currentRate, callBack); - - if (LOG_INFO === true) { logger.write(MODULE_NAME, "[INFO] start -> businessLogic -> createBuyPosition -> Artuditu is moving an existing position to a new rate: " + currentRate.toFixed(8)); } - - let message = "Moving an existing sell position to a new price: " + Number(currentRate).toLocaleString(); - assistant.sendMessage(2, "Moving Position", message); + if (positions.length > 0 && positions[0].type === "sell" && positions[0].status !== "executed" && (bot.processDatetime.valueOf() - positions[0].date) > (60000 * 15)) { - }else if(assetBBalance > 0){ - - assistant.putPosition("sell", currentRate, amountA, amountB, callBack); - - if (LOG_INFO === true) { logger.write(MODULE_NAME, "[INFO] start -> businessLogic -> createSellPosition -> Artuditu put a new SELL Position at rate: " + currentRate + ". Amount traded asset A: " + amountA + ". Amount traded asset B: " + amountB); } + if (LOG_INFO === true) { logger.write(MODULE_NAME, "[INFO] start -> businessLogic -> createBuyPosition -> Artuditu is moving an existing position to a new rate: " + Number(currentRate).toLocaleString()); } - let message = "Creating a new sell position. Price: " + Number(currentRate).toLocaleString(); - if (assistant.getROI() !== undefined) { - message += ". ROI on current execution: " + MARKET.assetA + ": " + assistant.getROI().assetA + ". " + MARKET.assetB + ": " + assistant.getROI().assetB; + let message = "Moving an existing sell position to a new price: $" + Number(currentRate).toLocaleString(); + assistant.sendMessage(6, "Moving Position", message); + assistant.movePosition(positions[0], currentRate, callBack); + + } else if (assetBBalance > 0) { + + if (LOG_INFO === true) { logger.write(MODULE_NAME, "[INFO] start -> businessLogic -> createSellPosition -> Artuditu put a new SELL position at price: $" + Number(currentRate).toLocaleString()); } + + let message = "Creating a new sell position. Price: $" + Number(currentRate).toLocaleString(); + if (assistant.getCombinedProfits() !== undefined) { + message += ". Combined ROI on current execution: "; + if (assistant.getCombinedProfits().assetA > 0) { + message += Number(assistant.getCombinedProfits().assetA).toLocaleString() + "%. "; + } else { + message += Number(assistant.getCombinedProfits().assetB).toLocaleString() + "%. "; + } } - assistant.sendMessage(2, "Selling", message); - - } else { - if (LOG_INFO === true) { logger.write(MODULE_NAME, "[INFO] start -> businessLogic -> createBuyPosition -> There is not enough available balance to sell. Available balance: " + assetBBalance ); } - - callBack(global.DEFAULT_OK_RESPONSE); - } + assistant.sendMessage(7, "Selling", message); + + assistant.putPosition("sell", currentRate, amountA, amountB, callBack); + + } else { + if (LOG_INFO === true) { logger.write(MODULE_NAME, "[INFO] start -> businessLogic -> createBuyPosition -> There is not enough available balance to sell. Available balance: " + assetBBalance); } + + callBack(global.DEFAULT_OK_RESPONSE); + } } function pad(str, max) { @@ -360,4 +505,4 @@ } } -}; +}; \ No newline at end of file diff --git a/this.bot.config.json b/this.bot.config.json index 72f7945a4..db4c43fea 100644 --- a/this.bot.config.json +++ b/this.bot.config.json @@ -1,165 +1,178 @@ { - "displayName": "Artudito", - "codeName": "AAArtudito", - "type": "Trading", - "version": { - "major": 1, - "minor": 0, - "patch": 0 - }, - "devTeam": "AAVikings", - "profilePicture": "Artudito.png", - "dataSetVersion": "dataSet.V1", - "processes": [ - { - "name": "Trading-Process", - "description": "Simple trading strategy to be used as a template.", - "startMode": { - "live": { - "run": "false", - "resumeExecution": "false" + "displayName": "Artudito", + "codeName": "AAArtudito", + "type": "Trading", + "version": { + "major": 1, + "minor": 0, + "patch": 0 + }, + "devTeam": "AAVikings", + "profilePicture": "Artudito.png", + "dataSetVersion": "dataSet.V1", + "processes": [ + { + "name": "Trading-Process", + "description": "Simple trading strategy to be used as a template.", + "startMode": { + "live": { + "run": "true", + "resumeExecution": "false" + }, + "backtest": { + "run": "false", + "beginDatetime": "2018-06-24T18:00:00.000Z", + "endDatetime": "2018-06-28T11:00:00.000Z", + "waitTime": 500 + }, + "competition": { + "run": "false", + "beginDatetime": "2018-06-30T00:00:00.000Z", + "endDatetime": "2018-07-01T23:59:59.000Z", + "resumeExecution": "false" + } }, - "backtest": { - "run": "true", - "beginDatetime": "2018-04-01T01:00:00.000Z", - "endDatetime": "2018-04-01T12:00:00.000Z", - "waitTime": 500 - }, - "competition": { - "run": "false", - "beginDatetime": "2018-04-27T16:00:00.000Z", - "endDatetime": "2018-04-28T16:05:00.000Z", - "resumeExecution": "false" + "normalWaitTime": 60000, + "retryWaitTime": 10000, + "sleepWaitTime": 3600000, + "comaWaitTime": 86400000, + "statusDependencies": [ + { + "devTeam": "AAVikings", + "bot": "AAGauss", + "botVersion": { + "major": 1, + "minor": 0 + }, + "process": "Multi-Period-Daily", + "dataSetVersion": "dataSet.V1" + }, + { + "devTeam": "AAVikings", + "bot": "AAArtudito", + "botVersion": { + "major": 1, + "minor": 0 + }, + "process": "Trading-Process", + "dataSetVersion": "dataSet.V1" + } + ], + "dataDependencies": [ + { + "devTeam": "AAVikings", + "bot": "AAGauss", + "botVersion": { + "major": 1, + "minor": 0 + }, + "product": "LRC-Points", + "dataSetVersion": "dataSet.V1", + "dataSet": "Multi-Period-Daily" + }, + { + "devTeam": "AAMasters", + "bot": "AABruce", + "botVersion": { + "major": 1, + "minor": 0 + }, + "product": "Candles", + "dataSetVersion": "dataSet.V1", + "dataSet": "One-Min" + }, + { + "devTeam": "AAMasters", + "bot": "AAOlivia", + "botVersion": { + "major": 1, + "minor": 0 + }, + "product": "Candles", + "dataSet": "Multi-Period-Daily", + "dataSetVersion": "dataSet.V1" + } + ] + } + ], + "products": [ + { + "codeName": "Live Trading History", + "displayName": "Live Trading History", + "shortDisplayName": "Live", + "description": "General information about Artudito trading history.", + "storageAccount": "aaartudito", + "dataSets": [ + { + "codeName": "Oficial History", + "type": "File Sequence", + "validPeriods": [ "24-hs", "12-hs", "08-hs", "06-hs", "04-hs", "03-hs", "02-hs", "01-hs", "45-min", "40-min", "30-min", "20-min", "15-min", "10-min", "05-min", "04-min", "03-min", "02-min", "01-min" ], + "filePath": "@DevTeam/@Bot.1.0/AACloud.1.1/Poloniex/dataSet.V1/Output/Trading-Process", + "fileName": "Execution.History.Live.@Sequence.json" + } + ], + "exchangeList": [ + { + "name": "Poloniex" + } + ], + "plotter": { + "devTeam": "AAMasters", + "codeName": "PlottersTrading", + "moduleName": "History" } }, - "normalWaitTime": 60000, - "retryWaitTime": 10000, - "sleepWaitTime": 3600000, - "comaWaitTime": 86400000, - "timePeriod": 60000, - "statusDependencies": [ - { - "devTeam": "AAVikings", - "bot": "AAGauss", - "botVersion": { - "major": 1, - "minor": 0 - }, - "process": "Multi-Period-Daily", - "dataSetVersion": "dataSet.V1" - }, - { - "devTeam": "AAVikings", - "bot": "AAArtudito", - "botVersion": { - "major": 1, - "minor": 0 - }, - "process": "Trading-Process", - "dataSetVersion": "dataSet.V1" - } - ], - "dataDependencies": [ - { - "devTeam": "AAVikings", - "bot": "AAGauss", - "botVersion": { - "major": 1, - "minor": 0 - }, - "product": "LRC-Points", - "dataSetVersion": "dataSet.V1", - "dataSet": "Multi-Period-Daily" - }, - { + { + "codeName": "Backtest Trading History", + "displayName": "Backtest Trading History", + "shortDisplayName": "Backtest", + "description": "General information about Artudito backtest trading history.", + "storageAccount": "aaartudito", + "dataSets": [ + { + "codeName": "Backtest History", + "type": "File Sequence", + "validPeriods": [ "24-hs", "12-hs", "08-hs", "06-hs", "04-hs", "03-hs", "02-hs", "01-hs", "45-min", "40-min", "30-min", "20-min", "15-min", "10-min", "05-min", "04-min", "03-min", "02-min", "01-min" ], + "filePath": "@DevTeam/@Bot.1.0/AACloud.1.1/Poloniex/dataSet.V1/Output/Trading-Process", + "fileName": "Execution.History.Backtest.@Sequence.json" + } + ], + "exchangeList": [ + { + "name": "Poloniex" + } + ], + "plotter": { "devTeam": "AAMasters", - "bot": "AABruce", - "botVersion": { - "major": 1, - "minor": 0 - }, - "product": "Candles", - "dataSet": "One-Min", - "dataSetVersion": "dataSet.V1" + "codeName": "PlottersTrading", + "moduleName": "History" } - ] - } - ], - "products": [ - { - "codeName": "Live Trading History", - "displayName": "Live Trading History", - "shortDisplayName": "Live", - "description": "General information about Artudito trading history.", - "dataSets": [ + }, { - "codeName": "Live History", - "type": "File Sequence", - "validPeriods": [ "24-hs", "12-hs", "08-hs", "06-hs", "04-hs", "03-hs", "02-hs", "01-hs", "45-min", "40-min", "30-min", "20-min", "15-min", "10-min", "05-min", "04-min", "03-min", "02-min", "01-min" ], - "filePath": "@DevTeam/@Bot.1.0/AACloud.1.1/Poloniex/dataSet.V1/Output/Trading-Process", - "fileName": "Execution.History.Live.@Sequence.json" + "codeName": "Competition Trading History", + "displayName": "Competition Trading History", + "shortDisplayName": "Competition", + "description": "General information about Artudito competition trading history.", + "storageAccount": "aaartudito", + "dataSets": [ + { + "codeName": "Competition History", + "type": "File Sequence", + "validPeriods": [ "24-hs", "12-hs", "08-hs", "06-hs", "04-hs", "03-hs", "02-hs", "01-hs", "45-min", "40-min", "30-min", "20-min", "15-min", "10-min", "05-min", "04-min", "03-min", "02-min", "01-min" ], + "filePath": "@DevTeam/@Bot.1.0/AACloud.1.1/Poloniex/dataSet.V1/Output/Trading-Process", + "fileName": "Execution.History.Competition.@Sequence.json" + } + ], + "exchangeList": [ + { + "name": "Poloniex" + } + ], + "plotter": { + "devTeam": "AAMasters", + "codeName": "PlottersTrading", + "moduleName": "History" + } } - ], - "exchangeList": [ - { - "name": "Poloniex" - } - ], - "plotter": { - "devTeam": "AAMasters", - "codeName": "PlottersTrading", - "moduleName": "History" - } - }, - { - "codeName": "Backtest Trading History", - "displayName": "Backtest Trading History", - "shortDisplayName": "Backtest", - "description": "General information about Artudito backtest trading history.", - "dataSets": [ - { - "codeName": "Backtest History", - "type": "File Sequence", - "validPeriods": [ "24-hs", "12-hs", "08-hs", "06-hs", "04-hs", "03-hs", "02-hs", "01-hs", "45-min", "40-min", "30-min", "20-min", "15-min", "10-min", "05-min", "04-min", "03-min", "02-min", "01-min" ], - "filePath": "@DevTeam/@Bot.1.0/AACloud.1.1/Poloniex/dataSet.V1/Output/Trading-Process", - "fileName": "Execution.History.Backtest.@Sequence.json" - } - ], - "exchangeList": [ - { - "name": "Poloniex" - } - ], - "plotter": { - "devTeam": "AAMasters", - "codeName": "PlottersTrading", - "moduleName": "History" - } - }, - { - "codeName": "Competition Trading History", - "displayName": "Competition Trading History", - "shortDisplayName": "Competition", - "description": "General information about Artudito competition trading history.", - "dataSets": [ - { - "codeName": "Competition History", - "type": "File Sequence", - "validPeriods": [ "24-hs", "12-hs", "08-hs", "06-hs", "04-hs", "03-hs", "02-hs", "01-hs", "45-min", "40-min", "30-min", "20-min", "15-min", "10-min", "05-min", "04-min", "03-min", "02-min", "01-min" ], - "filePath": "@DevTeam/@Bot.1.0/AACloud.1.1/Poloniex/dataSet.V1/Output/Trading-Process", - "fileName": "Execution.History.Competition.@Sequence.json" - } - ], - "exchangeList": [ - { - "name": "Poloniex" - } - ], - "plotter": { - "devTeam": "AAMasters", - "codeName": "PlottersTrading", - "moduleName": "History" - } - } - ] -} + ] +} \ No newline at end of file