Place Order
Place an Order
value TradeClient::place_order(Order &order)
Description
Submits an order for trading.
After a successful place_order call, the order object's id field contains the ID to use for later queries or cancellation. A successful response confirms submission, not execution. Execution is asynchronous. Call get_order or get_orders to check the order status.
Note
- Market orders (MKT) and stop orders (STP) do not support pre-market or after-hours trading
- For shortable symbols, position locking is not currently supported. You cannot hold both long and short positions for the same symbol simultaneously
- Directly opening a reverse position is prohibited
Parameters
Order object, built using the OrderUtil utility class
Return
A web::json::value JSON object containing the order information when submission succeeds.
Building Contract Object Examples
#include "tigerapi/contract_util.h"
using namespace TIGER_API;
// US stock
Contract contract = ContractUtil::stock_contract(U("TIGR"), U("USD"));
// HK stock
Contract contract = ContractUtil::stock_contract(U("00700"), U("HKD"));
// Option
Contract contract = ContractUtil::option_contract(U("AAPL 240621C00190000"));
// or
Contract contract = ContractUtil::option_contract(U("AAPL"), U("20240621"), U("190"), U("CALL"));
// Futures
Contract contract = ContractUtil::future_contract(U("CL2312"), U("USD"));Limit Order (LMT)
#include "tigerapi/trade_client.h"
#include "tigerapi/client_config.h"
#include "tigerapi/contract_util.h"
#include "tigerapi/order_util.h"
using namespace TIGER_API;
ClientConfig config(false, U("your_config_directory_path"));
TradeClient trade_client(config);
// Build stock contract
Contract contract = ContractUtil::stock_contract(U("AAPL"), U("USD"));
// Build limit order
Order order = OrderUtil::limit_order(
config.account, // Trading account
contract, // Contract object
U("BUY"), // Buy direction
100, // Quantity
150.0 // Limit price
);
// Place order
value result = trade_client.place_order(order);
ucout << result.serialize() << std::endl;
// Get order ID
std::cout << "Order ID: " << order.id << std::endl;Market Order (MKT)
#include "tigerapi/trade_client.h"
#include "tigerapi/client_config.h"
#include "tigerapi/contract_util.h"
#include "tigerapi/order_util.h"
using namespace TIGER_API;
ClientConfig config(false, U("your_config_directory_path"));
TradeClient trade_client(config);
// Build stock contract
Contract contract = ContractUtil::stock_contract(U("AAPL"), U("USD"));
// Build market order
Order order = OrderUtil::market_order(
config.account, // Trading account
contract, // Contract object
U("BUY"), // Buy direction
100 // Quantity
);
// Place order
value result = trade_client.place_order(order);Stop Order (STP)
#include "tigerapi/trade_client.h"
#include "tigerapi/client_config.h"
#include "tigerapi/contract_util.h"
#include "tigerapi/order_util.h"
using namespace TIGER_API;
ClientConfig config(false, U("your_config_directory_path"));
TradeClient trade_client(config);
Contract contract = ContractUtil::stock_contract(U("AAPL"), U("USD"));
// Build stop order
Order order = OrderUtil::stop_order(
config.account, // Trading account
contract, // Contract object
U("SELL"), // Sell direction
100, // Quantity
140.0 // Stop trigger price
);
value result = trade_client.place_order(order);Stop Limit Order (STP_LMT)
#include "tigerapi/trade_client.h"
#include "tigerapi/client_config.h"
#include "tigerapi/contract_util.h"
#include "tigerapi/order_util.h"
using namespace TIGER_API;
ClientConfig config(false, U("your_config_directory_path"));
TradeClient trade_client(config);
Contract contract = ContractUtil::stock_contract(U("AAPL"), U("USD"));
// Build stop limit order
Order order = OrderUtil::stop_limit_order(
config.account, // Trading account
contract, // Contract object
U("SELL"), // Sell direction
100, // Quantity
139.0, // Limit price
140.0 // Stop trigger price
);
value result = trade_client.place_order(order);Trailing Stop Order (TRAIL)
#include "tigerapi/trade_client.h"
#include "tigerapi/client_config.h"
#include "tigerapi/contract_util.h"
#include "tigerapi/order_util.h"
using namespace TIGER_API;
ClientConfig config(false, U("your_config_directory_path"));
TradeClient trade_client(config);
Contract contract = ContractUtil::stock_contract(U("AAPL"), U("USD"));
// Trailing stop order - by trailing amount
Order order = OrderUtil::trail_order(
config.account, // Trading account
contract, // Contract object
U("SELL"), // Sell direction
100, // Quantity
5.0, // Trailing amount (aux_price)
0 // Trailing percent (0 means not used)
);
// Trailing stop order - by percentage
Order order2 = OrderUtil::trail_order(
config.account,
contract,
U("SELL"),
100,
0, // aux_price, 0 means not used
8.0 // trailing_percent 8%
);
value result = trade_client.place_order(order);Place HK Stock Order
For Hong Kong stocks, the order quantity must be a multiple of the stock's lot size.
ClientConfig config(false, U("your_config_directory_path"));
TradeClient trade_client(config);
Contract contract = ContractUtil::stock_contract(U("00700"), U("HKD"));
Order order = OrderUtil::limit_order(
config.account,
contract,
U("BUY"),
100, // Tencent has 100 shares per lot
400.0
);
value result = trade_client.place_order(order);Place Futures Order
ClientConfig config(false, U("your_config_directory_path"));
TradeClient trade_client(config);
Contract contract = ContractUtil::future_contract(U("CL2312"), U("USD"));
Order order = OrderUtil::limit_order(
config.account,
contract,
U("BUY"),
1,
70.0
);
value result = trade_client.place_order(order);Place Option Order
ClientConfig config(false, U("your_config_directory_path"));
TradeClient trade_client(config);
// Build contract using option identifier
Contract contract = ContractUtil::option_contract(U("AAPL 240621C00190000"));
Order order = OrderUtil::limit_order(
config.account,
contract,
U("BUY"),
1,
2.5
);
value result = trade_client.place_order(order);Price Correction for Orders
Use PriceUtil to adjust an order price to the contract's tick size. Tick-size requirements can vary by price tier, and the API rejects prices with invalid precision.
#include "tigerapi/trade_client.h"
#include "tigerapi/client_config.h"
#include "tigerapi/contract_util.h"
#include "tigerapi/order_util.h"
#include "tigerapi/price_util.h"
using namespace TIGER_API;
ClientConfig config(false, U("your_config_directory_path"));
TradeClient trade_client(config);
// Query contract to get tickSizes information
value contract_info = trade_client.get_contract(U("AAPL"), U("STK"));
value tick_sizes = contract_info[U("tickSizes")];
double price = 150.173;
// Check if price matches tick size specification
bool is_ok = PriceUtil::match_tick_size(price, tick_sizes);
// Fix price (default rounds down)
double fixed_price = PriceUtil::fix_price_by_tick_size(price, tick_sizes);
// fixed_price = 150.17
// Fix price (rounds up)
double fixed_price_up = PriceUtil::fix_price_by_tick_size(price, tick_sizes, true);
// fixed_price_up = 150.18
// Place order with corrected price
Contract contract = ContractUtil::stock_contract(U("AAPL"), U("USD"));
Order order = OrderUtil::limit_order(config.account, contract, U("BUY"), 1, fixed_price);
trade_client.place_order(order);Order Object Properties
| Property | Type | Description |
|---|---|---|
| id | unsigned long long | Order ID |
| order_id | long | External order ID |
| account | utility::string_t | Account ID |
| contract | Contract | Contract object (contains symbol, sec_type, market, currency) |
| action | utility::string_t | Trade direction BUY/SELL |
| order_type | utility::string_t | Order type MKT/LMT/STP/STP_LMT/TRAIL |
| total_quantity | long long | Total order quantity |
| total_quantity_scale | long | Quantity precision factor |
| limit_price | double | Limit price |
| aux_price | double | Stop trigger price |
| trail_stop_price | double | Trailing stop price |
| trailing_percent | double | Trailing stop percentage |
| percent_offset | double | Percent offset |
| time_in_force | utility::string_t | Order validity period DAY/GTC/GTD |
| outside_rth | bool | Allows pre-market and after-hours trading |
| adjust_limit | double | Price adjustment range |
| user_mark | utility::string_t | User remarks |
| expire_time | time_t | Expiry time |
| status | utility::string_t | Order status |
| filled_quantity | long long | Filled quantity |
| avg_fill_price | double | Average fill price |
| realized_pnl | double | Realized P&L |
| commission | double | Commission |
| open_time | time_t | Order placement time |
| latest_time | time_t | Latest fill time |
| update_time | time_t | Order update time |
| reason | utility::string_t | Order failure reason |
Response Example
{
"code": 0,
"message": "success",
"timestamp": 1785528000000,
"data": {
"id": 123458,
"orderId": 789014,
"subIds": []
}
}Iceberg Order (ICEBERG)
Iceberg orders support only US stocks. You can place them only during regular trading hours; pre-market orders are not supported.
#include "tigerapi/trade_client.h"
#include "tigerapi/order_util.h"
ClientConfig config(false, U("your_config_directory_path"));
TradeClient trade_client(config);
Contract contract = ContractUtil::stock_contract(U("AAPL"), U("USD"));
// Iceberg order (basic parameters)
Order order = OrderUtil::iceberg_order(
config.account, contract, U("BUY"), 1000, 180.0, 100);
value result = trade_client.place_order(order);
// Iceberg order (full parameters)
Order full_order = OrderUtil::iceberg_order(
config.account, contract, U("BUY"), 1000, 180.0,
100, // display_size
50, // min_display_size
30, // check_intervals (seconds)
U("LIMIT_PRICE"), // price_type: LIMIT_PRICE/ASK_PRICE/BID_PRICE/LATEST_PRICE
start_time, // effective start time (epoch ms)
end_time // effective end time (epoch ms)
);
value full_result = trade_client.place_order(full_order);Updated 7 days ago
