9 minute read

저번 포스팅에 이어 이번 포스팅에서는 분할 자동매매를 진행하는 코드를 구현한다.

Division_Stock.pystart_real_auto 메서드는 Thread6으로 구현된다.

Thread6은 Qthread_6.py 파일로 구현한다.

Qthread_6.py 구현

Qthread_6.py - init 생성


import os



from PyQt5.QtCore import *

from kiwoom import Kiwoom

from kiwoomType import *

from PyQt5.QtWidgets import *



class Thread6(QThread) :

    def __init__(self, parent) :

        super().__init__(parent)

        self.parent = parent

        

        self.k = Kiwoom()

        

        self.account_num = self.k.acc_number

        

        self.Getanal_code = {}

        

        self.Load_code()

        

        self.orderitemlist_1 = []       # 중복 매수 금지(1차 매수)

        self.orderitemlist_2 = []       # 중복 매수 금지(2차 매수)

        self.orderitemlist_3 = []       # 중복 매수 금지(3차 매수)

        self.orderitemlist_4 = []       # 중복 매수 금지(4차 매수)

        self.orderitemlist_5 = []       # 중복 매도 금지(1차 매도)

        self.orderitemlist_6 = []       # 중복 매도 금지(2차 매도)

        self.orderitemlist_7 = []       # 중복 매도 금지(3차 매도)

        self.orderitemlist_8 = []       # 중복 매도 금지(4차 매도)

        self.orderitemlist_9 = []

        self.orderitemlist_10 = []      # 중복 재매수 금지

        

        self.cancel_the_order = []

        

        self.screen_num = 5000

        self.realType = RealType()

        

        for code in self.k.portfolio_stock_dict.keys() :

            fids = self.realType.REALTYPE['주식체결']['체결시간']

            self.k.kiwoom.dynamicCall("SetRealReg(QString, QString, QString, QString)", self.screen_num, code, fids, "1")

            self.screen_num += 1



        print("종목등록 완료")

        print(self.k.portfolio_stock_dict.keys())       #장 시작 전/후 상태 확인용 스크린 번호

        

        self.screen_start_stop_real = "300"

        self.k.kiwoom.dynamicCall("SetRealReg(QString, QString, QString, QString)",

                                  self.screen_start_stop_real, '', self.realType.REALTYPE['장시작시간']['장운영구분'], "0")     # 장의 시작인지 장 외인지등에 대한 정보 수신

        

        ### 실시간 슬롯

        self.k.kiwoom.OnReceiveRealData.connect(self.realdata_slot)     # 실시간 데이터를 받아오는 곳

        self.k.kiwoom.OnReceiveChejanData.connect(self.chejan_slot)     # (주문접수, 체결통보) = 0, (잔고변경) = 1, 데이터 전송

사용자의 계좌번호, 감시박스의 가격 저장 리스트 등 데이터 초기화를 해준다.

이전과 동일하게 포트폴리오에 등록된 종목들을 등록하여 서버에서 실시간 데이터를 받아온다.

또한, 장의 시작구분 및 실시간 데이터를 수신하고 주문 전송, 체결 통보등을 위한 메서드를 실행한다.


종목 업데이트

buylast에 존재하는 종목들을 포트폴리오에 넣고 업데이트된 포트폴리오로 자동매매를 시작하게 된다.

따라서 먼저 포트폴리오에 거래할 종목들을 넣어주아야 하는데, 그 부분을 다음 코드가 담당하고 있다.


self.Load_code()


그리고 Load_code 메서드는 다음과 같이 구현된다.


