Source code for h2o_dashboard.pages.okx_dashbaord_page.okx_account_widget
from typing import List
from h2o_wave import Q, ui, on, data, run_on, AsyncSite, pack # noqa F401
from h2o_dashboard.util import add_card
from pyokx.redis_structured_streams import get_stream_okx_account_messages
from pyokx.ws_data_structures import AccountChannel
[docs]
class OKX_Account_StreamWidget:
def __init__(self, q: Q, card_name: str, box: str, history_count: int = 999):
self.q = q
self.history_count = history_count
self.account_stream: List[AccountChannel] = []
self.card_name = card_name
self.box = box
self.colors = ['$blue', '$red', '$green', '$yellow', '$orange', '$pink', '$purple', '$cyan', '$gray']
async def _update_stream(self):
self.account_stream: List[AccountChannel] = await get_stream_okx_account_messages(
async_redis=self.q.client.async_redis, count=self.history_count)
return self.account_stream
async def _is_initialized(self):
return bool(self.account_stream)
[docs]
def get_ui_total_equity_box_as_small_stat(self, box: str):
last_account_stream_entry: AccountChannel = self.account_stream[-1]
last_account_stream_data = last_account_stream_entry.data[0]
return ui.small_series_stat_card(
box=box,
title='Total Equity',
value='=${{intl total_eq minimum_fraction_digits=2 maximum_fraction_digits=2}}',
data=dict(
u_time=last_account_stream_data.uTime,
total_eq=last_account_stream_data.totalEq),
plot_type='area',
plot_value='total_eq',
plot_color='$green',
plot_data=data('u_time total_eq', -self.history_count,
rows=[[account.data[0].uTime, account.data[0].totalEq] for account in self.account_stream]),
plot_zero_value=min([float(account.data[0].totalEq) for account in self.account_stream]) * 0.9999,
plot_curve='linear',
)
[docs]
def get_ui_account_breakdown_box_as_pie_stat(self, box: str):
last_account_stream_entry: AccountChannel = self.account_stream[-1]
last_account_stream_data = last_account_stream_entry.data[0]
pies = []
colors_copy = None
for account_balance_detail in last_account_stream_data.details:
if not colors_copy:
colors_copy = self.colors.copy()
color = colors_copy.pop()
fraction = float(account_balance_detail.eqUsd) / float(last_account_stream_data.totalEq)
percentage_string = str(round(fraction * 100, 2)) + '%'
pies.append(ui.pie(
# label: str,
# value: str,
# fraction: float,
# color: str,
# aux_value: str | None = None
label=account_balance_detail.ccy,
# value=percentage_string,
value='',
fraction=fraction,
color=color,
aux_value=f'${account_balance_detail.eqUsd} ({percentage_string})'
))
return ui.wide_pie_stat_card(
# box: str,
# title: str,
# pies: list[Pie],
# commands: list[Command] | None = Non
box=box,
title='Account Breakdown',
pies=pies
)
[docs]
async def update_account_breakdown_card(self):
last_account_stream_entry: AccountChannel = self.account_stream[-1]
last_account_stream_data = last_account_stream_entry.data[0]
account_breakdown_card: ui.wide_pie_stat_card = self.q.page[self.card_name + '_account_breakdown']
details = {account_balance_detail.ccy: account_balance_detail.eqUsd for account_balance_detail in
last_account_stream_data.details}
for pie, (k, v) in zip(account_breakdown_card.pies, details.items()):
fraction = float(v) / float(last_account_stream_data.totalEq)
percentage_string = str(round(fraction * 100, 2)) + '%'
pie.label = k
# pie.value = percentage_string
pie.fraction = fraction
pie.aux_value = f'${round(float(v), 2)} ({percentage_string})'
[docs]
async def update_total_equity_card(self):
last_account_stream_entry: AccountChannel = self.account_stream[-1]
last_account_stream_data = last_account_stream_entry.data[0]
total_equity_card: ui.small_series_stat_card = self.q.page[self.card_name + '_total_equity']
total_equity_card.plot_data[-1] = [last_account_stream_data.uTime, last_account_stream_data.totalEq]
total_equity_card.plot_zero_value = min(
[float(account.data[0].totalEq) for account in self.account_stream]) * 0.9999
total_equity_card.data = dict(
u_time=last_account_stream_data.uTime,
total_eq=last_account_stream_data.totalEq)
[docs]
async def add_cards(self):
await self._update_stream()
await add_card(self.q, self.card_name + '_total_equity',
self.get_ui_total_equity_box_as_small_stat(box=self.box))
await add_card(self.q, self.card_name + '_account_breakdown',
self.get_ui_account_breakdown_box_as_pie_stat(box=self.box))
await self.q.page.save()
[docs]
async def update_cards(self):
await self._update_stream()
await self.update_total_equity_card()
await self.update_account_breakdown_card()
await self.q.page.save()