async def create_stop_limit_order(self, pair: Pair, side: enums.OrderSide, amount: str, limit_price: str, stop_price: str, time_in_force: enums.TimeInForce = None, client_id: str = None) -> dict: data = { "instrument_code": map_pair(pair), "side": side.value, "type": enums.OrderType.STOP_LIMIT.value, "amount": amount, "price": limit_price, "trigger_price": stop_price } if client_id is not None: data['client_id'] = client_id if time_in_force is not None: data['time_in_force'] = time_in_force.value return await self._create_post("account/orders", data=data, signed=True)
async def get_account_orders(self, from_timestamp: datetime.datetime = None, to_timestamp: datetime.datetime = None, pair: Pair = None, with_cancelled_and_rejected: str = None, with_just_filled_inactive: str = None, with_just_orders: str = None, max_page_size: str = None, cursor: str = None) -> dict: params = BitpandaClient._clean_request_params({ "with_cancelled_and_rejected": with_cancelled_and_rejected, "with_just_filled_inactive": with_just_filled_inactive, "with_just_orders": with_just_orders, "max_page_size": max_page_size, "cursor": cursor, }) if pair is not None: params["instrument_code"] = map_pair(pair) if from_timestamp is not None: params["from"] = from_timestamp.astimezone(pytz.utc).isoformat() if to_timestamp is not None: params["to"] = to_timestamp.astimezone(pytz.utc).isoformat() return await self._create_get("account/orders", params=params, signed=True)
def to_json(self): ret = { "type": "CREATE_ORDER", "order": { "instrument_code": map_pair(self.pair), "type": self.type.value, "side": self.side.value, "amount": self.amount } } if self.price is not None: ret['order']['price'] = self.price if self.stop_price is not None: ret['order']['trigger_price'] = self.stop_price if self.client_id is not None: ret['order']['client_id'] = self.client_id if self.time_in_force is not None: ret['order']['time_in_force'] = self.time_in_force.value if self.is_post_only is not None: ret['order']['is_post_only'] = self.is_post_only return ret
async def get_order_book(self, pair: Pair, level: str = None) -> dict: params = BitpandaClient._clean_request_params({ "level": level, }) return await self._create_get("order-book/" + map_pair(pair), params=params)
async def delete_account_orders(self, pair: Pair = None) -> dict: params = {} if pair is not None: params["instrument_code"] = map_pair(pair) return await self._create_delete("account/orders", params=params, headers=self._get_header())
def get_subscription_message(self, **kwargs) -> dict: return { "name": self.get_channel_name(), "properties": [{ "instrument_code": map_pair(params.pair), "time_granularity": { "unit": params.unit.value, "period": params.period } } for params in sorted(self.subscription_params)] }
async def get_candlesticks(self, pair: Pair, unit: enums.TimeUnit, period: str, from_timestamp: datetime.datetime, to_timestamp: datetime.datetime) -> dict: params = { "unit": unit.value, "period": period, "from": from_timestamp.astimezone(pytz.utc).isoformat(), "to": to_timestamp.astimezone(pytz.utc).isoformat(), } return await self._create_get("candlesticks/" + map_pair(pair), params=params)
def to_json(self): ret = { "type": "CANCEL_ALL_ORDERS", } if self.order_ids is not None: ret['order_ids'] = self.order_ids if self.pair is not None: ret['instrument_code'] = map_pair(self.pair) return ret
async def get_price_tick(self, pair: Pair, from_timestamp: datetime.datetime = None, to_timestamp: datetime.datetime = None) -> dict: params = {} if from_timestamp is not None: params['from'] = from_timestamp.astimezone(pytz.utc).isoformat() if to_timestamp is not None: params['to'] = to_timestamp.astimezone(pytz.utc).isoformat() return await self._create_get("price-ticks/" + map_pair(pair), params=params)
async def delete_account_orders(self, pair: Pair = None, ids: List[str] = None) -> dict: params = {} if pair is not None: params["instrument_code"] = map_pair(pair) if ids is not None: params['ids'] = ','.join(ids) return await self._create_delete("account/orders", params=params, signed=True)
async def create_market_order(self, pair: Pair, side: enums.OrderSide, amount: str, client_id: str = None) -> dict: data = { "instrument_code": map_pair(pair), "side": side.value, "type": enums.OrderType.MARKET.value, "amount": amount } if client_id is not None: data['client_id'] = client_id return await self._create_post("account/orders", data=data, signed=True)
async def get_account_trades(self, from_timestamp: datetime.datetime = None, to_timestamp: datetime.datetime = None, pair: Pair = None, max_page_size: str = None, cursor: str = None) -> dict: params = BitpandaClient._clean_request_params({ "max_page_size": max_page_size, "cursor": cursor, }) if pair is not None: params["instrument_code"] = map_pair(pair) if from_timestamp is not None: params["from"] = from_timestamp.astimezone(pytz.utc).isoformat() if to_timestamp is not None: params["to"] = to_timestamp.astimezone(pytz.utc).isoformat() return await self._create_get("account/trades", params=params, signed=True)
async def get_market_ticker(self, pair: Pair) -> dict: return await self._create_get("market-ticker/" + map_pair(pair))