1) 코드 생성
로그인한 계좌의 잔고를 표시하는 기능을 만들어보겠습니다.
해당 기능을 테스트 후에 기존 코드와 통합하면 됩니다.
자동차를 만들 때 자동차 바퀴를 테스트한 뒤에 문제가 없으면 장착하는 것과 같습니다.
그리고 기능 하나 하나 만들 때 요즘은 인공지능 툴에 물어보면 되므로 정말 만들기가 편해졌습니다.
기존 API 기능을 만들 때는 두꺼운 메뉴얼을 보고 해당 메뉴얼에서 예제를 찾아서 만들었습니다.
기능하나 하나 만들는 시간도 많이 들었고 해당 예제를 찾는 것이 시간이 걸렸습니다.
인터넷에서 찾을 때도 요령이 없으면 한참을 검색하여 찾았습니다.
그런데 제가 찾는 코드가 파이썬인데 C++, Java 등의 다른 언어 였다면 이를 응용하기도 힘들었습니다.
이제는 예제도 만들기 쉬워서 기존 코드와 통합하는 요령만 알면 됩니다.
저는 기능 하나를 기존 코드와 통합 할 때 함수 형태로 분리가능하도록 만든 후에 함수를 추가하고 버튼이나 초기화에 추가하는 방법으로 통합하고 있습니다.
다음과 같은 ChatGPT 프롬프트를 사용하여 생성하였고 에러 수정하였습니다.
python, 키움 pykiwoom 모듈을 사용하여 QTableWidget 에 잔고를 표시하는 코드를 만들어주세요.
아래 코드는 다음 위치에서 다운 받는 것이 가능합니다.
git clone https://github.com/jbpark/JbTraderExample.git
cd JbTraderExample/jbtrader/ch5.9
kiwoom_balance.py
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QTableWidget, QTableWidgetItem, QPushButton, QLabel
from pykiwoom.kiwoom import Kiwoom
class BalanceViewer(QWidget):
def __init__(self):
super().__init__()
self.initUI()
self.kiwoom = Kiwoom()
self.kiwoom.CommConnect()
def initUI(self):
self.setWindowTitle("잔고 조회")
self.setGeometry(100, 100, 600, 500)
layout = QVBoxLayout()
self.setLayout(layout)
# D+2추정예수금, 추정예탁자산, 누적투자손익 라벨 추가
self.deposit_label = QLabel("D+2추정예수금: ")
self.total_eval_label = QLabel("추정예탁자산: ")
self.estimated_asset_label = QLabel("누적투자손익: ")
layout.addWidget(self.deposit_label)
layout.addWidget(self.total_eval_label)
layout.addWidget(self.estimated_asset_label)
# 테이블 위젯 생성
self.tableWidget = QTableWidget()
layout.addWidget(self.tableWidget)
# 조회 버튼 생성
self.btn_refresh = QPushButton("잔고 조회")
self.btn_refresh.clicked.connect(self.load_balance)
layout.addWidget(self.btn_refresh)
def load_balance(self):
account_list = self.kiwoom.GetLoginInfo("ACCNO") # 계좌 목록 가져오기
if isinstance(account_list, list) and account_list: # 리스트이고 값이 있으면
account_num = account_list[0] # 첫 번째 계좌 선택
else:
print("계좌 정보를 가져오지 못했습니다.")
return
df = self.kiwoom.block_request("opw00018",
계좌번호=account_num,
비밀번호="",
비밀번호입력매체구분="00",
조회구분=2,
output="계좌평가잔고개별합산",
next=0)
columns = ["종목명", "평가손익", "수익률", "보유수량", "매입가"]
self.tableWidget.setColumnCount(len(columns))
self.tableWidget.setHorizontalHeaderLabels(columns)
self.tableWidget.setRowCount(len(df))
rowNum = 0
for index, row in df.iterrows():
self.tableWidget.setItem(rowNum, 0, QTableWidgetItem(row['종목명']))
self.tableWidget.setItem(rowNum, 1, QTableWidgetItem(str(int(row['평가손익']))))
self.tableWidget.setItem(rowNum, 2, QTableWidgetItem(str(float(row['수익률(%)']))))
self.tableWidget.setItem(rowNum, 3, QTableWidgetItem(str(int(row['보유수량']))))
self.tableWidget.setItem(rowNum, 4, QTableWidgetItem(str(int(row['매입가']))))
rowNum += 1
df = self.kiwoom.block_request("opw00004",
계좌번호=account_num,
비밀번호="",
상장폐지조회구분=0,
비밀번호입력매체구분="00",
output="계좌평가현황",
next=0)
self.deposit_label.setText(f"D+2추정예수금: {str(int(df['D+2추정예수금'][0]))}")
self.total_eval_label.setText(f"추정예탁자산: {str(int(df['추정예탁자산'][0]))}")
self.estimated_asset_label.setText(f"누적투자손익: {str(int(df['누적투자손익'][0]))}")
if __name__ == '__main__':
app = QApplication(sys.argv)
viewer = BalanceViewer()
viewer.show()
sys.exit(app.exec_())
2) 코드 실행
짜잔~~ 실행이 되었네요.

