[키움 자동매매 프로그램] - 분할 자동매매 알고리즘(Qthread_6.py) 구현
저번 포스팅에 이어 이번 포스팅에서는 분할 자동매매를 진행하는 코드를 구현한다.
Division_Stock.py의 start_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]