This commit is contained in:
Gérald LONLAS 2018-01-21 23:20:09 +00:00 committed by GitHub
commit f14e119b06
5 changed files with 56 additions and 31 deletions

View File

@ -87,7 +87,7 @@ class CryptoToFiatConverter():
fiat_symbol = fiat_symbol.upper()
# Check if the fiat convertion you want is supported
if not self._is_supported_fiat(fiat=fiat_symbol):
if not CryptoToFiatConverter.is_supported_fiat(fiat=fiat_symbol):
raise ValueError('The fiat {} is not supported.'.format(fiat_symbol))
# Get the pair that interest us and return the price in fiat
@ -131,7 +131,7 @@ class CryptoToFiatConverter():
return price
def _is_supported_fiat(self, fiat: str) -> bool:
def is_supported_fiat(fiat: str) -> bool:
"""
Check if the FIAT your want to convert to is supported
:param fiat: FIAT to check (e.g USD)
@ -140,7 +140,7 @@ class CryptoToFiatConverter():
fiat = fiat.upper()
return fiat in self.SUPPORTED_FIAT
return fiat in CryptoToFiatConverter.SUPPORTED_FIAT
def _find_price(self, crypto_symbol: str, fiat_symbol: str) -> float:
"""
@ -150,7 +150,7 @@ class CryptoToFiatConverter():
:return: float, price of the crypto-currency in Fiat
"""
# Check if the fiat convertion you want is supported
if not self._is_supported_fiat(fiat=fiat_symbol):
if not CryptoToFiatConverter.is_supported_fiat(fiat=fiat_symbol):
raise ValueError('The fiat {} is not supported.'.format(fiat_symbol))
try:
return float(

View File

@ -328,13 +328,26 @@ def create_trade(stake_amount: float, interval: int) -> bool:
break
else:
return False
# Calculate amount
buy_limit = get_target_bid(exchange.get_ticker(pair))
amount = stake_amount / buy_limit
order_id = exchange.buy(pair, buy_limit, amount)
# Fee is applied twice because we make a LIMIT_BUY and LIMIT_SELL
trade = Trade(
pair=pair,
stake_amount=stake_amount,
amount=amount,
fee=exchange.get_fee(),
open_rate=buy_limit,
open_date=datetime.utcnow(),
exchange=exchange.get_name().upper(),
open_order_id=order_id
)
Trade.session.add(trade)
Trade.session.flush()
fiat_converter = CryptoToFiatConverter()
stake_amount_fiat = fiat_converter.convert_amount(
stake_amount,
@ -350,19 +363,7 @@ def create_trade(stake_amount: float, interval: int) -> bool:
buy_limit, stake_amount, _CONF['stake_currency'],
stake_amount_fiat, _CONF['fiat_display_currency']
))
# Fee is applied twice because we make a LIMIT_BUY and LIMIT_SELL
trade = Trade(
pair=pair,
stake_amount=stake_amount,
amount=amount,
fee=exchange.get_fee(),
open_rate=buy_limit,
open_date=datetime.utcnow(),
exchange=exchange.get_name().upper(),
open_order_id=order_id
)
Trade.session.add(trade)
Trade.session.flush()
return True

View File

@ -87,6 +87,7 @@ def test_status_handle(default_conf, update, ticker, mocker):
mocker.patch.multiple('freqtrade.main.exchange',
validate_pairs=MagicMock(),
get_ticker=ticker)
mocker.patch('freqtrade.fiat_convert.Pymarketcap', MagicMock())
init(default_conf, create_engine('sqlite://'))
update_state(State.STOPPED)
@ -124,6 +125,7 @@ def test_status_table_handle(default_conf, update, ticker, mocker):
validate_pairs=MagicMock(),
get_ticker=ticker,
buy=MagicMock(return_value='mocked_order_id'))
mocker.patch('freqtrade.fiat_convert.Pymarketcap', MagicMock())
init(default_conf, create_engine('sqlite://'))
update_state(State.STOPPED)
_status_table(bot=MagicMock(), update=update)
@ -386,6 +388,7 @@ def test_performance_handle(
mocker.patch.multiple('freqtrade.main.exchange',
validate_pairs=MagicMock(),
get_ticker=ticker)
mocker.patch('freqtrade.fiat_convert.Pymarketcap', MagicMock())
init(default_conf, create_engine('sqlite://'))
# Create some test data
@ -493,6 +496,7 @@ def test_count_handle(default_conf, update, ticker, mocker):
validate_pairs=MagicMock(),
get_ticker=ticker,
buy=MagicMock(return_value='mocked_order_id'))
mocker.patch('freqtrade.fiat_convert.Pymarketcap', MagicMock())
init(default_conf, create_engine('sqlite://'))
update_state(State.STOPPED)
_count(bot=MagicMock(), update=update)

View File

@ -36,15 +36,16 @@ def test_pair_convertion_object():
assert pair_convertion.price == 30000.123
def test_fiat_convert_is_supported():
fiat_convert = CryptoToFiatConverter()
assert fiat_convert._is_supported_fiat(fiat='USD') is True
assert fiat_convert._is_supported_fiat(fiat='usd') is True
assert fiat_convert._is_supported_fiat(fiat='abc') is False
assert fiat_convert._is_supported_fiat(fiat='ABC') is False
def test_fiat_convert_is_supported(mocker):
assert CryptoToFiatConverter.is_supported_fiat(fiat='USD') is True
assert CryptoToFiatConverter.is_supported_fiat(fiat='usd') is True
assert CryptoToFiatConverter.is_supported_fiat(fiat='abc') is False
assert CryptoToFiatConverter.is_supported_fiat(fiat='ABC') is False
def test_fiat_convert_add_pair():
def test_fiat_convert_add_pair(mocker):
api_mock = MagicMock(return_value={})
mocker.patch('freqtrade.fiat_convert.Pymarketcap', api_mock)
fiat_convert = CryptoToFiatConverter()
assert len(fiat_convert._pairs) == 0
@ -64,10 +65,12 @@ def test_fiat_convert_add_pair():
def test_fiat_convert_find_price(mocker):
api_mock = MagicMock(return_value={
'price_usd': 12345.0,
'price_eur': 13000.2
'ticker': MagicMock(return_value={
'price_usd': 12345.0,
'price_eur': 13000.2
})
})
mocker.patch('freqtrade.fiat_convert.Pymarketcap.ticker', api_mock)
mocker.patch('freqtrade.fiat_convert.Pymarketcap', api_mock)
fiat_convert = CryptoToFiatConverter()
with pytest.raises(ValueError, match=r'The fiat ABC is not supported.'):
@ -83,10 +86,12 @@ def test_fiat_convert_find_price(mocker):
def test_fiat_convert_get_price(mocker):
api_mock = MagicMock(return_value={
'price_usd': 28000.0,
'price_eur': 15000.0
'ticker': MagicMock(return_value={
'price_usd': 28000.0,
'price_eur': 15000.0
})
})
mocker.patch('freqtrade.fiat_convert.Pymarketcap.ticker', api_mock)
mocker.patch('freqtrade.fiat_convert.Pymarketcap', api_mock)
mocker.patch('freqtrade.fiat_convert.CryptoToFiatConverter._find_price', return_value=28000.0)
fiat_convert = CryptoToFiatConverter()

View File

@ -58,6 +58,7 @@ def test_process_trade_creation(default_conf, ticker, limit_buy_order, health, m
get_wallet_health=health,
buy=MagicMock(return_value='mocked_limit_buy'),
get_order=MagicMock(return_value=limit_buy_order))
mocker.patch('freqtrade.fiat_convert.Pymarketcap', MagicMock())
init(default_conf, create_engine('sqlite://'))
trades = Trade.query.filter(Trade.is_open.is_(True)).all()
@ -123,6 +124,7 @@ def test_process_trade_handling(default_conf, ticker, limit_buy_order, health, m
get_wallet_health=health,
buy=MagicMock(return_value='mocked_limit_buy'),
get_order=MagicMock(return_value=limit_buy_order))
mocker.patch('freqtrade.fiat_convert.Pymarketcap', MagicMock())
init(default_conf, create_engine('sqlite://'))
trades = Trade.query.filter(Trade.is_open.is_(True)).all()
@ -144,6 +146,8 @@ def test_create_trade(default_conf, ticker, limit_buy_order, mocker):
validate_pairs=MagicMock(),
get_ticker=ticker,
buy=MagicMock(return_value='mocked_limit_buy'))
mocker.patch('freqtrade.fiat_convert.Pymarketcap', MagicMock())
# Save state of current whitelist
whitelist = copy.deepcopy(default_conf['exchange']['pair_whitelist'])
@ -176,6 +180,7 @@ def test_create_trade_minimal_amount(default_conf, ticker, mocker):
mocker.patch.multiple('freqtrade.main.exchange',
validate_pairs=MagicMock(),
get_ticker=ticker)
mocker.patch('freqtrade.fiat_convert.Pymarketcap', MagicMock())
init(default_conf, create_engine('sqlite://'))
min_stake_amount = 0.0005
create_trade(min_stake_amount, int(default_conf['ticker_interval']))
@ -278,6 +283,7 @@ def test_handle_overlpapping_signals(default_conf, ticker, mocker, caplog):
get_ticker=ticker,
buy=MagicMock(return_value='mocked_limit_buy'))
mocker.patch('freqtrade.main.min_roi_reached', return_value=False)
mocker.patch('freqtrade.fiat_convert.Pymarketcap', MagicMock())
init(default_conf, create_engine('sqlite://'))
create_trade(0.001, int(default_conf['ticker_interval']))
@ -324,6 +330,7 @@ def test_handle_trade_roi(default_conf, ticker, mocker, caplog):
get_ticker=ticker,
buy=MagicMock(return_value='mocked_limit_buy'))
mocker.patch('freqtrade.main.min_roi_reached', return_value=True)
mocker.patch('freqtrade.fiat_convert.Pymarketcap', MagicMock())
init(default_conf, create_engine('sqlite://'))
create_trade(0.001, int(default_conf['ticker_interval']))
@ -356,6 +363,7 @@ def test_handle_trade_experimental(default_conf, ticker, mocker, caplog):
get_ticker=ticker,
buy=MagicMock(return_value='mocked_limit_buy'))
mocker.patch('freqtrade.main.min_roi_reached', return_value=False)
mocker.patch('freqtrade.fiat_convert.Pymarketcap', MagicMock())
init(default_conf, create_engine('sqlite://'))
create_trade(0.001, int(default_conf['ticker_interval']))
@ -380,6 +388,7 @@ def test_close_trade(default_conf, ticker, limit_buy_order, limit_sell_order, mo
validate_pairs=MagicMock(),
get_ticker=ticker,
buy=MagicMock(return_value='mocked_limit_buy'))
mocker.patch('freqtrade.fiat_convert.Pymarketcap', MagicMock())
# Create trade and sell it
init(default_conf, create_engine('sqlite://'))
@ -595,6 +604,7 @@ def test_execute_sell_without_conf_sell_down(default_conf, ticker, ticker_sell_d
mocker.patch.multiple('freqtrade.main.exchange',
validate_pairs=MagicMock(),
get_ticker=ticker)
mocker.patch('freqtrade.fiat_convert.Pymarketcap', MagicMock())
init(default_conf, create_engine('sqlite://'))
# Create some test data
@ -627,6 +637,7 @@ def test_execute_sell_without_conf_sell_up(default_conf, ticker, ticker_sell_up,
mocker.patch.multiple('freqtrade.main.exchange',
validate_pairs=MagicMock(),
get_ticker=ticker)
mocker.patch('freqtrade.fiat_convert.Pymarketcap', MagicMock())
init(default_conf, create_engine('sqlite://'))
# Create some test data
@ -668,6 +679,7 @@ def test_sell_profit_only_enable_profit(default_conf, limit_buy_order, mocker):
'last': 0.00002172
}),
buy=MagicMock(return_value='mocked_limit_buy'))
mocker.patch('freqtrade.fiat_convert.Pymarketcap', MagicMock())
init(default_conf, create_engine('sqlite://'))
create_trade(0.001, int(default_conf['ticker_interval']))
@ -696,6 +708,7 @@ def test_sell_profit_only_disable_profit(default_conf, limit_buy_order, mocker):
'last': 0.00002172
}),
buy=MagicMock(return_value='mocked_limit_buy'))
mocker.patch('freqtrade.fiat_convert.Pymarketcap', MagicMock())
init(default_conf, create_engine('sqlite://'))
create_trade(0.001, int(default_conf['ticker_interval']))
@ -724,6 +737,7 @@ def test_sell_profit_only_enable_loss(default_conf, limit_buy_order, mocker):
'last': 0.00000172
}),
buy=MagicMock(return_value='mocked_limit_buy'))
mocker.patch('freqtrade.fiat_convert.Pymarketcap', MagicMock())
init(default_conf, create_engine('sqlite://'))
create_trade(0.001, int(default_conf['ticker_interval']))
@ -752,6 +766,7 @@ def test_sell_profit_only_disable_loss(default_conf, limit_buy_order, mocker):
'last': 0.00000172
}),
buy=MagicMock(return_value='mocked_limit_buy'))
mocker.patch('freqtrade.fiat_convert.Pymarketcap', MagicMock())
init(default_conf, create_engine('sqlite://'))
create_trade(0.001, int(default_conf['ticker_interval']))