def Load_code(self) :

    screen = 4000

    

    # 포트폴리오에 아래의 내용 업데이트

    for row in range(self.parent.buylast.rowCount()) :

        code_n = self.parent.buylast.item(row, 0).text()

        name = self.parent.buylast.item(row, 1).text().strip()

        self.Getanal_code.update({code_n : {}})

        self.k.portfolio_stock_dict.update({code_n : {"1차가격" : int(self.parent.buylast.item(row, 3).text().replace(",", ""))}})

        self.k.portfolio_stock_dict.update({code_n : {"1차수량" : int(self.parent.buylast.item(row, 4).text().replace(",", ""))}})

        self.k.portfolio_stock_dict.update({code_n : {"2차가격" : int(self.parent.buylast.item(row, 5).text().replace(",", ""))}})

        self.k.portfolio_stock_dict.update({code_n : {"2차수량" : int(self.parent.buylast.item(row, 6).text().replace(",", ""))}})

        self.k.portfolio_stock_dict.update({code_n : {"3차가격" : int(self.parent.buylast.item(row, 7).text().replace(",", ""))}})

        self.k.portfolio_stock_dict.update({code_n : {"3차수량" : int(self.parent.buylast.item(row, 8).text().replace(",", ""))}})

        self.k.portfolio_stock_dict.update({code_n : {"4차가격" : int(self.parent.buylast.item(row, 9).text().replace(",", ""))}})

        self.k.portfolio_stock_dict.update({code_n : {"4차수량" : int(self.parent.buylast.item(row, 10).text().replace(",", ""))}})

        self.k.portfolio_stock_dict.update({code_n : {"5차가격" : int(self.parent.buylast.item(row, 11).text().replace(",", ""))}})

        self.k.portfolio_stock_dict.update({code_n : {"5차수량" : int(self.parent.buylast.item(row, 12).text().replace(",", ""))}})

        self.k.portfolio_stock_dict.update({code_n : {"6차가격" : int(self.parent.buylast.item(row, 13).text().replace(",", ""))}})

        self.k.portfolio_stock_dict.update({code_n : {"6차수량" : int(self.parent.buylast.item(row, 14).text().replace(",", ""))}})

        self.k.portfolio_stock_dict.update({code_n : {"7차가격" : int(self.parent.buylast.item(row, 15).text().replace(",", ""))}})

        self.k.portfolio_stock_dict.update({code_n : {"7차수량" : int(self.parent.buylast.item(row, 16).text().replace(",", ""))}})

        self.k.portfolio_stock_dict.update({code_n : {"8차가격" : int(self.parent.buylast.item(row, 17).text().replace(",", ""))}})

        self.k.portfolio_stock_dict.update({code_n : {"8차수량" : int(self.parent.buylast.item(row, 18).text().replace(",", ""))}})

        

        self.k.portfolio_stock_dict[code_n].update({"종목명" : name})

        self.k.portfolio_stock_dict[code_n].update({"주문용스크린번호" : screen})

        

        screen += 1

포트폴리오에 거래 종목의 감시가격들에 대한 정보들을 넣어준다.

각 종목마다 스크린 번호를 매겨주기 위해 screen을 1 더해준다.


주식 체결

주식 체결 - 장 상태 파악 및 종목 데이터 수신

해당 부분은 Qthread_3.py의 realdata_slot() 메서드와 동일한 알고리즘이다.

따라서 대부분의 설명은 생략한다.


