mirror of
https://github.com/freqtrade/freqtrade.git
synced 2024-11-15 20:53:58 +00:00
213 lines
5.6 KiB
Python
213 lines
5.6 KiB
Python
# pragma pylint: disable=too-few-public-methods
|
|
|
|
"""
|
|
bot constants
|
|
"""
|
|
|
|
from typing import Any, Literal
|
|
|
|
from freqtrade.enums import CandleType, PriceType
|
|
|
|
|
|
DOCS_LINK = "https://www.freqtrade.io/en/stable"
|
|
DEFAULT_CONFIG = "config.json"
|
|
PROCESS_THROTTLE_SECS = 5 # sec
|
|
HYPEROPT_EPOCH = 100 # epochs
|
|
RETRY_TIMEOUT = 30 # sec
|
|
TIMEOUT_UNITS = ["minutes", "seconds"]
|
|
EXPORT_OPTIONS = ["none", "trades", "signals"]
|
|
DEFAULT_DB_PROD_URL = "sqlite:///tradesv3.sqlite"
|
|
DEFAULT_DB_DRYRUN_URL = "sqlite:///tradesv3.dryrun.sqlite"
|
|
UNLIMITED_STAKE_AMOUNT = "unlimited"
|
|
DEFAULT_AMOUNT_RESERVE_PERCENT = 0.05
|
|
REQUIRED_ORDERTIF = ["entry", "exit"]
|
|
REQUIRED_ORDERTYPES = ["entry", "exit", "stoploss", "stoploss_on_exchange"]
|
|
PRICING_SIDES = ["ask", "bid", "same", "other"]
|
|
ORDERTYPE_POSSIBILITIES = ["limit", "market"]
|
|
_ORDERTIF_POSSIBILITIES = ["GTC", "FOK", "IOC", "PO"]
|
|
ORDERTIF_POSSIBILITIES = _ORDERTIF_POSSIBILITIES + [t.lower() for t in _ORDERTIF_POSSIBILITIES]
|
|
STOPLOSS_PRICE_TYPES = [p for p in PriceType]
|
|
HYPEROPT_LOSS_BUILTIN = [
|
|
"ShortTradeDurHyperOptLoss",
|
|
"OnlyProfitHyperOptLoss",
|
|
"SharpeHyperOptLoss",
|
|
"SharpeHyperOptLossDaily",
|
|
"SortinoHyperOptLoss",
|
|
"SortinoHyperOptLossDaily",
|
|
"CalmarHyperOptLoss",
|
|
"MaxDrawDownHyperOptLoss",
|
|
"MaxDrawDownRelativeHyperOptLoss",
|
|
"ProfitDrawDownHyperOptLoss",
|
|
]
|
|
AVAILABLE_PAIRLISTS = [
|
|
"StaticPairList",
|
|
"VolumePairList",
|
|
"PercentChangePairList",
|
|
"ProducerPairList",
|
|
"RemotePairList",
|
|
"MarketCapPairList",
|
|
"AgeFilter",
|
|
"FullTradesFilter",
|
|
"OffsetFilter",
|
|
"PerformanceFilter",
|
|
"PrecisionFilter",
|
|
"PriceFilter",
|
|
"RangeStabilityFilter",
|
|
"ShuffleFilter",
|
|
"SpreadFilter",
|
|
"VolatilityFilter",
|
|
]
|
|
AVAILABLE_DATAHANDLERS = ["json", "jsongz", "hdf5", "feather", "parquet"]
|
|
BACKTEST_BREAKDOWNS = ["day", "week", "month"]
|
|
BACKTEST_CACHE_AGE = ["none", "day", "week", "month"]
|
|
BACKTEST_CACHE_DEFAULT = "day"
|
|
DRY_RUN_WALLET = 1000
|
|
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"]
|
|
DEFAULT_ORDERFLOW_COLUMNS = ["level", "bid", "ask", "delta"]
|
|
TRADES_DTYPES = {
|
|
"timestamp": "int64",
|
|
"id": "str",
|
|
"type": "str",
|
|
"side": "str",
|
|
"price": "float64",
|
|
"amount": "float64",
|
|
"cost": "float64",
|
|
}
|
|
TRADING_MODES = ["spot", "margin", "futures"]
|
|
MARGIN_MODES = ["cross", "isolated", ""]
|
|
|
|
LAST_BT_RESULT_FN = ".last_result.json"
|
|
FTHYPT_FILEVERSION = "fthypt_fileversion"
|
|
|
|
USERPATH_HYPEROPTS = "hyperopts"
|
|
USERPATH_STRATEGIES = "strategies"
|
|
USERPATH_NOTEBOOKS = "notebooks"
|
|
USERPATH_FREQAIMODELS = "freqaimodels"
|
|
|
|
TELEGRAM_SETTING_OPTIONS = ["on", "off", "silent"]
|
|
WEBHOOK_FORMAT_OPTIONS = ["form", "json", "raw"]
|
|
FULL_DATAFRAME_THRESHOLD = 100
|
|
CUSTOM_TAG_MAX_LENGTH = 255
|
|
DL_DATA_TIMEFRAMES = ["1m", "5m"]
|
|
|
|
ENV_VAR_PREFIX = "FREQTRADE__"
|
|
|
|
CANCELED_EXCHANGE_STATES = ("cancelled", "canceled", "expired")
|
|
NON_OPEN_EXCHANGE_STATES = CANCELED_EXCHANGE_STATES + ("closed",)
|
|
|
|
# Define decimals per coin for outputs
|
|
# Only used for outputs.
|
|
DECIMAL_PER_COIN_FALLBACK = 3 # Should be low to avoid listing all possible FIAT's
|
|
DECIMALS_PER_COIN = {
|
|
"BTC": 8,
|
|
"ETH": 5,
|
|
}
|
|
|
|
DUST_PER_COIN = {"BTC": 0.0001, "ETH": 0.01}
|
|
|
|
# Source files with destination directories within user-directory
|
|
USER_DATA_FILES = {
|
|
"sample_strategy.py": USERPATH_STRATEGIES,
|
|
"sample_hyperopt_loss.py": USERPATH_HYPEROPTS,
|
|
"strategy_analysis_example.ipynb": USERPATH_NOTEBOOKS,
|
|
}
|
|
|
|
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",
|
|
"UAH",
|
|
"SEK",
|
|
"SGD",
|
|
"THB",
|
|
"TRY",
|
|
"TWD",
|
|
"ZAR",
|
|
"USD",
|
|
"BTC",
|
|
"ETH",
|
|
"XRP",
|
|
"LTC",
|
|
"BCH",
|
|
"BNB",
|
|
"", # Allow empty field in config.
|
|
]
|
|
|
|
MINIMAL_CONFIG = {
|
|
"stake_currency": "",
|
|
"dry_run": True,
|
|
"exchange": {
|
|
"name": "",
|
|
"key": "",
|
|
"secret": "",
|
|
"pair_whitelist": [],
|
|
"ccxt_async_config": {},
|
|
},
|
|
}
|
|
|
|
|
|
CANCEL_REASON = {
|
|
"TIMEOUT": "cancelled due to timeout",
|
|
"PARTIALLY_FILLED_KEEP_OPEN": "partially filled - keeping order open",
|
|
"PARTIALLY_FILLED": "partially filled",
|
|
"FULLY_CANCELLED": "fully cancelled",
|
|
"ALL_CANCELLED": "cancelled (all unfilled and partially filled open orders cancelled)",
|
|
"CANCELLED_ON_EXCHANGE": "cancelled on exchange",
|
|
"FORCE_EXIT": "forcesold",
|
|
"REPLACE": "cancelled to be replaced by new limit order",
|
|
"REPLACE_FAILED": "failed to replace order, deleting Trade",
|
|
"USER_CANCEL": "user requested order cancel",
|
|
}
|
|
|
|
# List of pairs with their timeframes
|
|
PairWithTimeframe = tuple[str, str, CandleType]
|
|
ListPairsWithTimeframes = list[PairWithTimeframe]
|
|
|
|
# Type for trades list
|
|
TradeList = list[list]
|
|
# ticks, pair, timeframe, CandleType
|
|
TickWithTimeframe = tuple[str, str, CandleType, int | None, int | None]
|
|
ListTicksWithTimeframes = list[TickWithTimeframe]
|
|
|
|
LongShort = Literal["long", "short"]
|
|
EntryExit = Literal["entry", "exit"]
|
|
BuySell = Literal["buy", "sell"]
|
|
MakerTaker = Literal["maker", "taker"]
|
|
BidAsk = Literal["bid", "ask"]
|
|
OBLiteral = Literal["asks", "bids"]
|
|
|
|
Config = dict[str, Any]
|
|
# Exchange part of the configuration.
|
|
ExchangeConfig = dict[str, Any]
|
|
IntOrInf = float
|
|
|
|
|
|
EntryExecuteMode = Literal["initial", "pos_adjust", "replace"]
|