PYTHON/Kiwoom Open API

키움증권 Open API - 거래 내역 조회하기 (1)

  • -

키움증권 Open API의 경우에는 주문이나 차트 데이터 조회 등과 같은 것들에 대해서는 정말 손쉽게 사용할 수 있도록 친절하게 설명하고 있지만, 문제는 주문 내역을 관리하기 위해 주문일자를 제공한다거나 하는 등의 데이터는 잘 제공하지 않고 있다.
※ 키움증권 Open API 관계자가 이 글을 볼 리는 없지만, 만약 본다면 이 부분은 꼭 추가해주길 바랍니다.

본격적으로 거래 내역을 조회하기 전에 앞서, 일단 여기서 사용하고자 하는 트랜잭션(Transaction, 이하 TR)은 opw00007이다. opw00007을 사용하기 위해서는 계좌와 관련된 데이터를 전달해줘야 하는데, 계좌 데이터는 직접 입력을 해주어도 되고 다른 TR을 이용해서 계좌 데이터를 얻어온 후에, 그 데이터를 그대로 전달해줘도 된다.

 

 

OPW00007 알아보기

위의 사진을 통해 확인할 수 있듯이, 주문일자, 계좌번호, 계좌 비밀번호, 비밀번호입력매체구분, 조회구분, 주식채권구분, 매도수구분, 종목코드, 시작주문번호와 같이 총 9개의 데이터를 입력해줄 것을 요구하고 있긴 하나 그런 것들은 다 차치하고 우리가 이 OPW00007을 통해 확인하고자 하는 정보는 여태까지의 거래 내역이기 때문에 실제로 입력해줄 데이터는 주문일자, 계좌번호, 계좌비밀번호, 종목코드 총 4개이다.

 

 

OPW00007를 사용하기 위한 일자 계산하기

코드를 제작하기 전에 앞서, 우리는 '주문일자'라는 데이터에 입력해줄 일자 데이터를 계산해주어야 한다. 다시 말해, OPW00007은 단순하게 입력한 주문일자(예를 들면 20220404)에 이루어진 거래 내역만을 전달해주기 때문에 그 데이터를 입력해주어야 한다는 것이다. 

일자 데이터를 계산하는 것은 datetime의 timedelta를 이용할 예정이다. 아래의 코드를 통해 일자 데이터를 얻어올 수 있는데, def cal_day_data의 인자로 설정되어 있는   term  은 단순하게 당일로부터 며칠 간의 일자 데이터를 조회할지를 찾는 것이다. 예를 들어 term에 10이라는 값을 입력했고 오늘 날짜가 2022년 04월 06일이라면, 아래의 함수를 통해  반환(return)되는 변수인    thelatest_date  에는 주말을 제외한 10일 간의 날짜 데이터인 [20220406, 20220405, 20220404,  20220401, 20220331, 20220330, 20220329, 20220328, 20220325, 20220324]가 입력된다. 만약 일년 간의 데이터를 조회하고 싶다면   term  에 365를 입력해주면 된다.

def cal_day_data(term):
	thelatest_date = []
	current_date = current_day

	for i in range(0, term):
		s = current_date - datetime.timedelta(days=i)
		splits = str(s).split("-")
		aggre_s = splits[0] + splits[1] + splits[2]
		sweek = datetime.date(int(splits[0]), int(splits[1]), int(splits[2])).weekday()

		if sweek > 4:
			pass
		else:
			thelatest_date.append(aggre_s)
            
	return thelatest_date

 

 

OPW00007를 사용할 함수 제작하기 : def _run_psb29_sub1() 

앞서 조회일자에 입력할 데이터를 모두 계산하였으니, 이제는 데이터를 입력(SetinputValue)한 후 키움증권 서버에 요청(CommRqData)하고 그 데이터를 받아오면 된다. 아래의 코드는 데이터를 조회하는 코드 전문인데, 일단 본인의 경우에는 거래 내역을 조회할 일자 기준을 10일(2번째 줄)로 설정하였다.

그 후 for문을 통해 일자 데이터(  self.day_data    thelatest_date  ) 하나하나에 접근하면서 해당 일자 데이터를 "주문일자"의 인자로 전달해주면 된다(6번째 줄). 그 후 계좌번호에는 계좌번호를, 비밀번호에는 계좌비밀번호를 입력해주면 되고 종목코드에는 조회하고자 하는 종목의 종목코드를 전달해주면 된다. 그 외의 입력 데이터는 아래와 같다.

  • 비밀번호 : 사용안하므로 공백으로 둠(""을 입력). 입력해도 아무 문제 없음
  • 비밀번호입력매체구분 : "00"(고정)
  • 조회구분 : 1:주문순, 2:역순, 3:미체결, 4:체결내역만, 0:미설정
  • 주식채권구분 : 0:전체, 1:주식, 2:채권
  • 매도수구분 : 0:전체, 1:매도, 2:매수
  • 종목코드 : 전체 조회시 공백 허용(""을 입력)
  • 시작주문번호 : 전체 조회 시 공백 허용(""을 입력) 

이를 바탕으로 아래의 코드를 분석해보면, 이는 본인의 계좌에서 10일 간 이루어진 모든 거래 내역을 조회하는 코드가 된다. 

def _run_psb29_sub1(self):
	self.day_data = self.cal_day_data(10)

	for day in reversed(self.day_data):
		self.opw00007_day = day
		self._setinputvalue("주문일자", day)
		self._setinputvalue("계좌번호", accno)
		self._setinputvalue("비밀번호", setting_value.password)
		self._setinputvalue("비밀번호입력매체구분", "00")
		self._setinputvalue("조회구분", 0)
		self._setinputvalue("주식채권구분", 0)
		self._setinputvalue("매도수구분", 0)
		self._setinputvalue("종목코드", "")
		self._setinputvalue("시작주문번호", "")
		self._commrqdata("rq_opw00007", "opw00007", 0, '0351')
		self.tr_event_loop = QEventLoop()
		self.tr_event_loop.exec_()
		time.sleep(0.3)

 

 


728x90
반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.