Пример #1
0
    def get_trades(
        self,
        market=None,
        side=None,
        accountOwner=None,
        accountNumber=None,
        transactionHash=None,
        limit=None,
        startingBefore=None,
    ):
        '''
        Returns all historical trades

        :param market: optional
        :type market: str[] of valid markets
            ["WETH-DAI", "DAI-USDC", "WETH-USDC", "PBTC-USDC"]

        :param side: optional
        :type side: str in list ["BUY", "SELL"]

        :param accountOwner: optional
        :type accountOwner: str (address)

        :param accountNumber: optional
        :type accountNumber: number

        :param transactionHash: optional
        :type transactionHash: str (hash)

        :param limit: optional, defaults to 100
        :type limit: number

        :param startingBefore: optional, defaults to now
        :type startingBefore: str (ISO-8601)

        :returns: list of existing trades

        :raises: DydxAPIError
        '''
        return self._get('/v2/trades',
                         params=utils.remove_nones({
                             'market':
                             None if market is None else ','.join(market),
                             'side':
                             side,
                             'accountOwner':
                             accountOwner,
                             'accountNumber':
                             accountNumber,
                             'transactionHash':
                             transactionHash,
                             'limit':
                             limit,
                             'startingBefore':
                             startingBefore,
                         }))
Пример #2
0
    def get_balances(self, address, number=0):
        '''
        Return balances for an address and account number

        :param address: required
        :type address: str (address)

        :param number: optional, defaults to 0
        :type number: number

        :returns: list of balances

        :raises: DydxAPIError
        '''
        return self._get('/v1/accounts/' + address,
                         params=utils.remove_nones({'number': number}))
Пример #3
0
    def get_trades(
        self,
        pairs,
        makerAccountOwner=None,
        makerAccountNumber=None,
        limit=None,
        startingBefore=None,
    ):
        """
        Return all historical trades

        :param pairs: required
        :type pairs: list of str

        :param makerAccountOwner: optional
        :type makerAccountOwner: str (address)

        :param makerAccountNumber: optional
        :type makerAccountNumber: number

        :param limit: optional, defaults to 100
        :type limit: number

        :param startingBefore: optional, defaults to now
        :type startingBefore: str (ISO-8601)

        :returns: list of processed trades

        :raises: DydxAPIError
        """
        return self._get(
            "dex/trades",
            params=utils.remove_nones(
                {
                    "pairs": ",".join(pairs),
                    "makerAccountOwner": makerAccountOwner,
                    "makerAccountNumber": makerAccountNumber,
                    "limit": limit,
                    "startingBefore": startingBefore,
                }
            ),
        )
Пример #4
0
    def get_orders(
        self,
        pairs,
        makerAccountOwner=None,
        makerAccountNumber=None,
        limit=None,
        startingBefore=None,
    ):
        """
        Return all open orders

        :param pairs: required
        :type pairs: list of str

        :param makerAccountOwner: optional, defaults to self.public_address
        :type makerAccountOwner: str (address)

        :param makerAccountNumber: optional, defaults to self.account_number
        :type makerAccountNumber: number

        :param limit: optional, defaults to 100
        :type limit: number

        :param startingBefore: optional, defaults to now
        :type startingBefore: str (ISO-8601)

        :returns: list of existing orders

        :raises: DydxAPIError
        """
        return self._get(
            "dex/orders",
            params=utils.remove_nones(
                {
                    "pairs": ",".join(pairs),
                    "makerAccountOwner": makerAccountOwner,
                    "makerAccountNumber": makerAccountNumber,
                    "limit": limit,
                    "startingBefore": startingBefore,
                }
            ),
        )
Пример #5
0
    def get_trades(self,
                   pairs,
                   makerAccountOwner=None,
                   makerAccountNumber=None,
                   limit=None,
                   startingBefore=None):
        '''
        Return all historical trades

        :param pairs: required
        :type pairs: list of str

        :param makerAccountOwner: optional
        :type makerAccountOwner: str (address)

        :param makerAccountNumber: optional
        :type makerAccountNumber: number

        :param limit: optional, defaults to 100
        :type limit: number

        :param startingBefore: optional, defaults to now
        :type startingBefore: str (ISO-8601)

        :returns: list of processed trades

        :raises: DydxAPIError
        '''
        return self._get('dex/trades',
                         params=utils.remove_nones({
                             'pairs':
                             ','.join(pairs),
                             'makerAccountOwner':
                             makerAccountOwner,
                             'makerAccountNumber':
                             makerAccountNumber,
                             'limit':
                             limit,
                             'startingBefore':
                             startingBefore
                         }))
