Merge branch 'develop' into stoploss_on_exchange
This commit is contained in:
commit
9d005678c3
24
.travis.yml
24
.travis.yml
@ -1,9 +1,15 @@
|
|||||||
sudo: true
|
sudo: true
|
||||||
os:
|
os:
|
||||||
- linux
|
- linux
|
||||||
|
dist: trusty
|
||||||
language: python
|
language: python
|
||||||
python:
|
python:
|
||||||
- 3.6
|
- 3.6
|
||||||
|
services:
|
||||||
|
- docker
|
||||||
|
env:
|
||||||
|
global:
|
||||||
|
- IMAGE_NAME=freqtradeorg/freqtrade
|
||||||
addons:
|
addons:
|
||||||
apt:
|
apt:
|
||||||
packages:
|
packages:
|
||||||
@ -11,24 +17,38 @@ addons:
|
|||||||
- libdw-dev
|
- libdw-dev
|
||||||
- binutils-dev
|
- binutils-dev
|
||||||
install:
|
install:
|
||||||
- ./install_ta-lib.sh
|
- ./build_helpers/install_ta-lib.sh
|
||||||
- export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
|
- export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
|
||||||
- pip install --upgrade flake8 coveralls pytest-random-order pytest-asyncio mypy
|
- pip install --upgrade flake8 coveralls pytest-random-order pytest-asyncio mypy
|
||||||
- pip install -r requirements.txt
|
- pip install -r requirements.txt
|
||||||
- pip install -e .
|
- pip install -e .
|
||||||
jobs:
|
jobs:
|
||||||
include:
|
include:
|
||||||
- script:
|
- stage: tests
|
||||||
|
script:
|
||||||
- pytest --cov=freqtrade --cov-config=.coveragerc freqtrade/tests/
|
- pytest --cov=freqtrade --cov-config=.coveragerc freqtrade/tests/
|
||||||
- coveralls
|
- coveralls
|
||||||
|
name: pytest
|
||||||
- script:
|
- script:
|
||||||
- cp config.json.example config.json
|
- cp config.json.example config.json
|
||||||
- python freqtrade/main.py --datadir freqtrade/tests/testdata backtesting
|
- python freqtrade/main.py --datadir freqtrade/tests/testdata backtesting
|
||||||
|
name: backtest
|
||||||
- script:
|
- script:
|
||||||
- cp config.json.example config.json
|
- cp config.json.example config.json
|
||||||
- python freqtrade/main.py --datadir freqtrade/tests/testdata hyperopt -e 5
|
- python freqtrade/main.py --datadir freqtrade/tests/testdata hyperopt -e 5
|
||||||
|
name: hyperopt
|
||||||
- script: flake8 freqtrade
|
- script: flake8 freqtrade
|
||||||
|
name: flake8
|
||||||
- script: mypy freqtrade
|
- script: mypy freqtrade
|
||||||
|
name: mypy
|
||||||
|
|
||||||
|
- stage: docker
|
||||||
|
if: branch in (master, develop, feat/improve_travis) AND (type in (push, cron))
|
||||||
|
script:
|
||||||
|
- build_helpers/publish_docker.sh
|
||||||
|
name: "Build and test and push docker image"
|
||||||
|
|
||||||
|
|
||||||
notifications:
|
notifications:
|
||||||
slack:
|
slack:
|
||||||
secure: bKLXmOrx8e2aPZl7W8DA5BdPAXWGpI5UzST33oc1G/thegXcDVmHBTJrBs4sZak6bgAclQQrdZIsRd2eFYzHLalJEaw6pk7hoAw8SvLnZO0ZurWboz7qg2+aZZXfK4eKl/VUe4sM9M4e/qxjkK+yWG7Marg69c4v1ypF7ezUi1fPYILYw8u0paaiX0N5UX8XNlXy+PBlga2MxDjUY70MuajSZhPsY2pDUvYnMY1D/7XN3cFW0g+3O8zXjF0IF4q1Z/1ASQe+eYjKwPQacE+O8KDD+ZJYoTOFBAPllrtpO1jnOPFjNGf3JIbVMZw4bFjIL0mSQaiSUaUErbU3sFZ5Or79rF93XZ81V7uEZ55vD8KMfR2CB1cQJcZcj0v50BxLo0InkFqa0Y8Nra3sbpV4fV5Oe8pDmomPJrNFJnX6ULQhQ1gTCe0M5beKgVms5SITEpt4/Y0CmLUr6iHDT0CUiyMIRWAXdIgbGh1jfaWOMksybeRevlgDsIsNBjXmYI1Sw2ZZR2Eo2u4R6zyfyjOMLwYJ3vgq9IrACv2w5nmf0+oguMWHf6iWi2hiOqhlAN1W74+3HsYQcqnuM3LGOmuCnPprV1oGBqkPXjIFGpy21gNx4vHfO1noLUyJnMnlu2L7SSuN1CdLsnjJ1hVjpJjPfqB4nn8g12x87TqM1bOm+3Q=
|
secure: bKLXmOrx8e2aPZl7W8DA5BdPAXWGpI5UzST33oc1G/thegXcDVmHBTJrBs4sZak6bgAclQQrdZIsRd2eFYzHLalJEaw6pk7hoAw8SvLnZO0ZurWboz7qg2+aZZXfK4eKl/VUe4sM9M4e/qxjkK+yWG7Marg69c4v1ypF7ezUi1fPYILYw8u0paaiX0N5UX8XNlXy+PBlga2MxDjUY70MuajSZhPsY2pDUvYnMY1D/7XN3cFW0g+3O8zXjF0IF4q1Z/1ASQe+eYjKwPQacE+O8KDD+ZJYoTOFBAPllrtpO1jnOPFjNGf3JIbVMZw4bFjIL0mSQaiSUaUErbU3sFZ5Or79rF93XZ81V7uEZ55vD8KMfR2CB1cQJcZcj0v50BxLo0InkFqa0Y8Nra3sbpV4fV5Oe8pDmomPJrNFJnX6ULQhQ1gTCe0M5beKgVms5SITEpt4/Y0CmLUr6iHDT0CUiyMIRWAXdIgbGh1jfaWOMksybeRevlgDsIsNBjXmYI1Sw2ZZR2Eo2u4R6zyfyjOMLwYJ3vgq9IrACv2w5nmf0+oguMWHf6iWi2hiOqhlAN1W74+3HsYQcqnuM3LGOmuCnPprV1oGBqkPXjIFGpy21gNx4vHfO1noLUyJnMnlu2L7SSuN1CdLsnjJ1hVjpJjPfqB4nn8g12x87TqM1bOm+3Q=
|
||||||
|
19
Dockerfile
19
Dockerfile
@ -1,19 +1,20 @@
|
|||||||
FROM python:3.7.0-slim-stretch
|
FROM python:3.7.0-slim-stretch
|
||||||
|
|
||||||
# Install TA-lib
|
RUN apt-get update \
|
||||||
RUN apt-get update && apt-get -y install curl build-essential && apt-get clean
|
&& apt-get -y install curl build-essential \
|
||||||
RUN curl -L http://prdownloads.sourceforge.net/ta-lib/ta-lib-0.4.0-src.tar.gz | \
|
&& apt-get clean \
|
||||||
tar xzvf - && \
|
&& pip install --upgrade pip
|
||||||
cd ta-lib && \
|
|
||||||
sed -i "s|0.00000001|0.000000000000000001 |g" src/ta_func/ta_utility.h && \
|
|
||||||
./configure && make && make install && \
|
|
||||||
cd .. && rm -rf ta-lib
|
|
||||||
ENV LD_LIBRARY_PATH /usr/local/lib
|
|
||||||
|
|
||||||
# Prepare environment
|
# Prepare environment
|
||||||
RUN mkdir /freqtrade
|
RUN mkdir /freqtrade
|
||||||
WORKDIR /freqtrade
|
WORKDIR /freqtrade
|
||||||
|
|
||||||
|
# Install TA-lib
|
||||||
|
COPY build_helpers/* /tmp/
|
||||||
|
RUN cd /tmp && /tmp/install_ta-lib.sh && rm -r /tmp/*ta-lib*
|
||||||
|
|
||||||
|
ENV LD_LIBRARY_PATH /usr/local/lib
|
||||||
|
|
||||||
# Install dependencies
|
# Install dependencies
|
||||||
COPY requirements.txt /freqtrade/
|
COPY requirements.txt /freqtrade/
|
||||||
RUN pip install numpy --no-cache-dir \
|
RUN pip install numpy --no-cache-dir \
|
||||||
|
6
Dockerfile.technical
Normal file
6
Dockerfile.technical
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
FROM freqtradeorg/freqtrade:develop
|
||||||
|
|
||||||
|
RUN apt-get update \
|
||||||
|
&& apt-get -y install git \
|
||||||
|
&& apt-get clean \
|
||||||
|
&& pip install git+https://github.com/berlinguyinca/technical
|
13
build_helpers/install_ta-lib.sh
Executable file
13
build_helpers/install_ta-lib.sh
Executable file
@ -0,0 +1,13 @@
|
|||||||
|
if [ ! -f "ta-lib/CHANGELOG.TXT" ]; then
|
||||||
|
tar zxvf ta-lib-0.4.0-src.tar.gz
|
||||||
|
cd ta-lib \
|
||||||
|
&& sed -i.bak "s|0.00000001|0.000000000000000001 |g" src/ta_func/ta_utility.h \
|
||||||
|
&& ./configure \
|
||||||
|
&& make \
|
||||||
|
&& which sudo && sudo make install || make install \
|
||||||
|
&& cd ..
|
||||||
|
else
|
||||||
|
echo "TA-lib already installed, skipping download and build."
|
||||||
|
cd ta-lib && sudo make install && cd ..
|
||||||
|
|
||||||
|
fi
|
57
build_helpers/publish_docker.sh
Executable file
57
build_helpers/publish_docker.sh
Executable file
@ -0,0 +1,57 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
# - export TAG=`if [ "$TRAVIS_BRANCH" == "develop" ]; then echo "latest"; else echo $TRAVIS_BRANCH ; fi`
|
||||||
|
# Replace / with _ to create a valid tag
|
||||||
|
TAG=$(echo "${TRAVIS_BRANCH}" | sed -e "s/\//_/")
|
||||||
|
|
||||||
|
|
||||||
|
if [ "${TRAVIS_EVENT_TYPE}" = "cron" ]; then
|
||||||
|
echo "event ${TRAVIS_EVENT_TYPE}: full rebuild - skipping cache"
|
||||||
|
docker build -t freqtrade:${TAG} .
|
||||||
|
else
|
||||||
|
echo "event ${TRAVIS_EVENT_TYPE}: building with cache"
|
||||||
|
# Pull last build to avoid rebuilding the whole image
|
||||||
|
docker pull ${REPO}:${TAG}
|
||||||
|
docker build --cache-from ${IMAGE_NAME}:${TAG} -t freqtrade:${TAG} .
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo "failed building image"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Run backtest
|
||||||
|
docker run --rm -it -v $(pwd)/config.json.example:/freqtrade/config.json:ro freqtrade:${TAG} --datadir freqtrade/tests/testdata backtesting
|
||||||
|
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo "failed running backtest"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Tag image for upload
|
||||||
|
docker tag freqtrade:$TAG ${IMAGE_NAME}:$TAG
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo "failed tagging image"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Tag as latest for develop builds
|
||||||
|
if [ "${TRAVIS_BRANCH}" = "develop" ]; then
|
||||||
|
docker tag freqtrade:$TAG ${IMAGE_NAME}:latest
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Login
|
||||||
|
echo "$DOCKER_PASS" | docker login -u $DOCKER_USER --password-stdin
|
||||||
|
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo "failed login"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Show all available images
|
||||||
|
docker images
|
||||||
|
|
||||||
|
docker push ${IMAGE_NAME}
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo "failed pushing repo"
|
||||||
|
return 1
|
||||||
|
fi
|
83
config_binance.json.example
Normal file
83
config_binance.json.example
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
{
|
||||||
|
"max_open_trades": 3,
|
||||||
|
"stake_currency": "BTC",
|
||||||
|
"stake_amount": 0.05,
|
||||||
|
"fiat_display_currency": "USD",
|
||||||
|
"ticker_interval" : "5m",
|
||||||
|
"dry_run": true,
|
||||||
|
"trailing_stop": false,
|
||||||
|
"unfilledtimeout": {
|
||||||
|
"buy": 10,
|
||||||
|
"sell": 30
|
||||||
|
},
|
||||||
|
"bid_strategy": {
|
||||||
|
"ask_last_balance": 0.0,
|
||||||
|
"use_order_book": false,
|
||||||
|
"order_book_top": 1,
|
||||||
|
"check_depth_of_market": {
|
||||||
|
"enabled": false,
|
||||||
|
"bids_to_ask_delta": 1
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ask_strategy":{
|
||||||
|
"use_order_book": false,
|
||||||
|
"order_book_min": 1,
|
||||||
|
"order_book_max": 9
|
||||||
|
},
|
||||||
|
"exchange": {
|
||||||
|
"name": "binance",
|
||||||
|
"key": "your_exchange_key",
|
||||||
|
"secret": "your_exchange_secret",
|
||||||
|
"ccxt_config": {"enableRateLimit": true},
|
||||||
|
"ccxt_async_config": {
|
||||||
|
"enableRateLimit": false
|
||||||
|
},
|
||||||
|
"pair_whitelist": [
|
||||||
|
"AST/BTC",
|
||||||
|
"ETC/BTC",
|
||||||
|
"ETH/BTC",
|
||||||
|
"EOS/BTC",
|
||||||
|
"IOTA/BTC",
|
||||||
|
"LTC/BTC",
|
||||||
|
"MTH/BTC",
|
||||||
|
"NCASH/BTC",
|
||||||
|
"TNT/BTC",
|
||||||
|
"XMR/BTC",
|
||||||
|
"XLM/BTC",
|
||||||
|
"XRP/BTC"
|
||||||
|
],
|
||||||
|
"pair_blacklist": [
|
||||||
|
"BNB/BTC"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"experimental": {
|
||||||
|
"use_sell_signal": false,
|
||||||
|
"sell_profit_only": false,
|
||||||
|
"ignore_roi_if_buy_signal": false
|
||||||
|
},
|
||||||
|
"edge": {
|
||||||
|
"enabled": false,
|
||||||
|
"process_throttle_secs": 3600,
|
||||||
|
"calculate_since_number_of_days": 7,
|
||||||
|
"total_capital_in_stake_currency": 0.5,
|
||||||
|
"allowed_risk": 0.01,
|
||||||
|
"stoploss_range_min": -0.01,
|
||||||
|
"stoploss_range_max": -0.1,
|
||||||
|
"stoploss_range_step": -0.01,
|
||||||
|
"minimum_winrate": 0.60,
|
||||||
|
"minimum_expectancy": 0.20,
|
||||||
|
"min_trade_number": 10,
|
||||||
|
"max_trade_duration_minute": 1440,
|
||||||
|
"remove_pumps": false
|
||||||
|
},
|
||||||
|
"telegram": {
|
||||||
|
"enabled": false,
|
||||||
|
"token": "your_telegram_token",
|
||||||
|
"chat_id": "your_telegram_chat_id"
|
||||||
|
},
|
||||||
|
"initial_state": "running",
|
||||||
|
"forcebuy_enable": false,
|
||||||
|
"internals": {
|
||||||
|
"process_throttle_secs": 5
|
||||||
|
}
|
||||||
|
}
|
@ -109,7 +109,25 @@ Dry-Run
|
|||||||
touch tradesv3.dryrun.sqlite
|
touch tradesv3.dryrun.sqlite
|
||||||
```
|
```
|
||||||
|
|
||||||
### 2. Build the Docker image
|
### 2. Download or build the docker image
|
||||||
|
|
||||||
|
Either use the prebuilt image from docker hub - or build the image yourself if you would like more control on which version is used.
|
||||||
|
|
||||||
|
Branches / tags available can be checked out on [Dockerhub](https://hub.docker.com/r/freqtradeorg/freqtrade/tags/).
|
||||||
|
|
||||||
|
#### 2.1. Download the docker image
|
||||||
|
|
||||||
|
Pull the image from docker hub and (optionally) change the name of the image
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker pull freqtradeorg/freqtrade:develop
|
||||||
|
# Optionally tag the repository so the run-commands remain shorter
|
||||||
|
docker tag freqtradeorg/freqtrade:develop freqtrade
|
||||||
|
```
|
||||||
|
|
||||||
|
To update the image, simply run the above commands again and restart your running container.
|
||||||
|
|
||||||
|
#### 2.2. Build the Docker image
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cd freqtrade
|
cd freqtrade
|
||||||
|
@ -157,7 +157,12 @@ class Edge():
|
|||||||
return position_size
|
return position_size
|
||||||
|
|
||||||
def stoploss(self, pair: str) -> float:
|
def stoploss(self, pair: str) -> float:
|
||||||
|
if pair in self._cached_pairs:
|
||||||
return self._cached_pairs[pair].stoploss
|
return self._cached_pairs[pair].stoploss
|
||||||
|
else:
|
||||||
|
logger.warning('tried to access stoploss of a non-existing pair, '
|
||||||
|
'strategy stoploss is returned instead.')
|
||||||
|
return self.strategy.stoploss
|
||||||
|
|
||||||
def adjust(self, pairs) -> list:
|
def adjust(self, pairs) -> list:
|
||||||
"""
|
"""
|
||||||
|
@ -207,7 +207,8 @@ class Exchange(object):
|
|||||||
f'Pair {pair} not compatible with stake_currency: {stake_cur}')
|
f'Pair {pair} not compatible with stake_currency: {stake_cur}')
|
||||||
if self.markets and pair not in self.markets:
|
if self.markets and pair not in self.markets:
|
||||||
raise OperationalException(
|
raise OperationalException(
|
||||||
f'Pair {pair} is not available at {self.name}')
|
f'Pair {pair} is not available at {self.name}'
|
||||||
|
f'Please remove {pair} from your whitelist.')
|
||||||
|
|
||||||
def validate_timeframes(self, timeframe: List[str]) -> None:
|
def validate_timeframes(self, timeframe: List[str]) -> None:
|
||||||
"""
|
"""
|
||||||
|
@ -657,7 +657,7 @@ class FreqtradeBot(object):
|
|||||||
return True
|
return True
|
||||||
break
|
break
|
||||||
else:
|
else:
|
||||||
logger.info('checking sell')
|
logger.debug('checking sell')
|
||||||
if self.check_sell(trade, sell_rate, buy, sell):
|
if self.check_sell(trade, sell_rate, buy, sell):
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
@ -152,6 +152,18 @@ def test_stoploss(mocker, default_conf):
|
|||||||
assert edge.stoploss('E/F') == -0.01
|
assert edge.stoploss('E/F') == -0.01
|
||||||
|
|
||||||
|
|
||||||
|
def test_nonexisting_stoploss(mocker, default_conf):
|
||||||
|
freqtrade = get_patched_freqtradebot(mocker, default_conf)
|
||||||
|
edge = Edge(default_conf, freqtrade.exchange, freqtrade.strategy)
|
||||||
|
mocker.patch('freqtrade.edge.Edge._cached_pairs', mocker.PropertyMock(
|
||||||
|
return_value={
|
||||||
|
'E/F': PairInfo(-0.01, 0.66, 3.71, 0.50, 1.71, 10, 60),
|
||||||
|
}
|
||||||
|
))
|
||||||
|
|
||||||
|
assert edge.stoploss('N/O') == -0.1
|
||||||
|
|
||||||
|
|
||||||
def _validate_ohlc(buy_ohlc_sell_matrice):
|
def _validate_ohlc(buy_ohlc_sell_matrice):
|
||||||
for index, ohlc in enumerate(buy_ohlc_sell_matrice):
|
for index, ohlc in enumerate(buy_ohlc_sell_matrice):
|
||||||
# if not high < open < low or not high < close < low
|
# if not high < open < low or not high < close < low
|
||||||
|
@ -1,7 +0,0 @@
|
|||||||
if [ ! -f "ta-lib/CHANGELOG.TXT" ]; then
|
|
||||||
tar zxvf ta-lib-0.4.0-src.tar.gz
|
|
||||||
cd ta-lib && sed -i.bak "s|0.00000001|0.000000000000000001 |g" src/ta_func/ta_utility.h && ./configure && make && sudo make install && cd ..
|
|
||||||
else
|
|
||||||
echo "TA-lib already installed, skipping download and build."
|
|
||||||
cd ta-lib && sudo make install && cd ..
|
|
||||||
fi
|
|
@ -1,4 +1,4 @@
|
|||||||
ccxt==1.17.539
|
ccxt==1.17.563
|
||||||
SQLAlchemy==1.2.14
|
SQLAlchemy==1.2.14
|
||||||
python-telegram-bot==11.1.0
|
python-telegram-bot==11.1.0
|
||||||
arrow==0.12.1
|
arrow==0.12.1
|
||||||
|
Loading…
Reference in New Issue
Block a user