{"record":{"id":"2c5e01820de9a2c9","repo":"HKUDS/Vibe-Trading","slug":"binance-usd-m-isolated-position-requires-positive","errorCode":null,"errorMessage":"Binance USD-M isolated position requires positive isolated margin","messagePattern":"Binance USD-M isolated position requires positive isolated margin","errorType":"exception","errorClass":"UsdMObservationError","httpStatus":null,"severity":"error","filePath":"agent/src/trading/connectors/binance/usdm.py","lineNumber":206,"sourceCode":"            (\"unrealizedProfit\", \"unRealizedProfit\"),\n        ):\n            if not close_enough(\n                _number(account_row.get(account_field), account_field),\n                _number(risk_row.get(risk_field), risk_field),\n            ):\n                raise UsdMObservationError(\"Binance USD-M position reads are incoherent\")\n        if str(risk_row.get(\"marginAsset\") or \"\").upper() != \"USDT\":\n            raise UsdMObservationError(\"Binance USD-M Shadow Account supports USDT collateral only\")\n        isolated = account_row.get(\"isolated\")\n        if not isinstance(isolated, bool):\n            raise UsdMObservationError(\"Binance USD-M margin mode is missing\")\n        isolated_margin = _number(\n            risk_row.get(\"isolatedMargin\"),\n            \"isolatedMargin\",\n            non_negative=True,\n        )\n        if isolated and isolated_margin == 0:\n            raise UsdMObservationError(\"Binance USD-M isolated position requires positive isolated margin\")\n        if not isolated and isolated_margin != 0:\n            raise UsdMObservationError(\"Binance USD-M cross position must report zero isolated margin\")\n        result.append(\n            {\n                \"symbol\": _canonical_symbol(raw_symbol),\n                \"quantity\": quantity,\n                \"entry_price\": entry_price,\n                \"leverage\": _number(account_row.get(\"leverage\"), \"leverage\", positive=True),\n                \"margin_mode\": \"isolated\" if isolated else \"cross\",\n                \"isolated_margin\": isolated_margin if isolated else None,\n                \"unrealized_pnl\": _number(risk_row.get(\"unRealizedProfit\"), \"unRealizedProfit\"),\n                \"initial_margin\": _number(\n                    risk_row.get(\"positionInitialMargin\"),\n                    \"positionInitialMargin\",\n                    non_negative=True,\n                ),\n                \"maintenance_margin\": _number(risk_row.get(\"maintMargin\"), \"maintMargin\", non_negative=True),\n                \"update_time\": _integer(risk_row.get(\"updateTime\"), \"updateTime\"),","sourceCodeStart":188,"sourceCodeEnd":224,"githubUrl":"https://github.com/HKUDS/Vibe-Trading/blob/80ffdda44c5c4db0dd84d70e051cca591cea67df/agent/src/trading/connectors/binance/usdm.py#L188-L224","documentation":"A position flagged isolated=true must have isolatedMargin > 0 on the position-risk row. An isolated position with zero isolated margin is contradictory (margin would have been liquidated or the row is stale/wrong) so the library refuses it.","triggerScenarios":"Observing an isolated position at the exact moment its margin was fully consumed (liquidation in progress), a margin-call/settlement mid-flight, or stale positionRisk data after manually transferring isolated margin out.","commonSituations":"Reading observations during a liquidation cascade, immediately after moving isolated margin back to the wallet, or during a margin-type transition cross/iso.","solutions":["Retry after a few seconds to let liquidation/settlement finish","Confirm on Binance UI whether the position still exists and has margin","If transitioning margin types, wait until Binance confirms the change completed before observing"],"exampleFix":"// before\nobs = await connector.read_account_observation()\n\n// after\nawait asyncio.sleep(3)  # let liquidation/settlement settle\nobs = await connector.read_account_observation()","handlingStrategy":"retry","validationCode":"risk = await client.futures_position_risk()\nfor p in risk:\n    if p['marginType'].lower() == 'isolated' and float(p['isolatedMargin']) <= 0 and float(p['positionAmt']) != 0:\n        raise RuntimeError(f\"{p['symbol']}: isolated position with zero margin (liquidation in progress?)\")","typeGuard":null,"tryCatchPattern":"try:\n    obs = await connector.read_account_observation()\nexcept UsdMObservationError as e:\n    if \"positive isolated margin\" in str(e):\n        await asyncio.sleep(5)  # let liquidation settle\n        obs = await connector.read_account_observation()\n    else:\n        raise","preventionTips":["Monitor margin levels so positions never reach full margin depletion","Do not observe during active liquidations","Top up isolated margin proactively"],"tags":["binance","futures","isolated-margin","invariant"],"backgroundTag":"isolated-margin-invariant-violation","analyzedSha":"80ffdda44c5c4db0dd84d70e051cca591cea67df","analyzedAt":"2026-08-28T12:46:38.989Z","schemaVersion":2},"datasetVersion":"2026-08-28T16:17:29.566Z"}