Limit orders
Limit order is an order to conclude a transaction to buy/sell stated number of lots of a financial instrument at the price that the trader who placed the order considers acceptable.
General information
Limit orders have a few features that must be noted when trading using them. In particular, keep in mind that:
Limit order is a direct order.
Direct orders passing to the Exchange without additional processing or waiting for specific conditions on the trading system side. Such orders are visible for all traders and affect the order book of the selected instrument. Also, the funds (money/lots) required to fulfill a direct order will be reserved at the moment of its posting.
Limit order directly forms the order book.
An order book is literally a list of limit orders waiting to be executed at a given price. When a limit order is posted, it is placed in a fulfillment queue waiting for a counter offer with the same price. Sell orders will overprice from the current best price, while buy orders will do the opposite. The closest bids to each other in terms of price determine the current market price of the lot, at which deals will be made on market orders.
Limit order may remain unfulfilled.
If a market order is executed immediately at the current best lot price, a limit order awaits execution at the price specified at the time of placing. If for the whole period of the order existence there were no counter offers matching the price of the placed order, such order will remain unexecuted and will be cancelled later.
Trader posts a limit order to buy 1000 lots of the instrument at the price of RUB 300. The current best lot price is RUB 301. If the market will show a growth tendency and the best lot price will increase, the order with unattractive price for other traders will remain unexecuted and the opportunity to conclude a profitable deal will be lost. To avoid such situations, it is recommended to use conditional orders and combine them with limit orders into groups.
Exchange may limit the price of a limit order.
To control the order aggressiveness, the Exchange may impose restrictions on the minimum and maximum lot price. Such limitation is based on the best lot price at the moment of order placement and is intended to protect investors from possible mistakes when making deals. The conditions of the limitation are determined by the exchange itself and may differ for different markets.
The stock market on the Moscow Exchange is subject to a price limit of 5% of the current best price of the instrument. If the current best price of an instrument is equal to RUB 300, orders with prices of 315.01 and 284.99 will be automatically rejected by the exchange as overly aggressive.
Limit order must be collateralized in accordance with the client's risk level and trading method:
In case of non-marginal trading the collateral for the order shall be the full value of the order;
For margin trading, collateral depends on the client's level of risk.
You can check the sufficiency of funds by the order evaluation request. To find out the terms and conditions of the order collateral depending on the risk level, click here.
Limit orders should be considered as an opportunity to make a deal at a desired price (within certain limits), but with no guarantee of finding a suitable counter offer.
If this method does not match the trading strategy you use, we recommend to try market orders to increase the probability of a successful trade.
Conditions
The main condition for order execution is the timeInForce
parameter, which regulates the processing of the order balance after exhaustion of all counter offers of the market. Possible values:
Condition | Description |
---|---|
oneday | Order shall be valid during the trading day. The balance after withdrawal of the entire available volume of counter offers shall be placed in the queue for execution and shall be held until order fulfillment, cancellation or the end of the trading day within which the order was placed. |
goodtillcancelled | Similar to |
immediateorcancel | Order is fulfilled for the volume available at the moment of placement, the rest is canceled. |
fillorkill | Order can be fulfilled only in its entirety. If the available volume does not allow to fulfill the order, it will not be placed at all. |
Request examples
Common requirements
An order through the API can be posted, changed and canceled if it has not been executed before. In this case, regardless of the selected action and interaction protocol, all requests must:
- be authorized
- be identifiable
- contain a message with all order parameters
How these conditions should be met, however, depends on the interaction protocol.
- HTTP API
- WebSocket API
Authorization
Authorization is necessary to confirm that the sender has the rights to use the requested resource. Request authorization uses a JWT token, which acts as an Access token. A full description of available authorization methods is available in the Authorization section.
HTTP API uses the Authorization
header parameter to pass the token. The header must be passed with each executed request.
This token should be passed as a Bearer token, so the header must contain the Bearer
prefix before the passed value. A correctly filled Authorization
header looks as follows:
Authorization: Bearer eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCIsImN0eSI6IkpXVCJ9.eyJzdWIiOiJMb2dpblNhbXBsZSIsImVudCI6ImNsaWVudCIsImVpbiI6IjAxMjM0IiwiY2xpZW50aWQiOiIwMTIzNDU2IiwiYXpwIjoiMDEyMzQ1Njc4OWFiY2RlZjAxMjMiLCJhZ3JlZW1lbnRzIjoiQWdyZWVtZW50U2FtcGxlMSBBZ3JlZW1lbnRTYW1wbGUyIEFncmVlbWVudFNhbXBsZTMiLCJwb3J0Zm9saW9zIjoiUG9ydGZvbGlvU2FtcGxlMSBQb3J0Zm9saW9TYW1wbGUyIFBvcnRmb2xpb1NhbXBsZTMiLCJzY29wZSI6Ik9yZGVyc1JlYWQgT3JkZXJzQ3JlYXRlIFRyYWRlcyBQZXJzb25hbCBTdGF0cyIsImV4cCI6Mjg3MTc2MzE5OSwiaWF0IjowLCJpc3MiOiJBbG9yLklkZW50aXR5IiwiYXVkIjoiQ2xpZW50IFdBUlAgV2FycEFUQ29ubmVjdG9yIHN1YnNjcmlwdGlvbnNBcGkgQ29tbWFuZEFwaSBJbnN0cnVtZW50QXBpIFRyYWRpbmdWaWV3UGxhdGZvcm0ifQ.QOQVMIAoZ6SnF5urnIzJ0EvtQd9P5Sx355069kXoID207wHOTW0wkKNMcrIKXmENEQQ_0yDjqH_kjeqWLBJuqA
Identification
Request identification is needed to sort out a dozen of similar requests into unique ones. The identifier must be provided by the user and passed as a value of the X-REQID
header parameter, so the API client used must be able to generate it.
Any character combination can be used as a request identifier, including the wildcard characters !@##;%:?*()-_=+/|''
. Identifier has two restrictions:
The identifier value must be unique for the trading system. If the value has been previously used for another request, a copy of the response to the first request with this identifier will be returned instead of execution of the new request
Wildcard characters that violate the integrity of a JSON object must be escaped
Thus, the system will accept both Dxxxxx-Order-Market-No-812643-@-MOEX
and d3c886f1-ea1e-4634-aff4-119c902ad926
as the request identifier, provided that these values have not been previously passed to the system by any API user.
A properly filled X-REQID
parameter does not require any additional prefixes and looks as follows:
X-REQID: d3c886f1-ea1e-4634-aff4-119c902ad926
Connection
All requests to manage orders via the WebSocket API, regardless of the order type, must be executed through the /cws
interface. Before sending a request, establish a WebSocket connection to this interface.
Complete URL:
https://api.alor.ru/cws
https://apidev.alor.ru/cws
Authorization
Authorization is necessary to confirm that the sender has the rights to use the requested resource. Request authorization uses a JWT token, which acts as an Access token. A full description of available authorization methods is available in the Authorization section.
WebSocket API uses a separate request with the authorize
operation code to pass a token to the /cws interface. It is enough to make the request once every 15-20 minutes to authorize all further requests within the same WebSocket connection.
Establish a connection to the required system environment and send a message with the authorize
transaction code and a valid Access token as the value of the token
parameter:
{
"opcode": "authorize",
"guid": "c328fcf1-e495-408a-a0ed-e20f95d6b813",
"token": "eyJhbGciOiJ..."
}
If the request is correct, the server will return a message with code 200 confirming that the connection has been authorized:
{
"requestGuid": "c328fcf1-e495-408a-a0ed-e20f95d6b813",
"httpCode": 200,
"message": "The connection has been initialized."
}
The guid
parameter is needed for identifying the message and described below.
Identification
Request identification is needed to sort out a dozen of similar requests into unique ones. The identifier must be provided by the user and passed as a value of the X-REQID
header parameter, so the API client used must be able to generate it.
Any character combination can be used as a request identifier, including the wildcard characters !@##;%:?*()-_=+/|''
. Identifier has two restrictions:
The identifier value must be unique for the trading system. If the value has been previously used for another request, a copy of the response to the first request with this identifier will be returned instead of execution of the new request
Wildcard characters that violate the integrity of a JSON object must be escaped
Thus, the system will accept both Dxxxxx-Order-Market-No-812643-@-MOEX
and d3c886f1-ea1e-4634-aff4-119c902ad926
as the request identifier, provided that these values have not been previously passed to the system by any API user.
Properly filled guid
parameter does not require any additional prefixes and looks as follows:
{
"guid": "d3c886f1-ea1e-4634-aff4-119c902ad926"
}
Order management
Order management options are interchangeable. For example, an order placed via HTTP API can be changed or canceled via WebSocket API, and vice versa.
- HTTP API
- WebSocket API
Creating order
Interactive description of this request is available at the Create Limit order page
To create a limit order via HTTP API, use a POST request to the /commandapi/warptrans/TRADE/v2/client/orders/actions/limit
endpoint with a message containing all order parameters.
Complete URL looks as follows:
https://api.alor.ru/commandapi/warptrans/TRADE/v2/client/orders/actions/limit
https://apidev.alor.ru/commandapi/warptrans/TRADE/v2/client/orders/actions/limit
The message body should contain basic information about the order: side, number of lots, instrument data, portfolio and condition for execution of the order. If necessary, you can add a custom comment to make it easier to identify the order by a human.
{
"side": "buy",
"quantity": 100,
"price": 301.74,
"instrument": {
"symbol": "SBER",
"exchange": "MOEX",
"instrumentGroup": "TQBR"
},
"comment": "Custom comment",
"user": {
"portfolio": "D39004"
},
"timeInForce": "oneday"
}
A limit order was created to buy 100 lots of SBER on the Moscow Exchange (MOEX) in the T+2 (TQBR) mode at a price of RUB 301.74 per lot.
If the request is successful, the API will return a message with response code 200 containing the exchange order number:
{
"message": "success",
"orderNumber": "189...559"
}
If the request processing ended with an error, the API will return information about the cause of this error.
A complete list of all parameters and possible responses is available on the request description page.
Changing order
Interactive description of this request is available at the Update Limit order page
To change a previously posted order via the HTTP API, a PUT request to the /commandapi/warptrans/TRADE/v2/client/orders/limit/{orderId}
endpoint is used, where {orderId}
is a Path parameter that passes the order number.
Modification of the order is made by canceling the previously placed order and publishing a new one. It is not possible to change fulfilled or canceled orders.
Complete URL looks as follows:
https://api.alor.ru/commandapi/warptrans/TRADE/v2/client/orders/actions/limit/189...559
https://apidev.alor.ru/commandapi/warptrans/TRADE/v2/client/orders/actions/limit/189...559
Where 189...559
is the actual value of the {orderId}
parameter.
When changing an existing order, a message identical to the order posting request is used. The difference is in other parameter values.
{
"side": "buy",
"quantity": 10,
"price": 301.74,
"instrument": {
"symbol": "SBER",
"exchange": "MOEX",
"instrumentGroup": "TQBR"
},
"comment": "Custom comment",
"user": {
"portfolio": "D39004"
},
"timeInForce": "oneday"
}
The order with the number 189...559
has been canceled. A new limit order was created to buy 10 lots of the SBER instrument on the Moscow Exchange (MOEX) in the T+2 (TQBR) mode at a price of RUB 301.74 per lot.
If the request is successful, the previous order will be canceled and the API will return a message with response code 200 containing the exchange number of the new order:
{
"message": "success",
"orderNumber": "189...560"
}
If the request processing ended with an error, the API will return information about the cause of this error.
A complete list of all parameters and possible responses is available on the request description page.
Cancelling order
Interactive description of this request is available at the Cancel one order page
Only pending orders can be canceled. It is impossible to cancel fulfilled orders.
To cancel a previously posted order via HTTP API, a DELETE request to the /commandapi/warptrans/TRADE/v2/client/orders/{orderId}
endpoint is used, where {orderId}
is a Path parameter that passes the order number.
In addition to the order number, the following attributes of the order are also required:
Query parameters
Client portfolio Id
Possible values: [MOEX
]
Exchange code
Is it a stop order?
So, the complete URL of the request to cancel the order looks as follows:
https://api.alor.ru/commandapi/warptrans/TRADE/v2/client/orders/189...560?portfolio=D39004&exchange=MOEX&stop=false
https://apidev.alor.ru/commandapi/warptrans/TRADE/v2/client/orders/189...560?portfolio=D39004&exchange=MOEX&stop=false
Order with number 189...560
has been canceled.
If the request is successful, the previous order will be canceled and the API will return a message with response code 200:
success
If the request processing ended with an error, the API will return information about the cause of this error.
A complete list of all parameters and possible responses is available on the request description page.
Creating order
Complete description of the request is available on the Create Limit order page
To create a limit order via WebSocket API, send a message with the value "opcode": "create:limit"
containing all order parameters to an authorized connection:
{
// Operation code for creating a limit order:
"opcode": "create:limit",
// Request Id:
"guid": "c328fcf1-e495-408a-a0ed-e20f95d6b813",
// Limit order parameters:
"side": "buy",
"quantity": 100,
"price": 301.74,
"instrument": {
"symbol": "SBER",
"exchange": "MOEX"
},
"comment": "Custom comment",
"board": "TQBR",
"user": {
"portfolio": "D39004"
},
"timeInForce": "oneday",
// Service flag to check for request duplicates:
"checkDuplicates": true
}
A limit order was created to buy 100 lots of SBER on the Moscow Exchange (MOEX) in the T+2 (TQBR) mode at a price of RUB 301.74 per lot.
If the request is successful, the API will return a message with response code 200 containing the exchange order number:
{
"requestGuid": "c328fcf1-e495-408a-a0ed-e20f95d6b813",
"httpCode": 200,
"message": "An order '189...559' has been created.",
"orderNumber": 189...559
}
If the request processing ended with an error, the API will return information about the cause of this error.
A complete list of all parameters and possible responses is available on the request description page.
Changing order
Complete description of the request is available on the Update Limit order page
To change a limit order via the WebSocket API send a message to the authorized connection similar to the one sent when the previous order was placed.
The difference is the need to use the orderId
parameter, which specifies the number of the order to be changed, and the update:limit
value of the opcode
parameter.
Modification of the order is based on canceling the previously placed order and publishing a new one. It is not possible to change fulfilled or canceled orders.
{
// Operation code to change the limit order:
"opcode": "update:limit",
// Request Id:
"guid": "c328fcf1-e495-408a-a0ed-e20f95d6b813",
// Number of the order being changed:
"orderId": "189...559",
// Market order parameters:
"side": "buy",
"quantity": 10,
"price": 301.74,
"instrument": {
"symbol": "SBER",
"exchange": "MOEX"
},
"comment": "Custom comment",
"board": "TQBR",
"user": {
"portfolio": "D39004"
},
"timeInForce": "oneday",
// Service flag to check for request duplicates:
"checkDuplicates": true
}
The order with the number 189...559
has been canceled. A new limit order was created to buy 10 lots of the SBER instrument on the Moscow Exchange (MOEX) in the T+2 (TQBR) mode at a price of RUB 301.74 per lot.
If the request is successful, the API will return a message with response code 200 containing the exchange order number:
{
"requestGuid": "c328fcf1-e495-408a-a0ed-e20f95d6b813",
"httpCode": 200,
"message": "An order has been updated. New order Id is '189...560'.",
"orderNumber": "189...560"
}
If the request processing ended with an error, the API will return information about the cause of this error.
A complete list of all parameters and possible responses is available on the request description page.
Cancelling order
Complete description of the request is available on the Cancel Limit order
Only pending orders can be canceled. It is impossible to cancel fulfilled orders.
To cancel a previously posted limit order via WebSocket API, send a message to an authorized connection containing the delete:limit
operation code, order number, exchange code and the identifier of the portfolio on behalf of which the order was posted. Like any other, request to cancel an order must contain a unique identifier in the guid
parameter.
{
// Operation code to cancel a limit order:
"opcode": "delete:limit",
// Request Id:
"guid": "c328fcf1-e495-408a-a0ed-e20f95d6b813",
// The number and affiliation of the order being canceled:
"orderId": "189...560",
"exchange": "MOEX",
"user": {
"portfolio": "D39004"
},
// Service flag to check for request duplicates:
"checkDuplicates": true
}
Order with number 189...560
has been canceled.
If the request is successful, the API will return a message with response code 200 containing the exchange order number:
{
"requestGuid": "c328fcf1-e495-408a-a0ed-e20f95d6b813",
"httpCode": 200,
"message": "An order '189...560' has been deleted.",
"orderNumber": "189...560"
}
If the request processing ended with an error, the API will return information about the cause of this error.
Unlike HTTP API, which allows to cancel orders of any type with the same request, in WebSocket API the request with the code "opcode": "delete:limit"
allows to cancel only limit orders. If you need to cancel order of another type, use HTTP-request or use codes corresponding to market and conditional orders.
If necessary, a limit order can be grouped with other orders for cohesive execution.
What's next?
Additionally, we recommend reading the following related articles:
- Guide for Data receiption
- Market orders
- Iceberg orders
- Conditional orders
- Order groups
- Guide for HTTP API
- Guide for WebSocket API
- Frequently asked questions
- Quick Start Guide for Production environment
- Quick Start Guide for Test environment