친절한곳

로그인 하기 


주식 상한가 자동 매매를 위해 먼저 PyCharm 을 더블 클릭하여 실행합니다.


그리고 아래와 같이 stock 폴더에서 마우스 우클릭하여 New > Directory 버튼을 클릭합니다.
이후 노출되는 창에서 ULPTrading을 입력 후 OK 버튼을 클릭합니다.



그리고 기존에 만들었던 upperLimitPriceTrading.ui 파일을 마우스 왼쪽 클릭 후 드래그 하여

ULPTrading 폴더에 옮기도록 합니다.




아래는 ULPTrading 폴더로 upperLimitPriceTrading.ui 파일을 옮긴 모습입니다.




이후 아래와 같이 ULPTrading 폴더에서 마우스 우클릭하여 New > Python File 버튼을 클릭합니다.

이후 노출되는 창에서 upperLimitPriceTrading 을 입력 후 OK 버튼을 클릭하여 python 파일을 생성합니다.




그리고 해당 upperLimitPriceTrading.py 파일에 아래의 소스코드를 작성하거나 복사해서 붙여넣기 합니다.

그리고 아래의 조건검색식의 순번을 찾는 곳에 키움 조건검색식 생성때 노출된 번호로 변경합니다.

(조건검색식 번호는 사용자별 번호가 상이하니 아래와 같이 변경하시면 됩니다.)

(ex. 191^ULPTrading > 1^ULPTrading)


index = self.cbCdtNm.findText('191^ULPTrading')   # 조건검색식 명으로 순번을 찾음


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
import sys
from PyQt5.QtWidgets import *
from PyQt5 import uic
from PyQt5.QAxContainer import *
 
form_class = uic.loadUiType("upperLimitPriceTrading.ui")[0]    # ui 파일을 로드하여 form_class 생성
 
