diff --git a/AAMasters/AAOlivia/Candlestick.js b/AAMasters/AAOlivia/Candlestick.js
deleted file mode 100644
index 1e048889c..000000000
--- a/AAMasters/AAOlivia/Candlestick.js
+++ /dev/null
@@ -1,641 +0,0 @@
-
-function newAAMastersAAOliviaCandlesticks() {
-
- var candles = []; // this changed.
- let timePeriod = INITIAL_TIME_PERIOD;
-
- var plotArea = newPlotArea();
-
- var datetime = INITIAL_DATE;
-
- var candlesticks = {
- onLayerStatusChanged: onLayerStatusChanged,
- currentCandle: undefined,
- positionAtDatetime: positionAtDatetime,
- setTimePeriod: setTimePeriod,
- setDatetime: setDatetime,
- container: undefined,
- draw: draw,
- getContainer: getContainer,
- initialize: initialize
- };
-
- var container = newContainer();
- container.initialize();
- candlesticks.container = container;
-
- container.displacement.containerName = "AAMasters AAOlivia Candlesticks";
- container.zoom.containerName = "AAMasters AAOlivia Candlesticks";
- container.frame.containerName = "AAMasters AAOlivia Candlesticks";
-
- let marketFile;
- let dailyFilesCursor;
-
- let layerStatus = 'off';
-
- let fileCache;
-
- return candlesticks;
-
- function initialize(pExchange, pMarket, pDatetime, pTimePeriod, chartLayersPanel) {
-
- datetime = pDatetime;
- timePeriod = pTimePeriod;
-
- fileCache = newFileCache();
- fileCache.initialize("AAMasters", "AAOlivia", "Candles", "Candlesticks", pExchange, pMarket, pDatetime, onCacheInitialized);
-
- function onCacheInitialized() {
-
- marketFile = fileCache.getMarketFile(pTimePeriod, pDatetime);
-
- recalculateScale();
-
- // From here old code...
-
-
- //recalculateCandlesUsingDailyFiles(true); // We need the first day of candles so as to see which is going to be the center of the viewport.
-
-
- // if (marketId === INITIAL_DEFAULT_MARKET) { // For now, lets position the view port at the market USDT/BTC
-
- // postitionViewPort();
-
- // }
-
- recalculateCandles();
-
- viewPort.eventHandler.listenToEvent("Zoom Changed", onZoomChanged);
- canvas.eventHandler.listenToEvent("Drag Finished", onDragFinished);
-
- layerStatus = chartLayersPanel.getLayerStatus(chartLayersPanel.layerNames.OLIVIA_CANDLES);
- }
- }
-
-
-
- function getContainer(point) {
-
- if (layerStatus !== 'on') { return; }
-
- var container;
-
- /* First we check if this point is inside this space. */
-
- if (this.container.frame.isThisPointHere(point) === true) {
-
- return this.container;
-
- } else {
-
- /* This point does not belong to this space. */
-
- return undefined;
- }
-
- }
-
- function onLayerStatusChanged(eventData) {
-
- if (eventData.layer === 'Olivia Candlesticks') {
- layerStatus = eventData.status;
- }
-
- }
-
- function onZoomChanged(event) {
-
- recalculateCandles();
-
- }
-
- function onDragFinished() {
-
- if (timePeriod <= _1_HOUR_IN_MILISECONDS) {
-
- recalculateCandles();
-
- }
- }
-
-
- function setTimePeriod(pTimePeriod) {
-
- timePeriod = period;
-
- if (timePeriod >= ONE_HOUR_IN_MILISECONDS) {
-
- marketFile = fileCache.getMarketFile(pTimePeriod, datetime);
-
- } else {
-
- dailyFilesCursor = fileCache.getFileCursor(pTimePeriod, datetime);
-
- }
-
- recalculateCandles();
-
- }
-
- function setDatetime(newDatetime) {
-
- datetime = newDatetime;
- recalculateCandles();
- }
-
-
- function postitionViewPort() {
-
- try {
-
- let targetPoint = {
- x: candles[Math.round(candles.length / 2)].begin,
- y: candles[Math.round(candles.length / 2)].min + (candles[Math.round(candles.length / 2)].max - candles[Math.round(candles.length / 2)].min)
- };
-
- targetPoint = plotArea.inverseTransform(targetPoint, candlesticks.container.frame.height);
- targetPoint = transformThisPoint(targetPoint, candlesticks.container);
-
- let displaceVector = {
- x: (viewPort.visibleArea.bottomRight.x - viewPort.visibleArea.topLeft.x) / 2 - targetPoint.x,
- y: (viewPort.visibleArea.bottomLeft.y - viewPort.visibleArea.topLeft.y) / 2 - targetPoint.y
- };
-
- viewPort.displace(displaceVector);
-
- } catch (err) {
-
- // if there data is missing of the days it must position in then an exception is raised.
- }
-
- }
-
-
- function positionAtDatetime(newDatetime) {
-
- value = newDatetime.valueOf();
-
- /* Now we calculate which candle has this new time, because it will give us the y coordinate. */
-
- for (let i = 0; i < candles.length; i++) {
-
- if (value >= candles[i].begin && value <= candles[i].end) {
-
- let targetPoint = {
- x: value,
- y: candles[i].open
- };
-
- targetPoint = plotArea.inverseTransform(targetPoint, candlesticks.container.frame.height);
- targetPoint = transformThisPoint(targetPoint, candlesticks.container);
-
- let targetMax = {
- x: value,
- y: candles[i].max
- };
-
- targetMax = plotArea.inverseTransform(targetMax, candlesticks.container.frame.height);
- targetMax = transformThisPoint(targetMax, candlesticks.container);
-
- let targetMin = {
- x: value,
- y: candles[i].min
- };
-
- targetMin = plotArea.inverseTransform(targetMin, candlesticks.container.frame.height);
- targetMin = transformThisPoint(targetMin, candlesticks.container);
-
- let center = {
- x: (viewPort.visibleArea.bottomRight.x - viewPort.visibleArea.bottomLeft.x) / 2,
- y: (viewPort.visibleArea.bottomRight.y - viewPort.visibleArea.topRight.y) / 2
- };
-
- if (targetMax.y < viewPort.visibleArea.topLeft.y || targetMin.y > viewPort.visibleArea.bottomRight.y) {
-
- let displaceVector = {
- x: 0,
- y: center.y - targetPoint.y
- };
-
- viewPort.displaceTarget(displaceVector);
-
- }
-
- let displaceVector = {
- x: center.x - targetPoint.x,
- y: 0
- };
-
- viewPort.displace(displaceVector);
-
- return;
- }
- }
- }
-
-
-
-
- function draw() {
-
- if (layerStatus !== 'on') { return; }
-
- this.container.frame.draw();
-
- if (timePeriod !== ONE_DAY_IN_MILISECONDS) {
-
- if (Math.random() * 100 > 98) {
- recalculateCandles();
- }
-
-
- }
-
- plotCandleChart();
-
- }
-
-
-
- function recalculateCandles() {
-
- if (layerStatus === 'off') { return; }
-
- if (timePeriod >= ONE_HOUR_IN_MILISECONDS) {
-
- recalculateCandlesUsingMarketFiles();
-
- } else {
-
- recalculateCandlesUsingDailyFiles();
-
- }
-
- candlesticks.container.eventHandler.raiseEvent("Candles Changed", candles);
- }
-
-
-
- function recalculateCandlesUsingDailyFiles(currentDateOnly) {
-
- let daysOnSides = getSideDays(timePeriod);
-
- let leftDate;
- let rightDate;
-
- if (currentDateOnly === true) {
-
- leftDate = new Date(datetime.getTime());
- rightDate = new Date(datetime.getTime());
-
- leftDate = removeTime(datetime);
- rightDate = removeTime(datetime);
-
- } else {
-
- leftDate = getDateFromPoint(viewPort.visibleArea.topLeft, candlesticks.container, plotArea);
- rightDate = getDateFromPoint(viewPort.visibleArea.topRight, candlesticks.container, plotArea);
-
-
-
- leftDate.setDate(leftDate.getDate() - daysOnSides);
- rightDate.setDate(rightDate.getDate() + daysOnSides);
-
- }
-
- let currentDate = new Date(leftDate.getTime());
-
- candles = [];
-
- while (currentDate.getTime() <= rightDate.getTime()) {
-
- let stringDate = currentDate.getFullYear() + '-' + pad(currentDate.getMonth() + 1, 2) + '-' + pad(currentDate.getDate(), 2);
-
- let dailyFile = dailyFilesCursor.dailyFiles.get(stringDate);
-
- if (dailyFile !== undefined) {
-
- const fileTimePeriod = 60 * 1000;
- const totalCandles = dailyFile.length * fileTimePeriod / timePeriod;
- const recordsPerCandle = timePeriod / fileTimePeriod;
-
- for (var i = 0; i < totalCandles; i++) {
-
- var candle = newCandle();
-
- let min = dailyFile[i * recordsPerCandle][0];
- let max = dailyFile[i * recordsPerCandle][1];
-
- for (var j = 0; j < recordsPerCandle; j++) {
-
- if (dailyFile[i * recordsPerCandle + j][0] < min) {
-
- min = dailyFile[i * recordsPerCandle + j][0];
- }
-
- if (dailyFile[i * recordsPerCandle + j][1] > max) {
-
- max = dailyFile[i * recordsPerCandle + j][1];
- }
-
- }
-
- candle.min = min;
- candle.max = max;
-
- candle.open = dailyFile[i * recordsPerCandle][2];
- candle.close = dailyFile[i * recordsPerCandle + recordsPerCandle - 1][3];
-
- candle.begin = dailyFile[i * recordsPerCandle][4];
- candle.end = dailyFile[i * recordsPerCandle + recordsPerCandle - 1][5];
-
- candle.beginId = dailyFile[i * recordsPerCandle][6];
- candle.endId = dailyFile[i * recordsPerCandle + recordsPerCandle - 1][7];
-
- if (candle.open > candle.close) { candle.direction = 'down'; }
- if (candle.open < candle.close) { candle.direction = 'up'; }
- if (candle.open === candle.close) { candle.direction = 'side'; }
-
- candles.push(candle);
-
- if (datetime.valueOf() >= candle.begin && datetime.valueOf() <= candle.end) {
-
- candlesticks.currentCandle = candle;
- candlesticks.container.eventHandler.raiseEvent("Current Candle Changed", candlesticks.currentCandle);
-
- }
- }
-
- }
-
- currentDate.setDate(currentDate.getDate() + 1);
- }
-
- }
-
-
- function recalculateCandlesUsingMarketFiles() {
-
- if (marketFile === undefined) { return;} // Initialization not complete yet.
-
- candles = [];
-
- for (var i = 0; i < marketFile.length; i++) {
-
- var candle = newCandle();
-
- candle.min = marketFile[i][0];
- candle.max = marketFile[i][1];
-
- candle.open = marketFile[i][2];
- candle.close = marketFile[i][3];
-
- candle.begin = (new Date(marketFile[i][4])).valueOf();
- candle.end = (new Date(marketFile[i][5])).valueOf();
-
- if (candle.open > candle.close) { candle.direction = 'down'; }
- if (candle.open < candle.close) { candle.direction = 'up'; }
- if (candle.open === candle.close) { candle.direction = 'side'; }
-
- candles.push(candle);
- }
-
- }
-
-
-
-
- function recalculateScale() {
-
- if (marketFile === undefined) { return; } // Initialization not complete yet.
-
- var minValue = {
- x: EARLIEST_DATE.valueOf(),
- y: 0
- };
-
- var maxValue = {
- x: MAX_PLOTABLE_DATE.valueOf(),
- y: nextPorwerOf10(getMaxRate())
- };
-
-
- plotArea.initialize(
- minValue,
- maxValue,
- candlesticks.container.frame.width,
- candlesticks.container.frame.height
- );
-
- function getMaxRate() {
-
- let maxValue = 0;
-
- for (var i = 0; i < marketIndex.length; i++) {
-
- let currentMax = marketIndex[i][1]; // 1 = rates.
-
- if (maxValue < currentMax) {
- maxValue = currentMax;
- }
- }
-
- return maxValue;
-
- }
-
- }
-
-
-
-
-
-
-
- function plotCandleChart() {
-
- if (candles.length > 0) {
-
- /* Now we calculate and plot the candles */
-
- for (var i = 0; i < candles.length; i++) {
-
- candle = candles[i];
-
- var candlePoint1 = {
- x: candle.begin + timePeriod / 7 * 1.5,
- y: candle.open
- };
-
- var candlePoint2 = {
- x: candle.begin + timePeriod / 7 * 5.5,
- y: candle.open
- };
-
- var candlePoint3 = {
- x: candle.begin + timePeriod / 7 * 5.5,
- y: candle.close
- };
-
- var candlePoint4 = {
- x: candle.begin + timePeriod / 7 * 1.5,
- y: candle.close
- };
-
- candlePoint1 = plotArea.inverseTransform(candlePoint1, candlesticks.container.frame.height);
- candlePoint2 = plotArea.inverseTransform(candlePoint2, candlesticks.container.frame.height);
- candlePoint3 = plotArea.inverseTransform(candlePoint3, candlesticks.container.frame.height);
- candlePoint4 = plotArea.inverseTransform(candlePoint4, candlesticks.container.frame.height);
-
- candlePoint1 = transformThisPoint(candlePoint1, candlesticks.container);
- candlePoint2 = transformThisPoint(candlePoint2, candlesticks.container);
- candlePoint3 = transformThisPoint(candlePoint3, candlesticks.container);
- candlePoint4 = transformThisPoint(candlePoint4, candlesticks.container);
-
- if (candlePoint2.x < viewPort.visibleArea.bottomLeft.x || candlePoint1.x > viewPort.visibleArea.bottomRight.x) {
- continue;
- }
-
- candlePoint1 = viewPort.fitIntoVisibleArea(candlePoint1);
- candlePoint2 = viewPort.fitIntoVisibleArea(candlePoint2);
- candlePoint3 = viewPort.fitIntoVisibleArea(candlePoint3);
- candlePoint4 = viewPort.fitIntoVisibleArea(candlePoint4);
-
- var stickPoint1 = {
- x: candle.begin + timePeriod / 7 * 3.2,
- y: candle.max
- };
-
- var stickPoint2 = {
- x: candle.begin + timePeriod / 7 * 3.8,
- y: candle.max
- };
-
- var stickPoint3 = {
- x: candle.begin + timePeriod / 7 * 3.8,
- y: candle.min
- };
-
- var stickPoint4 = {
- x: candle.begin + timePeriod / 7 * 3.2,
- y: candle.min
- };
-
- stickPoint1 = plotArea.inverseTransform(stickPoint1, candlesticks.container.frame.height);
- stickPoint2 = plotArea.inverseTransform(stickPoint2, candlesticks.container.frame.height);
- stickPoint3 = plotArea.inverseTransform(stickPoint3, candlesticks.container.frame.height);
- stickPoint4 = plotArea.inverseTransform(stickPoint4, candlesticks.container.frame.height);
-
- stickPoint1 = transformThisPoint(stickPoint1, candlesticks.container);
- stickPoint2 = transformThisPoint(stickPoint2, candlesticks.container);
- stickPoint3 = transformThisPoint(stickPoint3, candlesticks.container);
- stickPoint4 = transformThisPoint(stickPoint4, candlesticks.container);
-
- stickPoint1 = viewPort.fitIntoVisibleArea(stickPoint1);
- stickPoint2 = viewPort.fitIntoVisibleArea(stickPoint2);
- stickPoint3 = viewPort.fitIntoVisibleArea(stickPoint3);
- stickPoint4 = viewPort.fitIntoVisibleArea(stickPoint4);
-
- browserCanvasContext.beginPath();
-
- browserCanvasContext.moveTo(stickPoint1.x, stickPoint1.y);
- browserCanvasContext.lineTo(stickPoint2.x, stickPoint2.y);
- browserCanvasContext.lineTo(stickPoint3.x, stickPoint3.y);
- browserCanvasContext.lineTo(stickPoint4.x, stickPoint4.y);
-
- browserCanvasContext.closePath();
- browserCanvasContext.fillStyle = 'rgba(54, 54, 54, 1)';
- browserCanvasContext.fill();
-
- if (datetime !== undefined) {
-
- let dateValue = datetime.valueOf();
-
- if (dateValue >= candle.begin && dateValue <= candle.end) {
-
- browserCanvasContext.strokeStyle = 'rgba(255, 233, 31, 1)'; // Current candle accroding to time
-
- } else {
- browserCanvasContext.strokeStyle = 'rgba(212, 206, 201, 1)';
- }
-
- } else {
- browserCanvasContext.strokeStyle = 'rgba(212, 206, 201, 1)';
- }
-
- browserCanvasContext.lineWidth = 1;
- browserCanvasContext.stroke();
-
- browserCanvasContext.beginPath();
-
- browserCanvasContext.moveTo(candlePoint1.x, candlePoint1.y);
- browserCanvasContext.lineTo(candlePoint2.x, candlePoint2.y);
- browserCanvasContext.lineTo(candlePoint3.x, candlePoint3.y);
- browserCanvasContext.lineTo(candlePoint4.x, candlePoint4.y);
-
- browserCanvasContext.closePath();
-
- if (candle.direction === 'up') { browserCanvasContext.strokeStyle = 'rgba(27, 105, 7, 1)'; }
- if (candle.direction === 'down') { browserCanvasContext.strokeStyle = 'rgba(130, 9, 9, 1)'; }
- if (candle.direction === 'side') { browserCanvasContext.strokeStyle = 'rgba(27, 7, 105, 1)'; }
-
- if (datetime !== undefined) {
-
- let dateValue = datetime.valueOf();
-
- if (dateValue >= candle.begin && dateValue <= candle.end) {
-
- /* highlight the current candle */
-
- browserCanvasContext.fillStyle = 'rgba(255, 233, 31, 1)'; // Current candle accroding to time
-
- let currentCandle = {
- bodyWidth: candlePoint2.x - candlePoint1.x,
- bodyHeight: candlePoint3.y - candlePoint2.y,
- stickHeight: stickPoint4.y - stickPoint2.y,
- stickWidth: stickPoint2.x - stickPoint1.x,
- stickStart: candlePoint2.y - stickPoint2.y,
- period: timePeriod,
- innerCandle: candle
- };
-
- candlesticks.container.eventHandler.raiseEvent("Current Candle Info Changed", currentCandle);
-
- } else {
-
- if (candle.direction === 'up') { browserCanvasContext.fillStyle = 'rgba(64, 217, 26, 1)'; }
- if (candle.direction === 'down') { browserCanvasContext.fillStyle = 'rgba(219, 18, 18, 1)'; }
- if (candle.direction === 'side') { browserCanvasContext.fillStyle = 'rgba(64, 26, 217, 1)'; }
- }
-
- } else {
-
- if (candle.direction === 'up') { browserCanvasContext.fillStyle = 'rgba(64, 217, 26, 1)'; }
- if (candle.direction === 'down') { browserCanvasContext.fillStyle = 'rgba(219, 18, 18, 1)'; }
- if (candle.direction === 'side') { browserCanvasContext.fillStyle = 'rgba(64, 26, 217, 1)'; }
-
- }
-
-
-
- if (
- candlePoint1.x < viewPort.visibleArea.topLeft.x + 50
- ||
- candlePoint1.x > viewPort.visibleArea.bottomRight.x - 50
- ) {
- // we leave this candles without fill.
- } else {
- browserCanvasContext.fill();
- }
-
- browserCanvasContext.lineWidth = 1;
- browserCanvasContext.stroke();
-
-
- }
- }
- }
-
-
-}
-
diff --git a/AAWebPlatform.njsproj b/AAWebPlatform.njsproj
index 4e3ded997..f8c383642 100644
--- a/AAWebPlatform.njsproj
+++ b/AAWebPlatform.njsproj
@@ -72,9 +72,6 @@
Code
-
- Code
-
@@ -105,6 +102,9 @@
+
+ Code
+
@@ -124,9 +124,7 @@
-
-
diff --git a/AAWebPlatform.sln b/AAWebPlatform.sln
index 705d8abc8..9fefc1770 100644
--- a/AAWebPlatform.sln
+++ b/AAWebPlatform.sln
@@ -1,7 +1,7 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
-VisualStudioVersion = 15.0.26730.10
+VisualStudioVersion = 15.0.27130.2027
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9092AA53-FB77-4645-B42D-1CCCA6BD08BD}") = "AAWebPlatform", "AAWebPlatform.njsproj", "{3EF11619-DE26-4B8B-819D-A413DF220B76}"
EndProject
diff --git a/Dashboard.js b/Dashboard.js
index acbd2e08f..6df667f92 100644
--- a/Dashboard.js
+++ b/Dashboard.js
@@ -3,7 +3,8 @@
var canvas;
var markets;
-var ecosystem = newEcosystem();
+let ecosystem = newEcosystem();
+
var viewPort = newViewPort();
diff --git a/Ecosystem.js b/Ecosystem.js
index 1380367b0..355ab03e6 100644
--- a/Ecosystem.js
+++ b/Ecosystem.js
@@ -9,69 +9,11 @@ function newEcosystem() {
getExchange: getExchange,
initialize: initialize
}
- return ecosystem;
-
-
+
const ECOSYSTEM = {
- consortium: {
- organization: {
- name: "AAConsortium",
- type: "Non-For-Profit",
- displayName: "Advanced Algos Consortium",
- location: "Switzerland",
- leader: "Luis Molina",
- logo: "AAConsortium.jpg"
- },
- web: "www.AdvancedAlgos.org",
- github: {
- org: "Advanced Algos",
- repos: {
- repo: {
- name: "AAWebSite",
- description: "AA Consortium Web Site.",
- openIssues: 0,
- openPullRequests: 0,
- contributors: 1
- },
- repo: {
- name: "AAWebPlatform",
- description: "The part of the AA Platform that runs on web browsers.",
- openIssues: 0,
- openPullRequests: 0,
- contributors: 1
- },
- repo: {
- name: "AACloudPlatform",
- description: "The part of the AA Platform that runs on the cloud.",
- openIssues: 0,
- openPullRequests: 0,
- contributors: 1
- }
- }
- },
- members: {
- member: {
- organizationName: "AAMasters",
- type: "devTeam",
- delegate: "Luis Molina",
- votes: 1
- },
- member: {
- organizationName: "AAOrion LLC",
- type: "cloudHosting",
- delegate: "Luis Molina",
- votes: 5
- },
- member: {
- organizationName: "AAExchange Masters",
- type: "exchangeWrapper",
- delegate: "Luis Molina",
- votes: 1
- }
- }
- },
- devTeams: {
- team: {
+ devTeams:
+ {
+ team: [{
codeName: "AAMasters",
organization: {
name: "AAMasters",
@@ -81,609 +23,143 @@ function newEcosystem() {
leader: "Luis Molina",
logo: "AAMasters.jpg"
},
- teamMembers: {
- member: {
- displayName: "Luis Molina",
- githubUsername: "Luis-Fernando-Molina",
- profilePicture: "Luis.jpg",
- tokens: {
- percentDistribution: 100,
- totalCollected: 121.45
- }
- }
- },
- bots: {
- bot: {
- codeName: "AACharly",
- displayName: "Charly",
- type: "Extract",
- version: {
- number: "1.0.0",
- status: "Mantained", // Discontinued
- },
- products: {
- product: {
- codeName: "Trades",
- displayName: "Trades",
- description: "Each file contains trades records of one market at one exchange in a period of time of one minute.",
- storageAccount: "aacharly",
- filePath: "@Exchange/Output/Trades/@Year/@Month/@Date/@Hour/@Minute",
- fileName: "@AssetA_@AssetB.json",
- exchangeList: {
- exchange: {
- name: "Poloniex",
- datetimeRange: {
- minDatetime: "2017-02-19 19:15:00.000 GMT+0000",
- maxDatetime: "2018-02-13 10:10:00.000 GMT+0000"
- }
- }
- },
- layers: {
- layer: {
- codeName: "Trades",
- displayName: "Trades",
- exchangeList: ["Poloniex"],
- validPeriods: ["01-min"],
- plotter: {
- devTeam: "AAMasters",
- repo: "AACharly-Plotter",
- moduleName: "TradeList",
- target: "Timeline"
- }
- }
- }
- }
- },
- processes: {
- process: {
- name: "Poloniex-Live-Trades",
- description: "Retrieves the trades done at the current minute and the previous minute and saves them at the storage account."
- },
- process: {
- name: "Poloniex-Historic-Trades",
- description: "Retrieves and saves the historical trades in batches going backwards from the current time until reaching the begining of the market."
- },
- process: {
- name: "Poloniex-Hole-Fixing",
- description: "Scans the trades saved by the Live Trades and Historic Trades processes searching for missing records. Once a hole is found on the data set, it patches it by retrieving the missing records from the exchange."
- }
- },
- directDependencies: {},
- directDependents: {
- bot: {
- devTeam: "AAMasters",
- codeName: "AABruce"
- },
- bot: {
- devTeam: "AAMasters",
- codeName: "AAOlivia"
- }
- },
- collaboratorsList: [],
- github: {
- org: "AAMasters",
- repos: {
- repo: {
- name: "AACharly-Bot",
- description: "Produces a data-set of all trades of every market in multiple exchanges.",
- openIssues: 0,
- openPullRequests: 0,
- contributors: 1
- },
- repo: {
- name: "AACharly-Plotter",
- description: "Plotters plug-ins to browse trades at the AA Web Platform.",
- openIssues: 0,
- openPullRequests: 0,
- contributors: 1
- }
- }
- },
- storage: {
- sas: '?sv=2017-04-17&ss=f&srt=sco&sp=rc&se=2018-12-31T02:33:36Z&st=2018-02-01T18:33:36Z&spr=https&sig=xFTcopdKq0f60wl2iuukbtIpcLwxZVKzlw5BzpJfo5g%3D',
- fileUri: 'https://' + 'aacharly' + '.file.core.windows.net'
- }
- },
- bot: {
- codeName: "AACarol",
- displayName: "Carol",
- type: "Extract",
- version: {
- number: "1.0.0",
- status: "Mantained", // Discontinued
- },
- products: {
- product: {
- codeName: "Order Book",
- displayName: "Order Book",
- description: "Each file contains the bids and asks positions at each market at a certain moment in time.",
- storageAccount: "aacarol",
- filePath: "@Exchange/Output/Order-Books/@Year/@Month/@Date/@Hour/@Minute",
- fileName: "@AssetA_@AssetB.json",
- exchangeList: {
- exchange: {
- name: "Poloniex",
- datetimeRange: {
- minDatetime: "2017-02-19 19:15:00.000 GMT+0000",
- maxDatetime: "2018-02-13 10:10:00.000 GMT+0000"
- }
- }
- },
- layers: {
- layer: {
- codeName: "Order Book",
- displayName: "Order Book",
- exchangeList: ["Poloniex"],
- validPeriods: ["06-hs", "03-hs", "01-hs", "30-min", "10-min", "05-min", "01-min"],
- plotter: {
- devTeam: "AAMasters",
- repo: "AACarol-Plotter",
- moduleName: "OrderBook",
- target: "Panel"
- }
- }
- }
- },
- product: {
- codeName: "Order Books",
- displayName: "Order Books",
- description: "Each file contains the sumarized bids and asks positions at each market at a certain moment in time. Agreggation makes the dataset optimal for different time periods.",
- storageAccount: "aacarol",
- filePath: "@Exchange/Output/Aggregated-Order-Books/@Period/@Year/@Month/@Date/@Hour/@Minute",
- fileName: "@AssetA_@AssetB.json",
- exchangeList: {
- exchange: {
- name: "Poloniex",
- datetimeRange: {
- minDatetime: "2017-02-19 19:15:00.000 GMT+0000",
- maxDatetime: "2018-02-13 10:10:00.000 GMT+0000"
- }
- }
- },
- layers: {
- layer: {
- codeName: "Order Books",
- displayName: "Order Books",
- exchangeList: ["Poloniex"],
- validPeriods: ["06-hs", "03-hs", "01-hs", "30-min", "10-min", "05-min", "01-min"],
- plotter: {
- devTeam: "AAMasters",
- repo: "AACarol-Plotter",
- moduleName: "OrderBooks",
- target: "Timeline"
- }
- }
- }
- }
- },
- processes: {
- process: {
- name: "Poloniex-Order-Books",
- description: "Retrieves the order books at the current minute and saves them at the storage account."
- },
- process: {
- name: "Aggregated-Order-Books",
- description: "Aggregates the order books information to be viewed at different time periods."
- },
- },
- directDependencies: {},
- directDependents: {},
- collaboratorsList: [],
- github: {
- org: "AAMasters",
- repos: {
- repo: {
- name: "AACarol",
- description: "Produces a data-set with a snapshot of all markets order books every minute.",
- openIssues: 0,
- openPullRequests: 0,
- contributors: 1
- }
- }
- },
- storage: {
- sas: '?sv=2017-04-17&ss=f&srt=sco&sp=r&se=2018-12-01T00:09:44Z&st=2017-12-01T13:09:44Z&spr=https,http&sig=J60UlQuUqh9Hd1Pm0PqIF6yari3D3TkGEz1fSNQJWks%3D',
- fileUri: 'https://' + 'aadata' + '.file.core.windows.net'
- }
- },
- bot: {
- codeName: "AABruce",
- displayName: "Bruce",
- type: "Indicator",
- version: {
- number: "1.0.0",
- status: "Mantained", // Discontinued
- },
- products: {
- product: {
- codeName: "Candles",
- displayName: "One Minute Candles in Daily Files",
- description: "Each file contains the candles of one whole day on a one minute time period.",
- storageAccount: "aabruce",
- filePath: "@Exchange/Output/Candles/One-Min/@Year/@Month/@Date",
- fileName: "@AssetA_@AssetB.json",
- exchangeList: {
- exchange: {
- name: "Poloniex",
- datetimeRange: {
- minDatetime: "2017-02-19 19:15:00.000 GMT+0000",
- maxDatetime: "2018-02-13 10:10:00.000 GMT+0000"
- }
- }
- },
- layers: {
- layer: {
- codeName: "Candles",
- displayName: "Candlesticks",
- exchangeList: ["Poloniex"],
- validPeriods: ["30-min", "10-min", "05-min", "01-min"],
- plotter: {
- devTeam: "AAMasters",
- repo: "AABruce-Plotter",
- moduleName: "Candlesticks",
- target: "Timeline",
- dependencies: {
- dependency: {
- devTeam: "AAMasters",
- repo: "Plotters-Utilities",
- moduleName: "Candlesticks"
- }
- }
- }
- }
- }
- },
- product: {
- codeName: "Volumes",
- displayName: "One Minute Volumes in Daily Files",
- description: "Each file contains the volumes of one whole day on a one minute time period.",
- storageAccount: "aabruce",
- filePath: "@Exchange/Output/Volumes/One-Min/@Year/@Month/@Date",
- fileName: "@AssetA_@AssetB.json",
- exchangeList: {
- exchange: {
- name: "Poloniex",
- datetimeRange: {
- minDatetime: "2017-02-19 19:15:00.000 GMT+0000",
- maxDatetime: "2018-02-13 10:10:00.000 GMT+0000"
- }
- }
- },
- layers: {
- layer: {
- codeName: "Volumes",
- displayName: "Sell and Buy Volumes",
- exchangeList: ["Poloniex"],
- validPeriods: ["06-hs", "03-hs", "01-hs", "30-min", "10-min", "05-min", "01-min"],
- plotter: {
- devTeam: "AAMasters",
- repo: "AABruce-Plotter",
- moduleName: "Volumes",
- target: "Timeline",
- dependencies: {
- dependency: {
- devTeam: "AAMasters",
- repo: "Plotters-Utilities",
- moduleName: "Volumes"
- }
- }
- }
- }
- }
- }
- },
- processes: {
- process: {
- name: "One-Min-Daily-Candles-Volumes",
- description: "Read trades files and generates one minute candles and volumes files for each day."
- }
- },
- directDependencies: {},
- directDependents: {},
- collaboratorsList: [],
- github: {
- org: "AAMasters",
- repos: {
- repo: {
- name: "AABruce",
- description: "Produces two data-sets with candles and volumes for all markets at all exchanges.",
- openIssues: 0,
- openPullRequests: 0,
- contributors: 1
- }
- }
- },
- storage: {
- sas: '?sv=2017-04-17&ss=f&srt=sco&sp=r&se=2018-12-31T02:32:04Z&st=2018-02-01T18:32:04Z&spr=https&sig=SbZI6bvAE1MBxna2NOvfgMroPFZNjAyaHUsAPvh11hg%3D',
- fileUri: 'https://' + 'aabruce' + '.file.core.windows.net'
- }
- },
- bot: {
- codeName: "AAOlivia",
- displayName: "Olivia",
- type: "Indicator",
- version: {
- number: "1.0.0",
- status: "Mantained", // Discontinued
- },
- products: {
- product: {
- codeName: "Candles",
- displayName: "Market Candles per Period",
- description: "A set of files per period that contains all candles of one whole market.",
- storageAccount: "aaolivia",
- filePath: "@Exchange/Output/Candles/Multi-Period-Market/@Period",
- fileName: "@AssetA_@AssetB.json",
- exchangeList: {
- exchange: {
- name: "Poloniex",
- datetimeRange: {
- minDatetime: "2017-02-19 19:15:00.000 GMT+0000",
- maxDatetime: "2018-02-13 10:10:00.000 GMT+0000"
- }
- }
- },
- layers: {
- layer: {
- codeName: "Candlesticks",
- displayName: "Candlesticks",
- exchangeList: ["Poloniex"],
- validPeriods: ["24-hs", "12-hs", "06-hs", "03-hs", "01-hs"],
- plotter: {
- devTeam: "AAMasters",
- repo: "AAOlivia-Plotter",
- moduleName: "Candlesticks",
- target: "Timeline",
- dependencies: {
- dependency: {
- devTeam: "AAMasters",
- repo: "Plotters-Utilities",
- moduleName: "Candlesticks"
- }
- }
- }
- }
- }
- },
- product: {
- codeName: "Volumes",
- displayName: "Market Volumes per Period",
- description: "A set of files per period that contains all volumes of one whole market.",
- storageAccount: "aaolivia",
- filePath: "@Exchange/Output/Candles/Multi-Period-Market/@Period",
- fileName: "@AssetA_@AssetB.json",
- exchangeList: {
- exchange: {
- name: "Poloniex",
- datetimeRange: {
- minDatetime: "2017-02-19 19:15:00.000 GMT+0000",
- maxDatetime: "2018-02-13 10:10:00.000 GMT+0000"
- }
- }
- },
- layers: {
- layer: {
- codeName: "Volumes",
- displayName: "Volumes",
- exchangeList: ["Poloniex"],
- validPeriods: ["24-hs", "12-hs", "06-hs", "03-hs", "01-hs"],
- plotter: {
- devTeam: "AAMasters",
- repo: "AAOlivia-Plotter",
- moduleName: "Volumes",
- target: "Timeline",
- dependencies: {
- dependency: {
- devTeam: "AAMasters",
- repo: "Plotters-Utilities",
- moduleName: "Volumes"
- }
- }
- }
- }
- }
- }
- },
- processes: {
- process: {
- name: "One-Min-Daily-Candles-Volumes",
- description: "Read trades files and generates one minute candles and volumes files for each day."
- }
- },
- directDependencies: {},
- directDependents: {},
- collaboratorsList: [],
- github: {
- org: "AAMasters",
- repos: {
- repo: {
- name: "AABruce",
- description: "Produces two data-sets with candles and volumes for all markets at all exchanges.",
- openIssues: 0,
- openPullRequests: 0,
- contributors: 1
- }
- }
- },
- storage: {
- sas: '?sv=2017-04-17&ss=f&srt=sco&sp=rl&se=2018-12-31T02:34:32Z&st=2018-02-01T18:34:32Z&spr=https,http&sig=24UJjGDVpPrHjhBoZtt3iKj4sxgenfSV4VTJD2v0q1U%3D',
- fileUri: 'https://' + 'aaolivia' + '.file.core.windows.net'
- }
- }
- }
- }
- },
- clouds: {
- cloudHosting: {
- codeName: "AAOrion",
- organization: {
- name: "AAOrion LLC",
- type: "Company",
- displayName: "Orion",
- location: "USA",
- leader: "Luis Molina",
- logo: "AAOrion.jpg"
- },
- github: {
- org: "AAOrion",
- repos: {
- repo: {
- name: "AzureAAHosting",
- description: "AA Azure Hosting Web Site",
- openIssues: 0,
- openPullRequests: 0,
- contributors: 1
- }
- }
- },
- underlayingCloud: "Azure",
- botsRunning: {
- bot: {
- devTeam: "AAMasters",
- codeName: "AACharly",
- version: "1.0.0",
- status: "Alive",
- stats: {
+ teamMembers:
+
+ [{
+ member: {
+ displayName: "Luis Molina",
+ githubUsername: "Luis-Fernando-Molina",
+ profilePicture: "Luis.jpg",
tokens: {
- totalCollected: 532.2442,
- totalSpent: 323.455,
- currentBalance: 142,
- expensesPerHour: 1.44,
- maxBalance: 177,
- minBalance: 22.44
+ percentDistribution: 100,
+ totalCollected: 121.45
+ }
+ }
+ }]
+ ,
+ bots:
+ {
+ bot: [
+ {
+ codeName: "AAOlivia",
+ displayName: "Olivia",
+ type: "Indicator",
+ version: {
+ number: "1.0.0",
+ status: "Mantained", // Discontinued
},
- life: {
- born: "2015-02-19 19:15:00.000 GMT+0000",
- died: undefined,
- expectedToRetire: "2019-02-19 19:15:00.000 GMT+0000",
- expectedToDie: "2019-03-19 19:15:00.000 GMT+0000"
- }
- }
- },
- bot: {
- devTeam: "AAMasters",
- codeName: "AACarol",
- version: "1.0.0",
- status: "Alive",
- stats: {
- tokens: {
- totalCollected: 532.2442,
- totalSpent: 323.455,
- currentBalance: 142,
- expensesPerHour: 1.44,
- maxBalance: 177,
- minBalance: 22.44
+ products: {
+ product: [{
+ codeName: "Candles",
+ displayName: "Market Candles per Period",
+ description: "A set of files per period that contains all candles of one whole market.",
+ storageAccount: "aaolivia",
+ filePath: "@Exchange/Output/Candles/Multi-Period-Market/@Period",
+ fileName: "@AssetA_@AssetB.json",
+ exchangeList: {
+ exchange: [{
+ name: "Poloniex",
+ datetimeRange: {
+ minDatetime: "2017-02-19 19:15:00.000 GMT+0000",
+ maxDatetime: "2018-02-13 10:10:00.000 GMT+0000"
+ }
+ }]
+ },
+ layers: {
+ layer: [{
+ codeName: "Candlesticks",
+ displayName: "Candlesticks",
+ exchangeList: ["Poloniex"],
+ validPeriods: ["24-hs", "12-hs", "06-hs", "03-hs", "01-hs"],
+ plotter: {
+ devTeam: "AAMasters",
+ repo: "AAOlivia-Plotter",
+ moduleName: "Candlesticks",
+ target: "Timeline",
+ dependencies: {
+ dependency: {
+ devTeam: "AAMasters",
+ repo: "Plotters-Utilities",
+ moduleName: "Candlesticks"
+ }
+ }
+ }
+ }]
+ }
+ }, {
+ codeName: "Volumes",
+ displayName: "Market Volumes per Period",
+ description: "A set of files per period that contains all volumes of one whole market.",
+ storageAccount: "aaolivia",
+ filePath: "@Exchange/Output/Candles/Multi-Period-Market/@Period",
+ fileName: "@AssetA_@AssetB.json",
+ exchangeList: {
+ exchange: [{
+ name: "Poloniex",
+ datetimeRange: {
+ minDatetime: "2017-02-19 19:15:00.000 GMT+0000",
+ maxDatetime: "2018-02-13 10:10:00.000 GMT+0000"
+ }
+ }]
+ },
+ layers: {
+ layer: [{
+ codeName: "Volumes",
+ displayName: "Volumes",
+ exchangeList: ["Poloniex"],
+ validPeriods: ["24-hs", "12-hs", "06-hs", "03-hs", "01-hs"],
+ plotter: {
+ devTeam: "AAMasters",
+ repo: "AAOlivia-Plotter",
+ moduleName: "Volumes",
+ target: "Timeline",
+ dependencies: {
+ dependency: {
+ devTeam: "AAMasters",
+ repo: "Plotters-Utilities",
+ moduleName: "Volumes"
+ }
+ }
+ }
+ }]
+ }
+ }]
},
- life: {
- born: "2015-02-19 19:15:00.000 GMT+0000",
- died: undefined,
- expectedToRetire: "2019-02-19 19:15:00.000 GMT+0000",
- expectedToDie: "2019-03-19 19:15:00.000 GMT+0000"
- }
- }
- }
- },
- stats: {
- extractionBots: 2,
- indicatorsBots: 24,
- tradingBots: 12,
- suscribers: 230,
- apps: 1
- }
- }
- },
- exchanges: {
- exchangeWrapper: {
- codeName: "AAExchange-Masters",
- organization: {
- name: "AAExchange Masters",
- type: "Open Source Project",
- displayName: "Exchange Masters",
- location: "Global",
- leader: "Luis Molina",
- logo: "AAExchange-Masters.jpg"
- },
- exchangesServed: {
- exchange: {
- name: "Poloniex",
- github: {
- org: "AAExchange Masters",
- repo: {
- name: "AAPoloniexWrapper",
- description: "Wrapps Poloniex Exchange to be acceced from within the Advanced Algos Ecosystem.",
- openIssues: 0,
- openPullRequests: 0,
- contributors: 1
- }
- }
- },
- exchange: {
- name: "Binance",
- github: {
- org: "AAExchange Masters",
- repo: {
- name: "AABinanceWrapper",
- description: "Wrapps Binance Exchange to be acceced from within the Advanced Algos Ecosystem.",
- openIssues: 0,
- openPullRequests: 0,
- contributors: 1
- }
- }
- }
- }
- }
- },
- apps: {
- app: {
- organization: {
- name: "AAApps Masters",
- type: "Open Source Project",
- displayName: "Global Ranking",
- location: "Global",
- leader: "Luis Molina",
- logo: "AAApps-Masters.jpg"
- },
- github: {
- org: "AAApps Masters",
- repo: {
- name: "AAGlobalRanking",
- description: "Global Ranking Web Site",
- openIssues: 0,
- openPullRequests: 0,
- contributors: 1
- }
- },
- web: "www.AAGlobalRanking.org",
- tradingBots: {
- bot: {
- devTeam: "AAMasters",
- codeName: "AAMichael",
- version: "1.0.0",
- cloudHosting: "AAOrion",
- suscribers: {
- subscriber: {
- userName: "Trader 007",
- subscription: {
- type: "Trade-For-Me",
- tokensPaid: 20,
- expirationDatetime: "2019-03-19 19:15:00.000 GMT+0000"
+ processes:
+ {
+ process: [{
+ name: "One-Min-Daily-Candles-Volumes",
+ description: "Read trades files and generates one minute candles and volumes files for each day."
+ }]
+ },
+ directDependencies: [],
+ directDependents: [],
+ collaboratorsList: [],
+ github: {
+ org: "AAMasters",
+ repos: {
+ repo: [{
+ name: "AABruce",
+ description: "Produces two data-sets with candles and volumes for all markets at all exchanges.",
+ openIssues: 0,
+ openPullRequests: 0,
+ contributors: 1
+ }]
}
},
- subscriber: {
- userName: "EliasYofre1",
- subscription: {
- type: "Buy-Sell-Signals",
- tokensPaid: 1,
- expirationDatetime: "2019-03-19 19:15:00.000 GMT+0000"
- }
+ storage: {
+ sas: '?sv=2017-04-17&ss=f&srt=sco&sp=rl&se=2018-12-31T02:34:32Z&st=2018-02-01T18:34:32Z&spr=https,http&sig=24UJjGDVpPrHjhBoZtt3iKj4sxgenfSV4VTJD2v0q1U%3D',
+ fileUri: 'https://' + 'aaolivia' + '.file.core.windows.net'
}
}
- }
+ ]
}
- }
+ }]
}
};
+ return ecosystem;
+
function initialize() {
@@ -693,55 +169,55 @@ function newEcosystem() {
function getTeam(pTeamCodeName) {
- for (var team in ECOSYSTEM.devTeams) {
+ for (let i = 0; i < ECOSYSTEM.devTeams.team.length; i++) {
- if (team.codeName === pTeamCodeName) {
+ if (ECOSYSTEM.devTeams.team[i].codeName === pTeamCodeName) {
- return team;
+ return ECOSYSTEM.devTeams.team[i];
}
}
}
function getBot(pTeam, pBotCodeName) {
- for (var bot in pTeam.bots) {
+ for (let i = 0; i < pTeam.bots.bot.length; i++) {
- if (bot.codeName === pBotCodeName) {
+ if (pTeam.bots.bot[i].codeName === pBotCodeName) {
- return bot;
+ return pTeam.bots.bot[i];
}
}
}
function getProduct(pBot, pProductCodeName) {
- for (var product in pBot.products) {
+ for (let i = 0; i < pBot.products.product.length; i++) {
- if (bot.codeName === pProductCodeName) {
+ if (pBot.products.product[i].codeName === pProductCodeName) {
- return product;
+ return pBot.products.product[i];
}
}
}
function getLayer(pProduct, pLayerCodeName) {
- for (var layer in pProduct.layers) {
+ for (let i = 0; i < pProduct.layers.layer.length; i++) {
- if (layer.codeName === pLayerCodeName) {
+ if (pProduct.layers.layer[i].codeName === pLayerCodeName) {
- return layer;
+ return pProduct.layers.layer[i];
}
}
}
function getExchange(pProduct, pName) {
- for (var exchange in pProduct.exchangeList) {
+ for (let i = 0; i < pProduct.exchangeList.exchange.length; i++) {
- if (exchange.name === pName) {
+ if (pProduct.exchangeList.exchange[i].name === pName) {
- return exchange;
+ return pProduct.exchangeList.exchange[i];
}
}
}
diff --git a/FileCache.js b/FileCache.js
index f1878004b..e6267e162 100644
--- a/FileCache.js
+++ b/FileCache.js
@@ -12,6 +12,8 @@ function newFileCache() {
'[' + 2 * 60 * 60 * 1000 + ',' + '"02-hs"' + ']' + ',' +
'[' + 1 * 60 * 60 * 1000 + ',' + '"01-hs"' + ']' + ']';
+ marketFilesPeriods = JSON.parse(marketFilesPeriods);
+
let dailyFilePeriods =
'[' +
'[' + 45 * 60 * 1000 + ',' + '"45-min"' + ']' + ',' +
@@ -26,6 +28,8 @@ function newFileCache() {
'[' + 02 * 60 * 1000 + ',' + '"02-min"' + ']' + ',' +
'[' + 01 * 60 * 1000 + ',' + '"01-min"' + ']' + ']';
+ dailyFilePeriods = JSON.parse(dailyFilePeriods);
+
let fileCache = {
getMarketFile: getMarketFile,
getFileCursor: getFileCursor,
@@ -44,24 +48,24 @@ function newFileCache() {
if (product === undefined) {
- throw "Product not found at this bot of the ecosystem! - pTeamCodeName = " + pTeamCodeName + " pBotCodeName = " + pBotCodeName + " pProductCodeName = " + pProductCodeName;
- return;
+ throw "Product not found at this bot of the ecosystem! - pTeamCodeName = " + pTeamCodeName + ", pBotCodeName = " + pBotCodeName + ", pProductCodeName = " + pProductCodeName;
+
}
- let exchange = ecosystem.getExchange(product, name);
+ let exchange = ecosystem.getExchange(product, pExchange);
if (exchange === undefined) {
- throw "Exchange not supoorted by this product of the ecosystem! - pTeamCodeName = " + pTeamCodeName + " pBotCodeName = " + pBotCodeName + " pProductCodeName = " + pProductCodeName + " pExchange = " + pExchange;
- return;
+ throw "Exchange not supoorted by this product of the ecosystem! - pTeamCodeName = " + pTeamCodeName + ", pBotCodeName = " + pBotCodeName + ", pProductCodeName = " + pProductCodeName + ", pExchange = " + pExchange;
+
}
let layer = ecosystem.getLayer(product, pLayerCodeName);
if (layer === undefined) {
- throw "Layer not found at this product of the ecosystem! - pTeamCodeName = " + pTeamCodeName + " pBotCodeName = " + pBotCodeName + " pProductCodeName = " + pProductCodeName + " pLayerCodeName = " + pLayerCodeName;
- return;
+ throw "Layer not found at this product of the ecosystem! - pTeamCodeName = " + pTeamCodeName + ", pBotCodeName = " + pBotCodeName + ", pProductCodeName = " + pProductCodeName + ", pLayerCodeName = " + pLayerCodeName;
+
}
fileCloud = newFileCloud();
@@ -69,7 +73,7 @@ function newFileCache() {
let filesReceived = 0;
- for (i = 0; i < marketFilesPeriods; i++) {
+ for (i = 0; i < marketFilesPeriods.length; i++) {
let periodTime = marketFilesPeriods[i][0];
let periodName = marketFilesPeriods[i][1];
@@ -84,7 +88,7 @@ function newFileCache() {
filesReceived++;
- if (filesReceived === layer.validPeriods.lenght + 1) {
+ if (filesReceived === layer.validPeriods.length + 1) {
callBackFunction();
diff --git a/FileCloud.js b/FileCloud.js
index 20424c1ac..cae04e5af 100644
--- a/FileCloud.js
+++ b/FileCloud.js
@@ -23,11 +23,11 @@ function newFileCloud() {
let fileName = pProduct.fileName;
let filePath = pProduct.filePath;
- fileName.replace("@AssetA", pMarket.assetA);
- fileName.replace("@AssetB", pMarket.assetB);
+ fileName = fileName.replace("@AssetA", pMarket.assetA);
+ fileName = fileName.replace("@AssetB", pMarket.assetB);
- filePath.replace("@Exchange", pExchange.name);
- filePath.replace("@Period", pPeriodName);
+ filePath = filePath.replace("@Exchange", pExchange.name);
+ filePath = filePath.replace("@Period", pPeriodName);
fileService.getFileToText('data', filePath, fileName, undefined, onFileReceived);
diff --git a/TempExosystem.js b/TempExosystem.js
new file mode 100644
index 000000000..53d0ba6a0
--- /dev/null
+++ b/TempExosystem.js
@@ -0,0 +1,322 @@
+{
+ codeName: "AACharly",
+ displayName: "Charly",
+ type: "Extract",
+ version: {
+ number: "1.0.0",
+ status: "Mantained", // Discontinued
+ },
+ products: [{
+
+ product: {
+ codeName: "Trades",
+ displayName: "Trades",
+ description: "Each file contains trades records of one market at one exchange in a period of time of one minute.",
+ storageAccount: "aacharly",
+ filePath: "@Exchange/Output/Trades/@Year/@Month/@Date/@Hour/@Minute",
+ fileName: "@AssetA_@AssetB.json",
+ exchangeList: [{
+ exchange: {
+ name: "Poloniex",
+ datetimeRange: {
+ minDatetime: "2017-02-19 19:15:00.000 GMT+0000",
+ maxDatetime: "2018-02-13 10:10:00.000 GMT+0000"
+ }
+ }
+ }]
+ ,
+ layers: [{
+ layer: {
+ codeName: "Trades",
+ displayName: "Trades",
+ exchangeList: ["Poloniex"],
+ validPeriods: ["01-min"],
+ plotter: {
+ devTeam: "AAMasters",
+ repo: "AACharly-Plotter",
+ moduleName: "TradeList",
+ target: "Timeline"
+ }
+ }
+ }]
+ }
+ }]
+ ,
+ processes:
+ [{
+ process: {
+ name: "Poloniex-Live-Trades",
+ description: "Retrieves the trades done at the current minute and the previous minute and saves them at the storage account."
+ }
+ }, {
+ process: {
+ name: "Poloniex-Historic-Trades",
+ description: "Retrieves and saves the historical trades in batches going backwards from the current time until reaching the begining of the market."
+ }
+ }, {
+ process: {
+ name: "Poloniex-Hole-Fixing",
+ description: "Scans the trades saved by the Live Trades and Historic Trades processes searching for missing records. Once a hole is found on the data set, it patches it by retrieving the missing records from the exchange."
+ }
+ }]
+ ,
+ directDependencies: { },
+ directDependents: [{
+ bot: {
+ devTeam: "AAMasters",
+ codeName: "AABruce"
+ }
+ }, {
+ bot: {
+ devTeam: "AAMasters",
+ codeName: "AAOlivia"
+ }
+ }]
+ ,
+ collaboratorsList: [],
+ github: {
+ org: "AAMasters",
+ repos: [{
+ repo: {
+ name: "AACharly-Bot",
+ description: "Produces a data-set of all trades of every market in multiple exchanges.",
+ openIssues: 0,
+ openPullRequests: 0,
+ contributors: 1
+ }
+ }, {
+ repo: {
+ name: "AACharly-Plotter",
+ description: "Plotters plug-ins to browse trades at the AA Web Platform.",
+ openIssues: 0,
+ openPullRequests: 0,
+ contributors: 1
+ }
+ }]
+ },
+ storage: {
+ sas: '?sv=2017-04-17&ss=f&srt=sco&sp=rc&se=2018-12-31T02:33:36Z&st=2018-02-01T18:33:36Z&spr=https&sig=xFTcopdKq0f60wl2iuukbtIpcLwxZVKzlw5BzpJfo5g%3D',
+ fileUri: 'https://' + 'aacharly' + '.file.core.windows.net'
+ }
+},
+{
+ codeName: "AACarol",
+ displayName: "Carol",
+ type: "Extract",
+ version: {
+ number: "1.0.0",
+ status: "Mantained", // Discontinued
+ },
+ products: [
+ {
+ product: {
+ codeName: "Order Book",
+ displayName: "Order Book",
+ description: "Each file contains the bids and asks positions at each market at a certain moment in time.",
+ storageAccount: "aacarol",
+ filePath: "@Exchange/Output/Order-Books/@Year/@Month/@Date/@Hour/@Minute",
+ fileName: "@AssetA_@AssetB.json",
+ exchangeList: [{
+ exchange: {
+ name: "Poloniex",
+ datetimeRange: {
+ minDatetime: "2017-02-19 19:15:00.000 GMT+0000",
+ maxDatetime: "2018-02-13 10:10:00.000 GMT+0000"
+ }
+ }
+ }],
+ layers: {
+ layer: {
+ codeName: "Order Book",
+ displayName: "Order Book",
+ exchangeList: ["Poloniex"],
+ validPeriods: ["06-hs", "03-hs", "01-hs", "30-min", "10-min", "05-min", "01-min"],
+ plotter: {
+ devTeam: "AAMasters",
+ repo: "AACarol-Plotter",
+ moduleName: "OrderBook",
+ target: "Panel"
+ }
+ }
+ }
+ }
+ },
+ {
+ product: {
+ codeName: "Order Books",
+ displayName: "Order Books",
+ description: "Each file contains the sumarized bids and asks positions at each market at a certain moment in time. Agreggation makes the dataset optimal for different time periods.",
+ storageAccount: "aacarol",
+ filePath: "@Exchange/Output/Aggregated-Order-Books/@Period/@Year/@Month/@Date/@Hour/@Minute",
+ fileName: "@AssetA_@AssetB.json",
+ exchangeList: [{
+ exchange: {
+ name: "Poloniex",
+ datetimeRange: {
+ minDatetime: "2017-02-19 19:15:00.000 GMT+0000",
+ maxDatetime: "2018-02-13 10:10:00.000 GMT+0000"
+ }
+ }
+ }],
+ layers: {
+ layer: {
+ codeName: "Order Books",
+ displayName: "Order Books",
+ exchangeList: ["Poloniex"],
+ validPeriods: ["06-hs", "03-hs", "01-hs", "30-min", "10-min", "05-min", "01-min"],
+ plotter: {
+ devTeam: "AAMasters",
+ repo: "AACarol-Plotter",
+ moduleName: "OrderBooks",
+ target: "Timeline"
+ }
+ }
+ }
+ }
+ }
+ ],
+ processes: [{
+ process: {
+ name: "Poloniex-Order-Books",
+ description: "Retrieves the order books at the current minute and saves them at the storage account."
+ }
+ }, {
+ process: {
+ name: "Aggregated-Order-Books",
+ description: "Aggregates the order books information to be viewed at different time periods."
+ }
+ }
+ ],
+ directDependencies: [],
+ directDependents: [],
+ collaboratorsList: [],
+ github: {
+ org: "AAMasters",
+ repos: [{
+ repo: {
+ name: "AACarol",
+ description: "Produces a data-set with a snapshot of all markets order books every minute.",
+ openIssues: 0,
+ openPullRequests: 0,
+ contributors: 1
+ }
+ }
+ ]
+ },
+ storage: {
+ sas: '?sv=2017-04-17&ss=f&srt=sco&sp=r&se=2018-12-01T00:09:44Z&st=2017-12-01T13:09:44Z&spr=https,http&sig=J60UlQuUqh9Hd1Pm0PqIF6yari3D3TkGEz1fSNQJWks%3D',
+ fileUri: 'https://' + 'aadata' + '.file.core.windows.net'
+ }
+}
+{
+ codeName: "AABruce",
+ displayName: "Bruce",
+ type: "Indicator",
+ version: {
+ number: "1.0.0",
+ status: "Mantained", // Discontinued
+ },
+ products: {
+ product: [{
+ codeName: "Candles",
+ displayName: "One Minute Candles in Daily Files",
+ description: "Each file contains the candles of one whole day on a one minute time period.",
+ storageAccount: "aabruce",
+ filePath: "@Exchange/Output/Candles/One-Min/@Year/@Month/@Date",
+ fileName: "@AssetA_@AssetB.json",
+ exchangeList: [{
+ exchange: {
+ name: "Poloniex",
+ datetimeRange: {
+ minDatetime: "2017-02-19 19:15:00.000 GMT+0000",
+ maxDatetime: "2018-02-13 10:10:00.000 GMT+0000"
+ }
+ }
+ }],
+ layers: {
+ layer: {
+ codeName: "Candles",
+ displayName: "Candlesticks",
+ exchangeList: ["Poloniex"],
+ validPeriods: ["30-min", "10-min", "05-min", "01-min"],
+ plotter: {
+ devTeam: "AAMasters",
+ repo: "AABruce-Plotter",
+ moduleName: "Candlesticks",
+ target: "Timeline",
+ dependencies: {
+ dependency: {
+ devTeam: "AAMasters",
+ repo: "Plotters-Utilities",
+ moduleName: "Candlesticks"
+ }
+ }
+ }
+ }
+ }
+ }, {
+ codeName: "Volumes",
+ displayName: "One Minute Volumes in Daily Files",
+ description: "Each file contains the volumes of one whole day on a one minute time period.",
+ storageAccount: "aabruce",
+ filePath: "@Exchange/Output/Volumes/One-Min/@Year/@Month/@Date",
+ fileName: "@AssetA_@AssetB.json",
+ exchangeList: [{
+ exchange: {
+ name: "Poloniex",
+ datetimeRange: {
+ minDatetime: "2017-02-19 19:15:00.000 GMT+0000",
+ maxDatetime: "2018-02-13 10:10:00.000 GMT+0000"
+ }
+ }
+ }],
+ layers: {
+ layer: {
+ codeName: "Volumes",
+ displayName: "Sell and Buy Volumes",
+ exchangeList: ["Poloniex"],
+ validPeriods: ["06-hs", "03-hs", "01-hs", "30-min", "10-min", "05-min", "01-min"],
+ plotter: {
+ devTeam: "AAMasters",
+ repo: "AABruce-Plotter",
+ moduleName: "Volumes",
+ target: "Timeline",
+ dependencies: {
+ dependency: {
+ devTeam: "AAMasters",
+ repo: "Plotters-Utilities",
+ moduleName: "Volumes"
+ }
+ }
+ }
+ }
+ }
+ }
+ ]
+ ,
+ processes:
+ {
+ process: [{
+ name: "One-Min-Daily-Candles-Volumes",
+ description: "Read trades files and generates one minute candles and volumes files for each day."
+ }]
+ },
+ directDependencies: [],
+ directDependents: [],
+ collaboratorsList: [],
+ github: {
+ org: "AAMasters",
+ repos: {
+ repo: [{
+ name: "AABruce",
+ description: "Produces two data-sets with candles and volumes for all markets at all exchanges.",
+ openIssues: 0,
+ openPullRequests: 0,
+ contributors: 1
+ }]
+ }
+ },
+ storage: {
+ sas: '?sv=2017-04-17&ss=f&srt=sco&sp=r&se=2018-12-31T02:32:04Z&st=2018-02-01T18:32:04Z&spr=https&sig=SbZI6bvAE1MBxna2NOvfgMroPFZNjAyaHUsAPvh11hg%3D',
+ fileUri: 'https://' + 'aabruce' + '.file.core.windows.net'
+ }
\ No newline at end of file
diff --git a/server.js b/server.js
index 40b957a2c..b7d5531a3 100644
--- a/server.js
+++ b/server.js
@@ -8,12 +8,12 @@ const octokit = require('@octokit/rest')()
global.atob = require("atob");
let owner = "AAMasters";
-let repo = "AABruce-Bot";
+let repo = "AABruce-Indicator-Bot";
let branch = "master";
let page = 1;
let per_page = 100;
let ref = "master";
-let path = "One-Min-Daily-Candles-Volumes/run.js";
+let path = "One-Min-Daily-Candles-Volumes/Interval.js";
octokit.repos.getContent({ owner, repo, path, ref }, onContent);
@@ -21,14 +21,17 @@ function onContent (error, result) {
let decoded = atob(result.data.content);
- console.log(decoded);
+ console.log(decoded.substring(3));
console.log(result);
}
+return;
*/
+
+
//'use strict';
var http = require('http');
var port = process.env.PORT || 1337;
@@ -43,6 +46,36 @@ function onRequestReceivedFromBrowser(request, response) {
switch (requestParameters[1]) {
+ case "AAMasters":
+ {
+
+ const octokit = require('@octokit/rest')()
+ global.atob = require("atob");
+
+ let owner = "AAMasters";
+ let repo = "AAOlivia-Plotter";
+ let branch = "master";
+ let page = 1;
+ let per_page = 100;
+ let ref = "master";
+ let path = "Candlestick.js";
+
+ octokit.repos.getContent({ owner, repo, path, ref }, onContent);
+
+ function onContent(error, result) {
+
+ let decoded = atob(result.data.content);
+
+ //console.log(decoded);
+
+ //console.log(result);
+
+ respondWithContent(decoded.substring(3), response); // Eliminate first 2 bytes of noise.
+
+ }
+ }
+ break;
+
case "CandleTechnicalAnalisys":
{
respondWithFile('./' + requestParameters[1] + '/' + requestParameters[2], response);
@@ -246,6 +279,28 @@ function onRequestReceivedFromBrowser(request, response) {
}
+function respondWithContent(content, response) {
+
+ try {
+
+ response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
+ response.setHeader("Pragma", "no-cache"); // HTTP 1.0.
+ response.setHeader("Expires", "0"); // Proxies.
+ response.setHeader("Access-Control-Allow-Origin", "*"); // Allows to access data from other domains.
+
+ response.writeHead(200, { 'Content-Type': 'text/html' });
+ response.write(content);
+ response.end("\n");
+ console.log("Content Sent: " + content);
+
+ }
+ catch (err) {
+ returnEmptyArray();
+ }
+}
+
+
+
function respondWithFile(fileName, response) {
let fs = require('fs');