`ledger` cli: dump colored summary lines to console
Tried a couple libs and ended up sticking with `rich` (since it's the sibling lib to `typer`) but also (initially) implemented a version with `blessings` that I ended up commenting out (and will likely remove). Adjusted the CLI I/O a slight bit as well: - require a fully qualified account name of the form: `<brokername>.<accountname>` and error on non-matching input. - dump positions summary lines as humanized size, ppu and cost basis values per line.rekt_pps
parent
62259880fd
commit
250e1c4c51
|
@ -22,6 +22,10 @@ from typing import (
|
||||||
Any,
|
Any,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
from rich import print
|
||||||
|
from rich.console import Console
|
||||||
|
from rich.markdown import Markdown
|
||||||
|
# from blessings import Terminal
|
||||||
import tractor
|
import tractor
|
||||||
import trio
|
import trio
|
||||||
import typer
|
import typer
|
||||||
|
@ -29,7 +33,8 @@ import typer
|
||||||
from ..service import (
|
from ..service import (
|
||||||
open_piker_runtime,
|
open_piker_runtime,
|
||||||
)
|
)
|
||||||
# from ._pos import open_pps
|
from ..clearing._messages import BrokerdPosition
|
||||||
|
from ..calc import humanize
|
||||||
|
|
||||||
|
|
||||||
ledger = typer.Typer()
|
ledger = typer.Typer()
|
||||||
|
@ -89,13 +94,32 @@ def broker_init(
|
||||||
|
|
||||||
@ledger.command()
|
@ledger.command()
|
||||||
def sync(
|
def sync(
|
||||||
brokername: str,
|
fully_qualified_account_name: str,
|
||||||
account: str,
|
# brokername: str,
|
||||||
|
# account: str,
|
||||||
loglevel: str = 'cancel',
|
|
||||||
pdb: bool = False,
|
pdb: bool = False,
|
||||||
):
|
|
||||||
|
|
||||||
|
loglevel: str = typer.Option(
|
||||||
|
'error',
|
||||||
|
"-l",
|
||||||
|
),
|
||||||
|
):
|
||||||
|
console = Console()
|
||||||
|
|
||||||
|
try:
|
||||||
|
brokername, account = fully_qualified_account_name.split('.')
|
||||||
|
except ValueError:
|
||||||
|
md = Markdown(
|
||||||
|
f'=> `{fully_qualified_account_name}` <=\n\n'
|
||||||
|
'is not a valid '
|
||||||
|
'__fully qualified account name?__\n\n'
|
||||||
|
'Your account name needs to be of the form '
|
||||||
|
'`<brokername>.<account_name>`\n'
|
||||||
|
)
|
||||||
|
console.print(md)
|
||||||
|
return
|
||||||
|
|
||||||
|
# term = Terminal()
|
||||||
start_kwargs, _, trades_ep = broker_init(
|
start_kwargs, _, trades_ep = broker_init(
|
||||||
brokername,
|
brokername,
|
||||||
loglevel=loglevel,
|
loglevel=loglevel,
|
||||||
|
@ -138,15 +162,91 @@ def sync(
|
||||||
|
|
||||||
positions: dict[str, Any]
|
positions: dict[str, Any]
|
||||||
accounts: list[str]
|
accounts: list[str]
|
||||||
# brokerd_trades_stream: tractor.MsgStream
|
|
||||||
async with (
|
async with (
|
||||||
open_trades_endpoint as (
|
open_trades_endpoint as (
|
||||||
brokerd_ctx,
|
brokerd_ctx,
|
||||||
(positions, accounts,),
|
(positions, accounts,),
|
||||||
),
|
),
|
||||||
# brokerd_ctx.open_stream() as brokerd_trades_stream,
|
|
||||||
):
|
):
|
||||||
await tractor.breakpoint()
|
# XXX: ``blessings`` lib syntax..
|
||||||
|
# summary: str = (
|
||||||
|
# term.dim('Position Summary ')
|
||||||
|
# + term.dim_blue_underline(f'{brokername}')
|
||||||
|
# + term.dim('.')
|
||||||
|
# + term.blue_underline(f'{account}')
|
||||||
|
# + term.dim(':\n')
|
||||||
|
# + term.dim('|-> total pps: ')
|
||||||
|
# + term.green(f'{len(positions)}\n')
|
||||||
|
# )
|
||||||
|
|
||||||
|
summary: str = (
|
||||||
|
'[dim]PP Summary[/] '
|
||||||
|
f'[dim blue underline]{brokername}[/]'
|
||||||
|
'[dim].[/]'
|
||||||
|
f'[blue underline]{account}[/]'
|
||||||
|
f'[dim]:\n|-> total pps: [/]'
|
||||||
|
f'[green]{len(positions)}[/]\n'
|
||||||
|
)
|
||||||
|
for ppdict in positions:
|
||||||
|
ppmsg = BrokerdPosition(**ppdict)
|
||||||
|
size = ppmsg.size
|
||||||
|
if size:
|
||||||
|
ppu: float = round(
|
||||||
|
ppmsg.avg_price,
|
||||||
|
ndigits=2,
|
||||||
|
)
|
||||||
|
cb: str = humanize(size * ppu)
|
||||||
|
h_size: str = humanize(size)
|
||||||
|
|
||||||
|
if size < 0:
|
||||||
|
# pcolor = term.red
|
||||||
|
pcolor = 'red'
|
||||||
|
else:
|
||||||
|
# pcolor = term.green
|
||||||
|
pcolor = 'green'
|
||||||
|
|
||||||
|
# sematic-highligh of fqme
|
||||||
|
fqme = ppmsg.symbol
|
||||||
|
tokens = fqme.split('.')
|
||||||
|
# styled_fqme = term.blue_underline(f'{tokens[0]}')
|
||||||
|
styled_fqme = f'[blue underline]{tokens[0]}[/]'
|
||||||
|
for tok in tokens[1:]:
|
||||||
|
# styled_fqme += term.dim('.')
|
||||||
|
styled_fqme += '[dim].[/]'
|
||||||
|
# styled_fqme += term.dim_blue_underline(tok)
|
||||||
|
styled_fqme += f'[dim blue underline]{tok}[/]'
|
||||||
|
|
||||||
|
# blessing.Terminal code.
|
||||||
|
# summary += (
|
||||||
|
# # term.dim('- ')
|
||||||
|
# # + term.dim_blue(f'{ppmsg.symbol}')
|
||||||
|
# styled_fqme
|
||||||
|
# + term.dim(': ')
|
||||||
|
# + pcolor(f'{h_size}')
|
||||||
|
# # + term.dim_blue('u \n')
|
||||||
|
# # + term.dim_blue('@ ')
|
||||||
|
# + term.dim_blue('u @')
|
||||||
|
# # + term.dim(f' |-> ppu: ')
|
||||||
|
# # + pcolor(f'{ppu}\n')
|
||||||
|
# + pcolor(f'{ppu}')
|
||||||
|
|
||||||
|
# # + term.dim(f' |-> book value: ')
|
||||||
|
# + term.dim_blue(' = ')
|
||||||
|
# + pcolor(f'$ {cb}\n')
|
||||||
|
# )
|
||||||
|
|
||||||
|
summary += (
|
||||||
|
styled_fqme +
|
||||||
|
'[dim]: [/]'
|
||||||
|
f'[{pcolor}]{h_size}[/]'
|
||||||
|
'[dim blue]u @[/]'
|
||||||
|
f'[{pcolor}]{ppu}[/]'
|
||||||
|
'[dim blue] = [/]'
|
||||||
|
f'[{pcolor}]$ {cb}\n[/]'
|
||||||
|
)
|
||||||
|
|
||||||
|
# console.print(summar)
|
||||||
|
print(summary)
|
||||||
await brokerd_ctx.cancel()
|
await brokerd_ctx.cancel()
|
||||||
|
|
||||||
await portal.cancel_actor()
|
await portal.cancel_actor()
|
||||||
|
|
Loading…
Reference in New Issue