3) JbTader 에 잔고 조회 추가
Qt Designer 로 잔고 조회를 위한 Table Widget 을 추가합니다.
아래와 같이 행, 열을 추가합니다.
행의 경우 잔고에 표시를 원하는 항목을 추가합니다.
예수금 D+2, 추정예탁자산, 누적투자손익을 추가하였습니다.
열은 항목, 데이터를 추가하였습니다.


잔고 표시 통합합니다.
load_balance 라는 함수로 우선 분리 후에 이를 QTableWidget 에 추가하도록 해당 부분을 수정하면됩니다.
코드를 통합 시에는 개별항목으로 분리하고 본 코드에 Copy and Paste 후에 해당 함수에서 UI 항목등의 항목을 변경하는 순으로 진행하였습니다.
gruma_one.py (일부 코드이며 전체 코드는 위의 git 에서 확인이 가능합니다.)
def load_balance(self):
if self.kiwoom.GetConnectState() == 0:
print("키움증권 로그인 실패!")
else:
print("키움증권 로그인 성공!")
accounts = self.kiwoom.GetLoginInfo("ACCNO")
print("계좌 목록:", accounts)
if isinstance(accounts, list): # 리스트이면 첫 번째 계좌 선택
account_num = accounts[0]
else: # 문자열이면 split() 사용
account_num = accounts.strip().split(';')[0]
print("사용할 계좌:", account_num)
df = self.kiwoom.block_request("opw00004",
계좌번호=account_num,
비밀번호="",
상장폐지조회구분=0,
비밀번호입력매체구분="00",
output="계좌평가현황",
next=0)
# 예수금, 추정예탁자산, 누적투자손익 업데이트
item = QTableWidgetItem(str(int(df['D+2추정예수금'][0])))
item.setTextAlignment(Qt.AlignVCenter | Qt.AlignRight)
self.accountBalance.setItem(1, 0, item)
item = QTableWidgetItem(str(int(df['추정예탁자산'][0])))
item.setTextAlignment(Qt.AlignVCenter | Qt.AlignRight)
self.accountBalance.setItem(1, 1, item)
item = QTableWidgetItem(str(int(df['누적투자손익'][0])))
item.setTextAlignment(Qt.AlignVCenter | Qt.AlignRight)
self.accountBalance.setItem(1, 2, item)
4) 보유 종목 추가
보유 종목을 위해서 Table Widget 을 추가합니다.
항목은 이미지와 같이 종목명, 평가손익, 수익률(%), 보유수량, 매입가를 추가하였습니다.

gruma_one.py (일부 코드이며 전체 코드는 위의 git 에서 확인이 가능합니다.)
def load_stocks(self):
if self.kiwoom.GetConnectState() == 0:
print("키움증권 로그인 실패!")
else:
print("키움증권 로그인 성공!")
accounts = self.kiwoom.GetLoginInfo("ACCNO")
print("계좌 목록:", accounts)
if isinstance(accounts, list): # 리스트이면 첫 번째 계좌 선택
account_num = accounts[0]
else: # 문자열이면 split() 사용
account_num = accounts.strip().split(';')[0]
print("사용할 계좌:", account_num)
df = self.kiwoom.block_request("opw00018",
계좌번호=account_num,
비밀번호="",
비밀번호입력매체구분="00",
조회구분=2,
output="계좌평가잔고개별합산",
next=0)
columns = ["종목명", "평가손익", "수익률(%)", "보유수량", "매입가"]
self.accountStocks.setColumnCount(len(columns))
self.accountStocks.setHorizontalHeaderLabels(columns)
self.accountStocks.setRowCount(len(df))
rowNum = 0
for index, row in df.iterrows():
self.accountStocks.setItem(rowNum, 0, QTableWidgetItem(row['종목명']))
self.accountStocks.setItem(rowNum, 1, QTableWidgetItem(str(int(row['평가손익']))))
self.accountStocks.setItem(rowNum, 2, QTableWidgetItem(str(float(row['수익률(%)']))))
self.accountStocks.setItem(rowNum, 3, QTableWidgetItem(str(int(row['보유수량']))))
self.accountStocks.setItem(rowNum, 4, QTableWidgetItem(str(int(row['매입가']))))
rowNum += 1
5) JbTader 실행
잔고항목 및 보유 종목이 추가되었습니다.
뭔가~~ 조금씩 기능 추가가 되어가는 모습을 보니 뿌듯합니다.

'시스템 트레이딩 > JbTrader 1호' 카테고리의 다른 글
| 5.11편-종목 코드 입력 시 종목 명칭 업데이트 (2) | 2025.03.20 |
|---|---|
| 5.10편-매수/매 가격에 현재 가격 및 상하 호가 선택 기능 추가 (4) | 2025.03.19 |
| 5.8편-폰트 변경 (2) | 2025.03.18 |
| 5.7편-서버 연결, 매수, 매도 통합 (1) | 2025.03.17 |
| 5.6편-키움 매도 Qt UI 와 연결 (0) | 2025.03.17 |


