2. 해외선물/2-4. 해외선물 API (사용)

(키움증권 해외선물 OpenAPI-W) CommRqDATA 및 SendOrder 함수의 호출 제한

봄이오네 2023. 1. 29. 08:09
반응형
목 차
1. 들어가며
2. 제한사항
   1) CommRqData 함수
   2) SendOrder 함수 조회제한
   3) CommRqData 와 SendOrder 관계
3. 그외 제약사항
1) 시장에 맞는 거래방법은?
2) 거래횟수 및 수수료
4. 마치며

 

1. 들어가며

OpenAPI-W를 활용하여 키움증권 서버에 접속하고 거래를 할 때 일부 제한사항이 있다. 프로그램 코드를 설명하기 전에 어떤 제한사항이 있는지 먼저 알아보고, 현명하게 대처하는 방법을 알아보자.

접속제한 및 거래시 발생할 수 있는 제약사항 등을 설명할 것이다.

 

키움측에서는 서버에 과부하를 일으키는 행위에 대해 접속제한 및 재로그인의 방법을 쓰고 있다.

"서버에 과부하"를 일으키는 행위는 구체적으로 설명하지는 않지만, 그 사례를 찾아보면 "체결되지 아니한 주문을 지속적으로 요청"하는 행위 등을 말하고 있다.


2. 제한사항

서버 접속 제한은 크게 CommRqData 함수 및 SendOrder 함수2가지로 이루어진다.

 

1) CommRqData 함수

CommRqData 함수는 TR 목록을 키움서버에 요청하여 데이터를 가져오는 기능을 한다. 키움서버에 데이터를 요청하는 방법은 아래와 4가지 방법(입력-요청-연결-수신)으로 설명할 수 있다.

  • 데이터 입력 : 키움서버에 데이터 입력(SetInputValue 함수)을 통해 문자형 2가지 데이터를 입력한다. 
  • 데이터 요청 : 키움서버에 데이터 입력(CommRqData 함수)을 통해 문자형 4가지 데이터를 요청한다.
  • 함수 연결     : 키움서버에 CommRqData 함수가 요청되면 결과를 제공하는 이벤트가 발생하는데, OnReceive함수를 활용하여 CommRqData와 데이터를 수신받는 GetCommData함수로 연결한다. 
  • 데이터 수신 : 키움서버에서 "결과 제공 이벤트"가 반환되면, 데이터를 수신(GetCommData)받는다.

여기서 중요한 것은 데이터요청(CommRqData 함수)이다.

< 그림1 >은 국내주식의 KOA Studio에 나와있는 내용이다. (경로 : KOA Studio > 개발가이드 > 자주 묻는 질문 > 키움OpenAPI 개발/구현 중입니다)

 

국내주식의 KOA Studio의 내용을 가져오는 것은 적절하지 않으나, 해외선물의 WKOA Studio에는 < 그림1 > 과 같은 설명이 없다. 

그림1. KOA Studio에 나와있는 초당 조회제한

 

< 그림2 >는 해외선물의 CommRqData 함수의 호출제한 횟수를 설명한다.

주목할 것은 초당 5건의 조회이다. 1초당 5회까지는 가능하고, 6회 조회시 제한이 걸린다.

CommRqData 호출제한은  초당 5회 초과이다.

 

그림2. 해외선물API의 CommRqData함수 조회 제한

 

2) SendOrder 함수 조회제한

< 그림1 >에서 확인하였듯이, SendOrder 함수도 초당 5회 초과한 경우 조회를 제한한다. CommRqData 함수와 설명와 유사하므로 별도의 설명은 여기에서 생략한다.

 

3) CommRqData 와 SendOrder 제한 관계

< 그림1>에서 설명한 내용대로 각각 독립되게 카운팅을 하고 있다. 즉 CommRqData 와 SendOrder함수는 서로 합산하여 조회를 제한하지 않는다는 것이다.

즉, 1초당 CommRqData는 3회 요청, SendOrder 3회 요청하여도 접속제한 되지 않음 (합산하지 않음)


3. 그외 제약사항

키움측에서는 위의 CommRqData 와 SendOrder 함수에 대한 제한을 말한다.

여기서는 사용자가 고민해야될 내용을 설명한다.

 

1) 시장에 맞는 거래방법은?

주식과 선물이 어려운건, 상승장/하락장/횡보장이 각각 존재한다.

상승장에서 short, 하락장에서 long, 횡보장에서 지나친 단타 등은 계좌 내 자산을 깍아먹는 요소임에 분명하다.

 

분명 고민을 해야 하는 것은, 지금이 상승/하락장인건지 알아야 그에 맞는 코드를 작성하게 되는데, 오늘이 상승/하락/횡보장인지는 장이 끝나봐야 안다는 것이다.

 

쉽게 이야기하면, 상승장인데 하락장의 코드를 적용할지, 하락장인데 상승장에서 작성한 코드를 적용할지...

여기서 시장에 맞지않는 "코드"를 적용하는 등 엇박자가 나면... 계좌를 보면서 한숨만 쉴 것이 분명하다.

 

무림에 절대무공이 없듯이, 코드를 작성하면 어느정도의 타협(?)은 필요할 것으로 생각된다.

필자는 횡보장을 가정하여 코드를 작성할 것이다. 그리고 변동이 심한 21시 이후로는 프로그램 돌리는 것을 자제하는 것을 생각하고 있다.

 

2) 거래횟수 및 수수료

거래횟수와 수수료는 비례관계에 있다. 우리가 해선을 통해 손실이 나는 주요 요소 중 하나는 분명 수수료임을 확인할 수 있을 것이다. 거래를 위해서는 진입/청산을 하는데, 기하급수적인 매매는 수수료 폭탄을 맞을 수도 있다.

 

하루에 몇번 정도의 거래가 적당할까? 혹은 퇴근 후 또는 잠을 잘때도 자동매매를 할 것인가?

필자도 상당히 고민하고 있다.

 

비대면계좌로 키움의 수수료 할인 이벤트에 참석하여 API 수수료는 2.3달러로 할인을 받고 있긴 한데, 감당가능한 매매 횟수는 몇 번으로 정할 것인가? 고민이다.

 

필자가 생각하는 코드는 볼린저밴드 상단 + rsi 70 일때 short을 치는 것인데,

하필 상승장으로 2시간이상 상승하는 상태이고, 1회 진입하여 손절을 쳤는데 또 들어간다면...

손해는 손해대로 보고 수수료는 수수료대로 나가는 최악의 상황이 올 수도 있다.

1회 청산 후 5분간 대기(time.sleep)를 통해 시장의 추세를 살펴보는 것도 나쁘지 않아보인다.

(필자는 20분 이내 익절, 손절, 횡보시 20분 초과시 시장가 청산 3가지로 가정하면서 코드를 작성할 예정이다)

 

정리하면, 수수료할인은 왠만하면 받도록 하고, 이상적인 거래횟수도 사용자 스스로 생각할 필요가 있다.


4. 마치며

CommRqData 와 SendOrder 함수의 조회제한 및 시장상황, 수수료 등의 제약요소에 대해 알아보았다.

필자는 TR 요청을 이용하여 매매할 것이다. 그래서 1초 내 CommRqData의 실행횟수가 정말 중요할 것으로 생각된다.

 

지금까지는 해외선물 자동매매시 발생할 수 있는 변수에 대해 알아보았다.

다음시간에는 볼린저밴드의 상단/하단 값을 구하는 방법에 대해 알아보자.

반응형