|
@@ -640,6 +640,113 @@ def test_build_contract_size_rejects_boolean_inputs():
|
|
|
build_contract_size(notional=100, price=25_000, metadata=InstrumentMeta(ct_val=True, lot_sz=1, min_sz=1))
|
|
build_contract_size(notional=100, price=25_000, metadata=InstrumentMeta(ct_val=True, lot_sz=1, min_sz=1))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+def test_post_only_limit_order_body_is_exact_okx_payload():
|
|
|
|
|
+ body = OkxClient.build_post_only_limit_order_body(
|
|
|
|
|
+ symbol="ETH-USDT-SWAP",
|
|
|
|
|
+ action="long",
|
|
|
|
|
+ price="2991.0000",
|
|
|
|
|
+ size="2.000",
|
|
|
|
|
+ client_order_id="eth-twap-1",
|
|
|
|
|
+ )
|
|
|
|
|
+
|
|
|
|
|
+ assert body == {
|
|
|
|
|
+ "instId": "ETH-USDT-SWAP",
|
|
|
|
|
+ "tdMode": "isolated",
|
|
|
|
|
+ "side": "buy",
|
|
|
|
|
+ "posSide": "long",
|
|
|
|
|
+ "ordType": "post_only",
|
|
|
|
|
+ "px": "2991",
|
|
|
|
|
+ "sz": "2",
|
|
|
|
|
+ "clOrdId": "eth-twap-1",
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+def test_short_post_only_limit_order_body_uses_sell_short():
|
|
|
|
|
+ body = OkxClient.build_post_only_limit_order_body(
|
|
|
|
|
+ symbol="ETH-USDT-SWAP",
|
|
|
|
|
+ action="short",
|
|
|
|
|
+ price="3018",
|
|
|
|
|
+ size="1.5",
|
|
|
|
|
+ client_order_id="eth-twap-short-2",
|
|
|
|
|
+ )
|
|
|
|
|
+
|
|
|
|
|
+ assert body["side"] == "sell"
|
|
|
|
|
+ assert body["posSide"] == "short"
|
|
|
|
|
+ assert body["ordType"] == "post_only"
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+def test_entry_batch_order_body_uses_three_independent_post_only_levels():
|
|
|
|
|
+ metadata = InstrumentMeta(ct_val=0.01, lot_sz=0.1, min_sz=0.1)
|
|
|
|
|
+
|
|
|
|
|
+ body = OkxClient.build_entry_batch_order_body(
|
|
|
|
|
+ symbol="ETH-USDT-SWAP",
|
|
|
|
|
+ action="long",
|
|
|
|
|
+ reference_price="3000",
|
|
|
|
|
+ margin_usdt="90",
|
|
|
|
|
+ leverage="2",
|
|
|
|
|
+ metadata=metadata,
|
|
|
|
|
+ client_order_id_prefix="eth-twap-20260430T000000Z",
|
|
|
|
|
+ )
|
|
|
|
|
+
|
|
|
|
|
+ assert body == [
|
|
|
|
|
+ {
|
|
|
|
|
+ "instId": "ETH-USDT-SWAP",
|
|
|
|
|
+ "tdMode": "isolated",
|
|
|
|
|
+ "side": "buy",
|
|
|
|
|
+ "posSide": "long",
|
|
|
|
|
+ "ordType": "post_only",
|
|
|
|
|
+ "px": "2991",
|
|
|
|
|
+ "sz": "2",
|
|
|
|
|
+ "clOrdId": "eth-twap-20260430T000000Z-1",
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ "instId": "ETH-USDT-SWAP",
|
|
|
|
|
+ "tdMode": "isolated",
|
|
|
|
|
+ "side": "buy",
|
|
|
|
|
+ "posSide": "long",
|
|
|
|
|
+ "ordType": "post_only",
|
|
|
|
|
+ "px": "2982",
|
|
|
|
|
+ "sz": "2",
|
|
|
|
|
+ "clOrdId": "eth-twap-20260430T000000Z-2",
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ "instId": "ETH-USDT-SWAP",
|
|
|
|
|
+ "tdMode": "isolated",
|
|
|
|
|
+ "side": "buy",
|
|
|
|
|
+ "posSide": "long",
|
|
|
|
|
+ "ordType": "post_only",
|
|
|
|
|
+ "px": "2973",
|
|
|
|
|
+ "sz": "2",
|
|
|
|
|
+ "clOrdId": "eth-twap-20260430T000000Z-3",
|
|
|
|
|
+ },
|
|
|
|
|
+ ]
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+def test_cancel_order_body_uses_exactly_one_identifier():
|
|
|
|
|
+ assert OkxClient.build_cancel_order_body(symbol="ETH-USDT-SWAP", order_id="123") == {
|
|
|
|
|
+ "instId": "ETH-USDT-SWAP",
|
|
|
|
|
+ "ordId": "123",
|
|
|
|
|
+ }
|
|
|
|
|
+ assert OkxClient.build_cancel_order_body(symbol="ETH-USDT-SWAP", client_order_id="eth-twap-1") == {
|
|
|
|
|
+ "instId": "ETH-USDT-SWAP",
|
|
|
|
|
+ "clOrdId": "eth-twap-1",
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+def test_pending_orders_query_params_are_minimal_params():
|
|
|
|
|
+ assert OkxClient.build_pending_orders_params(symbol="ETH-USDT-SWAP") == {
|
|
|
|
|
+ "instType": "SWAP",
|
|
|
|
|
+ "instId": "ETH-USDT-SWAP",
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+def test_fills_query_params_are_minimal_params():
|
|
|
|
|
+ assert OkxClient.build_fills_params(symbol="ETH-USDT-SWAP") == {
|
|
|
|
|
+ "instType": "SWAP",
|
|
|
|
|
+ "instId": "ETH-USDT-SWAP",
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
@pytest.mark.parametrize(
|
|
@pytest.mark.parametrize(
|
|
|
("price", "metadata"),
|
|
("price", "metadata"),
|
|
|
[
|
|
[
|