Trading/암호화폐2020. 12. 19. 22:30

개요 

거래소 바이빗의 USD 종목, USDT 종목 내가 주문 송신한것에 의한 WebSocket 으로 실시간 수신되는 주문응답. 

 

 

 

 

사전준비 

- 파이썬 웹소켓 기본 코딩 달성하고 인증 코딩 까지 달성한 상태. 

 

 

 

 

USD 종목에서의 주문 실시간 정보 

order 실시간 정보 요청 구문. 

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

 

상기 요청 한번만 요청하면 이후 상황 변동 되면 아래와 같은 정보요소들이 json 형식으로 실시간 수신됨. 

Response Parameters

parameter type comments
order_id string Order ID
order_link_id string Order link ID
symbol string Symbol
side string Side
order_type string Conditional order type
price string Order price
qty number Transaction qty
time_in_force string Time in force
create_type string Trigger scenario for single action
cancel_type string Trigger scenario for cancel operation
order_status string Order status
leaves_qty number Number of unfilled contracts from the order's size
cum_exec_qty number Cumulative qty of trading
cum_exec_value string Cumulative value of trading
cum_exec_fee string Cumulative trading fees
timestamp string Commission time
take_profit string Take profit price
stop_loss string Stop loss price
trailing_stop string Trailing stop
trailing_active string Trailing stop active price
last_exec_price string Last execution price

 

{
    "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",
            "last_exec_price": "8300"
        }
    ]
}

 

order_status

  • Created - order accepted by the system but not yet put through matching engine
  • Rejected ; 주문거부
  • New : order has placed successfully
  • PartiallyFilled
  • Filled
  • Cancelled
  • PendingCancel - the matching engine has received the cancellation but there is no guarantee that it will be successful

 

order_status : "Filled" , PartiallyFilled

- PartiallyFilled : 주문수량의 일부만 체결된 경우. 체결 수량은 cum_exec_qty, 체결가 는 last_exec_price  로 최종 체결가 만 제공됨. 

- Filled : 주문 수량 전량 체결된 경우. 체결 수량은 cum_exec_qty, 체결가 는 last_exec_price  로 최종 체결가만 제공됨. 

 

 

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

 

 

 

 

 

수신 데이터 예 

시장가 주문예

- 사용자가 웹에서 시장가 주문한 경우임. 

- symbol : EOSUSD ,

- side : Buy , Sell

- last_exec_price : 3.097 , 3.096 

- qty : 1  (단위 USD)

- order_type : Market ,

- order_status : Filled. ( 주문수량 qty 전량 체결)

- cum_exec_qty : 1 (단위 USD. 주문수량 qty  1과 비교하여 전량 체결여부 확인가능) 

- cum_exec_value : 0.32289312 , 0.32299741 (단위 EOS) 

- cum_exec_fee : 0.00024217 , 0.00024225 (단위 EOS, 수수료 0.075% 에 해당하는 금액임)

- create_type : CreateByUser  

주의 : create_type CreateByUser 의미는 "사용자가 이 주문을 생성했다"의 의미만 있으며 이 주문이 신규 포지션 증가 목적인지 혹은 주문창에서 Reduce-Only 선택하여 기존 포지션 청산 목적의 주문한 것인지 식별수단이 order 이벤트 정보 요소 중에는 없음. 

 

 

 

지정가 주문예

- 사용자가 웹에서 지정가 주문한 경우임. 

 

- symbol : EOSUSD ,

- side :  Sell , Buy

- price : 3.4 , 2.6 

- qty : 3  (단위 USD)

- order_type : Limit ,

- order_status : New  (의미 : 거래소 접수 성공했고 유효한 주문 )

- cum_exec_qty : 0 (단위 USD. ) 

- cum_exec_value : 0  (단위 EOS) 

- cum_exec_fee : 0 (단위 EOS)

- create_type : CreateByUser  

주의 :  실시간 주문정보에는 이 주문이 포지션 청산 목적(Reduce-Only) 주문 인지 정보 제공안되며, 웹에서 Reduce-Only 체크하고 주문해도 수신되는 정보에는 이 주문이 Reduce-Only 주문 여부 정보 제공안됨. 

 

 

