Skip to content

Commit

Permalink
[RealExchangeTester] Add bittrex tests
Browse files Browse the repository at this point in the history
  • Loading branch information
Herklos committed Mar 6, 2021
1 parent 48da615 commit 0d0359a
Showing 1 changed file with 131 additions and 0 deletions.
131 changes: 131 additions & 0 deletions tests_additional/real_exchanges/test_bittrex.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
# Drakkar-Software OctoBot-Trading
# Copyright (c) Drakkar-Software, All rights reserved.
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 3.0 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library.
import pytest
from ccxt.async_support import bittrex

import octobot_trading.errors
from octobot_commons.enums import TimeFrames, PriceIndexes
from octobot_trading.enums import ExchangeConstantsMarketStatusColumns as Ecmsc, \
ExchangeConstantsOrderBookInfoColumns as Ecobic, ExchangeConstantsOrderColumns as Ecoc, \
ExchangeConstantsTickersColumns as Ectc
from tests_additional.real_exchanges.real_exchange_tester import RealExchangeTester
# required to catch async loop context exceptions
from tests import event_loop

# All test coroutines will be treated as marked.
pytestmark = pytest.mark.asyncio


class TestBittrexRealExchangeTester(RealExchangeTester):
EXCHANGE_NAME = "bittrex"
SYMBOL = "BTC/USDT"

async def test_time_frames(self):
time_frames = await self.time_frames()
assert all(time_frame in time_frames for time_frame in (
TimeFrames.ONE_MINUTE.value,
TimeFrames.FIVE_MINUTES.value,
TimeFrames.ONE_HOUR.value,
TimeFrames.ONE_DAY.value
))

async def test_get_market_status(self):
market_status = await self.get_market_status()
assert market_status
assert market_status[Ecmsc.SYMBOL.value] == self.SYMBOL
assert market_status[Ecmsc.PRECISION.value]
assert market_status[Ecmsc.PRECISION.value][Ecmsc.PRECISION_AMOUNT.value] >= 1
assert market_status[Ecmsc.PRECISION.value][Ecmsc.PRECISION_PRICE.value] >= 1
assert all(elem in market_status[Ecmsc.LIMITS.value]
for elem in (Ecmsc.LIMITS_AMOUNT.value,
Ecmsc.LIMITS_PRICE.value,
Ecmsc.LIMITS_COST.value))

async def test_get_symbol_prices(self):
# without limit
symbol_prices = await self.get_symbol_prices()
assert len(symbol_prices) >= 744
# check candles order (oldest first)
self.ensure_elements_order(symbol_prices, PriceIndexes.IND_PRICE_TIME.value)
# check last candle is the current candle
assert symbol_prices[-1][PriceIndexes.IND_PRICE_TIME.value] >= self.get_time() - self.get_allowed_time_delta()

# try with candles limit (used in candled updater)
symbol_prices = await self.get_symbol_prices(limit=200)
assert len(symbol_prices) == 200
# check candles order (oldest first)
self.ensure_elements_order(symbol_prices, PriceIndexes.IND_PRICE_TIME.value)
# check last candle is the current candle
assert symbol_prices[-1][PriceIndexes.IND_PRICE_TIME.value] >= self.get_time() - self.get_allowed_time_delta()

async def test_get_kline_price(self):
kline_price = await self.get_kline_price()
assert len(kline_price) == 1
assert len(kline_price[0]) == 6
kline_start_time = kline_price[0][PriceIndexes.IND_PRICE_TIME.value]
# assert kline is the current candle
assert kline_start_time >= self.get_time() - self.get_allowed_time_delta()

async def test_get_order_book(self):
# fetchOrderBook() limit argument must be None, 1, 25 or 500, default is 25
order_book = await self.get_order_book(limit=25)
assert len(order_book[Ecobic.ASKS.value]) == 25
assert len(order_book[Ecobic.ASKS.value][0]) == 2
assert len(order_book[Ecobic.BIDS.value]) == 25
assert len(order_book[Ecobic.BIDS.value][0]) == 2

async def test_get_recent_trades(self):
recent_trades = await self.get_recent_trades()
assert len(recent_trades) == 50
# check trades order (oldest first)
self.ensure_elements_order(recent_trades, Ecoc.TIMESTAMP.value)

async def test_get_price_ticker(self):
ticker = await self.get_price_ticker()
self._check_ticker(ticker, self.SYMBOL, check_content=True)

async def test_get_all_currencies_price_ticker(self):
tickers = await self.get_all_currencies_price_ticker()
for symbol, ticker in tickers.items():
self._check_ticker(ticker, symbol)

@staticmethod
def _check_ticker(ticker, symbol, check_content=False):
assert ticker[Ectc.SYMBOL.value] == symbol
assert all(key in ticker for key in (
Ectc.HIGH.value,
Ectc.LOW.value,
Ectc.BID.value,
Ectc.BID_VOLUME.value,
Ectc.ASK.value,
Ectc.ASK_VOLUME.value,
Ectc.OPEN.value,
Ectc.CLOSE.value,
Ectc.LAST.value,
Ectc.PREVIOUS_CLOSE.value
))
if check_content:
assert ticker[Ectc.HIGH.value] is None
assert ticker[Ectc.LOW.value] is None
assert ticker[Ectc.BID.value]
assert ticker[Ectc.BID_VOLUME.value] is None
assert ticker[Ectc.ASK.value]
assert ticker[Ectc.ASK_VOLUME.value] is None
assert ticker[Ectc.OPEN.value] is None
assert ticker[Ectc.CLOSE.value]
assert ticker[Ectc.LAST.value]
assert ticker[Ectc.PREVIOUS_CLOSE.value] is None
assert ticker[Ectc.BASE_VOLUME.value] is None

0 comments on commit 0d0359a

Please sign in to comment.