binance_place_order
Place a real spot order on Binance when you're ready to trade: submit limit, market, or stop-loss orders with validated parameters after a dry run passes.
Instructions
Place a REAL spot order on Binance. This spends real money.
Calls POST /api/v3/order (SIGNED, IP weight 1, unfilled-order count 1). A MARKET
order executes immediately at whatever the book offers; a LIMIT order rests until it
fills, expires or is cancelled.
Kill-switch. This call is refused with Error: … trading is disabled … unless
the server runs with BINANCE_ALLOW_TRADING=1. The gate lives in the HTTP client, so
no tool can bypass it. If you see that error, the operator has deliberately put the
server in read-only mode — report it, do not try to work around it.
Always run binance_test_order first with identical parameters: it is allowed
even with the kill-switch off and catches filter/precision rejections for free.
When to Use:
After a dry-run passed and the human has approved this specific order.
To act on a decision that already names symbol, side, type, quantity and price.
When NOT to Use:
To "see if it would work" — that is
binance_test_order.For a bracket/OCO (entry plus stop plus target) — use the order-list tools in
order_lists.py, which place the legs atomically.To modify a resting order — use
binance_cancel_replace_order, which does not leave you unhedged between the two calls.
Returns:
A confirmation echoing exactly what Binance returned: symbol, orderId,
clientOrderId, status, executedQty, cummulativeQuoteQty, and the fills table when the
response carries one. Nothing is inferred: with new_order_resp_type="ACK" Binance
reports only the ids, and the confirmation says so rather than implying a fill. When
Binance answers EXPIRED / EXPIRED_IN_MATCH / REJECTED the heading reads Order NOT
live — an IOC/FOK that never rested is not a placed order.
Examples: params = {"symbol": "BTCUSDT", "side": "BUY", "type": "LIMIT", "time_in_force": "GTC", "quantity": "0.001", "price": "20000.00", "new_client_order_id": "my-entry-001"} params = {"symbol": "BTCUSDT", "side": "SELL", "type": "MARKET", "quantity": "0.001"} params = {"symbol": "BTCUSDT", "side": "SELL", "type": "STOP_LOSS_LIMIT", "time_in_force": "GTC", "quantity": "0.001", "price": "19000.00", "stop_price": "19100.00"}
Error Handling:
Error: … trading is disabled …→ the kill-switch is off; nothing was sent.-2010 (order rejected) → insufficient balance, or a symbol filter: quantity off the LOT_SIZE step, price off the PRICE_FILTER tick, or the order under the NOTIONAL minimum. Read the filters with
binance_get_exchange_infoand re-run the dry-run.-1013 / -1111 are the same family (precision / filter).
-2021 means a LIMIT_MAKER would have taken liquidity immediately.
A 5xx or a timeout means the execution status is UNKNOWN — the order may well be live. Query it with
binance_get_order(bynew_client_order_idif you set one) orbinance_get_open_ordersbefore doing anything else. NEVER resend blindly: a duplicate market order is real money lost.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
| result | Yes |