From e01c85bb3a765767099432cb113f3ee202b5a584 Mon Sep 17 00:00:00 2001 From: gcarq Date: Wed, 8 Nov 2017 22:43:47 +0100 Subject: [PATCH 1/2] add argparse and implement basic arguments --- freqtrade/analyze.py | 2 -- freqtrade/main.py | 38 ++++++++++++++++++++++++++------------ freqtrade/misc.py | 33 +++++++++++++++++++++++++++++++++ freqtrade/persistence.py | 2 -- 4 files changed, 59 insertions(+), 16 deletions(-) diff --git a/freqtrade/analyze.py b/freqtrade/analyze.py index 32bce45e0..daa2a1436 100644 --- a/freqtrade/analyze.py +++ b/freqtrade/analyze.py @@ -10,8 +10,6 @@ from freqtrade import exchange from freqtrade.exchange import Bittrex, get_ticker_history from freqtrade.vendor.qtpylib.indicators import awesome_oscillator -logging.basicConfig(level=logging.DEBUG, - format='%(asctime)s - %(name)s - %(levelname)s - %(message)s') logger = logging.getLogger(__name__) diff --git a/freqtrade/main.py b/freqtrade/main.py index 2371f90a9..925bf340c 100755 --- a/freqtrade/main.py +++ b/freqtrade/main.py @@ -5,21 +5,19 @@ import logging import time import traceback from datetime import datetime -from typing import Dict, Optional from signal import signal, SIGINT, SIGABRT, SIGTERM +from typing import Dict, Optional import requests from jsonschema import validate from freqtrade import __version__, exchange, persistence from freqtrade.analyze import get_buy_signal -from freqtrade.misc import CONF_SCHEMA, State, get_state, update_state +from freqtrade.misc import CONF_SCHEMA, State, get_state, update_state, build_arg_parser from freqtrade.persistence import Trade from freqtrade.rpc import telegram -logging.basicConfig(level=logging.DEBUG, - format='%(asctime)s - %(name)s - %(levelname)s - %(message)s') -logger = logging.getLogger(__name__) +logger = logging.getLogger('freqtrade') _CONF = {} @@ -42,7 +40,7 @@ def _process() -> bool: Trade.session.add(trade) state_changed = True else: - logging.info('Got no buy signal...') + logger.info('Got no buy signal...') except ValueError: logger.exception('Unable to create trade') @@ -163,7 +161,10 @@ def create_trade(stake_amount: float) -> Optional[Trade]: if one pair triggers the buy_signal a new trade record gets created :param stake_amount: amount of btc to spend """ - logger.info('Creating new trade with stake_amount: %f ...', stake_amount) + logger.info( + 'Checking buy signals to create a new trade with stake_amount: %f ...', + stake_amount + ) whitelist = copy.deepcopy(_CONF['exchange']['pair_whitelist']) # Check if stake_amount is fulfilled if exchange.get_balance(_CONF['stake_currency']) < stake_amount: @@ -255,15 +256,28 @@ def main(): Loads and validates the config and handles the main loop :return: None """ - logger.info('Starting freqtrade %s', __version__) - global _CONF - with open('config.json') as file: - _CONF = json.load(file) + args = build_arg_parser().parse_args() + # Initialize logger + logging.basicConfig( + level=args.loglevel, + format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', + ) + + logger.info( + 'Starting freqtrade %s (loglevel=%s)', + __version__, + logging.getLevelName(args.loglevel) + ) + + # Load and validate configuration + with open(args.config) as file: + _CONF = json.load(file) logger.info('Validating configuration ...') validate(_CONF, CONF_SCHEMA) + # Initialize all modules and start main loop init(_CONF) old_state = get_state() logger.info('Initial State: %s', old_state) @@ -273,7 +287,7 @@ def main(): # Log state transition if new_state != old_state: telegram.send_msg('*Status:* `{}`'.format(new_state.name.lower())) - logging.info('Changing state to: %s', new_state.name) + logger.info('Changing state to: %s', new_state.name) if new_state == State.STOPPED: time.sleep(1) diff --git a/freqtrade/misc.py b/freqtrade/misc.py index 585aee3de..4787ef2f9 100644 --- a/freqtrade/misc.py +++ b/freqtrade/misc.py @@ -1,7 +1,11 @@ +import argparse import enum +import logging from wrapt import synchronized +from freqtrade import __version__ + class State(enum.Enum): RUNNING = 0 @@ -32,6 +36,35 @@ def get_state() -> State: return _STATE +def build_arg_parser() -> argparse.ArgumentParser: + """ Builds and returns an ArgumentParser instance """ + parser = argparse.ArgumentParser( + description='Simple High Frequency Trading Bot for crypto currencies' + ) + parser.add_argument( + '-c', '--config', + help='specify configuration file (default: config.json)', + dest='config', + default='config.json', + type=str, + metavar='PATH', + ) + parser.add_argument( + '-v', '--verbose', + help='be verbose', + action='store_const', + dest='loglevel', + const=logging.DEBUG, + default=logging.INFO, + ) + parser.add_argument( + '--version', + action='version', + version='%(prog)s {}'.format(__version__), + ) + return parser + + # Required json-schema for user specified config CONF_SCHEMA = { 'type': 'object', diff --git a/freqtrade/persistence.py b/freqtrade/persistence.py index 724ad7dcb..f90134275 100644 --- a/freqtrade/persistence.py +++ b/freqtrade/persistence.py @@ -9,8 +9,6 @@ from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm.scoping import scoped_session from sqlalchemy.orm.session import sessionmaker -logging.basicConfig(level=logging.DEBUG, - format='%(asctime)s - %(name)s - %(levelname)s - %(message)s') logger = logging.getLogger(__name__) _CONF = {} From b709ccbf536bd04d2b4ebc4f237c7d433c045c04 Mon Sep 17 00:00:00 2001 From: gcarq Date: Fri, 10 Nov 2017 17:56:03 +0100 Subject: [PATCH 2/2] enhance logging messages --- freqtrade/main.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/freqtrade/main.py b/freqtrade/main.py index 925bf340c..1e31a0ca7 100755 --- a/freqtrade/main.py +++ b/freqtrade/main.py @@ -40,7 +40,10 @@ def _process() -> bool: Trade.session.add(trade) state_changed = True else: - logger.info('Got no buy signal...') + logger.info( + 'Checked all whitelisted currencies. ' + 'Found no suitable entry positions for buying. Will keep looking ...' + ) except ValueError: logger.exception('Unable to create trade') @@ -83,7 +86,10 @@ def close_trade_if_fulfilled(trade: Trade) -> bool: and trade.close_rate is not None \ and trade.open_order_id is None: trade.is_open = False - logger.info('No open orders found and trade is fulfilled. Marking %s as closed ...', trade) + logger.info( + 'Marking %s as closed as the trade is fulfilled and found no open orders for it.', + trade + ) return True return False