Ejemplo n.º 1
0
def test_close_trade(default_conf, ticker, limit_buy_order, limit_sell_order,
                     mocker) -> None:
    """
    Test check_handle() method
    """
    patch_get_signal(mocker)
    patch_RPCManager(mocker)
    patch_coinmarketcap(mocker)
    mocker.patch.multiple('freqtrade.freqtradebot.exchange',
                          validate_pairs=MagicMock(),
                          get_ticker=ticker,
                          buy=MagicMock(return_value='mocked_limit_buy'))
    freqtrade = FreqtradeBot(default_conf, create_engine('sqlite://'))

    # Create trade and sell it
    freqtrade.create_trade()

    trade = Trade.query.first()
    assert trade

    trade.update(limit_buy_order)
    trade.update(limit_sell_order)
    assert trade.is_open is False

    with pytest.raises(ValueError, match=r'.*closed trade.*'):
        freqtrade.handle_trade(trade)
Ejemplo n.º 2
0
def test_handle_trade_experimental(default_conf, ticker, mocker,
                                   caplog) -> None:
    """
    Test check_handle() method
    """
    caplog.set_level(logging.DEBUG)
    conf = deepcopy(default_conf)
    conf.update({'experimental': {'use_sell_signal': True}})

    patch_get_signal(mocker)
    patch_RPCManager(mocker)
    patch_coinmarketcap(mocker)
    mocker.patch.multiple('freqtrade.freqtradebot.exchange',
                          validate_pairs=MagicMock(),
                          get_ticker=ticker,
                          buy=MagicMock(return_value='mocked_limit_buy'))
    mocker.patch('freqtrade.freqtradebot.Analyze.min_roi_reached',
                 return_value=False)

    freqtrade = FreqtradeBot(conf, create_engine('sqlite://'))
    freqtrade.create_trade()

    trade = Trade.query.first()
    trade.is_open = True

    patch_get_signal(mocker, value=(False, False))
    assert not freqtrade.handle_trade(trade)

    patch_get_signal(mocker, value=(False, True))
    assert freqtrade.handle_trade(trade)
    assert log_has('Sell signal received. Selling..', caplog.record_tuples)
Ejemplo n.º 3
0
def test_handle_overlpapping_signals(default_conf, ticker, mocker) -> None:
    """
    Test check_handle() method
    """
    conf = deepcopy(default_conf)
    conf.update({'experimental': {'use_sell_signal': True}})

    patch_get_signal(mocker, value=(True, True))
    patch_RPCManager(mocker)
    patch_coinmarketcap(mocker)
    mocker.patch('freqtrade.freqtradebot.Analyze.min_roi_reached',
                 return_value=False)
    mocker.patch.multiple('freqtrade.freqtradebot.exchange',
                          validate_pairs=MagicMock(),
                          get_ticker=ticker,
                          buy=MagicMock(return_value='mocked_limit_buy'))

    freqtrade = FreqtradeBot(conf, create_engine('sqlite://'))

    freqtrade.create_trade()

    # Buy and Sell triggering, so doing nothing ...
    trades = Trade.query.all()
    nb_trades = len(trades)
    assert nb_trades == 0

    # Buy is triggering, so buying ...
    patch_get_signal(mocker, value=(True, False))
    freqtrade.create_trade()
    trades = Trade.query.all()
    nb_trades = len(trades)
    assert nb_trades == 1
    assert trades[0].is_open is True

    # Buy and Sell are not triggering, so doing nothing ...
    patch_get_signal(mocker, value=(False, False))
    assert freqtrade.handle_trade(trades[0]) is False
    trades = Trade.query.all()
    nb_trades = len(trades)
    assert nb_trades == 1
    assert trades[0].is_open is True

    # Buy and Sell are triggering, so doing nothing ...
    patch_get_signal(mocker, value=(True, True))
    assert freqtrade.handle_trade(trades[0]) is False
    trades = Trade.query.all()
    nb_trades = len(trades)
    assert nb_trades == 1
    assert trades[0].is_open is True

    # Sell is triggering, guess what : we are Selling!
    patch_get_signal(mocker, value=(False, True))
    trades = Trade.query.all()
    assert freqtrade.handle_trade(trades[0]) is True