def realdata_slot(self, sCode, sRealType, sRealData) :

    if sRealType == "장시작시간" :

        fid = self.realType.REALTYPE[sRealType]['장운영구분']

        

        value = self.k.kiwoom.dynamicCall("GetCommRealData(QString, int)", sCode, fid)

        

        if value == '0' :

            print("장 시작 전")

            

        elif value == '3' :

            print('장 시작')

            

        elif value == '2' :

            print('장 종료, 동시호가로 넘어감')

        

        elif value == '4' :

            print('장 마감')

            

    elif sRealType =='주식체결' and sCode in self.k.portfolio_stock_dict :

        fid1 = self.realType.REALTYPE[sRealType]['체결시간']

        a = self.k.kiwoom.dynamicCall("GetCommRealData(QString, int)", sCode, fid1)

        

        fid2 = self.realType.REALTYPE[sRealType]['현재가']

        b = self.k.kiwoom.dynamicCall("GetCommRealData(QString, int)", sCode, fid2)

        b = abs(int(b))

        

        fid3 = self.realType.REALTYPE[sRealType]['전일대비']

        c = self.k.kiwoom.dynamicCall("GetCommRealData(QString, int)", sCode, fid3)

        c = abs(int(c))

        

        fid4 = self.realType.REALTYPE[sRealType]['등락율']

        d = self.k.kiwoom.dynamicCall("GetCommRealData(QString, int)", sCode, fid4)

        d = abs(float(d))

        

        fid5 = self.realType.REALTYPE[sRealType]['(최우선)매도호가']

        e = self.k.kiwoom.dynamicCall("GetCommRealData(QString, int)", sCode, fid5)

        e = abs(int(e))

        

        fid6 = self.realType.REALTYPE[sRealType]['(최우선)매수호가']

        f = self.k.kiwoom.dynamicCall("GetCommRealData(QString, int)", sCode, fid6)

        f = abs(int(f))

        

        fid7 = self.realType.REALTYPE[sRealType]['거래량']

        g = self.k.kiwoom.dynamicCall("GetCommRealData(QString, int)", sCode, fid7)

        g = abs(int(g))

        

        fid8 = self.realType.REALTYPE[sRealType]['누적거래량']

        h = self.k.kiwoom.dynamicCall("GetCommRealData(QString, int)", sCode, fid8)

        h = abs(int(h))

        

        fid9 = self.realType.REALTYPE[sRealType]['고가']

        i = self.k.kiwoom.dynamicCall("GetCommRealData(QString, int)", sCode, fid9)

        i = abs(int(i))

        

        fid10 = self.realType.REALTYPE[sRealType]['시가']

        j = self.k.kiwoom.dynamicCall("GetCommRealData(QString, int)", sCode, fid10)

        j = abs(int(j))

        

        fid11 = self.realType.REALTYPE[sRealType]['저가']

        k = self.k.kiwoom.dynamicCall("GetCommRealData(QString, int)", sCode, fid11)

        k = abs(int(k))

        

        fid12 = self.realType.REALTYPE[sRealType]['거래회전율']

        l = self.k.kiwoom.dynamicCall("GetCommRealData(QString, int)", sCode, fid12)

        l = abs(float(l))

        

        if sCode not in self.k.portfolio_stock_dict :

            self.k.portfolio_stock_dict.update({sCode : {}})

            

        self.k.portfolio_stock_dict[sCode].update({"체결시간" : a})

        self.k.portfolio_stock_dict[sCode].update({"현재가" : b})

        self.k.portfolio_stock_dict[sCode].update({"전일대비" : c})

        self.k.portfolio_stock_dict[sCode].update({"등락율" : d})

        self.k.portfolio_stock_dict[sCode].update({"(최우선)매도호가" : e})

        self.k.portfolio_stock_dict[sCode].update({"(최우선)매수호가" : f})

        self.k.portfolio_stock_dict[sCode].update({"거래량" : g})

        self.k.portfolio_stock_dict[sCode].update({"누적거래량" : h})

        self.k.portfolio_stock_dict[sCode].update({"고가" : i})

        self.k.portfolio_stock_dict[sCode].update({"시가" : j})

        self.k.portfolio_stock_dict[sCode].update({"저가" : k})

        self.k.portfolio_stock_dict[sCode].update({"거래회전율" : l})

Qthread_3.py에서 구현했던 것과 동일하다. (설명 생략)


매수 알고리즘

UI에 보면 총 1차, 2차 3차, 4차 이렇게 4개의 지정가 별로 매수가 존재한다.

그렇다면 각각의 매수 알고리즘은 유사한 형태를 가져야 하며 1차 매수만 보면 다음과 같다.


# 1차 매수

if self.k.portfolio_stock_dict[sCode]['현재가'] <= self.k.portfolio_stock_dict[sCode]['1차가격'] :

    if sCode not in self.orderitemlist_1 and '1' not in self.Getanal_code[sCode] :

        wa = []

        wa.append(sCode)

        

        if len(wa) > 1:

            wa.clear()

            pass

        else :

            print("1차 매수 시작 %s" % sCode)

            

            self.orderitemlist_1.append(sCode)

            

            order_success1 = self.k.kiwoom.dynamicCall(

                "SendOrder(QString, QString, QString, int, QString, int, int, QString, QString)",

                ['신규매수', self.k.portfolio_stock_dict[sCode]['주문용스크린번호'], self.account_num, 1, sCode,

                    self.k.portfolio_stock_dict['1차수량'], self.k.portfolio_stock_dict[sCode]['현재가'],

                    self.realType.SENDTYPE['거래구분']['지정가'], ""])

            

            wf2 = open("dist/buy_database.txt", "a", encoding="utf8")

            wf2.write("%s\t%s\t%s\t%s\n" % ("1", sCode, b, self.k.portfolio_stock_dict[sCode]['채결시간']))

            wf2.close()

            

            if order_success1 == 0:

                print("최우선매수호가로 주문 전달 성공")

            else :

                print("최우선매수호가로 주문 전달 실패")

Qthread_3.py의 매수 알고리즘과 유사하며 2차, 3차, 4차 알고리즘에서 바뀌어야 할 부분은 지정된 가격과, 종목 거래 수량이다.

