def trading_rule_import_callback()

in src/backend/entrypoints/streamlit_frontend/state.py [0:0]


def trading_rule_import_callback(trading_rule):
    keycloak_session = st.session_state.keycloak_session
    st.session_state.clear()
    st.session_state["log"] = []
    set_default_state()
    st.session_state.keycloak_session = keycloak_session

    periodicity = trading_rule["interval"]

    fetch_data_range = trading_rule["time_period"]

    for data_periodicity_index, periodicity_key in enumerate(DATA_PERIODICITIES_NAMES_TO_VALUES.keys()):
        if periodicity_key == periodicity:
            break

    for fetch_data_range_index, range_key in enumerate(DATA_TIME_RANGES_NAMES_TO_VALUES.keys()):
        if range_key == fetch_data_range:
            break

    provider = DATA_PROVIDERS_NAMES_TO_BACKEND_KEY.get(trading_rule["data_provider"], "")

    if not provider:
        provider = trading_rule["data_provider"] if trading_rule["data_provider"] is not None else ""

    st.session_state["tradable_symbols_prompt"] = trading_rule["tradable_symbols_prompt"]
    st.session_state["supplementary_symbols_prompt"] = trading_rule["supplementary_symbols_prompt"]
    st.session_state["data_periodicity_index"] = data_periodicity_index
    st.session_state["fetch_data_range_index"] = fetch_data_range_index

    if isinstance(fetch_data_range, str):
        fetch_data_range = string_to_ms(fetch_data_range)
        st.session_state["time_period"] = fetch_data_range
    else:
        st.session_state["time_period"] = fetch_data_range

    datasets_keys = trading_rule.get("datasets_keys", None)
    if datasets_keys is None:
        datasets_keys = ["split_adj_prices"]

    if "Prices" in datasets_keys:
        price_index = datasets_keys.index("Prices")
        datasets_keys[price_index] = "split_adj_prices"

    st.session_state["datasets_multiselect"] = [
        dataset.DATASET_NAME for dataset_key, dataset in datasets.items() if dataset_key in datasets_keys
    ]
    st.session_state["datasets_keys"] = datasets_keys

    if isinstance(periodicity, str):
        periodicity = DATA_PERIODICITIES_VALUES_TO_BACKEND_KEY[periodicity]
        st.session_state["interval"] = periodicity
    else:
        st.session_state["interval"] = periodicity

    st.session_state["provider"] = data_providers[provider].PROVIDER_NAME
    st.session_state["data_provider"] = provider

    # Call symbol step to restore fields that are not presented in the alert json
    clear_fundamentals()
    request_timestamp, fetched_symbols_meta, synth_formulas = symbol_step(st.session_state)
    st.session_state.application_flow.add_fetch_into_operation()
    fetched_data = "\n\n".join(fetched_symbols_meta)
    calculated_synthetics = "\n\n".join(
        f"`{synth_name} = {synth_formula}`" for synth_name, synth_formula in synth_formulas.items()
    )
    data_source = [
        i for i in DATA_PROVIDERS_NAMES_TO_BACKEND_KEY if DATA_PROVIDERS_NAMES_TO_BACKEND_KEY[i] == st.session_state.data_provider
    ][0]
    calculated_synthetics_logs = f"Calculated synthetics:\n\n {calculated_synthetics}" if calculated_synthetics else ""
    fetched_data_logs = f"**Fetched from {DATA_PROVIDERS_NAMES_TO_BACKEND_KEY[data_source]} (periodicity: {st.session_state.interval}, time range: {st.session_state.time_period}) at {request_timestamp}**: \n {fetched_data}"
    define_useful_strings(st.session_state)
    define_empty_indicators_step(st.session_state)

    append_log(fetched_data_logs)
    if calculated_synthetics_logs:
        append_log(calculated_synthetics_logs)
    # Call indicator step to restore fields that are not presented in the alert json
    indicators_dialogue = trading_rule["indicators_dialogue"]

    if len(indicators_dialogue) == 1 and indicators_dialogue[0] == "":
        indicators_dialogue = []

    st.session_state["indicators_dialogue"] = indicators_dialogue

    if (
        len(indicators_dialogue) == 1
        and trading_rule["indicators_logic"] is not None
        and "```python" in trading_rule["indicators_logic"]
    ):
        st.session_state["indicators_dialogue"].append(trading_rule["indicators_logic"])

    if indicators_dialogue != [] and any(indicators_dialogue):
        try:
            indicator_step(st.session_state)
            ind_code_block, _ = get_code_sections(st.session_state["indicators_dialogue"][-1])
            st.session_state.application_flow.clear_backtesting_run()
            st.session_state.application_flow.add_indicators_run_into_operation()
            st.session_state.application_flow.set_prev_code(ind_code_block)
        except Exception as e:
            st.session_state.indicator_error = repr(e)

    st.session_state["trading_rule_title"] = trading_rule["title"]
    st.session_state["actual_currency"] = trading_rule["actual_currency"]
    st.session_state["bet_size"] = int(trading_rule["bet_size"])
    st.session_state["total_gross_limit"] = int(trading_rule["total_gross_limit"])
    st.session_state["per_instrument_gross_limit"] = int(trading_rule["per_instrument_gross_limit"])
    st.session_state["nop_limit"] = int(trading_rule["nop_limit"])
    st.session_state["use_dividends_trading"] = trading_rule.get("use_dividends_trading", False)
    st.session_state["execution_cost_bps"] = float(trading_rule.get("execution_cost_bps", 0.0))
    st.session_state["fill_trade_price"] = trading_rule.get("fill_trade_price", None)