Fix: Analytics Worker berechnet jetzt alle Tabellen pro Tag
Some checks failed
Deployment / deploy-docker (push) Has been cancelled
Some checks failed
Deployment / deploy-docker (push) Has been cancelled
This commit is contained in:
@@ -267,8 +267,43 @@
|
|||||||
const data = res.dataset || [];
|
const data = res.dataset || [];
|
||||||
const columns = res.columns || [];
|
const columns = res.columns || [];
|
||||||
|
|
||||||
|
console.log('Moving Average API Response:', {
|
||||||
|
dataLength: data.length,
|
||||||
|
columns: columns.map(c => c.name),
|
||||||
|
firstRow: data[0]
|
||||||
|
});
|
||||||
|
|
||||||
if (!data.length) {
|
if (!data.length) {
|
||||||
console.log('No moving average data available');
|
console.warn('No moving average data available - analytics_exchange_daily table may be empty');
|
||||||
|
// Zeige leere Graphen mit "Keine Daten" Meldung
|
||||||
|
const exchangeGroups = {
|
||||||
|
'EIX': { canvasId: 'maChartEIX' },
|
||||||
|
'LS': { canvasId: 'maChartLS' },
|
||||||
|
'GETTEX': { canvasId: 'maChartGETTEX' },
|
||||||
|
'XETRA': { canvasId: 'maChartXETRA' },
|
||||||
|
'FRA': { canvasId: 'maChartFRA' },
|
||||||
|
'STU': { canvasId: 'maChartSTU' },
|
||||||
|
'QUOTRIX': { canvasId: 'maChartQUOTRIX' }
|
||||||
|
};
|
||||||
|
Object.values(exchangeGroups).forEach(config => {
|
||||||
|
const canvas = document.getElementById(config.canvasId);
|
||||||
|
if (canvas) {
|
||||||
|
const ctx = canvas.getContext('2d');
|
||||||
|
if (charts[config.canvasId]) charts[config.canvasId].destroy();
|
||||||
|
charts[config.canvasId] = new Chart(ctx, {
|
||||||
|
type: 'line',
|
||||||
|
data: { labels: [], datasets: [] },
|
||||||
|
options: {
|
||||||
|
responsive: true,
|
||||||
|
maintainAspectRatio: false,
|
||||||
|
plugins: {
|
||||||
|
legend: { display: false },
|
||||||
|
title: { display: true, text: 'Keine Daten verfügbar' }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -277,6 +312,11 @@
|
|||||||
const countIdx = columns.findIndex(c => c.name === 'trade_count');
|
const countIdx = columns.findIndex(c => c.name === 'trade_count');
|
||||||
const volumeIdx = columns.findIndex(c => c.name === 'volume');
|
const volumeIdx = columns.findIndex(c => c.name === 'volume');
|
||||||
|
|
||||||
|
if (dateIdx === -1 || exchangeIdx === -1 || countIdx === -1 || volumeIdx === -1) {
|
||||||
|
console.error('Missing required columns:', { dateIdx, exchangeIdx, countIdx, volumeIdx, columns });
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// Alle Exchanges mit Canvas-IDs definieren
|
// Alle Exchanges mit Canvas-IDs definieren
|
||||||
const exchangeGroups = {
|
const exchangeGroups = {
|
||||||
'EIX': { exchanges: ['EIX'], canvasId: 'maChartEIX' },
|
'EIX': { exchanges: ['EIX'], canvasId: 'maChartEIX' },
|
||||||
@@ -289,7 +329,18 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Alle Daten nach Datum sortieren
|
// Alle Daten nach Datum sortieren
|
||||||
const dates = [...new Set(data.map(r => r[dateIdx]))].sort();
|
const dates = [...new Set(data.map(r => {
|
||||||
|
const dateVal = r[dateIdx];
|
||||||
|
// Handle timestamp format (could be string or number)
|
||||||
|
if (typeof dateVal === 'string') {
|
||||||
|
return dateVal.split('T')[0]; // Extract date part
|
||||||
|
} else if (typeof dateVal === 'number') {
|
||||||
|
return new Date(dateVal / 1000).toISOString().split('T')[0];
|
||||||
|
}
|
||||||
|
return dateVal;
|
||||||
|
}))].sort();
|
||||||
|
|
||||||
|
console.log('Processed dates:', dates.slice(0, 5), '...', dates.slice(-5));
|
||||||
|
|
||||||
// Moving Average berechnen (7-Tage gleitender Durchschnitt)
|
// Moving Average berechnen (7-Tage gleitender Durchschnitt)
|
||||||
const maWindow = 7;
|
const maWindow = 7;
|
||||||
@@ -320,16 +371,30 @@
|
|||||||
dates.forEach(date => {
|
dates.forEach(date => {
|
||||||
const dayRows = data.filter(r => {
|
const dayRows = data.filter(r => {
|
||||||
const exchange = r[exchangeIdx];
|
const exchange = r[exchangeIdx];
|
||||||
return r[dateIdx] === date && config.exchanges.includes(exchange);
|
const rowDate = r[dateIdx];
|
||||||
|
let rowDateStr = rowDate;
|
||||||
|
if (typeof rowDate === 'string') {
|
||||||
|
rowDateStr = rowDate.split('T')[0];
|
||||||
|
} else if (typeof rowDate === 'number') {
|
||||||
|
rowDateStr = new Date(rowDate / 1000).toISOString().split('T')[0];
|
||||||
|
}
|
||||||
|
return rowDateStr === date && config.exchanges.includes(exchange);
|
||||||
});
|
});
|
||||||
groupData[date] = {
|
groupData[date] = {
|
||||||
tradeCount: dayRows.reduce((sum, r) => sum + (r[countIdx] || 0), 0),
|
tradeCount: dayRows.reduce((sum, r) => sum + (parseFloat(r[countIdx]) || 0), 0),
|
||||||
volume: dayRows.reduce((sum, r) => sum + (r[volumeIdx] || 0), 0)
|
volume: dayRows.reduce((sum, r) => sum + (parseFloat(r[volumeIdx]) || 0), 0)
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
const tradeData = dates.map(d => groupData[d]?.tradeCount || 0);
|
const tradeData = dates.map(d => groupData[d]?.tradeCount || 0);
|
||||||
const volumeData = dates.map(d => groupData[d]?.volume || 0);
|
const volumeData = dates.map(d => groupData[d]?.volume || 0);
|
||||||
|
|
||||||
|
console.log(`${groupName} data:`, {
|
||||||
|
dates: dates.length,
|
||||||
|
tradeData: tradeData.slice(0, 5),
|
||||||
|
volumeData: volumeData.slice(0, 5)
|
||||||
|
});
|
||||||
|
|
||||||
const maTradeData = calculateMA(tradeData, maWindow);
|
const maTradeData = calculateMA(tradeData, maWindow);
|
||||||
const maVolumeData = calculateMA(volumeData, maWindow);
|
const maVolumeData = calculateMA(volumeData, maWindow);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user