여기서 만약 buy_database.txt 데이터베이스에 각각의 매수에 변화를 주기위해 맨 앞에 1차면 “1”, 2차면 “2”, … 이런식으로 번호를 매겨준다면 구분할 수 있을 것이다.


매도 알고리즘

매도 알고리즘도 Qthread3.py의 매도 알고리즘과 유사하다.

단지 달라져야 할 부분은 위에서의 매수 알고리즘과 동일하게 1차, 2차, 3차, 4차 매도마다 값만 바꿔주면 된다.


# 1차 매도

if self.k.portfolio_stock_dict[sCode]['현재가'] <= self.k.portfolio_stock_dict[sCode]['5차가격'] :

    if sCode not in self.orderitemlist_5 and '5' not in self.Getanal_code[sCode] :

        wa = []

        wa.append(sCode)

        

        if len(wa) > 1:

            wa.clear()

            pass

        else :

            print("1차 매도 시작 %s" % sCode)

            

            self.orderitemlist_5.append(sCode)

            

            order_success1 = self.k.kiwoom.dynamicCall(

                "SendOrder(QString, QString, QString, int, QString, int, int, QString, QString)",

                ['신규매도', self.k.portfolio_stock_dict[sCode]['주문용스크린번호'], self.account_num, 2, sCode,

                    self.k.portfolio_stock_dict['5차수량'], self.k.portfolio_stock_dict[sCode]['현재가'],

                    self.realType.SENDTYPE['거래구분']['지정가'], ""])

            

            wf2 = open("dist/buy_database.txt", "a", encoding="utf8")

            wf2.write("%s\t%s\t%s\t%s\n" % ("5", sCode, b, self.k.portfolio_stock_dict[sCode]['채결시간']))

            wf2.close()

            

            if order_success1 == 0:

                print("최우선매도호가로 주문 전달 성공")

            else :

                print("최우선매도호가로 주문 전달 실패")


미체결 잔고 매수/매도 취소


# 미체결 잔고 매수/매도 취소

not_stock_list = list(self.k.not_account_stock_dict)

if len(self.k.not_account_stock_dict) > 0 :

    for order_num in not_stock_list :

        code = self.k.not_account_stock_dict[order_num]["종목코드"]

        stock_price = self.k.not_account_stock_dict[order_num]["주문가격"]

        not_quantity = self.k.not_account_stock_dict[order_num]["미체결수량"]

        order_gubun = self.k.not_account_stock_dict[order_num]['주문구분']

        

        # 매수 취소 주문

        if order_gubun == "매수" and not_quantity > 0 and stock_price < self.k.portfolio_stock_dict[sCode]["현재가"] :

            order_success = self.k.kiwoom.dynamicCall("SendOrder(QString, QString, QString, int, QString, int, int, QString, QString)",

                                                        ["매수취소", self.k.portfolio_stock_dict[sCode]['주문용스크린번호'], self.account_num, 3, code, 0, 0,

                                                        self.realType.SENDTYPE['거래구분']['지정가'], order_num])

            

            if order_success == 0 :

                print("%s 매수취소 전달 성공" % code)

                self.cancel_the_order.append(code)

            else :

                print("%s 매수취소 전달 실패" %code)

            

            wf2 = open("dist/cancel_database.txt", "a", encoding="utf8")

            wf2.write("%s\t%s\t%s\t%s\n" % ("매수취소", self.k.portfolio_stock_dict[sCode]["종목명"], not_quantity, self.k.portfolio_stock_dict[sCode]["체결시간"]))

            wf2.close()

        

        elif not_quantity == 0:

            del self.k.not_account_stock_dict[order_num]

    

        # 매도 취소 주문    

        elif order_gubun =="매도" and not_quantity > 0 and self.k.portfolio_stock_dict[sCode]["현재가"] < stock_price :

            order_success = self.k.kiwoom.dynamicCall("SendOrder(QString, QString, QString, int, QString, int, int, QString, QString)",

                                                        ["매도취소", self.k.portfolio_stock_dict[sCode]['주문용스크린번호'], self.account_num, 4, code, 0, 0,

                                                        self.realType.SENDTYPE['거래구분']['지정가'], order_num])

            wf2 = open("dist/cancel_database.txt", "a", encoding="utf8")

            wf2.write("%s\t%s\t%s\t%s\n" % ("매도취소", self.k.portfolio_stock_dict[sCode]['종목명'], not_quantity, self.k.portfolio_stock_dict[sCode]['체결시간']))

            wf2.close()  

        

            if order_success == 0 :

                print("%s 매도취소 전달 성공 % code")

                self.cancel_the_order.append(code)

            else :

                print("%s 매도취소전달 실패" % code)


