{"record":{"id":"69dfa9d39ae70982","repo":"nautechsystems/nautilus_trader","slug":"chart-name-not-found-suggestion-text-availab","errorCode":null,"errorMessage":"Chart '{name}' not found.{suggestion_text} Available charts: {available}. Register custom charts with register_chart().","messagePattern":"Chart '(.+?)' not found\\.(.+?) Available charts: (.+?)\\. Register custom charts with register_chart\\(\\)\\.","errorType":"exception","errorClass":"KeyError","httpStatus":null,"severity":"error","filePath":"python/nautilus_trader/analysis/tearsheet.py","lineNumber":329,"sourceCode":"    -------\n    Callable\n        The chart function.\n\n    Raises\n    ------\n    KeyError\n        If the chart name is not registered.\n\n    \"\"\"\n    _require_not_none(name, \"name\")\n\n    if name not in _CHART_REGISTRY:\n        available = \", \".join(_CHART_REGISTRY.keys())\n\n        suggestions = get_close_matches(name, _CHART_REGISTRY.keys(), n=3, cutoff=0.6)\n        suggestion_text = f\" Did you mean: {', '.join(suggestions)}?\" if suggestions else \"\"\n\n        raise KeyError(\n            f\"Chart '{name}' not found.{suggestion_text} \"\n            f\"Available charts: {available}. \"\n            f\"Register custom charts with register_chart().\",\n        )\n\n    return _CHART_REGISTRY[name]\n\n\ndef list_charts() -> list[str]:\n    \"\"\"\n    List all registered chart names.\n\n    Returns\n    -------\n    list[str]\n        List of available chart names.\n\n    \"\"\"","sourceCodeStart":311,"sourceCodeEnd":347,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/a4b06ed870971b5671d12754ea138a3ab99b1dec/python/nautilus_trader/analysis/tearsheet.py#L311-L347","documentation":"BetfairExecutionClientConfig::validate() rejects request_rate_per_second == 0 for the live execution client. This field throttles general Betting API requests from the execution client (market references, cancellations by market, etc.); zero would deadlock the limiter, so validation fails fast. The exec config validate() runs the same currency parse first, then both rate checks.","triggerScenarios":"Building a live execution client config with request_rate_per_second set to 0; deserializing a JSON/YAML exec config where the field is 0; calling validate() or constructing the execution client factory with that config.","commonSituations":"Assuming 0 disables the limiter; config templates defaulting numerics to 0; porting a paper-trading config to live with placeholder zeros left in place.","solutions":["Set a positive request rate within your app key's transaction limits","Omit the field to use the default","Validate the exec config in CI/deployment scripts before going live"],"exampleFix":"// before\nBetfairExecutionClientConfig::builder().request_rate_per_second(0)\n\n// after\nBetfairExecutionClientConfig::builder().request_rate_per_second(5)","handlingStrategy":"validation","validationCode":"let config = BetfairExecutionClientConfig::builder()\n    .request_rate_per_second(5)\n    .build()?;\nconfig.validate()?;","typeGuard":"fn is_positive_rate(v: u32) -> bool {\n    v > 0\n}","tryCatchPattern":null,"preventionTips":["Audit exec configs for placeholder zeros before going live","Run validate() as a deployment gate for live trading nodes","Document the rate fields' units and valid ranges in your config templates"],"tags":["betfair","config","rate-limit","live-trading","validation","rust"],"backgroundTag":"invalid-rate-limit-config","analyzedSha":"a4b06ed870971b5671d12754ea138a3ab99b1dec","analyzedAt":"2026-08-16T22:54:50.089Z","schemaVersion":2},"datasetVersion":"2026-08-16T23:17:17.608Z"}