stable/freqtrade/constants.py

379 lines
14 KiB
Python
Raw Normal View History

# pragma pylint: disable=too-few-public-methods
"""
bot constants
"""
2020-05-22 18:56:34 +00:00
from typing import List, Tuple
2019-02-19 12:14:47 +00:00
DEFAULT_CONFIG = 'config.json'
2019-06-22 20:51:29 +00:00
DEFAULT_EXCHANGE = 'bittrex'
PROCESS_THROTTLE_SECS = 5 # sec
HYPEROPT_EPOCH = 100 # epochs
RETRY_TIMEOUT = 30 # sec
DEFAULT_DB_PROD_URL = 'sqlite:///tradesv3.sqlite'
2019-12-22 09:16:16 +00:00
DEFAULT_DB_DRYRUN_URL = 'sqlite:///tradesv3.dryrun.sqlite'
2018-05-25 14:04:08 +00:00
UNLIMITED_STAKE_AMOUNT = 'unlimited'
DEFAULT_AMOUNT_RESERVE_PERCENT = 0.05
2018-11-25 21:02:59 +00:00
REQUIRED_ORDERTIF = ['buy', 'sell']
REQUIRED_ORDERTYPES = ['buy', 'sell', 'stoploss', 'stoploss_on_exchange']
2020-02-23 12:51:16 +00:00
ORDERBOOK_SIDES = ['ask', 'bid']
2018-11-17 12:05:35 +00:00
ORDERTYPE_POSSIBILITIES = ['limit', 'market']
ORDERTIF_POSSIBILITIES = ['gtc', 'fok', 'ioc']
HYPEROPT_LOSS_BUILTIN = ['ShortTradeDurHyperOptLoss', 'OnlyProfitHyperOptLoss',
'SharpeHyperOptLoss', 'SharpeHyperOptLossDaily',
'SortinoHyperOptLoss', 'SortinoHyperOptLossDaily']
AVAILABLE_PAIRLISTS = ['StaticPairList', 'VolumePairList',
2020-11-28 15:44:01 +00:00
'AgeFilter', 'PerformanceFilter', 'PrecisionFilter',
'PriceFilter', 'RangeStabilityFilter', 'ShuffleFilter',
'SpreadFilter']
2020-10-24 14:52:26 +00:00
AVAILABLE_PROTECTIONS = ['StoplossGuard', 'CooldownPeriod']
2020-07-12 18:06:59 +00:00
AVAILABLE_DATAHANDLERS = ['json', 'jsongz', 'hdf5']
2019-12-15 08:22:15 +00:00
DRY_RUN_WALLET = 1000
2020-06-09 06:07:34 +00:00
DATETIME_PRINT_FORMAT = '%Y-%m-%d %H:%M:%S'
MATH_CLOSE_PREC = 1e-14 # Precision used for float comparisons
DEFAULT_DATAFRAME_COLUMNS = ['date', 'open', 'high', 'low', 'close', 'volume']
# Don't modify sequence of DEFAULT_TRADES_COLUMNS
# it has wide consequences for stored trades files
DEFAULT_TRADES_COLUMNS = ['timestamp', 'id', 'type', 'side', 'price', 'amount', 'cost']
2020-06-28 07:27:19 +00:00
LAST_BT_RESULT_FN = '.last_result.json'
USERPATH_HYPEROPTS = 'hyperopts'
2020-02-02 15:12:23 +00:00
USERPATH_STRATEGIES = 'strategies'
2020-02-02 15:07:21 +00:00
USERPATH_NOTEBOOKS = 'notebooks'
TELEGRAM_SETTING_OPTIONS = ['on', 'off', 'silent']
# Soure files with destination directories within user-directory
2019-11-01 12:28:35 +00:00
USER_DATA_FILES = {
2020-02-02 15:12:23 +00:00
'sample_strategy.py': USERPATH_STRATEGIES,
'sample_hyperopt_advanced.py': USERPATH_HYPEROPTS,
'sample_hyperopt_loss.py': USERPATH_HYPEROPTS,
'sample_hyperopt.py': USERPATH_HYPEROPTS,
2020-02-02 15:07:21 +00:00
'strategy_analysis_example.ipynb': USERPATH_NOTEBOOKS,
2019-11-01 12:28:35 +00:00
}
2018-06-03 11:47:36 +00:00
SUPPORTED_FIAT = [
"AUD", "BRL", "CAD", "CHF", "CLP", "CNY", "CZK", "DKK",
"EUR", "GBP", "HKD", "HUF", "IDR", "ILS", "INR", "JPY",
"KRW", "MXN", "MYR", "NOK", "NZD", "PHP", "PKR", "PLN",
"RUB", "SEK", "SGD", "THB", "TRY", "TWD", "ZAR", "USD",
2020-03-07 16:03:31 +00:00
"BTC", "ETH", "XRP", "LTC", "BCH"
]
2019-08-16 12:56:38 +00:00
MINIMAL_CONFIG = {
'stake_currency': '',
'dry_run': True,
'exchange': {
'name': '',
'key': '',
'secret': '',
'pair_whitelist': [],
'ccxt_async_config': {
'enableRateLimit': True,
}
}
}
# Required json-schema for user specified config
CONF_SCHEMA = {
'type': 'object',
'properties': {
'max_open_trades': {'type': ['integer', 'number'], 'minimum': -1},
'timeframe': {'type': 'string'},
'stake_currency': {'type': 'string'},
2018-06-03 22:48:26 +00:00
'stake_amount': {
2019-11-25 06:06:55 +00:00
'type': ['number', 'string'],
'minimum': 0.0001,
'pattern': UNLIMITED_STAKE_AMOUNT
2018-06-03 22:48:26 +00:00
},
'tradable_balance_ratio': {
2020-01-02 13:41:28 +00:00
'type': 'number',
'minimum': 0.1,
'maximum': 1,
'default': 0.99
},
2020-01-05 12:25:11 +00:00
'amend_last_stake_amount': {'type': 'boolean', 'default': False},
2020-01-10 05:36:28 +00:00
'last_stake_amount_min_ratio': {
'type': 'number', 'minimum': 0.0, 'maximum': 1.0, 'default': 0.5
2020-02-08 20:02:52 +00:00
},
2018-06-03 11:47:36 +00:00
'fiat_display_currency': {'type': 'string', 'enum': SUPPORTED_FIAT},
'dry_run': {'type': 'boolean'},
2019-12-15 08:22:15 +00:00
'dry_run_wallet': {'type': 'number', 'default': DRY_RUN_WALLET},
'cancel_open_orders_on_exit': {'type': 'boolean', 'default': False},
'process_only_new_candles': {'type': 'boolean'},
'minimal_roi': {
'type': 'object',
'patternProperties': {
'^[0-9.]+$': {'type': 'number'}
},
'minProperties': 1
},
'amount_reserve_percent': {'type': 'number', 'minimum': 0.0, 'maximum': 0.5},
'stoploss': {'type': 'number', 'maximum': 0, 'exclusiveMaximum': True},
'trailing_stop': {'type': 'boolean'},
2018-07-01 17:54:26 +00:00
'trailing_stop_positive': {'type': 'number', 'minimum': 0, 'maximum': 1},
2018-07-16 19:23:35 +00:00
'trailing_stop_positive_offset': {'type': 'number', 'minimum': 0, 'maximum': 1},
2019-03-12 14:43:53 +00:00
'trailing_only_offset_is_reached': {'type': 'boolean'},
'unfilledtimeout': {
'type': 'object',
'properties': {
2019-11-25 11:56:05 +00:00
'buy': {'type': 'number', 'minimum': 1},
'sell': {'type': 'number', 'minimum': 1}
}
},
'bid_strategy': {
'type': 'object',
'properties': {
'ask_last_balance': {
'type': 'number',
'minimum': 0,
'maximum': 1,
'exclusiveMaximum': False,
2020-02-23 12:51:16 +00:00
},
2020-02-23 13:06:42 +00:00
'price_side': {'type': 'string', 'enum': ORDERBOOK_SIDES, 'default': 'bid'},
2020-02-23 12:51:16 +00:00
'use_order_book': {'type': 'boolean'},
'order_book_top': {'type': 'integer', 'maximum': 20, 'minimum': 1},
'check_depth_of_market': {
'type': 'object',
'properties': {
'enabled': {'type': 'boolean'},
'bids_to_ask_delta': {'type': 'number', 'minimum': 0},
}
},
},
'required': ['ask_last_balance']
},
'ask_strategy': {
'type': 'object',
'properties': {
2020-02-23 13:06:42 +00:00
'price_side': {'type': 'string', 'enum': ORDERBOOK_SIDES, 'default': 'ask'},
'use_order_book': {'type': 'boolean'},
'order_book_min': {'type': 'integer', 'minimum': 1},
'order_book_max': {'type': 'integer', 'minimum': 1, 'maximum': 50},
'use_sell_signal': {'type': 'boolean'},
'sell_profit_only': {'type': 'boolean'},
'ignore_roi_if_buy_signal': {'type': 'boolean'}
}
},
2018-11-17 12:05:35 +00:00
'order_types': {
'type': 'object',
'properties': {
'buy': {'type': 'string', 'enum': ORDERTYPE_POSSIBILITIES},
'sell': {'type': 'string', 'enum': ORDERTYPE_POSSIBILITIES},
2019-09-01 07:07:09 +00:00
'emergencysell': {'type': 'string', 'enum': ORDERTYPE_POSSIBILITIES},
'stoploss': {'type': 'string', 'enum': ORDERTYPE_POSSIBILITIES},
2019-01-16 18:04:43 +00:00
'stoploss_on_exchange': {'type': 'boolean'},
'stoploss_on_exchange_interval': {'type': 'number'},
'stoploss_on_exchange_limit_ratio': {'type': 'number', 'minimum': 0.0,
'maximum': 1.0}
2018-11-17 12:05:35 +00:00
},
2018-11-25 18:03:28 +00:00
'required': ['buy', 'sell', 'stoploss', 'stoploss_on_exchange']
2018-11-17 12:05:35 +00:00
},
2018-11-25 20:05:25 +00:00
'order_time_in_force': {
'type': 'object',
'properties': {
'buy': {'type': 'string', 'enum': ORDERTIF_POSSIBILITIES},
'sell': {'type': 'string', 'enum': ORDERTIF_POSSIBILITIES}
},
'required': ['buy', 'sell']
},
'exchange': {'$ref': '#/definitions/exchange'},
'edge': {'$ref': '#/definitions/edge'},
'experimental': {
'type': 'object',
'properties': {
'block_bad_exchanges': {'type': 'boolean'}
}
},
'pairlists': {
'type': 'array',
'items': {
'type': 'object',
'properties': {
'method': {'type': 'string', 'enum': AVAILABLE_PAIRLISTS},
2020-10-15 05:38:00 +00:00
},
'required': ['method'],
}
},
'protections': {
'type': 'array',
'items': {
'type': 'object',
'properties': {
'method': {'type': 'string', 'enum': AVAILABLE_PROTECTIONS},
},
'required': ['method'],
}
2018-12-03 19:00:18 +00:00
},
'telegram': {
'type': 'object',
'properties': {
'enabled': {'type': 'boolean'},
'token': {'type': 'string'},
'chat_id': {'type': 'string'},
'notification_settings': {
'type': 'object',
'properties': {
'status': {'type': 'string', 'enum': TELEGRAM_SETTING_OPTIONS},
'warning': {'type': 'string', 'enum': TELEGRAM_SETTING_OPTIONS},
'startup': {'type': 'string', 'enum': TELEGRAM_SETTING_OPTIONS},
'buy': {'type': 'string', 'enum': TELEGRAM_SETTING_OPTIONS},
'sell': {'type': 'string', 'enum': TELEGRAM_SETTING_OPTIONS},
'buy_cancel': {'type': 'string', 'enum': TELEGRAM_SETTING_OPTIONS},
'sell_cancel': {'type': 'string', 'enum': TELEGRAM_SETTING_OPTIONS}
}
}
},
'required': ['enabled', 'token', 'chat_id']
},
2018-07-07 11:39:21 +00:00
'webhook': {
'type': 'object',
'properties': {
'enabled': {'type': 'boolean'},
'webhookbuy': {'type': 'object'},
2020-02-08 20:02:52 +00:00
'webhookbuycancel': {'type': 'object'},
2018-07-07 11:39:21 +00:00
'webhooksell': {'type': 'object'},
2020-02-08 20:02:52 +00:00
'webhooksellcancel': {'type': 'object'},
2018-07-07 11:39:21 +00:00
'webhookstatus': {'type': 'object'},
},
},
2019-04-04 05:13:14 +00:00
'api_server': {
'type': 'object',
'properties': {
'enabled': {'type': 'boolean'},
'listen_ip_address': {'format': 'ipv4'},
'listen_port': {
'type': 'integer',
2019-11-25 06:06:55 +00:00
'minimum': 1024,
'maximum': 65535
2019-04-04 05:13:14 +00:00
},
'username': {'type': 'string'},
'password': {'type': 'string'},
2020-06-24 18:32:19 +00:00
'jwt_secret_key': {'type': 'string'},
'CORS_origins': {'type': 'array', 'items': {'type': 'string'}},
'verbosity': {'type': 'string', 'enum': ['error', 'info']},
2019-04-04 05:13:14 +00:00
},
'required': ['enabled', 'listen_ip_address', 'listen_port', 'username', 'password']
2019-04-04 05:13:14 +00:00
},
'db_url': {'type': 'string'},
'initial_state': {'type': 'string', 'enum': ['running', 'stopped']},
2018-10-10 18:08:29 +00:00
'forcebuy_enable': {'type': 'boolean'},
'disable_dataframe_checks': {'type': 'boolean'},
'internals': {
'type': 'object',
2019-12-25 09:41:04 +00:00
'default': {},
'properties': {
'process_throttle_secs': {'type': 'integer'},
'interval': {'type': 'integer'},
'sd_notify': {'type': 'boolean'},
2019-12-27 12:46:25 +00:00
}
},
'dataformat_ohlcv': {
'type': 'string',
2019-12-23 14:06:33 +00:00
'enum': AVAILABLE_DATAHANDLERS,
'default': 'json'
2019-12-27 12:46:25 +00:00
},
'dataformat_trades': {
'type': 'string',
2019-12-23 14:06:33 +00:00
'enum': AVAILABLE_DATAHANDLERS,
'default': 'jsongz'
}
},
'definitions': {
'exchange': {
'type': 'object',
'properties': {
2019-04-08 08:19:45 +00:00
'name': {'type': 'string'},
'sandbox': {'type': 'boolean', 'default': False},
'key': {'type': 'string', 'default': ''},
'secret': {'type': 'string', 'default': ''},
'password': {'type': 'string', 'default': ''},
'uid': {'type': 'string'},
'pair_whitelist': {
'type': 'array',
'items': {
'type': 'string',
},
'uniqueItems': True
},
'pair_blacklist': {
'type': 'array',
'items': {
'type': 'string',
},
'uniqueItems': True
},
2018-10-04 18:34:48 +00:00
'outdated_offset': {'type': 'integer', 'minimum': 1},
'markets_refresh_interval': {'type': 'integer'},
2018-10-04 18:34:48 +00:00
'ccxt_config': {'type': 'object'},
'ccxt_async_config': {'type': 'object'}
},
'required': ['name']
},
'edge': {
'type': 'object',
'properties': {
2019-11-25 06:06:55 +00:00
'enabled': {'type': 'boolean'},
'process_throttle_secs': {'type': 'integer', 'minimum': 600},
'calculate_since_number_of_days': {'type': 'integer'},
'allowed_risk': {'type': 'number'},
'stoploss_range_min': {'type': 'number'},
'stoploss_range_max': {'type': 'number'},
'stoploss_range_step': {'type': 'number'},
'minimum_winrate': {'type': 'number'},
'minimum_expectancy': {'type': 'number'},
'min_trade_number': {'type': 'number'},
'max_trade_duration_minute': {'type': 'integer'},
'remove_pumps': {'type': 'boolean'}
2018-12-01 10:08:18 +00:00
},
2020-01-03 09:58:31 +00:00
'required': ['process_throttle_secs', 'allowed_risk']
}
},
}
2020-01-02 09:38:59 +00:00
SCHEMA_TRADE_REQUIRED = [
'exchange',
'timeframe',
2020-01-02 09:38:59 +00:00
'max_open_trades',
'stake_currency',
'stake_amount',
2020-01-05 12:25:11 +00:00
'tradable_balance_ratio',
2020-01-10 05:36:28 +00:00
'last_stake_amount_min_ratio',
2020-01-02 09:38:59 +00:00
'dry_run',
'dry_run_wallet',
2020-02-23 13:06:42 +00:00
'ask_strategy',
2020-01-02 09:38:59 +00:00
'bid_strategy',
'unfilledtimeout',
'stoploss',
'minimal_roi',
'internals',
'dataformat_ohlcv',
'dataformat_trades',
2020-01-02 09:38:59 +00:00
]
SCHEMA_MINIMAL_REQUIRED = [
'exchange',
'dry_run',
'dataformat_ohlcv',
'dataformat_trades',
2020-01-02 09:38:59 +00:00
]
CANCEL_REASON = {
"TIMEOUT": "cancelled due to timeout",
"PARTIALLY_FILLED_KEEP_OPEN": "partially filled - keeping order open",
"PARTIALLY_FILLED": "partially filled",
"FULLY_CANCELLED": "fully cancelled",
2020-05-16 18:28:54 +00:00
"ALL_CANCELLED": "cancelled (all unfilled and partially filled open orders cancelled)",
"CANCELLED_ON_EXCHANGE": "cancelled on exchange",
2020-08-26 19:24:47 +00:00
"FORCE_SELL": "forcesold",
}
2020-05-22 18:56:34 +00:00
# List of pairs with their timeframes
2020-06-12 12:12:33 +00:00
PairWithTimeframe = Tuple[str, str]
ListPairsWithTimeframes = List[PairWithTimeframe]
# Type for trades list
TradeList = List[List]