Пример #6
0
    def get_orders(self,
                   pairs,
                   makerAccountOwner=None,
                   makerAccountNumber=None,
                   limit=None,
                   startingBefore=None):
        '''
        Return all open orders

        :param pairs: required
        :type pairs: list of str

        :param makerAccountOwner: optional, defaults to self.public_address
        :type makerAccountOwner: str (address)

        :param makerAccountNumber: optional, defaults to self.account_number
        :type makerAccountNumber: number

        :param limit: optional, defaults to 100
        :type limit: number

        :param startingBefore: optional, defaults to now
        :type startingBefore: str (ISO-8601)

        :returns: list of existing orders

        :raises: DydxAPIError
        '''
        return self._get('dex/orders',
                         params=utils.remove_nones({
                             'pairs':
                             ','.join(pairs),
                             'makerAccountOwner':
                             makerAccountOwner,
                             'makerAccountNumber':
                             makerAccountNumber,
                             'limit':
                             limit,
                             'startingBefore':
                             startingBefore
                         }))
Пример #7
0
    def place_order(
        self,
        market,
        side,
        amount,
        price,
        expiration=None,
        limitFee=None,
        fillOrKill=False,
        postOnly=False,
        clientId=None,
        cancelAmountOnRevert=None,
        cancelId=None,
    ):
        '''
        Create an order

        :param market: required
        :type market: str in list
            ["WETH-DAI", "WETH-USDC", "DAI-USDC", "PBTC-USDC"]

        :param side: required
        :type side: str in list ["BUY", "SELL"]

        :param amount: required
        :type amount: number

        :param price: required
        :type price: Decimal

        :param expiration: optional, defaults to 28 days from now
        :type expiration: number

        :param limitFee: optional, defaults to None
        :type limitFee: Decimal

        :param fillOrKill: optional, defaults to False
        :type fillOrKill: bool

        :param postOnly: optional, defaults to False
        :type postOnly: bool

        :param clientId: optional, defaults to None
        :type clientId: string

        :param cancelAmountOnRevert: optional, defaults to None
        :type cancelAmountOnRevert: bool

        :param cancelId: optional, defaults to None
        :type cancelId: string

        :returns: Order

        :raises: DydxAPIError
        '''

        if market == consts.PAIR_PBTC_USDC:

            order = self._make_perp_order(
                market,
                side,
                amount,
                price,
                expiration,
                limitFee,
                postOnly,
            )

            market_api_request = market

            order_api_request = {
                'isBuy': order['isBuy'],
                'isDecreaseOnly': False,
                'amount': str(order['amount']),
                'limitPrice': utils.decimalToStr(order['limitPrice']),
                'triggerPrice': utils.decimalToStr(order['triggerPrice']),
                'limitFee': utils.decimalToStr(order['limitFee']),
                'maker': order['maker'],
                'taker': order['taker'],
                'expiration': str(order['expiration']),
                'salt': str(order['salt']),
                'typedSignature': order['typedSignature'],
            }

        else:

            order = self._make_solo_order(
                market,
                side,
                amount,
                price,
                expiration,
                limitFee,
                postOnly,
            )

            market_api_request = None

            order_api_request = {
                'isBuy': order['isBuy'],
                'isDecreaseOnly': False,
                'baseMarket': str(order['baseMarket']),
                'quoteMarket': str(order['quoteMarket']),
                'amount': str(order['amount']),
                'limitPrice': utils.decimalToStr(order['limitPrice']),
                'triggerPrice': utils.decimalToStr(order['triggerPrice']),
                'limitFee': utils.decimalToStr(order['limitFee']),
                'makerAccountOwner': order['makerAccountOwner'],
                'makerAccountNumber': str(order['makerAccountNumber']),
                'expiration': str(order['expiration']),
                'salt': str(order['salt']),
                'typedSignature': order['typedSignature'],
            }

        return self._post('/v2/orders',
                          data=json.dumps(
                              utils.remove_nones({
                                  'fillOrKill': fillOrKill,
                                  'postOnly': postOnly,
                                  'clientId': clientId,
                                  'cancelAmountOnRevert': cancelAmountOnRevert,
                                  'cancelId': cancelId,
                                  'market': market_api_request,
                                  'order': order_api_request
                              })))
Пример #8
0
    def get_orders(
        self,
        market=None,
        side=None,
        status=None,
        orderType=None,
        accountOwner=None,
        accountNumber=None,
        limit=None,
        startingBefore=None,
    ):
        '''
        Returns all open orders

        :param market: optional
        :type market: str[] of valid markets
            ["WETH-DAI", "DAI-USDC", "WETH-USDC", "PBTC-USDC"]

        :param side: optional
        :type side: str in list ["BUY", "SELL"]

        :param status: optional
        :type status: str[] of valid statuses
            ["PENDING",
             "OPEN",
             "FILLED",
             "PARTIALLY_FILLED",
             "CANCELED",
             "UNTRIGGERED"]

        :param orderType: optional
        :type orderType: str[] of valid order types
          ["LIMIT", "ISOLATED_MARKET", "STOP_LIMIT"]

        :param accountOwner: optional
        :type accountOwner: str (address)

        :param accountNumber: optional
        :type accountNumber: number

        :param limit: optional, defaults to 100
        :type limit: number

        :param startingBefore: optional, defaults to now
        :type startingBefore: str (ISO-8601)

        :returns: list of existing orders

        :raises: DydxAPIError
        '''
        return self._get(
            '/v2/orders',
            params=utils.remove_nones({
                'market':
                None if market is None else ','.join(market),
                'side':
                side,
                'status':
                None if status is None else ','.join(status),
                'orderType':
                None if orderType is None else ','.join(orderType),
                'accountOwner':
                accountOwner,
                'accountNumber':
                accountNumber,
                'limit':
                limit,
                'startingBefore':
                startingBefore
            }))
