본문 바로가기
트레이딩/암호화폐

암호화폐. API. bybit. 주문 코딩규칙. http request post & response.

by 리치굿맨 2020. 4. 15.

개요 

암호 화폐 거래소 bybit 에서 제공하는 API 중에서 주문 관련 정리. 

주문 송신은 REST 형식으로 신규, 정정, 취소 주문 제공되며,

주문한 것의 체결 정보등은 WebSocket 형식으로 실시간 이벤트 수신처리가능하다. 

 

주문관련 무결성 코딩

코드상에서 REST 요청으로 주문한 경우 응답으로 알 수 있는 정보(주문의 정상접수, 거절) 및 WebSocket 으로 수신되는 실시간 상태 (체결여부, 강제 청산 여부 등) 확인하고 다음 로직을 진행하는 식으로 구현 해야 무결성 달성된다. 이때 주문 발행시 응답데이터 중에 order_id 와  websocket 으로 제공되는 order_id 이용하여 주문 식별 처리한다.  

 

 

 

REST Base Endpoint 

 

실거래 서버 : https://api.bybit.com

모의거래 서버 : https://api-testnet.bybit.com

 

신규 주문

POST : /v2/private/order/create

                                                     

parameter required type comments
side true string Side
symbol true string Contract type
order_type true string Active order type
qty true integer Order quantity in USD. Integer only
price false number Order price. Required if you make limit price order
time_in_force true string Time in force
take_profit false number Take profit price, only take effect upon opening the position
stop_loss false number Stop loss price, only take effect upon opening the position
reduce_only false bool Reduce only
close_on_trigger false bool Close on trigger. When creating a closing order, we highly recommend close_on_trigger is set as True to avoid failing by insufficient available margin
order_link_id false string Customised order ID, maximum length at 36 characters, and order ID under the same agency has to be unique.

 

인자 -reduce_only

reduce_only 값을 true 로 하면 기보유 포지션 청산(= Close , Exit)  주문임. 

false 로 하면 포지션 증가 시키는 진입(= Open, Entry) 주문. 

 

 

 

response 

{
    "ret_code": 0,
    "ret_msg": "OK",
    "ext_code": "",
    "ext_info": "",
    "result": {
        "user_id": 1,
        "order_id": "335fd977-e5a5-4781-b6d0-c772d5bfb95b",
        "symbol": "BTCUSD",
        "side": "Buy",
        "order_type": "Limit",
        "price": 8800,
        "qty": 1,
        "time_in_force": "GoodTillCancel",
        "order_status": "Created",
        "last_exec_time": 0,
        "last_exec_price": 0,
        "leaves_qty": 1,
        "cum_exec_qty": 0,
        "cum_exec_value": 0,
        "cum_exec_fee": 0,
        "reject_reason": "",
        "order_link_id": "",
        "created_at": "2019-11-30T11:03:43.452Z",
        "updated_at": "2019-11-30T11:03:43.455Z"
    },
    "time_now": "1575111823.458705",
    "rate_limit_status": 98,
    "rate_limit_reset_ms": 1580885703683,
    "rate_limit": 100
}

 

ret_code, ext_code 의미. 

ret_code ext_code 주문성공여부.
0 "" 성공 
0 != "" 주문생성은 했으나 , 파라메타셋팅에 실패. 
!= 0   실패

ext_code 값이 "" 이 아닌 경우 상세 정보 확인 : bybit-exchange.github.io/docs/linear/#t-errors

 

 

 

 

 

취소 주문

POST : /v2/private/order/cancel

 

parameter required type comment 
symbol true string Contract type
order_id false string Order ID. Required if not passing order_link_id
order_link_id false string Agency customized order ID. Required if not passing order_id

response

{
    "ret_code": 0,
    "ret_msg": "OK",
    "ext_code": "",
    "ext_info": "",
    "result": {
        "user_id": 1,
        "order_id": "3bd1844f-f3c0-4e10-8c25-10fea03763f6",
        "symbol": "BTCUSD",
        "side": "Buy",
        "order_type": "Limit",
        "price": 8800,
        "qty": 1,
        "time_in_force": "GoodTillCancel",
        "order_status": "New",
        "last_exec_time": 0,
        "last_exec_price": 0,
        "leaves_qty": 1,
        "cum_exec_qty": 0,
        "cum_exec_value": 0,
        "cum_exec_fee": 0,
        "reject_reason": "",
        "order_link_id": "",
        "created_at": "2019-11-30T11:17:18.396Z",
        "updated_at": "2019-11-30T11:18:01.811Z"
    },
    "time_now": "1575112681.814760",
    "rate_limit_status": 98,
    "rate_limit_reset_ms": 1580885703683,
    "rate_limit": 100
}

 

 

 

