def test_account_state_event_to_from_dict_and_str_repr(self):
        # Arrange
        uuid = UUID4()
        balance = AccountBalance(
            currency=USD,
            total=Money(1525000, USD),
            locked=Money(0, USD),
            free=Money(1525000, USD),
        )
        event = AccountState(
            account_id=AccountId("SIM", "000"),
            account_type=AccountType.MARGIN,
            base_currency=USD,
            reported=True,
            balances=[balance],
            info={},
            event_id=uuid,
            ts_event=0,
            ts_init=0,
        )

        # Act, Assert
        assert AccountState.from_dict(AccountState.to_dict(event)) == event
        assert (
            str(event) ==
            f"AccountState(account_id=SIM-000, account_type=MARGIN, base_currency=USD, is_reported=True, balances=[AccountBalance(total=1_525_000.00 USD, locked=0.00 USD, free=1_525_000.00 USD)], event_id={uuid})"  # noqa
        )
        assert (
            repr(event) ==
            f"AccountState(account_id=SIM-000, account_type=MARGIN, base_currency=USD, is_reported=True, balances=[AccountBalance(total=1_525_000.00 USD, locked=0.00 USD, free=1_525_000.00 USD)], event_id={uuid})"  # noqa
        )
Example #2
0
def serialize(state: AccountState):
    result = []
    base = state.to_dict(state)
    del base["balances"]
    for balance in state.balances:
        data = {
            "balance_currency": balance.currency.code,
            "balance_total": balance.total.as_double(),
            "balance_locked": balance.locked.as_double(),
            "balance_free": balance.free.as_double(),
        }
        result.append({**base, **data})

    return result
Example #3
0
def serialize(state: AccountState):
    result: Dict[Tuple[Currency, Optional[InstrumentId]], Dict] = {}

    base = state.to_dict(state)
    del base["balances"]
    del base["margins"]
    base.update({
        "balance_total": None,
        "balance_locked": None,
        "balance_free": None,
        "balance_currency": None,
        "margin_initial": None,
        "margin_maintenance": None,
        "margin_currency": None,
        "margin_instrument_id": None,
    })

    for balance in state.balances:
        key = (balance.currency, None)
        if key not in result:
            result[key] = base.copy()
        result[key].update({
            "balance_total": balance.total.as_double(),
            "balance_locked": balance.locked.as_double(),
            "balance_free": balance.free.as_double(),
            "balance_currency": balance.currency.code,
        })

    for margin in state.margins:
        key = (margin.currency, margin.instrument_id)
        if key not in result:
            result[key] = base.copy()
        result[key].update({
            "margin_initial": margin.initial.as_double(),
            "margin_maintenance": margin.maintenance.as_double(),
            "margin_currency": margin.currency.code,
            "margin_instrument_id": margin.instrument_id.value,
        })

    return list(result.values())
    def generate_account_report(account: Account) -> pd.DataFrame:
        """
        Generate an account report for the given optional time range.

        Parameters
        ----------
        account : Account
            The account for the report.

        Returns
        -------
        pd.DataFrame

        """
        states = account.events

        if not states:
            return pd.DataFrame()

        account_states = [AccountState.to_dict(s) for s in states]
        balances = [{
            **balance,
            **state
        } for state in account_states
                    for balance in orjson.loads(state.pop("balances", "[]"))]

        if not account_states:
            return pd.DataFrame()

        report = pd.DataFrame(data=balances).set_index("ts_event").sort_index()
        report.index = [
            unix_nanos_to_dt(ts_event) for ts_event in report.index
        ]
        del report["ts_init"]
        del report["type"]
        del report["event_id"]

        return report