```plantuml class "BrighterTrades" { + config + data_cache + strategies + backtester + exchange_interface + ws_sockets -- + __init__(config_file) + load_config(config_file) + save_config() + initialize_data_cache() + initialize_indicators() + initialize_strategies() + initialize_backtester() + initialize_candles() + initialize_signals() + initialize_trades() + initialize_exchange_interface() + initialize_users() + get_config() + get_data_cache() + get_indicators() + get_strategies() + get_backtester() + get_candles() + get_signals() + get_trades() + get_exchange_interface() + get_users() + get_ws_sockets() + run() } class "app" { + "index()" + "ws(socket_conn)" + "settings()" + "history()" + "signup()" + "signout()" + "login()" + "signup_submit()" + "indicator_init()" } class "Flask" { + "render_template()" } "app" --> "index()" : "index()" "app" --> "ws(socket_conn)" : "ws(socket_conn)" "app" --> "settings()" : "settings()" "app" --> "history()" : "history()" "app" --> "signup()" : "signup()" "app" --> "signout()" : "signout()" "app"--> "login()" : "login()" "app" --> "signup_submit()" : "signup_submit()" "app" --> "indicator_init()" : "indicator_init()" "signup_submit()" --> "BrighterTrades" : "create_new_user()" "history()" --> "BrighterTrades" : get_user_info() "history()" --> "BrighterTrades" : get_market_info() "signout()" --> "BrighterTrades" : log_user_in_out() "login()" --> "BrighterTrades" : log_user_in_out() "indicator_init()" --> "BrighterTrades": "get_user_info()" "indicator_init()" --> "BrighterTrades": "get_indicator_data()" "settings()" --> "BrighterTrades" : "adjust_setting()" "settings()" --> "BrighterTrades" : "get_user_info()" "signup()" --> "Flask" : render_template() "index()" --> "Flask" : render_template() "index()" --> "BrighterTrades" : connect_user_to_exchange() "index()" --> "BrighterTrades" : get_rendered_data() "index()" --> "BrighterTrades" : get_js_init_data() "ws(socket_conn)" --> "BrighterTrades" : process_incoming_message() "BrighterTrades" -- "DataCache" "BrighterTrades" -- "Strategies" "BrighterTrades" -- "Backtester" "BrighterTrades" -- "Candles" "BrighterTrades" -- "Configuration" "BrighterTrades" -- "ExchangeInterface" "BrighterTrades" -- "Indicators" "BrighterTrades" -- "Signals" "BrighterTrades" -- "Trades" "BrighterTrades" -- "Users" "BrighterTrades" -- "Database" "BrighterTrades" -- "SQLite" "BrighterTrades" -- "HDict" class "Users" { + data_cache } class "Configuration" { + exchanges + indicators + users + __init__(exchanges, indicators, users) + get_exchanges() + get_indicators() + get_users() + add_exchange(exchange) + remove_exchange(exchange) + add_indicator(indicator) + remove_indicator(indicator) + add_user(user) + remove_user(user) } class "Candles" { + __init__(exchanges, config_obj, database) + get_last_n_candles(num_candles, asset, timeframe, exchange, user_name) + set_new_candle(cdata) + set_cache(symbol=None, interval=None, exchange_name=None, user_name=None) + get_latestvalues(value_name, symbol, timeframe, exchange, user_name, num_record=1) + convert_candles(candles) + get_candle_history(num_records, symbol=None, interval=None, exchange_name=None, user_name=None) } class "DataCache" { + db + get_records_since(key, start_datetime, record_length, ex_details) + cache_exists(key) + update_candle_cache(more_records, key) + get_cached_candles(key) + set_cached_candles(candles, key) + clear_cache() + get_cache_info() + remove_expired_records() + remove_cache(key) + remove_all_caches() } class "Database" { + exchanges + __init__(exchanges) + execute_sql(sql) + get_item_where(item_name, table_name, filter_vals) + get_rows_where(table, filter_vals) + insert_dataframe(df, table) + insert_row(table, columns, values) + _table_exists(table_name) + _populate_table(table_name, start_time, ex_details, end_time=None) + _fetch_exchange_id(exchange_name) + _fetch_market_id(symbol, exchange_name) + _insert_candles_into_db(candlesticks, table_name, symbol, exchange_name) + get_records_since(table_name, st, et, rl, ex_details) + _get_records(table_name, st, et=None) + _fetch_candles_from_exchange(symbol, interval, exchange_name, user_name, start_datetime=None, end_datetime=None) + get_from_static_table(item, table, indexes, create_id=False) } class "ExchangeInterface" { + exchange_data + available_exchanges -- + __init__() + connect_exchange(exchange_name, user_name, api_keys=None) + add_exchange(user_name, _class, arg) + get_exchange(ename, uname) + get_connected_exchanges(user_name) + get_available_exchanges() + get_exchange_balances(name) + get_all_balances(name) + get_order(symbol, order_id, target, user_name) + get_trade_status(trade, user_name) + get_trade_executed_qty(trade, user_name) + get_trade_executed_price(trade, user_name) + get_price(symbol, price_source=None) } "Configuration" -- "Signals" "Configuration" -- "Indicators" "Configuration" -- "Users" "Candles" -- "DataCache" "Candles" -- "shared_utilities" "DataCache" -- "Database" "Database" -- "SQLite" "Database" -- "HDict" "ExchangeInterface" -- "ArrayList" "ExchangeInterface" -- "DataCache" @enduml ```