Draft a gt-one-`.fqme`-in-txns/account-file test
To start this is just a shell for the test, there's no checking logic yet.. put it as `test_accounting.test_ib_account_with_duplicated_mktids()`. The test is composed for now to be completely runtime-free using only the offline txn-ledger / symcache / account loading APIs, ideally we fill in the activated symbology-data-runtime cases once we figure a sane way to handle incremental symcache updates for backends like IB.. To actually fill the test out with real checks we still need to, - extract the problem account file from my ib.algopape into the test harness data. - pick some contracts with multiple fqmes despite a single bs_mktid and ensure they're aggregated as a single `Position` as well as, * ideally de-duplicating txns from the account file section for the mkt.. * warning appropriately about greater-then-one fqme for the bs_mktid and providing a way for the ledger re-writing to choose the appropriate `<venue>` as the "primary" when the data-symbology-runtime is up and possibly use it to incrementally update the IB symcache and store offline for next use?qt_w_graceful_SIGINT
parent
6eced8ca67
commit
56b660fe34
|
@ -12,12 +12,14 @@ from piker import config
|
||||||
from piker.accounting import (
|
from piker.accounting import (
|
||||||
Account,
|
Account,
|
||||||
calc,
|
calc,
|
||||||
Position,
|
open_account,
|
||||||
TransactionLedger,
|
|
||||||
open_trade_ledger,
|
|
||||||
load_account,
|
load_account,
|
||||||
load_account_from_ledger,
|
load_account_from_ledger,
|
||||||
|
open_trade_ledger,
|
||||||
|
Position,
|
||||||
|
TransactionLedger,
|
||||||
)
|
)
|
||||||
|
import tractor
|
||||||
|
|
||||||
|
|
||||||
def test_root_conf_networking_section(
|
def test_root_conf_networking_section(
|
||||||
|
@ -53,12 +55,17 @@ def test_account_file_default_empty(
|
||||||
)
|
)
|
||||||
def test_paper_ledger_position_calcs(
|
def test_paper_ledger_position_calcs(
|
||||||
fq_acnt: tuple[str, str],
|
fq_acnt: tuple[str, str],
|
||||||
|
debug_mode: bool,
|
||||||
):
|
):
|
||||||
broker: str
|
broker: str
|
||||||
acnt_name: str
|
acnt_name: str
|
||||||
broker, acnt_name = fq_acnt
|
broker, acnt_name = fq_acnt
|
||||||
|
|
||||||
accounts_path: Path = config.repodir() / 'tests' / '_inputs'
|
accounts_path: Path = (
|
||||||
|
config.repodir()
|
||||||
|
/ 'tests'
|
||||||
|
/ '_inputs' # tests-local-subdir
|
||||||
|
)
|
||||||
|
|
||||||
ldr: TransactionLedger
|
ldr: TransactionLedger
|
||||||
with (
|
with (
|
||||||
|
@ -77,6 +84,7 @@ def test_paper_ledger_position_calcs(
|
||||||
ledger=ldr,
|
ledger=ldr,
|
||||||
|
|
||||||
_fp=accounts_path,
|
_fp=accounts_path,
|
||||||
|
debug_mode=debug_mode,
|
||||||
|
|
||||||
) as (dfs, ledger),
|
) as (dfs, ledger),
|
||||||
|
|
||||||
|
@ -102,3 +110,87 @@ def test_paper_ledger_position_calcs(
|
||||||
df = dfs[xrp]
|
df = dfs[xrp]
|
||||||
assert df['cumsize'][-1] == 0
|
assert df['cumsize'][-1] == 0
|
||||||
assert pos.cumsize == 0
|
assert pos.cumsize == 0
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize(
|
||||||
|
'fq_acnt',
|
||||||
|
[
|
||||||
|
('ib', 'algopaper'),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
def test_ib_account_with_duplicated_mktids(
|
||||||
|
fq_acnt: tuple[str, str],
|
||||||
|
debug_mode: bool,
|
||||||
|
):
|
||||||
|
# ?TODO, once we start symcache-incremental-update-support?
|
||||||
|
# from piker.data import (
|
||||||
|
# open_symcache,
|
||||||
|
# )
|
||||||
|
#
|
||||||
|
# async def main():
|
||||||
|
# async with (
|
||||||
|
# # TODO: do this as part of `open_account()`!?
|
||||||
|
# open_symcache(
|
||||||
|
# 'ib',
|
||||||
|
# only_from_memcache=True,
|
||||||
|
# ) as symcache,
|
||||||
|
# ):
|
||||||
|
|
||||||
|
|
||||||
|
from piker.brokers.ib.ledger import (
|
||||||
|
tx_sort,
|
||||||
|
|
||||||
|
# ?TODO, once we want to pull lowlevel txns and process them?
|
||||||
|
# norm_trade_records,
|
||||||
|
# update_ledger_from_api_trades,
|
||||||
|
)
|
||||||
|
|
||||||
|
broker: str
|
||||||
|
acnt_id: str = 'algopaper'
|
||||||
|
broker, acnt_id = fq_acnt
|
||||||
|
accounts_def = config.load_accounts([broker])
|
||||||
|
assert accounts_def[f'{broker}.{acnt_id}']
|
||||||
|
|
||||||
|
ledger: TransactionLedger
|
||||||
|
acnt: Account
|
||||||
|
with (
|
||||||
|
tractor.devx.maybe_open_crash_handler(pdb=debug_mode),
|
||||||
|
|
||||||
|
open_trade_ledger(
|
||||||
|
'ib',
|
||||||
|
acnt_id,
|
||||||
|
tx_sort=tx_sort,
|
||||||
|
|
||||||
|
# TODO, eventually incrementally updated for IB..
|
||||||
|
# symcache=symcache,
|
||||||
|
symcache=None,
|
||||||
|
allow_from_sync_code=True,
|
||||||
|
|
||||||
|
) as ledger,
|
||||||
|
|
||||||
|
open_account(
|
||||||
|
'ib',
|
||||||
|
acnt_id,
|
||||||
|
write_on_exit=True,
|
||||||
|
) as acnt,
|
||||||
|
):
|
||||||
|
# per input params
|
||||||
|
symcache = ledger.symcache
|
||||||
|
assert not (
|
||||||
|
symcache.pairs
|
||||||
|
or
|
||||||
|
symcache.pairs
|
||||||
|
or
|
||||||
|
symcache.mktmaps
|
||||||
|
)
|
||||||
|
# re-compute all positions that have changed state.
|
||||||
|
# TODO: likely we should change the API to return the
|
||||||
|
# position updates from `.update_from_ledger()`?
|
||||||
|
active, closed = acnt.dump_active()
|
||||||
|
|
||||||
|
# breakpoint()
|
||||||
|
|
||||||
|
# TODO, (see above imports as well) incremental update from
|
||||||
|
# (updated) ledger?
|
||||||
|
# -[ ] pull some code from `.ib.broker` content.
|
||||||
|
|
Loading…
Reference in New Issue