bugfix live runner crashes after clicking stop

This commit is contained in:
David Brazda
2023-12-01 23:35:48 +01:00
parent 7344e49591
commit 0f0b816c7a
3 changed files with 114 additions and 6 deletions

View File

@ -309,8 +309,9 @@ def capsule(target: object, db: object, inter_batch_params: dict = None):
reason = None
if target.se.is_set():
print("EXTERNAL STOP FLAG IS SET - cancel BATCH")
inter_batch_params["stop"] = True
print("EXTERNAL STOP FLAG IS SET - cancel BATCH if running")
if inter_batch_params is not None:
inter_batch_params["stop"] = True
reason = "STOP Signal received"
except Exception as e:

View File

@ -0,0 +1,104 @@
import matplotlib
import matplotlib.dates as mdates
matplotlib.use('Agg') # Set the Matplotlib backend to 'Agg'
import matplotlib.pyplot as plt
from matplotlib.ticker import MaxNLocator
import seaborn as sns
import pandas as pd
from datetime import datetime
from typing import List
from enum import Enum
import numpy as np
import v2realbot.controller.services as cs
from rich import print
from v2realbot.common.model import AnalyzerInputs
from v2realbot.common.PrescribedTradeModel import TradeDirection, TradeStatus, Trade, TradeStoplossType
from v2realbot.utils.utils import isrising, isfalling,zoneNY, price2dec, safe_get#, print
from pathlib import Path
from v2realbot.config import WEB_API_KEY, DATA_DIR, MEDIA_DIRECTORY
from v2realbot.enums.enums import RecordType, StartBarAlign, Mode, Account, OrderSide
from io import BytesIO
from v2realbot.utils.historicals import get_historical_bars
from alpaca.data.timeframe import TimeFrame, TimeFrameUnit
from collections import defaultdict
from scipy.stats import zscore
from io import BytesIO
from v2realbot.reporting.load_trades import load_trades
from typing import Tuple, Optional, List
from traceback import format_exc
import pandas as pd
def daily_profit_distribution(runner_ids: list = None, batch_id: str = None, stream: bool = False):
try:
res, trades, days_cnt = load_trades(runner_ids, batch_id)
if res != 0:
raise Exception("Error in loading trades")
#print(trades)
# Convert list of Trade objects to DataFrame
trades_df = pd.DataFrame([t.__dict__ for t in trades if t.status == "closed"])
# Ensure 'exit_time' is a datetime object and make it timezone-naive if necessary
trades_df['exit_time'] = pd.to_datetime(trades_df['exit_time']).dt.tz_convert(zoneNY)
trades_df['date'] = trades_df['exit_time'].dt.date
daily_profit = trades_df.groupby(['date', 'direction']).profit.sum().unstack(fill_value=0)
#print("dp",daily_profit)
daily_cumulative_profit = trades_df.groupby('date').profit.sum().cumsum()
# Create the plot
fig, ax1 = plt.subplots(figsize=(10, 6))
# Bar chart for daily profit composition
daily_profit.plot(kind='bar', stacked=True, ax=ax1, color=['green', 'red'], zorder=2)
ax1.set_ylabel('Daily Profit')
ax1.set_xlabel('Date')
#ax1.xaxis.set_major_locator(MaxNLocator(10))
# Line chart for cumulative daily profit
#ax2 = ax1.twinx()
#print(daily_cumulative_profit)
#print(daily_cumulative_profit.index)
#ax2.plot(daily_cumulative_profit.index, daily_cumulative_profit, color='yellow', linestyle='-', linewidth=2, zorder=3)
#ax2.set_ylabel('Cumulative Profit')
# Setting the secondary y-axis range dynamically based on cumulative profit values
# ax2.set_ylim(daily_cumulative_profit.min() - (daily_cumulative_profit.std() * 2),
# daily_cumulative_profit.max() + (daily_cumulative_profit.std() * 2))
# Dark mode settings
ax1.set_facecolor('black')
# ax1.grid(True)
#ax2.set_facecolor('black')
fig.patch.set_facecolor('black')
ax1.tick_params(colors='white')
#ax2.tick_params(colors='white')
# ax1.xaxis_date()
# ax1.xaxis.set_major_formatter(mdates.DateFormatter('%d.%m.', tz=zoneNY))
ax1.tick_params(axis='x', rotation=45)
# Footer
footer_text = f'Days Count: {days_cnt} | Parameters: {{"runner_ids": {len(runner_ids) if runner_ids is not None else None}, "batch_id": {batch_id}, "stream": {stream}}}'
plt.figtext(0.5, 0.01, footer_text, wrap=True, horizontalalignment='center', fontsize=8, color='white')
# Save or stream the plot
if stream:
img_stream = BytesIO()
plt.savefig(img_stream, format='png', bbox_inches='tight', facecolor=fig.get_facecolor(), edgecolor='none')
img_stream.seek(0)
plt.close(fig)
return (0, img_stream)
else:
plt.savefig(f'{__name__}.png', bbox_inches='tight', facecolor=fig.get_facecolor(), edgecolor='none')
plt.close(fig)
return (0, None)
except Exception as e:
# Detailed error reporting
return (-1, str(e) + format_exc())
# Local debugging
if __name__ == '__main__':
batch_id = "6f9b012c"
res, val = daily_profit_distribution(batch_id=batch_id)
print(res, val)

View File

@ -243,7 +243,8 @@ function initialize_archiveRecords() {
rows.every(function (rowIdx, tableLoop, rowLoop) {
var rowNode = $(this.node());
rowNode.attr('data-group-name', groupId);
if (state == 'collapsed') {
//defaultne jsou batche zabalene a nobatche rozbalene, pokud nenastavim jinak
if (state == 'collapsed' || (!state) && group) {
rowNode.hide();
} else {
rowNode.show();
@ -287,7 +288,8 @@ function initialize_archiveRecords() {
//jeste neni v poli batchu - udelame hlavicku
if (!existingBatch) {
itemCount = extractNumbersFromString(firstRowData.note);
profit = firstRowData.metrics.profit.batch_sum_profit;
try {profit = firstRowData.metrics.profit.batch_sum_profit;}
catch (e) {profit = 'NA'}
period = firstRowData.note ? firstRowData.note.substring(0, 14) : '';
started = firstRowData.started
stratinId = firstRowData.strat_id
@ -298,10 +300,11 @@ function initialize_archiveRecords() {
//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;
try {profit = firstRowData.metrics.profit.batch_sum_profit;}
catch (e) {profit = 'NA'}
period = firstRowData.note ? firstRowData.note.substring(0, 14) : '';
started = firstRowData.started
stratinId = firstRowData.id
stratinId = firstRowData.strat_id
symbol = firstRowData.symbol
existingBatch.itemCount = itemCount;
existingBatch.profit = profit;