재 매수 알고리즘


# 재 매수 알고리즘

elif sCode in self.cancel_the_order :

    if self.k.portfolio_stock_dict[sCode]["현재가"] <= self.k.portfolio_stock_dict[sCode]["매수가"] :

        if sCode not in self.orderitemlist_10 :

            wa = []

            wa.append(sCode)

            

            if len(wa) > 1 :

                wa.clear()

                pass

            else :

                print("재매수 시작 %s" % code)

                

                self.orderitemlist_10.append(sCode)

                order_success3 = self.k.kiwoom.dynamicCall("SendOrdeR(QString, QString, QString, int, QString, int, int, QString, QString)",

                                                            ["신규매수", self.k.portfolio_stock_dict[sCode]['주문용스크린번호'], self.account_num, 1, sCode,

                                                            self.k.portfolio_stock_dict[sCode]["매수수량"], self.k.portfolio_stock_dict[sCode]["현재가"],

                                                            self.realType.SENDTYPE['거래구분']['지정가'], ""])

                

            wf2 = open("dist/buy_database.txt", "a", encoding="utf8")

            wf2.write("%s\t%s\t%s\t%s\n" % ("재매수정보", self.k.portfolio_stock_dict[sCode]["종목명"], self.k.portfolio_stock_dict[sCode]["체결시간"]))

            wf2.close()

            

            if order_success3 == 0 :

                print("재매수 주문 전달 성공")

            else :

                print("재매수 주문 전달 실패")


체결 통보, 잔고 업데이트

체결 통보, 잔고 업데이트도 마찬가지로 Qthread_3.py에 구현한 것과 동일하다.

체결 통보