Пример #9
0
    def create_order(
        self,
        makerMarket,
        takerMarket,
        makerAmount,
        takerAmount,
        expiration=None,
        fillOrKill=False,
        clientId=None,
    ):
        '''
        Create an order

        :param makerMarket: required
        :type makerMarket: number

        :param takerMarket: required
        :type takerMarket: number

        :param makerAmount: required
        :type makerAmount: number

        :param takerAmount: required
        :type takerAmount: number

        :param expiration: optional, defaults to 28 days from now
        :type expiration: number

        :param fillOrKill: optional, defaults to False
        :type fillOrKill: bool

        :param clientId: optional, defaults to None
        :type clientId: string

        :returns: Order

        :raises: DydxAPIError
        '''

        order = {
            'makerMarket': makerMarket,
            'takerMarket': takerMarket,
            'makerAmount': makerAmount,
            'takerAmount': takerAmount,
            'makerAccountOwner': self.public_address,
            'makerAccountNumber': self.account_number,
            'takerAccountOwner': self.TAKER_ACCOUNT_OWNER,
            'takerAccountNumber': self.TAKER_ACCOUNT_NUMBER,
            'expiration': expiration or utils.epoch_in_four_weeks(),
            'salt': random.randint(0, 2**256)
        }
        order['typedSignature'] = utils.sign_order(order, self.private_key)

        return self._post('dex/orders',
                          data=json.dumps(
                              utils.remove_nones({
                                  'fillOrKill': fillOrKill,
                                  'clientId': clientId,
                                  'order':
                                  {k: str(v)
                                   for k, v in order.items()}
                              })))
Пример #10
0
    def replace_order(
        self,
        makerMarket,
        takerMarket,
        makerAmount,
        takerAmount,
        cancelId,
        expiration=None,
        fillOrKill=False,
        cancelAmountOnRevert=False,
        postOnly=False,
        clientId=None,
    ):
        '''
        Replace an existing order

        :param makerMarket: required
        :type makerMarket: number

        :param takerMarket: required
        :type takerMarket: number

        :param makerAmount: required
        :type makerAmount: number

        :param takerAmount: required
        :type takerAmount: number

        :param cancelId: required
        :type cancelId: str

        :param expiration: optional, defaults to 28 days from now
        :type expiration: number

        :param fillOrKill: optional, defaults to False
        :type fillOrKill: bool

        :param cancelAmountOnRevert: optional, defaults to False
        :type cancelAmountOnRevert: bool

        :param postOnly: optional, defaults to False
        :type postOnly: bool

        :param clientId: optional, defaults to None
        :type clientId: string

        :returns: Order

        :raises: DydxAPIError
        '''

        order = self._make_order(
            makerMarket,
            takerMarket,
            makerAmount,
            takerAmount,
            expiration,
        )

        return self._post(
            '/v1/dex/orders/replace',
            data=json.dumps(
                utils.remove_nones({
                    'cancelId': cancelId,
                    'fillOrKill': fillOrKill,
                    'cancelAmountOnRevert': cancelAmountOnRevert,
                    'postOnly': postOnly,
                    'clientId': clientId,
                    'order': {k: str(v)
                              for k, v in order.items()},
                })),
        )
Пример #11
0
    def create_order(
        self,
        makerMarket,
        takerMarket,
        makerAmount,
        takerAmount,
        expiration=None,
        fillOrKill=False,
        clientId=None,
    ):
        """
        Create an order

        :param makerMarket: required
        :type makerMarket: number

        :param takerMarket: required
        :type takerMarket: number

        :param makerAmount: required
        :type makerAmount: number

        :param takerAmount: required
        :type takerAmount: number

        :param expiration: optional, defaults to 28 days from now
        :type expiration: number

        :param fillOrKill: optional, defaults to False
        :type fillOrKill: bool

        :param clientId: optional, defaults to None
        :type clientId: string

        :returns: Order

        :raises: DydxAPIError
        """

        order = {
            "makerMarket": makerMarket,
            "takerMarket": takerMarket,
            "makerAmount": makerAmount,
            "takerAmount": takerAmount,
            "makerAccountOwner": self.public_address,
            "makerAccountNumber": self.account_number,
            "takerAccountOwner": self.TAKER_ACCOUNT_OWNER,
            "takerAccountNumber": self.TAKER_ACCOUNT_NUMBER,
            "expiration": expiration or utils.epoch_in_four_weeks(),
            "salt": random.randint(0, 2 ** 256),
        }
        order["typedSignature"] = utils.sign_order(order, self.private_key)

        return self._post(
            "dex/orders",
            data=json.dumps(
                utils.remove_nones(
                    {
                        "fillOrKill": fillOrKill,
                        "clientId": clientId,
                        "order": {k: str(v) for k, v in order.items()},
                    }
                )
            ),
        )