vyladeni batch header

This commit is contained in:
David Brazda
2023-11-24 21:51:33 +01:00
parent e31f44bb8e
commit 6cd7368f00
3 changed files with 92 additions and 29 deletions

View File

@ -809,7 +809,7 @@ def populate_metrics_output_directory(strat: StrategyInstance, inter_batch_param
rp_string = "RP" + str(float(np.sum(strat.state.rel_profit_cum))) if len(strat.state.rel_profit_cum) >0 else "noRP" rp_string = "RP" + str(float(np.sum(strat.state.rel_profit_cum))) if len(strat.state.rel_profit_cum) >0 else "noRP"
##summary pro rychle zobrazeni P333L-222 PT9:30 PL10:30 ##summary pro rychle zobrazeni P333L-222 PT9:30 PL10:30
res["profit"]["sum"]="P"+str(int(sum_wins))+"L"+str(int(sum_losses))+" "+"MCP"+str(int(max_profit))+"MCL(DD)"+str(int(max_loss))+" "+ mpt_string+" " + mlt_string + rp_string + " "+str(strat.state.rel_profit_cum) res["profit"]["sum"]="P"+str(int(sum_wins))+"L"+str(int(sum_losses))+" "+"MP"+str(int(max_profit))+"ML"+str(int(max_loss))+" "+ mpt_string+" " + mlt_string + rp_string + " "+str(strat.state.rel_profit_cum)
#rel_profit zprumerovane #rel_profit zprumerovane
res["profit"]["daily_rel_profit_sum"] = float(np.sum(strat.state.rel_profit_cum)) if len(strat.state.rel_profit_cum) > 0 else 0 res["profit"]["daily_rel_profit_sum"] = float(np.sum(strat.state.rel_profit_cum)) if len(strat.state.rel_profit_cum) > 0 else 0

View File

@ -2,6 +2,7 @@
let editor_diff_arch1 let editor_diff_arch1
let editor_diff_arch2 let editor_diff_arch2
var archData = null var archData = null
var batchHeaders = []
function refresh_arch_and_callback(row, callback) { function refresh_arch_and_callback(row, callback) {
//console.log("entering refresh") //console.log("entering refresh")
@ -954,7 +955,7 @@ var archiveRecords =
{data: 'metrics', visible: true}, {data: 'metrics', visible: true},
{data: 'batch_id', visible: true}, {data: 'batch_id', visible: true},
], ],
paging: false, paging: true,
processing: true, processing: true,
serverSide: true, serverSide: true,
columnDefs: [{ columnDefs: [{
@ -1126,40 +1127,75 @@ var archiveRecords =
// Add row grouping based on 'batch_id' // Add row grouping based on 'batch_id'
rowGroup: { rowGroup: {
dataSrc: 'batch_id', dataSrc: 'batch_id',
//toto je volano pri renderovani groupy
startRender: function (rows, group) { startRender: function (rows, group) {
var groupId = group ? group : 'no-batch-id'; var groupId = group ? group : 'no-batch-id';
// Initialize variables for the group // Initialize variables for the group
var itemCount = 0; var itemCount = 0;
var firstNote = ''; var period = '';
var profit = ''; var profit = '';
var started = null;
// // Process each item only once
// archiveRecords.rows({ search: 'applied' }).every(function (rowIdx, tableLoop, rowLoop) {
// var data = this.data();
// Process each item only once // if ((group && data.batch_id == group)) {
archiveRecords.rows({ search: 'applied' }).every(function (rowIdx, tableLoop, rowLoop) { // itemCount++;
var data = this.data(); // if (itemCount === 1 ) {
// firstNote = data.note ? data.note.substring(0, 14) : '';
if ((group && data.batch_id === group)) {
itemCount++; // if (data.note) {
if (itemCount === 1) { // better_counter = extractNumbersFromString(data.note);
firstNote = data.note ? data.note.substring(0, 14) : ''; // }
try { // try {
profit = data.metrics.profit.batch_sum_profit; // profit = data.metrics.profit.batch_sum_profit;
} catch (e) { // } catch (e) {
profit = 'N/A'; // profit = 'N/A';
} // }
} // }
// }
// });
//pokud mame batch_id podivame se zda jeho nastaveni uz nema a pokud ano pouzijeme to
//pokud nemame tak si ho loadneme
if (group) {
const existingBatch = batchHeaders.find(batch => batch.batch_id == group);
var firstRowData = rows.data()[0];
//jeste neni v poli batchu - udelame hlavicku
if (!existingBatch) {
itemCount = extractNumbersFromString(firstRowData.note);
profit = firstRowData.metrics.profit.batch_sum_profit;
period = firstRowData.note ? firstRowData.note.substring(0, 14) : '';
started = firstRowData.started
var newBatchHeader = {batch_id:group, profit:profit, itemCount:itemCount, period:period, started:started}
batchHeaders.push(newBatchHeader)
} }
}); //uz je v poli, ale mame novejsi (pribyl v ramci backtestu napr.) - updatujeme
else if (new Date(existingBatch.started) < new Date(firstRowData.started)) {
itemCount = extractNumbersFromString(firstRowData.note);
profit = firstRowData.metrics.profit.batch_sum_profit;
period = firstRowData.note ? firstRowData.note.substring(0, 14) : '';
started = firstRowData.started
existingBatch.itemCount = itemCount;
existingBatch.profit = profit;
existingBatch.period = period;
existingBatch.started = started;
}
//uz je v poli batchu vytahneme
else {
profit = existingBatch.profit
itemCount = existingBatch.itemCount
period = existingBatch.period
started = existingBatch.started
}
}
// Construct the group header // Construct the group header
var groupHeaderContent = '<strong>' + (group ? 'Batch ID: ' + group : 'No Batch') + '</strong>'; var groupHeaderContent = '<strong>' + (group ? 'Batch ID: ' + group : 'No Batch') + '</strong>';
groupHeaderContent += (group ? ' <span>(' + itemCount + ')</span>' : ''); groupHeaderContent += (group ? ' <span class="batchheader-count-info">(' + itemCount + ')</span>' + ' <span class="batchheader-period-info">' + period + '</span> <span class="batchheader-profit-info">Profit: ' + profit + '</span>' : '');
if (firstNote) {
groupHeaderContent += ' ' + firstNote;
}
if (profit) {
groupHeaderContent += ' - <span class="profit-info">Profit: ' + profit + '</span>';
}
return $('<tr/>') return $('<tr/>')
.append('<td colspan="18">' + groupHeaderContent + '</td>') .append('<td colspan="18">' + groupHeaderContent + '</td>')
@ -1171,7 +1207,6 @@ var archiveRecords =
var api = this.api(); var api = this.api();
var rows = api.rows({ page: 'current' }).nodes(); var rows = api.rows({ page: 'current' }).nodes();
// Iterate over all rows in the current page // Iterate over all rows in the current page
api.column(17, { page: 'current' }).data().each(function (group, i) { api.column(17, { page: 'current' }).data().each(function (group, i) {
var groupName = group ? group : 'no-batch-id'; var groupName = group ? group : 'no-batch-id';
@ -1191,6 +1226,23 @@ var archiveRecords =
} }
}); });
function extractNumbersFromString(str) {
// Regular expression to match the pattern #number1/number2
const pattern = /#(\d+)\/(\d+)/;
const match = str.match(pattern);
if (match) {
// Extract number1 and number2 from the match
const number1 = parseInt(match[1], 10);
const number2 = parseInt(match[2], 10);
//return { number1, number2 };
return number2;
} else {
return null;
}
}
// Function to generate a unique key for localStorage based on batch_id // Function to generate a unique key for localStorage based on batch_id
function generateStorageKey(batchId) { function generateStorageKey(batchId) {
return 'dt-group-state-' + batchId; return 'dt-group-state-' + batchId;
@ -1204,7 +1256,7 @@ $('#archiveTable tbody').on('click', 'tr.group-header', function () {
archiveRecords.rows().every(function () { archiveRecords.rows().every(function () {
var rowGroup = this.data().batch_id ? this.data().batch_id : 'no-batch-id'; var rowGroup = this.data().batch_id ? this.data().batch_id : 'no-batch-id';
if (rowGroup === name) { if (rowGroup == name) {
if (collapsed) { if (collapsed) {
this.node().style.display = ''; this.node().style.display = '';
} else { } else {

View File

@ -181,11 +181,22 @@ table.dataTable thead>tr>th.sorting_asc:before, table.dataTable thead>tr>th.sort
font-weight: bold; font-weight: bold;
} }
.group-header .profit-info { .group-header .batchheader-profit-info {
color: #3e999e; /* Highlight profit info */ color: #3e999e; /* Highlight profit info */
font-weight: bold; font-weight: bold;
} }
.group-header .batchheader-count-info {
color: #a1a1a1; /* Highlight count info */
font-weight: bold;
}
.group-header .batchheader-period-info {
color: #a1a1a1; /* Highlight period info */
font-weight: bold;
}
.group-header strong { .group-header strong {
color: #3e999e; /* Distinct color for Batch ID */ color: #3e999e; /* Distinct color for Batch ID */
} }