Custom HummingBot for Whitebit
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
hummingbot/bin/hummingbot.py

100 lines
3.9 KiB

12 months ago
#!/usr/bin/env python
import asyncio
from typing import Coroutine, List, Optional
from weakref import ReferenceType, ref
import path_util # noqa: F401
from hummingbot import chdir_to_data_directory, init_logging
from hummingbot.client.config.client_config_map import ClientConfigMap
from hummingbot.client.config.config_crypt import ETHKeyFileSecretManger
from hummingbot.client.config.config_helpers import (
ClientConfigAdapter,
create_yml_files_legacy,
load_client_config_map_from_file,
write_config_to_yml,
)
from hummingbot.client.hummingbot_application import HummingbotApplication
from hummingbot.client.settings import AllConnectorSettings
from hummingbot.client.ui import login_prompt
from hummingbot.client.ui.style import load_style
from hummingbot.core.event.event_listener import EventListener
from hummingbot.core.event.events import HummingbotUIEvent
from hummingbot.core.utils import detect_available_port
from hummingbot.core.utils.async_utils import safe_gather
class UIStartListener(EventListener):
def __init__(self, hummingbot_app: HummingbotApplication, is_script: Optional[bool] = False, is_quickstart: Optional[bool] = False):
super().__init__()
self._hb_ref: ReferenceType = ref(hummingbot_app)
self._is_script = is_script
self._is_quickstart = is_quickstart
def __call__(self, _):
asyncio.create_task(self.ui_start_handler())
@property
def hummingbot_app(self) -> HummingbotApplication:
return self._hb_ref()
async def ui_start_handler(self):
hb: HummingbotApplication = self.hummingbot_app
if hb.strategy_name is not None:
if not self._is_script:
write_config_to_yml(hb.strategy_config_map, hb.strategy_file_name, hb.client_config_map)
hb.start(log_level=hb.client_config_map.log_level,
script=hb.strategy_name if self._is_script else None,
is_quickstart=self._is_quickstart)
async def main_async(client_config_map: ClientConfigAdapter):
await create_yml_files_legacy()
# This init_logging() call is important, to skip over the missing config warnings.
init_logging("hummingbot_logs.yml", client_config_map)
AllConnectorSettings.initialize_paper_trade_settings(client_config_map.paper_trade.paper_trade_exchanges)
hb = HummingbotApplication.main_application(client_config_map)
# The listener needs to have a named variable for keeping reference, since the event listener system
# uses weak references to remove unneeded listeners.
start_listener: UIStartListener = UIStartListener(hb)
hb.app.add_listener(HummingbotUIEvent.Start, start_listener)
tasks: List[Coroutine] = [hb.run()]
if client_config_map.debug_console:
if not hasattr(__builtins__, "help"):
import _sitebuiltins
__builtins__["help"] = _sitebuiltins._Helper()
from hummingbot.core.management.console import start_management_console
management_port: int = detect_available_port(8211)
tasks.append(start_management_console(locals(), host="localhost", port=management_port))
await safe_gather(*tasks)
def main():
chdir_to_data_directory()
secrets_manager_cls = ETHKeyFileSecretManger
try:
ev_loop: asyncio.AbstractEventLoop = asyncio.get_event_loop()
except Exception:
ev_loop: asyncio.AbstractEventLoop = asyncio.new_event_loop()
asyncio.set_event_loop(ev_loop)
# We need to load a default style for the login screen because the password is required to load the
# real configuration now that it can include secret parameters
style = load_style(ClientConfigAdapter(ClientConfigMap()))
if login_prompt(secrets_manager_cls, style=style):
client_config_map = load_client_config_map_from_file()
ev_loop.run_until_complete(main_async(client_config_map))
if __name__ == "__main__":
main()