{"record":{"id":"b4d4699bba135dad","repo":"nautechsystems/nautilus_trader","slug":"deribit-does-not-support-resolution-resolution","errorCode":null,"errorMessage":"Deribit does not support resolution '{resolution}'. Supported: {supported_resolutions:?}","messagePattern":"Deribit does not support resolution '(.+?)'\\. Supported: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/adapters/deribit/src/http/client.rs","lineNumber":1405,"sourceCode":"        }\n\n        // Convert BarType to Deribit resolution\n        let spec = bar_type.spec();\n        let step = spec.step.get();\n        let resolution = match spec.aggregation {\n            BarAggregation::Minute => format!(\"{step}\"),\n            BarAggregation::Hour => format!(\"{}\", step * 60),\n            BarAggregation::Day => \"1D\".to_string(),\n            a => anyhow::bail!(\"Deribit does not support {a:?} aggregation\"),\n        };\n\n        // Validate resolution is supported by Deribit\n        let supported_resolutions = [\n            \"1\", \"3\", \"5\", \"10\", \"15\", \"30\", \"60\", \"120\", \"180\", \"360\", \"720\", \"1D\",\n        ];\n\n        if !supported_resolutions.contains(&resolution.as_str()) {\n            anyhow::bail!(\n                \"Deribit does not support resolution '{resolution}'. Supported: {supported_resolutions:?}\"\n            );\n        }\n\n        let instrument_id = bar_type.instrument_id();\n        let (price_precision, size_precision, use_cost_for_volume) =\n            if let Some(instrument) = self.get_instrument(&instrument_id.symbol.inner()) {\n                (\n                    instrument.price_precision(),\n                    instrument.size_precision(),\n                    use_cost_for_bar_volume(&instrument),\n                )\n            } else {\n                log::warn!(\"Instrument {instrument_id} not in cache, skipping bars request\");\n                return Err(InstrumentLookupError::not_found(instrument_id).into());\n            };\n\n        let instrument_name = instrument_id.symbol.to_string();","sourceCodeStart":1387,"sourceCodeEnd":1423,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/deribit/src/http/client.rs#L1387-L1423","documentation":"After mapping an aggregation to a resolution string, request_bars validates it against Deribit's supported resolution list (1,3,5,10,15,30,60,120,180,360,720 minutes and 1D). Steps that compose to a resolution outside this list (e.g. Hour(5) -> '300') bail with the unsupported resolution and the full supported list.","triggerScenarios":"Requesting bars whose computed resolution is not in Deribit's set — e.g. Minute(2) -> '2', Minute(4) -> '4', Hour(5) -> '300', Day(2) -> '2D' (Day is hardcoded to '1D').","commonSituations":"Assuming arbitrary minute steps are supported; multi-day bars expecting '2D' style resolutions; generic bar-spec configs reused from other exchanges with finer granularity.","solutions":["Restrict bar specs to Deribit-supported resolutions: 1,3,5,10,15,30,60,120,180,360,720 minutes or 1D","Use multiple 1D requests for multi-day history instead of a 2D+ resolution","Validate the computed resolution against the supported list before calling request_bars"],"exampleFix":"// before\nlet bar_type = BarType::new(instrument_id, BarAggregation::Minute(2).into(), PriceType::Last);\nlet bars = client.request_bars(bar_type).await?; // resolution '2' unsupported\n// after\nconst SUPPORTED: [&str; 12] = [\"1\",\"3\",\"5\",\"10\",\"15\",\"30\",\"60\",\"120\",\"180\",\"360\",\"720\",\"1D\"];\nlet spec = bar_type.spec();\nlet resolution = match spec.aggregation {\n    BarAggregation::Minute(s) => s.get().to_string(),\n    BarAggregation::Hour(s) => (s.get() * 60).to_string(),\n    BarAggregation::Day(_) => \"1D\".to_string(),\n    _ => return Err(anyhow!(\"unsupported aggregation\")),\n};\nassert!(SUPPORTED.contains(&resolution.as_str()), \"unsupported resolution {resolution}\");","handlingStrategy":"validation","validationCode":"const SUPPORTED: [&str; 12] = [\"1\",\"3\",\"5\",\"10\",\"15\",\"30\",\"60\",\"120\",\"180\",\"360\",\"720\",\"1D\"];\nlet resolution = match bar_type.spec().aggregation {\n    BarAggregation::Minute(s) => s.get().to_string(),\n    BarAggregation::Hour(s) => (s.get() * 60).to_string(),\n    BarAggregation::Day(_) => \"1D\".to_string(),\n    _ => String::new(),\n};\nassert!(SUPPORTED.contains(&resolution.as_str()), \"unsupported resolution: {resolution}\");","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Keep a static list of Deribit-supported resolutions in config validation","Avoid arbitrary minute steps; use 1,3,5,10,15,30,60,120,180,360,720 or 1D only","For multi-day history, paginate 1D requests instead of multi-day resolutions"],"tags":["bars","deribit","resolution","validation"],"backgroundTag":"invalid-argument-value","analyzedSha":"18893faf8b356be3320add8de2f861b0b647cf06","analyzedAt":"2026-09-08T20:49:34.690Z","contentChangedAt":"2026-09-08T20:49:34.690Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}