대신증권 CYBOS PLUS 프로그램 구현 (13) - 로그인 시 계좌 조회하기
프로그램 구현 목표
- 주문 초기화 및 계좌번호를 구하기 : CpTrade.CpTdUtil
- 계좌 잔고 조회하기 : CpTrade.CpTd6033
- 로그인과 동시에 계좌 조회하기
대신증권에서 계좌를 조회할 때 제공해주는 함수는 `CpTrade`의 `CpTd6033` 모듈을 활용해야 하는데, 이 모듈을 사용하기 위해서는 아래의 세 가지 작업을 반드시 구축해주어야 한다.
- CpTrade.CpTdUtil 모듈의 TradeInit 함수 → 주문 초기화 기능 구현
- CpTrade.CpTdUtil 모듈의 AccountNumber 함수 → 계좌번호 조회 기능 구현
- CpTrade.CpTdUtil 모듈의 GoodsList 함수 → 계좌의 거래 가능 범위 구현
주문 초기화 및 계좌번호 구하기 : CpTrade.CpTdUtil
대신증권 Open API에서 제공하는 기능 중에서 무엇보다도 가장 선행되어야 하는 함수는 `CpTrade.CpTdUtil` 모듈의 `TradeInit` 함수이다. 대신증권에서는 이 함수의 기능에 대해 '주문 초기화'의 기능을 수행한다고 설명하면서, 주문과 관련된 어떠한 작업을 수행하기 전에 반드시 `TradeInit` 함수를 호출하여 주문 관련 내역을 초기화하여야 한다고 당부하고 있다. 그렇다면 일단, CpTrade.py 파일을 생성한 후 `class CpTdUtil:` 클래스를 만든 후 초기화 함수에서 이 COM에 대한 인스턴스를 생성해보자.
## CpTrade.py ##
import win32com.client
class CpTdUtil:
def __init__(self):
self.trade = win32com.client.Dispatch("CpTrade.CpTdUtil") ## COM 연결
그 후에 `CpTrade.CpTdUtil` 모듈에서 제공하는 함수 중 하나인 `TradeInit`을 사용하기 위한 함수를 `def _TradeInit(self):`라는 이름으로 생성해주어야 하는데, 여기서 `TradeInit`이 반환해주는 값은 아래와 같이 네 가지로 정리할 수 있다.
- -1 : 오류 (계좌 비밀번호 오류도 포함)
- 0 : 정상
- 1 : OTP/보안카드 키 입력이 잘못됨
- 3 : 취소
이 내용에 따라 `TradeInit` 함수를 사용하기 위한 코드를 만들어보면 아래와 같은 코드가 나올 것이다.
※ Line: 8 ~ 26
## CpTrade.py ##
import win32com.client
class CpTdUtil:
def __init__(self):
self.trade = win32com.client.Dispatch("CpTrade.CpTdUtil") ## COM 연결
def _TradeInit(self):
"""
:return: 주문과 관련된 결과값 반환
-1: 오류 (계좌 비밀번호 오류도 포함함)
0: 정상
1: OTP/보안카드 키 입력 잘못됨
3: 취소
"""
value = self.trade.TradeInit(0)
result = "" ## 지역변수 설정
if value == -1:
result = "오류(계좌 비밀번호 오류도 포함함)"
elif value == 0:
result = "정상"
elif value == 1:
result = "OTP/보안카드 키 입력 잘못됨"
elif value == 3:
result = "취소"
print(f"[주문 오브젝트 초기화 결과] {value}({result})")
이제 다음으로 사용해 볼 함수는 `AccountNumber`인데, 이 함수는 기본적으로 로그인되어 있는 계정과 연결되어 있는 계좌번호를 반환해주는 함수이다. 이 코드를 구현할 때 주의해야 할 부분이 있다면 Line 6, 7 부분과 같은 조건문을 상정하여 `TradeInit` 함수를 호출하여 주문 초기화의 성공 여부를 확인해주어야 한다는 것이다.
## CpTrade.py ##
## class CpTdUtil ##
def _AccountNumber(self):
"""
[Only Read, 읽기 전용 함수]
:return: 계좌 목록 표기
"""
if not self._TradeInit() == 0:
return False
value = self.trade.AccountNumber
print(f"[마스터 계좌 표기] {value}")
마지막으로 구현할 함수는 `GoodsList()` 함수인데, 이 함수는 기본적으로 계좌번호를 서버에 전달해주면 서버로부터 그 계좌로 거래가 가능한 구분이 어떠한 것(주식이면 주식, 전체면 전체 등)인지를 반환해주는 기능을 수행한다. 사실 계좌의 거래 범위는 별 관심이 없고 별로 중요하지는 않지만, 마지막에서 계좌 잔고를 조회할 때 사용할 `CpTd6033` 모듈에서는 계좌의 거래 범위(=상품관리구분코드)가 어떠한지를 요구하고 있으므로 우리는 어쩔 수 없이 데이터를 전달해줘야 한다.
## CpTrade.py ##
## class CpTdUtil ##
def _GoodsList(self, AccNum):
"""
로그인한 계좌에 대하여 필터값에 따른 계좌 목록을 배열로 반환하는 함수
다만 필터값은 더하여 조합이 가능하다. (예) 필터값이 3인 경우 1(주식) + 2(선물.옵션)을 의미함)
[결과값]
-1: 전체, 1: 주식, 2: 선물/옵션, 16: EUREX, 64: 해외선물
"""
value = self.trade.GoodsList(AccNum, 1)
print(f"[{AccNum}] 상품관리코드:{value}")
계좌 잔고 조회하기 : CpTrade.CpTd6033
이제 앞의 세 단계를 모두 거쳤다면, 계좌 잔고를 조회하는 모듈인 `CpTrade.CpTd6033`을 활용하여 계좌 잔고를 조회해보도록 하자. 이 모듈을 사용하기 위해 서버로 전달해주어야 하는 데이터 목록은 아래와 같다.
□ [CpTd6033] SetInputValue(Type, Value) 전달값 확인하기
여기서 계좌번호(Type 0)와 상품관리구분코드(Type 1)는 각각 이전에 `AccountNumber` 함수를 통해 서버로부터 회신받은 계좌번호와 `GoodsList` 함수를 통해 전달받은 그 계좌의 상품관리구분코드를 인자로 전달해주어서 해당 계좌의 주식 잔고를 조회해주어야 한다. 우리가 제작할 계좌 잔고 조회 함수의 이름은 `def _info_account(self):`으로 하여 함수를 생성해주도록 하고, 앞에서 살펴봤듯이 계좌번호를 전달받아야 하므로 함수의 인자로 계좌번호(`AccNum`)를 전달받도록 하고, 앞서 `GoodsList()` 함수를 통해 획득했던 상품관리구분코드도 인자(`GoodsList`)로 전달받도록 하자. 그 외의 데이터는 함수 내부에서 직접 정의해주면 되는 변수들이다.
## CpTrade.py ##
class CpTd6033:
def __init__(self):
self.cptd6033 = win32com.client.Dispatch("CpTrade.CpTd6033") ## COM 연결
def _info_account(self, AccNum, GoodsList):
"""
[주의사항] 주식 이외의 상품에 대한 평가금액과 예수금 변동은 포함되지 않았음
SetInputValue(Type, Value)
0: (str)계좌번호, 1: (str)상품관리구분코드
2: (long)요청건수[기본값:14, 최대 50], 3: (str)수익률구분코드("1"은 100% 기준, "2"는 0% 기준)
GetHeaderValue(Type)
0: (str)계좌명, 1: (long)결제잔고수량, 2: (long)체결잔고수량,
3: (longlong)총 평가금액, 4: (longlong)평가손익, 6: (longlong)대출금액,
7: (long) 수신개수, 8: (double)수익율, 9:(longlong)D+2 예상 예수금,
10: (longlong)총평가 내 대주평가금액, 11: (longlong총평가 내 잔고평가금액,
12: (longlong)대주금액
GetDataValue(Type, Index)
0: (str)종목명, 1:(char)신용구분, 2: (str)대출일, 3: (long)결제잔고수량
4: (long)결제장부단가 5: (long)전일체결수량 6: (long)금일체결수량 7: (long)체결잔고수량
9: (longlong)평가금액(단위:원, 천원 미만 절사) 10: (longlong)평가손익(단위:원, 천원 미만 절사)
11: (double) 수익률 12: (str)종목코드 13: (char)주문구분 15: (long)매도가능수량
16: (str) 만기일 17: (double)체결장부단가 18: (longlong)손익단가
"""
self.cptd6033.SetInputValue(0, AccNum) ## (str)계좌번호
self.cptd6033.SetInputValue(1, GoodsList) ## (str)상품관리코드
self.cptd6033.SetInputValue(2, 50) ## (long)요청 건수[기본값 14, 최대값 50]
self.cptd6033.SetInputValue(3, "2") ## (str) 수익률 구분코드("1"은 100% 기준, "2"는 0% 기준)
self.cptd6033.BlockRequest()
이제 서버에 데이터를 요청하는 과정까지는 모두 진행시켰으니, 이제 서버로부터 각각의 `Type`에 해당하는 결과 데이터를 전달받아 변수에 저장하고 출력해보자. 대신증권 CYBOS PLUS의 `GetHeaderValue(Type)` 함수를 통해 서버로부터 회신받을 수 있는 데이터의 종류는 아래와 같다.
□ [CpTd6033] GetHeaderValue(Type) 반환값 확인하기
## CpTrade.py ##
## 추가된 부분: Line 32~48
class CpTd6033:
def __init__(self):
self.cptd6033 = win32com.client.Dispatch("CpTrade.CpTd6033") ## COM 연결
def _info_account(self, AccNum, GoodsList):
"""
[주의사항] 주식 이외의 상품에 대한 평가금액과 예수금 변동은 포함되지 않았음
SetInputValue(Type, Value)
0: (str)계좌번호, 1: (str)상품관리구분코드
2: (long)요청건수[기본값:14, 최대 50], 3: (str)수익률구분코드("1"은 100% 기준, "2"는 0% 기준)
GetHeaderValue(Type)
0: (str)계좌명, 1: (long)결제잔고수량, 2: (long)체결잔고수량,
3: (longlong)총 평가금액, 4: (longlong)평가손익, 6: (longlong)대출금액,
7: (long) 수신개수, 8: (double)수익율, 9:(longlong)D+2 예상 예수금,
10: (longlong)총평가 내 대주평가금액, 11: (longlong총평가 내 잔고평가금액,
12: (longlong)대주금액
GetDataValue(Type, Index)
0: (str)종목명, 1:(char)신용구분, 2: (str)대출일, 3: (long)결제잔고수량
4: (long)결제장부단가 5: (long)전일체결수량 6: (long)금일체결수량 7: (long)체결잔고수량
9: (longlong)평가금액(단위:원, 천원 미만 절사) 10: (longlong)평가손익(단위:원, 천원 미만 절사)
11: (double) 수익률 12: (str)종목코드 13: (char)주문구분 15: (long)매도가능수량
16: (str) 만기일 17: (double)체결장부단가 18: (longlong)손익단가
"""
self.cptd6033.SetInputValue(0, AccNum) ## (str)계좌번호
self.cptd6033.SetInputValue(1, GoodsList) ## (str)상품관리코드
self.cptd6033.SetInputValue(2, 50) ## (long)요청 건수[기본값 14, 최대값 50]
self.cptd6033.SetInputValue(3, "2") ## (str) 수익률 구분코드("1"은 100% 기준, "2"는 0% 기준)
self.cptd6033.BlockRequest()
acc_name = self.cptd6033.GetHeaderValue(0) ## (str)계좌명
data_len = self.cptd6033.GetHeaderValue(7) ## (long)데이터 수신개수
evalu_All = self.cptd6033.GetHeaderValue(3) ## (longlong)총평가금액
evalu_Profit = self.cptd6033.GetHeaderValue(4) ## (longlong)평가손익
profit_rate = self.cptd6033.GetHeaderValue(8) ## (double)수익률
loan = self.cptd6033.GetHeaderValue(6) ## (longlong)대출금액
HA_evaluAll = self.cptd6033.GetHeaderValue(11) ## (longlong)총평가금액 내 잔고평가금액(Hold Assessment)
ex_Deposit = self.cptd6033.GetHeaderValue(9) ## (longlong)D+2 예상 예수금
pay_remain = self.cptd6033.GetHeaderValue(1) ## (long)결제잔고수량
sign_remain = self.cptd6033.GetHeaderValue(2) ## (long)체결잔고수량
SA_evaluAll = self.cptd6033.GetHeaderValue(10) ## (longlong)총평가금액 내 대주평가금액(Stockloan Assessment)
stock_loan = self.cptd6033.GetHeaderValue(12) ## (longlong)대주금액
print(f"[계좌명:{acc_name}] (데이터 수신 개수:{data_len})")
print(f" 총평가금액:{evalu_All}, 평가손익:{evalu_Profit}, 수익률:{profit_rate}, 대출금액:{loan}")
print(f" 잔고평가금액:{HA_evaluAll}, D+2 예수금:{ex_Deposit}, 결제잔고수량:{pay_remain}, 체결잔고수량:{sign_remain}")
print(f" 대주금액:{stock_loan}, 대주평가금액:{SA_evaluAll}")
▶ 아직은 구현되지 않았겠지만, 추후에는 아래와 같은 결과를 확인할 수 있습니다.
[계좌명:*******] (데이터 수신 개수:0)
총평가금액:0, 평가손익:0, 수익률:0.0, 대출금액:0
잔고평가금액:0, D+2 예수금:100000000, 결제잔고수량:0, 체결잔고수량:0
대주금액:0, 대주평가금액:0
마지막으로 우리가 수신받은 데이터 개수(위의 실행 결과에서는 0으로 표기된 데이터)에 따라서 또 다시 조회할 수 있는 데이터 항목이 있는데, 그 데이터는 `GetDataValue(Type, Index)` 함수를 통해 세부적인 데이터를 확인할 수 있다. 이 함수에서 `Type`을 가지고 확인할 수 있는 데이터는 아래의 표를 통해 확인하도록 하자.
□ [CpTd6033] GetDataValue(Type, Index) 반환값 확인하기
내용을 확인했다면 다시 본론으로 돌아와서, `Type`과 `Index`가 갖는 기능에 대해 알아보도록 하자. 이 두 가지 개념을 이해하기 위해서는 반드시 `Index`가 갖는 의미를 이해해야 한다. 여기서의 `Index`는 우리가 위에서 `GetHeaderValue(7)`을 통해 얻어왔던 데이터인 "수신 데이터 개수"를 의미하는데, 이 수신 데이터 개수는 곧 "보유 종목의 개수"를 의미한다. 다시 말해, 보유 종목별로 서버 내부에서 부여된 인덱스 번호가 있고 그 인덱스 번호 별로 `Type`에 해당하는 데이터를 요청하면 그 데이터를 확인할 수 있다는 것이다. 아래의 도식과 바로 아래에 있는 코드 예시를 통해 간단히 살펴보도록 하자.
## 인덱스 번호 0의 종목명 가져오기
self.cptd6033.GetDataValue(0, 0) ## (Type, Index)
## 인덱스 번호 0의 종목코드 가져오기
self.cptd6033.GetDataValue(12, 0) ## (Type, Index)
## 인덱스 번호 1의 종목명 가져오기
self.cptd6033.GetDataValue(0, 1) ## (Type, Index)
## 인덱스 번호 1의 신용구분 가져오기
self.cptd6033,GetDataValue(1, 1) ## (Type, Index)
이 부분이 이해가 갔다면, 보유 종목의 개수를 의미하는 `data_len` 변수를 대상으로 `for`문을 작성해서 보유 종목별로 데이터를 가져올 수 있게 된다. 아래의 코드를 확인해보자.
※ Line: 48 ~ 73
class CpTd6033:
def __init__(self):
self.cptd6033 = win32com.client.Dispatch("CpTrade.CpTd6033") ## COM 연결
def _info_account(self, AccNum, GoodsList):
"""
[주의사항] 주식 이외의 상품에 대한 평가금액과 예수금 변동은 포함되지 않았음
SetInputValue(Type, Value)
0: (str)계좌번호, 1: (str)상품관리구분코드
2: (long)요청건수[기본값:14, 최대 50], 3: (str)수익률구분코드("1"은 100% 기준, "2"는 0% 기준)
GetHeaderValue(Type)
0: (str)계좌명, 1: (long)결제잔고수량, 2: (long)체결잔고수량,
3: (longlong)총 평가금액, 4: (longlong)평가손익, 6: (longlong)대출금액,
7: (long) 수신개수, 8: (double)수익율, 9:(longlong)D+2 예상 예수금,
10: (longlong)총평가 내 대주평가금액, 11: (longlong총평가 내 잔고평가금액,
12: (longlong)대주금액
GetDataValue(Type, Index)
0: (str)종목명, 1:(char)신용구분, 2: (str)대출일, 3: (long)결제잔고수량
4: (long)결제장부단가 5: (long)전일체결수량 6: (long)금일체결수량 7: (long)체결잔고수량
9: (longlong)평가금액(단위:원, 천원 미만 절사) 10: (longlong)평가손익(단위:원, 천원 미만 절사)
11: (double) 수익률 12: (str)종목코드 13: (char)주문구분 15: (long)매도가능수량
16: (str) 만기일 17: (double)체결장부단가 18: (longlong)손익단가
"""
self.cptd6033.SetInputValue(0, AccNum) ## (str)계좌번호
self.cptd6033.SetInputValue(1, GoodsList) ## (str)상품관리코드
self.cptd6033.SetInputValue(2, 50) ## (long)요청 건수[기본값 14, 최대값 50]
self.cptd6033.SetInputValue(3, "2") ## (str) 수익률 구분코드("1"은 100% 기준, "2"는 0% 기준)
self.cptd6033.BlockRequest()
acc_name = self.cptd6033.GetHeaderValue(0) ## (str)계좌명
data_len = self.cptd6033.GetHeaderValue(7) ## (long)데이터 수신개수
evalu_All = self.cptd6033.GetHeaderValue(3) ## (longlong)총평가금액
evalu_Profit = self.cptd6033.GetHeaderValue(4) ## (longlong)평가손익
profit_rate = self.cptd6033.GetHeaderValue(8) ## (double)수익률
loan = self.cptd6033.GetHeaderValue(6) ## (longlong)대출금액
HA_evaluAll = self.cptd6033.GetHeaderValue(11) ## (longlong)총평가금액 내 잔고평가금액(Hold Assessment)
ex_Deposit = self.cptd6033.GetHeaderValue(9) ## (longlong)D+2 예상 예수금
pay_remain = self.cptd6033.GetHeaderValue(1) ## (long)결제잔고수량
sign_remain = self.cptd6033.GetHeaderValue(2) ## (long)체결잔고수량
SA_evaluAll = self.cptd6033.GetHeaderValue(10) ## (longlong)총평가금액 내 대주평가금액(Stockloan Assessment)
stock_loan = self.cptd6033.GetHeaderValue(12) ## (longlong)대주금액
print(f"[계좌명:{acc_name}] (데이터 수신 개수:{data_len})")
print(f" 총평가금액:{evalu_All}, 평가손익:{evalu_Profit}, 수익률:{profit_rate}, 대출금액:{loan}")
print(f" 잔고평가금액:{HA_evaluAll}, D+2 예수금:{ex_Deposit}, 결제잔고수량:{pay_remain}, 체결잔고수량:{sign_remain}")
print(f" 대주금액:{stock_loan}, 대주평가금액:{SA_evaluAll}")
for i in range(data_len):
item_name = self.cptd6033.GetDataValue(0, i) ## (str)종목명
item_code = self.cptd6033.GetDataValue(12, i) ## (str)종목코드
credit_Flag = self.cptd6033.GetDataValue(1, i) ## (char)신용구분
date = self.cptd6033.GetDataValue(2, i) ## (str)대출일
pay_remain = self.cptd6033.GetDataValue(3, i) ## (long)결제잔고수량
pay_unitcost = self.cptd6033.GetDataValue(4, i) ## (long)결제장부단가
sign_unitcost = self.cptd6033.GetDataValue(17, i) ## (double)체결장부단가
margin_unitcost = self.cptd6033.GetDataValue(18, i) ## (longlong)손익단가
yes_signed = self.cptd6033.GetDataValue(5, i) ## (long)전일체결수량
tod_signed = self.cptd6033.GetDataValue(6, i) ## (long)금일체결수량
remain_signed = self.cptd6033.GetDataValue(7, i) ## (long)체결잔고수량
evalu_Value = self.cptd6033.GetDataValue(9, i) ## (longlong)평가금액
evalu_Profit = self.cptd6033.GetDataValue(10, i) ## (longlong)평가손익
profit_rate = self.cptd6033.GetDataValue(11, i) ## (double)수익률
order_Gubun = self.cptd6033.GetDataValue(13, i) ## (char)주문구분
pos_sell_quan = self.cptd6033.GetDataValue(15, i) ## (long)매도가능수량
expire_date = self.cptd6033.GetDataValue(16, i) ## (str)만기일
print(f"[{item_name}({item_code})] 수익률:{profit_rate}, ({i}/{data_len})")
print(f" 주문구분:{order_Gubun}, 신용구분:{credit_Flag}(대출일:{date}), 만기일:{expire_date}")
print(f" 보유수량:{pos_sell_quan}주(=매도가능수량), 금일체결량:{tod_signed}, 전일체결량:{yes_signed}")
print(f" 평가금액:{evalu_Value}, 평가손익:{evalu_Profit}")
print(f" 결제잔고수량:{pay_remain}, 체결잔고수량:{remain_signed}")
print(f" 결제장부단가:{pay_unitcost}, 체결장부단가:{sign_unitcost}, 손익단가:{margin_unitcost}")
로그인과 동시에 계좌 조회하도록 하기
로그인과 동시에 계좌 잔고를 조회하도록 하는 기능을 수행하는 함수(`def _load_account(self):`)를 Boss.py 파일 내부에 생성한 후에, 가장 먼저 주문 초기화(`TradeInit`) 작업을 수행한 후, 계좌번호와 상품관리구분코드를 불러와야 한다. 그러기 위해서는 기존에 제작했던 함수들을 아주 조금씩 수정해주어야 하는데, 바로 `return`을 통해 결과값을 반환하도록 하는 작업이다. 아래의 코드를 보면, CpTrade.py 파일 내부에 있는 각 함수의 끝자락에서 `return value`라는 구문을 통해 그 함수에서 얻어낸 값을 반환하도록 하고 있다.
다만 `return` 구문을 추가하는 것 외에도 수정하는 함수가 있다면, 바로 `GoodsList` 함수이다. 사실 계좌번호를 조회하는 함수같은 경우에는 계좌를 여러 개 운용할 수도 있기 때문에 별도의 작업을 수행하진 않았지만, 계좌번호를 인자로 전달한 후 그 계좌의 상품관리구분코드를 조회하는 함수는 어찌됐든 한 개의 계좌번호에 한 개의 결과값을 돌려주는 식으로 데이터를 처리한다. 따라서 `self.trade.GoodsList(AccNum, 1)[0]`과 같이 맨 끝 부분에 `[0]`이라는 부분을 추가하여 함수 내부에서 인덱싱 절차를 거친 후 그 결과값을 반환하도록 했다. (만약 이 부분이 어떠한 차이가 있는지 궁금하신 분은 [0] 부분을 삭제했을 때의 상품관리구분코드 반환값과 추가했을 때의 상품관리구분코드 반환값을 비교해보시면 됩니다.)
## CpTrade.py ##
import win32com.client
class CpTdUtil:
def __init__(self):
self.trade = win32com.client.Dispatch("CpTrade.CpTdUtil") ## COM 연결
def _TradeInit(self):
"""
:return: 주문과 관련된 결과값 반환
-1: 오류 (계좌 비밀번호 오류도 포함함)
0: 정상
1: OTP/보안카드 키 입력 잘못됨
3: 취소
"""
value = self.trade.TradeInit(0)
result = "" ## 지역변수 설정
if value == -1:
result = "오류(계좌 비밀번호 오류도 포함함)"
elif value == 0:
result = "정상"
elif value == 1:
result = "OTP/보안카드 키 입력 잘못됨"
elif value == 3:
result = "취소"
print(f"[주문 오브젝트 초기화 결과] {value}({result})")
return value
def _AccountNumber(self):
"""
[Only Read, 읽기 전용 함수]
:return: 계좌 목록 표기
"""
if not self._TradeInit() == 0:
return False
value = self.trade.AccountNumber
print(f"[마스터 계좌 표기] {value}")
return value
def _GoodsList(self, AccNum):
"""
로그인한 계좌에 대하여 필터값에 따른 계좌 목록을 배열로 반환하는 함수
다만 필터값은 더하여 조합이 가능하다. (예) 필터값이 3인 경우 1(주식) + 2(선물.옵션)을 의미함)
[결과값]
-1: 전체, 1: 주식, 2: 선물/옵션, 16: EUREX, 64: 해외선물
"""
print(AccNum)
value = self.trade.GoodsList(AccNum, 1)[0]
print(f"[{AccNum}] 상품관리코드:{value}")
return value
그 후에 다시 Boss.py 파일로 돌아와서 아래와 같은 코드를 만들어주도록 하자. 앞서 이야기했듯이, 계좌번호의 경우에는 여러 계좌번호를 운용할 수 있기 때문에 계좌번호 목록 전체를 반환받긴 했지만, 일단 지금 당장은 한 개의 계좌번호만 있기 때문에 `_AccountNumber()` 함수가 반환해준 결과값인 `AccNum`의 맨 첫 번째(`[0]`)에 있는 계좌번호만을 사용해서 데이터를 조회해보자.
※ Line: 29 ~ 32
## Boss.py ##
import win32com.client
from pywinauto import application
from COM import CpSysDib
from COM import CpUtil
from COM import CpTrade
from COM import DsCbo1
import time
## GUI ##
import sys
from PyQt5 import uic
from PyQt5.QtWidgets import *
from gui import qt_gui
main_ui = uic.loadUiType("main.ui")[0]
class cybos(QMainWindow, main_ui):
def __init__(self):
super().__init__()
self.setupUi(self)
self._open_cybosplus() ## 자동 로그인 함수
## GUI 관련 이벤트 처리 ##
self.pushButton.clicked.connect(self._GetStockListByMarket)
self.pushButton_2.clicked.connect(self._day_range)
self.pushButton_3.clicked.connect(self._len_chart)
self.comboBox_2.currentIndexChanged.connect(lambda: qt_gui.etc(self).comboBox_2_CIC())
def _load_account(self):
CpTrade.CpTdUtil()._TradeInit()
AccNum = CpTrade.CpTdUtil()._AccountNumber()
GoodsList = CpTrade.CpTdUtil()._GoodsList(AccNum[0])
# 결과가 궁금하다면 아래 구문도 추가한 후 주석(#)을 삭제
# print(f"계좌번호:{AccNum[0]}({type(AccNum[0])}), 상품관리구분코드:{GoodsList}({type(GoodsList)})")
이제 마지막으로, 우리가 열심히 만들었던 CpTrade.py 파일 내부에 있는 `class CpTd6033` 클래스에 계좌번호와 상품관리구분코드를 함께 전달해준 후에, 프로그램이 실행되자마자 로그인을 실행하는 코드(Line 21)의 바로 아래 부분에서 `_load_account` 함수를 호출해주면 된다. 이제 프로그램을 실행시켜서 실행 결과를 확인해보자. (데이터를 조회하는 시점에서 보유 종목이 있는 경우에는 보유 종목에 관한 데이터가 출력되겠지만, 보유 종목이 없는 경우에는 아무런 데이터가 출력되지 않고 그냥 끝날 것이다.)
※ Line: 22, 35
## Boss.py ##
import win32com.client
from pywinauto import application
from COM import CpSysDib
from COM import CpUtil
from COM import CpTrade
from COM import DsCbo1
import time
## GUI ##
import sys
from PyQt5 import uic
from PyQt5.QtWidgets import *
from gui import qt_gui
main_ui = uic.loadUiType("main.ui")[0]
class cybos(QMainWindow, main_ui):
def __init__(self):
super().__init__()
self.setupUi(self)
self._open_cybosplus() ## 자동 로그인 함수
self._load_account()
## GUI 관련 이벤트 처리 ##
self.pushButton.clicked.connect(self._GetStockListByMarket)
self.pushButton_2.clicked.connect(self._day_range)
self.pushButton_3.clicked.connect(self._len_chart)
self.comboBox_2.currentIndexChanged.connect(lambda: qt_gui.etc(self).comboBox_2_CIC())
def _load_account(self):
CpTrade.CpTdUtil()._TradeInit()
AccNum = CpTrade.CpTdUtil()._AccountNumber()
GoodsList = CpTrade.CpTdUtil()._GoodsList(AccNum[0])
# print(f"계좌번호:{AccNum[0]}({type(AccNum[0])}), 상품관리구분코드:{GoodsList}({type(GoodsList)})")
CpTrade.CpTd6033()._info_account(AccNum[0], GoodsList)
▶ 실행 결과 확인하기
self.object:CpCybos
[통신결과:1] 서버와의 연결에 성공했습니다.
로그인되어 있습니다.
[주문 오브젝트 초기화 결과] 0(정상)
[주문 오브젝트 초기화 결과] 0(정상)
계좌번호:*********(<class 'str'>), 상품관리구분코드:**(<class 'str'>)
[계좌명:******] (데이터 수신 개수:0)
총평가금액:0, 평가손익:0, 수익률:0.0, 대출금액:0
잔고평가금액:0, D+2 예수금:100000000, 결제잔고수량:0, 체결잔고수량:0
대주금액:0, 대주평가금액:0
'AUTO TRADE > [대신증권] CYBOS PLUS' 카테고리의 다른 글
대신증권 CYBOS PLUS 프로그램 구현 (15) - 차트 데이터 저장하기 ② (2) | 2024.09.18 |
---|---|
대신증권 CYBOS PLUS 프로그램 구현 (14) - 차트 데이터 저장하기 ① (1) | 2024.09.16 |
대신증권 CYBOS PLUS 프로그램 구현 (12) - 분봉 차트 조회하기 (0) | 2024.09.06 |
대신증권 CYBOS PLUS 프로그램 구현 (11) - 일봉 차트 조회 : 연속 조회 사용하기 ② (1) | 2024.09.06 |
대신증권 CYBOS PLUS 프로그램 구현 (10) - 일봉 차트 조회 : 연속 조회 사용하기 ① (0) | 2024.09.02 |
소중한 공감 감사합니다