下单交易
place_oder 下单
TradeClient.place_order():
说明
交易下单接口。关于如何选择标的、订单类型、方向数量等,请见下方说明。请在运行程序前结合本文档的概述部分及FAQ-交易-支持的订单列表部分,检查您的账户是否支持所请求的订单,并检查交易规则是否允许在程序运行时段对特定标的下单。若下单失败,可首先阅读文档FAQ-交易部分排查
place_order
调用成功后,返回对象里包含订单id, 可用于后续的查询或撤单,此时只表示订单提交成功,不代表订单已被成功执行,订单的执行是异步的,提交订单后,订单会根据情况进入下一步状态,比如成交、被拒绝等。因此,建议在对订单进行下一步操作之前,使用get_order
或get_orders
方法查询对应订单的状态,
CAUTION
1、市价单(MKT)和止损单(STP)不支持盘前盘后阶段交易,在调用下单接口时,需要把 outside_rth 设置为 false
2、对于可做空标的,暂不支持锁仓功能,因此无法同时持有相同标的多头和空头持仓
3、附加订单的主订单类型暂时仅支持限价单
4、市价单(MKT)和模拟账号,对'time_in_force'参数都不支持GTC
5、模拟账号暂不支持窝轮和牛熊证的订单
订单状态说明
如何判断综合和模拟账号的部分成交状态?
当订单状态不是FILLED(有可能是NEW,CANCELLED,EXPIRED,REJECTED其中一种)时,都有可能是部分成交的状态,可以通过订单成交数量是否大于0来判断
如何判断环球账号部分成交状态?
订单状态是 FILLED,且订单成交数量大于0
订单状态变化流程
参数
Order
对象 (tigeropen.trade.domain.order.Order
)
可用 tigeropen.common.util.order_utils
下的工具函数,如 limit_order(), market_order(), 根据您需要的具体订单类型和参数,在本地生成订单对象。创建方法详见Order对象-构建方法部分 或者用 TradeClient.create_order()
向服务端请求订单号,然后生成订单对象(不推荐)
订单常用属性:
参数名 | 类型 | 是否必填 | 描述 |
---|---|---|---|
action | str | Yes | 买卖方向,'BUY'表示买入,'SELL'表示卖出 |
order_type | str | Yes | 订单类型,'MKT' 市价单 / 'LMT' 限价单 / 'STP' 止损单 / 'STP_LMT' 止损限价单 / 'TRAIL' 跟踪止损单 |
time_in_force | str | No | 订单有效期,'DAY'当日有效,'GTC'取消前有效, 'GTD' 日期前有效(GTD订单必须额外指定expire_time) |
limit_price | float | No | 限价的价格,当订单类型为 LMT 或 STP_LMT 时必填 |
total_quantity | int | Yes | 下单数量,必须为大于0的整数。如果不是美股,quantity需要为股票每手股数的整数倍,可以用 TradeClient.get_trade_metas 查询每手股数 |
total_quantity_scale | int | No | 下单数量的偏移量,默认为0。碎股单的total_quantity 和 total_quantity_scale 结合起来代表真实下单数量,如 total_quantity=111 total_quantity_scale=2,那么真实 quantity=111*10^(-2)=1.11 |
返回
如果下单成功则返回订单id,失败抛出异常。
限价单
#include "tigerapi/trade_client.h"
#include "tigerapi/contract_util.h"
#include "tigerapi/order_util.h"
using namespace std;
using namespace web;
using namespace web::json;
using namespace TIGER_API;
/**
* 调用交易接口
*/
class TestTradeClient {
public:
static void test_place_order(const std::shared_ptr<TradeClient>& trade_client) {
// 股票合约
Contract contract = stock_contract("AAPL", "USD");
// 期权合约
// Contract contract = option_contract(U("AAPL"), U("20230630"), U("187.5"), U("CALL"));
// 或 Contract contract = option_contract(U("AAPL 230630C00187500");
// 期货合约
// Contract contract = future_contract(U("CL2312"), U("USD"));
Order order = limit_order(contract, "BUY", 1, 105.0);
value res = trade_client->place_order(order);
long id = res["id"].as_integer();
cout << "order id: " << id << endl;
cout << "place order result: " << res << endl;
}
static void test_trade(const std::shared_ptr<TradeClient>& trade_client) {
TestTradeClient::test_get_orders(trade_client);
}
};
int main(int argc, char *args[]) {
cout << "Tiger Api main" << endl;
/************************** set config **********************/
ClientConfig config = ClientConfig();
config.private_key = "xxxxxx your private key string xxxxxxxx";
config.tiger_id = "your tiger id";
config.account = "your account";
/**
* 使用封装后的交易接口 TradeClient
*/
std::shared_ptr<TradeClient> trade_client = std::make_shared<TradeClient>(config);
TestTradeClient::test_trade(trade_client);
return 0;
}
市价单
#include "tigerapi/trade_client.h"
#include "tigerapi/contract_util.h"
#include "tigerapi/order_util.h"
using namespace std;
using namespace web;
using namespace web::json;
using namespace TIGER_API;
/**
* 调用交易接口
*/
class TestTradeClient {
public:
static void test_place_order(const std::shared_ptr<TradeClient>& trade_client) {
Contract contract = stock_contract("AAPL", "USD");
Order order = market_order(contract, "BUY", 1);
value res = trade_client->place_order(order);
long id = res["id"].as_integer();
cout << "order id: " << id << endl;
cout << "place order result: " << res << endl;
}
static void test_trade(const std::shared_ptr<TradeClient>& trade_client) {
TestTradeClient::test_get_orders(trade_client);
}
};
int main(int argc, char *args[]) {
cout << "Tiger Api main" << endl;
/************************** set config **********************/
ClientConfig config = ClientConfig();
config.private_key = "xxxxxx your private key string xxxxxxxx";
config.tiger_id = "your tiger id";
config.account = "your account";
/**
* 使用封装后的交易接口 TradeClient
*/
std::shared_ptr<TradeClient> trade_client = std::make_shared<TradeClient>(config);
TestTradeClient::test_trade(trade_client);
return 0;
}
create_order 请求创建订单
TradeClient.create_order():
说明
请求订单号,创建订单对象。不推荐使用,建议使用 tigeropen.common.util.order_utils
下的工具函数本地创建订单,如 limit_order
, market_order
.
参数
参数名 | 类型 | 描述 | 市价单 | 限价单 | 止损单 | 止损限价单 | 跟踪止损单 |
---|---|---|---|---|---|---|---|
account | str | 账户id,不传则返回所有关联的 account | 选填 | 选填 | 选填 | 选填 | 选填 |
contract | Contract | 合约对象 | |||||
action | str | 买卖方向, 'BUY':买入, 'SELL':卖出 | |||||
order_type | str | 订单类型, 'MKT' 市价单 / 'LMT' 限价单 / 'STP' 止损单 / 'STP_LMT' 止损限价单 / 'TRAIL' 跟踪止损单 | MKT | LMT | STP | STP_LMT | TRAIL |
quantity | int | 下单数量, 为大于0的整数 | |||||
limit_price | float | 限价单价格,当订单类型为LMT或STP_LMT时必填 | |||||
aux_price | float | 在止损单表示止损价格; 在跟踪止损单表示价差 | |||||
trail_stop_price | float | 跟踪止损单--触发止损单的价格 | |||||
trailing_percent | float | 跟踪止损单--百分比 | |||||
adjust_limit | float | 价格微调幅度(默认为0表示不调整,正数为向上调整,负数向下调整),对传入价格自动调整到合法价位上。例如:0.001 代表向上调整且幅度不超过 0.1%;-0.001 代表向下调整且幅度不超过 0.1%。默认 0 表示不调整 | 选填 | 选填 | 选填 | 选填 | |
time_in_force | str | 订单有效期,只能是 DAY(当日有效)和GTC(取消前有效),默认为DAY | 选填 | 选填 | 选填 | 选填 | 选填 |
outside_rth | bool | True: 允许盘前盘后交易(美股专属), False: 不允许, 默认为True。(市价单只在盘中有效,将忽略outside_rth参数) | 选填 | 选填 | 选填 | ||
order_legs | object | 附加订单列表,参数上面示例 | 选填 | 选填 | 选填 | 选填 | 选填 |
algo_params | object | 算法订单参数,参考上面示例 | 选填 | 选填 | 选填 | 选填 | 选填 |
secret_key | str | 机构用户专用,交易员密钥 | 选填 | 选填 | 选填 | 选填 | 选填 |
user_mark | str | 下单备注信息,下单后不能修改,查询订单时返回userMark信息(需要配置开发者个人信息) | 选填 | 选填 | 选填 | 选填 | 选填 |
place_forex_order 换汇下单
说明
换汇订单
示例
static void test_place_forex_order(const std::shared_ptr<TradeClient>& trade_client) {
value res = trade_client->place_forex_order(U("SEC"), U("USD"), U("HKD"), 1.0);
ucout << U("place forex order: ") << res << endl;
}
返回示例
{"account":"111","action":"SELL","algoStrategy":"LMT","attrDesc":"","avgFillPrice":0,"canCancel":true,"canModify":true,"commission":0,"currency":"HKD","discount":0,"externalId":"1504","filledQuantity":0,"id":31570073629229056,"identifier":"USD.HKD","isOpen":false,"latestPrice":7.8062500000000004,"latestTime":1689759747000,"limitPrice":7.7962499999999997,"liquidation":false,"market":"US","name":"USD.HKD","openTime":1689759747000,"orderId":1504,"orderType":"LMT","outsideRth":false,"realizedPnl":0,"remark":"","secType":"FOREX","source":"OpenApi","status":"Initial","symbol":"USD.HKD","timeInForce":"DAY","totalQuantity":1,"updateTime":1689759747000,"userMark":""}