Skip to content

Chart Settings

Chart settings management for the dashboard.

Reads and writes per-run chart display settings from ~/.onesecondtrader/chart_settings.json.

SETTINGS_PATH = Path.home() / '.onesecondtrader' / 'chart_settings.json' module-attribute

VALID_STYLES = {'line', 'histogram', 'dots', 'dash1', 'dash2', 'dash3', 'background1', 'background2'} module-attribute

VALID_COLORS = {'black', 'red', 'blue', 'green', 'orange', 'purple', 'cyan', 'magenta', 'yellow', 'teal'} module-attribute

VALID_WIDTHS = {'thin', 'normal', 'thick', 'extra_thick'} module-attribute

DEFAULT_COLOR_CYCLE = ['blue', 'red', 'green', 'orange', 'purple', 'cyan', 'magenta', 'teal', 'black', 'yellow'] module-attribute

_GLOBAL_KEY = '__global__' module-attribute

_read_all()

Read the entire settings file, returning empty dict on failure.

Source code in src/onesecondtrader/dashboard/chart_settings.py
def _read_all() -> dict:
    """Read the entire settings file, returning empty dict on failure."""
    if not SETTINGS_PATH.exists():
        return {}
    try:
        return json.loads(SETTINGS_PATH.read_text(encoding="utf-8"))
    except (json.JSONDecodeError, OSError):
        return {}

_write_all(data)

Write the entire settings file, creating parent dirs as needed.

Source code in src/onesecondtrader/dashboard/chart_settings.py
def _write_all(data: dict) -> None:
    """Write the entire settings file, creating parent dirs as needed."""
    SETTINGS_PATH.parent.mkdir(parents=True, exist_ok=True)
    SETTINGS_PATH.write_text(json.dumps(data, indent=2), encoding="utf-8")

load_chart_settings(run_id)

Load chart settings for a run.

Returns:

Type Description
dict

Settings dict for the run, or empty dict if none exist.

Source code in src/onesecondtrader/dashboard/chart_settings.py
def load_chart_settings(run_id: str) -> dict:
    """
    Load chart settings for a run.

    Returns:
        Settings dict for the run, or empty dict if none exist.
    """
    all_settings = _read_all()
    return all_settings.get(run_id, {})

save_chart_settings(run_id, settings)

Save chart settings for a run.

Parameters:

Name Type Description Default
run_id str

Unique identifier of the backtest run.

required
settings dict

Chart settings dict to persist.

required
Source code in src/onesecondtrader/dashboard/chart_settings.py
def save_chart_settings(run_id: str, settings: dict) -> None:
    """
    Save chart settings for a run.

    Parameters:
        run_id:
            Unique identifier of the backtest run.
        settings:
            Chart settings dict to persist.
    """
    all_settings = _read_all()
    all_settings[run_id] = settings
    _write_all(all_settings)

ensure_indicator_defaults_table()

Source code in src/onesecondtrader/dashboard/chart_settings.py
def ensure_indicator_defaults_table() -> None:
    with connect_presets() as conn:
        conn.execute(
            "CREATE TABLE IF NOT EXISTS indicator_defaults "
            "(name TEXT PRIMARY KEY, config TEXT NOT NULL)"
        )
        conn.commit()

load_indicator_defaults()

Source code in src/onesecondtrader/dashboard/chart_settings.py
def load_indicator_defaults() -> dict:
    with connect_presets() as conn:
        cursor = conn.cursor()
        cursor.execute("SELECT name, config FROM indicator_defaults")
        rows = cursor.fetchall()
    result: dict = {"indicators": {}}
    for name, config_json in rows:
        cfg = json.loads(config_json)
        if name == _GLOBAL_KEY:
            result.update(cfg)
        else:
            result["indicators"][name] = cfg
    return result

save_indicator_default(name, settings)

Source code in src/onesecondtrader/dashboard/chart_settings.py
def save_indicator_default(name: str, settings: dict) -> None:
    with connect_presets() as conn:
        conn.execute(
            "INSERT OR REPLACE INTO indicator_defaults (name, config) VALUES (?, ?)",
            (name, json.dumps(settings)),
        )
        conn.commit()

save_global_defaults(chart_type=None, overlap=None)

Source code in src/onesecondtrader/dashboard/chart_settings.py
def save_global_defaults(
    chart_type: str | None = None, overlap: int | None = None
) -> None:
    with connect_presets() as conn:
        cursor = conn.cursor()
        cursor.execute(
            "SELECT config FROM indicator_defaults WHERE name = ?", (_GLOBAL_KEY,)
        )
        row = cursor.fetchone()
        data = json.loads(row[0]) if row else {}
        if chart_type is not None:
            data["chart_type"] = chart_type
        if overlap is not None:
            data["overlap"] = overlap
        conn.execute(
            "INSERT OR REPLACE INTO indicator_defaults (name, config) VALUES (?, ?)",
            (_GLOBAL_KEY, json.dumps(data)),
        )
        conn.commit()