def chejan_slot(self, sGubun, nItemCnt, sFIdList) :

    if sGubun == "0" :

        print("매수/매도 중. 미체결 잔고 업데이트")

    else :

        print("미체결잔고 해결로 실제 잔고 업데이트")

        

    if int(sGubun) == 0 :

        account_num = self.k.kiwoom.dynamicCall("GetChejanData(int)", self.realType.REALTYPE['주문체결']['계좌번호'])

        sCode = self.k.kiwoom.dynamicCall("GetChejanData(int)", self.realType.REALTYPE['주문체결']['종목코드'])

        stock_name = self.k.kiwoom.dynamicCall("GetChejanData(int)", self.realType.REALTYPE['주문체결']['종목명'])

        stock_name = stock_name.strip()

        origin_order_number = self.k.kiwoom.dynamicCall("GetChejanData(int)", self.realType.REALTYPE['주문체결']['원주문번호'])

        order_number = self.k.kiwoom.dynamicCall("GetChejanData(int)", self.realType.REALTYPE['주문체결']['주문번호'])

        order_status = self.k.kiwoom.dynamicCall("GetChejanData(int)", self.realType.REALTYPE['주문체결']['주문상태'])

        order_quan = self.k.kiwoom.dynamicCall("GetChejanData(int)", self.realType.REALTYPE['주문체결']['주문수량'])

        order_quan = int(order_quan)

        order_price = self.k.kiwoom.dynamicCall("GetChejanData(int)", self.realType.REALTYPE['주문체결']['주문가격'])

        order_price = int(order_price)

        not_chegual_quan = self.k.kiwoom.dynamicCall("GetChejanData(int)", self.realType.REALTYPE['주문체결']['미체결수량'])

        not_chegual_quan = int(not_chegual_quan)

        order_gubun = self.k.kiwoom.dynamicCall("GetChejanData(int)", self.realType.REALTYPE['주문체결']['주문구분'])

        order_gubun = order_gubun.lstrip('+').lstrip('-')

        order_gubun = order_gubun.strip()

        chegual_time_str = self.k.kiwoom.dynamicCall("GetChejanData(int)", self.realType.REALTYPE['주문체결']['주문/체결시간'])

        chegual_price = self.k.kiwoom.dynamicCall("GetChejanData(int)", self.realType.REALTYPE['주문체결']['체결가'])

        if chegual_price == '' :

            chegual_price = 0

        else :

            chegual_price = int(chegual_price)

            

        chegual_quantity = self.k.kiwoom.dynamicCall("GetChejanData(int)", self.realType.REALTYPE['주문체결']['체결량'])

        if chegual_quantity == '' :

            chegual_quantity = 0

        else :

            chegual_quantity = int(chegual_quantity)

            

        current_price = self.k.kiwoom.dynamicCall("GetChejanData(int)", self.realType.REALTYPE['주문체결']['현재가'])

        current_price = abs(int(current_price))

        first_sell_price = self.k.kiwoom.dynamicCall("GetChejanData(int)", self.realType.REALTYPE['주문체결']['(최우선)매도호가'])

        first_sell_price = abs(int(first_sell_price))

        first_buy_price = self.k.kiwoom.dynamicCall("GetChejanData(int)", self.realType.REALTYPE['주문체결']['(최우선)매수호가'])

        first_buy_price = abs(int(first_buy_price))

        

        if order_number not in self.k.not_account_stock_dict.keys() :

            self.k.not_account_stock_dict.update({order_number : {}})

            

        self.k.not_account_stock_dict[order_number].update({"종목코드" : sCode})

        self.k.not_account_stock_dict[order_number].update({"종목명" : stock_name})

        self.k.not_account_stock_dict[order_number].update({"주문번호" : order_number})

        self.k.not_account_stock_dict[order_number].update({"주문상태" : order_status})

        self.k.not_account_stock_dict[order_number].update({"주문수량" : order_quan})

        self.k.not_account_stock_dict[order_number].update({"주문가격" : order_price})

        self.k.not_account_stock_dict[order_number].update({"주문구분" : order_gubun})

        self.k.not_account_stock_dict[order_number].update({"미체결수량" : not_chegual_quan})

        self.k.not_account_stock_dict[order_number].update({"체결량" : chegual_quantity})

        self.k.not_account_stock_dict[order_number].update({"원주문번호" : origin_order_number})

        self.k.not_account_stock_dict[order_number].update({"주문/체결시간" : chegual_time_str})

        self.k.not_account_stock_dict[order_number].update({"체결가" : chegual_price})

        self.k.not_account_stock_dict[order_number].update({"현재가" : current_price})

        self.k.not_account_stock_dict[order_number].update({"(최우선)매도호가" : first_sell_price})

        self.k.not_account_stock_dict[order_number].update({"(최우선)매수호가" : first_buy_price})

        

        column_head = ["종목코드", "종목명", "주문번호", "주문상태", "주문수량", "주문가격", "미체결수량"]

        colCount = len(column_head)

        rowCount = len(self.k.not_account_stock_dict)

        self.parent.not_account.setColumnCount(colCount)

        self.parent.not_account.setRowCount(rowCount)

        self.parent.not_account.setHorizontalHeaderLabels(column_head)

        

        for index in range(rowCount) :

            self.parent.not_account.setItem(index, 0, QTableWidgetItem(str(sCode)))

            self.parent.not_account.setItem(index, 1, QTableWidgetItem(str(format(stock_name))))

            self.parent.not_account.setItem(index, 2, QTableWidgetItem(str(format(order_number))))

            self.parent.not_account.setItem(index, 3, QTableWidgetItem(str(format(order_status))))

            self.parent.not_account.setItem(index, 4, QTableWidgetItem(str(format(order_quan, ","))))

            self.parent.not_account.setItem(index, 5, QTableWidgetItem(str(format(order_price, ","))))

            self.parent.not_account.setItem(index, 6, QTableWidgetItem(str(format(not_chegual_quan, ","))))

            

        print("미체결잔고 종목 추가 %s 수량 %s" % (self.k.not_account_stock_dict[order_number]["종목명"], self.k.not_account_stock_dict[order_number]["미체결수량"]))


잔고 업데이트


