feat(V2): IBKR complex order tools (bracket/OCO/OTO)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -86,3 +86,52 @@ async def test_place_order_rejects_excessive_leverage():
|
||||
)
|
||||
assert exc_info.value.status_code == 403
|
||||
assert exc_info.value.detail["error"] == "LEVERAGE_CAP_EXCEEDED"
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_place_bracket_order_calls_client_with_three_legs():
|
||||
client = MagicMock()
|
||||
client.resolve_conid = AsyncMock(return_value=42)
|
||||
client.account_id = "DU1"
|
||||
client.get_account = AsyncMock(return_value={"netliquidation": {"amount": 100000}})
|
||||
client._submit_order_with_confirmation = AsyncMock(
|
||||
return_value={"order_id": "OID-parent"}
|
||||
)
|
||||
res = await t.place_bracket_order(
|
||||
client,
|
||||
t.PlaceBracketOrderReq(
|
||||
symbol="AAPL", side="buy", qty=1,
|
||||
entry_price=150, stop_loss=145, take_profit=160,
|
||||
),
|
||||
creds={"max_leverage": 4},
|
||||
)
|
||||
assert res["order_id"] == "OID-parent"
|
||||
payload = client._submit_order_with_confirmation.call_args[0][0]
|
||||
assert len(payload["orders"]) == 3
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_place_oto_partial_failure_cancels_trigger():
|
||||
from cerbero_mcp.exchanges.ibkr.client import IBKRError
|
||||
client = MagicMock()
|
||||
client.resolve_conid = AsyncMock(return_value=42)
|
||||
client.account_id = "DU1"
|
||||
client._submit_order_with_confirmation = AsyncMock(
|
||||
side_effect=[
|
||||
{"order_id": "TRIG1"},
|
||||
IBKRError("network"),
|
||||
]
|
||||
)
|
||||
client.cancel_order = AsyncMock(return_value={"canceled": True})
|
||||
with pytest.raises(IBKRError, match="IBKR_OTO_PARTIAL_FAILURE"):
|
||||
await t.place_oto_order(
|
||||
client,
|
||||
t.PlaceOtoOrderReq(
|
||||
trigger=t.OrderLeg(symbol="AAPL", side="buy", qty=1,
|
||||
order_type="limit", limit_price=150),
|
||||
child=t.OrderLeg(symbol="AAPL", side="sell", qty=1,
|
||||
order_type="limit", limit_price=160),
|
||||
),
|
||||
creds={"max_leverage": 4},
|
||||
)
|
||||
client.cancel_order.assert_awaited_once_with("TRIG1")
|
||||
|
||||
Reference in New Issue
Block a user