Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feat/revamp dashboard #137

Merged
merged 139 commits into from
May 30, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
139 commits
Select commit Hold shift + click to select a range
934c74b
(feat) add methods to download candles async
cardosofede Apr 11, 2024
373bdea
(feat) add research notebooks
cardosofede Apr 12, 2024
f6562b1
(feat) default dark theme
cardosofede Apr 12, 2024
02836dd
(feat) add page to generate dman maker v2 configs
cardosofede Apr 12, 2024
da027c7
(feat) refactor bot orchestration page
cardosofede Apr 12, 2024
29e1353
(feat) change layout of pages
cardosofede Apr 12, 2024
830b048
(feat) create bot performance card v2
cardosofede Apr 12, 2024
4d6247a
(feat) add README
cardosofede Apr 12, 2024
31dcc23
(feat) improve file name downloaded
cardosofede Apr 12, 2024
c6a5550
(feat) add backend api client
cardosofede Apr 12, 2024
33a7f78
(feat) refactor launch strategy card
cardosofede Apr 12, 2024
f649916
(feat) refactor environment
cardosofede Apr 12, 2024
bf2077d
(feat) add broker host and port as env configuirable variables
cardosofede Apr 16, 2024
6995e74
(feat) remove docker manager
cardosofede Apr 16, 2024
74c86fb
(feat) refactor main menu
cardosofede Apr 16, 2024
c921c61
(feat) update dman_v2
cardosofede Apr 17, 2024
89c8872
(feat) refactor inputs
cardosofede Apr 17, 2024
bb71831
(feat) add xemm config generator
cardosofede Apr 17, 2024
870b507
(feat) add pmm simple config generator
cardosofede Apr 17, 2024
67722ff
(feat) make launch stategy compatible wiht generic controllers
cardosofede Apr 17, 2024
27d480b
(feat) add extra pages
cardosofede Apr 17, 2024
9bba5b0
(feat) add bollinger controller and candles support
cardosofede Apr 17, 2024
5e752fb
(feat) add readmes
cardosofede Apr 17, 2024
0ef7a7a
(feat) add position config
cardosofede Apr 18, 2024
4a8b787
(feat) add macd bb
cardosofede Apr 18, 2024
4f5f7ab
(feat) improve bollinger page
cardosofede Apr 19, 2024
91eb255
(feat) improve macd pmm simple pages
cardosofede Apr 19, 2024
1bc3264
(feat) add readmes
cardosofede Apr 30, 2024
4e82a6e
(feat) upgrade backend api client
cardosofede Apr 30, 2024
9da66ae
(feat) add pages to main
cardosofede Apr 30, 2024
c371a58
(feat) adapt controllers config page
cardosofede Apr 30, 2024
37a608f
(feat) refactor get data page
cardosofede Apr 30, 2024
2461750
(feat) refactor file structure
cardosofede May 9, 2024
5890f55
(feat) name make file
cardosofede May 16, 2024
502c2b7
(feat) display only fundamental pages
cardosofede May 16, 2024
6ed1264
(feat) refactor performance components
cardosofede May 16, 2024
41ab88c
(feat) refactor file explorers
cardosofede May 16, 2024
3898ed6
(feat) refactor components to create bots
cardosofede May 16, 2024
66191ee
(feat) refactor optimization cards
cardosofede May 16, 2024
6ad575b
(feat) refactor editors and inputs
cardosofede May 16, 2024
afb6f87
(feat) refactor backtesting pages
cardosofede May 16, 2024
d90a69c
(feat) refactor orchestration pages
cardosofede May 16, 2024
f99afde
(feat) initialize controller configs pages
cardosofede May 16, 2024
0dfad99
(feat) refactor data download candles
cardosofede May 16, 2024
877a728
(feat) refactor base performance pages
cardosofede May 16, 2024
17c8fdd
(feat) refactor utility pages
cardosofede May 16, 2024
3e9cf2e
(feat) refactor launch pages
cardosofede May 16, 2024
a166540
(feat) remove labeling, controllers and strategy from quants lab
cardosofede May 16, 2024
c7ecf7d
(feat) remove base utils page
cardosofede May 16, 2024
b1635de
(feat) refactor pages structure
cardosofede May 16, 2024
5143599
(feat) add base utils
cardosofede May 16, 2024
2e66e2d
(feat) add backtesting componetn
cardosofede May 16, 2024
cfc46e8
(feat) add data viz moduel
cardosofede May 16, 2024
7a892d3
(feat) include use inputs
cardosofede May 16, 2024
30144e8
(feat) add utils and labeling module to quants lab
cardosofede May 16, 2024
3509488
(feat) add backend api, coingecko and miner clients
cardosofede May 16, 2024
2902b42
(feat) move utils to backend
cardosofede May 16, 2024
b3ea14d
(feat) refactor inital state
cardosofede May 16, 2024
cdf029f
(feat) default initial state of the sidebar in expanded
cardosofede May 16, 2024
a94cf0b
(feat) normalize backtesting output
cardosofede May 16, 2024
7c3fd76
(feat) add input components
cardosofede May 16, 2024
97798db
(feat) remove dataviz module
cardosofede May 16, 2024
810642d
(feat) add base visualizations for configs
cardosofede May 16, 2024
4ba64bf
(feat) add visualizations for backtesting
cardosofede May 16, 2024
d200572
(feat) fix imports
cardosofede May 16, 2024
d87f959
(feat) clean up pmm simple page
cardosofede May 16, 2024
f42b7ec
(feat) add backtesting components
cardosofede May 17, 2024
85e0729
(feat) improve pmm simple page
cardosofede May 17, 2024
049401b
(feat) add visualizations for performance
cardosofede May 17, 2024
d52af90
(feat) reduce the height of the graph
cardosofede May 17, 2024
1caaa36
(feat) revert changes in environment
cardosofede May 17, 2024
ad6df97
(feat) improve visualization of executors
cardosofede May 17, 2024
02a078b
(feat) remove not necessary libraries
cardosofede May 17, 2024
ef48c8f
(feat) add upload config to backend api
cardosofede May 18, 2024
e67924b
(feat) minor styling improvements
cardosofede May 18, 2024
072ad3e
(feat) move launch bot to st
cardosofede May 18, 2024
88faa08
(feat) remove compressing and cleaning from stop command
cardosofede May 18, 2024
55d437e
(feat) add dca distribution inputs
cardosofede May 18, 2024
07cebfa
(feat) adapt script file name
cardosofede May 18, 2024
84e60ab
(feat) add deploy using streamlit
cardosofede May 18, 2024
47e8141
(feat) refactor dman maker v2
cardosofede May 18, 2024
d93dd73
(feat) refactor deploy pages
cardosofede May 18, 2024
6ec8c78
(feat) add dca builder visualization
cardosofede May 18, 2024
259b6eb
(feat) add hidden st page
cardosofede May 18, 2024
cce2078
(feat) apply environment changes
cardosofede May 20, 2024
9ee08c5
(feat) add directional components
cardosofede May 20, 2024
4d6b07a
(feat) refactor bollinger
cardosofede May 20, 2024
4f4a2ba
(feat) change defaults to kucoin to be used in the US
cardosofede May 21, 2024
e566e86
(feat) clean up bollinger page
cardosofede May 21, 2024
8cd669d
(feat) remove trend follower page
cardosofede May 21, 2024
397986f
(feat) add method to cache candles
cardosofede May 21, 2024
57bc498
(feat) intialize macd_bb page
cardosofede May 21, 2024
939b0fc
(feat) separate live candles from bt candles
cardosofede May 21, 2024
2f563c7
(feat) add traces for indicators and signals
cardosofede May 21, 2024
7909687
(feat) remove range slider and improve executors lines
cardosofede May 21, 2024
b69c044
(feat) finish macd bb page
cardosofede May 21, 2024
b865eb1
(feat) add index resampling
cardosofede May 21, 2024
d2f4a9e
(feat) clean up visualization
cardosofede May 21, 2024
e0a6f52
(feat) adapt base values
cardosofede May 21, 2024
3106b41
(feat) add optional candles darta
cardosofede May 21, 2024
540725c
(feat) refactor general user inputs
cardosofede May 21, 2024
26a740e
(feat) add supertrend indicators and signals
cardosofede May 21, 2024
2e3df3b
(feat) add pmm dynamic page
cardosofede May 21, 2024
5d8d435
(feat) add args to dist function
cardosofede May 21, 2024
c0d5e47
(feat) add pmm dynamic page
cardosofede May 21, 2024
358b69f
(feat) normalize spreads distribution graph
cardosofede May 21, 2024
811b84a
(feat) improve data collection
cardosofede May 23, 2024
b084a13
(feat) normalize pages
cardosofede May 23, 2024
fd3fbe1
(feat) fix inputs
cardosofede May 23, 2024
4fb2656
(feat) adapt notebooks
cardosofede May 23, 2024
ca110ae
(feat) improve naming
cardosofede May 23, 2024
779cfc9
(feat) minor changes
cardosofede May 23, 2024
cfe5ee4
(feat) add backend api features to get configs data
cardosofede May 25, 2024
91d02f3
(feat) refactor perfromance card
cardosofede May 25, 2024
0e2bfc0
(feat) adapt components to support defaults from session state
cardosofede May 25, 2024
775b116
(feat) refactor bollinger controller page
cardosofede May 25, 2024
1b578d4
(feat) refactor dman maker controller page
cardosofede May 25, 2024
bdf0be2
(feat) refactor macd bb controller page
cardosofede May 25, 2024
5468a16
(feat) refactor pmm dynamic controller page
cardosofede May 25, 2024
3cae3fe
(feat) refactor pmm simple controller page
cardosofede May 25, 2024
071c747
(feat) improve performance of instances page and add running forever
cardosofede May 25, 2024
75b4c8e
(feat) refactor supertrend v1
cardosofede May 25, 2024
3e5857b
(feat) improve conditions in performance card
cardosofede May 26, 2024
1a5ad0b
(feat) improve active instances page
cardosofede May 26, 2024
06ce36d
(feat) add error handling for active instances
cardosofede May 26, 2024
84a1081
(feat) update reamdes
cardosofede May 27, 2024
0918662
(feat) handle no executors or data available error
cardosofede May 28, 2024
85795ab
(feat) add realtime func
cardosofede May 28, 2024
db06a46
(feat) remove position builder
cardosofede May 28, 2024
fa6ca0e
(feat) adapt components to backend api methods
cardosofede May 29, 2024
7012933
(feat) add methods in backend api client to manage credentials
cardosofede May 29, 2024
491d54a
(feat) add credentials page
cardosofede May 29, 2024
60578d1
(feat) add portfolio page
cardosofede May 29, 2024
e35244f
(feat) include new pages in main
cardosofede May 29, 2024
4e89571
(feat) handle empty processed data
cardosofede May 30, 2024
6fb923c
(feat) adapt pages to time
cardosofede May 30, 2024
373a497
(feat) add credentials page
cardosofede May 30, 2024
38a2114
(feat) adapt visualizations to seconds
cardosofede May 30, 2024
925acc0
(feat) adapt labeling to seconds
cardosofede May 30, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .streamlit/config.toml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
[theme]
base="light"
base="dark"
font="monospace"
[server]
port=8501
Expand Down
10 changes: 10 additions & 0 deletions CONFIG.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,10 @@
import os

