144 lines
3.7 KiB
Python
144 lines
3.7 KiB
Python
|
from datetime import datetime
|
||
|
import time
|
||
|
import trio
|
||
|
import pytest
|
||
|
import tractor
|
||
|
import math
|
||
|
from piker.log import get_logger
|
||
|
from piker.clearing._messages import (
|
||
|
Order
|
||
|
)
|
||
|
from typing import AsyncContextManager
|
||
|
|
||
|
from piker.pp import (
|
||
|
Position,
|
||
|
Transaction,
|
||
|
open_trade_ledger,
|
||
|
open_pps
|
||
|
)
|
||
|
|
||
|
from piker._daemon import (
|
||
|
find_service,
|
||
|
check_for_service,
|
||
|
Services,
|
||
|
)
|
||
|
from piker.data import (
|
||
|
open_feed,
|
||
|
)
|
||
|
from piker.clearing import (
|
||
|
open_ems,
|
||
|
)
|
||
|
from piker.clearing._messages import (
|
||
|
BrokerdPosition,
|
||
|
Status,
|
||
|
)
|
||
|
from piker.clearing._client import (
|
||
|
OrderBook,
|
||
|
)
|
||
|
|
||
|
log = get_logger(__name__)
|
||
|
|
||
|
|
||
|
def test_paper_trade(
|
||
|
open_test_pikerd: AsyncContextManager
|
||
|
):
|
||
|
|
||
|
async def main():
|
||
|
# type declares
|
||
|
book: OrderBook
|
||
|
trades_stream: tractor.MsgStream
|
||
|
pps: dict[str, list[BrokerdPosition]]
|
||
|
accounts: list[str]
|
||
|
dialogs: dict[str, Status]
|
||
|
|
||
|
async with (
|
||
|
open_test_pikerd() as (_, _, _, services),
|
||
|
|
||
|
open_ems(
|
||
|
'xbtusdt.kraken',
|
||
|
mode='paper',
|
||
|
) as (
|
||
|
book,
|
||
|
trades_stream,
|
||
|
pps,
|
||
|
accounts,
|
||
|
dialogs,
|
||
|
),
|
||
|
):
|
||
|
|
||
|
test_exec_mode='live'
|
||
|
test_action = 'buy'
|
||
|
test_oid = '560beac8-b1b1-4dee-bd1e-6604a704c9ea'
|
||
|
test_account = 'paper'
|
||
|
test_size = 1
|
||
|
test_price = 30000
|
||
|
test_broker = 'kraken'
|
||
|
test_brokers = [test_broker]
|
||
|
test_symbol = 'xbtusdt'
|
||
|
test_fqsn = f'{test_symbol}.{test_broker}'
|
||
|
test_pp_account = 'piker-paper'
|
||
|
|
||
|
order = Order(
|
||
|
exec_mode=test_exec_mode,
|
||
|
action=test_action,
|
||
|
oid=test_oid,
|
||
|
account=test_account,
|
||
|
size=test_size,
|
||
|
symbol=test_fqsn,
|
||
|
price=test_price,
|
||
|
brokers=test_brokers
|
||
|
)
|
||
|
|
||
|
book.send(order)
|
||
|
|
||
|
await trio.sleep(1)
|
||
|
|
||
|
cleared_ledger_entry = {}
|
||
|
# check if trades have been updated in in ledge and pp
|
||
|
with open_trade_ledger(test_broker, test_account) as ledger:
|
||
|
log.warning(f'ledger: {ledger}')
|
||
|
cleared_ledger_entry = ledger[test_oid]
|
||
|
assert list(ledger.keys())[0] == test_oid
|
||
|
assert cleared_ledger_entry['size'] == test_size
|
||
|
assert cleared_ledger_entry['fqsn'] == test_fqsn
|
||
|
|
||
|
with open_pps(test_broker, test_pp_account) as table:
|
||
|
# save pps in local state
|
||
|
assert table.brokername == test_broker
|
||
|
assert table.acctid == test_pp_account
|
||
|
# assert cleared_ledger_entry['price'] == table.conf.clears[0].price
|
||
|
pp_price = table.conf[test_broker][test_pp_account][test_fqsn]["ppu"]
|
||
|
assert math.isclose(pp_price, cleared_ledger_entry['size'], rel_tol=1)
|
||
|
|
||
|
raise KeyboardInterrupt
|
||
|
|
||
|
|
||
|
with pytest.raises(
|
||
|
trio.MultiError
|
||
|
) as exc_info:
|
||
|
trio.run(main)
|
||
|
|
||
|
|
||
|
def test_trades_persist(
|
||
|
open_test_pikerd: AsyncContextManager
|
||
|
):
|
||
|
|
||
|
async def main():
|
||
|
async with (
|
||
|
open_test_pikerd() as (_, _, _, services),
|
||
|
|
||
|
open_ems(
|
||
|
'xbtusdt.kraken',
|
||
|
mode='paper',
|
||
|
) as (
|
||
|
book,
|
||
|
trades_stream,
|
||
|
pps,
|
||
|
accounts,
|
||
|
dialogs,
|
||
|
),
|
||
|
):
|
||
|
print(f'pps: {pps}')
|
||
|
|
||
|
trio.run(main)
|