취소주문예

- 사용자가 웹에서 지정가 주문을 취소한 경우임. 

 

- order_id : 취소대상 주문의 아이디와 동일함. 즉, 취소주문 자체의 order_id 는 발급되지 않음.

- symbol : EOSUSD ,

- side :  Sell , Buy

- price : 3.4 , 2.6  (취소대상 주문의 가격)

- qty : 3  (단위 USD)

- order_type : Limit ,

- order_status : Cancelled  (의미 : 거래소에서 취소 성공했고 대상 지정가 주문 제거되었음 )

- cancel_type : CancelByUser

- create_type : CreateByUser  

 

 

숏포지션 2usd 를 사용자가 웹에서 시장가 청산 주문 클릭한 경우 수신데이터.

 

- symbol : EOSUSD , 

- side : Buy ,

- last_exec_price : 2.63 

- qty : 2 (단위 USD)

- order_type : Market ,

- order_status : Filled. ( 주문수량 qty 전량 체결)

- cum_exec_qty : 2 (단위 USD. 주문수량 qty  2와 비교하여 전량 체결여부 확인가능) 

- cum_exec_value : 0.76045627 (단위 EOS) 

- cum_exec_fee : 0.00057035 (단위 EOS, 수수료 0.075% 에 해당하는 금액임)

- create_type : CreateByClosing  에서 이 주문은 포지션 청산 주문임을 식별가능.

 

 

 

 

 

 

USDT 종목 에서의 주문 실시간 정보 

 

order 실시간 정보 요청 구문. 

 

ws.send('{"op": "subscribe", "args": ["order"]}')

 

상기 요청 한번만 요청하면 이후 상황 변동 되면 아래와 같은 json 형식의 데이터 실시간 수신됨. 

 

Response Parameters

 

parameter type comments
order_id string Order ID
order_link_id string Order link ID
symbol string Symbol
side string Side
order_type string Conditional order type
price string Order price
qty number Transaction qty
time_in_force string Time in force
order_status string Order status
last_exec_price number Last execution price
cum_exec_qty number Cumulative qty of trading
cum_exec_value string Cumulative value of trading
cum_exec_fee string Cumulative trading fees
create_time string Commission time
update_time string Update time

 

{
    "topic": "order",
    "action": "",
    "data": [
        {
            "order_id": "xxxxxxxx-xxxx-xxxx-9a8f-4a973eb5c418",
            "order_link_id": "",
            "symbol": "BTCUSDT",
            "side": "Buy",
            "order_type": "Limit",
            "price": 11000,
            "qty": 0.001,
            "leaves_qty": 0.001,
            "last_exec_price": 0,
            "cum_exec_qty": 0,
            "cum_exec_value": 0,
            "cum_exec_fee": 0,
            "time_in_force": "GoodTillCancel",
            "create_type": "CreateByUser",
            "cancel_type": "UNKNOWN",
            "order_status": "New",
            "take_profit": 0,
            "stop_loss": 0,
            "trailing_stop": 0,
            "create_time": "2020-08-12T21:18:40.780039678Z",
            "update_time": "2020-08-12T21:18:40.787986415Z"
        }
    ]
}

 

 

 

연관 

 

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

 

 

암호화폐. API. 바이빗. REST , WebSocket

bybit API 개요 - 형식 : REST , WebSocket - bybit 거래소 가입 하여 API 키 발급 받아야 API 적용된 클라이언트 앱에서 활용가능. - 개발가능한 언어 : REST, WebSocket 구현가능한 모든 언어 - C++, 자바스크립..

igotit.tistory.com

 

 

거래소. bybit. 바이빗. 개요. 가입방법. 암호화폐

바이빗 거래소 주요특징. - 거래가능 종목 : - BTCUSD , ETHUSD , EOSUSD , XRPUSD - 최대 레버리지 100 까지 가능 매매자가 레버리지 사용 유무 선택가능. 바이빗 레버리지 상세   - - 장점 : 레버리지 1에서

