pozn do runu, prgbar na queu,report

This commit is contained in:
David Brazda
2023-11-21 11:47:33 +01:00
parent dee223ce7e
commit 222c85e465
4 changed files with 211 additions and 127 deletions

View File

@ -157,7 +157,7 @@ def init(state: StrategyState):
today = time_to.date() today = time_to.date()
several_days_ago = today - timedelta(days=40) several_days_ago = today - timedelta(days=40)
printanyway(f"{today=}",f"{several_days_ago=}") #printanyway(f"{today=}",f"{several_days_ago=}")
clientTrading = TradingClient(ACCOUNT1_PAPER_API_KEY, ACCOUNT1_PAPER_SECRET_KEY, raw_data=False) clientTrading = TradingClient(ACCOUNT1_PAPER_API_KEY, ACCOUNT1_PAPER_SECRET_KEY, raw_data=False)
#get all market days from here to 40days ago #get all market days from here to 40days ago
calendar_request = GetCalendarRequest(start=several_days_ago,end=today) calendar_request = GetCalendarRequest(start=several_days_ago,end=today)
@ -174,13 +174,13 @@ def init(state: StrategyState):
#history_datetime_to = zoneNY.localize(session.close) #history_datetime_to = zoneNY.localize(session.close)
history_datetime_to = session.close history_datetime_to = session.close
break break
printanyway("Previous Market Day Close:", history_datetime_to) #printanyway("Previous Market Day Close:", history_datetime_to)
printanyway("Market day 40days ago Open:", history_datetime_from) #printanyway("Market day 40days ago Open:", history_datetime_from)
printanyway(history_datetime_from, history_datetime_to) #printanyway(history_datetime_from, history_datetime_to)
#az do predchziho market dne dne #az do predchziho market dne dne
state.dailyBars = get_historical_bars(state.symbol, history_datetime_from, history_datetime_to, TimeFrame.Day) state.dailyBars = get_historical_bars(state.symbol, history_datetime_from, history_datetime_to, TimeFrame.Day)
printanyway("daily bars FILLED", state.dailyBars) #printanyway("daily bars FILLED", state.dailyBars)
#zatim ukladame do extData - pro instant indicatory a gui #zatim ukladame do extData - pro instant indicatory a gui
state.extData["dailyBars"] = state.dailyBars state.extData["dailyBars"] = state.dailyBars

View File

@ -476,6 +476,8 @@ def batch_run_manager(id: UUID, runReq: RunRequest, rundays: list[RunDay]):
note_from_run_request = runReq.note note_from_run_request = runReq.note
first = None first = None
last = None last = None
first_frm = runReq.bt_from.strftime("%d.%m.")
last_frm = runReq.bt_to.strftime("%d.%m.")
for day in rundays: for day in rundays:
cnt += 1 cnt += 1
if cnt == 1: if cnt == 1:
@ -486,7 +488,7 @@ def batch_run_manager(id: UUID, runReq: RunRequest, rundays: list[RunDay]):
print("Datum do", day.end) print("Datum do", day.end)
runReq.bt_from = day.start runReq.bt_from = day.start
runReq.bt_to = day.end runReq.bt_to = day.end
runReq.note = f"Batch {batch_id} #{cnt}/{cnt_max} {day.name} N:{day.note} {note_from_run_request}" runReq.note = f"{first_frm}-{last_frm} Batch {batch_id} #{cnt}/{cnt_max} {day.name} N:{day.note} {note_from_run_request}"
#protoze jsme v ridicim vlaknu, poustime za sebou jednotlive stratiny v synchronnim modu #protoze jsme v ridicim vlaknu, poustime za sebou jednotlive stratiny v synchronnim modu
res, id_val = run_stratin(id=id, runReq=runReq, synchronous=True, inter_batch_params=inter_batch_params) res, id_val = run_stratin(id=id, runReq=runReq, synchronous=True, inter_batch_params=inter_batch_params)

View File

