IPC Event Handler Implemented and working well

This commit is contained in:
Luis Fernando Molina committed 2019-09-05 18:53:32 +02:00
1 parent 0074b7ce0f
commit 0dfe957db7
12 files changed
+299 -136

No files matched your search

+36 -35
View File
@@ -63,7 +63,8 @@
}
case 'Backtest': {
getMarketRateFromIndicator();
// getMarketRateFromIndicator(); NOTE: This path is disabled since for now we do not allow ticker in simulation. Also it allow us to ship a dataset without bruce
validateExchangeSyncronicity();
break;
}
@@ -112,13 +113,13 @@
validateExchangeSyncronicity();
} catch (err) {
logger.write(MODULE_NAME, "[ERROR] initialize -> getMarketRateFromExchange -> onTicker -> err = "+ err.stack);
logger.write(MODULE_NAME, "[ERROR] initialize -> getMarketRateFromExchange -> onTicker -> err = " + err.stack);
callBackFunction(global.DEFAULT_FAIL_RESPONSE);
}
}
} catch (err) {
logger.write(MODULE_NAME, "[ERROR] initialize -> getMarketRateFromExchange -> err = "+ err.stack);
logger.write(MODULE_NAME, "[ERROR] initialize -> getMarketRateFromExchange -> err = " + err.stack);
callBackFunction(global.DEFAULT_FAIL_RESPONSE);
}
}
@@ -156,12 +157,12 @@
let candleArray;
if (err.result === global.CUSTOM_FAIL_RESPONSE.result || err.code === "The specified key does not exist." || err.message === "File does not exist.") { // Just past midnight, this file will not exist for a couple of minutes.
logger.write(MODULE_NAME, "[WARN] initialize -> getMarketRateFromIndicator -> onFileReceived -> err = " + JSON.stringify(err));
logger.write(MODULE_NAME, "[WARN] initialize -> getMarketRateFromIndicator -> This could happen when there are still holes on trades and the process needs to catch up. ");
callBackFunction(global.DEFAULT_FAIL_RESPONSE);
return;
}
if (err.result === global.DEFAULT_OK_RESPONSE.result) {
@@ -211,7 +212,7 @@
}
} catch (err) {
logger.write(MODULE_NAME, "[ERROR] initialize -> getMarketRateFromIndicator -> err = "+ err.stack);
logger.write(MODULE_NAME, "[ERROR] initialize -> getMarketRateFromIndicator -> err = " + err.stack);
callBackFunction(global.DEFAULT_FAIL_RESPONSE);
}
}
@@ -253,13 +254,13 @@
}
} catch (err) {
logger.write(MODULE_NAME, "[ERROR] initialize -> validateExchangeSyncronicity -> onDone -> err = "+ err.stack);
logger.write(MODULE_NAME, "[ERROR] initialize -> validateExchangeSyncronicity -> onDone -> err = " + err.stack);
callBackFunction(global.DEFAULT_FAIL_RESPONSE);
}
}
} catch (err) {
logger.write(MODULE_NAME, "[ERROR] initialize -> onDone -> err = "+ err.stack);
logger.write(MODULE_NAME, "[ERROR] initialize -> onDone -> err = " + err.stack);
callBackFunction(global.DEFAULT_FAIL_RESPONSE);
}
}
@@ -313,14 +314,14 @@
callBackFunction(global.DEFAULT_OK_RESPONSE);
} catch (err) {
logger.write(MODULE_NAME, "[ERROR] initialize -> calculateProfits -> err = "+ err.stack);
logger.write(MODULE_NAME, "[ERROR] initialize -> calculateProfits -> err = " + err.stack);
callBack(global.DEFAULT_FAIL_RESPONSE);
return;
}
}
} catch (err) {
logger.write(MODULE_NAME, "[ERROR] initialize -> err = "+ err.stack);
logger.write(MODULE_NAME, "[ERROR] initialize -> err = " + err.stack);
callBackFunction(global.DEFAULT_FAIL_RESPONSE);
}
}
@@ -399,7 +400,7 @@
}
}
} catch (err) {
logger.write(MODULE_NAME, "[ERROR] getPositionsAtExchange -> err = "+ err.stack);
logger.write(MODULE_NAME, "[ERROR] getPositionsAtExchange -> err = " + err.stack);
callBack(global.DEFAULT_FAIL_RESPONSE);
}
}
@@ -561,17 +562,17 @@
if (thisPosition.id === pPositionId) {
let feeRate = 0.002; // Default backtesting fee simulation
let feeRate = 0.002; // Default backtesting fee simulation
let trade = {
id: Math.trunc(Math.random(1) * 1000000),
type: thisPosition.type,
rate: thisPosition.rate.toString(),
let trade = {
id: Math.trunc(Math.random(1) * 1000000),
type: thisPosition.type,
rate: thisPosition.rate.toString(),
amountA: thisObject.truncDecimals(thisPosition.amountA).toString(),
amountB: thisObject.truncDecimals(thisPosition.amountB).toString(),
fee: thisObject.truncDecimals(feeRate).toString(),
date: (new Date()).valueOf()
}
date: (new Date()).valueOf()
}
trades.push(trade);
@@ -626,12 +627,12 @@
break;
}
} catch (err) {
logger.write(MODULE_NAME, "[ERROR] ordersExecutionCheck -> loopBody -> getPositionTradesAtExchange -> onResponse -> err = "+ err.stack);
logger.write(MODULE_NAME, "[ERROR] ordersExecutionCheck -> loopBody -> getPositionTradesAtExchange -> onResponse -> err = " + err.stack);
callBack(global.DEFAULT_FAIL_RESPONSE);
}
}
} catch (err) {
logger.write(MODULE_NAME, "[ERROR] ordersExecutionCheck -> loopBody -> getPositionTradesAtExchange -> err = "+ err.stack);
logger.write(MODULE_NAME, "[ERROR] ordersExecutionCheck -> loopBody -> getPositionTradesAtExchange -> err = " + err.stack);
callBack(global.DEFAULT_FAIL_RESPONSE);
}
}
@@ -656,7 +657,7 @@
let sumRate = 0;
for (let k = 0; k < pTrades.length; k++) {
let trade = pTrades[k];
let trade = pTrades[k];
sumAssetA = sumAssetA + thisObject.truncDecimals(trade.amountA);
sumAssetB = sumAssetB + thisObject.truncDecimals(trade.amountB);
sumRate = sumRate + thisObject.truncDecimals(trade.rate);
@@ -704,7 +705,7 @@
next();
} catch (err) {
logger.write(MODULE_NAME, "[ERROR] ordersExecutionCheck -> loopBody -> confirmOrderWasExecuted -> err = "+ err.stack);
logger.write(MODULE_NAME, "[ERROR] ordersExecutionCheck -> loopBody -> confirmOrderWasExecuted -> err = " + err.stack);
callBack(global.DEFAULT_FAIL_RESPONSE);
return;
}
@@ -726,8 +727,8 @@
let sumAssetA = 0;
let sumAssetB = 0;
for (let k = 0; k < pTrades.length; k++) {
let trade = pTrades[k];
for (let k = 0; k < pTrades.length; k++) {
let trade = pTrades[k];
sumAssetA = sumAssetA + thisObject.truncDecimals(trade.amountA);
sumAssetB = sumAssetB + thisObject.truncDecimals(trade.amountB);
}
@@ -749,7 +750,7 @@
*/
let exchangeParam = exchangeAPI.getMaxDecimalPositions();
let minValue = '0.' + (1).toPrecision(exchangeParam-1).split('.').reverse().join('');
let minValue = '0.' + (1).toPrecision(exchangeParam - 1).split('.').reverse().join('');
let exchangePrecision = parseFloat(parseFloat(minValue).toFixed(exchangeParam));
if (Math.abs(position.amountA - sumAssetA) > exchangePrecision || Math.abs(position.amountB - sumAssetB) > exchangePrecision) {
@@ -790,7 +791,7 @@
next();
} catch (err) {
logger.write(MODULE_NAME, "[ERROR] ordersExecutionCheck -> loopBody -> confirmOrderWasPartiallyExecuted -> err = "+ err.stack);
logger.write(MODULE_NAME, "[ERROR] ordersExecutionCheck -> loopBody -> confirmOrderWasPartiallyExecuted -> err = " + err.stack);
callBack(global.DEFAULT_FAIL_RESPONSE);
return;
}
@@ -857,7 +858,7 @@
context.executionContext.balance.assetA = thisObject.truncDecimals(context.executionContext.balance.assetA + assetA);
context.executionContext.balance.assetB = thisObject.truncDecimals(context.executionContext.balance.assetB - assetB);
context.executionContext.availableBalance.assetA = thisObject.truncDecimals(context.executionContext.availableBalance.assetA + assetA);
context.executionContext.availableBalance.assetA = thisObject.truncDecimals(context.executionContext.availableBalance.assetA + assetA);
/* Not the available balance for asset B is not affected since it was already reduced when the order was placed. */
@@ -865,14 +866,14 @@
}
} catch (err) {
logger.write(MODULE_NAME, "[ERROR] ordersExecutionCheck -> loopBody -> applyTradesToContext -> err = "+ err.stack);
logger.write(MODULE_NAME, "[ERROR] ordersExecutionCheck -> loopBody -> applyTradesToContext -> err = " + err.stack);
callBack(global.DEFAULT_FAIL_RESPONSE);
return;
}
}
} catch (err) {
logger.write(MODULE_NAME, "[ERROR] ordersExecutionCheck -> loopBody -> err = "+ err.stack);
logger.write(MODULE_NAME, "[ERROR] ordersExecutionCheck -> loopBody -> err = " + err.stack);
callBack(global.DEFAULT_FAIL_RESPONSE);
return;
}
@@ -911,7 +912,7 @@
}
} catch (err) {
logger.write(MODULE_NAME, "[ERROR] ordersExecutionCheck -> err = "+ err.stack);
logger.write(MODULE_NAME, "[ERROR] ordersExecutionCheck -> err = " + err.stack);
callBack(global.DEFAULT_FAIL_RESPONSE);
}
}
@@ -1075,12 +1076,12 @@
break;
}
} catch (err) {
logger.write(MODULE_NAME, "[ERROR] putPosition -> onResponse -> err = "+ err.stack);
logger.write(MODULE_NAME, "[ERROR] putPosition -> onResponse -> err = " + err.stack);
callBackFunction(global.DEFAULT_FAIL_RESPONSE);
}
}
} catch (err) {
logger.write(MODULE_NAME, "[ERROR] putPosition -> err = "+ err.stack);
logger.write(MODULE_NAME, "[ERROR] putPosition -> err = " + err.stack);
callBackFunction(global.DEFAULT_FAIL_RESPONSE);
}
}
@@ -1199,12 +1200,12 @@
break;
}
} catch (err) {
logger.write(MODULE_NAME, "[ERROR] movePosition -> onResponse -> err = "+ err.stack);
logger.write(MODULE_NAME, "[ERROR] movePosition -> onResponse -> err = " + err.stack);
callBackFunction(global.DEFAULT_FAIL_RESPONSE);
}
}
} catch (err) {
logger.write(MODULE_NAME, "[ERROR] movePosition -> err = "+ err.stack);
logger.write(MODULE_NAME, "[ERROR] movePosition -> err = " + err.stack);
callBackFunction(global.DEFAULT_FAIL_RESPONSE);
}
}
@@ -1330,7 +1331,7 @@
let runIndex = context.statusReport.runs.length - 1;
context.newHistoryRecord.messageRelevance = pRelevance;
context.newHistoryRecord.messageTitle = bot.startMode + "." + runIndex +": "+ pTitle;
context.newHistoryRecord.messageTitle = bot.startMode + "." + runIndex + ": " + pTitle;
context.newHistoryRecord.messageBody = pBody;
}
+143
View File
@@ -0,0 +1,143 @@
exports.newEventHandler = function newEventHandler() {
let thisObject = {
initialize: initialize,
createEventHandler: createEventHandler,
deleteEventHandler: deleteEventHandler,
listenToEvent: listenToEvent,
stopListening: stopListening,
raiseEvent: raiseEvent
}
let ipc = require('node-ipc');
let eventListeners = new Map()
let responseWaiters = new Map()
ipc.config.id = 'Clone Executor';
ipc.config.retry = 1500;
return thisObject
function initialize(callBackFunction) {
ipc.connectTo(
'world',
function () {
ipc.of.world.on(
'connect',
function () {
ipc.log('## Connected to Superalgos Event Server ##'.rainbow, ipc.config.delay);
let eventCommand = {
action: 'greetings',
from: 'Clone Executor'
}
sendCommand(eventCommand)
callBackFunction()
}
);
ipc.of.world.on(
'disconnect',
function () {
ipc.log('Disconnected from Superalgos Event Server '.notice);
}
);
ipc.of.world.on(
'message', // here is where all incomming messages are processed.
function (data) {
ipc.log('Got a message from Superalgos Event Server: '.debug, data);
let message = JSON.parse(data)
if (message.action === 'Event Raised') {
let handler = eventListeners.get(message.eventHandlerName + '-' + message.eventType)
if (handler) {
handler(message)
}
return
}
if (message.action === 'Event Server Response') {
let handler = responseWaiters.get(message.callerId)
if (handler) {
handler(message)
}
return
}
}
);
}
);
}
function sendCommand(command, responseCallBack, eventsCallBack) {
if (command.action === 'listenToEvent') {
eventListeners.set(command.eventHandlerName + '-' + command.eventType, eventsCallBack)
}
if (command.callerId && responseCallBack) {
responseWaiters.set(command.callerId, responseCallBack)
}
ipc.of.world.emit(
'message',
JSON.stringify(command)
)
}
function createEventHandler(eventHandlerName, callerId, responseCallBack) {
let eventCommand = {
action: 'createEventHandler',
eventHandlerName: eventHandlerName,
callerId: callerId
}
sendCommand(eventCommand, responseCallBack)
}
function deleteEventHandler(eventHandlerName, callerId, responseCallBack) {
let eventCommand = {
action: 'deleteEventHandler',
eventHandlerName: eventHandlerName,
callerId: callerId
}
sendCommand(eventCommand, responseCallBack)
}
function listenToEvent(eventHandlerName, eventType, extraData, callerId, responseCallBack, eventsCallBack) {
eventCommand = {
action: 'listenToEvent',
eventHandlerName: eventHandlerName,
eventType: eventType,
extraData: extraData,
callerId: callerId
}
sendCommand(eventCommand, responseCallBack, eventsCallBack)
}
function stopListening(eventHandlerName, eventSubscriptionId, callerId, responseCallBack) {
eventCommand = {
action: 'stopListening',
eventHandlerName: eventHandlerName,
eventSubscriptionId: eventSubscriptionId,
callerId: callerId
}
sendCommand(eventCommand, responseCallBack)
}
function raiseEvent(eventHandlerName, eventType, event, callerId, responseCallBack) {
let eventCommand = {
action: 'raiseEvent',
eventHandlerName: eventHandlerName,
eventType: eventType,
event: event,
callerId: callerId
}
sendCommand(eventCommand, responseCallBack)
}
}
+4
View File
@@ -984,6 +984,10 @@
thisReport.save(callBack);
bot.hasTheBotJustStarted = false;
/* Emit event that signals that this process finished */
global.eventHandler.raiseEvent('Jason-Multi-Period', 'Status Report Updated', { lastProcessedDay: lastFileDate })
}
catch (err) {
logger.write(MODULE_NAME, "[ERROR] start -> writeDailyStatusReport -> err = " + err.stack);
+3
View File
@@ -24,6 +24,9 @@
<Compile Include="Assistant.js">
<SubType>Code</SubType>
</Compile>
<Compile Include="EventHandler.js">
<SubType>Code</SubType>
</Compile>
<Compile Include="Integrations\Ecosystem.js" />
<Compile Include="Integrations\FileStorage.js" />
<Compile Include="Integrations\Definition.js" />
-27
View File
@@ -1,32 +1,5 @@
exports.newRoot = function newRoot() {
/* Callbacks default responses. */
global.DEFAULT_OK_RESPONSE = {
result: "Ok",
message: "Operation Succeeded"
};
global.DEFAULT_FAIL_RESPONSE = {
result: "Fail",
message: "Operation Failed"
};
global.DEFAULT_RETRY_RESPONSE = {
result: "Retry",
message: "Retry Later"
};
global.CUSTOM_OK_RESPONSE = {
result: "Ok, but check Message",
message: "Custom Message"
};
global.CUSTOM_FAIL_RESPONSE = {
result: "Fail Because",
message: "Custom Message"
};
/* This is the Execution Datetime */
global.EXECUTION_DATETIME = new Date();
+66 -11
View File
@@ -1,3 +1,55 @@
/* Callbacks default responses. */
global.DEFAULT_OK_RESPONSE = {
result: "Ok",
message: "Operation Succeeded"
};
global.DEFAULT_FAIL_RESPONSE = {
result: "Fail",
message: "Operation Failed"
};
global.DEFAULT_RETRY_RESPONSE = {
result: "Retry",
message: "Retry Later"
};
global.CUSTOM_OK_RESPONSE = {
result: "Ok, but check Message",
message: "Custom Message"
};
global.CUSTOM_FAIL_RESPONSE = {
result: "Fail Because",
message: "Custom Message"
};
const EVENT_HANDLER_MODULE = require('./EventHandler.js');
global.eventHandler = EVENT_HANDLER_MODULE.newEventHandler()
global.eventHandler.initialize(bootLoader)
function bootLoader() {
global.eventHandler.createEventHandler('Jason-Multi-Period')
tryToListenToCockpit()
function tryToListenToCockpit() {
global.eventHandler.listenToEvent('Cockpit-Restart-Simulation', 'Simulation Started', undefined, 'Clone Executor Boot Loader', onResponse, startSequence)
function onResponse(message) {
if (message.result !== global.DEFAULT_OK_RESPONSE.result) {
setTimeout(tryToListenToCockpit, 3000)
}
}
}
}
/* Old Run.js code follows... */
require('dotenv').config();
global.DEFINITION = require(process.env.INTER_PROCESS_FILES_PATH + '/Definition');
@@ -5,7 +57,7 @@ const definition = global.DEFINITION
const path = require('path');
global.SHALL_BOT_STOP = false
global.AT_BREAKPOINT = false // This is used only when running at the browser.
global.FULL_LOG = process.env.FULL_LOG
/* Default parameters can be changed by the execution configuration */
@@ -40,18 +92,21 @@ if (process.env.RUN_SEQUENCE !== undefined) {
isRunSequence = JSON.parse(process.env.RUN_SEQUENCE)
}
if (isRunSequence) {
process.on('message', message => {
if (message === 'STOP') {
runClonExecutor = false;
console.log("[INFO] CloneExecutor -> Clone Executor Stopped.");
}
});
sequenceExecution(sequenceStep)
} else {
readExecutionConfiguration()
function startSequence () {
if (isRunSequence) {
process.on('message', message => {
if (message === 'STOP') {
runClonExecutor = false;
console.log("[INFO] CloneExecutor -> Clone Executor Stopped.");
}
});
sequenceExecution(sequenceStep)
} else {
readExecutionConfiguration()
}
}
async function sequenceExecution(currentStep) {
let execution = sequenceList[currentStep];
+3 -1
View File
@@ -51,7 +51,9 @@
return;
}
USER_BOT_MODULE = {}
if (bot.process === "Hole-Fixing") {
//USER_BOT_MODULE.newUserBot = require(process.env.BOTS_PATH + '/aamasters/AAMasters/bots/AACharly-Sensor-Bot/Hole-Fixing/User.Bot').newUserBot
}
USER_BOT_MODULE.newUserBot = eval(text); // TODO This needs to be changed function
filePath = global.DEV_TEAM + "/" + "bots" + "/" + bot.repo;
-5
View File
@@ -260,11 +260,6 @@
if (FULL_LOG === true) { logger.write(MODULE_NAME, "[INFO] run -> loop -> bot.processDatetime = " + bot.processDatetime.toISOString()); }
if (global.AT_BREAKPOINT === true) {
if (FULL_LOG === true) { logger.write(MODULE_NAME, "[INFO] run -> loop -> Plot Breakpoint Hit."); }
}
/* High level log entry */
+33
View File
@@ -202,6 +202,11 @@
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.0.0.tgz",
"integrity": "sha512-30xVGqjLjiUOArT4+M5q9sYdvuR4riM6yK9wMcas9Vbp6zZa+ocC9dp6QoftuhTPhFAiLK/0C5Ni2nou/Bk8lg=="
},
"easy-stack": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/easy-stack/-/easy-stack-1.0.0.tgz",
"integrity": "sha1-EskbMIWjfwuqM26UhurEv5Tj54g="
},
"ecc-jsbn": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
@@ -224,6 +229,11 @@
"resolved": "https://registry.npmjs.org/env-variable/-/env-variable-0.0.5.tgz",
"integrity": "sha512-zoB603vQReOFvTg5xMl9I1P2PnHsHQQKTEowsKKD7nseUfJq6UWzK+4YtlWUO1nhiQUxe6XMkk+JleSZD1NZFA=="
},
"event-pubsub": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/event-pubsub/-/event-pubsub-4.3.0.tgz",
"integrity": "sha512-z7IyloorXvKbFx9Bpie2+vMJKKx1fH1EN5yiTfp8CiLOTptSYy1g8H4yDpGlEdshL1PBiFtBHepF2cNsqeEeFQ=="
},
"extend": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
@@ -344,6 +354,19 @@
"resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
"integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
},
"js-message": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/js-message/-/js-message-1.0.5.tgz",
"integrity": "sha1-IwDSSxrwjondCVvBpMnJz8uJLRU="
},
"js-queue": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/js-queue/-/js-queue-2.0.0.tgz",
"integrity": "sha1-NiITz4YPRo8BJfxslqvBdCUx+Ug=",
"requires": {
"easy-stack": "1.0.0"
}
},
"jsbn": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
@@ -435,6 +458,16 @@
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
},
"node-ipc": {
"version": "9.1.1",
"resolved": "https://registry.npmjs.org/node-ipc/-/node-ipc-9.1.1.tgz",
"integrity": "sha512-FAyICv0sIRJxVp3GW5fzgaf9jwwRQxAKDJlmNFUL5hOy+W4X/I5AypyHoq0DXXbo9o/gt79gj++4cMr4jVWE/w==",
"requires": {
"event-pubsub": "4.3.0",
"js-message": "1.0.5",
"js-queue": "2.0.0"
}
},
"nonce": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/nonce/-/nonce-1.0.4.tgz",
+1
View File
@@ -17,6 +17,7 @@
"@superalgos/mqservice": "^0.0.17",
"axios": "^0.19.0",
"dotenv": "^8.0.0",
"node-ipc": "^9.1.1",
"winston": "^3.2.1"
}
}
+5 -52
View File
@@ -14,26 +14,26 @@
{
"devTeam": "AAMasters",
"bot": "AACharly",
"mode": "noTime",
"mode": "oneMonth",
"resumeExecution": true,
"type": "Sensor",
"exchangeName": "Poloniex",
"process": "Hole-Fixing",
"startYear": 2019,
"endYear": 2021,
"month": 1
"endYear": 2019,
"month": 9
},
{
"devTeam": "AAMasters",
"bot": "AABruce",
"mode": "noTime",
"mode": "oneMonth",
"resumeExecution": true,
"type": "Indicator",
"exchangeName": "Poloniex",
"process": "Single-Period-Daily",
"startYear": 2019,
"endYear": 2021,
"month": 1
"month": 9
},
{
"devTeam": "AAMasters",
@@ -141,52 +141,5 @@
"process": "Multi-Period-Daily",
"beginDatetime": "2019-08-01T08:00:00.000Z",
"timePeriod": "05-min"
},
{
"devTeam": "AAVikings",
"bot": "AAGauss",
"mode": "noTime",
"resumeExecution": true,
"type": "Indicator",
"exchangeName": "Poloniex",
"process": "Multi-Period-Daily",
"startYear": 2019,
"endYear": 2021,
"month": 1
},
{
"devTeam": "AAVikings",
"bot": "AAGauss",
"mode": "noTime",
"resumeExecution": true,
"type": "Indicator",
"exchangeName": "Poloniex",
"process": "Multi-Period-Market",
"startYear": 2019,
"endYear": 2021,
"month": 1
},
{
"devTeam": "vikingsalerts",
"bot": "simulator-bot-vikingsalerts",
"mode": "noTime",
"resumeExecution": true,
"type": "Indicator",
"exchangeName": "Poloniex",
"process": "Multi-Period-Daily",
"beginDatetime": "2019-08-01T08:00:00.000Z",
"timePeriod": "05-min"
},
{
"devTeam": "vikingsalerts",
"bot": "bot-vikingsalerts",
"mode": "live",
"resumeExecution": true,
"type": "Trading",
"exchangeName": "Poloniex",
"process": "Trading-Process",
"beginDatetime": "2019-08-01T08:00:00.000Z",
"timePeriod": "05-min",
"dataSet": "Multi-Period-Daily"
}
]
+5 -5
View File
@@ -14,26 +14,26 @@
{
"devTeam": "AAMasters",
"bot": "AACharly",
"mode": "noTime",
"mode": "oneMonth",
"resumeExecution": true,
"type": "Sensor",
"exchangeName": "Poloniex",
"process": "Hole-Fixing",
"startYear": 2019,
"endYear": 2021,
"month": 1
"endYear": 2019,
"month": 9
},
{
"devTeam": "AAMasters",
"bot": "AABruce",
"mode": "noTime",
"mode": "oneMonth",
"resumeExecution": true,
"type": "Indicator",
"exchangeName": "Poloniex",
"process": "Single-Period-Daily",
"startYear": 2019,
"endYear": 2021,
"month": 1
"month": 9
},
{
"devTeam": "AAMasters",