웹스쿨

뉴스자동매매, 매수로직 적용완료 본문

개인 프로젝트/파이썬 뉴스매매

뉴스자동매매, 매수로직 적용완료

마스터욱 2023. 3. 30. 01:47
반응형
def receiveTrData(self, screenNo, requestName, trcode, recordName, inquiry,
deprecated1, deprecated2, deprecated3, deprecated4):
"""
TR 수신 이벤트

조회요청 응답을 받거나 조회데이터를 수신했을 때 호출됩니다.
requestName과 trCode는 commRqData()메소드의 매개변수와 매핑되는 값 입니다.
조회데이터는 이 이벤트 메서드 내부에서 getCommData() 메서드를 이용해서 얻을 수 있습니다.

:param screenNo: string - 화면번호(4자리)
:param requestName: string - TR 요청명(commRqData() 메소드 호출시 사용된 requestName)
:param trcode: string
:param recordName: string
:param inquiry: string - 조회('0': 남은 데이터 없음, '2': 남은 데이터 있음)
"""
print("====================================")
print("receiveTrData 실행, screenNo = " + screenNo + ", requestName = " + requestName + ", trcode = " + trcode)
'''
if requestName == "관심종목정보요청":
data = self.getCommDataEx(trCode, "관심종목정보")
'''

temp = re.split("_WOOK_", requestName)
requestName = temp[0]
code = temp[1]

if requestName == "매수요청":
name = self.dynamicCall("CommGetData(QString, QString, QString, int, QString)", trcode, "", requestName, 0,
"종목명")
volume = self.dynamicCall("CommGetData(QString, QString, QString, int, QString)", trcode, "", requestName,
0, "거래량")

now_price = self.dynamicCall("CommGetData(QString, QString, QString, int, QString)", trcode, "",
requestName, 0, "현재가")
n_price = abs(int(now_price.strip()))

# strData = OpenAPI.GetCommData(sTrcode, strRQName, nIdx, _T("종목코드")); strData.Trim();
# strData = OpenAPI.GetCommData(sTrcode, strRQName, nIdx, _T("거래량")); strData.Trim();
# strData = OpenAPI.GetCommData(sTrcode, strRQName, nIdx, _T("시가")); strData.Trim();
# strData = OpenAPI.GetCommData(sTrcode, strRQName, nIdx, _T("고가")); strData.Trim();
# strData = OpenAPI.GetCommData(sTrcode, strRQName, nIdx, _T("저가")); strData.Trim();
# strData = OpenAPI.GetCommData(sTrcode, strRQName, nIdx, _T("현재가")); strData.Trim();

'''
[SendOrder() 함수]

SendOrder(
BSTR sRQName, // 사용자 구분명
BSTR sScreenNo, // 화면번호
BSTR sAccNo, // 계좌번호 10자리
LONG nOrderType, // 주문유형 1:신규매수, 2:신규매도 3:매수취소, 4:매도취소, 5:매수정정, 6:매도정정
BSTR sCode, // 종목코드
LONG nQty, // 주문수량
LONG nPrice, // 주문가격
BSTR sHogaGb, // 거래구분(혹은 호가구분)은 아래 참고
BSTR sOrgOrderNo // 원주문번호입니다. 신규주문에는 공백, 정정(취소)주문할 원주문번호를 입력합니다.
)

9개 인자값을 가진 국내 주식주문 함수이며 리턴값이 0이면 성공이며 나머지는 에러입니다.
1초에 5회만 주문가능하며 그 이상 주문요청하면 에러 -308을 리턴합니다.

[거래구분]
모의투자에서는 지정가 주문과 시장가 주문만 가능합니다.

00 : 지정가
03 : 시장가
05 : 조건부지정가
06 : 최유리지정가
07 : 최우선지정가
10 : 지정가IOC
13 : 시장가IOC
16 : 최유리IOC
20 : 지정가FOK
'''

msg = ""
# msg += "==============================================\n"
# msg += "종목코드 : " + code + "\n"
# msg += "종목명 : " + name.strip() + "\n"
# msg += "거래량 : " + volume.strip() + "\n"
# msg += "현재가 : " + str(n_price) + "\n"

buy_count = int(self.buy_money) / int(n_price)
buy_count = int(buy_count)

buy_account_number = myWindow.account_box.currentText()

# 여기서 매수하자
returnCode = self.dynamicCall(
"SendOrder(QString, QString, QString, int, QString, int, int, QString, QString)",
["매수시도_WOOK_" + code, "4989", buy_account_number, 1, code, buy_count, "", "03", ""])

msg += "==============================================\n"
if returnCode != 0:
msg += "매수실패 : " + str(returnCode)
self.KiwoomProcessingError("SendOrder : " + ReturnCode.CAUSE[returnCode])
else:
# self.start_news = "NO"
# msg = "=============================================\n"
# msg = msg + "매수성공, 종목코드 = " + code + ", 계좌번호 = " + buy_account_number
# print(msg)
msg += "구매종목코드 : " + code + "\n"
msg += "구매가능금액 : " + str(self.buy_money) + "\n"
msg += "구매가능갯수 : " + str(buy_count) + "\n"
msg += "구매계좌번호 : " + str(buy_account_number) + "\n"
msg += "\n"

# 로그남기기
myWindow.set_logbox(msg)

매수 소스코드까지 성공적으로 제작했습니다.

풀 소스가 너무 길어서 이제 핵심부분만 올리겠습니다.(메인소스 1,000줄 넘어감)

 

Qt Designer 를 사용하니 너무 편리하네요.

마지막 최종작업만이 남았습니다.

구매완료후 데이터베이스에 구매내역 남기기.


이 게시글은
https://webschool.kr/?v=board_view&board_key=30&idx=480
에서 작성한 글입니다. 소스코드의 경우 해당 블로그에서 이뿌게 노출이 되지 않을 수 있사오니, 위 링크로 들어오셔서 보시길 바랍니다.

반응형