취소주문 - 모두 

POST : /v2/private/order/cancelAll

 

 

parameter required type comment
symbol true string Contract type

 

response

{
    "ret_code": 0,      
    "ret_msg": "OK",    
    "ext_code": "",     
    "ext_info": "",
    "result": [
        {
            "clOrdID": "89a38056-80f1-45b2-89d3-4d8e3a203a79",  
            "user_id": 1,                                  
            "symbol": "BTCUSD",                                
            "side": "Buy",                                      
            "order_type": "Limit",                              
            "price": "7693.5",                                  
            "qty": 1,                                           
            "time_in_force": "GoodTillCancel",                  
            "create_type": "CreateByUser",                     
            "cancel_type": "CancelByUser",                      
            "order_status": "",                                 
            "leaves_qty": 1,                                    
            "leaves_value": "0",                                
            "created_at": "2019-11-30T10:38:53.564428Z",        
            "updated_at": "2019-11-30T10:38:59.102589Z",        
            "cross_status": "PendingCancel",  // `PendingCancel` means the matching engine received the cancellation but there is no guarantee that the cancellation will be successful.
            "cross_seq": 387734027                              
        }
    ],
    "time_now": "1575110339.105675",
    "rate_limit_status": 98,
    "rate_limit_reset_ms": 1580885703683,
    "rate_limit": 100
}

 

정정 주문 

 

POST : /open-api/order/replace

 

parameter required type comment
order_id true string Your active order ID. The unique order ID returned to you when the corresponding active order was created
symbol true string Contract type.
p_r_qty false int New order quantity. Do not pass this field if you don't want modify it
p_r_price false number New order price. Do not pass this field if you don't want modify it

 

response 

{
    "ret_code": 0,    //Error code,
    "ret_msg": "ok",  //Error message,
    "ext_code": "",
    "result": {
        "order_id": "efa44157-c355-4a98-b6d6-1d846a936b93"
    },
    "time_now": "1539778407.210858",    // UTC timestamp
    "rate_limit_status": 99, // The remaining number of accesses in one minute
    "rate_limit_reset_ms": 1580885703683,
    "rate_limit": 100             
}

 

 

 

 

 

response 데이터 항목 상세

 

 

Create type (create_type)

  • CreateByUser
  • CreateByClosing
  • CreateByAdminClosing
  • CreateByStopOrder
  • CreateByTakeProfit
  • CreateByStopLoss
  • CreateByTrailingStop
  • CreateByLiq - Created by partial liquidation
  • CreateByAdl_PassThrough - Created by ADL
  • CreateByTakeOver_PassThrough - Created by liquidation takeover

 

Order status (order_status)

Filter fetched orders by their order statuses. To filter by multiple statuses, separate with a comma like so: Filled,New

  • Created
  • Rejected - order is triggered but fail to be placed
  • New
  • PartiallyFilled
  • Filled
  • Cancelled
  • PendingCancel - The matching engine has received the cancellation but there is no guarantee that it will be successful

 

Order type (order_type)

  • Limit
  • Market

Symbol (symbol)

  • BTCUSD
  • ETHUSD
  • EOSUSD
  • XRPUSD

 

Time in force (time_in_force)

  • GoodTillCancel
  • ImmediateOrCancel
  • FillOrKill
  • PostOnly

 

 

from : https://bybit-exchange.github.io/docs/inverse/#t-placev2active

 

////////////////////////////////////////////////////////

 

 

Query Active Order 

- 종목1개의 order_id 1개의 정보 요청. 

 

GET /v2/private/order

 

Response Example

{
    "ret_code": 0,
    "ret_msg": "OK",
    "ext_code": "",
    "ext_info": "",
    "result": {
        "user_id": 1,
        "symbol": "BTCUSD",
        "side": "Sell",
        "order_type": "Limit",
        "price": "8083",
        "qty": 10,
        "time_in_force": "GoodTillCancel",
        "order_status": "New",
        "ext_fields": {
            "o_req_num": -308787,
            "xreq_type": "x_create",
            "xreq_offset": 4154640
        },
        "leaves_qty": 10,
        "leaves_value": "0.00123716",
        "cum_exec_qty": 0,
        "reject_reason": "",
        "order_link_id": "",
        "created_at": "2019-10-21T07:28:19.396246Z",
        "updated_at": "2019-10-21T07:28:19.396246Z",
        "order_id": "efa44157-c355-4a98-b6d6-1d846a936b93"
    },
    "time_now": "1571651135.291930",
    "rate_limit_status": 99, // The remaining number of accesses in one minute
    "rate_limit_reset_ms": 1580885703683,
    "rate_limit": 100
}

 

 

