Push failing assert no pps test

explicit_write_pps_on_exit
jaredgoldman 2023-02-24 17:23:08 -05:00
parent e54d928405
commit 2d25d1f048
3 changed files with 52 additions and 54 deletions

View File

@ -41,7 +41,8 @@ from ..pp import (
Position, Position,
Transaction, Transaction,
open_trade_ledger, open_trade_ledger,
open_pps open_pps,
load_pps_from_ledger
) )
from ..data._normalize import iterticks from ..data._normalize import iterticks
from ..data._source import unpack_fqsn from ..data._source import unpack_fqsn
@ -260,7 +261,6 @@ class PaperBoi(Struct):
bsuid=key, bsuid=key,
) )
# Write to ledger toml right now
with ( with (
open_trade_ledger(self.broker, 'paper') as ledger, open_trade_ledger(self.broker, 'paper') as ledger,
open_pps(self.broker, 'piker-paper') as table open_pps(self.broker, 'piker-paper') as table
@ -268,25 +268,22 @@ class PaperBoi(Struct):
ledger.update({oid: t.to_dict()}) ledger.update({oid: t.to_dict()})
# Write to pps toml right now # Write to pps toml right now
table.update_from_trans({oid: t}) table.update_from_trans({oid: t})
# save pps in local state load_pps_from_ledger(self.broker, 'piker-paper')
self._positions.update(table.pps)
# Ensure we have the latest positioning data when sending pp_msg pp = table.pps[key]
pp = self._positions[key] pp_msg = BrokerdPosition(
broker=self.broker,
account='paper',
symbol=fqsn,
# TODO: we need to look up the asset currency from
# broker info. i guess for crypto this can be
# inferred from the pair?
currency=key,
size=pp.size,
avg_price=pp.ppu,
)
pp_msg = BrokerdPosition( await self.ems_trades_stream.send(pp_msg)
broker=self.broker,
account='paper',
symbol=fqsn,
# TODO: we need to look up the asset currency from
# broker info. i guess for crypto this can be
# inferred from the pair?
currency=key,
size=pp.size,
avg_price=pp.ppu,
)
await self.ems_trades_stream.send(pp_msg)
async def simulate_fills( async def simulate_fills(

View File

@ -680,7 +680,6 @@ class PpTable(Struct):
# TODO: show diff output? # TODO: show diff output?
# https://stackoverflow.com/questions/12956957/print-diff-of-python-dictionaries # https://stackoverflow.com/questions/12956957/print-diff-of-python-dictionaries
print(f'Updating ``pps.toml`` for {path}:\n') print(f'Updating ``pps.toml`` for {path}:\n')
# active, closed_pp_objs = table.dump_active() # active, closed_pp_objs = table.dump_active()
pp_entries = self.to_toml() pp_entries = self.to_toml()
self.conf[self.brokername][self.acctid] = pp_entries self.conf[self.brokername][self.acctid] = pp_entries

View File

@ -1,6 +1,6 @@
''' """
Paper-mode testing Paper-mode testing
''' """
import trio import trio
import math import math
@ -38,32 +38,32 @@ from piker.clearing._messages import BrokerdPosition
log = get_logger(__name__) log = get_logger(__name__)
@pytest.fixture(scope='module') @pytest.fixture(scope="module")
def delete_testing_dir(): def delete_testing_dir():
'''This fixture removes the temp directory """This fixture removes the temp directory
used for storing all config/ledger/pp data used for storing all config/ledger/pp data
created during testing sessions created during testing sessions
''' """
yield yield
app_dir = Path(get_app_dir('piker')).resolve() app_dir = Path(get_app_dir("piker")).resolve()
if app_dir.is_dir(): if app_dir.is_dir():
rmtree(str(app_dir)) rmtree(str(app_dir))
assert not app_dir.is_dir() assert not app_dir.is_dir()
def get_fqsn(broker, symbol): def get_fqsn(broker, symbol):
fqsn = f'{symbol}.{broker}' fqsn = f"{symbol}.{broker}"
return (fqsn, symbol, broker) return (fqsn, symbol, broker)
def test_paper_trade(open_test_pikerd: AsyncContextManager): def test_paper_trade(open_test_pikerd: AsyncContextManager):
oid = '' oid = ""
test_exec_mode = 'live' test_exec_mode = "live"
test_account = 'paper' test_account = "paper"
test_size = 1 test_size = 1
(fqsn, symbol, broker) = get_fqsn('kraken', 'xbtusdt') (fqsn, symbol, broker) = get_fqsn("kraken", "xbtusdt")
brokers = [broker] brokers = [broker]
test_pp_account = 'piker-paper' test_pp_account = "piker-paper"
positions: dict[ positions: dict[
# brokername, acctid # brokername, acctid
tuple[str, str], tuple[str, str],
@ -72,15 +72,15 @@ def test_paper_trade(open_test_pikerd: AsyncContextManager):
async def _async_main( async def _async_main(
open_pikerd: AsyncContextManager, open_pikerd: AsyncContextManager,
action: Literal['buy', 'sell'] | None = None, action: Literal["buy", "sell"] | None = None,
price: int = 30000, price: int = 30000,
assert_entries: bool = False, assert_entries: bool = False,
) -> None: ) -> None:
'''Spawn a paper piper actor, place a trade and assert entries are present """Spawn a paper piper actor, place a trade and assert entries are present
in both trade ledger and pps tomls. Then restart piker and ensure in both trade ledger and pps tomls. Then restart piker and ensure
that pps from previous trade exists in the ems pps. that pps from previous trade exists in the ems pps.
Finally close the position and ensure that the position in pps.toml is closed. Finally close the position and ensure that the position in pps.toml is closed.
''' """
nonlocal oid nonlocal oid
book: OrderBook book: OrderBook
nonlocal positions nonlocal positions
@ -88,7 +88,7 @@ def test_paper_trade(open_test_pikerd: AsyncContextManager):
# Set up piker and EMS # Set up piker and EMS
async with ( async with (
open_pikerd() as (_, _, _, services), open_pikerd() as (_, _, _, services),
open_ems(fqsn, mode='paper') as ( open_ems(fqsn, mode="paper") as (
book, book,
trades_stream, trades_stream,
pps, pps,
@ -121,14 +121,14 @@ def test_paper_trade(open_test_pikerd: AsyncContextManager):
with open_trade_ledger(broker, test_account) as ledger: with open_trade_ledger(broker, test_account) as ledger:
cleared_ledger_entry = ledger[oid] cleared_ledger_entry = ledger[oid]
assert list(ledger.keys())[-1] == oid assert list(ledger.keys())[-1] == oid
assert cleared_ledger_entry['size'] == test_size assert cleared_ledger_entry["size"] == test_size
assert cleared_ledger_entry['fqsn'] == fqsn assert cleared_ledger_entry["fqsn"] == fqsn
with open_pps(broker, test_pp_account) as table: with open_pps(broker, test_pp_account) as table:
pp_price = table.conf[broker][test_pp_account][fqsn]['ppu'] pp_price = table.conf[broker][test_pp_account][fqsn]["ppu"]
# Ensure the price-per-unit (breakeven) price is close to our clearing price # Ensure the price-per-unit (breakeven) price is close to our clearing price
assert math.isclose( assert math.isclose(
pp_price, cleared_ledger_entry['size'], rel_tol=1 pp_price, cleared_ledger_entry["size"], rel_tol=1
) )
assert table.brokername == broker assert table.brokername == broker
assert table.acctid == test_pp_account assert table.acctid == test_pp_account
@ -142,11 +142,13 @@ def test_paper_trade(open_test_pikerd: AsyncContextManager):
# and ensure last pps price is the same as ledger entry # and ensure last pps price is the same as ledger entry
def _assert_pps(ledger, table): def _assert_pps(ledger, table):
return ( return (
positions[(broker, test_account)][-1]['avg_price'] == ledger[oid]['price'] positions[(broker, test_account)][-1]["avg_price"] == ledger[oid]["price"]
) )
def _assert_no_pps(ledger, table): def _assert_no_pps(ledger, table):
return len(table.pps) == 0 print(f"positions: {positions}")
return not bool(table)
# return len(table.pps) == 0
# Close position and assert empty position in pps # Close position and assert empty position in pps
def _run_test_and_check(exception, fn, assert_cb=None): def _run_test_and_check(exception, fn, assert_cb=None):
@ -171,7 +173,7 @@ def test_paper_trade(open_test_pikerd: AsyncContextManager):
partial( partial(
_async_main, _async_main,
open_pikerd=open_test_pikerd, open_pikerd=open_test_pikerd,
action='buy', action="buy",
), ),
) )
@ -183,22 +185,19 @@ def test_paper_trade(open_test_pikerd: AsyncContextManager):
_run_test_and_check( _run_test_and_check(
BaseExceptionGroup, BaseExceptionGroup,
partial(_async_main, open_pikerd=open_test_pikerd, action='sell', price=1), partial(_async_main, open_pikerd=open_test_pikerd, action="sell", price=1),
_assert_no_pps, _assert_no_pps,
) )
# def test_paper_client( # def test_paper_client(open_test_pikerd: AsyncContextManager):
# open_test_pikerd: AsyncContextManager
# ):
#
# async def _async_main( # async def _async_main(
# open_pikerd: AsyncContextManager, # open_pikerd: AsyncContextManager,
# ): # ):
# (fqsn, symbol, broker) = get_fqsn('kraken', 'xbtusdt') # (fqsn, symbol, broker) = get_fqsn("kraken", "xbtusdt")
# async with ( # async with (
# open_pikerd() as (_, _, _, services), # open_pikerd() as (_, _, _, services),
# open_ems(fqsn, mode='paper') as ( # open_ems(fqsn, mode="paper") as (
# book, # book,
# trades_stream, # trades_stream,
# pps, # pps,
@ -206,11 +205,14 @@ def test_paper_trade(open_test_pikerd: AsyncContextManager):
# dialogs, # dialogs,
# ), # ),
# ): # ):
# async with open_cached_client(broker) as client: # # async with open_cached_client(broker) as client:
# symbol_info = await client.symbol_info() # # symbol_info = await client.symbol_info()
# print(f'client: {symbol_info['XBTUSDT']}') # # print(f'client: {symbol_info['XBTUSDT']}')
# with (open_pps(broker, "piker-paper") as table,):
# print(f"table: {table}")
# #
# trio.run(partial( # trio.run(
# partial(
# _async_main, # _async_main,
# open_pikerd=open_test_pikerd, # open_pikerd=open_test_pikerd,
# ), # ),