from dotenv import load_dotenv


load_dotenv()

MINER_COINS = ["Algorand", "Avalanche", "DAO Maker", "Faith Tribe", "Fear", "Frontier",
"Harmony", "Hot Cross", "HUMAN Protocol", "Oddz", "Shera", "Firo",
"Vesper Finance", "Youclout", "Nimiq"]
Expand All @@ -12,3 +19,6 @@
CERTIFIED_STRATEGIES = ["xemm", "cross exchange market making", "pmm", "pure market making"]

AUTH_SYSTEM_ENABLED = False

BACKEND_API_HOST = os.getenv("BACKEND_API_HOST", "127.0.0.1")
BACKEND_API_PORT = os.getenv("BACKEND_API_PORT", 8000)
7 changes: 0 additions & 7 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -39,18 +39,11 @@ ENV COMMIT_SHA=${COMMIT}
ENV COMMIT_BRANCH=${BRANCH}
ENV BUILD_DATE=${DATE}

ENV INSTALLATION_TYPE=docker

# Install system dependencies
RUN apt-get update && \
apt-get install -y curl && \
rm -rf /var/lib/apt/lists/*

# Install Docker CLI
RUN curl -fsSL https://get.docker.com -o get-docker.sh && \
sh get-docker.sh && \
rm get-docker.sh

# Create mount points
RUN mkdir -p /home/dashboard/data

Expand Down
10 changes: 5 additions & 5 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@
.ONESHELL:
.PHONY: run
.PHONY: conda_remove
.PHONY: conda_create
.PHONY: uninstall
.PHONY: install

run:
streamlit run main.py

env_remove:
uninstall:
conda env remove -n dashboard

env_create:
install:
conda env create -f environment_conda.yml

docker_build:
docker build -t dashboard:latest .
docker build -t hummingbot/dashboard:latest .

docker_run:
docker run -p 8501:8501 dashboard:latest
File renamed without changes.
File renamed without changes.
281 changes: 281 additions & 0 deletions backend/services/backend_api_client.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,281 @@
import pandas as pd
import requests
from hummingbot.strategy_v2.models.executors_info import ExecutorInfo


class BackendAPIClient:
"""
This class is a client to interact with the backend API. The Backend API is a REST API that provides endpoints to
create new Hummingbot instances, start and stop them, add new script and controller config files, and get the status
of the active bots.
"""
_shared_instance = None

@classmethod
def get_instance(cls, *args, **kwargs) -> "MarketsRecorder":
if cls._shared_instance is None:
cls._shared_instance = BackendAPIClient(*args, **kwargs)
return cls._shared_instance

def __init__(self, host: str = "localhost", port: int = 8000):
self.host = host
self.port = port
self.base_url = f"http://{self.host}:{self.port}"

def is_docker_running(self):
"""Check if Docker is running."""
url = f"{self.base_url}/is-docker-running"
response = requests.get(url)
return response.json()

def pull_image(self, image_name: str):
"""Pull a Docker image."""
url = f"{self.base_url}/pull-image/"
payload = {"image_name": image_name}
response = requests.post(url, json=payload)
return response.json()

def list_available_images(self, image_name: str):
"""List available images by name."""
url = f"{self.base_url}/available-images/{image_name}"
response = requests.get(url)
return response.json()

def list_active_containers(self):
"""List all active containers."""
url = f"{self.base_url}/active-containers"
response = requests.get(url)
return response.json()

def list_exited_containers(self):
"""List all exited containers."""
url = f"{self.base_url}/exited-containers"
response = requests.get(url)
return response.json()

def clean_exited_containers(self):
"""Clean up exited containers."""
url = f"{self.base_url}/clean-exited-containers"
response = requests.post(url)
return response.json()

def remove_container(self, container_name: str, archive_locally: bool = True, s3_bucket: str = None):
"""Remove a specific container."""
url = f"{self.base_url}/remove-container/{container_name}"
params = {"archive_locally": archive_locally}
if s3_bucket:
params["s3_bucket"] = s3_bucket
response = requests.post(url, params=params)
return response.json()

def stop_container(self, container_name: str):
"""Stop a specific container."""
url = f"{self.base_url}/stop-container/{container_name}"
response = requests.post(url)
return response.json()

def start_container(self, container_name: str):
"""Start a specific container."""
url = f"{self.base_url}/start-container/{container_name}"
response = requests.post(url)
return response.json()

def create_hummingbot_instance(self, instance_config: dict):
"""Create a new Hummingbot instance."""
url = f"{self.base_url}/create-hummingbot-instance"
response = requests.post(url, json=instance_config)
return response.json()

def start_bot(self, start_bot_config: dict):
"""Start a Hummingbot bot."""
url = f"{self.base_url}/start-bot"
response = requests.post(url, json=start_bot_config)
return response.json()

def stop_bot(self, bot_name: str, skip_order_cancellation: bool = False, async_backend: bool = True):
"""Stop a Hummingbot bot."""
url = f"{self.base_url}/stop-bot"
response = requests.post(url, json={"bot_name": bot_name, "skip_order_cancellation": skip_order_cancellation, "async_backend": async_backend})
return response.json()

def import_strategy(self, strategy_config: dict):
"""Import a trading strategy to a bot."""
url = f"{self.base_url}/import-strategy"
response = requests.post(url, json=strategy_config)
return response.json()

def get_bot_status(self, bot_name: str):
"""Get the status of a bot."""
url = f"{self.base_url}/get-bot-status/{bot_name}"
response = requests.get(url)
if response.status_code == 200:
return response.json()
else:
return {"status": "error", "data": "Bot not found"}

def get_bot_history(self, bot_name: str):
"""Get the historical data of a bot."""
url = f"{self.base_url}/get-bot-history/{bot_name}"
response = requests.get(url)
return response.json()

def get_active_bots_status(self):
"""
Retrieve the cached status of all active bots.
Returns a JSON response with the status and data of active bots.
"""
url = f"{self.base_url}/get-active-bots-status"
response = requests.get(url)
if response.status_code == 200:
return response.json() # Successful request
else:
return {"status": "error", "data": "No active bots found"}

def get_all_controllers_config(self):
"""Get all controller configurations."""
url = f"{self.base_url}/all-controller-configs"
response = requests.get(url)
return response.json()

def get_available_images(self, image_name: str = "hummingbot"):
"""Get available images."""
url = f"{self.base_url}/available-images/{image_name}"
response = requests.get(url)
return response.json()["available_images"]

def add_script_config(self, script_config: dict):
"""Add a new script configuration."""
url = f"{self.base_url}/add-script-config"
response = requests.post(url, json=script_config)
return response.json()

def add_controller_config(self, controller_config: dict):
"""Add a new controller configuration."""
url = f"{self.base_url}/add-controller-config"
config = {
"name": controller_config["id"],
"content": controller_config
}
response = requests.post(url, json=config)
return response.json()

def get_real_time_candles(self, connector: str, trading_pair: str, interval: str, max_records: int):
"""Get candles data."""
url = f"{self.base_url}/real-time-candles"
payload = {
"connector": connector,
"trading_pair": trading_pair,
"interval": interval,
"max_records": max_records
}
response = requests.post(url, json=payload)
return response.json()

def get_historical_candles(self, connector: str, trading_pair: str, interval: str, start_time: int, end_time: int):
"""Get historical candles data."""
url = f"{self.base_url}/historical-candles"
payload = {
"connector": connector,
"trading_pair": trading_pair,
"interval": interval,
"start_time": start_time,
"end_time": end_time
}
response = requests.post(url, json=payload)
return response.json()

def run_backtesting(self, start_time: int, end_time: int, backtesting_resolution: str, trade_cost: float, config: dict):
"""Run backtesting."""
url = f"{self.base_url}/run-backtesting"
payload = {
"start_time": start_time,
"end_time": end_time,
"backtesting_resolution": backtesting_resolution,
"trade_cost": trade_cost,
"config": config
}
response = requests.post(url, json=payload)
backtesting_results = response.json()
if "processed_data" not in backtesting_results:
data = None
else:
data = pd.DataFrame(backtesting_results["processed_data"])
return {
"processed_data": data,
"executors": [ExecutorInfo(**executor) for executor in backtesting_results["executors"]],
"results": backtesting_results["results"]
}

def get_all_configs_from_bot(self, bot_name: str):
"""Get all configurations from a bot."""
url = f"{self.base_url}/all-controller-configs/bot/{bot_name}"
response = requests.get(url)
return response.json()

def stop_controller_from_bot(self, bot_name: str, controller_id: str):
"""Stop a controller from a bot."""
config = {"manual_kill_switch": True}
url = f"{self.base_url}/update-controller-config/bot/{bot_name}/{controller_id}"
response = requests.post(url, json=config)
return response.json()

def start_controller_from_bot(self, bot_name: str, controller_id: str):
"""Start a controller from a bot."""
config = {"manual_kill_switch": False}
url = f"{self.base_url}/update-controller-config/bot/{bot_name}/{controller_id}"
response = requests.post(url, json=config)
return response.json()

def get_connector_config_map(self, connector_name: str):
"""Get connector configuration map."""
url = f"{self.base_url}/connector-config-map/{connector_name}"
response = requests.get(url)
return response.json()

def get_all_connectors_config_map(self):
"""Get all connector configuration maps."""
url = f"{self.base_url}/all-connectors-config-map"
response = requests.get(url)
return response.json()

def add_account(self, account_name: str):
"""Add a new account."""
url = f"{self.base_url}/add-account"
response = requests.post(url, params={"account_name": account_name})
return response.json()

def delete_account(self, account_name: str):
"""Delete an account."""
url = f"{self.base_url}/delete-account/"
response = requests.post(url, params={"account_name": account_name})
return response.json()

def delete_credential(self, account_name: str, connector_name: str):
"""Delete credentials."""
url = f"{self.base_url}/delete-credential/{account_name}/{connector_name}"
response = requests.post(url)
return response.json()

def add_connector_keys(self, account_name: str, connector_name: str, connector_config: dict):
"""Add connector keys."""
url = f"{self.base_url}/add-connector-keys/{account_name}/{connector_name}"
response = requests.post(url, json=connector_config)
return response.json()

def get_accounts(self):
"""Get available credentials."""
url = f"{self.base_url}/list-accounts"
response = requests.get(url)
return response.json()

def get_credentials(self, account_name: str):
"""Get available credentials."""
url = f"{self.base_url}/list-credentials/{account_name}"
response = requests.get(url)
return response.json()

def get_all_balances(self):
"""Get all balances."""
url = f"{self.base_url}/get-all-balances"
response = requests.get(url)
return response.json()
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
import re


class CoinGeckoUtils:
class CoinGeckoClient:
def __init__(self):
self.connector = CoinGeckoAPI()

Expand Down
2 changes: 1 addition & 1 deletion utils/miner_utils.py → backend/services/miner_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
from glom import *


class MinerUtils:
class MinerClient:
MARKETS_ENDPOINT = "https://api.hummingbot.io/bounty/markets"

@staticmethod
Expand Down
File renamed without changes.
12 changes: 6 additions & 6 deletions utils/file_templates.py → backend/utils/file_templates.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,9 @@ def directional_trading_controller_template(strategy_cls_name: str) -> str:
import pandas as pd
from pydantic import Field

from hummingbot.smart_components.executors.position_executor.position_executor import PositionExecutor
from hummingbot.smart_components.strategy_frameworks.data_types import OrderLevel
from hummingbot.smart_components.strategy_frameworks.directional_trading.directional_trading_controller_base import (
from hummingbot.strategy_v2.executors.position_executor.position_executor import PositionExecutor
from hummingbot.strategy_v2.strategy_frameworks.data_types import OrderLevel
from hummingbot.strategy_v2.strategy_frameworks.directional_trading.directional_trading_controller_base import (
DirectionalTradingControllerBase,
DirectionalTradingControllerConfigBase,
)
Expand Down Expand Up @@ -100,9 +100,9 @@ def strategy_optimization_template(strategy_info: dict):

from hummingbot.core.data_type.common import PositionMode, TradeType, OrderType
from hummingbot.data_feed.candles_feed.candles_factory import CandlesConfig
from hummingbot.smart_components.strategy_frameworks.data_types import TripleBarrierConf, OrderLevel
from hummingbot.smart_components.strategy_frameworks.directional_trading import DirectionalTradingBacktestingEngine
from hummingbot.smart_components.utils.config_encoder_decoder import ConfigEncoderDecoder
from hummingbot.strategy_v2.strategy_frameworks.data_types import TripleBarrierConf, OrderLevel
from hummingbot.strategy_v2.strategy_frameworks.directional_trading import DirectionalTradingBacktestingEngine
from hummingbot.strategy_v2.utils.config_encoder_decoder import ConfigEncoderDecoder
from optuna import TrialPruned

from quants_lab.controllers.{strategy_module} import {strategy_cls.__name__}, {strategy_config.__name__}
Expand Down
Loading
Loading