http request 로 주문정보 받기 상세 

 

암호화폐. API. bybit. 나의 주문 정보 받기. http request

개요 - 바이빗의 USD 종목 , USDT종목의 내 주문정보 HTTP Request 로 받기. USD 종목 의 주문정보 받기 HTTP Request GET /v2/private/order Request Parameters parameter required type comments order_id fals..

igotit.tistory.com

 

 

 

 

////////////////////////////////////////////////////////// 

 

WebSocket 형식으로 주문관련 실시간 수신 가능한 데이터. 

 

2개의 토픽 order , execution  제공. 

 

order 

 

요청 : websocket 의 send('{"op": "subscribe", "args": ["order"]}')

- 1회만 실행하면 이후 아래 데이터 자동으로 수신됨.

 

Response Example


{
    "topic": "order",
    "data": [
        {
            "order_id": "xxxxxxxx-xxxx-xxxx-9a8f-4a973eb5c418",
            "order_link_id": "",
            "symbol": "BTCUSD",
            "side": "Sell",
            "order_type": "Market",
            "price": "8579.5",
            "qty": 1,
            "time_in_force": "ImmediateOrCancel",
            "create_type": "CreateByClosing",
            "cancel_type": "",
            "order_status": "Filled",
            "leaves_qty": 0,
            "cum_exec_qty": 1,
            "cum_exec_value": "0.00011655",
            "cum_exec_fee": "0.00000009",
            "timestamp": "2020-01-14T14:09:31.778Z",
            "take_profit": "0",
            "stop_loss": "0",
            "trailing_stop": "0",
            "trailing_active": "0",
            "last_exec_price": "8300"
        }
    ]
}

 

order 타입의 websocket 수신 정보 상세 별도정리. 

 

암호화폐. API. bybit. 나의 주문 정보 실시간 받기. websocket