Ejemplo n.º 4
0
def test_handle_trade_roi(default_conf, ticker, mocker, caplog) -> None:
    """
    Test check_handle() method
    """
    caplog.set_level(logging.DEBUG)
    conf = deepcopy(default_conf)
    conf.update({'experimental': {'use_sell_signal': True}})

    patch_get_signal(mocker, value=(True, False))
    patch_RPCManager(mocker)
    patch_coinmarketcap(mocker)
    mocker.patch.multiple('freqtrade.freqtradebot.exchange',
                          validate_pairs=MagicMock(),
                          get_ticker=ticker,
                          buy=MagicMock(return_value='mocked_limit_buy'))

    mocker.patch('freqtrade.freqtradebot.Analyze.min_roi_reached',
                 return_value=True)
    freqtrade = FreqtradeBot(conf, create_engine('sqlite://'))
    freqtrade.create_trade()

    trade = Trade.query.first()
    trade.is_open = True

    # FIX: sniffing logs, suggest handle_trade should not execute_sell
    #      instead that responsibility should be moved out of handle_trade(),
    #      we might just want to check if we are in a sell condition without
    #      executing
    # if ROI is reached we must sell
    patch_get_signal(mocker, value=(False, True))
    assert freqtrade.handle_trade(trade)
    assert log_has('Required profit reached. Selling..', caplog.record_tuples)
Ejemplo n.º 5
0
def test_sell_profit_only_disable_loss(default_conf, limit_buy_order,
                                       mocker) -> None:
    """
    Test sell_profit_only feature when enabled and we have a loss
    """
    patch_get_signal(mocker)
    patch_RPCManager(mocker)
    patch_coinmarketcap(mocker)
    mocker.patch('freqtrade.freqtradebot.Analyze.min_roi_reached',
                 return_value=False)
    mocker.patch.multiple(
        'freqtrade.freqtradebot.exchange',
        validate_pairs=MagicMock(),
        get_ticker=MagicMock(return_value={
            'bid': 0.00000172,
            'ask': 0.00000173,
            'last': 0.00000172
        }),
        buy=MagicMock(return_value='mocked_limit_buy'))

    conf = deepcopy(default_conf)
    conf['experimental'] = {
        'use_sell_signal': True,
        'sell_profit_only': False,
    }

    freqtrade = FreqtradeBot(conf, create_engine('sqlite://'))
    freqtrade.create_trade()

    trade = Trade.query.first()
    trade.update(limit_buy_order)
    patch_get_signal(mocker, value=(False, True))
    assert freqtrade.handle_trade(trade) is True
Ejemplo n.º 6
0
def test_handle_trade(default_conf, limit_buy_order, limit_sell_order,
                      mocker) -> None:
    """
    Test check_handle() method
    """
    patch_get_signal(mocker)
    patch_RPCManager(mocker)
    mocker.patch.multiple(
        'freqtrade.freqtradebot.exchange',
        validate_pairs=MagicMock(),
        get_ticker=MagicMock(return_value={
            'bid': 0.00001172,
            'ask': 0.00001173,
            'last': 0.00001172
        }),
        buy=MagicMock(return_value='mocked_limit_buy'),
        sell=MagicMock(return_value='mocked_limit_sell'))
    patch_coinmarketcap(mocker, value={'price_usd': 15000.0})

    freqtrade = FreqtradeBot(default_conf, create_engine('sqlite://'))

    freqtrade.create_trade()

    trade = Trade.query.first()
    assert trade

    trade.update(limit_buy_order)
    assert trade.is_open is True

    patch_get_signal(mocker, value=(False, True))
    assert freqtrade.handle_trade(trade) is True
    assert trade.open_order_id == 'mocked_limit_sell'

    # Simulate fulfilled LIMIT_SELL order for trade
    trade.update(limit_sell_order)

    assert trade.close_rate == 0.00001173
    assert trade.close_profit == 0.06201057
    assert trade.calc_profit() == 0.00006217
    assert trade.close_date is not None