def chejan_slot(self, sGubun, nItemCnt, sFIdList) :

    if sGubun == "0" :

        print("매수/매도 중. 미체결 잔고 업데이트")

    else :

        print("미체결잔고 해결로 실제 잔고 업데이트")

        

    if int(sGubun) == 0 :

        account_num = self.k.kiwoom.dynamicCall("GetChejanData(int)", self.realType.REALTYPE['주문체결']['계좌번호'])

        sCode = self.k.kiwoom.dynamicCall("GetChejanData(int)", self.realType.REALTYPE['주문체결']['종목코드'])

        stock_name = self.k.kiwoom.dynamicCall("GetChejanData(int)", self.realType.REALTYPE['주문체결']['종목명'])

        stock_name = stock_name.strip()

        origin_order_number = self.k.kiwoom.dynamicCall("GetChejanData(int)", self.realType.REALTYPE['주문체결']['원주문번호'])

        order_number = self.k.kiwoom.dynamicCall("GetChejanData(int)", self.realType.REALTYPE['주문체결']['주문번호'])

        order_status = self.k.kiwoom.dynamicCall("GetChejanData(int)", self.realType.REALTYPE['주문체결']['주문상태'])

        order_quan = self.k.kiwoom.dynamicCall("GetChejanData(int)", self.realType.REALTYPE['주문체결']['주문수량'])

        order_quan = int(order_quan)

        order_price = self.k.kiwoom.dynamicCall("GetChejanData(int)", self.realType.REALTYPE['주문체결']['주문가격'])

        order_price = int(order_price)

        not_chegual_quan = self.k.kiwoom.dynamicCall("GetChejanData(int)", self.realType.REALTYPE['주문체결']['미체결수량'])

        not_chegual_quan = int(not_chegual_quan)

        order_gubun = self.k.kiwoom.dynamicCall("GetChejanData(int)", self.realType.REALTYPE['주문체결']['주문구분'])

        order_gubun = order_gubun.lstrip('+').lstrip('-')

        order_gubun = order_gubun.strip()

        chegual_time_str = self.k.kiwoom.dynamicCall("GetChejanData(int)", self.realType.REALTYPE['주문체결']['주문/체결시간'])

        chegual_price = self.k.kiwoom.dynamicCall("GetChejanData(int)", self.realType.REALTYPE['주문체결']['체결가'])

        if chegual_price == '' :

            chegual_price = 0

        else :

            chegual_price = int(chegual_price)

            

        chegual_quantity = self.k.kiwoom.dynamicCall("GetChejanData(int)", self.realType.REALTYPE['주문체결']['체결량'])

        if chegual_quantity == '' :

            chegual_quantity = 0

        else :

            chegual_quantity = int(chegual_quantity)

            

        current_price = self.k.kiwoom.dynamicCall("GetChejanData(int)", self.realType.REALTYPE['주문체결']['현재가'])

        current_price = abs(int(current_price))

        first_sell_price = self.k.kiwoom.dynamicCall("GetChejanData(int)", self.realType.REALTYPE['주문체결']['(최우선)매도호가'])

        first_sell_price = abs(int(first_sell_price))

        first_buy_price = self.k.kiwoom.dynamicCall("GetChejanData(int)", self.realType.REALTYPE['주문체결']['(최우선)매수호가'])

        first_buy_price = abs(int(first_buy_price))

        

        if order_number not in self.k.not_account_stock_dict.keys() :

            self.k.not_account_stock_dict.update({order_number : {}})

            

        self.k.not_account_stock_dict[order_number].update({"종목코드" : sCode})

        self.k.not_account_stock_dict[order_number].update({"종목명" : stock_name})

        self.k.not_account_stock_dict[order_number].update({"주문번호" : order_number})

        self.k.not_account_stock_dict[order_number].update({"주문상태" : order_status})

        self.k.not_account_stock_dict[order_number].update({"주문수량" : order_quan})

        self.k.not_account_stock_dict[order_number].update({"주문가격" : order_price})

        self.k.not_account_stock_dict[order_number].update({"주문구분" : order_gubun})

        self.k.not_account_stock_dict[order_number].update({"미체결수량" : not_chegual_quan})

        self.k.not_account_stock_dict[order_number].update({"체결량" : chegual_quantity})

        self.k.not_account_stock_dict[order_number].update({"원주문번호" : origin_order_number})

        self.k.not_account_stock_dict[order_number].update({"주문/체결시간" : chegual_time_str})

        self.k.not_account_stock_dict[order_number].update({"체결가" : chegual_price})

        self.k.not_account_stock_dict[order_number].update({"현재가" : current_price})

        self.k.not_account_stock_dict[order_number].update({"(최우선)매도호가" : first_sell_price})

        self.k.not_account_stock_dict[order_number].update({"(최우선)매수호가" : first_buy_price})

        

        column_head = ["종목코드", "종목명", "주문번호", "주문상태", "주문수량", "주문가격", "미체결수량"]

        colCount = len(column_head)

        rowCount = len(self.k.not_account_stock_dict)

        self.parent.not_account.setColumnCount(colCount)

        self.parent.not_account.setRowCount(rowCount)

        self.parent.not_account.setHorizontalHeaderLabels(column_head)

        

        for index in range(rowCount) :

            self.parent.not_account.setItem(index, 0, QTableWidgetItem(str(sCode)))

            self.parent.not_account.setItem(index, 1, QTableWidgetItem(str(format(stock_name))))

            self.parent.not_account.setItem(index, 2, QTableWidgetItem(str(format(order_number))))

            self.parent.not_account.setItem(index, 3, QTableWidgetItem(str(format(order_status))))

            self.parent.not_account.setItem(index, 4, QTableWidgetItem(str(format(order_quan, ","))))

            self.parent.not_account.setItem(index, 5, QTableWidgetItem(str(format(order_price, ","))))

            self.parent.not_account.setItem(index, 6, QTableWidgetItem(str(format(not_chegual_quan, ","))))

            

        print("미체결잔고 종목 추가 %s 수량 %s" % (self.k.not_account_stock_dict[order_number]["종목명"], self.k.not_account_stock_dict[order_number]["미체결수량"]))

        

    elif int(sGubun) == 1 :

        account_num = self.k.kiwoom.dynamicCall("GetChejanData(int)", self.realType.REALTYPE['잔고']['계좌번호'])

        sCode = self.k.kiwoom.dynamicCall("GetChejanData(int)", self.realType.REALTYPE['잔고']['종목코드'])[1:]

        stock_name = self.k.kiwoom.dynamicCall("GetChejanData(int)", self.realType.REALTYPE['잔고']['종목명'])

        stock_name = stock_name.strip()

        current_price = self.k.kiwoom.dynamicCall("GetChejanData(int)", self.realType.REALTYPE['잔고']['현재가'])

        current_price = abs(int(current_price))

        stock_quan = self.k.kiwoom.dynamicCall("GetChejanData(int)", self.realType.REALTYPE['잔고']['보유수량'])

        stock_quan = int(stock_quan)

        like_quan = self.k.kiwoom.dynamicCall("GetChejanData(int)", self.realType.REALTYPE['잔고']['주문가능수량'])

        like_quan = int(like_quan)

        buy_price = self.k.kiwoom.dynamicCall("GetChejanData(int)", self.realType.REALTYPE['잔고']['매입단가'])

        buy_price = abs(int(buy_price))

        total_buy_price = self.k.kiwoom.dynamicCall("GetChejanData(int)", self.realType.REALTYPE['잔고']['총매입가'])

        total_buy_price = int(total_buy_price)

        stock_gubun = self.k.kiwoom.dynamicCall("GetChejanData(int)", self.realType.REALTYPE['잔고']['매도매수구분'])

        stock_gubun = self.realType.REALTYPE['매도수구분'][stock_gubun]

        first_sell_price = self.k.kiwoom.dynamicCall("GetChejanData(int)", self.realType.REALTYPE['잔고']['(최우선)매도호가'])

        first_sell_price = int(first_sell_price)

        first_buy_price = self.k.kiwoom.dynamicCall("GetChejanData(int)", self.realType.REALTYPE['잔고']['(최우선)매수호가'])

        first_buy_price = int(first_buy_price)

        first_buy_price1 = self.k.kiwoom.dynamicCall("GetChejanData(int)", self.realType.REALTYPE['잔고']['예수금'])

        first_buy_price1 = int(first_buy_price1)

        

        if sCode not in self.k.jango_dict.keys() :

            self.k.jango_dict.update({sCode : {}})

            

        self.k.jango_dict[sCode].update({"현재가" : current_price})

        self.k.jango_dict[sCode].update({"종목코드" : sCode})

        self.k.jango_dict[sCode].update({"종목명" : stock_name})

        self.k.jango_dict[sCode].update({"보유수량" : stock_quan})

        self.k.jango_dict[sCode].update({"주문가능수량" : like_quan})

        self.k.jango_dict[sCode].update({"매입단가" : buy_price})

        self.k.jango_dict[sCode].update({"총매입가" : total_buy_price})

        self.k.jango_dict[sCode].update({"매도매수구분" : stock_gubun})

        self.k.jango_dict[sCode].update({"(최우선)매도호가" : first_sell_price})

        self.k.jango_dict[sCode].update({"(최우선)매수호가" : first_buy_price})

        

        if sCode in self.k.acc_portfolio.keys() and stock_quan == 0 :

            del self.k.acc_portfolio[sCode]