개요 거래소 바이빗의 USD 종목, USDT 종목 내가 주문 송신한것에 의한 WebSocket 으로 실시간 수신되는 주문응답. USD 종목에서의 주문 실시간 정보 order 실시간 정보 요청 구문. websocket.send('{"op": "subsc

igotit.tistory.com

 

 

 

execution 

- 주문 한것의 체결정보 실시간. 

요청 : websocket 의 send('{"op": "subscribe", "args": ["execution"]}'

- 1회만 실행하면 이후 아래 데이터 자동으로 수신됨.

 

Response Example

{
    "topic": "execution",
    "data": [
        {
            "symbol": "BTCUSD",
            "side": "Buy",
            "order_id": "xxxxxxxx-xxxx-xxxx-9a8f-4a973eb5c418",
            "exec_id": "xxxxxxxx-xxxx-xxxx-8b66-c3d2fcd352f6",
            "order_link_id": "",
            "price": "8300",
            "order_qty": 1,
            "exec_type": "Trade",
            "exec_qty": 1,
            "exec_fee": "0.00000009",
            "leaves_qty": 0,
            "is_maker": false,
            "trade_time": "2020-01-14T14:07:23.629Z" // trade time
        }
    ]
}

 

 

 

상위

 

 

암호화폐 매매 정보 정리.

가격 단위 : 달러 - 암화폐거래소. - 암호화폐 API . - 접근성 좋은 거래소 쾌적한 매매 환경 - 유동성 풍부. 변동성 양호. - 완전한 연속거래시장. 거래 휴일 없음. - 암호화폐 매매 관련 정보 정리

igotit.tistory.com

 


첫 등록 : 2020.03.18

최종 수정 : 

단축 주소 : https://igotit.tistory.com/2493

 


 

 

 

 

 

 

 

 

 

 

댓글10

  • 안녕하세요? 2020.09.18 16:33

    지금보니 생각보다 어렵지 않네요. 저는 밑에 response example을 쳐서 코딩해야 하는 줄 알고 api는 쳐다도 안봤는데 생각보다 할만하네요.
    답글

  • Favicon of https://moonbug.tistory.com BlogIcon 마음거울 2020.12.31 10:15 신고

    안녕하세요. 몇 일전에 웹소켓 문제로 크게 도움을 받았던 사람입니다.
    간단한 조회는 되길래 술술 풀리나 했는데 이제 주문이 안되는 군요.
    API 문서와 구글링, 파이선 등을 들여다봐도 구체적인 방법이 안 나오네요.
    여기를 읽고 C#으로 아래처럼 조합해봐도 아래 오류만 발생하네요.

    "원격 서버에서 (404) 찾을 수 없음 오류를 반환했습니다."

    혹시나해서 json으로 조합해도 안되더군요.
    몇 일동안 찾아봐도 답이 안 보이네요. 초보는 서럽습니다. ㄷㄷ

    // 이렇게 조합을 했습니다.
    https://api.bybit.com/v2/private/order/create?api_key="my_api_key"&side=Buy&symbol=BTCUSD&order_type=Limit&qty=1&price=10000&time_in_force=GoodTillCancel&timestamp=1609374271313&sign="xxxxxxxxxxx"
    답글

  • Favicon of https://moonbug.tistory.com BlogIcon 마음거울 2020.12.31 10:17 신고

    아래 C# 코드입니다.
    한 번 봐주시면 감사하겠습니다.

    WebClient wcBybit = new WebClient();
    wcBybit.Encoding = Encoding.UTF8;

    // 혹시나해서 헤더 추가해봤지만, 있으나 없으나 결과는 같았습니다.
    wcBybit.Headers.Add("Content-Type: application/json");

    // 조회는 +200 하니 잘되더군요.
    var utc = DateTimeOffset.Now.ToUnixTimeMilliseconds() + 200;

    // 파라미터
    string param = string.Format("api_key={0}&side={1}&symbol={2}&order_type={3}&qty={4}&price={5}&time_in_force={6}&timestamp={7}",
    "my-api_key", "Buy", "BTCUSD", "Limit", 1, 10000, "GoodTillCancel", utc);

    // 바이빗 시그니처 생성
    var sign = CreateSignature(GV.BybitSecretKey, param);

    // 최종 조합
    string sendMsg = string.Format("{0}{1}&sign={2}", "https://api.bybit.com/v2/private/order/create?", param, sign);

    // 마지막 문장이 아무리 해도 티스토리에 써지질 않네요. 메소드를 한글로 적었습니다.

    // 여기서 404 오류
    string json = wcBybit.다운로드스트링(sendMsg);
    답글

    • Favicon of https://igotit.tistory.com BlogIcon 리치굿맨 2020.12.31 14:02 신고

      주문 구문 구성은 정상입니다. 저 같은 경우엔 아래 2개의 파라메타도 기본 포함시켜서 구성합니다.
      reduce_only, close_on_trigger
      신규주문(포지션 증가시키는 주문) 인 경우엔 이 2개의 값은 모두 False 로 하고, 청산 목적의 주문인 경우엔 이 2개의 값을 모두 True 로 하여 요청합니다. 이 2개 파라메타는 필수는 아니므로 오류요인은 아닐 것이고,,.. 아래 2가지 정도 점검해볼 필요 있겠습니다.

      체크 포인트.

      체크1. 주문요청은 Get 이 아닌 Post 로 요청해야 합니다.
      즉, wcBybit.다운로드스트링() ; <- 이 함수의 실제 내부 처리가 http "post" 요청이어야 정상 주문 실행됩니다
      .

      체크2. 본인 PC 의 인터넷 시간동기화.
      - 윈도우 우하단 시계 우 클릭해서 날짜/시간 조정 -> 시계동기화 에서 버튼 지금동기화 클릭.


    • BlogIcon 파라미터 2021.03.13 10:39

      reduce_only, close_on_trigger를 켜면 평단가가 꼬이지 않나요? 무조건 진입과 동시에 청산 주문도 넣음으로써 그 문제를 해결하는 것인가요!?

    • BlogIcon 파라미터 2021.03.13 10:39

      reduce_only, close_on_trigger를 켜면 평단가가 꼬이지 않나요? 무조건 진입과 동시에 청산 주문도 넣음으로써 그 문제를 해결하는 것인가요!?

  • Favicon of https://moonbug.tistory.com BlogIcon 마음거울 2021.01.01 00:50 신고

    무엇이 문제인지 한 방에 짚어내시네요.
    Get과 Post의 차이도 모르고 도전을 하고 있으니... 쩝... ㅋ_ㅋ;;;
    리치굿맨님의 한 마디로 엄청난 시간이 단축되는군요.^^

    WebClient에 UploadString이라는 Post 메소드가 있더군요.
    덕분에 404 오류는 더 이상 뜨지 않습니다.
    다만, 진전은 있었는데 아직은 성공하지 못했습니다.


    json 파라미터 문자:
    {"api_key":"my_api_key","side":"Buy","symbol":"BTCUSD","order_type":"Limit","qty":1,"price":15000,"time_in_force":"GoodTillCancel","timestamp":1609427354804,"sign":"xxxxxxxxxxxxxxxx..."}

    결과:
    {"ret_code":10004,"ret_msg":"error sign! origin_string[api_key=my_api_key\u0026order_type=Limit\u0026price=15000\u0026qty=1\u0026side=Buy\u0026symbol=BTCUSD\u0026time_in_force=GoodTillCancel\u0026timestamp=1609427354804]","ext_code":"","ext_info":"","result":null,"time_now":"1609427354.918272"}


    위와 같은 시그니처 에러가 계속해서 뜨는데
    시간을 100~1000까지 조정해봐도 같은 오류 발생,
    1000을 넘어가면 아예 잘못된 요청이라고 나오네요.

    시간 동기화는 제 PC 시간이 하루에도 2초 이상 차이가 벌어져서
    SP Timesync라는 프로그램으로 10분마다 동기화를 시켜주고 있습니다.
    포지션, 주문 조회 등은 잘되는 걸 보면 동기화 문제는 없어 보입니다.


    파라미터 문자를 시그니처로 만들 때

    "{"api_key":"... ... "timestamp=":1609427354804}"

    윗부분까지 넣어서 만드는 것이 맞는 걸로 알고 있습니다.

    파라미터는 json이 아니면 안되더군요. JObject를 이용해 만들었습니다.
    =====================================
    // JObject 방식 - Newtonsoft.Json
    JObject jo = new JObject {
    { "api_key", "my_api_key" },
    { "side", "Buy" },
    { "symbol", "BTCUSD" },
    { "order_type", "Limit" },
    { "qty", 1 },
    { "price", 15000 },
    { "time_in_force", "GoodTillCancel" },
    { "timestamp", utcPC } // utcPC=현재시간+1000
    };

    string param = JsonConvert.SerializeObject(jo); // JObject를 문자열로
    sign = CreateSignature("my_secret_key", param);

    jo.Add("sign", sign); // 생성한 시그니처를 더하고
    param = JsonConvert.SerializeObject(jo); // 다시 문자열로

    string json = webClient.UploadString("https://api.bybit.com/v2/private/order/create", param); // Post

    Console.WriteLine(json); // 결과 출력
    =====================================

    무엇이 원인인지 짐작이 가는 부분이 있을까요?
    감사합니다.
    답글

    • Favicon of https://igotit.tistory.com BlogIcon 리치굿맨 2021.01.02 00:13 신고

      제가 C++ rest 에는 익숙한데 C#의 rest 관련으로는 전문성이 부족하다보니... 뭐라 명확한 방향을 제시하긴 애매하긴 한데요 ,, 다소 이상하게 보이는 부분은 코드상에서 webClient 는 websocket 으로 생성한 개체(객체) 아니었던가요? 웹소켓 개체로 rest 호출하는 부분이 좀 이상하게 보이는 중입니다. 이 지점 점검할 필요가 있지 않을까 ? 하는 생각이 듭니다.

  • Favicon of https://moonbug.tistory.com BlogIcon 마음거울 2021.01.02 11:05 신고

    wcBybit = new WebClient();
    WebSocket을 사용한 소스는 보이지 않는데요?

    사실, 질문이 애매해서 답변하시기도 어려울 겁니다. 한참을 고심해도 어떻게 질문해야 할지 어렵더군요.
    그래도 답답한 마음에 올렸더랬습니다.
    Post를 이용한 방식은 위 방식 말고도, 구글링해서 아래처럼 여러가지를 시도해봤습니다.

    WebClinet의 NameValueCollection
    System.Net.Http.HttpClient 방식
    HttpWebRequest와 WebRequest, HttpWebResponse 방식

    공통점은 모두 error sign!
    파라미터 설정 혹은, 시그니처 생성과정이 잘못되었을 가능성이 가장 높은 것 같습니다.
    아직 구글링해보니 몇가지 더 시도해볼 방법이 있는 것 같습니다.
    연구를 더 해봐야 할 것 같습니다.

    서버와 클라이언트의 간의 프로그래밍은
    사실 몇가지 문자열, 혹은 정보를 주고 받는 것이 다인데 이 과정이 너무 어렵게 되어있네요.
    왜 이렇게 까다로운지 어이없기도 하고...

    답답한 마음에 그냥 넋두리 한 번 해봤습니다. ㅋ
    감사합니다.
    답글

  • 익명 2021.01.18 10:41

    비밀댓글입니다
    답글


   
현물 |선물 인버스 |선물 USDT     현물 | 선물 USDT |봇제작툴/카피트레이딩     현물 |선물 인버스 |선물 USDT     선물 인버스 |선물 USDT