'`kraken`: fix pos loading using `digits_to_dec()` to pair info
Our issue was not having the correct value set on each `Symbol.lot_tick_size`.. and then doing PPU calcs with the default set for legacy mkts.. Also, - actually write `pps.toml` on broker mode exit. - drop `get_likely_pair()` and import from pp module.pre_overruns_ctxcancelled
							parent
							
								
									24fe44fb96
								
							
						
					
					
						commit
						3a5e788afc
					
				| 
						 | 
					@ -20,6 +20,7 @@ Kraken web API wrapping.
 | 
				
			||||||
'''
 | 
					'''
 | 
				
			||||||
from contextlib import asynccontextmanager as acm
 | 
					from contextlib import asynccontextmanager as acm
 | 
				
			||||||
from datetime import datetime
 | 
					from datetime import datetime
 | 
				
			||||||
 | 
					from decimal import Decimal
 | 
				
			||||||
import itertools
 | 
					import itertools
 | 
				
			||||||
from typing import (
 | 
					from typing import (
 | 
				
			||||||
    Any,
 | 
					    Any,
 | 
				
			||||||
| 
						 | 
					@ -248,6 +249,9 @@ class Client:
 | 
				
			||||||
            {},
 | 
					            {},
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        by_bsuid = resp['result']
 | 
					        by_bsuid = resp['result']
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # TODO: we need to pull out the "asset" decimals
 | 
				
			||||||
 | 
					        # data and return a `decimal.Decimal` instead here!
 | 
				
			||||||
        return {
 | 
					        return {
 | 
				
			||||||
            self._atable[sym].lower(): float(bal)
 | 
					            self._atable[sym].lower(): float(bal)
 | 
				
			||||||
            for sym, bal in by_bsuid.items()
 | 
					            for sym, bal in by_bsuid.items()
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -21,7 +21,6 @@ Order api and machinery
 | 
				
			||||||
from collections import ChainMap, defaultdict
 | 
					from collections import ChainMap, defaultdict
 | 
				
			||||||
from contextlib import (
 | 
					from contextlib import (
 | 
				
			||||||
    asynccontextmanager as acm,
 | 
					    asynccontextmanager as acm,
 | 
				
			||||||
    contextmanager as cm,
 | 
					 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
from functools import partial
 | 
					from functools import partial
 | 
				
			||||||
from itertools import count
 | 
					from itertools import count
 | 
				
			||||||
| 
						 | 
					@ -47,8 +46,12 @@ from piker.pp import (
 | 
				
			||||||
    Transaction,
 | 
					    Transaction,
 | 
				
			||||||
    open_trade_ledger,
 | 
					    open_trade_ledger,
 | 
				
			||||||
    open_pps,
 | 
					    open_pps,
 | 
				
			||||||
 | 
					    get_likely_pair,
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					from piker.data._source import (
 | 
				
			||||||
 | 
					    Symbol,
 | 
				
			||||||
 | 
					    digits_to_dec,
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
from piker.data._source import Symbol
 | 
					 | 
				
			||||||
from piker.clearing._messages import (
 | 
					from piker.clearing._messages import (
 | 
				
			||||||
    Order,
 | 
					    Order,
 | 
				
			||||||
    Status,
 | 
					    Status,
 | 
				
			||||||
| 
						 | 
					@ -470,12 +473,14 @@ async def trades_dialogue(
 | 
				
			||||||
        with (
 | 
					        with (
 | 
				
			||||||
            open_pps(
 | 
					            open_pps(
 | 
				
			||||||
                'kraken',
 | 
					                'kraken',
 | 
				
			||||||
                acctid
 | 
					                acctid,
 | 
				
			||||||
 | 
					                write_on_exit=True,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            ) as table,
 | 
					            ) as table,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            open_trade_ledger(
 | 
					            open_trade_ledger(
 | 
				
			||||||
                'kraken',
 | 
					                'kraken',
 | 
				
			||||||
                acctid
 | 
					                acctid,
 | 
				
			||||||
            ) as ledger_dict,
 | 
					            ) as ledger_dict,
 | 
				
			||||||
        ):
 | 
					        ):
 | 
				
			||||||
            # transaction-ify the ledger entries
 | 
					            # transaction-ify the ledger entries
 | 
				
			||||||
| 
						 | 
					@ -494,7 +499,10 @@ async def trades_dialogue(
 | 
				
			||||||
            # what amount of trades-transactions need
 | 
					            # what amount of trades-transactions need
 | 
				
			||||||
            # to be reloaded.
 | 
					            # to be reloaded.
 | 
				
			||||||
            balances = await client.get_balances()
 | 
					            balances = await client.get_balances()
 | 
				
			||||||
 | 
					            # await tractor.breakpoint()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            for dst, size in balances.items():
 | 
					            for dst, size in balances.items():
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                # we don't care about tracking positions
 | 
					                # we don't care about tracking positions
 | 
				
			||||||
                # in the user's source fiat currency.
 | 
					                # in the user's source fiat currency.
 | 
				
			||||||
                if (
 | 
					                if (
 | 
				
			||||||
| 
						 | 
					@ -508,45 +516,20 @@ async def trades_dialogue(
 | 
				
			||||||
                    )
 | 
					                    )
 | 
				
			||||||
                    continue
 | 
					                    continue
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                def get_likely_pair(
 | 
					 | 
				
			||||||
                    dst: str,
 | 
					 | 
				
			||||||
                    bsuid: str,
 | 
					 | 
				
			||||||
                    src_fiat: str = src_fiat
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                ) -> str:
 | 
					 | 
				
			||||||
                    '''
 | 
					 | 
				
			||||||
                    Attempt to get the likely trading pair masting
 | 
					 | 
				
			||||||
                    a given destination asset `dst: str`.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                    '''
 | 
					 | 
				
			||||||
                    try:
 | 
					 | 
				
			||||||
                        src_name_start = bsuid.rindex(src_fiat)
 | 
					 | 
				
			||||||
                    except (
 | 
					 | 
				
			||||||
                        ValueError,   # substr not found
 | 
					 | 
				
			||||||
                    ):
 | 
					 | 
				
			||||||
                        # TODO: handle nested positions..(i.e.
 | 
					 | 
				
			||||||
                        # positions where the src fiat was used to
 | 
					 | 
				
			||||||
                        # buy some other dst which was furhter used
 | 
					 | 
				
			||||||
                        # to buy another dst..)
 | 
					 | 
				
			||||||
                        log.warning(
 | 
					 | 
				
			||||||
                            f'No src fiat {src_fiat} found in {bsuid}?'
 | 
					 | 
				
			||||||
                        )
 | 
					 | 
				
			||||||
                        return
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                    likely_dst = bsuid[:src_name_start]
 | 
					 | 
				
			||||||
                    if likely_dst == dst:
 | 
					 | 
				
			||||||
                        return bsuid
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                def has_pp(
 | 
					                def has_pp(
 | 
				
			||||||
                    dst: str,
 | 
					                    dst: str,
 | 
				
			||||||
                    size: float,
 | 
					                    size: float,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                ) -> Position | bool:
 | 
					                ) -> Position | None:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    src2dst: dict[str, str] = {}
 | 
					                    src2dst: dict[str, str] = {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    for bsuid in table.pps:
 | 
					                    for bsuid in table.pps:
 | 
				
			||||||
                        likely_pair = get_likely_pair(dst, bsuid)
 | 
					                        likely_pair = get_likely_pair(
 | 
				
			||||||
 | 
					                            src_fiat,
 | 
				
			||||||
 | 
					                            dst,
 | 
				
			||||||
 | 
					                            bsuid,
 | 
				
			||||||
 | 
					                        )
 | 
				
			||||||
                        if likely_pair:
 | 
					                        if likely_pair:
 | 
				
			||||||
                            src2dst[src_fiat] = dst
 | 
					                            src2dst[src_fiat] = dst
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -574,7 +557,7 @@ async def trades_dialogue(
 | 
				
			||||||
                            )
 | 
					                            )
 | 
				
			||||||
                            return pp
 | 
					                            return pp
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    return False
 | 
					                    return None  # signal no entry
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                pos = has_pp(dst, size)
 | 
					                pos = has_pp(dst, size)
 | 
				
			||||||
                if not pos:
 | 
					                if not pos:
 | 
				
			||||||
| 
						 | 
					@ -602,7 +585,11 @@ async def trades_dialogue(
 | 
				
			||||||
                            # yet and thus this likely pair grabber will
 | 
					                            # yet and thus this likely pair grabber will
 | 
				
			||||||
                            # likely fail.
 | 
					                            # likely fail.
 | 
				
			||||||
                            for bsuid in table.pps:
 | 
					                            for bsuid in table.pps:
 | 
				
			||||||
                                likely_pair = get_likely_pair(dst, bsuid)
 | 
					                                likely_pair = get_likely_pair(
 | 
				
			||||||
 | 
					                                    src_fiat,
 | 
				
			||||||
 | 
					                                    dst,
 | 
				
			||||||
 | 
					                                    bsuid,
 | 
				
			||||||
 | 
					                                )
 | 
				
			||||||
                                if likely_pair:
 | 
					                                if likely_pair:
 | 
				
			||||||
                                    break
 | 
					                                    break
 | 
				
			||||||
                            else:
 | 
					                            else:
 | 
				
			||||||
| 
						 | 
					@ -724,8 +711,8 @@ async def handle_order_updates(
 | 
				
			||||||
    '''
 | 
					    '''
 | 
				
			||||||
    Main msg handling loop for all things order management.
 | 
					    Main msg handling loop for all things order management.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    This code is broken out to make the context explicit and state variables
 | 
					    This code is broken out to make the context explicit and state
 | 
				
			||||||
    defined in the signature clear to the reader.
 | 
					    variables defined in the signature clear to the reader.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    '''
 | 
					    '''
 | 
				
			||||||
    async for msg in ws_stream:
 | 
					    async for msg in ws_stream:
 | 
				
			||||||
| 
						 | 
					@ -1204,7 +1191,13 @@ def norm_trade_records(
 | 
				
			||||||
            fqsn,
 | 
					            fqsn,
 | 
				
			||||||
            info={
 | 
					            info={
 | 
				
			||||||
                'lot_size_digits': pair_info.lot_decimals,
 | 
					                'lot_size_digits': pair_info.lot_decimals,
 | 
				
			||||||
 | 
					                'lot_tick_size': digits_to_dec(
 | 
				
			||||||
 | 
					                    pair_info.lot_decimals,
 | 
				
			||||||
 | 
					                ),
 | 
				
			||||||
                'tick_size_digits': pair_info.pair_decimals,
 | 
					                'tick_size_digits': pair_info.pair_decimals,
 | 
				
			||||||
 | 
					                'price_tick_size': digits_to_dec(
 | 
				
			||||||
 | 
					                    pair_info.pair_decimals,
 | 
				
			||||||
 | 
					                ),
 | 
				
			||||||
                'asset_type': 'crypto',
 | 
					                'asset_type': 'crypto',
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue