From a98fcee4f950448495f160324738e929705929bf Mon Sep 17 00:00:00 2001 From: Pan Long Date: Fri, 25 May 2018 22:29:06 +0800 Subject: [PATCH 1/3] Sell filled amount or an open limit buy order in forcesell. Currently forcesell only cancels an open limit buy order and doesn't sell the filled amount. After this change, forcesell will also update trade's amount to filled amount and sell the filled amount. --- freqtrade/rpc/rpc.py | 6 ++++-- freqtrade/tests/rpc/test_rpc.py | 34 ++++++++++++++++++++++++++++----- 2 files changed, 33 insertions(+), 7 deletions(-) diff --git a/freqtrade/rpc/rpc.py b/freqtrade/rpc/rpc.py index dd3eed001..f972e64cc 100644 --- a/freqtrade/rpc/rpc.py +++ b/freqtrade/rpc/rpc.py @@ -316,8 +316,10 @@ class RPC(object): and order['side'] == 'buy': exchange.cancel_order(trade.open_order_id, trade.pair) trade.close(order.get('price') or trade.open_rate) - # TODO: sell amount which has been bought already - return + # Do the best effort, if we don't know 'filled' amount, don't try selling + if order['filled'] is None: + return + trade.amount = order['filled'] # Ignore trades with an attached LIMIT_SELL order if order and order['status'] == 'open' \ diff --git a/freqtrade/tests/rpc/test_rpc.py b/freqtrade/tests/rpc/test_rpc.py index 1d1b3b39c..1cf374b6b 100644 --- a/freqtrade/tests/rpc/test_rpc.py +++ b/freqtrade/tests/rpc/test_rpc.py @@ -449,20 +449,44 @@ def test_rpc_forcesell(default_conf, ticker, fee, mocker) -> None: freqtradebot.state = State.RUNNING assert cancel_order_mock.call_count == 0 # make an limit-buy open trade + trade = Trade.query.filter(Trade.id == '1').first() + filled_amount = trade.amount / 2 mocker.patch( 'freqtrade.freqtradebot.exchange.get_order', return_value={ 'status': 'open', 'type': 'limit', - 'side': 'buy' + 'side': 'buy', + 'filled': filled_amount } ) - # check that the trade is called, which is done - # by ensuring exchange.cancel_order is called + # check that the trade is called, which is done by ensuring exchange.cancel_order is called + # and trade amount is updated (error, res) = rpc.rpc_forcesell('1') assert not error assert res == '' assert cancel_order_mock.call_count == 1 + assert trade.amount == filled_amount + + freqtradebot.create_trade() + trade = Trade.query.filter(Trade.id == '2').first() + amount = trade.amount + # make an limit-buy open trade, if there is no 'filled', don't sell it + mocker.patch( + 'freqtrade.freqtradebot.exchange.get_order', + return_value={ + 'status': 'open', + 'type': 'limit', + 'side': 'buy', + 'filled': None + } + ) + # check that the trade is called, which is done by ensuring exchange.cancel_order is called + (error, res) = rpc.rpc_forcesell('2') + assert not error + assert res == '' + assert cancel_order_mock.call_count == 2 + assert trade.amount == amount freqtradebot.create_trade() # make an limit-sell open trade @@ -474,11 +498,11 @@ def test_rpc_forcesell(default_conf, ticker, fee, mocker) -> None: 'side': 'sell' } ) - (error, res) = rpc.rpc_forcesell('2') + (error, res) = rpc.rpc_forcesell('3') assert not error assert res == '' # status quo, no exchange calls - assert cancel_order_mock.call_count == 1 + assert cancel_order_mock.call_count == 2 def test_performance_handle(default_conf, ticker, limit_buy_order, fee, From 5a4eb2cbf29e421230bba6e7763cd2c792c100f7 Mon Sep 17 00:00:00 2001 From: Gerald Lonlas Date: Tue, 29 May 2018 20:48:34 -0700 Subject: [PATCH 2/3] Setup.sh: make message format consistent --- setup.sh | 56 +++++++++++++++++++++++++++++++------------------------- 1 file changed, 31 insertions(+), 25 deletions(-) diff --git a/setup.sh b/setup.sh index 1d06e8208..8568d1a99 100755 --- a/setup.sh +++ b/setup.sh @@ -2,16 +2,17 @@ #encoding=utf8 function updateenv () { - echo " - ------------------------- - Update your virtual env - ------------------------- - " + echo "-------------------------" + echo "Update your virtual env" + echo "-------------------------" source .env/bin/activate - pip3.6 install --upgrade pip - pip3 install -r requirements.txt --upgrade - pip3 install -r requirements.txt - pip3 install -e . + echo "pip3 install in-progress. Please wait..." + pip3.6 install --quiet --upgrade pip + pip3 install --quiet -r requirements.txt --upgrade + pip3 install --quiet -r requirements.txt + pip3 install --quiet -e . + echo "pip3 install completed" + echo } # Install tab lib @@ -29,7 +30,6 @@ function install_macos () { echo "-------------------------" echo "Install Brew" echo "-------------------------" - echo /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" fi brew install python3 wget ta-lib @@ -54,7 +54,6 @@ function reset () { echo "----------------------------" echo "Reset branch and virtual env" echo "----------------------------" - echo if [ "1" == $(git branch -vv |grep -cE "\* develop|\* master") ] then if [ -d ".env" ]; then @@ -77,6 +76,7 @@ function reset () { echo "Reset ignored because you are not on 'master' or 'develop'." fi + echo python3.6 -m venv .env updateenv } @@ -84,11 +84,9 @@ function reset () { function config_generator () { echo "Starting to generate config.json" - - echo "-------------------------" + echo echo "General configuration" echo "-------------------------" - echo default_max_trades=3 read -p "Max open trades: (Default: $default_max_trades) " max_trades max_trades=${max_trades:-$default_max_trades} @@ -105,14 +103,13 @@ function config_generator () { read -p "Fiat currency: (Default: $default_fiat_currency) " fiat_currency fiat_currency=${fiat_currency:-$default_fiat_currency} - echo "------------------------" - echo "Bittrex config generator" - echo "------------------------" echo + echo "Exchange config generator" + echo "------------------------" read -p "Exchange API key: " api_key read -p "Exchange API Secret: " api_secret - echo "-------------------------" + echo echo "Telegram config generator" echo "-------------------------" read -p "Telegram Token: " token @@ -131,6 +128,10 @@ function config_generator () { } function config () { + + echo "-------------------------" + echo "Config file generator" + echo "-------------------------" if [ -f config.json ] then read -p "A config file already exist, do you want to override it [Y/N]? " @@ -144,22 +145,26 @@ function config () { config_generator fi + echo + echo "-------------------------" + echo "Config file generated" + echo "-------------------------" echo "Edit ./config.json to modify Pair and other configurations." + echo } function install () { echo "-------------------------" echo "Install mandatory dependencies" echo "-------------------------" - echo if [ "$(uname -s)" == "Darwin" ] then - echo "- You are on macOS" + echo "macOS detected. Setup for this system in-progress" install_macos elif [ -x "$(command -v apt-get)" ] then - echo "- You are on Debian/Ubuntu" + echo "Debian/Ubuntu detected. Setup for this system in-progress" install_debian else echo "This script does not support your OS." @@ -167,12 +172,13 @@ function install () { echo "Wait 10 seconds to continue the next install steps or use ctrl+c to interrupt this shell." sleep 10 fi + echo reset - echo " - - Install complete. - " config - echo "You can now use the bot by executing 'source .env/bin/activate; python3 freqtrade/main.py'." + echo "-------------------------" + echo "Run the bot" + echo "-------------------------" + echo "You can now use the bot by executing 'source .env/bin/activate; python3.6 freqtrade/main.py'." } function plot () { From f59f534c6461edd90d93f66f89f2bdc7c175209e Mon Sep 17 00:00:00 2001 From: Gerald Lonlas Date: Tue, 29 May 2018 20:49:37 -0700 Subject: [PATCH 3/3] Setup.sh: fix Python3.6 when broken on macOS --- setup.sh | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/setup.sh b/setup.sh index 8568d1a99..a825ca41f 100755 --- a/setup.sh +++ b/setup.sh @@ -33,6 +33,8 @@ function install_macos () { /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" fi brew install python3 wget ta-lib + + test_and_fix_python_on_mac } # Install bot Debian_ubuntu @@ -81,6 +83,19 @@ function reset () { updateenv } +function test_and_fix_python_on_mac() { + + if ! [ -x "$(command -v python3.6)" ] + then + echo "-------------------------" + echo "Fixing Python" + echo "-------------------------" + echo "Python 3.6 is not linked in your system. Fixing it..." + brew link --overwrite python + echo + fi +} + function config_generator () { echo "Starting to generate config.json"