@ -16,6 +16,8 @@ from pathlib import Path
from v2realbot.config import WEB_API_KEY, DATA_DIR, MEDIA_DIRECTORY from v2realbot.config import WEB_API_KEY, DATA_DIR, MEDIA_DIRECTORY
from v2realbot.enums.enums import RecordType, StartBarAlign, Mode, Account, OrderSide from v2realbot.enums.enums import RecordType, StartBarAlign, Mode, Account, OrderSide
from io import BytesIO from io import BytesIO
from v2realbot.utils.historicals import get_historical_bars
from alpaca.data.timeframe import TimeFrame, TimeFrameUnit
# Assuming Trade, TradeStatus, TradeDirection, TradeStoplossType classes are defined elsewhere # Assuming Trade, TradeStatus, TradeDirection, TradeStoplossType classes are defined elsewhere
def generate_trading_report_image(runner_ids: list = None, batch_id: str = None, stream: bool = False): def generate_trading_report_image(runner_ids: list = None, batch_id: str = None, stream: bool = False):
@ -35,7 +37,13 @@ def generate_trading_report_image(runner_ids: list = None, batch_id: str = None,
return -1, f"no batch {batch_id} found" return -1, f"no batch {batch_id} found"
trades = [] trades = []
cnt_max = len(runner_ids)
cnt = 0
#zatim zjistujeme start a end z min a max dni - jelikoz muze byt i seznam runner_ids a nejenom batch
end_date = None
start_date = None
for id in runner_ids: for id in runner_ids:
cnt += 1
#get runner #get runner
res, sada =cs.get_archived_runner_header_byID(id) res, sada =cs.get_archived_runner_header_byID(id)
if res != 0: if res != 0:
@ -45,8 +53,11 @@ def generate_trading_report_image(runner_ids: list = None, batch_id: str = None,
print("archrunner") print("archrunner")
print(sada) print(sada)
if cnt == 1:
start_date = sada.bt_from if sada.mode in [Mode.BT,Mode.PREP] else sada.started
if cnt == cnt_max:
end_date = sada.bt_to if sada.mode in [Mode.BT or Mode.PREP] else sada.stopped
# Parse trades # Parse trades
#trades = [Trade(**trade_dict) for trade_dict in set.metrics["prescr_trades"]]
trades_dicts = sada.metrics["prescr_trades"] trades_dicts = sada.metrics["prescr_trades"]
@ -58,6 +69,27 @@ def generate_trading_report_image(runner_ids: list = None, batch_id: str = None,
print(trades) print(trades)
symbol = sada.symbol
#hour bars for backtested period
print(start_date,end_date)
bars= get_historical_bars(symbol, start_date, end_date, TimeFrame.Hour)
print("bars for given period",bars)
"""Bars a dictionary with the following keys:
* high: A list of high prices
* low: A list of low prices
* volume: A list of volumes
* close: A list of close prices
* hlcc4: A list of HLCC4 indicators
* open: A list of open prices
* time: A list of times in UTC (ISO 8601 format)
* trades: A list of number of trades
* resolution: A list of resolutions (all set to 'D')
* confirmed: A list of booleans (all set to True)
* vwap: A list of VWAP indicator
* updated: A list of booleans (all set to True)
* index: A list of integers (from 0 to the length of the list of daily bars)
"""
# Filter to only use trades with status 'CLOSED' # Filter to only use trades with status 'CLOSED'
closed_trades = [trade for trade in trades if trade.status == TradeStatus.CLOSED] closed_trades = [trade for trade in trades if trade.status == TradeStatus.CLOSED]
@ -83,7 +115,7 @@ def generate_trading_report_image(runner_ids: list = None, batch_id: str = None,
long_profits = [trade.profit for trade in closed_trades if trade.direction == TradeDirection.LONG and trade.profit is not None] long_profits = [trade.profit for trade in closed_trades if trade.direction == TradeDirection.LONG and trade.profit is not None]
short_profits = [trade.profit for trade in closed_trades if trade.direction == TradeDirection.SHORT and trade.profit is not None] short_profits = [trade.profit for trade in closed_trades if trade.direction == TradeDirection.SHORT and trade.profit is not None]
# # Setting up dark mode for the plots # Setting up dark mode for the plots
plt.style.use('dark_background') plt.style.use('dark_background')
# Optionally, you can further customize colors, labels, and axes # Optionally, you can further customize colors, labels, and axes
@ -104,45 +136,44 @@ def generate_trading_report_image(runner_ids: list = None, batch_id: str = None,
} }
plt.rcParams.update(params) plt.rcParams.update(params)
#NEW LOOK
# # Set the style to dark mode with custom settings #Custom dark theme similar to the provided image
# dark_finance_theme = {
# 'background': '#1a1a1a', # Very dark (almost black) background
# 'text': '#eaeaea', # Light grey text for readability
# 'grid': '#333333', # Dark grey grid lines
# 'accent': '#2e91e5', # Bright blue accent for main elements
# 'secondary': '#e15f99', # Secondary pink/magenta color for highlights
# 'highlight': '#fcba03', # Gold-like color for special highlights
# }
# # Apply the theme settings
# plt.style.use('dark_background') # plt.style.use('dark_background')
# plt.rcParams.update({
# 'figure.facecolor': dark_finance_theme['background'],
# 'axes.facecolor': dark_finance_theme['background'],
# 'axes.edgecolor': dark_finance_theme['text'],
# 'axes.labelcolor': dark_finance_theme['text'],
# 'axes.titlesize': 12,
# 'axes.labelsize': 10,
# 'xtick.color': dark_finance_theme['text'],
# 'xtick.labelsize': 8,
# 'ytick.color': dark_finance_theme['text'],
# 'ytick.labelsize': 8,
# 'grid.color': dark_finance_theme['grid'],
# 'grid.linestyle': '-',
# 'grid.linewidth': 0.6,
# 'legend.facecolor': dark_finance_theme['background'],
# 'legend.edgecolor': dark_finance_theme['background'],
# 'legend.fontsize': 10,
# 'text.color': dark_finance_theme['text'],
# 'lines.color': dark_finance_theme['accent'],
# 'patch.edgecolor': dark_finance_theme['accent'],
# })
# # Define a custom dark theme color palette
# dark_theme_colors = {
# 'background': '#1c1c1c', # Dark gray
# 'text': '#d6d6d6', # Light gray for a subtle contrast
# 'grid': '#414141', # Slightly lighter gray than background for grid
# 'highlight': '#3498db', # Bright blue for highlights (max/min points, etc.)
# 'warning': '#e74c3c', # Red color for warnings or important highlights
# 'neutral': '#7f8c8d', # Neutral color for less important elements
# }
# # Customize the color scheme # Create a combined figure for all plots 11,7 ideal na 3,4
# params = { fig, axs = plt.subplots(3, 4, figsize=(12, 7))
# 'figure.facecolor': dark_theme_colors['background'],
# 'axes.titlesize': 10,
# 'axes.labelsize': 9,
# 'xtick.labelsize': 9,
# 'ytick.labelsize': 9,
# 'axes.labelcolor': dark_theme_colors['text'],
# 'axes.facecolor': dark_theme_colors['background'],
# 'axes.grid': False, # Control grid visibility
# 'axes.edgecolor': dark_theme_colors['text'],
# 'xtick.color': dark_theme_colors['text'],
# 'ytick.color': dark_theme_colors['text'],
# 'text.color': dark_theme_colors['text'],
# 'legend.facecolor': dark_theme_colors['background'],
# 'legend.edgecolor': dark_theme_colors['text'],
# 'legend.fontsize': 8,
# 'legend.title_fontsize': 9,
# }
# # Apply the custom color scheme
# plt.rcParams.update(params)
# Create a combined figure for all plots
fig, axs = plt.subplots(3, 4, figsize=(11, 7))
#TITLE #TITLE
title = "" title = ""
@ -229,43 +260,7 @@ def generate_trading_report_image(runner_ids: list = None, batch_id: str = None,
place_annotation(axs[0, 3], 0, long_count, offset) place_annotation(axs[0, 3], 0, long_count, offset)
place_annotation(axs[0, 3], 1, short_count, offset) place_annotation(axs[0, 3], 1, short_count, offset)
#PLOT 5 - Heatman (exit time)
#Cumulative profit - bud 1 den nebo vice dni
if len(runner_ids)== 1:
if cumulative_profits.size > 0:
# Plot 3: Cumulative Profit Over Time with Max Profit Point
max_profit_time = exit_times[np.argmax(cumulative_profits)]
max_profit = max(cumulative_profits)
min_profit_time = exit_times[np.argmin(cumulative_profits)]
min_profit = min(cumulative_profits)
sns.lineplot(x=exit_times, y=cumulative_profits, label='Cumulative Profit', ax=axs[1, 3])
axs[1, 3].scatter(max_profit_time, max_profit, color='green', label='Max Profit')
axs[1, 3].scatter(min_profit_time, min_profit, color='red', label='Min Profit')
# Format dates on the x-axis
axs[1, 3].xaxis.set_major_formatter(mdates.DateFormatter('%H', tz=zoneNY))
axs[1, 3].set_title('Cumulative Profit Over Time')
axs[1, 3].legend()
else:
# Handle the case where cumulative_profits is empty
axs[1, 3].text(0.5, 0.5, 'No profit data available',
horizontalalignment='center',
verticalalignment='center',
transform=axs[1, 3].transAxes)
axs[1, 3].set_title('Cumulative Profit Over Time')
else:
# Calculate cumulative profit
# Additional Plot: Cumulative Profit Over Time
# Sort trades by exit time
sorted_trades = sorted([trade for trade in trades if trade.status == TradeStatus.CLOSED],
key=lambda x: x.exit_time)
cumulative_profits_sorted = np.cumsum([trade.profit for trade in sorted_trades])
exit_times_sorted = [trade.exit_time for trade in sorted_trades if trade.exit_time is not None]
axs[1, 3].plot(exit_times_sorted, cumulative_profits_sorted, color='blue')
axs[1, 3].set_title('Cumulative Profit Over Time')
axs[1, 3].set_xlabel('Time')
axs[1, 3].set_ylabel('Cumulative Profit')
axs[1, 3].xaxis.set_major_formatter(mdates.DateFormatter('%d', tz=zoneNY))
# Creating a DataFrame for the heatmap # Creating a DataFrame for the heatmap
heatmap_data_list = [] heatmap_data_list = []
for trade in trades: for trade in trades:
@ -281,7 +276,7 @@ def generate_trading_report_image(runner_ids: list = None, batch_id: str = None,
heatmap_data = heatmap_data.groupby(['Day', 'Hour']).sum().reset_index() heatmap_data = heatmap_data.groupby(['Day', 'Hour']).sum().reset_index()
heatmap_pivot = heatmap_data.pivot(index='Day', columns='Hour', values='Profit') heatmap_pivot = heatmap_data.pivot(index='Day', columns='Hour', values='Profit')
# Plot 3: Heatmap of Profits # Heatmap of Profits
sns.heatmap(heatmap_pivot, cmap='viridis', ax=axs[1, 0]) sns.heatmap(heatmap_pivot, cmap='viridis', ax=axs[1, 0])
axs[1, 0].set_title('Heatmap of Profits (based on Exit time)') axs[1, 0].set_title('Heatmap of Profits (based on Exit time)')
axs[1, 0].set_xlabel('Hour of Day') axs[1, 0].set_xlabel('Hour of Day')
@ -294,15 +289,15 @@ def generate_trading_report_image(runner_ids: list = None, batch_id: str = None,
transform=axs[1, 0].transAxes) transform=axs[1, 0].transAxes)
axs[1, 0].set_title('Heatmap of Profits (based on Exit time)') axs[1, 0].set_title('Heatmap of Profits (based on Exit time)')
# Plot 9: Profit/Loss Distribution Histogram # Plot 6: Profit/Loss Distribution Histogram
sns.histplot(profits, bins=30, ax=axs[1, 1], kde=True, color='skyblue') sns.histplot(profits, bins=30, ax=axs[1, 1], kde=True, color='skyblue')
axs[1, 1].set_title('Profit/Loss Distribution') axs[1, 1].set_title('Profit/Loss Distribution')
axs[1, 1].set_xlabel('Profit/Loss') axs[1, 1].set_xlabel('Profit/Loss')
axs[1, 1].set_ylabel('Frequency') axs[1, 1].set_ylabel('Frequency')
# Plot 5 # Plot 7
# - pro 1 den: Position Size Distribution # - for 1 den: Position Size Distribution
# - pro vice dnu: Trade Duration vs. Profit/Loss # - for more days: Trade Duration vs. Profit/Loss
if len(runner_ids) == 1: if len(runner_ids) == 1:
sizes = [trade.size for trade in closed_trades if trade.size is not None] sizes = [trade.size for trade in closed_trades if trade.size is not None]
@ -331,7 +326,7 @@ def generate_trading_report_image(runner_ids: list = None, batch_id: str = None,
##trade_volumes.append(trade.size) # or any other measure of trade size ##trade_volumes.append(trade.size) # or any other measure of trade size
trade_types.append('Long' if trade.direction == TradeDirection.LONG else 'Short') trade_types.append('Long' if trade.direction == TradeDirection.LONG else 'Short')
# Plot 8: Trade Duration vs. Profit/Loss # Trade Duration vs. Profit/Loss
scatter_data = pd.DataFrame({ scatter_data = pd.DataFrame({
'Duration': trade_durations, 'Duration': trade_durations,
'Profit': trade_profits, 'Profit': trade_profits,
@ -345,7 +340,91 @@ def generate_trading_report_image(runner_ids: list = None, batch_id: str = None,
axs[1, 2].set_ylabel('Profit/Loss') axs[1, 2].set_ylabel('Profit/Loss')
# Plot 6: Daily Relative Profit Chart #Plot 8 Cumulative profit - bud 1 den nebo vice dni + pridame pod to vyvoj ceny
# Extract the closing prices and times
closing_prices = bars['close']
#times = bars['time'] # Assuming this is a list of pandas Timestamp objects
times = pd.to_datetime(bars['time']) # Ensure this is a Pandas datetime series
# # Plot the closing prices over time
# axs[0, 4].plot(times, closing_prices, color='blue')
# axs[0, 4].tick_params(axis='x', rotation=45) # Rotate date labels if necessar
# axs[0, 4].xaxis.set_major_formatter(mdates.DateFormatter('%H', tz=zoneNY))
if len(runner_ids)== 1:
if cumulative_profits.size > 0:
# Plot 3: Cumulative Profit Over Time with Max Profit Point
max_profit_time = exit_times[np.argmax(cumulative_profits)]
max_profit = max(cumulative_profits)
min_profit_time = exit_times[np.argmin(cumulative_profits)]
min_profit = min(cumulative_profits)
#Plot Cumulative Profit Over Time with Max Profit Point on the primary y-axis
# Create a secondary y-axis for the closing prices
ax2 = axs[1, 3].twinx()
ax2.plot(times, closing_prices, label='Closing Price', color='orange')
ax2.set_ylabel('Closing Price', color='orange')
ax2.tick_params(axis='y', labelcolor='orange')
# Set the limits for the x-axis to cover the full range of 'times'
axs[1, 3].set_xlim(times.min(), times.max())
sns.lineplot(x=exit_times, y=cumulative_profits, ax=axs[1, 3], color='limegreen')
axs[1, 3].scatter(max_profit_time, max_profit, color='green', label='Max Profit')
axs[1, 3].scatter(min_profit_time, min_profit, color='red', label='Min Profit')
axs[1, 3].set_xlabel('Time')
axs[1, 3].set_ylabel('Cumulative Profit', color='limegreen')
axs[1, 3].tick_params(axis='y', labelcolor='limegreen')
axs[1, 3].xaxis.set_major_formatter(mdates.DateFormatter('%H', tz=zoneNY))
# Add legends to the plot
# lines, labels = axs[1, 3].get_legend_handles_labels()
# lines2, labels2 = ax2.get_legend_handles_labels()
# axs[1, 3].legend(lines + lines2, labels + labels2, loc='upper left')
else:
# Handle the case where cumulative_profits is empty
axs[1, 3].text(0.5, 0.5, 'No profit data available',
horizontalalignment='center',
verticalalignment='center',
transform=axs[1, 3].transAxes)
axs[1, 3].set_title('Cumulative Profit Over Time')
else:
# Calculate cumulative profit
# Additional Plot: Cumulative Profit Over Time
# Sort trades by exit time
# # Set the limits for the x-axis to cover the full range of 'times'
# axs[1, 3].set_xlim(times.min(), times.max())
sorted_trades = sorted([trade for trade in trades if trade.status == TradeStatus.CLOSED],
key=lambda x: x.exit_time)
cumulative_profits_sorted = np.cumsum([trade.profit for trade in sorted_trades])
exit_times_sorted = [trade.exit_time for trade in sorted_trades if trade.exit_time is not None]
# Create a secondary y-axis for the closing prices
ax2 = axs[1, 3].twinx()
ax2.plot(times, closing_prices, label='Closing Price', color='orange')
ax2.set_ylabel('Closing Price', color='orange')
ax2.tick_params(axis='y', labelcolor='orange')
axs[1, 3].set_xlim(times.min(), times.max())
# Plot Cumulative Profit Over Time on the primary y-axis
axs[1, 3].plot(exit_times_sorted, cumulative_profits_sorted, label='Cumulative Profit', color='blue')
axs[1, 3].set_xlabel('Time')
axs[1, 3].set_ylabel('Cumulative Profit', color='blue')
axs[1, 3].tick_params(axis='y', labelcolor='blue')
# Format dates on the x-axis
axs[1, 3].xaxis.set_major_formatter(mdates.DateFormatter('%d.%m.', tz=zoneNY))
axs[1, 3].tick_params(axis='x', rotation=45) # Rotate date labels if necessary
# Set the title
axs[1, 3].set_title('Cumulative Profit and Closing Price Over Time')
# Add legends to the plot
# axs[1, 3].legend(loc='upper left')
# ax2.legend(loc='upper right')
# Plot 9
# - for 1 day: Daily Relative Profit Chart
# - for more days: Heatmap of Profits (based on Entry time)
if len(runner_ids) == 1: if len(runner_ids) == 1:
daily_rel_profits = [trade.rel_profit for trade in closed_trades if trade.rel_profit is not None] daily_rel_profits = [trade.rel_profit for trade in closed_trades if trade.rel_profit is not None]
sns.lineplot(x=range(len(daily_rel_profits)), y=daily_rel_profits, ax=axs[2, 0]) sns.lineplot(x=range(len(daily_rel_profits)), y=daily_rel_profits, ax=axs[2, 0])
@ -365,13 +444,13 @@ def generate_trading_report_image(runner_ids: list = None, batch_id: str = None,
heatmap_data = heatmap_data.groupby(['Day', 'Hour']).sum().reset_index() heatmap_data = heatmap_data.groupby(['Day', 'Hour']).sum().reset_index()
heatmap_pivot = heatmap_data.pivot(index='Day', columns='Hour', values='Profit') heatmap_pivot = heatmap_data.pivot(index='Day', columns='Hour', values='Profit')
# Plot 3: Heatmap of Profits # Heatmap of Profits
sns.heatmap(heatmap_pivot, cmap='viridis', ax=axs[2, 0]) sns.heatmap(heatmap_pivot, cmap='viridis', ax=axs[2, 0])
axs[2, 0].set_title('Heatmap of Profits (based on Entry time)') axs[2, 0].set_title('Heatmap of Profits (based on Entry time)')
axs[2, 0].set_xlabel('Hour of Day') axs[2, 0].set_xlabel('Hour of Day')
axs[2, 0].set_ylabel('Day') axs[2, 0].set_ylabel('Day')
# Plot 8: Profits Based on Hour of the Day (Entry) # Plot 10: Profits Based on Hour of the Day (Entry)
entry_hours = [trade.entry_time.hour for trade in closed_trades if trade.entry_time is not None] entry_hours = [trade.entry_time.hour for trade in closed_trades if trade.entry_time is not None]
profits_by_hour = {} profits_by_hour = {}
for hour, trade in zip(entry_hours, closed_trades): for hour, trade in zip(entry_hours, closed_trades):
@ -396,7 +475,7 @@ def generate_trading_report_image(runner_ids: list = None, batch_id: str = None,
transform=axs[2, 1].transAxes) transform=axs[2, 1].transAxes)
axs[2, 1].set_title('Profits by Hour of Day (Entry)') axs[2, 1].set_title('Profits by Hour of Day (Entry)')
# Plot 9: Profits Based on Hour of the Day - based on Exit # Plot 11: Profits Based on Hour of the Day - based on Exit
exit_hours = [trade.exit_time.hour for trade in closed_trades if trade.exit_time is not None] exit_hours = [trade.exit_time.hour for trade in closed_trades if trade.exit_time is not None]
profits_by_hour = {} profits_by_hour = {}
for hour, trade in zip(exit_hours, closed_trades): for hour, trade in zip(exit_hours, closed_trades):
@ -421,7 +500,7 @@ def generate_trading_report_image(runner_ids: list = None, batch_id: str = None,
transform=axs[2, 2].transAxes) transform=axs[2, 2].transAxes)
axs[2, 2].set_title('Profits by Hour of Day (Exit)') axs[2, 2].set_title('Profits by Hour of Day (Exit)')
# Calculate profits by day of the week # Plot 12: Calculate profits by day of the week
day_of_week_profits = {i: 0 for i in range(7)} # Dictionary to store profits for each day of the week day_of_week_profits = {i: 0 for i in range(7)} # Dictionary to store profits for each day of the week
for trade in trades: for trade in trades:
@ -459,7 +538,7 @@ def generate_trading_report_image(runner_ids: list = None, batch_id: str = None,
# Example usage # Example usage
# trades = [list of Trade objects] # trades = [list of Trade objects]
if __name__ == '__main__': if __name__ == '__main__':
id_list = ["c3e31cb5-ddf9-467e-a932-2118f6844355"] # id_list = ["e8938b2e-8462-441a-8a82-d823c6a025cb"]
generate_trading_report_image(runner_ids=id_list) # generate_trading_report_image(runner_ids=id_list)
# batch_id = "90973e57" batch_id = "90973e57"
# generate_trading_report_image(batch_id=batch_id) generate_trading_report_image(batch_id=batch_id)

View File

@ -28,6 +28,7 @@ from uuid import UUID
from rich import print as printnow from rich import print as printnow
from collections import defaultdict from collections import defaultdict
import v2realbot.strategyblocks.activetrade.sl.optimsl as optimsl import v2realbot.strategyblocks.activetrade.sl.optimsl as optimsl
from tqdm import tqdm
if PROFILING_NEXT_ENABLED: if PROFILING_NEXT_ENABLED:
from pyinstrument import Profiler from pyinstrument import Profiler
@ -418,40 +419,42 @@ class Strategy:
#main strat loop #main strat loop
print(self.name, "Waiting for DATA") print(self.name, "Waiting for DATA")
while True: with tqdm(total=self.q1.qsize()) as pbar:
try: while True:
#block 5s, after that check signals try:
item = self.q1.get(timeout=HEARTBEAT_TIMEOUT) #block 5s, after that check signals
#printnow(current_thread().name, "Items waiting in queue:", self.q1.qsize()) item = self.q1.get(timeout=HEARTBEAT_TIMEOUT)
except queue.Empty: #printnow(current_thread().name, "Items waiting in queue:", self.q1.qsize())
#check signals except queue.Empty:
if self.se.is_set(): #check signals
print(current_thread().name, "Stopping signal") if self.se.is_set():
print(current_thread().name, "Stopping signal")
break
if self.pe.is_set():
print(current_thread().name, "Paused.")
continue
else:
print(current_thread().name, "HEARTBEAT - no trades or signals")
continue
#prijde posledni zaznam nebo stop event signal
if item == "last" or self.se.is_set():
print(current_thread().name, "stopping")
break break
if self.pe.is_set(): elif self.pe.is_set():
print(current_thread().name, "Paused.") print(current_thread().name, "Paused.")
continue continue
else: #self.state.iter_log(event="INGEST",msg="New data ingested", item=item)
print(current_thread().name, "HEARTBEAT - no trades or signals") print("New data ingested", item)
continue print("bars list - previous", self.state.bars)
#prijde posledni zaznam nebo stop event signal #TODO sem pridat ochranu kulometu
if item == "last" or self.se.is_set(): #pokud je updatetime aktualniho baru mensi nez LIMIT a nejde o potvrzovaci bar
print(current_thread().name, "stopping") #tak jej vyhodit
break #zabraní se tím akcím na než bych stejně nešlo reagovat
elif self.pe.is_set(): #TODO jeste promyslet
print(current_thread().name, "Paused.")
continue #calling main loop
#self.state.iter_log(event="INGEST",msg="New data ingested", item=item) self.strat_loop(item=item)
print("New data ingested", item) pbar.update(1)
print("bars list - previous", self.state.bars)
#TODO sem pridat ochranu kulometu
#pokud je updatetime aktualniho baru mensi nez LIMIT a nejde o potvrzovaci bar
#tak jej vyhodit
#zabraní se tím akcím na než bych stejně nešlo reagovat
#TODO jeste promyslet
#calling main loop
self.strat_loop(item=item)
tlog(f"FINISHED") tlog(f"FINISHED")
print(40*"*",self.mode, "STRATEGY ", self.name,"STOPPING",40*"*") print(40*"*",self.mode, "STRATEGY ", self.name,"STOPPING",40*"*")