Ecosystem.json read from the server and injected into Plottters.js and Index.html

This commit is contained in:
Luis Fernando Molina committed 2018-03-01 13:43:06 +01:00
1 parent 358cbf3d8a
commit 42869fa650
24 files changed
+1279 -1377

No files matched your search

Binary file not shown.
+10 -4
View File
@@ -36,6 +36,9 @@
<Compile Include="Azure\azure-storage.file.js" />
<Compile Include="Ball.js" />
<Compile Include="Balls.js" />
<Compile Include="BotCard.js">
<SubType>Code</SubType>
</Compile>
<Compile Include="Ecosystem.js">
<SubType>Code</SubType>
</Compile>
@@ -51,9 +54,6 @@
<Compile Include="FileCursorCache.js">
<SubType>Code</SubType>
</Compile>
<Compile Include="Panels\BotsLayersPanel.js">
<SubType>Code</SubType>
</Compile>
<Compile Include="Button.js" />
<Compile Include="Candle.js" />
<Compile Include="CandleTechnicalAnalisys\HighLowFlag.js" />
@@ -81,6 +81,9 @@
<Compile Include="FileCache.js">
<SubType>Code</SubType>
</Compile>
<Compile Include="Plotters.js">
<SubType>Code</SubType>
</Compile>
<Compile Include="server.js" />
<Compile Include="Displace.js" />
<Compile Include="EventHandler.js" />
@@ -96,7 +99,7 @@
<Compile Include="OrderBookDepthChart.js" />
<Compile Include="OrderBookFilesCursor.js" />
<Compile Include="OrderBookSnapShot.js" />
<Compile Include="Panels\ChartLayersPanel.js" />
<Compile Include="Panels\BotsPanel.js" />
<Compile Include="Panels\ControlPanel.js" />
<Compile Include="Panels\CurrentCandlePanel.js" />
<Compile Include="Panels\CurrentVolumePanel.js" />
@@ -124,6 +127,9 @@
<Compile Include="VolumeBar.js" />
<Compile Include="VolumeTechnicalAnalisys\Stairs.js" />
<Compile Include="Zoom.js" />
<Content Include="ecosystem.json">
<SubType>Code</SubType>
</Content>
<Content Include="index.html" />
<Content Include="package.json" />
<Content Include="README.md" />
+189
View File
@@ -0,0 +1,189 @@
function newBotCard() {
var thisObject = {
container: undefined,
draw: draw,
status: 'off',
devTeam: undefined,
bot: undefined,
product: undefined,
code: undefined,
layer: undefined,
getContainer: getContainer, // returns the inner most container that holds the point received by parameter.
initialize: initialize
};
var container = newContainer();
container.initialize();
container.isDraggeable = false;
container.isZoomeable = false;
container.isClickeable = true;
thisObject.container = container;
return thisObject;
function initialize() {
/* Lets set the basic dimensions of this thisObject. */
var position = {
x: 0,
y: 0
};
this.container.frame.position = position;
this.container.frame.width = 280;
this.container.frame.height = 28;
/* Now we start listening to the onClick event from the mouse, so that we can allow users operate this thisObject. */
}
function getContainer(point) {
var container;
/* First we check if this point is inside this space. */
if (this.container.frame.isThisPointHere(point, true) === true) {
return this.container;
} else {
/* This point does not belong to this space. */
return undefined;
}
}
function draw() {
drawIcon();
}
function drawIcon() {
centerPoint = {
x: 7,
y: 7
};
/* Now the transformations. */
centerPoint = thisObject.container.frame.frameThisPoint(centerPoint);
/* Lets start the drawing. */
browserCanvasContext.beginPath();
browserCanvasContext.arc(centerPoint.x, centerPoint.y, 3, 0, 2 * Math.PI);
browserCanvasContext.closePath();
let offFillStyle = 'rgba(232, 28, 28, 1)';
let onFillStyle = 'rgba(45, 232, 28, 1)';
switch (thisObject.status) {
case 'on':
browserCanvasContext.fillStyle = onFillStyle;
break;
case 'off':
browserCanvasContext.fillStyle = offFillStyle;
break;
}
browserCanvasContext.fill();
browserCanvasContext.strokeStyle = 'rgba(150, 150, 150, 1)';
browserCanvasContext.lineWidth = 1;
browserCanvasContext.stroke();
browserCanvasContext.closePath();
/* print the text */
let labelPoint;
let fontSize = 10;
browserCanvasContext.font = fontSize + 'px Courier New';
let label;
let xOffset;
let yOffset;
/* devTeam */
label = thisObject.devTeam;
xOffset = 0;
yOffset = 0;
labelPoint = {
x: 20,
y: thisObject.container.frame.height - 5
};
labelPoint = thisObject.container.frame.frameThisPoint(labelPoint);
browserCanvasContext.fillStyle = 'rgba(60, 60, 60, 0.50)';
browserCanvasContext.fillText(label, labelPoint.x, labelPoint.y);
/* bot */
label = thisObject.bot;
labelPoint = {
x: 40,
y: thisObject.container.frame.height - 5
};
labelPoint = thisObject.container.frame.frameThisPoint(labelPoint);
browserCanvasContext.fillStyle = 'rgba(60, 60, 60, 0.50)';
browserCanvasContext.fillText(label, labelPoint.x, labelPoint.y);
/* product */
label = thisObject.product;
labelPoint = {
x: 60,
y: thisObject.container.frame.height - 5
};
labelPoint = thisObject.container.frame.frameThisPoint(labelPoint);
browserCanvasContext.fillStyle = 'rgba(60, 60, 60, 0.50)';
browserCanvasContext.fillText(label, labelPoint.x, labelPoint.y);
/* layer */
label = thisObject.layer;
labelPoint = {
x: 80,
y: thisObject.container.frame.height - 5
};
labelPoint = thisObject.container.frame.frameThisPoint(labelPoint);
browserCanvasContext.fillStyle = 'rgba(60, 60, 60, 0.50)';
browserCanvasContext.fillText(label, labelPoint.x, labelPoint.y);
}
}
+3 -3
View File
@@ -43,7 +43,7 @@ function newAccumulatedVolumeChartLayer() {
return accumulatedVolumeChartLayer;
function initialize(exchange, market, index, dailyFiles, chartLayersPanel) {
function initialize(exchange, market, index, dailyFiles, botsPanel) {
marketId = market;
exchangeId = exchange;
@@ -58,8 +58,8 @@ function newAccumulatedVolumeChartLayer() {
viewPort.eventHandler.listenToEvent("Zoom Changed", onZoomChanged);
canvas.eventHandler.listenToEvent("Drag Finished", onDragFinished);
layerStatus = chartLayersPanel.getLayerStatus(chartLayersPanel.layerNames.BUY_SELL_BALANCE);
parentLayerStatus = chartLayersPanel.getLayerStatus(chartLayersPanel.layerNames.VOLUME);
layerStatus = botsPanel.getLayerStatus(botsPanel.layerNames.BUY_SELL_BALANCE);
parentLayerStatus = botsPanel.getLayerStatus(botsPanel.layerNames.VOLUME);
}
+2 -2
View File
@@ -44,7 +44,7 @@ function newAllTimeChartLayer() {
return allTimeChartLayer;
function initialize(exchange, market, index, chartLayersPanel) {
function initialize(exchange, market, index, botsPanel) {
marketId = market;
exchangeId = exchange;
@@ -74,7 +74,7 @@ function newAllTimeChartLayer() {
}
layerStatus = chartLayersPanel.getLayerStatus(chartLayersPanel.layerNames.ATH);
layerStatus = botsPanel.getLayerStatus(botsPanel.layerNames.ATH);
}
+2 -2
View File
@@ -39,7 +39,7 @@ function newCandleStickChartLayer() {
return candleStickChartLayer;
function initialize(exchange, market, index, dailyFiles, chartLayersPanel) {
function initialize(exchange, market, index, dailyFiles, botsPanel) {
marketId = market;
exchangeId = exchange;
@@ -61,7 +61,7 @@ function newCandleStickChartLayer() {
viewPort.eventHandler.listenToEvent("Zoom Changed", onZoomChanged);
canvas.eventHandler.listenToEvent("Drag Finished", onDragFinished);
layerStatus = chartLayersPanel.getLayerStatus(chartLayersPanel.layerNames.CANDLESTICKS);
layerStatus = botsPanel.getLayerStatus(botsPanel.layerNames.CANDLESTICKS);
}
@@ -41,7 +41,7 @@ function newCandleTechnicalAnalisysChartLayer() {
return candleTechnicalAnalisysChartLayer;
function initialize(exchange, market, index, dailyFiles, chartLayersPanel) {
function initialize(exchange, market, index, dailyFiles, botsPanel) {
marketId = market;
exchangeId = exchange;
@@ -51,8 +51,8 @@ function newCandleTechnicalAnalisysChartLayer() {
recalculateScale();
layerStatus = chartLayersPanel.getLayerStatus(chartLayersPanel.layerNames.CANDLE_STAIRS);
parentLayerStatus = chartLayersPanel.getLayerStatus(chartLayersPanel.layerNames.CANDLESTICKS);
layerStatus = botsPanel.getLayerStatus(botsPanel.layerNames.CANDLE_STAIRS);
parentLayerStatus = botsPanel.getLayerStatus(botsPanel.layerNames.CANDLESTICKS);
}
+3 -3
View File
@@ -41,7 +41,7 @@ function newForecastChartLayer() {
return forecastChartLayer;
function initialize(exchange, market, index, dailyFiles, chartLayersPanel) {
function initialize(exchange, market, index, dailyFiles, botsPanel) {
marketId = market;
exchangeId = exchange;
@@ -54,8 +54,8 @@ function newForecastChartLayer() {
viewPort.eventHandler.listenToEvent("Zoom Changed", onZoomChanged);
canvas.eventHandler.listenToEvent("Drag Finished", onDragFinished);
layerStatus = chartLayersPanel.getLayerStatus(chartLayersPanel.layerNames.FORECAST);
parentLayerStatus = chartLayersPanel.getLayerStatus(chartLayersPanel.layerNames.CANDLESTICKS);
layerStatus = botsPanel.getLayerStatus(botsPanel.layerNames.FORECAST);
parentLayerStatus = botsPanel.getLayerStatus(botsPanel.layerNames.CANDLESTICKS);
}
+3 -3
View File
@@ -41,7 +41,7 @@ function newHighLowChartLayer() {
return highLowChartLayer;
function initialize(exchange, market, index, dailyFiles, chartLayersPanel) {
function initialize(exchange, market, index, dailyFiles, botsPanel) {
marketId = market;
exchangeId = exchange;
@@ -51,8 +51,8 @@ function newHighLowChartLayer() {
recalculateScale();
layerStatus = chartLayersPanel.getLayerStatus(chartLayersPanel.layerNames.HIGH_LOWS);
parentLayerStatus = chartLayersPanel.getLayerStatus(chartLayersPanel.layerNames.CANDLESTICKS);
layerStatus = botsPanel.getLayerStatus(botsPanel.layerNames.HIGH_LOWS);
parentLayerStatus = botsPanel.getLayerStatus(botsPanel.layerNames.CANDLESTICKS);
}
+2 -2
View File
@@ -40,7 +40,7 @@ function newLinearRegressionCurve() {
return linearRegressionCurveChartLayer;
function initialize(exchange, market, index, dailyFiles, chartLayersPanel) {
function initialize(exchange, market, index, dailyFiles, botsPanel) {
marketId = market;
exchangeId = exchange;
@@ -49,7 +49,7 @@ function newLinearRegressionCurve() {
recalculateScale();
layerStatus = chartLayersPanel.getLayerStatus(chartLayersPanel.layerNames.LINEAR_REGRESION_CURVE);
layerStatus = botsPanel.getLayerStatus(botsPanel.layerNames.LINEAR_REGRESION_CURVE);
}
function getContainer(point) {
+2 -2
View File
@@ -53,7 +53,7 @@ function newOrderBooksChartLayer() {
return orderBooksChartLayer;
function initialize(exchange, market, index, chartLayersPanel) {
function initialize(exchange, market, index, botsPanel) {
marketId = market;
exchangeId = exchange;
@@ -68,7 +68,7 @@ function newOrderBooksChartLayer() {
canvas.eventHandler.listenToEvent("Drag Finished", onDragFinished);
canvas.eventHandler.listenToEvent("Dragging", onDragging);
layerStatus = chartLayersPanel.getLayerStatus(chartLayersPanel.layerNames.ORDER_BOOKS);
layerStatus = botsPanel.getLayerStatus(botsPanel.layerNames.ORDER_BOOKS);
}
+2 -2
View File
@@ -37,7 +37,7 @@ function newSupportResistanceChartLayer() {
return supportResistanceChartLayer;
function initialize(exchange, market, index, dailyFiles, chartLayersPanel) {
function initialize(exchange, market, index, dailyFiles, botsPanel) {
marketId = market;
exchangeId = exchange;
@@ -47,7 +47,7 @@ function newSupportResistanceChartLayer() {
recalculateScale();
layerStatus = chartLayersPanel.getLayerStatus(chartLayersPanel.layerNames.CANDLESTICKS); // TODO : Put the right layer name here when it exists.
layerStatus = botsPanel.getLayerStatus(botsPanel.layerNames.CANDLESTICKS); // TODO : Put the right layer name here when it exists.
}
+2 -2
View File
@@ -41,7 +41,7 @@ function newVolumeChartLayer() {
return volumeChartLayer;
function initialize(exchange, market, index, dailyFiles, chartLayersPanel) {
function initialize(exchange, market, index, dailyFiles, botsPanel) {
marketId = market;
exchangeId = exchange;
@@ -56,7 +56,7 @@ function newVolumeChartLayer() {
viewPort.eventHandler.listenToEvent("Zoom Changed", onZoomChanged);
canvas.eventHandler.listenToEvent("Drag Finished", onDragFinished);
layerStatus = chartLayersPanel.getLayerStatus(chartLayersPanel.layerNames.VOLUME);
layerStatus = botsPanel.getLayerStatus(botsPanel.layerNames.VOLUME);
}
@@ -42,7 +42,7 @@ function newVolumeTechnicalAnalisysChartLayer() {
return volumeTechnicalAnalisysChartLayer;
function initialize(exchange, market, index, dailyFiles, chartLayersPanel) {
function initialize(exchange, market, index, dailyFiles, botsPanel) {
marketId = market;
exchangeId = exchange;
@@ -50,8 +50,8 @@ function newVolumeTechnicalAnalisysChartLayer() {
marketIndex = index;
dailyFilesCursor = dailyFiles;
layerStatus = chartLayersPanel.getLayerStatus(chartLayersPanel.layerNames.VOLUME_STAIRS);
parentLayerStatus = chartLayersPanel.getLayerStatus(chartLayersPanel.layerNames.VOLUME);
layerStatus = botsPanel.getLayerStatus(botsPanel.layerNames.VOLUME_STAIRS);
parentLayerStatus = botsPanel.getLayerStatus(botsPanel.layerNames.VOLUME);
}
+30 -426
View File
@@ -3,6 +3,7 @@ function newEcosystem() {
let ecosystem = {
getTeam: getTeam,
getTeams: getTeams,
getBot: getBot,
getProduct: getProduct,
getLayer: getLayer,
@@ -11,431 +12,7 @@ function newEcosystem() {
initialize: initialize
}
const ECOSYSTEM = {
devTeams:
[{
codeName: "AAMasters",
organization: {
name: "AAMasters",
type: "Open Source Community",
displayName: "AA Masters",
location: "Global",
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:
[
{
codeName: "AAOlivia",
displayName: "Olivia",
type: "Indicator",
version: {
number: "1.0.0",
status: "Mantained", // Discontinued
},
products: [{
codeName: "Market 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: [{
codeName: "Market Candlesticks",
displayName: "Candlesticks",
exchangeList: ["Poloniex"],
validPeriods: ["24-hs", "12-hs", "08-hs", "06-hs", "04-hs", "03-hs", "02-hs", "01-hs"],
plotter: {
devTeam: "AAMasters",
repo: "AAOlivia-Plotter",
moduleName: "Candles",
target: "Timeline"
}
}]
}
, {
codeName: "Market 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/Volumes/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: [{
codeName: "Market Volumes",
displayName: "Volumes",
exchangeList: ["Poloniex"],
validPeriods: ["24-hs", "12-hs", "08-hs", "06-hs", "04-hs", "03-hs", "02-hs", "01-hs"],
plotter: {
devTeam: "AAMasters",
repo: "AAOlivia-Plotter",
moduleName: "Volumes",
target: "Timeline"
}
}]
}, {
codeName: "Daily Candles",
displayName: "Daily 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-Daily/@Period/@Year/@Month/@Day",
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:[{
codeName: "Daily Candlesticks",
displayName: "Candlesticks",
exchangeList: ["Poloniex"],
validPeriods: ["45-min", "40-min", "30-min", "20-min", "15-min", "10-min", "05-min", "04-min", "03-min", "02-min", "01-min"],
plotter: {
devTeam: "AAMasters",
repo: "AAOlivia-Plotter",
moduleName: "Candlesticks",
target: "Timeline"
}
}]
}, {
codeName: "Daily Volumes",
displayName: "Daily Volumes per Period",
description: "A set of files per period that contains all volumes of one whole market.",
storageAccount: "aaolivia",
filePath: "@Exchange/Output/Volumes/Multi-Period-Daily/@Period/@Year/@Month/@Day",
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: [{
codeName: "Daily Volumes",
displayName: "Volumes",
exchangeList: ["Poloniex"],
validPeriods: ["45-min", "40-min", "30-min", "20-min", "15-min", "10-min", "05-min", "04-min", "03-min", "02-min", "01-min"],
plotter: {
devTeam: "AAMasters",
repo: "AAOlivia-Plotter",
moduleName: "Volumes",
target: "Timeline"
}
}]
}]
,
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'
}
},
{
codeName: "AATom",
displayName: "Tom",
type: "Indicator",
version: {
number: "1.0.0",
status: "Mantained", // Discontinued
},
products:[{
codeName: "Market Candle-Stairs",
displayName: "Market Candle-Stairs per Period",
description: "A set of files per period that contains all candle-stairs of one whole market.",
storageAccount: "aatom",
filePath: "@Exchange/Tom/dataSet.V1/Output/Candle-Stairs/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: [{
codeName: "Market Candle-Stairs",
displayName: "Candle-Stairs",
exchangeList: ["Poloniex"],
validPeriods: ["24-hs", "12-hs", "08-hs", "06-hs", "04-hs", "03-hs", "02-hs", "01-hs"],
plotter: {
devTeam: "AAMasters",
repo: "AATom-Plotter",
moduleName: "CandleStairs",
target: "Timeline"
}
}]
}, {
codeName: "Market Volume-Stairs",
displayName: "Market Volume-Stairs per Period",
description: "A set of files per period that contains all volume-stairs of one whole market.",
storageAccount: "aaolivia",
filePath: "@Exchange/Tom/dataSet.V1/Output/Volume-Stairs/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: [{
codeName: "Market Volume-Stairs",
displayName: "Volume-Stairs",
exchangeList: ["Poloniex"],
validPeriods: ["24-hs", "12-hs", "08-hs", "06-hs", "04-hs", "03-hs", "02-hs", "01-hs"],
plotter: {
devTeam: "AAMasters",
repo: "AATom-Plotter",
moduleName: "VolumeStairs",
target: "Timeline"
}
}]
}, {
codeName: "Daily Candle-Stairs",
displayName: "Daily Candle-Stairs per Period",
description: "A set of files per period that contains all candle-stairs of one whole market.",
storageAccount: "aatom",
filePath: "@Exchange/Tom/dataSet.V1/Output/Candle-Stairs/Multi-Period-Daily/@Period/@Year/@Month/@Day",
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: [{
codeName: "Daily Candle-Stairs",
displayName: "Candle-Stairs",
exchangeList: ["Poloniex"],
validPeriods: ["45-min", "40-min", "30-min", "20-min", "15-min", "10-min", "05-min", "04-min", "03-min", "02-min", "01-min"],
plotter: {
devTeam: "AAMasters",
repo: "AATom-Plotter",
moduleName: "CandleStairs",
target: "Timeline"
}
}]
}, {
codeName: "Daily Volume-Stairs",
displayName: "Daily Volume-Stairs per Period",
description: "A set of files per period that contains all volume-stairs of one whole market.",
storageAccount: "aaotom",
filePath: "@Exchange/Tom/dataSet.V1/Output/Volume-Stairs/Multi-Period-Daily/@Period/@Year/@Month/@Day",
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: [{
codeName: "Daily Volume-Stairs",
displayName: "Volume-Stairs",
exchangeList: ["Poloniex"],
validPeriods: ["45-min", "40-min", "30-min", "20-min", "15-min", "10-min", "05-min", "04-min", "03-min", "02-min", "01-min"],
plotter: {
devTeam: "AAMasters",
repo: "AATom-Plotter",
moduleName: "VolumeStairs",
target: "Timeline"
}
}]
}]
,
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-31T19:28:33Z&st=2018-02-22T11:28:33Z&spr=https&sig=YaprSp9zO%2Fsz0nPPWwPMqPACxZTnYhSWKApfun%2Bfez4%3D',
fileUri: 'https://' + 'aatom' + '.file.core.windows.net'
}
},
{
codeName: "AAMariam",
displayName: "Mariam",
type: "Trading",
version: {
number: "1.0.0",
status: "Mantained", // Discontinued
},
products: [{
codeName: "Trading History",
displayName: "Mariam Trading History",
description: "General information about Mariam trading history.",
storageAccount: "aamariam",
filePath: "@Exchange/Mariam/dataSet.V1/Output/Trading-Process",
fileName: "Execution.History.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: [{
codeName: "Trading History",
displayName: "Mariam Trading History",
exchangeList: ["Poloniex"],
validPeriods: ["24-hs", "12-hs", "08-hs", "06-hs", "04-hs", "03-hs", "02-hs", "01-hs"],
plotter: {
devTeam: "AAMasters",
repo: "AAMariam-Plotter",
moduleName: "History",
target: "Timeline"
}
}]
}, {
codeName: "Trading Details",
displayName: "Mariam Trading Details",
description: "Detailed information about Mariam execution.",
storageAccount: "aamariam",
filePath: "@Exchange/Mariam/dataSet.V1/Output/Trading-Process//@Year/@Month/@Day/@Hour/@Minute",
fileName: "Execution.Context.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: [{
codeName: "Trading Details",
displayName: "Mariam Trading Details",
exchangeList: ["Poloniex"],
validPeriods: ["24-hs", "12-hs", "08-hs", "06-hs", "04-hs", "03-hs", "02-hs", "01-hs"],
plotter: {
devTeam: "AAMasters",
repo: "AAMariam-Plotter",
moduleName: "Details",
target: "Timeline"
}
}]
}]
,
processes:
{
process: [{
name: "Trading-Process",
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-07-29&ss=f&srt=sco&sp=r&se=2018-12-30T23:44:52Z&st=2018-02-25T15:44:52Z&spr=https&sig=0pzOTcVAAOkgH7C4KmA1Rbs15kyjvVC1XFCsLQYjXKU%3D',
fileUri: 'https://' + 'aamariam' + '.file.core.windows.net'
}
}
]
}
]
};
const ECOSYSTEM = "@ecosystem.json@";
return ecosystem;
@@ -446,6 +23,12 @@ function newEcosystem() {
}
function getTeams() {
return ECOSYSTEM.devTeams;
}
function getTeam(pTeamCodeName) {
for (let i = 0; i < ECOSYSTEM.devTeams.length; i++) {
@@ -503,10 +86,31 @@ function newEcosystem() {
function getLayers() {
for (let i = 0; i < ecosystem.devTeams.length; i++) {
let allLayers = [];
for (let i = 0; i < ECOSYSTEM.devTeams.length; i++) {
let devTeam = ecosystem.devTeams[i];
for (let j = 0; j < devTeam.bots.length; j++) {
let bot = devTeam.bots[j];
for (let k = 0; k < bot.products.length; k++) {
let product = bot.products[k];
for (let l = 0; l < product.layers.length; l++) {
let layer = product.layers[l];
allLayers.push(layer);
}
}
}
}
return allLayers;
}
}
-233
View File
@@ -1,233 +0,0 @@
function newBotsLayersPanel() {
const BUTTONS_STATES = {
ON: 'on',
INVISIBLE: 'invisible',
OFF: 'off'
};
const LAYER_NAMES = {
CANDLESTICKS: 'Candlesticks',
VOLUME: 'Volume',
ATH: 'All-time Highs and Lows',
HIGH_LOWS: 'High and Lows',
FORECAST: 'Forecast',
ORDER_BOOKS: 'Order Books',
CANDLE_STAIRS: 'Candle Stairs',
VOLUME_STAIRS: 'Volume Stairs',
BUY_SELL_BALANCE: 'Buy Sell Balance',
LINEAR_REGRESION_CURVE: 'Linear Regression Curve'
};
var botsLayersPanel = {
container: undefined,
buttons: undefined,
getLayerStatus: getLayerStatus,
layerNames: LAYER_NAMES,
draw: draw,
getContainer: getContainer, // returns the inner most container that holds the point received by parameter.
initialize: initialize
};
var container = newContainer();
container.initialize();
container.isDraggeable = true;
container.isZoomeable = false;
botsLayersPanel.container = container;
botsLayersPanel.container.frame.containerName = "Bots Layers Panel";
let isInitialized = false;
let buttons;
return botsLayersPanel;
function initialize() {
this.container.frame.width = 200;
this.container.frame.height = 270;
var position = {
x: viewPort.visibleArea.topLeft.x,
y: viewPort.visibleArea.bottomRight.y - this.container.frame.height
};
this.container.frame.position = position;
var buttonPosition;
var buttonNames = [LAYER_NAMES.CANDLESTICKS, LAYER_NAMES.VOLUME, LAYER_NAMES.ATH, LAYER_NAMES.HIGH_LOWS, LAYER_NAMES.FORECAST, LAYER_NAMES.ORDER_BOOKS, LAYER_NAMES.CANDLE_STAIRS, LAYER_NAMES.VOLUME_STAIRS, LAYER_NAMES.BUY_SELL_BALANCE, LAYER_NAMES.LINEAR_REGRESION_CURVE];
var lastY = 5;
buttons = [];
for (var i = 0; i < buttonNames.length; i++) {
/* Buttons are going to be one at the right of the other. */
var textButton = newTextButton();
textButton.type = buttonNames[i];
textButton.container.displacement.parentDisplacement = this.container.displacement;
textButton.container.zoom.parentZoom = this.container.zoom;
textButton.container.frame.parentFrame = this.container.frame;
textButton.container.parentContainer = this.container;
textButton.initialize();
buttonPosition = { // The first textButton
x: 10,
y: botsLayersPanel.container.frame.height - botsLayersPanel.container.frame.getBodyHeight()
};
textButton.container.frame.position.x = buttonPosition.x;
textButton.container.frame.position.y = buttonPosition.y + lastY;
lastY = lastY + textButton.container.frame.height;
/* We start listening to the buttons click event, so as to know when one was pressed. */
textButton.container.eventHandler.listenToEvent('onMouseClick', buttonPressed, i);
let storedValue = window.localStorage.getItem(textButton.type);
if (storedValue !== null) {
textButton.status = storedValue;
} else {
textButton.status = BUTTONS_STATES.ON;
}
buttons.push(textButton);
let eventData = {
layer: textButton.type,
status: textButton.status
}
botsLayersPanel.container.eventHandler.raiseEvent('Layer Status Changed', eventData);
}
botsLayersPanel.buttons = buttons;
isInitialized = true;
}
function getLayerStatus(layerName) {
for (let i = 0; i < buttons.length; i++) {
let button = buttons[i];
if (button.type === layerName) {
return button.status;
}
}
return BUTTONS_STATES.OFF;
}
function getContainer(point) {
var container;
/* First we check if this point is inside this space. */
if (this.container.frame.isThisPointHere(point, true) === true) {
/* Now we see which is the inner most container that has it */
for (var i = 0; i < this.buttons.length; i++) {
container = this.buttons[i].getContainer(point);
if (container !== undefined) {
/* We found an inner container which has the point. We return it. */
return container;
}
}
/* The point does not belong to any inner container, so we return the current container. */
return this.container;
} else {
/* This point does not belong to this space. */
return undefined;
}
}
function buttonPressed(event, buttonPressedIndex) {
switch (botsLayersPanel.buttons[buttonPressedIndex].status) {
case BUTTONS_STATES.ON:
botsLayersPanel.buttons[buttonPressedIndex].status = BUTTONS_STATES.INVISIBLE;
break;
case BUTTONS_STATES.INVISIBLE:
botsLayersPanel.buttons[buttonPressedIndex].status = BUTTONS_STATES.OFF;
break;
case BUTTONS_STATES.OFF:
botsLayersPanel.buttons[buttonPressedIndex].status = BUTTONS_STATES.ON;
break;
}
let eventData = {
layer: botsLayersPanel.buttons[buttonPressedIndex].type,
status: botsLayersPanel.buttons[buttonPressedIndex].status
}
botsLayersPanel.container.eventHandler.raiseEvent('Layer Status Changed', eventData);
window.localStorage.setItem(botsLayersPanel.buttons[buttonPressedIndex].type, botsLayersPanel.buttons[buttonPressedIndex].status);
}
function draw() {
if (isInitialized === false) { return; }
botsLayersPanel.container.frame.draw(false, false, true);
for (var i = 0; i < botsLayersPanel.buttons.length; i++) {
botsLayersPanel.buttons[i].draw();
}
}
}
+237
View File
@@ -0,0 +1,237 @@
function newBotsPanel() {
const CARD_STATES = {
ON: 'on',
OFF: 'off'
};
var thisObject = {
container: undefined,
cards: undefined,
getLayerStatus: getLayerStatus,
draw: draw,
getContainer: getContainer, // returns the inner most container that holds the point received by parameter.
initialize: initialize
};
var container = newContainer();
container.initialize();
container.isDraggeable = true;
container.isZoomeable = false;
thisObject.container = container;
thisObject.container.frame.containerName = "Chart Layers Panel";
let isInitialized = false;
let cards;
let layers = [];
return thisObject;
function initialize() {
this.container.frame.width = 200;
this.container.frame.height = 200;
var position = {
x: viewPort.visibleArea.topRight.x - this.container.frame.width,
y: viewPort.visibleArea.bottomRight.y - this.container.frame.height
};
this.container.frame.position = position;
/* First thing is to build the layers array */
let devTeams = ecosystem.getTeams();
for (let i = 0; i < devTeams.length; i++) {
let devTeam = devTeams[i];
for (let j = 0; j < devTeam.bots.length; j++) {
let bot = devTeam.bots[j];
for (let k = 0; k < bot.products.length; k++) {
let product = bot.products[k];
for (let l = 0; l < product.layers.length; l++) {
let layer = product.layers[l];
let panelLayer = {
devTeam: devTeam,
bot: bot,
product: product,
layer: layer
};
layers.push(panelLayer);
}
}
}
}
var cardPosition;
var lastY = 5;
cards = [];
for (var i = 0; i < layers.length; i++) {
let fullCodeName = layers[i].devTeam.codeName + '-' + layers[i].bot.codeName + '-' + layers[i].product.codeName + '-' + layers[i].layer.codeName;
/* Buttons are going to be one at the right of the other. */
var card = newBotCard();
card.devTeam = layers[i].devTeam.displayName;
card.bot = layers[i].bot.displayName;
card.product = layers[i].product.displayName;
card.layer = layers[i].layer.displayName;
card.code = fullCodeName;
card.container.displacement.parentDisplacement = this.container.displacement;
card.container.zoom.parentZoom = this.container.zoom;
card.container.frame.parentFrame = this.container.frame;
card.container.parentContainer = this.container;
card.initialize();
cardPosition = { // The first card
x: 10,
y: thisObject.container.frame.height - thisObject.container.frame.getBodyHeight()
};
card.container.frame.position.x = cardPosition.x;
card.container.frame.position.y = cardPosition.y + lastY;
lastY = lastY + card.container.frame.height;
/* We start listening to the cards click event, so as to know when one was pressed. */
card.container.eventHandler.listenToEvent('onMouseClick', buttonPressed, i);
let storedValue = window.localStorage.getItem(card.code);
if (storedValue !== null) {
card.status = storedValue;
} else {
card.status = CARD_STATES.ON;
}
cards.push(card);
let eventData = {
layer: card.code,
status: card.status
}
thisObject.container.eventHandler.raiseEvent('Layer Status Changed', eventData);
}
thisObject.cards = cards;
isInitialized = true;
}
function getLayerStatus(layerName) {
for (let i = 0; i < cards.length; i++) {
let button = cards[i];
if (button.code === layerName) {
return button.status;
}
}
return CARD_STATES.OFF;
}
function getContainer(point) {
var container;
/* First we check if this point is inside this space. */
if (this.container.frame.isThisPointHere(point, true) === true) {
/* Now we see which is the inner most container that has it */
for (var i = 0; i < this.cards.length; i++) {
container = this.cards[i].getContainer(point);
if (container !== undefined) {
/* We found an inner container which has the point. We return it. */
return container;
}
}
/* The point does not belong to any inner container, so we return the current container. */
return this.container;
} else {
/* This point does not belong to this space. */
return undefined;
}
}
function buttonPressed(event, index) {
switch (thisObject.cards[index].status) {
case CARD_STATES.ON:
thisObject.cards[index].status = CARD_STATES.OFF;
break;
case CARD_STATES.OFF:
thisObject.cards[index].status = CARD_STATES.ON;
break;
}
let eventData = {
layer: thisObject.cards[index].code,
status: thisObject.cards[index].status
}
thisObject.container.eventHandler.raiseEvent('Layer Status Changed', eventData);
window.localStorage.setItem(thisObject.cards[index].code, thisObject.cards[index].status);
}
function draw() {
if (isInitialized === false) {return;}
thisObject.container.frame.draw(false, false, true);
for (var i = 0; i < thisObject.cards.length; i++) {
thisObject.cards[i].draw();
}
}
}
-244
View File
@@ -1,244 +0,0 @@
function newChartLayersPanel() {
const BUTTONS_STATES = {
ON: 'on',
INVISIBLE: 'invisible',
OFF: 'off'
};
const LAYER_NAMES = {
OLIVIA_CANDLES: 'Olivia Candlesticks',
OLIVIA_VOLUMES: 'Olivia Volumes',
TOM_CANDLE_STAIRS: 'Tom Candle-Stairs',
TOM_VOLUME_STAIRS: 'Tom Volume-Stairs',
MARIAM_TRADE_HISTORY: 'Mariam Trades History',
MARIAM_TRADES_DETAILS: 'Mariam Trades Details',
ATH: 'All-time Highs and Lows',
HIGH_LOWS: 'High and Lows',
FORECAST: 'Forecast',
ORDER_BOOKS: 'Order Books',
CANDLE_STAIRS: 'Candle Stairs',
VOLUME_STAIRS: 'Volume Stairs',
BUY_SELL_BALANCE: 'Buy Sell Balance',
LINEAR_REGRESION_CURVE: 'Linear Regression Curve'
};
var panel = {
container: undefined,
buttons: undefined,
getLayerStatus: getLayerStatus,
layerNames: LAYER_NAMES,
draw: draw,
getContainer: getContainer, // returns the inner most container that holds the point received by parameter.
initialize: initialize
};
var container = newContainer();
container.initialize();
container.isDraggeable = true;
container.isZoomeable = false;
panel.container = container;
panel.container.frame.containerName = "Chart Layers Panel";
let isInitialized = false;
let buttons;
let layers = new Map();
return panel;
function initialize() {
this.container.frame.width = 200;
this.container.frame.height = 200;
var position = {
x: viewPort.visibleArea.topRight.x - this.container.frame.width,
y: viewPort.visibleArea.bottomRight.y - this.container.frame.height
};
this.container.frame.position = position;
/* First thing is to build the layers Map */
var buttonPosition;
var buttonNames = [
LAYER_NAMES.OLIVIA_CANDLES,
LAYER_NAMES.OLIVIA_VOLUMES,
LAYER_NAMES.TOM_CANDLE_STAIRS,
LAYER_NAMES.TOM_VOLUME_STAIRS,
LAYER_NAMES.MARIAM_TRADE_HISTORY,
LAYER_NAMES.MARIAM_TRADES_DETAILS,
LAYER_NAMES.ATH,
LAYER_NAMES.HIGH_LOWS,
LAYER_NAMES.FORECAST,
LAYER_NAMES.ORDER_BOOKS,
LAYER_NAMES.CANDLE_STAIRS,
LAYER_NAMES.VOLUME_STAIRS,
LAYER_NAMES.BUY_SELL_BALANCE,
LAYER_NAMES.LINEAR_REGRESION_CURVE
];
var lastY = 5;
buttons = [];
for (var i = 0; i < buttonNames.length; i++) {
/* Buttons are going to be one at the right of the other. */
var textButton = newTextButton();
textButton.type = buttonNames[i];
textButton.container.displacement.parentDisplacement = this.container.displacement;
textButton.container.zoom.parentZoom = this.container.zoom;
textButton.container.frame.parentFrame = this.container.frame;
textButton.container.parentContainer = this.container;
textButton.initialize();
buttonPosition = { // The first textButton
x: 10,
y: panel.container.frame.height - panel.container.frame.getBodyHeight()
};
textButton.container.frame.position.x = buttonPosition.x;
textButton.container.frame.position.y = buttonPosition.y + lastY;
lastY = lastY + textButton.container.frame.height;
/* We start listening to the buttons click event, so as to know when one was pressed. */
textButton.container.eventHandler.listenToEvent('onMouseClick', buttonPressed, i);
let storedValue = window.localStorage.getItem(textButton.type);
if (storedValue !== null) {
textButton.status = storedValue;
} else {
textButton.status = BUTTONS_STATES.ON;
}
buttons.push(textButton);
let eventData = {
layer: textButton.type,
status: textButton.status
}
panel.container.eventHandler.raiseEvent('Layer Status Changed', eventData);
}
panel.buttons = buttons;
isInitialized = true;
}
function getLayerStatus(layerName) {
for (let i = 0; i < buttons.length; i++) {
let button = buttons[i];
if (button.type === layerName) {
return button.status;
}
}
return BUTTONS_STATES.OFF;
}
function getContainer(point) {
var container;
/* First we check if this point is inside this space. */
if (this.container.frame.isThisPointHere(point, true) === true) {
/* Now we see which is the inner most container that has it */
for (var i = 0; i < this.buttons.length; i++) {
container = this.buttons[i].getContainer(point);
if (container !== undefined) {
/* We found an inner container which has the point. We return it. */
return container;
}
}
/* The point does not belong to any inner container, so we return the current container. */
return this.container;
} else {
/* This point does not belong to this space. */
return undefined;
}
}
function buttonPressed(event, buttonPressedIndex) {
switch (panel.buttons[buttonPressedIndex].status) {
case BUTTONS_STATES.ON:
panel.buttons[buttonPressedIndex].status = BUTTONS_STATES.INVISIBLE;
break;
case BUTTONS_STATES.INVISIBLE:
panel.buttons[buttonPressedIndex].status = BUTTONS_STATES.OFF;
break;
case BUTTONS_STATES.OFF:
panel.buttons[buttonPressedIndex].status = BUTTONS_STATES.ON;
break;
}
let eventData = {
layer: panel.buttons[buttonPressedIndex].type,
status: panel.buttons[buttonPressedIndex].status
}
panel.container.eventHandler.raiseEvent('Layer Status Changed', eventData);
window.localStorage.setItem(panel.buttons[buttonPressedIndex].type, panel.buttons[buttonPressedIndex].status);
}
function draw() {
if (isInitialized === false) {return;}
panel.container.frame.draw(false, false, true);
for (var i = 0; i < panel.buttons.length; i++) {
panel.buttons[i].draw();
}
}
}
+22
View File
@@ -0,0 +1,22 @@
function getNewPlotter(pDevTeam, pRepo, pModule) {
let plotter;
let fullCode = pDevTeam + pRepo + pModule;
switch (fullCode) {
// Cases
default:
{
throw("getNewPlotter: " + fullCode + " not found.")
}
}
return plotter;
}
+7 -21
View File
@@ -24,7 +24,7 @@ function newTimeMachine() {
let currentCandlePanel;
let currentVolumePanel;
let chartLayersPanel;
let botsPanel;
let orderBookPanel;
return timeMachine;
@@ -46,11 +46,8 @@ function newTimeMachine() {
orderBookPanel = newOrderBookPanel();
orderBookPanel.initialize();
chartLayersPanel = newChartLayersPanel();
chartLayersPanel.initialize();
botsLayersPanel = newBotsLayersPanel();
botsLayersPanel.initialize();
botsPanel = newBotsPanel();
botsPanel.initialize();
let iteration = 0;
@@ -70,7 +67,7 @@ function newTimeMachine() {
timelineChart.container.frame.position.x = timeMachine.container.frame.width / 2 - timelineChart.container.frame.width / 2;
timelineChart.container.frame.position.y = timelineChart.container.frame.height * 1.5 * iteration;
timelineChart.initialize(1, INITIAL_DEFAULT_MARKET, currentCandlePanel, currentVolumePanel, chartLayersPanel, botsLayersPanel, orderBookPanel, onDefaultMarketInitialized);
timelineChart.initialize(1, INITIAL_DEFAULT_MARKET, currentCandlePanel, currentVolumePanel, botsPanel, orderBookPanel, onDefaultMarketInitialized);
iteration++;
@@ -111,7 +108,7 @@ function newTimeMachine() {
timelineChart.container.frame.position.x = timeMachine.container.frame.width / 2 - timelineChart.container.frame.width / 2;
timelineChart.container.frame.position.y = timelineChart.container.frame.height * 1.5 * iteration;
timelineChart.initialize(1, key, currentCandlePanel, currentVolumePanel, chartLayersPanel, botsLayersPanel, orderBookPanel, finalSteps);
timelineChart.initialize(1, key, currentCandlePanel, currentVolumePanel, botsPanel, orderBookPanel, finalSteps);
iteration++;
@@ -259,9 +256,7 @@ function newTimeMachine() {
currentVolumePanel.draw();
chartLayersPanel.draw();
botsLayersPanel.draw();
botsPanel.draw();
orderBookPanel.draw();
@@ -304,16 +299,7 @@ function newTimeMachine() {
return container;
}
container = chartLayersPanel.getContainer(point);
if (container !== undefined) {
/* We found an inner container which has the point. We return it. */
return container;
}
container = botsLayersPanel.getContainer(point);
container = botsPanel.getContainer(point);
if (container !== undefined) {
+30 -207
View File
@@ -43,18 +43,16 @@ function newTimelineChart() {
let currentCandlePanel;
let currentVolumePanel;
let chartLayersPanel;
let botsLayersPanel;
let botsPanel;
let orderBookPanel;
return timelineChart;
function initialize(exchange, market, currentCandlePanelToUse, currentVolumePanelToUse, chartLayersPanelToUse, botsLayersPanelToUse, orderBookPanelToUse, callBackFunction) {
function initialize(exchange, market, currentCandlePanelToUse, currentVolumePanelToUse, botsPanelToUse, orderBookPanelToUse, callBackFunction) {
currentCandlePanel = currentCandlePanelToUse;
currentVolumePanel = currentVolumePanelToUse;
chartLayersPanel = chartLayersPanelToUse;
botsLayersPanel = botsLayersPanelToUse;
botsPanel = botsPanelToUse;
orderBookPanel = orderBookPanelToUse;
marketId = market;
@@ -106,9 +104,17 @@ function newTimelineChart() {
viewPort.displace(displaceVector);
let layerStatus;
for (let i = 0; i < botsPanel.cards.length; i++) {
let plotter = newPlotter();
}
/* AAMasters AAOlivia Candlesticks */
let layerAAMastersAAOliviaCandlesticks = newAAMastersAAOliviaCandles();
@@ -129,7 +135,7 @@ function newTimelineChart() {
layerAAMastersAAOliviaCandlesticks.container.frame.position.x = timelineChart.container.frame.width / 2 - layerAAMastersAAOliviaCandlesticks.container.frame.width / 2;
layerAAMastersAAOliviaCandlesticks.container.frame.position.y = timelineChart.container.frame.height / 2 - layerAAMastersAAOliviaCandlesticks.container.frame.height / 2;
layerStatus = chartLayersPanel.getLayerStatus(chartLayersPanel.layerNames.OLIVIA_CANDLES);
layerStatus = botsPanel.getLayerStatus(botsPanel.layerNames.OLIVIA_CANDLES);
layerAAMastersAAOliviaCandlesticks.initialize(DEFAULT_EXCHANGE, DEFAULT_MARKET, INITIAL_DATE, INITIAL_TIME_PERIOD, layerStatus, onInizialized);
@@ -162,7 +168,7 @@ function newTimelineChart() {
layerAAMastersAAOliviaVolumes.container.frame.position.x = timelineChart.container.frame.width / 2 - layerAAMastersAAOliviaVolumes.container.frame.width / 2;
layerAAMastersAAOliviaVolumes.container.frame.position.y = timelineChart.container.frame.height / 2 - layerAAMastersAAOliviaVolumes.container.frame.height / 2;
layerStatus = chartLayersPanel.getLayerStatus(chartLayersPanel.layerNames.OLIVIA_VOLUMES);
layerStatus = botsPanel.getLayerStatus(botsPanel.layerNames.OLIVIA_VOLUMES);
layerAAMastersAAOliviaVolumes.initialize(DEFAULT_EXCHANGE, DEFAULT_MARKET, INITIAL_DATE, INITIAL_TIME_PERIOD, layerStatus, onInizialized);
@@ -194,7 +200,7 @@ function newTimelineChart() {
layerAAMastersAATomCandleStairs.container.frame.position.x = timelineChart.container.frame.width / 2 - layerAAMastersAATomCandleStairs.container.frame.width / 2;
layerAAMastersAATomCandleStairs.container.frame.position.y = timelineChart.container.frame.height / 2 - layerAAMastersAATomCandleStairs.container.frame.height / 2;
layerStatus = chartLayersPanel.getLayerStatus(chartLayersPanel.layerNames.TOM_CANDLE_STAIRS);
layerStatus = botsPanel.getLayerStatus(botsPanel.layerNames.TOM_CANDLE_STAIRS);
layerAAMastersAATomCandleStairs.initialize(DEFAULT_EXCHANGE, DEFAULT_MARKET, INITIAL_DATE, INITIAL_TIME_PERIOD, layerStatus, onInizialized);
@@ -227,7 +233,7 @@ function newTimelineChart() {
layerAAMastersAATomVolumeStairs.container.frame.position.x = timelineChart.container.frame.width / 2 - layerAAMastersAATomVolumeStairs.container.frame.width / 2;
layerAAMastersAATomVolumeStairs.container.frame.position.y = timelineChart.container.frame.height / 2 - layerAAMastersAATomVolumeStairs.container.frame.height / 2;
layerStatus = chartLayersPanel.getLayerStatus(chartLayersPanel.layerNames.TOM_VOLUME_STAIRS);
layerStatus = botsPanel.getLayerStatus(botsPanel.layerNames.TOM_VOLUME_STAIRS);
layerAAMastersAATomVolumeStairs.initialize(DEFAULT_EXCHANGE, DEFAULT_MARKET, INITIAL_DATE, INITIAL_TIME_PERIOD, layerStatus, onInizialized);
@@ -260,7 +266,7 @@ function newTimelineChart() {
layerAAMastersAAMariamTradingHistory.container.frame.position.x = timelineChart.container.frame.width / 2 - layerAAMastersAAMariamTradingHistory.container.frame.width / 2;
layerAAMastersAAMariamTradingHistory.container.frame.position.y = timelineChart.container.frame.height / 2 - layerAAMastersAAMariamTradingHistory.container.frame.height / 2;
layerStatus = chartLayersPanel.getLayerStatus(chartLayersPanel.layerNames.MARIAM_TRADE_HISTORY);
layerStatus = botsPanel.getLayerStatus(botsPanel.layerNames.MARIAM_TRADE_HISTORY);
layerAAMastersAAMariamTradingHistory.initialize(DEFAULT_EXCHANGE, DEFAULT_MARKET, INITIAL_DATE, INITIAL_TIME_PERIOD, layerStatus, onInizialized);
@@ -275,189 +281,6 @@ function newTimelineChart() {
}
/* All Time Layer */
/*
var allTimeChartLayer = newAllTimeChartLayer();
allTimeChartLayer.container.displacement.parentDisplacement = timelineChart.container.displacement;
allTimeChartLayer.container.zoom.parentZoom = timelineChart.container.zoom;
allTimeChartLayer.container.frame.parentFrame = timelineChart.container.frame;
allTimeChartLayer.container.parentContainer = timelineChart.container;
allTimeChartLayer.container.frame.width = timelineChart.container.frame.width * 1;
allTimeChartLayer.container.frame.height = timelineChart.container.frame.height * 1;
allTimeChartLayer.container.frame.position.x = timelineChart.container.frame.width / 2 - allTimeChartLayer.container.frame.width / 2;
allTimeChartLayer.container.frame.position.y = timelineChart.container.frame.height / 2 - allTimeChartLayer.container.frame.height / 2;
allTimeChartLayer.initialize(exchangeId, marketId, marketIndex, chartLayersPanel);
/* Orderbook Resistances Layer */
/*
var orderBooksChartLayer = newOrderBooksChartLayer();
orderBooksChartLayer.container.displacement.parentDisplacement = timelineChart.container.displacement;
orderBooksChartLayer.container.zoom.parentZoom = timelineChart.container.zoom;
orderBooksChartLayer.container.frame.parentFrame = timelineChart.container.frame;
orderBooksChartLayer.container.parentContainer = timelineChart.container;
orderBooksChartLayer.container.frame.width = timelineChart.container.frame.width * 1;
orderBooksChartLayer.container.frame.height = timelineChart.container.frame.height * 1;
orderBooksChartLayer.container.frame.position.x = timelineChart.container.frame.width / 2 - orderBooksChartLayer.container.frame.width / 2;
orderBooksChartLayer.container.frame.position.y = timelineChart.container.frame.height / 2 - orderBooksChartLayer.container.frame.height / 2;
orderBooksChartLayer.initialize(exchangeId, marketId, marketIndex, chartLayersPanel);
/* Candle Technical Analisys Layer */
/*
var candleTechnicalAnalisysChartLayer = newCandleTechnicalAnalisysChartLayer();
candleTechnicalAnalisysChartLayer.container.displacement.parentDisplacement = timelineChart.container.displacement;
candleTechnicalAnalisysChartLayer.container.zoom.parentZoom = timelineChart.container.zoom;
candleTechnicalAnalisysChartLayer.container.frame.parentFrame = timelineChart.container.frame;
candleTechnicalAnalisysChartLayer.container.parentContainer = timelineChart.container;
candleTechnicalAnalisysChartLayer.container.frame.width = timelineChart.container.frame.width * 1;
candleTechnicalAnalisysChartLayer.container.frame.height = timelineChart.container.frame.height * 1;
candleTechnicalAnalisysChartLayer.container.frame.position.x = timelineChart.container.frame.width / 2 - candleTechnicalAnalisysChartLayer.container.frame.width / 2;
candleTechnicalAnalisysChartLayer.container.frame.position.y = timelineChart.container.frame.height / 2 - candleTechnicalAnalisysChartLayer.container.frame.height / 2;
candleTechnicalAnalisysChartLayer.initialize(exchangeId, marketId, marketIndex, dailyFilesCursor, chartLayersPanel);
/* Volume Technical Analisys Layer */
/*
var volumeTechnicalAnalisysChartLayer = newVolumeTechnicalAnalisysChartLayer();
volumeTechnicalAnalisysChartLayer.container.displacement.parentDisplacement = timelineChart.container.displacement;
volumeTechnicalAnalisysChartLayer.container.zoom.parentZoom = timelineChart.container.zoom;
volumeTechnicalAnalisysChartLayer.container.frame.parentFrame = timelineChart.container.frame;
volumeTechnicalAnalisysChartLayer.container.parentContainer = timelineChart.container;
volumeTechnicalAnalisysChartLayer.container.frame.width = timelineChart.container.frame.width * 1;
volumeTechnicalAnalisysChartLayer.container.frame.height = timelineChart.container.frame.height * 1;
volumeTechnicalAnalisysChartLayer.container.frame.position.x = timelineChart.container.frame.width / 2 - volumeTechnicalAnalisysChartLayer.container.frame.width / 2;
volumeTechnicalAnalisysChartLayer.container.frame.position.y = timelineChart.container.frame.height / 2 - volumeTechnicalAnalisysChartLayer.container.frame.height / 2;
volumeTechnicalAnalisysChartLayer.initialize(exchangeId, marketId, marketIndex, dailyFilesCursor, chartLayersPanel);
/* Sopport Resistance Layer */
/*
var supportResistanceChartLayer = newSupportResistanceChartLayer();
supportResistanceChartLayer.container.displacement.parentDisplacement = timelineChart.container.displacement;
supportResistanceChartLayer.container.zoom.parentZoom = timelineChart.container.zoom;
supportResistanceChartLayer.container.frame.parentFrame = timelineChart.container.frame;
supportResistanceChartLayer.container.parentContainer = timelineChart.container;
supportResistanceChartLayer.container.frame.width = timelineChart.container.frame.width * 1;
supportResistanceChartLayer.container.frame.height = timelineChart.container.frame.height * 1;
supportResistanceChartLayer.container.frame.position.x = timelineChart.container.frame.width / 2 - supportResistanceChartLayer.container.frame.width / 2;
supportResistanceChartLayer.container.frame.position.y = timelineChart.container.frame.height / 2 - supportResistanceChartLayer.container.frame.height / 2;
supportResistanceChartLayer.initialize(exchangeId, marketId, marketIndex, dailyFilesCursor, chartLayersPanel);
/* High Low Layer */
/*
var highLowChartLayer = newHighLowChartLayer();
highLowChartLayer.container.displacement.parentDisplacement = timelineChart.container.displacement;
highLowChartLayer.container.zoom.parentZoom = timelineChart.container.zoom;
highLowChartLayer.container.frame.parentFrame = timelineChart.container.frame;
highLowChartLayer.container.parentContainer = timelineChart.container;
highLowChartLayer.container.frame.width = timelineChart.container.frame.width * 1;
highLowChartLayer.container.frame.height = timelineChart.container.frame.height * 1;
highLowChartLayer.container.frame.position.x = timelineChart.container.frame.width / 2 - highLowChartLayer.container.frame.width / 2;
highLowChartLayer.container.frame.position.y = timelineChart.container.frame.height / 2 - highLowChartLayer.container.frame.height / 2;
highLowChartLayer.initialize(exchangeId, marketId, marketIndex, dailyFilesCursor, chartLayersPanel);
/* Accumulated Volume Volume Layer */
/*
var accumulatedVolumeChartLayer = newAccumulatedVolumeChartLayer();
accumulatedVolumeChartLayer.container.displacement.parentDisplacement = timelineChart.container.displacement;
accumulatedVolumeChartLayer.container.zoom.parentZoom = timelineChart.container.zoom;
accumulatedVolumeChartLayer.container.frame.parentFrame = timelineChart.container.frame;
accumulatedVolumeChartLayer.container.parentContainer = timelineChart.container;
accumulatedVolumeChartLayer.container.frame.width = timelineChart.container.frame.width * 1;
accumulatedVolumeChartLayer.container.frame.height = timelineChart.container.frame.height * 1;
accumulatedVolumeChartLayer.container.frame.position.x = timelineChart.container.frame.width / 2 - accumulatedVolumeChartLayer.container.frame.width / 2;
accumulatedVolumeChartLayer.container.frame.position.y = timelineChart.container.frame.height / 2 - accumulatedVolumeChartLayer.container.frame.height / 2;
accumulatedVolumeChartLayer.initialize(exchangeId, marketId, marketIndex, dailyFilesCursor, chartLayersPanel);
/* Forecast Layer */
/*
var forecastChartLayer = newForecastChartLayer();
forecastChartLayer.container.displacement.parentDisplacement = timelineChart.container.displacement;
forecastChartLayer.container.zoom.parentZoom = timelineChart.container.zoom;
forecastChartLayer.container.frame.parentFrame = timelineChart.container.frame;
forecastChartLayer.container.parentContainer = timelineChart.container;
forecastChartLayer.container.frame.width = timelineChart.container.frame.width * 1;
forecastChartLayer.container.frame.height = timelineChart.container.frame.height * 1;
forecastChartLayer.container.frame.position.x = timelineChart.container.frame.width / 2 - forecastChartLayer.container.frame.width / 2;
forecastChartLayer.container.frame.position.y = timelineChart.container.frame.height / 2 - forecastChartLayer.container.frame.height / 2;
forecastChartLayer.initialize(exchangeId, marketId, marketIndex, dailyFilesCursor, chartLayersPanel);
// candleStickChartLayer.container.eventHandler.listenToEvent("Current Candle Changed", forecastChartLayer.setCurrentCandle);
// forecastChartLayer.setCurrentCandle(candleStickChartLayer.currentCandle);
/* Linear Regression Curve Layer */
/*
var linearRegressionCurveChartLayer = newLinearRegressionCurve();
linearRegressionCurveChartLayer.container.displacement.parentDisplacement = timelineChart.container.displacement;
linearRegressionCurveChartLayer.container.zoom.parentZoom = timelineChart.container.zoom;
linearRegressionCurveChartLayer.container.frame.parentFrame = timelineChart.container.frame;
linearRegressionCurveChartLayer.container.parentContainer = timelineChart.container;
linearRegressionCurveChartLayer.container.frame.width = timelineChart.container.frame.width * 1;
linearRegressionCurveChartLayer.container.frame.height = timelineChart.container.frame.height * 1;
linearRegressionCurveChartLayer.container.frame.position.x = timelineChart.container.frame.width / 2 - candleTechnicalAnalisysChartLayer.container.frame.width / 2;
linearRegressionCurveChartLayer.container.frame.position.y = timelineChart.container.frame.height / 2 - candleTechnicalAnalisysChartLayer.container.frame.height / 2;
linearRegressionCurveChartLayer.initialize(exchangeId, marketId, marketIndex, dailyFilesCursor, chartLayersPanel);
*/
function addLayers() {
timelineChart.layers.push(layerAAMastersAATomCandleStairs); // This looks better if it goes below the candles layer.
@@ -470,13 +293,13 @@ function newTimelineChart() {
/* Connecting all layers to the panel that provides a user interface to turn them on - visible - off */
chartLayersPanel.container.eventHandler.listenToEvent("Layer Status Changed", layerAAMastersAAOliviaCandlesticks.onLayerStatusChanged);
chartLayersPanel.container.eventHandler.listenToEvent("Layer Status Changed", layerAAMastersAAOliviaVolumes.onLayerStatusChanged);
botsPanel.container.eventHandler.listenToEvent("Layer Status Changed", layerAAMastersAAOliviaCandlesticks.onLayerStatusChanged);
botsPanel.container.eventHandler.listenToEvent("Layer Status Changed", layerAAMastersAAOliviaVolumes.onLayerStatusChanged);
chartLayersPanel.container.eventHandler.listenToEvent("Layer Status Changed", layerAAMastersAATomCandleStairs.onLayerStatusChanged);
chartLayersPanel.container.eventHandler.listenToEvent("Layer Status Changed", layerAAMastersAATomVolumeStairs.onLayerStatusChanged);
botsPanel.container.eventHandler.listenToEvent("Layer Status Changed", layerAAMastersAATomCandleStairs.onLayerStatusChanged);
botsPanel.container.eventHandler.listenToEvent("Layer Status Changed", layerAAMastersAATomVolumeStairs.onLayerStatusChanged);
chartLayersPanel.container.eventHandler.listenToEvent("Layer Status Changed", layerAAMastersAAMariamTradingHistory.onLayerStatusChanged);
botsPanel.container.eventHandler.listenToEvent("Layer Status Changed", layerAAMastersAAMariamTradingHistory.onLayerStatusChanged);
}
/* Add all layers to the internal array */
@@ -507,16 +330,16 @@ function newTimelineChart() {
/*
chartLayersPanel.container.eventHandler.listenToEvent("Layer Status Changed", accumulatedVolumeChartLayer.onLayerStatusChanged);
botsPanel.container.eventHandler.listenToEvent("Layer Status Changed", accumulatedVolumeChartLayer.onLayerStatusChanged);
chartLayersPanel.container.eventHandler.listenToEvent("Layer Status Changed", candleTechnicalAnalisysChartLayer.onLayerStatusChanged);
chartLayersPanel.container.eventHandler.listenToEvent("Layer Status Changed", highLowChartLayer.onLayerStatusChanged);
botsPanel.container.eventHandler.listenToEvent("Layer Status Changed", candleTechnicalAnalisysChartLayer.onLayerStatusChanged);
botsPanel.container.eventHandler.listenToEvent("Layer Status Changed", highLowChartLayer.onLayerStatusChanged);
chartLayersPanel.container.eventHandler.listenToEvent("Layer Status Changed", volumeTechnicalAnalisysChartLayer.onLayerStatusChanged);
chartLayersPanel.container.eventHandler.listenToEvent("Layer Status Changed", allTimeChartLayer.onLayerStatusChanged);
chartLayersPanel.container.eventHandler.listenToEvent("Layer Status Changed", forecastChartLayer.onLayerStatusChanged);
chartLayersPanel.container.eventHandler.listenToEvent("Layer Status Changed", orderBooksChartLayer.onLayerStatusChanged);
chartLayersPanel.container.eventHandler.listenToEvent("Layer Status Changed", linearRegressionCurveChartLayer.onLayerStatusChanged);
botsPanel.container.eventHandler.listenToEvent("Layer Status Changed", volumeTechnicalAnalisysChartLayer.onLayerStatusChanged);
botsPanel.container.eventHandler.listenToEvent("Layer Status Changed", allTimeChartLayer.onLayerStatusChanged);
botsPanel.container.eventHandler.listenToEvent("Layer Status Changed", forecastChartLayer.onLayerStatusChanged);
botsPanel.container.eventHandler.listenToEvent("Layer Status Changed", orderBooksChartLayer.onLayerStatusChanged);
botsPanel.container.eventHandler.listenToEvent("Layer Status Changed", linearRegressionCurveChartLayer.onLayerStatusChanged);
*/
}
+509
View File
@@ -0,0 +1,509 @@
{
"devTeams": [
{
"codeName": "AAMasters",
"displayName": "Advanced Algos Masters",
"organization": {
"name": "AAMasters",
"type": "Open Source Community",
"displayName": "AA Masters",
"location": "Global",
"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": [
{
"codeName": "AAOlivia",
"displayName": "Olivia",
"type": "Indicator",
"version": {
"number": "1.0.0",
"status": "Mantained"
},
"products": [
{
"codeName": "Market 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": [
{
"codeName": "Market Candlesticks",
"displayName": "Candlesticks",
"exchangeList": [ "Poloniex" ],
"validPeriods": [ "24-hs", "12-hs", "08-hs", "06-hs", "04-hs", "03-hs", "02-hs", "01-hs" ],
"plotter": {
"devTeam": "AAMasters",
"repo": "Plotters-Candles-Volumes",
"moduleName": "Candles"
}
}
]
},
{
"codeName": "Market 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/Volumes/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": [
{
"codeName": "Market Volumes",
"displayName": "Volumes",
"exchangeList": [ "Poloniex" ],
"validPeriods": [ "24-hs", "12-hs", "08-hs", "06-hs", "04-hs", "03-hs", "02-hs", "01-hs" ],
"plotter": {
"devTeam": "AAMasters",
"repo": "Plotters-Candles-Volumes",
"moduleName": "Volumes"
}
}
]
},
{
"codeName": "Daily Candles",
"displayName": "Daily 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-Daily/@Period/@Year/@Month/@Day",
"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": [
{
"codeName": "Daily Candlesticks",
"displayName": "Candlesticks",
"exchangeList": [ "Poloniex" ],
"validPeriods": [ "45-min", "40-min", "30-min", "20-min", "15-min", "10-min", "05-min", "04-min", "03-min", "02-min", "01-min" ],
"plotter": {
"devTeam": "AAMasters",
"repo": "Plotters-Candles-Volumes",
"moduleName": "Candlesticks"
}
}
]
},
{
"codeName": "Daily Volumes",
"displayName": "Daily Volumes per Period",
"description": "A set of files per period that contains all volumes of one whole market.",
"storageAccount": "aaolivia",
"filePath": "@Exchange/Output/Volumes/Multi-Period-Daily/@Period/@Year/@Month/@Day",
"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": [
{
"codeName": "Daily Volumes",
"displayName": "Volumes",
"exchangeList": [ "Poloniex" ],
"validPeriods": [ "45-min", "40-min", "30-min", "20-min", "15-min", "10-min", "05-min", "04-min", "03-min", "02-min", "01-min" ],
"plotter": {
"devTeam": "AAMasters",
"repo": "Plotters-Candles-Volumes",
"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"
}
},
{
"codeName": "AATom",
"displayName": "Tom",
"type": "Indicator",
"version": {
"number": "1.0.0",
"status": "Mantained"
},
"products": [
{
"codeName": "Market Candle-Stairs",
"displayName": "Market Candle-Stairs per Period",
"description": "A set of files per period that contains all candle-stairs of one whole market.",
"storageAccount": "aatom",
"filePath": "@Exchange/Tom/dataSet.V1/Output/Candle-Stairs/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": [
{
"codeName": "Market Candle-Stairs",
"displayName": "Candle-Stairs",
"exchangeList": [ "Poloniex" ],
"validPeriods": [ "24-hs", "12-hs", "08-hs", "06-hs", "04-hs", "03-hs", "02-hs", "01-hs" ],
"plotter": {
"devTeam": "AAMasters",
"repo": "Plotters-Stairs-Patterns",
"moduleName": "CandleStairs"
}
}
]
},
{
"codeName": "Market Volume-Stairs",
"displayName": "Market Volume-Stairs per Period",
"description": "A set of files per period that contains all volume-stairs of one whole market.",
"storageAccount": "aaolivia",
"filePath": "@Exchange/Tom/dataSet.V1/Output/Volume-Stairs/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": [
{
"codeName": "Market Volume-Stairs",
"displayName": "Volume-Stairs",
"exchangeList": [ "Poloniex" ],
"validPeriods": [ "24-hs", "12-hs", "08-hs", "06-hs", "04-hs", "03-hs", "02-hs", "01-hs" ],
"plotter": {
"devTeam": "AAMasters",
"repo": "Plotters-Stairs-Patterns",
"moduleName": "VolumeStairs"
}
}
]
},
{
"codeName": "Daily Candle-Stairs",
"displayName": "Daily Candle-Stairs per Period",
"description": "A set of files per period that contains all candle-stairs of one whole market.",
"storageAccount": "aatom",
"filePath": "@Exchange/Tom/dataSet.V1/Output/Candle-Stairs/Multi-Period-Daily/@Period/@Year/@Month/@Day",
"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": [
{
"codeName": "Daily Candle-Stairs",
"displayName": "Candle-Stairs",
"exchangeList": [ "Poloniex" ],
"validPeriods": [ "45-min", "40-min", "30-min", "20-min", "15-min", "10-min", "05-min", "04-min", "03-min", "02-min", "01-min" ],
"plotter": {
"devTeam": "AAMasters",
"repo": "Plotters-Stairs-Patterns",
"moduleName": "CandleStairs"
}
}
]
},
{
"codeName": "Daily Volume-Stairs",
"displayName": "Daily Volume-Stairs per Period",
"description": "A set of files per period that contains all volume-stairs of one whole market.",
"storageAccount": "aaotom",
"filePath": "@Exchange/Tom/dataSet.V1/Output/Volume-Stairs/Multi-Period-Daily/@Period/@Year/@Month/@Day",
"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": [
{
"codeName": "Daily Volume-Stairs",
"displayName": "Volume-Stairs",
"exchangeList": [ "Poloniex" ],
"validPeriods": [ "45-min", "40-min", "30-min", "20-min", "15-min", "10-min", "05-min", "04-min", "03-min", "02-min", "01-min" ],
"plotter": {
"devTeam": "AAMasters",
"repo": "Plotters-Stairs-Patterns",
"moduleName": "VolumeStairs"
}
}
]
}
],
"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-31T19:28:33Z&st=2018-02-22T11:28:33Z&spr=https&sig=YaprSp9zO%2Fsz0nPPWwPMqPACxZTnYhSWKApfun%2Bfez4%3D",
"fileUri": "https://aatom.file.core.windows.net"
}
},
{
"codeName": "AAMariam",
"displayName": "Mariam",
"type": "Trading",
"version": {
"number": "1.0.0",
"status": "Mantained"
},
"products": [
{
"codeName": "Trading History",
"displayName": "Mariam Trading History",
"description": "General information about Mariam trading history.",
"storageAccount": "aamariam",
"filePath": "@Exchange/Mariam/dataSet.V1/Output/Trading-Process",
"fileName": "Execution.History.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": [
{
"codeName": "Trading History",
"displayName": "Mariam Trading History",
"exchangeList": [ "Poloniex" ],
"validPeriods": [ "24-hs", "12-hs", "08-hs", "06-hs", "04-hs", "03-hs", "02-hs", "01-hs" ],
"plotter": {
"devTeam": "AAMasters",
"repo": "Plotters-Trading",
"moduleName": "History"
}
}
]
},
{
"codeName": "Trading Details",
"displayName": "Mariam Trading Details",
"description": "Detailed information about Mariam execution.",
"storageAccount": "aamariam",
"filePath": "@Exchange/Mariam/dataSet.V1/Output/Trading-Process//@Year/@Month/@Day/@Hour/@Minute",
"fileName": "Execution.Context.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": [
{
"codeName": "Trading Details",
"displayName": "Mariam Trading Details",
"exchangeList": [ "Poloniex" ],
"validPeriods": [ "24-hs", "12-hs", "08-hs", "06-hs", "04-hs", "03-hs", "02-hs", "01-hs" ],
"plotter": {
"devTeam": "AAMasters",
"repo": "Plotters-Trading",
"moduleName": "Details"
}
}
]
}
],
"processes": {
"process": [
{
"name": "Trading-Process",
"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-07-29&ss=f&srt=sco&sp=r&se=2018-12-30T23:44:52Z&st=2018-02-25T15:44:52Z&spr=https&sig=0pzOTcVAAOkgH7C4KmA1Rbs15kyjvVC1XFCsLQYjXKU%3D",
"fileUri": "https://aamariam.file.core.windows.net"
}
}
],
"plotters": [
{
"description": "Plots traditional red and green candles.",
"repo": "Plotters-Candles-Volumes",
"moduleName": "Candles",
"target": "Timeline"
},
{
"description": "Plots volumes separated in buy and sell.",
"repo": "Plotters-Candles-Volumes",
"moduleName": "Volumes",
"target": "Timeline"
},
{
"description": "Plots Candle Stairs patterns.",
"repo": "Plotters-Stairs-Patterns",
"moduleName": "CandleStairs",
"target": "Timeline"
},
{
"description": "Plots Volume Stairs patterns.",
"repo": "Plotters-Stairs-Patterns",
"moduleName": "VolumeStairs",
"target": "Timeline"
},
{
"description": "Plots a trading history.",
"repo": "Plotters-Trading",
"moduleName": "History",
"target": "Timeline"
},
{
"description": "Plots trading decitions in an easy to understand way.",
"repo": "Plotters-Trading",
"moduleName": "Details",
"target": "Timeline"
}
]
}
]
}
+4 -9
View File
@@ -4,15 +4,10 @@
<meta charset="utf-8" />
<title>Advanced Algos</title>
<script type="text/javascript" src="AAMasters/AAOlivia/Candles.js"></script>
<script type="text/javascript" src="AAMasters/AAOlivia/Volumes.js"></script>
<script type="text/javascript" src="AAMasters/AATom/CandleStairs.js"></script>
<script type="text/javascript" src="AAMasters/AATom/VolumeStairs.js"></script>
<script type="text/javascript" src="AAMasters/AAMariam/History.js"></script>
<script type="text/javascript" src="AAMasters/AAMariam/Details.js"></script>
<!--Plotters-->
<script type="text/javascript" src="Plotters.js"></script>
<script type="text/javascript" src="BotCard.js"></script>
<script type="text/javascript" src="Ecosystem.js"></script>
<script type="text/javascript" src="File.js"></script>
<script type="text/javascript" src="FileServer.js"></script>
@@ -69,7 +64,7 @@
<script type="text/javascript" src="Panels/ControlPanel.js"></script>
<script type="text/javascript" src="Panels/ChartLayersPanel.js"></script>
<script type="text/javascript" src="Panels/BotsLayersPanel.js"></script>
<script type="text/javascript" src="Panels/BotsPanel.js"></script>
<script type="text/javascript" src="Panels/CurrentCandlePanel.js"></script>
<script type="text/javascript" src="Panels/CurrentVolumePanel.js"></script>
<script type="text/javascript" src="Panels/OrderBookPanel.js"></script>
+214 -206
View File
@@ -2,44 +2,59 @@
const MODULE_NAME = "Node Server";
const START_BROWSER_APP = true;
/*
const octokit = require('@octokit/rest')()
global.atob = require("atob");
let owner = "AAMasters";
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/Interval.js";
octokit.repos.getContent({ owner, repo, path, ref }, onContent);
function onContent (error, result) {
let decoded = atob(result.data.content);
console.log(decoded.substring(3));
console.log(result);
}
return;
*/
let debugMode = true;
let debugMode = true; // This forces the server to read Plotters from the local drive.
let githubPages = new Map;
let ecosystem;
let ecosystemObject;
//'use strict';
var http = require('http');
var port = process.env.PORT || 1337;
startHtttpServer();
initialize();
function onRequestReceivedFromBrowser(request, response) {
function initialize() {
let fs = require('fs');
try {
let fileName = 'ecosystem.json';
fs.readFile(fileName, onFileRead);
function onFileRead(err, file) {
try {
ecosystem = file.toString();
ecosystem = ecosystem.trim(); // remove first byte with some encoding.
ecosystemObject = JSON.parse(ecosystem);
startHtttpServer();
}
catch (err) {
console.log("File Not Found: " + fileName + " or Error = " + err);
}
}
}
catch (err) {
console.log(err);
}
}
function startHtttpServer() {
if (START_BROWSER_APP === true) {
try {
gWebServer = http.createServer(onBrowserRequest).listen(port);
}
catch (err) {
console.log(err);
}
}
}
function onBrowserRequest(request, response) {
var htmlResponse;
var requestParameters = request.url.split("/");
@@ -47,16 +62,115 @@ function onRequestReceivedFromBrowser(request, response) {
switch (requestParameters[1]) {
case "AAMasters":
case "Plotters.js":
{
let fs = require('fs');
try {
let fileName = 'Plotters.js';
fs.readFile(fileName, onFileRead);
function onFileRead(err, file) {
try {
let fileContent = file.toString();
/* This is the string we will use to insert into the Plotters.js script. */
let caseString = '' +
' case "@newFunctionName@":' + '\n' +
' {' + '\n' +
' plotter = newPlotterName();' + '\n' +
' }' + '\n' +
' break;' + '\n' + '\n'
let devTeams = ecosystemObject.devTeams;
for (let i = 0; i < devTeams.length; i++) {
let devTeam = devTeams[i];
for (let j = 0; j < devTeam.plotters.length; j++) {
let plotter = devTeam.plotters[j];
/* Now each of these layers has a plotter that we need to define on the Plotter.js file. */
let caseStringCopy = caseString;
let newFunctionName = devTeam.codeName + plotter.repo + plotter.moduleName;
newFunctionName = newFunctionName.replace(/-/g, "");
let stringToInsert;
stringToInsert = caseStringCopy.replace('@newFunctionName@', newFunctionName);
stringToInsert = stringToInsert.replace('newPlotterName', 'new' + newFunctionName);
let firstPart = fileContent.substring(0,fileContent.indexOf('// Cases'));
let secondPart = fileContent.substring(fileContent.indexOf('// Cases'));
fileContent = firstPart + stringToInsert + secondPart;
}
}
respondWithContent(fileContent, response);
}
catch (err) {
console.log("File Not Found: " + fileName + " or Error = " + err);
}
}
}
catch (err) {
console.log(err);
}
}
break;
case "Ecosystem.js":
{
let fs = require('fs');
try {
let fileName = 'Ecosystem.js';
fs.readFile(fileName, onFileRead);
function onFileRead(err, file) {
try {
let fileContent = file.toString();
let trimmedEcosystem = ecosystem.trim();
fileContent = fileContent.replace('"@ecosystem.json@"', trimmedEcosystem);
respondWithContent(fileContent, response);
}
catch (err) {
console.log("File Not Found: " + fileName);
}
}
}
catch (err) {
console.log(err);
}
}
break;
case "Plotters": // This means the plotter folder, not to be confused with the Plotters script!
{
if (debugMode === true) {
respondWithFile('../' + requestParameters[2] + "-Plotter" + '/' + requestParameters[3], response);
respondWithFile('../Plotters/' + requestParameters[2] + '/' + requestParameters[3] + '/' + requestParameters[4], response);
} else {
let cacheVersion = githubPages.get(requestParameters[1] + requestParameters[2] + requestParameters[3])
let cacheVersion = githubPages.get(requestParameters[2] + requestParameters[3] + requestParameters[4])
if (cacheVersion !== undefined) {
@@ -67,13 +181,13 @@ function onRequestReceivedFromBrowser(request, response) {
const octokit = require('@octokit/rest')()
global.atob = require("atob");
let owner = requestParameters[1];
let repo = requestParameters[2] + "-Plotter";
let owner = requestParameters[2];
let repo = requestParameters[3];
let branch = "master";
let page = 1;
let per_page = 100;
let ref = "master";
let path = requestParameters[3];
let path = requestParameters[4];
octokit.repos.getContent({ owner, repo, path, ref }, onContent);
@@ -85,7 +199,7 @@ function onRequestReceivedFromBrowser(request, response) {
respondWithContent(cleanString, response);
githubPages.set(requestParameters[1] + requestParameters[2] + requestParameters[3], cleanString);
githubPages.set(requestParameters[2] + requestParameters[3] + requestParameters[4], cleanString);
}
}
@@ -129,162 +243,71 @@ function onRequestReceivedFromBrowser(request, response) {
}
break;
case "lastTrades":
{
const marketId = requestParameters[2];
const exchangeId = requestParameters[3];
const sqlQuery = "SELECT TOP 100000 "
+ " InternalExchangeTradeId AS Id, "
+ " Type, "
+ " Rate, "
+ " AmountAssetA AS AmountA, "
+ " AmountAssetB AS AmountB, "
+ " Timestamp "
+ " FROM Trades "
+ " WHERE "
+ " IdMarket = " + marketId + " "
+ " AND "
+ " IdExchange = " + exchangeId + " "
+ " ORDER BY IdExchange ASC, IdMarket ASC, InternalExchangeTradeId DESC"
;
////console.log("About to execute: " + sqlQuery);
/* Then we execute the query */
database.executeSQL(sqlQuery, function (err, resultSet) {
//console.log("Query executed: " + sqlQuery);
var myJsonString = JSON.stringify(resultSet);
////console.log(myJsonString);
response.writeHead(200, { 'Content-Type': 'text/plain' });
response.write(myJsonString);
response.end("\n");
}
);
}
break;
case "trades":
{
const marketId = requestParameters[2];
const exchangeId = requestParameters[3];
const idBegin = unescape(requestParameters[4]);
const idEnd = unescape(requestParameters[5]);
const sqlQuery = "SELECT "
+ " InternalExchangeTradeId AS Id, "
+ " Type, "
+ " Rate, "
+ " AmountAssetA AS AmountA, "
+ " AmountAssetB AS AmountB, "
+ " Timestamp "
+ " FROM Trades "
+ " WHERE "
+ " IdExchange = " + exchangeId + " "
+ " AND "
+ " IdMarket = " + marketId + " "
+ " AND "
+ " InternalExchangeTradeId >= " + idBegin + " "
+ " AND "
+ " InternalExchangeTradeId <= " + idEnd + " "
+ " ORDER BY IdExchange, IdMarket, InternalExchangeTradeId "
;
let records = idEnd - idBegin;
console.log("Records Requested: " + records + " idBegin = " + idBegin + " idEnd = " + idEnd);
/* Then we execute the query */
database.executeSQL(sqlQuery, function (err, resultSet) {
//console.log("Query executed: " + sqlQuery);
var myJsonString = JSON.stringify(resultSet);
////console.log(myJsonString);
response.writeHead(200, { 'Content-Type': 'text/plain' });
response.write(myJsonString);
response.end("\n");
}
);
}
break;
case "orderbook":
{
const marketId = requestParameters[2];
const datetimeBegin = unescape(requestParameters[3]);
const datetimeEnd = unescape(requestParameters[4]);
var sqlQuery = "SELECT "
+ " Id, "
+ " Rate, "
+ " Amount * Rate AS AmountA, "
+ " Amount AS AmountB, "
+ " Type AS Type, "
+ " DatetimeIn AS DatetimeIn, "
+ " ISNULL(DatetimeOut, '3000-01-01') AS DatetimeOut "
+ " FROM OrderBooks "
+ " WHERE "
+ " ( "
+ " IdMarket = " + marketId + " "
+ " ) "
+ " AND "
+ " ( "
+ " DatetimeIn <= '" + datetimeEnd + "' "
+ " ) "
+ " AND "
+ " ( "
+ " ISNULL(DatetimeOut, '3000-01-01') > '" + datetimeBegin + "' "
+ " ) "
;
//console.log(sqlQuery);
/* Then we execute the query */
database.executeSQL(sqlQuery, function (err, resultSet) {
var myJsonString = JSON.stringify(resultSet);
//console.log(myJsonString);
response.writeHead(200, { 'Content-Type': 'text/plain' });
response.write(myJsonString);
response.end("\n");
}
);
}
break;
default:
////console.log("Unknown request received from the browser: " + request.url);
if (requestParameters[1] === "") {
requestParameters[1] = "index.html";
let fs = require('fs');
try {
let fileName = 'index.html';
fs.readFile(fileName, onFileRead);
function onFileRead(err, file) {
try {
let fileContent = file.toString();
/* This is the string we will use to insert into the Plotters.js script. */
let htmlLine = '' + '\n' +
' <script type="text/javascript" src="Plotters/@devTeam@/@repo@/@module@.js"></script>'
let devTeams = ecosystemObject.devTeams;
for (let i = 0; i < devTeams.length; i++) {
let devTeam = devTeams[i];
for (let j = 0; j < devTeam.plotters.length; j++) {
let plotter = devTeam.plotters[j];
/* Now each of these layers has a plotter that we need to define on the Plotter.js file. */
let htmlLineCopy = htmlLine;
let stringToInsert;
stringToInsert = htmlLineCopy.replace('@devTeam@', devTeam.codeName);
stringToInsert = stringToInsert.replace('@repo@', plotter.repo);
stringToInsert = stringToInsert.replace('@module@', plotter.moduleName);
let firstPart = fileContent.substring(0, fileContent.indexOf('<!--Plotters-->') + 15);
let secondPart = fileContent.substring(fileContent.indexOf('<!--Plotters-->') + 15);
fileContent = firstPart + stringToInsert + secondPart;
}
}
respondWithContent(fileContent, response);
}
catch (err) {
console.log("File Not Found: " + fileName + " or Error = " + err);
}
}
}
catch (err) {
console.log(err);
}
} else {
respondWithFile("" + requestParameters[1], response);
}
respondWithFile("" + requestParameters[1], response);
}
function sendResponseToBrowser(htmlResponse) {
@@ -295,7 +318,6 @@ function onRequestReceivedFromBrowser(request, response) {
}
}
function respondWithContent(content, response) {
try {
@@ -308,7 +330,7 @@ function respondWithContent(content, response) {
response.writeHead(200, { 'Content-Type': 'text/html' });
response.write(content);
response.end("\n");
console.log("Content Sent: " + content);
//console.log("Content Sent: " + content);
}
catch (err) {
@@ -316,8 +338,6 @@ function respondWithContent(content, response) {
}
}
function respondWithFile(fileName, response) {
let fs = require('fs');
@@ -338,7 +358,7 @@ function respondWithFile(fileName, response) {
response.writeHead(200, { 'Content-Type': 'text/html' });
response.write(htmlResponse);
response.end("\n");
console.log("File Sent: " + fileName);
//console.log("File Sent: " + fileName);
//
}
catch (err) {
@@ -365,18 +385,6 @@ function respondWithFile(fileName, response) {
}
}
function startHtttpServer() {
if (START_BROWSER_APP === true) {
try {
gWebServer = http.createServer(onRequestReceivedFromBrowser).listen(port);
}
catch (err) {
console.log(err);
}
}
}