@ -10,7 +10,6 @@ from sqlalchemy import create_engine
import freqtrade . main as main
from freqtrade import DependencyException , OperationalException
from freqtrade . analyze import SignalType
from freqtrade . exchange import Exchanges
from freqtrade . main import ( _process , check_handle_timedout , create_trade ,
execute_sell , get_target_bid , handle_trade , init )
@ -52,7 +51,7 @@ def test_main_start_hyperopt(mocker):
def test_process_trade_creation ( default_conf , ticker , limit_buy_order , health , mocker ) :
mocker . patch . dict ( ' freqtrade.main._CONF ' , default_conf )
mocker . patch . multiple ( ' freqtrade.rpc ' , init = MagicMock ( ) , send_msg = MagicMock ( ) )
mocker . patch ( ' freqtrade.main.get_signal ' , side_effect = lambda s , t : True )
mocker . patch ( ' freqtrade.main.get_signal ' , side_effect = lambda s : ( True , False ) )
mocker . patch . multiple ( ' freqtrade.main.exchange ' ,
validate_pairs = MagicMock ( ) ,
get_ticker = ticker ,
@ -82,7 +81,7 @@ def test_process_trade_creation(default_conf, ticker, limit_buy_order, health, m
def test_process_exchange_failures ( default_conf , ticker , health , mocker ) :
mocker . patch . dict ( ' freqtrade.main._CONF ' , default_conf )
mocker . patch . multiple ( ' freqtrade.rpc ' , init = MagicMock ( ) , send_msg = MagicMock ( ) )
mocker . patch ( ' freqtrade.main.get_signal ' , side_effect = lambda s , t : True )
mocker . patch ( ' freqtrade.main.get_signal ' , side_effect = lambda s : ( True , False ) )
sleep_mock = mocker . patch ( ' time.sleep ' , side_effect = lambda _ : None )
mocker . patch . multiple ( ' freqtrade.main.exchange ' ,
validate_pairs = MagicMock ( ) ,
@ -99,7 +98,7 @@ def test_process_operational_exception(default_conf, ticker, health, mocker):
msg_mock = MagicMock ( )
mocker . patch . dict ( ' freqtrade.main._CONF ' , default_conf )
mocker . patch . multiple ( ' freqtrade.rpc ' , init = MagicMock ( ) , send_msg = msg_mock )
mocker . patch ( ' freqtrade.main.get_signal ' , side_effect = lambda s , t : True )
mocker . patch ( ' freqtrade.main.get_signal ' , side_effect = lambda s : ( True , False ) )
mocker . patch . multiple ( ' freqtrade.main.exchange ' ,
validate_pairs = MagicMock ( ) ,
get_ticker = ticker ,
@ -117,8 +116,7 @@ def test_process_operational_exception(default_conf, ticker, health, mocker):
def test_process_trade_handling ( default_conf , ticker , limit_buy_order , health , mocker ) :
mocker . patch . dict ( ' freqtrade.main._CONF ' , default_conf )
mocker . patch . multiple ( ' freqtrade.rpc ' , init = MagicMock ( ) , send_msg = MagicMock ( ) )
mocker . patch ( ' freqtrade.main.get_signal ' ,
side_effect = lambda * args : False if args [ 1 ] == SignalType . SELL else True )
mocker . patch ( ' freqtrade.main.get_signal ' , side_effect = lambda s : ( True , False ) )
mocker . patch . multiple ( ' freqtrade.main.exchange ' ,
validate_pairs = MagicMock ( ) ,
get_ticker = ticker ,
@ -140,7 +138,7 @@ def test_process_trade_handling(default_conf, ticker, limit_buy_order, health, m
def test_create_trade ( default_conf , ticker , limit_buy_order , mocker ) :
mocker . patch . dict ( ' freqtrade.main._CONF ' , default_conf )
mocker . patch ( ' freqtrade.main.get_signal ' , side_effect = lambda s , t : True )
mocker . patch ( ' freqtrade.main.get_signal ' , side_effect = lambda s : ( True , False ) )
mocker . patch . multiple ( ' freqtrade.rpc ' , init = MagicMock ( ) , send_msg = MagicMock ( ) )
mocker . patch . multiple ( ' freqtrade.main.exchange ' ,
validate_pairs = MagicMock ( ) ,
@ -171,7 +169,7 @@ def test_create_trade(default_conf, ticker, limit_buy_order, mocker):
def test_create_trade_minimal_amount ( default_conf , ticker , mocker ) :
mocker . patch . dict ( ' freqtrade.main._CONF ' , default_conf )
mocker . patch . multiple ( ' freqtrade.rpc ' , init = MagicMock ( ) , send_msg = MagicMock ( ) )
mocker . patch ( ' freqtrade.main.get_signal ' , side_effect = lambda s , t : True )
mocker . patch ( ' freqtrade.main.get_signal ' , side_effect = lambda s : ( True , False ) )
buy_mock = mocker . patch (
' freqtrade.main.exchange.buy ' , MagicMock ( return_value = ' mocked_limit_buy ' )
)
@ -187,7 +185,7 @@ def test_create_trade_minimal_amount(default_conf, ticker, mocker):
def test_create_trade_no_stake_amount ( default_conf , ticker , mocker ) :
mocker . patch . dict ( ' freqtrade.main._CONF ' , default_conf )
mocker . patch ( ' freqtrade.main.get_signal ' , side_effect = lambda s , t : True )
mocker . patch ( ' freqtrade.main.get_signal ' , side_effect = lambda s : ( True , False ) )
mocker . patch . multiple ( ' freqtrade.rpc ' , init = MagicMock ( ) , send_msg = MagicMock ( ) )
mocker . patch . multiple ( ' freqtrade.main.exchange ' ,
validate_pairs = MagicMock ( ) ,
@ -200,7 +198,7 @@ def test_create_trade_no_stake_amount(default_conf, ticker, mocker):
def test_create_trade_no_pairs ( default_conf , ticker , mocker ) :
mocker . patch . dict ( ' freqtrade.main._CONF ' , default_conf )
mocker . patch ( ' freqtrade.main.get_signal ' , side_effect = lambda s , t : True )
mocker . patch ( ' freqtrade.main.get_signal ' , side_effect = lambda s : ( True , False ) )
mocker . patch . multiple ( ' freqtrade.rpc ' , init = MagicMock ( ) , send_msg = MagicMock ( ) )
mocker . patch . multiple ( ' freqtrade.main.exchange ' ,
validate_pairs = MagicMock ( ) ,
@ -216,7 +214,7 @@ def test_create_trade_no_pairs(default_conf, ticker, mocker):
def test_create_trade_no_pairs_after_blacklist ( default_conf , ticker , mocker ) :
mocker . patch . dict ( ' freqtrade.main._CONF ' , default_conf )
mocker . patch ( ' freqtrade.main.get_signal ' , side_effect = lambda s , t : True )
mocker . patch ( ' freqtrade.main.get_signal ' , side_effect = lambda s : ( True , False ) )
mocker . patch . multiple ( ' freqtrade.rpc ' , init = MagicMock ( ) , send_msg = MagicMock ( ) )
mocker . patch . multiple ( ' freqtrade.main.exchange ' ,
validate_pairs = MagicMock ( ) ,
@ -233,7 +231,7 @@ def test_create_trade_no_pairs_after_blacklist(default_conf, ticker, mocker):
def test_handle_trade ( default_conf , limit_buy_order , limit_sell_order , mocker ) :
mocker . patch . dict ( ' freqtrade.main._CONF ' , default_conf )
mocker . patch ( ' freqtrade.main.get_signal ' , side_effect = lambda s , t : True )
mocker . patch ( ' freqtrade.main.get_signal ' , side_effect = lambda s : ( True , False ) )
mocker . patch . multiple ( ' freqtrade.rpc ' , init = MagicMock ( ) , send_msg = MagicMock ( ) )
mocker . patch . multiple ( ' freqtrade.main.exchange ' ,
validate_pairs = MagicMock ( ) ,
@ -256,6 +254,7 @@ def test_handle_trade(default_conf, limit_buy_order, limit_sell_order, mocker):
trade . update ( limit_buy_order )
assert trade . is_open is True
mocker . patch ( ' freqtrade.main.get_signal ' , side_effect = lambda s : ( False , True ) )
handle_trade ( trade )
assert trade . open_order_id == ' mocked_limit_sell '
@ -272,7 +271,7 @@ def test_handle_trade_roi(default_conf, ticker, mocker, caplog):
default_conf . update ( { ' experimental ' : { ' use_sell_signal ' : True } } )
mocker . patch . dict ( ' freqtrade.main._CONF ' , default_conf )
mocker . patch ( ' freqtrade.main.get_signal ' , side_effect = lambda s , t : True )
mocker . patch ( ' freqtrade.main.get_signal ' , side_effect = lambda s : ( True , False ) )
mocker . patch . multiple ( ' freqtrade.rpc ' , init = MagicMock ( ) , send_msg = MagicMock ( ) )
mocker . patch . multiple ( ' freqtrade.main.exchange ' ,
validate_pairs = MagicMock ( ) ,
@ -291,11 +290,11 @@ def test_handle_trade_roi(default_conf, ticker, mocker, caplog):
# we might just want to check if we are in a sell condition without
# executing
# if ROI is reached we must sell
mocker . patch ( ' freqtrade.main.get_signal ' , side_effect = lambda s , t : False )
mocker . patch ( ' freqtrade.main.get_signal ' , side_effect = lambda s : ( False , True ) )
assert handle_trade ( trade )
assert ( ' freqtrade ' , logging . DEBUG , ' Executing sell due to ROI ... ' ) in caplog . record_tuples
# if ROI is reached we must sell even if sell-signal is not signalled
mocker . patch ( ' freqtrade.main.get_signal ' , side_effect = lambda s , t : True )
mocker . patch ( ' freqtrade.main.get_signal ' , side_effect = lambda s : ( False , True ) )
assert handle_trade ( trade )
assert ( ' freqtrade ' , logging . DEBUG , ' Executing sell due to ROI ... ' ) in caplog . record_tuples
@ -304,7 +303,7 @@ def test_handle_trade_experimental(default_conf, ticker, mocker, caplog):
default_conf . update ( { ' experimental ' : { ' use_sell_signal ' : True } } )
mocker . patch . dict ( ' freqtrade.main._CONF ' , default_conf )
mocker . patch ( ' freqtrade.main.get_signal ' , side_effect = lambda s , t : True )
mocker . patch ( ' freqtrade.main.get_signal ' , side_effect = lambda s : ( True , False ) )
mocker . patch . multiple ( ' freqtrade.rpc ' , init = MagicMock ( ) , send_msg = MagicMock ( ) )
mocker . patch . multiple ( ' freqtrade.main.exchange ' ,
validate_pairs = MagicMock ( ) ,
@ -318,11 +317,10 @@ def test_handle_trade_experimental(default_conf, ticker, mocker, caplog):
trade = Trade . query . first ( )
trade . is_open = True
mocker . patch ( ' freqtrade.main.get_signal ' , side_effect = lambda s , t : False )
mocker . patch ( ' freqtrade.main.get_signal ' , side_effect = lambda s : ( False , False ) )
value_returned = handle_trade ( trade )
assert ( ' freqtrade ' , logging . DEBUG , ' Checking sell_signal ... ' ) in caplog . record_tuples
assert value_returned is False
mocker . patch ( ' freqtrade.main.get_signal ' , side_effect = lambda s , t : True )
mocker . patch ( ' freqtrade.main.get_signal ' , side_effect = lambda s : ( False , True ) )
assert handle_trade ( trade )
s = ' Executing sell due to sell signal ... '
assert ( ' freqtrade ' , logging . DEBUG , s ) in caplog . record_tuples
@ -330,7 +328,7 @@ def test_handle_trade_experimental(default_conf, ticker, mocker, caplog):
def test_close_trade ( default_conf , ticker , limit_buy_order , limit_sell_order , mocker ) :
mocker . patch . dict ( ' freqtrade.main._CONF ' , default_conf )
mocker . patch ( ' freqtrade.main.get_signal ' , side_effect = lambda s , t : True )
mocker . patch ( ' freqtrade.main.get_signal ' , side_effect = lambda s : ( True , False ) )
mocker . patch . multiple ( ' freqtrade.rpc ' , init = MagicMock ( ) , send_msg = MagicMock ( ) )
mocker . patch . multiple ( ' freqtrade.main.exchange ' ,
validate_pairs = MagicMock ( ) ,
@ -469,7 +467,7 @@ def test_balance_bigger_last_ask(mocker):
def test_execute_sell_up ( default_conf , ticker , ticker_sell_up , mocker ) :
mocker . patch . dict ( ' freqtrade.main._CONF ' , default_conf )
mocker . patch ( ' freqtrade.main.get_signal ' , side_effect = lambda s , t : True )
mocker . patch ( ' freqtrade.main.get_signal ' , side_effect = lambda s : ( True , False ) )
mocker . patch ( ' freqtrade.rpc.init ' , MagicMock ( ) )
rpc_mock = mocker . patch ( ' freqtrade.main.rpc.send_msg ' , MagicMock ( ) )
mocker . patch . multiple ( ' freqtrade.main.exchange ' ,
@ -502,7 +500,7 @@ def test_execute_sell_up(default_conf, ticker, ticker_sell_up, mocker):
def test_execute_sell_down ( default_conf , ticker , ticker_sell_down , mocker ) :
mocker . patch . dict ( ' freqtrade.main._CONF ' , default_conf )
mocker . patch ( ' freqtrade.main.get_signal ' , side_effect = lambda s , t : True )
mocker . patch ( ' freqtrade.main.get_signal ' , side_effect = lambda s : ( True , False ) )
mocker . patch ( ' freqtrade.rpc.init ' , MagicMock ( ) )
rpc_mock = mocker . patch ( ' freqtrade.main.rpc.send_msg ' , MagicMock ( ) )
mocker . patch . multiple ( ' freqtrade.rpc.telegram ' ,
@ -539,7 +537,7 @@ def test_execute_sell_down(default_conf, ticker, ticker_sell_down, mocker):
def test_execute_sell_without_conf ( default_conf , ticker , ticker_sell_up , mocker ) :
mocker . patch . dict ( ' freqtrade.main._CONF ' , default_conf )
mocker . patch ( ' freqtrade.main.get_signal ' , side_effect = lambda s , t : True )
mocker . patch ( ' freqtrade.main.get_signal ' , side_effect = lambda s : ( True , False ) )
mocker . patch ( ' freqtrade.rpc.init ' , MagicMock ( ) )
rpc_mock = mocker . patch ( ' freqtrade.main.rpc.send_msg ' , MagicMock ( ) )
mocker . patch . multiple ( ' freqtrade.main.exchange ' ,
@ -576,7 +574,7 @@ def test_sell_profit_only_enable_profit(default_conf, limit_buy_order, mocker):
mocker . patch . dict ( ' freqtrade.main._CONF ' , default_conf )
mocker . patch ( ' freqtrade.main.min_roi_reached ' , return_value = False )
mocker . patch ( ' freqtrade.main.get_signal ' , side_effect = lambda s , t : True )
mocker . patch ( ' freqtrade.main.get_signal ' , side_effect = lambda s : ( True , False ) )
mocker . patch . multiple ( ' freqtrade.rpc ' , init = MagicMock ( ) , send_msg = MagicMock ( ) )
mocker . patch . multiple ( ' freqtrade.main.exchange ' ,
validate_pairs = MagicMock ( ) ,
@ -592,6 +590,7 @@ def test_sell_profit_only_enable_profit(default_conf, limit_buy_order, mocker):
trade = Trade . query . first ( )
trade . update ( limit_buy_order )
mocker . patch ( ' freqtrade.main.get_signal ' , side_effect = lambda s : ( False , True ) )
assert handle_trade ( trade ) is True
@ -603,7 +602,7 @@ def test_sell_profit_only_disable_profit(default_conf, limit_buy_order, mocker):
mocker . patch . dict ( ' freqtrade.main._CONF ' , default_conf )
mocker . patch ( ' freqtrade.main.min_roi_reached ' , return_value = False )
mocker . patch ( ' freqtrade.main.get_signal ' , side_effect = lambda s , t : True )
mocker . patch ( ' freqtrade.main.get_signal ' , side_effect = lambda s : ( True , False ) )
mocker . patch . multiple ( ' freqtrade.rpc ' , init = MagicMock ( ) , send_msg = MagicMock ( ) )
mocker . patch . multiple ( ' freqtrade.main.exchange ' ,
validate_pairs = MagicMock ( ) ,
@ -619,6 +618,7 @@ def test_sell_profit_only_disable_profit(default_conf, limit_buy_order, mocker):
trade = Trade . query . first ( )
trade . update ( limit_buy_order )
mocker . patch ( ' freqtrade.main.get_signal ' , side_effect = lambda s : ( False , True ) )
assert handle_trade ( trade ) is True
@ -630,7 +630,7 @@ def test_sell_profit_only_enable_loss(default_conf, limit_buy_order, mocker):
mocker . patch . dict ( ' freqtrade.main._CONF ' , default_conf )
mocker . patch ( ' freqtrade.main.min_roi_reached ' , return_value = False )
mocker . patch ( ' freqtrade.main.get_signal ' , side_effect = lambda s , t : True )
mocker . patch ( ' freqtrade.main.get_signal ' , side_effect = lambda s : ( True , False ) )
mocker . patch . multiple ( ' freqtrade.rpc ' , init = MagicMock ( ) , send_msg = MagicMock ( ) )
mocker . patch . multiple ( ' freqtrade.main.exchange ' ,
validate_pairs = MagicMock ( ) ,
@ -646,6 +646,7 @@ def test_sell_profit_only_enable_loss(default_conf, limit_buy_order, mocker):
trade = Trade . query . first ( )
trade . update ( limit_buy_order )
mocker . patch ( ' freqtrade.main.get_signal ' , side_effect = lambda s : ( False , True ) )
assert handle_trade ( trade ) is False
@ -657,7 +658,7 @@ def test_sell_profit_only_disable_loss(default_conf, limit_buy_order, mocker):
mocker . patch . dict ( ' freqtrade.main._CONF ' , default_conf )
mocker . patch ( ' freqtrade.main.min_roi_reached ' , return_value = False )
mocker . patch ( ' freqtrade.main.get_signal ' , side_effect = lambda s , t : True )
mocker . patch ( ' freqtrade.main.get_signal ' , side_effect = lambda s : ( True , False ) )
mocker . patch . multiple ( ' freqtrade.rpc ' , init = MagicMock ( ) , send_msg = MagicMock ( ) )
mocker . patch . multiple ( ' freqtrade.main.exchange ' ,
validate_pairs = MagicMock ( ) ,
@ -673,4 +674,6 @@ def test_sell_profit_only_disable_loss(default_conf, limit_buy_order, mocker):
trade = Trade . query . first ( )
trade . update ( limit_buy_order )
mocker . patch ( ' freqtrade.main.get_signal ' , side_effect = lambda s : ( False , True ) )
assert handle_trade ( trade ) is True