class MyWindow(QMainWindow, form_class):    # MyWindow 클래스 QMainWindow, form_class 클래스를 상속 받아 생성됨
    def __init__(self): # MyWindow 클래스의 초기화 함수(생성자)
        super().__init__()  # 부모클래스 QMainWindow 클래스의 초기화 함수(생성자)를 호출
        self.setupUi(self)  # ui 파일 화면 출력
 
        self.kiwoom = QAxWidget("KHOPENAPI.KHOpenAPICtrl.1")  # 키움증권 Open API+의 ProgID를 사용하여 생성된 QAxWidget을 kiwoom 변수에 할당
 
        self.btnStart.setDisabled(True)     # 거래시작 버튼을 비활성화 상태로 변경
        self.btnStop.setDisabled(True)      # 거래중지 버튼을 비활성화 상태로 변경
        self.btnReStart.setDisabled(True)   # 재시작 버튼을 비활성화 상태로 변경
        self.lePrice.setDisabled(True)      # 투입금 입력란을 비활성화 상태로 변경
        self.cbAcctNo.setDisabled(True)     # 계좌번호 선택란을 비활성화 상태로 변경
        self.leD2Price.setDisabled(True)    # D2예수금 입력란을 비활성화 상태로 변경
        self.cbCdtNm.setDisabled(True)      # 조건검색명 선택란을 비활성화 상태로 변경
        self.leTotalPrice.setDisabled(True) # 총투입금 입력란을 비활성화 상태로 변경
        self.leProfits.setDisabled(True)    # 수익금 입력란을 비활성화 상태로 변경
        self.leProfitsPc.setDisabled(True)  # 수익률 입력란을 비활성화 상태로 변경
        self.pteBuyLog.setDisabled(True)    # 매도 종목 노출란을 비활성화 상태로 변경
        self.pteSellLog.setDisabled(True)   # 매수 종목 노출란을 비활성화 상태로 변경
        self.pteLog.setDisabled(True)       # 전체 내역 노출란을 비활성화 상태로 변경
 
        self.btnLogin.clicked.connect(self.btn_login)   # ui 파일을 생성할때 작성한 로그인 버튼의 objectName 으로 클릭 이벤트가 발생할 경우 btn_login 함수를 호출
        self.kiwoom.OnEventConnect.connect(self.event_connect)  # 키움 서버 접속 관련 이벤트가 발생할 경우 event_connect 함수 호출
 
        self.kiwoom.OnReceiveConditionVer.connect(self.receive_condition_var)  # 키움 사용자 조건검색식 수신 관련 이벤트가 발생할 경우 receive_condition_var 함수 호출
 
    def btn_login(self): # Login 버튼 클릭 시 실행되는 함수
        ret = self.kiwoom.dynamicCall("CommConnect()")  # 키움 로그인 윈도우를 실행
 
    def event_connect(self, err_code):  # 키움 서버 접속 관련 이벤트가 발생할 경우 실행되는 함수
        if err_code == 0:   # err_code가 0이면 로그인 성공 그외 실패
            self.pteLog.appendPlainText("로그인 성공")    # ui 파일을 생성할때 작성한 plainTextEdit의 objectName 으로 해당 plainTextEdit에 텍스트를 추가함
 
            account_num = self.kiwoom.dynamicCall("GetLoginInfo(QString)", ["ACCNO"])   # 키움 dynamicCall 함수를 통해 GetLoginInfo 함수를 호출하여 계좌번호를 가져옴
            self.pteLog.appendPlainText("계좌번호: " + account_num.rstrip(';')) # 키움은 전체 계좌를 반환하며 각 계좌 번호 끝에 세미콜론(;)이 붙어 있음으로 제거하여 plainTextEdit에 텍스트를 추가함
 
            self.cbAcctNo.addItem(account_num.rstrip(';'))  # 계좌번호 선택 박스에 계좌번호 셋팅
 
            self.btnStart.setDisabled(False)  # 거래시작 버튼을 활성화 상태로 변경
            self.lePrice.setDisabled(False)  # 투입금 입력란을 활성화 상태로 변경
            self.cbAcctNo.setDisabled(False)  # 계좌번호 선택란을 활성화 상태로 변경
            self.cbCdtNm.setDisabled(False)  # 조건검색명 선택란을 활성화 상태로 변경
            self.pteBuyLog.setDisabled(False)  # 매도 종목 노출란을 활성화 상태로 변경
            self.pteSellLog.setDisabled(False)  # 매수 종목 노출란을 활성화 상태로 변경
            self.pteLog.setDisabled(False)  # 전체 내역 노출란을 활성화 상태로 변경
 
            self.btnLogin.setDisabled(True)  # 로그인 버튼을 비활성화 상태로 변경
 
            self.leTotalPrice.setDisabled(True)  # 총투입금 입력란을 비활성화 상태로 변경
            self.leProfits.setDisabled(True)  # 수익금 입력란을 비활성화 상태로 변경
            self.leProfitsPc.setDisabled(True)  # 수익률 입력란을 비활성화 상태로 변경
 
            self.leTotalPrice.setText('0')  # 총투입금을 0원으로 셋팅
            self.leProfits.setText('0'# 수익금을 0원으로 셋팅
            self.leProfitsPc.setText('0%')   # 수익률을 0%으로 셋팅
 
            self.kiwoom.dynamicCall('GetConditionLoad()')   # 키움 서버에 사용자 조건식 목록을 요청
 
            QMessageBox.about(self, "message""계좌 비밀번호 입력 및 환경 설정을 진행해주세요.")
        else:
            self.pteLog.appendPlainText("로그인 실패")    # ui 파일을 생성할때 작성한 plainTextEdit의 objectName 으로 해당 plainTextEdit에 텍스트를 추가함
 
    def receive_condition_var(self, bRet, sMsg):    # 사용자 조건검색식 수신 함수
 
        conditionNameList = self.kiwoom.dynamicCall('GetConditionNameList()'# 수신된 사용자 조건검색식 리스트를 받아옴 (ex. 인덱스^조건명;)
        conditionNameListArray = conditionNameList.rstrip(';').split(';')  # 조건검색식 리스트에 마지막 ";" 기호를 삭제하고 ";" 기호 기준 분리
 
        for i in range(0len(conditionNameListArray)): # 조건검색식 개수만큼 반복
            self.cbCdtNm.addItem(conditionNameListArray[i])  # 콤보 박스에 조건 셋팅
 
        index = self.cbCdtNm.findText('191^ULPTrading')   # 조건검색식 명으로 순번을 찾음
        if index >= 0:  # 해당 순번이 있다면 (해당 조건검색식 명이 있다면)
            self.cbCdtNm.setCurrentIndex(index) # 해당 순번을 선택 (해당 조검검색식을 선택)
 
# py 파일 실행시 제일 먼저 동작
if __name__ == "__main__":
    app = QApplication(sys.argv)
    myWindow = MyWindow()  # MyWindow 클래스를 생성하여 myWondow 변수에 할당
    myWindow.show()  # MyWindow 클래스를 노출
    app.exec_()  # 메인 이벤트 루프에 진입 후 프로그램이 종료될 때까지 무한 루프 상태 대기


해당 소스 코드는 upperLimitPriceTrading.ui 파일을 사용하여 화면을 구성합니다.
로그인 전에는 모든 버튼 및 항목들을 비활성화 처리하며 로그인 이후 필요한 항목만 활성화로 변경합니다.
또한 로그인 이후 조건검색식 선택 박스에서 사용할 조건검색명을 자동으로 선택하도록 처리되었습니다.

해당 upperLimitPriceTrading.py 에서 Ctrl + Shift + F10 을 눌러 실행하거나
upperLimitPriceTrading.py 파일을 우클릭 후 Run 'upperLimitPriceTrading' 버튼을 클릭하여 실행하면 아래와 같이 노출됩니다.



이후 왼쪽 상단에 로그인 버튼을 클릭하여 로그인을 완료하게 되면 아래와 같이 노출됩니다.




이상으로 로그인 후 기초 화면 설정 및 계좌번호, 조건검색명을 셋팅하는 법을 알아보았습니다.

자동 매매에 특성상 거래 속도가 빠르기 때문에 로그를 작성되게 하여 후에 거래를 분석해야 합니다.
하여 다음 챕터에서는 로그를 남기는 법을 진행하도록 하겠습니다.



주식 자동매매, 주식 어플, 주식 정보 웹 스크래이핑, 공시 정보 연동 등

주식에 관심이 있는 사람들에게 도움이 될 정보를 기본부터 차근차근 정리할 예정입니다.

해당 글을 보고 지적 사항, 수정 사항이 있다면 언제든지 댓글, 또는 메일로 연락 부탁드립니다.

여러분의 관심이 글을 보는 다음 누군가에겐 큰 도움이 될 것입니다. 감사합니다.