mirror of
https://github.com/aljazceru/hummingbot-dashboard.git
synced 2026-01-27 09:04:21 +01:00
Merge pull request #29 from hummingbot/feat/add_download_candles_page
Feat/add download candles page
This commit is contained in:
2
Makefile
2
Makefile
@@ -10,7 +10,7 @@ env_remove:
|
||||
conda env remove -n dashboard
|
||||
|
||||
env_create:
|
||||
conda env create -f environment.yml
|
||||
conda env create -f environment_conda.yml
|
||||
|
||||
docker_build:
|
||||
docker build -t dashboard:latest .
|
||||
|
||||
15
README.md
15
README.md
@@ -34,6 +34,14 @@ These files are located in the `/data` folder in Hummingbot, and are named `<str
|
||||
|
||||
Easily compare various DeFi protocols based on their market capitalization and total value locked, using DeFiLlama data.
|
||||
|
||||
### 🗂 Candles Downloader
|
||||
|
||||
Download historical exchange data as OHLVC candles. Supports multiple trading pairs and custom time ranges/intervals.
|
||||
|
||||
Current Hummingbot connectors supported:
|
||||
* `binance`
|
||||
* `binance_perpetual`
|
||||
|
||||
### 📋 Data
|
||||
|
||||
Reference data for the various apps this collection.
|
||||
@@ -71,6 +79,13 @@ ln -s /path/to/hummingbot/data data
|
||||
|
||||
For more info about Streamlit installation, see the instructions located at https://docs.streamlit.io/library/get-started/installation.
|
||||
|
||||
## Updates
|
||||
|
||||
To update the `dashboard` environment for new dependencies, run:
|
||||
```
|
||||
conda env update -f environment_conda.yml
|
||||
```
|
||||
|
||||
## Contributions
|
||||
|
||||
We welcome new data apps, bug fixes, and improvements by the community!
|
||||
|
||||
2
constants.py
Normal file
2
constants.py
Normal file
@@ -0,0 +1,2 @@
|
||||
CANDLES_DATA_PATH = "data/candles"
|
||||
DOWNLOAD_CANDLES_CONFIG_YML = "hummingbot_files/scripts_configs/data_downloader_config.yml"
|
||||
@@ -14,4 +14,5 @@ dependencies:
|
||||
- glom
|
||||
- defillama
|
||||
- statsmodels
|
||||
- pandas_ta
|
||||
- pandas_ta
|
||||
- pyyaml
|
||||
|
||||
22
hummingbot_files/compose_files/data-downloader-compose.yml
Normal file
22
hummingbot_files/compose_files/data-downloader-compose.yml
Normal file
@@ -0,0 +1,22 @@
|
||||
version: "3.9"
|
||||
services:
|
||||
bot:
|
||||
container_name: data_downloader
|
||||
image: dardonacci/hummingbot:development
|
||||
volumes:
|
||||
- "../../data/candles:/home/hummingbot/data"
|
||||
- "../conf:/home/hummingbot/conf"
|
||||
- "../conf/connectors:/home/hummingbot/conf/connectors"
|
||||
environment:
|
||||
- CONFIG_PASSWORD=a
|
||||
- CONFIG_FILE_NAME=download_candles.py
|
||||
env_file:
|
||||
- ../scripts_configs/data_downloader_config.yml
|
||||
logging:
|
||||
driver: "json-file"
|
||||
options:
|
||||
max-size: "10m"
|
||||
max-file: 5
|
||||
tty: true
|
||||
stdin_open: true
|
||||
network_mode: host
|
||||
1
hummingbot_files/conf/.password_verification
Normal file
1
hummingbot_files/conf/.password_verification
Normal file
@@ -0,0 +1 @@
|
||||
7b2263727970746f223a207b22636970686572223a20226165732d3132382d637472222c2022636970686572706172616d73223a207b226976223a20223864336365306436393461623131396334363135663935366464653839363063227d2c202263697068657274657874223a20223836333266323430613563306131623665353664222c20226b6466223a202270626b646632222c20226b6466706172616d73223a207b2263223a20313030303030302c2022646b6c656e223a2033322c2022707266223a2022686d61632d736861323536222c202273616c74223a20226566373330376531636464373964376132303338323534656139343433663930227d2c20226d6163223a202266393439383534613530633138363633386363353962336133363665633962353333386633613964373266636635343066313034333361353431636232306438227d2c202276657273696f6e223a20337d
|
||||
194
hummingbot_files/conf/conf_client.yml
Normal file
194
hummingbot_files/conf/conf_client.yml
Normal file
@@ -0,0 +1,194 @@
|
||||
####################################
|
||||
### client_config_map config ###
|
||||
####################################
|
||||
|
||||
instance_id: 039758736d451914503a45ff596e168902d62557
|
||||
|
||||
log_level: INFO
|
||||
|
||||
debug_console: false
|
||||
|
||||
strategy_report_interval: 900.0
|
||||
|
||||
logger_override_whitelist:
|
||||
- hummingbot.strategy.arbitrage
|
||||
- hummingbot.strategy.cross_exchange_market_making
|
||||
- conf
|
||||
|
||||
log_file_path: /home/hummingbot/logs
|
||||
|
||||
kill_switch_mode: {}
|
||||
|
||||
# What to auto-fill in the prompt after each import command (start/config)
|
||||
autofill_import: disabled
|
||||
|
||||
telegram_mode: {}
|
||||
|
||||
# MQTT Bridge configuration.
|
||||
mqtt_bridge:
|
||||
mqtt_host: localhost
|
||||
mqtt_port: 1883
|
||||
mqtt_username: ''
|
||||
mqtt_password: ''
|
||||
mqtt_namespace: hbot
|
||||
mqtt_ssl: false
|
||||
mqtt_logger: true
|
||||
mqtt_notifier: true
|
||||
mqtt_commands: true
|
||||
mqtt_events: true
|
||||
mqtt_external_events: true
|
||||
mqtt_autostart: false
|
||||
|
||||
# Error log sharing
|
||||
send_error_logs: true
|
||||
|
||||
# Can store the previous strategy ran for quick retrieval.
|
||||
previous_strategy: null
|
||||
|
||||
# Advanced database options, currently supports SQLAlchemy's included dialects
|
||||
# Reference: https://docs.sqlalchemy.org/en/13/dialects/
|
||||
# To use an instance of SQLite DB the required configuration is
|
||||
# db_engine: sqlite
|
||||
# To use a DBMS the required configuration is
|
||||
# db_host: 127.0.0.1
|
||||
# db_port: 3306
|
||||
# db_username: username
|
||||
# db_password: password
|
||||
# db_name: dbname
|
||||
db_mode:
|
||||
db_engine: sqlite
|
||||
|
||||
pmm_script_mode: {}
|
||||
|
||||
# Balance Limit Configurations
|
||||
# e.g. Setting USDT and BTC limits on Binance.
|
||||
# balance_asset_limit:
|
||||
# binance:
|
||||
# BTC: 0.1
|
||||
# USDT: 1000
|
||||
balance_asset_limit:
|
||||
bybit_testnet: {}
|
||||
lbank: {}
|
||||
binance_us: {}
|
||||
crypto_com: {}
|
||||
ascend_ex_paper_trade: {}
|
||||
hotbit: {}
|
||||
gate_io_paper_trade: {}
|
||||
bitmex_testnet: {}
|
||||
ndax_testnet: {}
|
||||
huobi: {}
|
||||
probit_kr: {}
|
||||
altmarkets: {}
|
||||
hitbtc: {}
|
||||
foxbit: {}
|
||||
ascend_ex: {}
|
||||
binance: {}
|
||||
okx: {}
|
||||
ciex: {}
|
||||
bitmex: {}
|
||||
bitfinex: {}
|
||||
probit: {}
|
||||
kraken: {}
|
||||
kucoin: {}
|
||||
bitmart: {}
|
||||
bybit: {}
|
||||
bittrex: {}
|
||||
btc_markets: {}
|
||||
mock_paper_exchange: {}
|
||||
kucoin_paper_trade: {}
|
||||
ndax: {}
|
||||
loopring: {}
|
||||
mexc: {}
|
||||
whitebit: {}
|
||||
coinbase_pro: {}
|
||||
binance_paper_trade: {}
|
||||
gate_io: {}
|
||||
|
||||
# Fixed gas price (in Gwei) for Ethereum transactions
|
||||
manual_gas_price: 50.0
|
||||
|
||||
# Gateway API Configurations
|
||||
# default host to only use localhost
|
||||
# Port need to match the final installation port for Gateway
|
||||
gateway:
|
||||
gateway_api_host: localhost
|
||||
gateway_api_port: '15888'
|
||||
|
||||
certs_path: /home/hummingbot/certs
|
||||
|
||||
# Whether to enable aggregated order and trade data collection
|
||||
anonymized_metrics_mode:
|
||||
anonymized_metrics_interval_min: 15.0
|
||||
|
||||
# Command Shortcuts
|
||||
# Define abbreviations for often used commands
|
||||
# or batch grouped commands together
|
||||
command_shortcuts:
|
||||
- command: spreads
|
||||
help: Set bid and ask spread
|
||||
arguments:
|
||||
- Bid Spread
|
||||
- Ask Spread
|
||||
output:
|
||||
- config bid_spread $1
|
||||
- config ask_spread $2
|
||||
|
||||
# A source for rate oracle, currently ascend_ex, binance, coin_gecko, kucoin, gate_io
|
||||
rate_oracle_source:
|
||||
name: binance
|
||||
|
||||
# A universal token which to display tokens values in, e.g. USD,EUR,BTC
|
||||
global_token:
|
||||
global_token_name: USD
|
||||
global_token_symbol: $
|
||||
|
||||
# Percentage of API rate limits (on any exchange and any end point) allocated to this bot instance.
|
||||
# Enter 50 to indicate 50%. E.g. if the API rate limit is 100 calls per second, and you allocate
|
||||
# 50% to this setting, the bot will have a maximum (limit) of 50 calls per second
|
||||
rate_limits_share_pct: 100.0
|
||||
|
||||
commands_timeout:
|
||||
create_command_timeout: 10.0
|
||||
other_commands_timeout: 30.0
|
||||
|
||||
# Tabulate table format style (https://github.com/astanin/python-tabulate#table-format)
|
||||
tables_format: psql
|
||||
|
||||
paper_trade:
|
||||
paper_trade_exchanges:
|
||||
- binance
|
||||
- kucoin
|
||||
- ascend_ex
|
||||
- gate_io
|
||||
paper_trade_account_balance:
|
||||
BTC: 1.0
|
||||
USDT: 1000.0
|
||||
ONE: 1000.0
|
||||
USDQ: 1000.0
|
||||
TUSD: 1000.0
|
||||
ETH: 10.0
|
||||
WETH: 10.0
|
||||
USDC: 1000.0
|
||||
DAI: 1000.0
|
||||
|
||||
color:
|
||||
top_pane: '#000000'
|
||||
bottom_pane: '#000000'
|
||||
output_pane: '#262626'
|
||||
input_pane: '#1C1C1C'
|
||||
logs_pane: '#121212'
|
||||
terminal_primary: '#5FFFD7'
|
||||
primary_label: '#5FFFD7'
|
||||
secondary_label: '#FFFFFF'
|
||||
success_label: '#5FFFD7'
|
||||
warning_label: '#FFFF00'
|
||||
info_label: '#5FD7FF'
|
||||
error_label: '#FF0000'
|
||||
gold_label: '#FFD700'
|
||||
silver_label: '#C0C0C0'
|
||||
bronze_label: '#CD7F32'
|
||||
|
||||
# The tick size is the frequency with which the clock notifies the time iterators by calling the
|
||||
# c_tick() method, that means for example that if the tick size is 1, the logic of the strategy
|
||||
# will run every second.
|
||||
tick_size: 1.0
|
||||
298
hummingbot_files/conf/conf_fee_overrides.yml
Normal file
298
hummingbot_files/conf/conf_fee_overrides.yml
Normal file
@@ -0,0 +1,298 @@
|
||||
########################################
|
||||
### Fee overrides configurations ###
|
||||
########################################
|
||||
|
||||
# For more detailed information: https://docs.hummingbot.io
|
||||
template_version: 14
|
||||
|
||||
# Example of the fields that can be specified to override the `TradeFeeFactory` default settings.
|
||||
# If the field is missing or the value is left blank, the default value will be used.
|
||||
# The percentage values are specified as 0.1 for 0.1%.
|
||||
#
|
||||
# [exchange name]_percent_fee_token:
|
||||
# [exchange name]_maker_percent_fee:
|
||||
# [exchange name]_taker_percent_fee:
|
||||
# [exchange name]_buy_percent_fee_deducted_from_returns: # if False, the buy fee is added to the order costs
|
||||
# [exchange name]_maker_fixed_fees: # a list of lists of token-fee pairs (e.g. [["ETH", 1]])
|
||||
# [exchange name]_taker_fixed_fees: # a list of lists of token-fee pairs (e.g. [["ETH", 1]])
|
||||
|
||||
binance_percent_fee_token: # BNB
|
||||
binance_maker_percent_fee: # 0.75
|
||||
binance_taker_percent_fee: # 0.75
|
||||
binance_buy_percent_fee_deducted_from_returns: # True
|
||||
|
||||
# List of supported Exchanges for which the user's conf/conf_fee_override.yml
|
||||
# will work. This file currently needs to be in sync with hummingbot list of
|
||||
# supported exchanges
|
||||
altmarkets_buy_percent_fee_deducted_from_returns:
|
||||
altmarkets_maker_fixed_fees:
|
||||
altmarkets_maker_percent_fee:
|
||||
altmarkets_percent_fee_token:
|
||||
altmarkets_taker_fixed_fees:
|
||||
altmarkets_taker_percent_fee:
|
||||
ascend_ex_buy_percent_fee_deducted_from_returns:
|
||||
ascend_ex_maker_fixed_fees:
|
||||
ascend_ex_maker_percent_fee:
|
||||
ascend_ex_percent_fee_token:
|
||||
ascend_ex_taker_fixed_fees:
|
||||
ascend_ex_taker_percent_fee:
|
||||
binance_maker_fixed_fees:
|
||||
binance_perpetual_buy_percent_fee_deducted_from_returns:
|
||||
binance_perpetual_maker_fixed_fees:
|
||||
binance_perpetual_maker_percent_fee:
|
||||
binance_perpetual_percent_fee_token:
|
||||
binance_perpetual_taker_fixed_fees:
|
||||
binance_perpetual_taker_percent_fee:
|
||||
binance_perpetual_testnet_buy_percent_fee_deducted_from_returns:
|
||||
binance_perpetual_testnet_maker_fixed_fees:
|
||||
binance_perpetual_testnet_maker_percent_fee:
|
||||
binance_perpetual_testnet_percent_fee_token:
|
||||
binance_perpetual_testnet_taker_fixed_fees:
|
||||
binance_perpetual_testnet_taker_percent_fee:
|
||||
binance_taker_fixed_fees:
|
||||
binance_us_buy_percent_fee_deducted_from_returns:
|
||||
binance_us_maker_fixed_fees:
|
||||
binance_us_maker_percent_fee:
|
||||
binance_us_percent_fee_token:
|
||||
binance_us_taker_fixed_fees:
|
||||
binance_us_taker_percent_fee:
|
||||
bitfinex_buy_percent_fee_deducted_from_returns:
|
||||
bitfinex_maker_fixed_fees:
|
||||
bitfinex_maker_percent_fee:
|
||||
bitfinex_percent_fee_token:
|
||||
bitfinex_taker_fixed_fees:
|
||||
bitfinex_taker_percent_fee:
|
||||
bitmart_buy_percent_fee_deducted_from_returns:
|
||||
bitmart_maker_fixed_fees:
|
||||
bitmart_maker_percent_fee:
|
||||
bitmart_percent_fee_token:
|
||||
bitmart_taker_fixed_fees:
|
||||
bitmart_taker_percent_fee:
|
||||
bittrex_buy_percent_fee_deducted_from_returns:
|
||||
bittrex_maker_fixed_fees:
|
||||
bittrex_maker_percent_fee:
|
||||
bittrex_percent_fee_token:
|
||||
bittrex_taker_fixed_fees:
|
||||
bittrex_taker_percent_fee:
|
||||
btc_markets_percent_fee_token:
|
||||
btc_markets_maker_percent_fee:
|
||||
btc_markets_taker_percent_fee:
|
||||
btc_markets_buy_percent_fee_deducted_from_returns:
|
||||
bybit_perpetual_buy_percent_fee_deducted_from_returns:
|
||||
bybit_perpetual_maker_fixed_fees:
|
||||
bybit_perpetual_maker_percent_fee:
|
||||
bybit_perpetual_percent_fee_token:
|
||||
bybit_perpetual_taker_fixed_fees:
|
||||
bybit_perpetual_taker_percent_fee:
|
||||
bybit_perpetual_testnet_buy_percent_fee_deducted_from_returns:
|
||||
bybit_perpetual_testnet_maker_fixed_fees:
|
||||
bybit_perpetual_testnet_maker_percent_fee:
|
||||
bybit_perpetual_testnet_percent_fee_token:
|
||||
bybit_perpetual_testnet_taker_fixed_fees:
|
||||
bybit_perpetual_testnet_taker_percent_fee:
|
||||
coinbase_pro_buy_percent_fee_deducted_from_returns:
|
||||
coinbase_pro_maker_fixed_fees:
|
||||
coinbase_pro_maker_percent_fee:
|
||||
coinbase_pro_percent_fee_token:
|
||||
coinbase_pro_taker_fixed_fees:
|
||||
coinbase_pro_taker_percent_fee:
|
||||
crypto_com_buy_percent_fee_deducted_from_returns:
|
||||
crypto_com_maker_fixed_fees:
|
||||
crypto_com_maker_percent_fee:
|
||||
crypto_com_percent_fee_token:
|
||||
crypto_com_taker_fixed_fees:
|
||||
crypto_com_taker_percent_fee:
|
||||
dydx_perpetual_buy_percent_fee_deducted_from_returns:
|
||||
dydx_perpetual_maker_fixed_fees:
|
||||
dydx_perpetual_maker_percent_fee:
|
||||
dydx_perpetual_percent_fee_token:
|
||||
dydx_perpetual_taker_fixed_fees:
|
||||
dydx_perpetual_taker_percent_fee:
|
||||
gate_io_buy_percent_fee_deducted_from_returns:
|
||||
gate_io_maker_fixed_fees:
|
||||
gate_io_maker_percent_fee:
|
||||
gate_io_percent_fee_token:
|
||||
gate_io_taker_fixed_fees:
|
||||
gate_io_taker_percent_fee:
|
||||
hitbtc_buy_percent_fee_deducted_from_returns:
|
||||
hitbtc_maker_fixed_fees:
|
||||
hitbtc_maker_percent_fee:
|
||||
hitbtc_percent_fee_token:
|
||||
hitbtc_taker_fixed_fees:
|
||||
hitbtc_taker_percent_fee:
|
||||
huobi_buy_percent_fee_deducted_from_returns:
|
||||
huobi_maker_fixed_fees:
|
||||
huobi_maker_percent_fee:
|
||||
huobi_percent_fee_token:
|
||||
huobi_taker_fixed_fees:
|
||||
huobi_taker_percent_fee:
|
||||
kraken_buy_percent_fee_deducted_from_returns:
|
||||
kraken_maker_fixed_fees:
|
||||
kraken_maker_percent_fee:
|
||||
kraken_percent_fee_token:
|
||||
kraken_taker_fixed_fees:
|
||||
kraken_taker_percent_fee:
|
||||
kucoin_buy_percent_fee_deducted_from_returns:
|
||||
kucoin_maker_fixed_fees:
|
||||
kucoin_maker_percent_fee:
|
||||
kucoin_percent_fee_token:
|
||||
kucoin_taker_fixed_fees:
|
||||
kucoin_taker_percent_fee:
|
||||
loopring_buy_percent_fee_deducted_from_returns:
|
||||
loopring_maker_fixed_fees:
|
||||
loopring_maker_percent_fee:
|
||||
loopring_percent_fee_token:
|
||||
loopring_taker_fixed_fees:
|
||||
loopring_taker_percent_fee:
|
||||
mexc_buy_percent_fee_deducted_from_returns:
|
||||
mexc_maker_fixed_fees:
|
||||
mexc_maker_percent_fee:
|
||||
mexc_percent_fee_token:
|
||||
mexc_taker_fixed_fees:
|
||||
mexc_taker_percent_fee:
|
||||
ndax_buy_percent_fee_deducted_from_returns:
|
||||
ndax_maker_fixed_fees:
|
||||
ndax_maker_percent_fee:
|
||||
ndax_percent_fee_token:
|
||||
ndax_taker_fixed_fees:
|
||||
ndax_taker_percent_fee:
|
||||
ndax_testnet_buy_percent_fee_deducted_from_returns:
|
||||
ndax_testnet_maker_fixed_fees:
|
||||
ndax_testnet_maker_percent_fee:
|
||||
ndax_testnet_percent_fee_token:
|
||||
ndax_testnet_taker_fixed_fees:
|
||||
ndax_testnet_taker_percent_fee:
|
||||
okx_buy_percent_fee_deducted_from_returns:
|
||||
okx_maker_fixed_fees:
|
||||
okx_maker_percent_fee:
|
||||
okx_percent_fee_token:
|
||||
okx_taker_fixed_fees:
|
||||
okx_taker_percent_fee:
|
||||
probit_buy_percent_fee_deducted_from_returns:
|
||||
probit_kr_buy_percent_fee_deducted_from_returns:
|
||||
probit_kr_maker_fixed_fees:
|
||||
probit_kr_maker_percent_fee:
|
||||
probit_kr_percent_fee_token:
|
||||
probit_kr_taker_fixed_fees:
|
||||
probit_kr_taker_percent_fee:
|
||||
probit_maker_fixed_fees:
|
||||
probit_maker_percent_fee:
|
||||
probit_percent_fee_token:
|
||||
probit_taker_fixed_fees:
|
||||
probit_taker_percent_fee:
|
||||
bitmex_perpetual_percent_fee_token:
|
||||
bitmex_perpetual_maker_percent_fee:
|
||||
bitmex_perpetual_taker_percent_fee:
|
||||
bitmex_perpetual_buy_percent_fee_deducted_from_returns:
|
||||
bitmex_perpetual_maker_fixed_fees:
|
||||
bitmex_perpetual_taker_fixed_fees:
|
||||
bitmex_perpetual_testnet_percent_fee_token:
|
||||
bitmex_perpetual_testnet_maker_percent_fee:
|
||||
bitmex_perpetual_testnet_taker_percent_fee:
|
||||
bitmex_perpetual_testnet_buy_percent_fee_deducted_from_returns:
|
||||
bitmex_perpetual_testnet_maker_fixed_fees:
|
||||
bitmex_perpetual_testnet_taker_fixed_fees:
|
||||
kucoin_perpetual_percent_fee_token:
|
||||
kucoin_perpetual_maker_percent_fee:
|
||||
kucoin_perpetual_taker_percent_fee:
|
||||
kucoin_perpetual_buy_percent_fee_deducted_from_returns:
|
||||
kucoin_perpetual_maker_fixed_fees:
|
||||
kucoin_perpetual_taker_fixed_fees:
|
||||
kucoin_perpetual_testnet_percent_fee_token:
|
||||
kucoin_perpetual_testnet_maker_percent_fee:
|
||||
kucoin_perpetual_testnet_taker_percent_fee:
|
||||
kucoin_perpetual_testnet_buy_percent_fee_deducted_from_returns:
|
||||
kucoin_perpetual_testnet_maker_fixed_fees:
|
||||
kucoin_perpetual_testnet_taker_fixed_fees:
|
||||
gate_io_perpetual_percent_fee_token:
|
||||
gate_io_perpetual_maker_percent_fee:
|
||||
gate_io_perpetual_taker_percent_fee:
|
||||
gate_io_perpetual_buy_percent_fee_deducted_from_returns:
|
||||
gate_io_perpetual_maker_fixed_fees:
|
||||
gate_io_perpetual_taker_fixed_fees:
|
||||
phemex_perpetual_percent_fee_token:
|
||||
phemex_perpetual_maker_percent_fee:
|
||||
phemex_perpetual_taker_percent_fee:
|
||||
phemex_perpetual_buy_percent_fee_deducted_from_returns:
|
||||
phemex_perpetual_maker_fixed_fees:
|
||||
phemex_perpetual_taker_fixed_fees:
|
||||
phemex_perpetual_testnet_percent_fee_token:
|
||||
phemex_perpetual_testnet_maker_percent_fee:
|
||||
phemex_perpetual_testnet_taker_percent_fee:
|
||||
phemex_perpetual_testnet_buy_percent_fee_deducted_from_returns:
|
||||
phemex_perpetual_testnet_maker_fixed_fees:
|
||||
phemex_perpetual_testnet_taker_fixed_fees:
|
||||
bitget_perpetual_percent_fee_token:
|
||||
bitget_perpetual_maker_percent_fee:
|
||||
bitget_perpetual_taker_percent_fee:
|
||||
bitget_perpetual_buy_percent_fee_deducted_from_returns:
|
||||
bitget_perpetual_maker_fixed_fees:
|
||||
bitget_perpetual_taker_fixed_fees:
|
||||
bit_com_perpetual_percent_fee_token:
|
||||
bit_com_perpetual_maker_percent_fee:
|
||||
bit_com_perpetual_taker_percent_fee:
|
||||
bit_com_perpetual_buy_percent_fee_deducted_from_returns:
|
||||
bit_com_perpetual_maker_fixed_fees:
|
||||
bit_com_perpetual_taker_fixed_fees:
|
||||
bit_com_perpetual_testnet_percent_fee_token:
|
||||
bit_com_perpetual_testnet_maker_percent_fee:
|
||||
bit_com_perpetual_testnet_taker_percent_fee:
|
||||
bit_com_perpetual_testnet_buy_percent_fee_deducted_from_returns:
|
||||
bit_com_perpetual_testnet_maker_fixed_fees:
|
||||
bit_com_perpetual_testnet_taker_fixed_fees:
|
||||
whitebit_percent_fee_token:
|
||||
whitebit_maker_percent_fee:
|
||||
whitebit_taker_percent_fee:
|
||||
whitebit_buy_percent_fee_deducted_from_returns:
|
||||
whitebit_maker_fixed_fees:
|
||||
whitebit_taker_fixed_fees:
|
||||
bitmex_percent_fee_token:
|
||||
bitmex_maker_percent_fee:
|
||||
bitmex_taker_percent_fee:
|
||||
bitmex_buy_percent_fee_deducted_from_returns:
|
||||
bitmex_maker_fixed_fees:
|
||||
bitmex_taker_fixed_fees:
|
||||
bitmex_testnet_percent_fee_token:
|
||||
bitmex_testnet_maker_percent_fee:
|
||||
bitmex_testnet_taker_percent_fee:
|
||||
bitmex_testnet_buy_percent_fee_deducted_from_returns:
|
||||
bitmex_testnet_maker_fixed_fees:
|
||||
bitmex_testnet_taker_fixed_fees:
|
||||
ciex_percent_fee_token:
|
||||
ciex_maker_percent_fee:
|
||||
ciex_taker_percent_fee:
|
||||
ciex_buy_percent_fee_deducted_from_returns:
|
||||
ciex_maker_fixed_fees:
|
||||
ciex_taker_fixed_fees:
|
||||
foxbit_percent_fee_token:
|
||||
foxbit_maker_percent_fee:
|
||||
foxbit_taker_percent_fee:
|
||||
foxbit_buy_percent_fee_deducted_from_returns:
|
||||
foxbit_maker_fixed_fees:
|
||||
foxbit_taker_fixed_fees:
|
||||
lbank_percent_fee_token:
|
||||
lbank_maker_percent_fee:
|
||||
lbank_taker_percent_fee:
|
||||
lbank_buy_percent_fee_deducted_from_returns:
|
||||
lbank_maker_fixed_fees:
|
||||
lbank_taker_fixed_fees:
|
||||
bybit_percent_fee_token:
|
||||
bybit_maker_percent_fee:
|
||||
bybit_taker_percent_fee:
|
||||
bybit_buy_percent_fee_deducted_from_returns:
|
||||
bybit_maker_fixed_fees:
|
||||
bybit_taker_fixed_fees:
|
||||
bybit_testnet_percent_fee_token:
|
||||
bybit_testnet_maker_percent_fee:
|
||||
bybit_testnet_taker_percent_fee:
|
||||
bybit_testnet_buy_percent_fee_deducted_from_returns:
|
||||
bybit_testnet_maker_fixed_fees:
|
||||
bybit_testnet_taker_fixed_fees:
|
||||
hotbit_percent_fee_token:
|
||||
hotbit_maker_percent_fee:
|
||||
hotbit_taker_percent_fee:
|
||||
hotbit_buy_percent_fee_deducted_from_returns:
|
||||
hotbit_maker_fixed_fees:
|
||||
hotbit_taker_fixed_fees:
|
||||
btc_markets_maker_fixed_fees:
|
||||
btc_markets_taker_fixed_fees:
|
||||
83
hummingbot_files/conf/hummingbot_logs.yml
Executable file
83
hummingbot_files/conf/hummingbot_logs.yml
Executable file
@@ -0,0 +1,83 @@
|
||||
---
|
||||
version: 1
|
||||
template_version: 12
|
||||
|
||||
formatters:
|
||||
simple:
|
||||
format: "%(asctime)s - %(process)d - %(name)s - %(levelname)s - %(message)s"
|
||||
|
||||
handlers:
|
||||
console:
|
||||
class: hummingbot.logger.cli_handler.CLIHandler
|
||||
level: DEBUG
|
||||
formatter: simple
|
||||
stream: ext://sys.stdout
|
||||
console_warning:
|
||||
class: hummingbot.logger.cli_handler.CLIHandler
|
||||
level: WARNING
|
||||
formatter: simple
|
||||
stream: ext://sys.stdout
|
||||
console_info:
|
||||
class: hummingbot.logger.cli_handler.CLIHandler
|
||||
level: INFO
|
||||
formatter: simple
|
||||
stream: ext://sys.stdout
|
||||
file_handler:
|
||||
class: logging.handlers.TimedRotatingFileHandler
|
||||
level: DEBUG
|
||||
formatter: simple
|
||||
filename: $PROJECT_DIR/logs/logs_$STRATEGY_FILE_PATH.log
|
||||
encoding: utf8
|
||||
when: "D"
|
||||
interval: 1
|
||||
backupCount: 7
|
||||
"null":
|
||||
class: logging.NullHandler
|
||||
level: DEBUG
|
||||
|
||||
loggers:
|
||||
hummingbot.core.utils.eth_gas_station_lookup:
|
||||
level: NETWORK
|
||||
propagate: false
|
||||
handlers: [console, file_handler]
|
||||
mqtt: true
|
||||
hummingbot.logger.log_server_client:
|
||||
level: WARNING
|
||||
propagate: false
|
||||
handlers: [console, file_handler]
|
||||
mqtt: true
|
||||
hummingbot.logger.reporting_proxy_handler:
|
||||
level: WARNING
|
||||
propagate: false
|
||||
handlers: [console, file_handler]
|
||||
mqtt: true
|
||||
hummingbot.strategy:
|
||||
level: NETWORK
|
||||
propagate: false
|
||||
handlers: [console, file_handler]
|
||||
mqtt: true
|
||||
hummingbot.connector:
|
||||
level: NETWORK
|
||||
propagate: false
|
||||
handlers: [console, file_handler]
|
||||
mqtt: true
|
||||
hummingbot.client:
|
||||
level: NETWORK
|
||||
propagate: false
|
||||
handlers: [console, file_handler]
|
||||
mqtt: true
|
||||
hummingbot.core.event.event_reporter:
|
||||
level: EVENT_LOG
|
||||
propagate: false
|
||||
handlers: [file_handler]
|
||||
mqtt: false
|
||||
conf:
|
||||
level: NETWORK
|
||||
handlers: ["null"]
|
||||
propagate: false
|
||||
mqtt: false
|
||||
|
||||
root:
|
||||
level: INFO
|
||||
handlers: [console, file_handler]
|
||||
mqtt: true
|
||||
@@ -0,0 +1,4 @@
|
||||
DAYS_TO_DOWNLOAD: 3
|
||||
EXCHANGE: binance_perpetual
|
||||
INTERVALS: 1m,3m,1h
|
||||
TRADING_PAIRS: BTC-USDT,ETH-USDT
|
||||
75
pages/6_🗂_Candles_Downloader.py
Normal file
75
pages/6_🗂_Candles_Downloader.py
Normal file
@@ -0,0 +1,75 @@
|
||||
import time
|
||||
from subprocess import CalledProcessError
|
||||
|
||||
import streamlit as st
|
||||
|
||||
import constants
|
||||
from utils import os_utils
|
||||
from utils.docker_manager import DockerManager
|
||||
|
||||
st.set_page_config(
|
||||
page_title="Candles Downloader",
|
||||
page_icon=":bar_chart:",
|
||||
layout="wide",
|
||||
)
|
||||
docker_manager = DockerManager()
|
||||
st.write(f"# 🗂️ Candles Downloader")
|
||||
st.write("---")
|
||||
|
||||
c1, c2, c3 = st.columns([2, 2, 0.5])
|
||||
with c1:
|
||||
exchange = st.selectbox("Exchange", ["binance_perpetual", "binance"], index=0)
|
||||
trading_pairs = st.text_input("Trading Pairs (separated with commas)", value="BTC-USDT,ETH-USDT")
|
||||
with c2:
|
||||
intervals = st.multiselect("Intervals", options=["1m", "3m", "5m", "15m", "1h", "4h", "1d"], default=["1m", "3m", "1h"])
|
||||
days_to_download = st.number_input("Days to Download", value=30, min_value=1, max_value=365, step=1)
|
||||
with c3:
|
||||
get_data_button = st.button("Download Candles!")
|
||||
clean_container_folder_button = st.button("Clean Candles Folder")
|
||||
|
||||
if clean_container_folder_button:
|
||||
st.warning("Cleaning Candles Data folder...", icon="⚠️")
|
||||
st.write("---")
|
||||
os_utils.remove_files_from_directory(constants.CANDLES_DATA_PATH)
|
||||
st.write("### Container folder cleaned.")
|
||||
st.write("---")
|
||||
|
||||
if get_data_button:
|
||||
candles_container_config = {
|
||||
"EXCHANGE": exchange,
|
||||
"TRADING_PAIRS": trading_pairs,
|
||||
"INTERVALS": ",".join(intervals),
|
||||
"DAYS_TO_DOWNLOAD": days_to_download,
|
||||
}
|
||||
time.sleep(0.5)
|
||||
docker_manager.create_download_candles_container(candles_container_config)
|
||||
st.info("Downloading candles with a Docker container in the background. "
|
||||
"When this process is ready you will see the candles inside data/candles", icon="🕓")
|
||||
st.write("---")
|
||||
|
||||
st.write("---")
|
||||
st.write("## ⚙️Containers Management")
|
||||
try:
|
||||
|
||||
c1, c2 = st.columns([0.85, 0.15])
|
||||
with c1:
|
||||
st.write("Active Containers:")
|
||||
st.info(docker_manager.get_active_containers())
|
||||
|
||||
st.write("Exited Containers:")
|
||||
st.warning(docker_manager.get_exited_containers())
|
||||
with c2:
|
||||
stop_containers_button = st.button("Stop Containers")
|
||||
if stop_containers_button:
|
||||
docker_manager.stop_active_containers()
|
||||
|
||||
clean_exited_containers_button = st.button("Clean Containers")
|
||||
if clean_exited_containers_button:
|
||||
docker_manager.clean_exited_containers()
|
||||
|
||||
refresh_button = st.button("Refresh")
|
||||
if refresh_button:
|
||||
pass
|
||||
except CalledProcessError as error:
|
||||
st.write("### Docker is not running. Please start docker in your machine.")
|
||||
|
||||
@@ -7,4 +7,5 @@
|
||||
- defillama
|
||||
- statsmodels
|
||||
- pandas_ta
|
||||
- sqlalchemy
|
||||
- sqlalchemy
|
||||
- pyyaml
|
||||
41
utils/docker_manager.py
Normal file
41
utils/docker_manager.py
Normal file
@@ -0,0 +1,41 @@
|
||||
import subprocess
|
||||
from typing import Dict
|
||||
|
||||
import constants
|
||||
from utils import os_utils
|
||||
|
||||
|
||||
class DockerManager:
|
||||
def __init__(self):
|
||||
pass
|
||||
|
||||
@staticmethod
|
||||
def get_active_containers():
|
||||
cmd = "docker ps --format '{{.Names}}'"
|
||||
output = subprocess.check_output(cmd, shell=True)
|
||||
backtestings = [container for container in output.decode().split()]
|
||||
return backtestings
|
||||
|
||||
@staticmethod
|
||||
def get_exited_containers():
|
||||
cmd = "docker ps --filter status=exited --format '{{.Names}}'"
|
||||
output = subprocess.check_output(cmd, shell=True)
|
||||
containers = output.decode().split()
|
||||
return containers
|
||||
|
||||
@staticmethod
|
||||
def clean_exited_containers():
|
||||
cmd = "docker container prune --force"
|
||||
subprocess.Popen(cmd, shell=True)
|
||||
|
||||
def stop_active_containers(self):
|
||||
containers = self.get_active_containers()
|
||||
for container in containers:
|
||||
cmd = f"docker stop {container}"
|
||||
subprocess.Popen(cmd, shell=True)
|
||||
|
||||
def create_download_candles_container(self, candles_config: Dict):
|
||||
os_utils.dump_dict_to_yaml(candles_config, constants.DOWNLOAD_CANDLES_CONFIG_YML)
|
||||
command = ["docker", "compose", "-p", "data_downloader", "-f",
|
||||
"hummingbot_files/compose_files/data-downloader-compose.yml", "up", "-d"]
|
||||
subprocess.Popen(command)
|
||||
12
utils/os_utils.py
Normal file
12
utils/os_utils.py
Normal file
@@ -0,0 +1,12 @@
|
||||
import os
|
||||
import yaml
|
||||
|
||||
|
||||
def remove_files_from_directory(directory: str):
|
||||
for file in os.listdir(directory):
|
||||
os.remove(f"{directory}/{file}")
|
||||
|
||||
|
||||
def dump_dict_to_yaml(data_dict, filename):
|
||||
with open(filename, 'w') as file:
|
||||
yaml.dump(data_dict, file)
|
||||
Reference in New Issue
Block a user