igotit.tistory.com

 

 

 

 


첫 등록 : 2020.03.17

최종 수정 : 2020.12.19

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

 


 

 

 

 

Posted by 리치굿맨

댓글을 달아 주세요

  1. 안녕하세요. 감사히 잘 보고 있습니다.
    바이빗 API 관련은 참조할 만한 곳이 여기 말고는 없는 것 같네요.
    제 경우 파이썬을 다루지 못해 C#으로 구현 중인데, 웹소켓 첫 인증부터 막히네요.
    파이썬으로 해보면 인증 되던데, C#으로는 아무리 해봐도 안되더군요.
    문서도 찾아보고 구글링 열심해 해봐도 딱히 해결책이 안보이네요.
    바이빗 API 텔레그램에 물어봐도 잘 모르겠다고만 하고...

    제 소스는 다음과 같은데 한 번 봐주시면 감사하겠습니다.
    ================================
    var api_key = "my_api_key";
    var secret = "my_secret_Key";
    var expires = DateTimeOffset.Now.ToUnixTimeMilliseconds() + 1000;
    // Signature
    // src by - https://github.com/bybit-exchange/api-connectors/tree/master/encryption_example
    var signature = CreateSignature(secret, "GET/realtime" + expires);

    // Parameters string
    var url = string.Format("wss://stream.bybit.com/realtime?api_key={0}&expires={1}&signature={2}",
    api_key, expires, signature);
    // Establishing connection
    webSocketBybit = new WebSocket(url);
    webSocketBybit.Connect();

    Console.WriteLine(string.Format("ReadyState=",webSocketBybit.ReadyState);
    ==================================================
    결과:
    ReadyState = Closed

    2020.12.25 19:55 신고 [ ADDR : EDIT/ DEL : REPLY ]
    • 넵 반갑습니다.~

      C# 코드 흐름에서 오류는 없어 보입니다. 현재 구현하신 코드는 소켓접속하면서 인증까지 같이 처리하는 방식인데,,, 혹시 모르니 아래 방식으로 한번 구현해보시는 것도 좋겠습니다.

      1. 인증정보없이 웹소켓접속만 실행.
      2. 상기1의 무인증 접속 성공이 확인된 경우 , 인증정보 송신하여 인증접속수립.

      위와같이 해도 오류 있다면 signature 생성에 오류 있을것으로 예상됩니다.

      저도 파이썬 웹소켓 접속코드에서는 위와 같이 무인증접속부터 먼저 해두고 이후 인증정보를 별도 송신하는 방식으로 구현하고 활용중입니다.
      파이썬 웹소켓 인증접속 코드예 : https://igotit.tistory.com/2675



      기타.
      저는 주로 Python과 VC++ 로 작업 중인데요, 파이썬은 웹소켓통신담당하고, VC++ 로는 REST 담당하는 식으로 구현하고 있습니다. C++ 에서 REST 는 쉽게 구현가능하나, websocket 안정되게 작동하는것 구현하기가 만만치 않더라구요.



      2020.12.26 11:45 신고 [ ADDR : EDIT/ DEL ]
  2. 답변 감사드립니다.

    시그니처는 아래 링크대로 해서 문제가 없는 것 같습니다.
    https://github.com/bybit-exchange/api-connectors/blob/master/encryption_example/Encryption.cs

    파이썬을 다룰 줄 몰라서 겨우 겨우 설치, 시행착오 끝에 확인은 해봤습니다.

    import BybitWebsocket
    위 라이브러리 임포트해서 파이선으로 웹소켓 인증해보면 잘 됩니다.

    그래서 BybitWebsocket 내부 코드에 시그니처 생성하는 부분을 확인 후
    동일한 UTC 값을 넣고 테스트 해봤는데 시그니처는 C#과 똑같이 나왔습니다.

    2. C#은 무인증 접속이 안되더군요.
    안 그래도 웹소켓 접속 후 인증하는 방법이 바이빗 API 문서에 있더라구요.
    하지만 C#에서 웹소켓 접속 후 인증 메시지를 보내는 방법을 모르겠습니다.

    ws = new WebSocket(url); // ReadytState = Conneting
    ws.Send("인증정보"); // 여기서 Open 상태가 아니라며 메시지 전송 자체가 안됩니다.


    파이썬과 c# 을 연동하는 방법도 해봤는데 이것도 만만찮더군요.
    구글링 열심히 하고 시키는대로 해봐도... ㅜ.ㅜ

    2020.12.26 13:27 신고 [ ADDR : EDIT/ DEL : REPLY ]
    • send 에서의 오류 원인이 소켓 open 상태가 아닌것에서 기인한것이면 오히려 간단하게 해결가능한 문제일듯 합니다.

      C# 에서 사용중인 웹소켓 Connect 함수가 동기( 혹은 blocking 이라고도 합니다.) 함수면 소켓 오픈완료 될 때까지 리턴되지 않고 대기하겠지만, 비동기 함수라면 Connect 호출이후 오픈성공여부 무관하게 즉시 리턴되어 이후 실행되는 Send 시점에 소켓이 오픈되어있지 않은 상태일 수 있습니다. Connect 호출이후 Open 성공 할때까지 대기 이후에 Send 호출해야합니다.

      ws = new WebSocket(url);
      ws.Connect(); // 비동기 함수? 동기 함수?

      //상기 Connect 함수가 비동기 함수면 이 지점에서 소켓연결 완료될때까지 대기 요구. Sleep(3초)등.

      if(... ) // websocket connect open 상태이면,
      {
      ws.Send("인증정보");
      }
      else
      {
      // 웹소켓 Connect 실패.
      }

      한편,
      Connect 완료까지의 소요시간이 어느정도 될지모르는데 고정시간 대기 방식은 좋은 코드가 아니므로, 이벤트 방식으로 처리되는게 바람직 합니다.

      Connect 가 비동기 함수라면 웹소켓 커넥터 성공 여부 정보를 제공해주는 이벤트 가 제공될 것이고 사용자 코드에서 콜백함수(C# 에서의 용어로는 델리케이터? 였던거 같네요.. ) 등록해두고 사용하는 방식일겁니다. 해당 이벤트 처리기에서 오픈 성공일때 이후 Send 함수 호출하는 형식으로 구성하면 될 것 같습니다.

      2020.12.26 15:13 신고 [ ADDR : EDIT/ DEL ]
  3. 길고 정성스러운 답변에 감사드립니다.^^
    안타깝지만 Connect는 동기 함수이고 ConnectAsync 라고 따로 비동기 함수가 있긴 합니다.

    아래 소스에서 ws를 생성하면 상태(ReadyState)가 바로 'Connecting' 입니다.
    Connect()를 실행하면 바로 Closed가 되어 버립니다.
    Thread.Sleep(5000) - 5초를 기다려 실행해 봤지만 마찬가지였습니다. ㅜ.ㅜ

    ws = new WebSocket("wss://stream.bybit.com/realtime");
    Console.WriteLine(ws.ReadyState.ToString()); // ReadyState=Connecting 상태

    ws.Connect();
    Console.WriteLine(ws.ReadyState.ToString()); // ReadyState=Closed가 되어 버립니다.

    2020.12.26 18:24 신고 [ ADDR : EDIT/ DEL : REPLY ]
    • 아 넵. ㅠㅠ
      해결대상 문제의 범위가 인증코드처리 문제는 아니고 단순 오류지점 "C# 에서 웹소켓 Connect 정상 작동시키기" 로 압축되었으니, 이 지점에 집중하여 조금 더 디버깅 진행하면 해결되겠죠~.

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

      new WebSocket() 로 생성자 호출만으로도 커넥팅 상태가 되는데,, 이후 Connect 함수를 호출하면 웹소켓 연결이 해제된다..
      하.. 이런류의 작동 오류 보면 반드시 버그 잡아야 직성이 풀립니다. ㅠㅠ

      C# 용 websocket 클라이언트 라이브러리는 어떤 걸 사용하시나요? 저도 한번 설치하고 디버깅 해볼려고요 ^^

      2020.12.26 18:50 신고 [ ADDR : EDIT/ DEL ]
  4. VS에서 WebSocketSharp로 검색하면 제일 처음 나오는 것입니다.
    이걸로 업비트는 잘 되더라구요.

    WebSocketSharp-netstandard
    작성자: sta
    버전: 1.01

    2020.12.26 19:13 신고 [ ADDR : EDIT/ DEL : REPLY ]
    • WebSocketSharp 라이브러리 기반 bybit 접속 시험해보니, 결론적으로 WebSocketSharp 의 Connect 함수가 모든 웹소켓서버의 프로토콜에 대응하지 못하여 TLS handshake 오류 가 발생하여 Connect 실패하고 있었습니다. Connect 가 성공해야만 ReadyState=Open 상태가 되고 정상통신 가능하므로 이 TLS handshake 문제를 해결하면 됩니다.

      해결책
      https://igotit.tistory.com/2739 의 내용중 하단에 소제목 : Connect 실행시 발생하는 TLS handshake 오류 해결.
      부분에 정리해뒀습니다.
      핵심 수정 지점은 Connect 호출이후 오류발생하여 연결 끊긴 경우 호출되는 이벤트핸들러 ws.OnClose 내에 프로토콜 변경하고 재접속하도록 한 부분 입니다.

      2020.12.26 22:55 신고 [ ADDR : EDIT/ DEL ]
  5. 대단하시네요. 그렇게 금방 찾아내시다니... 감사합니다. 덕분에 큰 진전이 있네요.

    사실 라이러브리 이야기를 하실때 깜짝 놀랐었죠. 원래 VS에 내장된 클래스라고 착각하고 있었거든요.
    다른 여러 곳에 신경 쓰느라 라이브러리를 설치한 것을 까맣게 잊고 있었습니다. 아직 초보 수준이라 그런 것도 있었겠지만...

    하여튼 시험삼아 다른 라이브러리를 설치하고(websocket-sharp.clone v3.0.0), 바이빗 웹소켓 주소만 넣은 뒤,
    Connect().Wait()를 사용하니 바로 Open 상태가 되더군요. ㄷㄷ...
    그 뒤 인증 시도를 하니 바로 거짓말처럼 성공했습니다.
    몇 일 애먹인 것이 리치굿맨님과의 질의 끝에 힌트를 얻고, 간단히 해결되니 어이가 없어지네요. ㅋ

    요즘같은 세상에, 지나가다시피 하는 사람의 질문에 성의있게 대답해주시고,
    끝까지 해결에 힘을 써준 것에 참으로 감사하다는 마음을 전하고 싶습니다.
    연말 마무리 잘하시고 미리 새해 인사를 전합니다.
    새해 복많이 받으세요.^^;

    2020.12.27 09:55 신고 [ ADDR : EDIT/ DEL : REPLY ]

    • 넵 감사합니다.~

      websocket-sharp v3.0.0 에서는 문제해결된 것이 배포되고 있군요 다행입니다.~

      동병상련이라고.. 코딩하다보면 개발자 본인의 로직 오류가 아닌 도입한 라이브러리의 오류 등에 의한 얄궂은 버그가 최악의 상황입니다. 그 찝찝하고 답답한 마음을 잘 알고 있기에.. ^^

      넵 다음 단계 진행 고고~

      2020.12.27 11:51 신고 [ ADDR : EDIT/ DEL ]
  6. 궁금합니다.

    실시간 정보를 불러오는것만 하시는데, 이걸로 주문을 넣는건 어떻게 하나요?

    2021.09.06 05:12 [ ADDR : EDIT/ DEL : REPLY ]
    • 아, 스스로 해결했습니다. 찾아보다가 발견 했던게 안 되는터라 물어본거였는데, api 설정을 실수로 읽기전용을 선택해서 안 되던거였네요ㅋㅋㅋㅋㅋㅋ

      2021.09.06 05:51 [ ADDR : EDIT/ DEL ]