Place Order . 주문 송신
HTTP Request : POST /v5/order/create |
Place Order . 요청
// Spot PostOnly normal order . 현물 일반 주문(내계좌 잔고만으로 거래하는것) 할려면 "isLeverage":0 로 함.
{"category":"spot","symbol":"BTCUSDT","side":"Buy","orderType":"Limit","qty":"0.1","price":"15600","timeInForce":"PostOnly","orderLinkId":"spot-test-01","isLeverage":0,"orderFilter":"Order"}
// Spot TP/SL order
{"category":"spot","symbol":"BTCUSDT","side":"Buy","orderType":"Limit","qty":"0.1","price":"15600","triggerPrice": "15000", "timeInForce":"Limit","orderLinkId":"spot-test-02","isLeverage":0,"orderFilter":"tpslOrder"}
// Spot margin normal order (UTA) . 현물 마진 주문 할려면 "isLeverage":1 로 함.
{"category":"spot","symbol":"BTCUSDT","side":"Buy","orderType":"Limit","qty":"0.1","price":"15600","timeInForce":"Limit","orderLinkId":"spot-test-limit","isLeverage":1,"orderFilter":"Order"}
// Spot Market Buy order, qty is quote currency
{"category":"spot","symbol":"BTCUSDT","side":"Buy","orderType":"Market","qty":"200","timeInForce":"IOC","orderLinkId":"spot-test-04","isLeverage":0,"orderFilter":"Order"}
// USDT Perp open long position (one-way mode)
{"category":"linear","symbol":"BTCUSDT","side":"Buy","orderType":"Limit","qty":"1","price":"25000","timeInForce":"GTC","positionIdx":0,"orderLinkId":"usdt-test-01","reduceOnly":false,"takeProfit":"28000","stopLoss":"20000","tpslMode":"Partial","tpOrderType":"Limit","slOrderType":"Limit","tpLimitPrice":"27500","slLimitPrice":"20500"}
// USDT Perp close long position (one-way mode)
{"category": "linear", "symbol": "BTCUSDT", "side": "Sell", "orderType": "Limit", "qty": "1", "price": "30000", "timeInForce": "GTC", "positionIdx": 0, "orderLinkId": "usdt-test-02", "reduceOnly": true}
Parameter | Required | Type | Comments |
category | true | string | Product type
|
symbol | true | string | Symbol name |
isLeverage | false | integer | Whether to borrow. Valid for Unified spot only. 0(default): false then spot trading, 1: true then margin trading |
side | true | string | Buy, Sell |
orderType | true | string | Market, Limit |
qty | true | string | Order quantity.
|
price | false | string | Order price
|
triggerDirection | false | integer | Conditional order param. Used to identify the expected direction of the conditional order.
|
orderFilter | false | string | If it is not passed, Order by default.
|
triggerPrice | false | string |
|
triggerBy | false | string | Trigger price type, Conditional order param for Perps & Futures. LastPrice, IndexPrice, MarkPrice Valid for linear & inverse |
orderIv | false | string | Implied volatility. option only. Pass the real value, e.g for 10%, 0.1 should be passed. orderIv has a higher priority when price is passed as well |
timeInForce | false | string | Time in force
|
positionIdx | false | integer | Used to identify positions in different position modes. Under hedge-mode, this param is required (USDT perps & Inverse contracts have hedge mode)
|
orderLinkId | false | string | User customised order ID. A max of 36 characters. Combinations of numbers, letters (upper and lower cases), dashes, and underscores are supported. Futures & Perps: orderLinkId rules:
|
takeProfit | false | string | Take profit price, valid for linear & inverse |
stopLoss | false | string | Stop loss price, valid for linear & inverse |
tpTriggerBy | false | string | The price type to trigger take profit. MarkPrice, IndexPrice, default: LastPrice. Valid for linear & inverse |
slTriggerBy | false | string | The price type to trigger stop loss. MarkPrice, IndexPrice, default: LastPrice. Valid for linear & inverse |
reduceOnly | false | boolean | What is a reduce-only order? true means your position can only reduce in size if this order is triggered.
|
closeOnTrigger | false | boolean | What is a close on trigger order? For a closing order. It can only reduce your position, not increase it. If the account has insufficient available balance when the closing order is triggered, then other active orders of similar contracts will be cancelled or reduced. It can be used to ensure your stop loss reduces your position regardless of current available margin. Valid for linear & inverse |
smpType | false | string | Smp execution type. What is SMP? |
mmp | false | boolean | Market maker protection. option only. true means set the order as a market maker protection order. What is mmp? |
tpslMode | false | string | TP/SL mode
|
tpLimitPrice | false | string | The limit order price when take profit price is triggered. Only works when tpslMode=Partial and tpOrderType=Limit. Valid for linear & inverse |
slLimitPrice | false | string | The limit order price when stop loss price is triggered. Only works when tpslMode=Partial and slOrderType=Limit. Valid for linear & inverse |
tpOrderType | false | string | The order type when take profit is triggered. Market(default), Limit. For tpslMode=Full, it only supports tpOrderType=Market. Valid for linear & inverse |
slOrderType | false | string | The order type when stop loss is triggered. Market(default), Limit. For tpslMode=Full, it only supports slOrderType=Market. Valid for linear & inverse |
Place Order . 응답
{
"retCode": 0,
"retMsg": "OK",
"result": {
"orderId": "1321003749386327552",
"orderLinkId": "spot-test-postonly"
},
"retExtInfo": {},
"time": 1672211918471
}
Parameter | Type | Comments |
orderId | string | Order ID |
orderLinkId | string | User customised order ID |
VC++ 에서 Place Order 구현예
/*
2023.10.27
bybit api v5 적용 작업.
응답. api v5 에서는 구버전 대비 주문세부(수량,가격 , 상태등) 정보 제공안되고 orderID , orderLinkId 만 제공.
{
"retCode": 0,
"retMsg": "OK",
"result": {
"orderId": "1321003749386327552",
"orderLinkId": "spot-test-postonly"
},
"retExtInfo": {},
"time": 1672211918471
}
*/
int CCyRestBybit_Spot::Send_OrderNew(CCyD_CyFinOrder::OrderNew* p_order_new)
{
std::string str_post_data;
// 시작. str_post_data 구성.
str_post_data = "{\"category\":\"spot\"";
str_post_data.append(",\"symbol\":\"" + p_order_new->map_para["symbol"] + "\"");
str_post_data.append(",\"side\":\"" + p_order_new->map_para["side"] + "\"");
std::string type = "Limit";
if (p_order_new->map_para["type"].compare("MARKET") == 0) { type = "Market"; }
str_post_data.append(",\"orderType\":\"" + type + "\"");
str_post_data.append(",\"qty\":\"" + p_order_new->map_para["qty"] + "\"");
str_post_data.append(",\"price\":\"" + p_order_new->map_para["price"] + "\"");
//str_post_data.append(",\"timeInForce\":\"PostOnly\"");// 이 설정으로요청하면 주문접수 안됨. 설정하지 않으면 기본 GTC 로되며 정상 접수됨.
str_post_data.append(",\"orderLinkId\":\"" + p_order_new->map_para["orderLinkId"] + "\"}");
//Display_Status_Ext("OrderNew data = ", str_post_data);
// 끝. str_post_data 구성.
// 보안처리.
// 처리1. timestamp+api_key+recv_window+jsonBodyString
std::string timestamp = std::to_string(CyUtilTime::get_time_ms()); // 밀리초 단위의 현재시각.
std::string recv_window = "5000";
std::string str_hmac_input = timestamp + m_ApiKey + recv_window + str_post_data;
// 처리2. HMAC_SHA256
std::string sign = m_CCyUtilSSL.hmac_sha256(m_ApiSecret.c_str(), str_hmac_input.c_str());
// 처리3. http header
std::string http_header = "";
http_header.append("X-BAPI-SIGN: " + sign);
http_header.append("\nX-BAPI-API-KEY: " + m_ApiKey);
http_header.append("\nX-BAPI-TIMESTAMP: " + timestamp);
http_header.append("\nX-BAPI-RECV-WINDOW: " + recv_window);
http_header.append("\nContent-Type: application/json");
// 처리4. http post with header.
std::string result;
m_CCyRestAPI.https_post_header(m_AddressBase + URL_OrderNew_V5, str_post_data, http_header, &result);
rapidjson::Document m_RJDoc;
m_RJDoc.Parse(result.c_str());
if (m_RJDoc.HasParseError())
{
//Display_Status_Ext("CCyRestBybit_Spot::Parsing_Result_Check", "error doc_json parse");
return -1;
}
int ret_code = m_RJDoc["retCode"].GetInt();
if (0 != ret_code) // 0 이면 성공.
{
CString cst_msg(m_RJDoc["retMsg"].GetString());
CString cst_ret_code; cst_ret_code.Format(L"retCode = %d . ", ret_code);
Display_Status_Ext(L"CCyRestBybit_Spot::Send_OrderNew. error message = ", cst_ret_code + cst_msg);
return -2;
}
if (m_RJDoc.HasMember("result") == 0) {
Display_Status_Ext("CCyRestBybit_Spot::Send_OrderNew. error m_RJDoc.HasMember = ", p_order_new->map_para["symbol"] + " No key result");
return -2;
}
return 1;
}
최대 주문 건수
각 종목당 500건.
- Open orders up limit:
Futures: Each account can hold a maximum of 500 active orders simultaneously. This is contract-specific, so the following situation is allowed: the same account can hold 300 BTCUSD active orders and 280 ETHUSD active orders at the same time. For conditional orders, each account can hold a maximum of 10 active orders simultaneously. When the upper limit of orders is reached, you can still place orders with parameters of reduceOnly or closeOnTrigger.
Spot: 500 orders in total, including a maximum of 30 open TP/SL orders, a maximum of 30 open conditional orders
Option: a maximum of 50 open orders
Cancel Order . 주문 취소
HTTP Request : POST /v5/order/cancel |
Cancel Order . 요청
{
"category": "linear",
"symbol": "BTCPERP",
"orderLinkId": null,
"orderId":"c6f055d9-7f21-4079-913d-e6523a9cfffa"
}
Parameter | Required | Type | Comments |
category | true | string | Product type
|
symbol | true | string | Symbol name |
orderId | true | string | Order ID. Either orderId or orderLinkId is required |
orderLinkId | true | string | User customised order ID. Either orderId or orderLinkId is required |
orderFilter | false | string | Valid for spot only. Order,tpslOrder,StopOrder. If not passed, Order by default |
Cancel Order . 응답
{
"retCode": 0,
"retMsg": "OK",
"result": {
"orderId": "c6f055d9-7f21-4079-913d-e6523a9cfffa",
"orderLinkId": "linear-004"
},
"retExtInfo": {},
"time": 1672217377164
}
Parameter | Type | Comments |
orderId | string | Order ID |
orderLinkId | string | User customised order ID |
VC++ 에서 Cancel 구현예
/*
2023.10.27
bybit api v5 적용.
*/
int CCyRestBybit_Spot::Send_OrderCancel(CCyD_CyFinOrder::OrderCancel* p_order_cancel)
{
/// 취소 주문 송신 전에 취소될 대상 주문의 수량 받아두기.필요한 이유 : 봇에서 주문 취소하고 신규주문 낼때 OrderCancel 개체의 수량 정보 활용하여 신규주문 수량 결정함.
if (p_order_cancel->m_str_Side.compare("Buy") == 0) { // 취소대상 주문이 Buy 인것.
p_order_cancel->m_str_qty_orig = p_order_cancel->m_pSymbol->m_pAliveOrders->map_pAliveOrder_Buy[p_order_cancel->m_oid_exchange_cancel_target]->str_Qty; // 원주문 수량.
p_order_cancel->m_str_qty_filled = p_order_cancel->m_pSymbol->m_pAliveOrders->map_pAliveOrder_Buy[p_order_cancel->m_oid_exchange_cancel_target]->str_Qty_Fill;// rj_doc["result"]["executedQty"].GetString();//체결된 수량.
}
else if (p_order_cancel->m_str_Side.compare("Sell") == 0) { // 취소대상 주문이 Sell 인것.
p_order_cancel->m_str_qty_orig = p_order_cancel->m_pSymbol->m_pAliveOrders->map_pAliveOrder_Sell[p_order_cancel->m_oid_exchange_cancel_target]->str_Qty; // 원주문 수량.
p_order_cancel->m_str_qty_filled = p_order_cancel->m_pSymbol->m_pAliveOrders->map_pAliveOrder_Sell[p_order_cancel->m_oid_exchange_cancel_target]->str_Qty_Fill;//체결된 수량.
}
//// 취소주문 개시
std::string str_post_data;
std::string str_symbol = p_order_cancel->m_pSymbol->map_FieldValue["name_api"];
// 시작. str_post_data 구성.
str_post_data = "{\"category\":\"spot\"";
str_post_data.append(",\"symbol\":\"" + str_symbol + "\"");
str_post_data.append(",\"orderId\":\"" + p_order_cancel->m_oid_exchange_cancel_target + "\"}");
// 끝. str_post_data 구성.
// 보안처리.
// 처리1. timestamp+api_key+recv_window+jsonBodyString
std::string timestamp = std::to_string(CyUtilTime::get_time_ms()); // 밀리초 단위의 현재시각.
std::string recv_window = "5000";
std::string str_hmac_input = timestamp + m_ApiKey + recv_window + str_post_data;
// 처리2. HMAC_SHA256
std::string sign = m_CCyUtilSSL.hmac_sha256(m_ApiSecret.c_str(), str_hmac_input.c_str());
// 처리3. http header
std::string http_header = "";
http_header.append("X-BAPI-SIGN: " + sign);
http_header.append("\nX-BAPI-API-KEY: " + m_ApiKey);
http_header.append("\nX-BAPI-TIMESTAMP: " + timestamp);
http_header.append("\nX-BAPI-RECV-WINDOW: " + recv_window);
http_header.append("\nContent-Type: application/json");
// 처리4. http post with header.
std::string result;
m_CCyRestAPI.https_post_header(m_AddressBase + URL_OrderCancel_V5, str_post_data, http_header, &result);
rapidjson::Document rj_doc;
rj_doc.Parse(result.c_str());
if (rj_doc.HasParseError())
{
Display_Status_Ext("CCyRestBybit_Spot::Send_OrderCancel", "error doc_json parse");
Display_Status_Ext("CCyRestBybit_Spot::Send_OrderCancel string all = ", result);
return -1;
}
int ret_code = rj_doc["retCode"].GetInt();
if (0 != ret_code) // 0 이면 성공.
{
CString cst_msg(rj_doc["retMsg"].GetString());
CString cst_ret_code; cst_ret_code.Format(L"retCode = %d . ", ret_code);
Display_Status_Ext(L"CCyRestBybit_Spot::Send_OrderCancel. error message = ", cst_ret_code + cst_msg);
return -2;
}
if (rj_doc.HasMember("result") == 0) {
Display_Status_Ext("CCyRestBybit_Spot::Send_OrderCancel error rj_doc.HasMember NO key result ", p_order_cancel->m_pSymbol->map_FieldValue["name_user"]);
return -2;
}
if (p_order_cancel->m_pSymbol == NULL) return 1; // aliveorder 수정없이 리턴한다는 의미.
if (p_order_cancel->m_pSymbol->m_pAliveOrders == NULL) return 1;// 상동.
//취소된 주문 AliveOrders 에서 제거처리. 웹소켓 order stream 에서 처리하고 있기에 이곳에서 수행하지 않아도 되나, 무결성 위하여 여기서도제거처리 수행.
p_order_cancel->m_pSymbol->m_pAliveOrders->remove_aliveorder(p_order_cancel->m_oid_exchange_cancel_target, p_order_cancel->m_str_Side, p_order_cancel->m_pSymbol->map_FieldValue["CFS_ID"]);
return 2; // aliveorder 에 취소 주문 된것 반영 수정하여 리턴한다는 의미.
}
상위정리
첫 등록 : 2023.10.27
최종 수정 :
단축 주소 : https://igotit.tistory.com/4958
'트레이딩 > 암호화폐' 카테고리의 다른 글
bybit . 웹소켓 . 자바스크립트 실시간 시세 수신 구현 예 (1) | 2023.10.29 |
---|---|
bybit api v5 . 활용방법 정리 (0) | 2023.10.28 |
bybit . API V5 . rest . authentication 처리 (0) | 2023.10.26 |
bybit . API V5 . rest . Get Open Orders (0) | 2023.10.26 |
bybit . API V5 . 웹소켓 . authentication 처리 (0) | 2023.10.26 |
댓글