Compare commits
5 Commits
e0ec09cf19
...
f96d3c407e
| Author | SHA1 | Date |
|---|---|---|
|
|
f96d3c407e | |
|
|
2012543744 | |
|
|
3fdfe54cdc | |
|
|
808405fc4c | |
|
|
7ff1fa5369 |
|
|
@ -237,8 +237,8 @@ async def open_history_client(
|
||||||
|
|
||||||
async def get_ohlc(
|
async def get_ohlc(
|
||||||
timeframe: float,
|
timeframe: float,
|
||||||
end_dt: datetime | None = None,
|
end_dt: datetime|None = None,
|
||||||
start_dt: datetime | None = None,
|
start_dt: datetime|None = None,
|
||||||
|
|
||||||
) -> tuple[
|
) -> tuple[
|
||||||
np.ndarray,
|
np.ndarray,
|
||||||
|
|
@ -277,7 +277,11 @@ async def open_history_client(
|
||||||
|
|
||||||
if end_dt is None:
|
if end_dt is None:
|
||||||
inow: int = round(time.time())
|
inow: int = round(time.time())
|
||||||
if (inow - times[-1]) > 60:
|
if (
|
||||||
|
(inow - times[-1])
|
||||||
|
>
|
||||||
|
timeframe
|
||||||
|
):
|
||||||
await tractor.pause()
|
await tractor.pause()
|
||||||
|
|
||||||
start_dt = from_timestamp(times[0])
|
start_dt = from_timestamp(times[0])
|
||||||
|
|
@ -291,7 +295,7 @@ async def open_history_client(
|
||||||
async def get_mkt_info(
|
async def get_mkt_info(
|
||||||
fqme: str,
|
fqme: str,
|
||||||
|
|
||||||
) -> tuple[MktPair, Pair] | None:
|
) -> tuple[MktPair, Pair]|None:
|
||||||
|
|
||||||
# uppercase since kraken bs_mktid is always upper
|
# uppercase since kraken bs_mktid is always upper
|
||||||
if 'binance' not in fqme.lower():
|
if 'binance' not in fqme.lower():
|
||||||
|
|
@ -368,7 +372,7 @@ async def get_mkt_info(
|
||||||
if 'futes' in mkt_mode:
|
if 'futes' in mkt_mode:
|
||||||
assert isinstance(pair, FutesPair)
|
assert isinstance(pair, FutesPair)
|
||||||
|
|
||||||
dst: Asset | None = assets.get(pair.bs_dst_asset)
|
dst: Asset|None = assets.get(pair.bs_dst_asset)
|
||||||
if (
|
if (
|
||||||
not dst
|
not dst
|
||||||
# TODO: a known asset DNE list?
|
# TODO: a known asset DNE list?
|
||||||
|
|
@ -427,7 +431,7 @@ async def subscribe(
|
||||||
# might get ack from ws server, or maybe some
|
# might get ack from ws server, or maybe some
|
||||||
# other msg still in transit..
|
# other msg still in transit..
|
||||||
res = await ws.recv_msg()
|
res = await ws.recv_msg()
|
||||||
subid: str | None = res.get('id')
|
subid: str|None = res.get('id')
|
||||||
if subid:
|
if subid:
|
||||||
assert res['id'] == subid
|
assert res['id'] == subid
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -134,7 +134,7 @@ _adhoc_fiat_set = set((
|
||||||
|
|
||||||
# manually discovered tick discrepancies,
|
# manually discovered tick discrepancies,
|
||||||
# onl god knows how or why they'd cuck these up..
|
# onl god knows how or why they'd cuck these up..
|
||||||
_adhoc_mkt_infos: dict[int | str, dict] = {
|
_adhoc_mkt_infos: dict[int|str, dict] = {
|
||||||
'vtgn.nasdaq': {'price_tick': Decimal('0.01')},
|
'vtgn.nasdaq': {'price_tick': Decimal('0.01')},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -488,8 +488,7 @@ def con2fqme(
|
||||||
@async_lifo_cache()
|
@async_lifo_cache()
|
||||||
async def get_mkt_info(
|
async def get_mkt_info(
|
||||||
fqme: str,
|
fqme: str,
|
||||||
|
proxy: MethodProxy|None = None,
|
||||||
proxy: MethodProxy | None = None,
|
|
||||||
|
|
||||||
) -> tuple[MktPair, ibis.ContractDetails]:
|
) -> tuple[MktPair, ibis.ContractDetails]:
|
||||||
|
|
||||||
|
|
@ -550,7 +549,7 @@ async def get_mkt_info(
|
||||||
size_tick: Decimal = Decimal(
|
size_tick: Decimal = Decimal(
|
||||||
str(details.minSize).rstrip('0')
|
str(details.minSize).rstrip('0')
|
||||||
)
|
)
|
||||||
# |-> TODO: there is also the Contract.sizeIncrement, bt wtf is it?
|
# ?TODO, there is also the Contract.sizeIncrement, bt wtf is it?
|
||||||
|
|
||||||
# NOTE: this is duplicate from the .broker.norm_trade_records()
|
# NOTE: this is duplicate from the .broker.norm_trade_records()
|
||||||
# routine, we should factor all this parsing somewhere..
|
# routine, we should factor all this parsing somewhere..
|
||||||
|
|
|
||||||
|
|
@ -47,6 +47,7 @@ from tractor import trionics
|
||||||
from ._util import (
|
from ._util import (
|
||||||
log, # sub-sys logger
|
log, # sub-sys logger
|
||||||
get_console_log,
|
get_console_log,
|
||||||
|
subsys,
|
||||||
)
|
)
|
||||||
from ..accounting._mktinfo import (
|
from ..accounting._mktinfo import (
|
||||||
unpack_fqme,
|
unpack_fqme,
|
||||||
|
|
@ -136,7 +137,7 @@ class DarkBook(Struct):
|
||||||
tuple[
|
tuple[
|
||||||
Callable[[float], bool], # predicate
|
Callable[[float], bool], # predicate
|
||||||
tuple[str, ...], # tickfilter
|
tuple[str, ...], # tickfilter
|
||||||
dict | Order, # cmd / msg type
|
dict|Order, # cmd / msg type
|
||||||
|
|
||||||
# live submission constraint parameters
|
# live submission constraint parameters
|
||||||
float, # percent_away max price diff
|
float, # percent_away max price diff
|
||||||
|
|
@ -278,7 +279,7 @@ async def clear_dark_triggers(
|
||||||
|
|
||||||
# remove exec-condition from set
|
# remove exec-condition from set
|
||||||
log.info(f'Removing trigger for {oid}')
|
log.info(f'Removing trigger for {oid}')
|
||||||
trigger: tuple | None = execs.pop(oid, None)
|
trigger: tuple|None = execs.pop(oid, None)
|
||||||
if not trigger:
|
if not trigger:
|
||||||
log.warning(
|
log.warning(
|
||||||
f'trigger for {oid} was already removed!?'
|
f'trigger for {oid} was already removed!?'
|
||||||
|
|
@ -336,8 +337,8 @@ async def open_brokerd_dialog(
|
||||||
brokermod: ModuleType,
|
brokermod: ModuleType,
|
||||||
portal: tractor.Portal,
|
portal: tractor.Portal,
|
||||||
exec_mode: str,
|
exec_mode: str,
|
||||||
fqme: str | None = None,
|
fqme: str|None = None,
|
||||||
loglevel: str | None = None,
|
loglevel: str|None = None,
|
||||||
|
|
||||||
) -> tuple[
|
) -> tuple[
|
||||||
tractor.MsgStream,
|
tractor.MsgStream,
|
||||||
|
|
@ -761,12 +762,16 @@ _router: Router = None
|
||||||
@tractor.context
|
@tractor.context
|
||||||
async def _setup_persistent_emsd(
|
async def _setup_persistent_emsd(
|
||||||
ctx: tractor.Context,
|
ctx: tractor.Context,
|
||||||
loglevel: str | None = None,
|
loglevel: str|None = None,
|
||||||
|
|
||||||
) -> None:
|
) -> None:
|
||||||
|
|
||||||
if loglevel:
|
if loglevel:
|
||||||
get_console_log(loglevel)
|
_log = get_console_log(
|
||||||
|
level=loglevel,
|
||||||
|
name=subsys,
|
||||||
|
)
|
||||||
|
assert _log.name == 'piker.clearing'
|
||||||
|
|
||||||
global _router
|
global _router
|
||||||
|
|
||||||
|
|
@ -822,7 +827,7 @@ async def translate_and_relay_brokerd_events(
|
||||||
f'Rx brokerd trade msg:\n'
|
f'Rx brokerd trade msg:\n'
|
||||||
f'{fmsg}'
|
f'{fmsg}'
|
||||||
)
|
)
|
||||||
status_msg: Status | None = None
|
status_msg: Status|None = None
|
||||||
|
|
||||||
match brokerd_msg:
|
match brokerd_msg:
|
||||||
# BrokerdPosition
|
# BrokerdPosition
|
||||||
|
|
@ -1283,7 +1288,7 @@ async def process_client_order_cmds(
|
||||||
and status.resp == 'dark_open'
|
and status.resp == 'dark_open'
|
||||||
):
|
):
|
||||||
# remove from dark book clearing
|
# remove from dark book clearing
|
||||||
entry: tuple | None = dark_book.triggers[fqme].pop(oid, None)
|
entry: tuple|None = dark_book.triggers[fqme].pop(oid, None)
|
||||||
if entry:
|
if entry:
|
||||||
(
|
(
|
||||||
pred,
|
pred,
|
||||||
|
|
|
||||||
|
|
@ -28,12 +28,14 @@ from ..log import (
|
||||||
from piker.types import Struct
|
from piker.types import Struct
|
||||||
subsys: str = 'piker.clearing'
|
subsys: str = 'piker.clearing'
|
||||||
|
|
||||||
log = get_logger(subsys)
|
log = get_logger(
|
||||||
|
name='piker.clearing',
|
||||||
|
)
|
||||||
|
|
||||||
# TODO, oof doesn't this ignore the `loglevel` then???
|
# TODO, oof doesn't this ignore the `loglevel` then???
|
||||||
get_console_log = partial(
|
get_console_log = partial(
|
||||||
get_console_log,
|
get_console_log,
|
||||||
name=subsys,
|
name='clearing',
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -136,7 +136,10 @@ def pikerd(
|
||||||
'''
|
'''
|
||||||
# from tractor.devx import maybe_open_crash_handler
|
# from tractor.devx import maybe_open_crash_handler
|
||||||
# with maybe_open_crash_handler(pdb=False):
|
# with maybe_open_crash_handler(pdb=False):
|
||||||
log = get_console_log(loglevel, name='cli')
|
log = get_console_log(
|
||||||
|
level=loglevel,
|
||||||
|
with_tractor_log=tl,
|
||||||
|
)
|
||||||
|
|
||||||
if pdb:
|
if pdb:
|
||||||
log.warning((
|
log.warning((
|
||||||
|
|
@ -295,7 +298,11 @@ def cli(
|
||||||
@click.option('--tl', is_flag=True, help='Enable tractor logging')
|
@click.option('--tl', is_flag=True, help='Enable tractor logging')
|
||||||
@click.argument('ports', nargs=-1, required=False)
|
@click.argument('ports', nargs=-1, required=False)
|
||||||
@click.pass_obj
|
@click.pass_obj
|
||||||
def services(config, tl, ports):
|
def services(
|
||||||
|
config,
|
||||||
|
tl: bool,
|
||||||
|
ports,
|
||||||
|
):
|
||||||
|
|
||||||
from ..service import (
|
from ..service import (
|
||||||
open_piker_runtime,
|
open_piker_runtime,
|
||||||
|
|
@ -316,7 +323,11 @@ def services(config, tl, ports):
|
||||||
async with (
|
async with (
|
||||||
open_piker_runtime(
|
open_piker_runtime(
|
||||||
name='service_query',
|
name='service_query',
|
||||||
loglevel=config['loglevel'] if tl else None,
|
loglevel=(
|
||||||
|
config['loglevel']
|
||||||
|
if tl
|
||||||
|
else None,
|
||||||
|
),
|
||||||
),
|
),
|
||||||
tractor.get_registry(
|
tractor.get_registry(
|
||||||
addr=addr,
|
addr=addr,
|
||||||
|
|
|
||||||
|
|
@ -26,7 +26,9 @@ from ..log import (
|
||||||
)
|
)
|
||||||
subsys: str = 'piker.data'
|
subsys: str = 'piker.data'
|
||||||
|
|
||||||
log = get_logger(subsys)
|
log = get_logger(
|
||||||
|
name=subsys,
|
||||||
|
)
|
||||||
|
|
||||||
get_console_log = partial(
|
get_console_log = partial(
|
||||||
get_console_log,
|
get_console_log,
|
||||||
|
|
|
||||||
71
piker/log.py
71
piker/log.py
|
|
@ -37,35 +37,84 @@ _proj_name: str = 'piker'
|
||||||
|
|
||||||
|
|
||||||
def get_logger(
|
def get_logger(
|
||||||
name: str = None,
|
name: str|None = None,
|
||||||
|
**tractor_log_kwargs,
|
||||||
) -> logging.Logger:
|
) -> logging.Logger:
|
||||||
'''
|
'''
|
||||||
Return the package log or a sub-log for `name` if provided.
|
Return the package log or a sub-logger if a `name=` is provided,
|
||||||
|
which defaults to the calling module's pkg-namespace path.
|
||||||
|
|
||||||
|
See `tractor.log.get_logger()` for details.
|
||||||
|
|
||||||
'''
|
'''
|
||||||
|
pkg_name: str = _proj_name
|
||||||
|
if (
|
||||||
|
name
|
||||||
|
and
|
||||||
|
pkg_name in name
|
||||||
|
):
|
||||||
|
name: str = name.lstrip(f'{_proj_name}.')
|
||||||
|
|
||||||
return tractor.log.get_logger(
|
return tractor.log.get_logger(
|
||||||
name=name,
|
name=name,
|
||||||
_root_name=_proj_name,
|
pkg_name=pkg_name,
|
||||||
|
**tractor_log_kwargs,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def get_console_log(
|
def get_console_log(
|
||||||
level: str | None = None,
|
level: str|None = None,
|
||||||
name: str | None = None,
|
name: str|None = None,
|
||||||
|
pkg_name: str|None = None,
|
||||||
|
with_tractor_log: bool = False,
|
||||||
|
# ?TODO, support a "log-spec" style `str|dict[str, str]` which
|
||||||
|
# dictates both the sublogger-key and a level?
|
||||||
|
# -> see similar idea in `modden`'s usage.
|
||||||
|
**tractor_log_kwargs,
|
||||||
|
|
||||||
) -> logging.Logger:
|
) -> logging.Logger:
|
||||||
'''
|
'''
|
||||||
Get the package logger and enable a handler which writes to stderr.
|
Get the package logger and enable a handler which writes to
|
||||||
|
stderr.
|
||||||
|
|
||||||
Yeah yeah, i know we can use ``DictConfig``. You do it...
|
Yeah yeah, i know we can use `DictConfig`.
|
||||||
|
You do it.. Bp
|
||||||
|
|
||||||
'''
|
'''
|
||||||
|
pkg_name: str = _proj_name
|
||||||
|
if (
|
||||||
|
name
|
||||||
|
and
|
||||||
|
pkg_name in name
|
||||||
|
):
|
||||||
|
name: str = name.lstrip(f'{_proj_name}.')
|
||||||
|
|
||||||
|
tll: str|None = None
|
||||||
|
if (
|
||||||
|
with_tractor_log is not False
|
||||||
|
):
|
||||||
|
tll = level
|
||||||
|
|
||||||
|
elif maybe_actor := tractor.current_actor(
|
||||||
|
err_on_no_runtime=False,
|
||||||
|
):
|
||||||
|
tll = maybe_actor.loglevel
|
||||||
|
|
||||||
|
if tll:
|
||||||
|
t_log = tractor.log.get_console_log(
|
||||||
|
level=tll,
|
||||||
|
name='tractor', # <- XXX, force root tractor log!
|
||||||
|
**tractor_log_kwargs,
|
||||||
|
)
|
||||||
|
# TODO/ allow only enabling certain tractor sub-logs?
|
||||||
|
assert t_log.name == 'tractor'
|
||||||
|
|
||||||
return tractor.log.get_console_log(
|
return tractor.log.get_console_log(
|
||||||
level,
|
level=level,
|
||||||
name=name,
|
name=name,
|
||||||
_root_name=_proj_name,
|
pkg_name=pkg_name,
|
||||||
) # our root logger
|
**tractor_log_kwargs,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def colorize_json(
|
def colorize_json(
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,6 @@
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
import os
|
import os
|
||||||
from typing import (
|
from typing import (
|
||||||
Optional,
|
|
||||||
Any,
|
Any,
|
||||||
ClassVar,
|
ClassVar,
|
||||||
)
|
)
|
||||||
|
|
@ -59,7 +58,7 @@ async def open_piker_runtime(
|
||||||
registry_addrs: list[tuple[str, int]] = [],
|
registry_addrs: list[tuple[str, int]] = [],
|
||||||
|
|
||||||
enable_modules: list[str] = [],
|
enable_modules: list[str] = [],
|
||||||
loglevel: Optional[str] = None,
|
loglevel: str|None = None,
|
||||||
|
|
||||||
# XXX NOTE XXX: you should pretty much never want debug mode
|
# XXX NOTE XXX: you should pretty much never want debug mode
|
||||||
# for data daemons when running in production.
|
# for data daemons when running in production.
|
||||||
|
|
@ -163,8 +162,7 @@ _root_modules: list[str] = [
|
||||||
@acm
|
@acm
|
||||||
async def open_pikerd(
|
async def open_pikerd(
|
||||||
registry_addrs: list[tuple[str, int]],
|
registry_addrs: list[tuple[str, int]],
|
||||||
|
loglevel: str|None = None,
|
||||||
loglevel: str | None = None,
|
|
||||||
|
|
||||||
# XXX: you should pretty much never want debug mode
|
# XXX: you should pretty much never want debug mode
|
||||||
# for data daemons when running in production.
|
# for data daemons when running in production.
|
||||||
|
|
@ -192,7 +190,6 @@ async def open_pikerd(
|
||||||
|
|
||||||
async with (
|
async with (
|
||||||
open_piker_runtime(
|
open_piker_runtime(
|
||||||
|
|
||||||
name=_root_dname,
|
name=_root_dname,
|
||||||
loglevel=loglevel,
|
loglevel=loglevel,
|
||||||
debug_mode=debug_mode,
|
debug_mode=debug_mode,
|
||||||
|
|
@ -273,7 +270,9 @@ async def maybe_open_pikerd(
|
||||||
|
|
||||||
'''
|
'''
|
||||||
if loglevel:
|
if loglevel:
|
||||||
get_console_log(loglevel)
|
get_console_log(
|
||||||
|
level=loglevel
|
||||||
|
)
|
||||||
|
|
||||||
# subtle, we must have the runtime up here or portal lookup will fail
|
# subtle, we must have the runtime up here or portal lookup will fail
|
||||||
query_name = kwargs.pop(
|
query_name = kwargs.pop(
|
||||||
|
|
|
||||||
|
|
@ -96,7 +96,7 @@ if TYPE_CHECKING:
|
||||||
# from .feed import _FeedsBus
|
# from .feed import _FeedsBus
|
||||||
|
|
||||||
|
|
||||||
log = get_logger()
|
log = get_logger(__name__)
|
||||||
|
|
||||||
|
|
||||||
# `ShmArray` buffer sizing configuration:
|
# `ShmArray` buffer sizing configuration:
|
||||||
|
|
|
||||||
8
uv.lock
8
uv.lock
|
|
@ -2205,7 +2205,7 @@ dev = [
|
||||||
{ name = "pytest", specifier = ">=8.3.5" },
|
{ name = "pytest", specifier = ">=8.3.5" },
|
||||||
{ name = "stackscope", specifier = ">=0.2.2,<0.3" },
|
{ name = "stackscope", specifier = ">=0.2.2,<0.3" },
|
||||||
{ name = "typing-extensions", specifier = ">=4.14.1" },
|
{ name = "typing-extensions", specifier = ">=4.14.1" },
|
||||||
{ name = "xonsh", specifier = ">=0.22.1" },
|
{ name = "xonsh", specifier = ">=0.22.2" },
|
||||||
]
|
]
|
||||||
devx = [
|
devx = [
|
||||||
{ name = "greenback", specifier = ">=1.2.1,<2" },
|
{ name = "greenback", specifier = ">=1.2.1,<2" },
|
||||||
|
|
@ -2217,7 +2217,7 @@ repl = [
|
||||||
{ name = "prompt-toolkit", specifier = ">=3.0.50" },
|
{ name = "prompt-toolkit", specifier = ">=3.0.50" },
|
||||||
{ name = "psutil", specifier = ">=7.0.0" },
|
{ name = "psutil", specifier = ">=7.0.0" },
|
||||||
{ name = "pyperclip", specifier = ">=1.9.0" },
|
{ name = "pyperclip", specifier = ">=1.9.0" },
|
||||||
{ name = "xonsh", specifier = ">=0.22.1" },
|
{ name = "xonsh", specifier = ">=0.22.2" },
|
||||||
]
|
]
|
||||||
testing = [
|
testing = [
|
||||||
{ name = "pexpect", specifier = ">=4.9.0,<5" },
|
{ name = "pexpect", specifier = ">=4.9.0,<5" },
|
||||||
|
|
@ -2469,8 +2469,8 @@ wheels = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "xonsh"
|
name = "xonsh"
|
||||||
version = "0.22.1"
|
version = "0.22.3"
|
||||||
source = { git = "https://github.com/xonsh/xonsh.git?branch=main#336658ff0919f8d7bb96d581136d37d470a8fe99" }
|
source = { git = "https://github.com/xonsh/xonsh.git?branch=main#b446946fd94c3913e002318db1d1b41ee4fa1f9a" }
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "yapic-json"
|
name = "yapic-json"
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue