{"record":{"id":"bb3a930c57e11310","repo":"nautechsystems/nautilus_trader","slug":"peg-offset-value-requires-peg-price-type","errorCode":null,"errorMessage":"`peg_offset_value` requires `peg_price_type`","messagePattern":"`peg_offset_value` requires `peg_price_type`","errorType":"validation","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/adapters/bitmex/src/execution.rs","lineNumber":1310,"sourceCode":"    peg_offset_value: Option<f64>,\n) -> anyhow::Result<()> {\n    BitmexOrderType::try_from_order_type(order.order_type())?;\n    BitmexTimeInForce::try_from_time_in_force(order.time_in_force())?;\n\n    let is_trailing_stop = matches!(\n        order.order_type(),\n        OrderType::TrailingStopMarket | OrderType::TrailingStopLimit\n    );\n\n    if is_trailing_stop\n        && let Some(offset_type) = order.trailing_offset_type()\n        && offset_type != TrailingOffsetType::Price\n    {\n        anyhow::bail!(\"BitMEX only supports PRICE trailing offset type, was {offset_type:?}\");\n    }\n\n    if peg_price_type.is_none() && peg_offset_value.is_some() {\n        anyhow::bail!(\"`peg_offset_value` requires `peg_price_type`\");\n    }\n\n    if peg_price_type.is_some() && order.order_type() != OrderType::Limit {\n        let order_type = order.order_type();\n        anyhow::bail!(\"Pegged orders only supported for LIMIT order type, was {order_type:?}\");\n    }\n\n    if let Some(contingency_type) = order.contingency_type() {\n        BitmexContingencyType::try_from(contingency_type)?;\n    }\n\n    Ok(())\n}\n\nfn is_definitive_bitmex_submit_rejection(err: &anyhow::Error) -> bool {\n    if is_bitmex_duplicate_clordid_submit_failure(err) {\n        return false;\n    }","sourceCodeStart":1292,"sourceCodeEnd":1328,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/bitmex/src/execution.rs#L1292-L1328","documentation":"BitMEX order validation rejects a submit that supplies `peg_offset_value` without also specifying `peg_price_type`. BitMEX pegged orders are defined by a peg reference price type; an offset alone is meaningless to the venue. validate_order_for_bitmex_submit bails early so the malformed order is never sent.","triggerScenarios":"Calling validate_order_for_bitmex_submit (directly or via submit_cached_order) with Some(peg_offset_value) but peg_price_type=None.","commonSituations":"Strategy code sets only a peg offset for a pegged-to-BBO limit order and forgets the peg type; refactoring drops the peg_price_type field from order parameters.","solutions":["Set peg_price_type (e.g. BitmexPegPriceType::PrimaryPeg or TrailingStopPeg) whenever peg_offset_value is provided","If no peg is intended, clear peg_offset_value as well","Check the order factory/config so both peg fields are populated together"],"exampleFix":"// before\n.with_peg_offset_value(Decimal::from(1))\n// after\n.with_peg_price_type(BitmexPegPriceType::PrimaryPeg)\n.with_peg_offset_value(Decimal::from(1))","handlingStrategy":"validation","validationCode":"if peg_offset_value.is_some() && peg_price_type.is_none() {\n    return Err(anyhow::anyhow!(\"peg_offset_value requires peg_price_type\"));\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always set peg_price_type and peg_offset_value as a pair","Validate peg parameters in the order factory before submit","Write a unit test mirroring the adapter's validation"],"tags":["rust","bitmex","validation","pegged-orders"],"backgroundTag":"missing-required-argument","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"}