mirror of
https://github.com/aljazceru/hummingbot-dashboard.git
synced 2025-12-22 15:54:24 +01:00
116 lines
4.0 KiB
Python
116 lines
4.0 KiB
Python
import numpy as np
|
|
import plotly.graph_objects as go
|
|
import frontend.visualization.theme as theme
|
|
|
|
|
|
def create_executors_distribution_traces(buy_spreads, sell_spreads, buy_amounts_pct, sell_amounts_pct, total_amount_quote):
|
|
colors = theme.get_color_scheme()
|
|
|
|
buy_spread_distributions = [spread * 100 for spread in buy_spreads]
|
|
sell_spread_distributions = [spread * 100 for spread in sell_spreads]
|
|
buy_order_amounts_quote = [amount * total_amount_quote for amount in buy_amounts_pct]
|
|
sell_order_amounts_quote = [amount * total_amount_quote for amount in sell_amounts_pct]
|
|
buy_order_levels = len(buy_spread_distributions)
|
|
sell_order_levels = len(sell_spread_distributions)
|
|
|
|
# Calculate total volumes
|
|
total_buy_volume = sum(buy_order_amounts_quote)
|
|
total_sell_volume = sum(sell_order_amounts_quote)
|
|
|
|
# Create the figure with a dark theme and secondary y-axis
|
|
fig = go.Figure()
|
|
|
|
# Buy orders on the negative side of x-axis
|
|
fig.add_trace(go.Bar(
|
|
x=[-dist for dist in buy_spread_distributions],
|
|
y=buy_order_amounts_quote,
|
|
name='Buy Orders',
|
|
marker_color=colors['buy'],
|
|
width=[0.2] * buy_order_levels # Adjust the width of the bars as needed
|
|
))
|
|
|
|
# Sell orders on the positive side of x-axis
|
|
fig.add_trace(go.Bar(
|
|
x=sell_spread_distributions,
|
|
y=sell_order_amounts_quote,
|
|
name='Sell Orders',
|
|
marker_color=colors['sell'],
|
|
width=[0.2] * sell_order_levels # Adjust the width of the bars as needed
|
|
))
|
|
|
|
# Add annotations for buy orders
|
|
for i, value in enumerate(buy_order_amounts_quote):
|
|
fig.add_annotation(
|
|
x=-buy_spread_distributions[i],
|
|
y=value + 0.03 * max(buy_order_amounts_quote), # Offset the text slightly above the bar
|
|
text=str(round(value, 2)),
|
|
showarrow=False,
|
|
font=dict(color=colors['buy'], size=10)
|
|
)
|
|
|
|
# Add annotations for sell orders
|
|
for i, value in enumerate(sell_order_amounts_quote):
|
|
fig.add_annotation(
|
|
x=sell_spread_distributions[i],
|
|
y=value + 0.03 * max(sell_order_amounts_quote), # Offset the text slightly above the bar
|
|
text=str(round(value, 2)),
|
|
showarrow=False,
|
|
font=dict(color=colors['sell'], size=10)
|
|
)
|
|
|
|
max_y = max(max(buy_order_amounts_quote), max(sell_order_amounts_quote))
|
|
# Add annotations for total volumes
|
|
fig.add_annotation(
|
|
x=-np.mean(buy_spread_distributions),
|
|
y=max_y,
|
|
text=f'Total Buy\n{round(total_buy_volume, 2)}',
|
|
showarrow=False,
|
|
font=dict(color=colors['buy'], size=12, family="Arial Black"),
|
|
align='center'
|
|
)
|
|
|
|
fig.add_annotation(
|
|
x=np.mean(sell_spread_distributions),
|
|
y=max_y,
|
|
text=f'Total Sell\n{round(total_sell_volume, 2)}',
|
|
showarrow=False,
|
|
font=dict(color=colors['sell'], size=12, family="Arial Black"),
|
|
align='center'
|
|
)
|
|
|
|
# Draw circles around the total volume annotations
|
|
fig.add_shape(
|
|
type='circle',
|
|
xref='x',
|
|
yref='y',
|
|
x0=-np.mean(buy_spread_distributions) - 0.4,
|
|
y0=max_y - 0.05 * max_y,
|
|
x1=-np.mean(buy_spread_distributions) + 0.4,
|
|
y1=max_y + 0.05 * max_y,
|
|
line=dict(color=colors['buy'])
|
|
)
|
|
|
|
fig.add_shape(
|
|
type='circle',
|
|
xref='x',
|
|
yref='y',
|
|
x0=np.mean(sell_spread_distributions) - 0.4,
|
|
y0=max_y - 0.05 * max_y,
|
|
x1=np.mean(sell_spread_distributions) + 0.4,
|
|
y1=max_y + 0.05 * max_y,
|
|
line=dict(color=colors['sell'])
|
|
)
|
|
|
|
# Apply the theme layout
|
|
layout_settings = theme.get_default_layout("Market Maker Order Distribution")
|
|
fig.update_layout(**layout_settings)
|
|
fig.update_layout(
|
|
xaxis_title="Spread (%)",
|
|
yaxis_title="Order Amount (Quote)",
|
|
bargap=0.1, # Adjust the gap between the bars
|
|
barmode='relative', # Stack the bars on top of each other
|
|
showlegend=True,
|
|
height=600
|
|
)
|
|
return fig
|