"대신증권 매수 매도"의 두 판 사이의 차이
DB CAFE
(→현금 매수주문) |
(→대신 증권 자동매매 프로그램 설치) |
(같은 사용자의 중간 판 2개는 보이지 않습니다) | |
(차이 없음)
|
2020년 11월 26일 (목) 19:11 기준 최신판
thumb_up 추천메뉴 바로가기
- DBA { Oracle DBA 명령어 > DBA 초급 과정 > DBA 고급 과정 }
- 튜닝 { 오라클 튜닝 목록 }
- 모델링 { 데이터 모델링 가이드 }
목차
1 주의사항[편집]
API 사용시에 문자열, 정수형, char 타입을 정확하게 지정해야 함. 파이썬에서 char타입으로 값을 넘겨주려면 ord("1") 같이 사용
2 모듈 정보[편집]
- CpTrade.CpTdUtil: 계좌 정보 획득
- CpTrade.CpTd6033: 계좌 종목 정보 조회
- CpTrade.CpTd0311: 매수, 매도
- Dscbo1.StockJpBid2: 호가 조회
- CpTrade.CpTd5341: 체결 내역 확인
3 주문 체결 실시간 처리 예제[편집]
import win32com.client
instCpTdUtil = win32com.client.Dispatch("CpTrade.CpTdUtil")
instCpTd0311 = win32com.client.Dispatch("CpTrade.CpTd0311")
instCpTdUtil.TradeInit()
accountNumber = instCpTdUtil.AccountNumber[0]
instCpTd0311.SetInputValue(0, 2)
instCpTd0311.SetInputValue(1, accountNumber)
instCpTd0311.SetInputValue(3, 'A003540')
instCpTd0311.SetInputValue(4, 10)
instCpTd0311.SetInputValue(5, 13000)
instCpTd0311.BlockRequest()
4 현재가 조회[편집]
- 요청 시작 : 종목에 대해서 조회 요청, 실시간 등록
- 요청 종료 : 종목 실시간 해지
import sys
from PyQt5.QtWidgets import *
import win32com.client
class CpEvent:
instance = None
def OnReceived(self):
# time = CpEvent.instance.GetHeaderValue(3) # 시간
timess = CpEvent.instance.GetHeaderValue(18) # 초
exFlag = CpEvent.instance.GetHeaderValue(19) # 예상체결 플래그
cprice = CpEvent.instance.GetHeaderValue(13) # 현재가
diff = CpEvent.instance.GetHeaderValue(2) # 대비
cVol = CpEvent.instance.GetHeaderValue(17) # 순간체결수량
vol = CpEvent.instance.GetHeaderValue(9) # 거래량
if (exFlag == ord('1')): # 동시호가 시간 (예상체결)
print("실시간(예상체결)", timess, "*", cprice, "대비", diff, "체결량", cVol, "거래량", vol)
elif (exFlag == ord('2')): # 장중(체결)
print("실시간(장중 체결)", timess, cprice, "대비", diff, "체결량", cVol, "거래량", vol)
class CpStockCur:
def Subscribe(self, code):
self.objStockCur = win32com.client.Dispatch("DsCbo1.StockCur")
win32com.client.WithEvents(self.objStockCur, CpEvent)
self.objStockCur.SetInputValue(0, code)
CpEvent.instance = self.objStockCur
self.objStockCur.Subscribe()
def Unsubscribe(self):
self.objStockCur.Unsubscribe()
class CpStockMst:
def Request(self, code):
# 연결 여부 체크
objCpCybos = win32com.client.Dispatch("CpUtil.CpCybos")
bConnect = objCpCybos.IsConnect
if (bConnect == 0):
print("PLUS가 정상적으로 연결되지 않음. ")
return False
# 현재가 객체 구하기
objStockMst = win32com.client.Dispatch("DsCbo1.StockMst")
objStockMst.SetInputValue(0, code) # 종목 코드 - 삼성전자
objStockMst.BlockRequest()
# 현재가 통신 및 통신 에러 처리
rqStatus = objStockMst.GetDibStatus()
rqRet = objStockMst.GetDibMsg1()
print("통신상태", rqStatus, rqRet)
if rqStatus != 0:
return False
# 현재가 정보 조회
code = objStockMst.GetHeaderValue(0) # 종목코드
name = objStockMst.GetHeaderValue(1) # 종목명
time = objStockMst.GetHeaderValue(4) # 시간
cprice = objStockMst.GetHeaderValue(11) # 종가
diff = objStockMst.GetHeaderValue(12) # 대비
open = objStockMst.GetHeaderValue(13) # 시가
high = objStockMst.GetHeaderValue(14) # 고가
low = objStockMst.GetHeaderValue(15) # 저가
offer = objStockMst.GetHeaderValue(16) # 매도호가
bid = objStockMst.GetHeaderValue(17) # 매수호가
vol = objStockMst.GetHeaderValue(18) # 거래량
vol_value = objStockMst.GetHeaderValue(19) # 거래대금
print("코드 이름 시간 현재가 대비 시가 고가 저가 매도호가 매수호가 거래량 거래대금")
print(code, name, time, cprice, diff, open, high, low, offer, bid, vol, vol_value)
return True
class MyWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("PLUS API TEST")
self.setGeometry(300, 300, 300, 150)
self.isRq = False
self.objStockMst = CpStockMst()
self.objStockCur = CpStockCur()
btn1 = QPushButton("요청 시작", self)
btn1.move(20, 20)
btn1.clicked.connect(self.btn1_clicked)
btn2 = QPushButton("요청 종료", self)
btn2.move(20, 70)
btn2.clicked.connect(self.btn2_clicked)
btn3 = QPushButton("종료", self)
btn3.move(20, 120)
btn3.clicked.connect(self.btn3_clicked)
def StopSubscribe(self):
if self.isRq:
self.objStockCur.Unsubscribe()
self.isRq = False
def btn1_clicked(self):
testCode = "A000660"
if (self.objStockMst.Request(testCode) == False):
exit()
# 하이닉스 실시간 현재가 요청
self.objStockCur.Subscribe(testCode)
print("빼기빼기================-")
print("실시간 현재가 요청 시작")
self.isRq = True
def btn2_clicked(self):
self.StopSubscribe()
def btn3_clicked(self):
self.StopSubscribe()
exit()
if __name__ == "__main__":
app = QApplication(sys.argv)
myWindow = MyWindow()
myWindow.show()
app.exec_()
5 복수종목 조회/실시간[편집]
import sys
from PyQt5.QtWidgets import *
import win32com.client
# 복수 종목 실시간 조회 샘플 (조회는 없고 실시간만 있음)
class CpEvent:
def set_params(self, client):
self.client = client
def OnReceived(self):
code = self.client.GetHeaderValue(0) # 초
name = self.client.GetHeaderValue(1) # 초
timess = self.client.GetHeaderValue(18) # 초
exFlag = self.client.GetHeaderValue(19) # 예상체결 플래그
cprice = self.client.GetHeaderValue(13) # 현재가
diff = self.client.GetHeaderValue(2) # 대비
cVol = self.client.GetHeaderValue(17) # 순간체결수량
vol = self.client.GetHeaderValue(9) # 거래량
if (exFlag == ord('1')): # 동시호가 시간 (예상체결)
print("실시간(예상체결)", name, timess, "*", cprice, "대비", diff, "체결량", cVol, "거래량", vol)
elif (exFlag == ord('2')): # 장중(체결)
print("실시간(장중 체결)", name, timess, cprice, "대비", diff, "체결량", cVol, "거래량", vol)
class CpStockCur:
def Subscribe(self, code):
self.objStockCur = win32com.client.Dispatch("DsCbo1.StockCur")
handler = win32com.client.WithEvents(self.objStockCur, CpEvent)
self.objStockCur.SetInputValue(0, code)
handler.set_params(self.objStockCur)
self.objStockCur.Subscribe()
def Unsubscribe(self):
self.objStockCur.Unsubscribe()
class CpMarketEye:
def Request(self, codes, rqField):
# 연결 여부 체크
objCpCybos = win32com.client.Dispatch("CpUtil.CpCybos")
bConnect = objCpCybos.IsConnect
if (bConnect == 0):
print("PLUS가 정상적으로 연결되지 않음. ")
return False
# 관심종목 객체 구하기
objRq = win32com.client.Dispatch("CpSysDib.MarketEye")
# 요청 필드 세팅 - 종목코드, 종목명, 시간, 대비부호, 대비, 현재가, 거래량
# rqField = [0,17, 1,2,3,4,10]
objRq.SetInputValue(0, rqField) # 요청 필드
objRq.SetInputValue(1, codes) # 종목코드 or 종목코드 리스트
objRq.BlockRequest()
# 현재가 통신 및 통신 에러 처리
rqStatus = objRq.GetDibStatus()
rqRet = objRq.GetDibMsg1()
print("통신상태", rqStatus, rqRet)
if rqStatus != 0:
return False
cnt = objRq.GetHeaderValue(2)
for i in range(cnt):
rpCode = objRq.GetDataValue(0, i) # 코드
rpName = objRq.GetDataValue(1, i) # 종목명
rpTime= objRq.GetDataValue(2, i) # 시간
rpDiffFlag = objRq.GetDataValue(3, i) # 대비부호
rpDiff = objRq.GetDataValue(4, i) # 대비
rpCur = objRq.GetDataValue(5, i) # 현재가
rpVol = objRq.GetDataValue(6, i) # 거래량
print(rpCode, rpName, rpTime, rpDiffFlag, rpDiff, rpCur, rpVol)
return True
class MyWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("PLUS API TEST")
self.setGeometry(300, 300, 300, 150)
self.isSB = False
self.objCur = []
btnStart = QPushButton("요청 시작", self)
btnStart.move(20, 20)
btnStart.clicked.connect(self.btnStart_clicked)
btnStop = QPushButton("요청 종료", self)
btnStop.move(20, 70)
btnStop.clicked.connect(self.btnStop_clicked)
btnExit = QPushButton("종료", self)
btnExit.move(20, 120)
btnExit.clicked.connect(self.btnExit_clicked)
def StopSubscribe(self):
if self.isSB:
cnt = len(self.objCur)
for i in range(cnt):
self.objCur[i].Unsubscribe()
print(cnt, "종목 실시간 해지되었음")
self.isSB = False
self.objCur = []
def btnStart_clicked(self):
self.StopSubscribe();
# 요청 종목 배열
codes = ["A003540", "A000660", "A005930", "A035420", "A069500", "Q530031"]
# 요청 필드 배열 - 종목코드, 시간, 대비부호 대비, 현재가, 거래량, 종목명
rqField = [0, 1, 2, 3, 4, 10, 17] #요청 필드
objMarkeyeye = CpMarketEye()
if (objMarkeyeye.Request(codes, rqField) == False):
exit()
cnt = len(codes)
for i in range(cnt):
self.objCur.append(CpStockCur())
self.objCur[i].Subscribe(codes[i])
print("빼기빼기================-")
print(cnt , "종목 실시간 현재가 요청 시작")
self.isSB = True
def btnStop_clicked(self):
self.StopSubscribe()
def btnExit_clicked(self):
self.StopSubscribe()
exit()
if __name__ == "__main__":
app = QApplication(sys.argv)
myWindow = MyWindow()
myWindow.show()
app.exec_()
6 복수종목 실시간 등록/해지[편집]
import sys
from PyQt5.QtWidgets import *
import win32com.client
class CpEvent:
def set_params(self, client):
self.client = client
def OnReceived(self):
code = self.client.GetHeaderValue(0) # 종목코도
name = self.client.GetHeaderValue(1) # 종목명
timess = self.client.GetHeaderValue(18) # 초
exFlag = self.client.GetHeaderValue(19) # 예상체결 플래그
cprice = self.client.GetHeaderValue(13) # 현재가
diff = self.client.GetHeaderValue(2) # 대비
cVol = self.client.GetHeaderValue(17) # 순간체결수량
vol = self.client.GetHeaderValue(9) # 거래량
if (exFlag == ord('1')): # 동시호가 시간 (예상체결)
print("실시간(예상체결)", name, timess, "*", cprice, "대비", diff, "체결량", cVol, "거래량", vol)
elif (exFlag == ord('2')): # 장중(체결)
print("실시간(장중 체결)", name, timess, cprice, "대비", diff, "체결량", cVol, "거래량", vol)
class CpStockCur:
def Subscribe(self, code):
self.objStockCur = win32com.client.Dispatch("DsCbo1.StockCur")
handler = win32com.client.WithEvents(self.objStockCur, CpEvent)
self.objStockCur.SetInputValue(0, code)
handler.set_params(self.objStockCur)
self.objStockCur.Subscribe()
def Unsubscribe(self):
self.objStockCur.Unsubscribe()
class MyWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("PLUS API TEST")
self.setGeometry(300, 300, 300, 150)
self.isSB = False
self.objStockCur1 = CpStockCur()
self.objStockCur2 = CpStockCur()
self.objStockCur3 = CpStockCur()
btnStart = QPushButton("요청 시작", self)
btnStart.move(20, 20)
btnStart.clicked.connect(self.btnStart_clicked)
btnStop = QPushButton("요청 종료", self)
btnStop.move(20, 70)
btnStop.clicked.connect(self.btnStop_clicked)
btnExit = QPushButton("종료", self)
btnExit.move(20, 120)
btnExit.clicked.connect(self.btnExit_clicked)
def StopSubscribe(self):
if self.isSB:
self.objStockCur1.Unsubscribe()
self.objStockCur2.Unsubscribe()
self.objStockCur3.Unsubscribe()
self.isSB = False
def btnStart_clicked(self):
self.objStockCur1.Subscribe("A003540") # 대신증권
self.objStockCur2.Subscribe("A000660") # 하이닉스
self.objStockCur3.Subscribe("A005930") # 삼성전자
print("빼기빼기================-")
print("실시간 현재가 요청 시작")
self.isSB = True
def btnStop_clicked(self):
self.StopSubscribe()
def btnExit_clicked(self):
self.StopSubscribe()
exit()
if __name__ == "__main__":
app = QApplication(sys.argv)
myWindow = MyWindow()
myWindow.show()
app.exec_()
7 현금 매수주문[편집]
import win32com.client
# 연결 여부 체크
objCpCybos = win32com.client.Dispatch("CpUtil.CpCybos")
bConnect = objCpCybos.IsConnect
if (bConnect == 0):
print("PLUS가 정상적으로 연결되지 않음. ")
exit()
# 주문 초기화
objTrade = win32com.client.Dispatch("CpTrade.CpTdUtil")
initCheck = objTrade.TradeInit(0)
if (initCheck != 0):
print("주문 초기화 실패")
exit()
# 주식 매수 주문
acc = objTrade.AccountNumber[0] #계좌번호
accFlag = objTrade.GoodsList(acc, 1) # 주식상품 구분
print(acc, accFlag[0])
objStockOrder = win32com.client.Dispatch("CpTrade.CpTd0311")
objStockOrder.SetInputValue(0, "2") # 2: 매수
objStockOrder.SetInputValue(1, acc ) # 계좌번호
objStockOrder.SetInputValue(2, accFlag[0]) # 상품구분 - 주식 상품 중 첫번째
objStockOrder.SetInputValue(3, "A003540") # 종목코드 - A003540 - 대신증권 종목
objStockOrder.SetInputValue(4, 10) # 매수수량 10주
objStockOrder.SetInputValue(5, 14100) # 주문단가 - 14,100원
objStockOrder.SetInputValue(7, "0") # 주문 조건 구분 코드, 0: 기본 1: IOC 2:FOK
objStockOrder.SetInputValue(8, "01") # 주문호가 구분코드 - 01: 보통
# 매수 주문 요청
objStockOrder.BlockRequest()
rqStatus = objStockOrder.GetDibStatus()
rqRet = objStockOrder.GetDibMsg1()
print("통신상태", rqStatus, rqRet)
if rqStatus != 0:
exit()
8 현금 매도 주문[편집]
import win32com.client
# 연결 여부 체크
objCpCybos = win32com.client.Dispatch("CpUtil.CpCybos")
bConnect = objCpCybos.IsConnect
if (bConnect == 0):
print("PLUS가 정상적으로 연결되지 않음. ")
exit()
# 주문 초기화
objTrade = win32com.client.Dispatch("CpTrade.CpTdUtil")
initCheck = objTrade.TradeInit(0)
if (initCheck != 0):
print("주문 초기화 실패")
exit()
# 주식 매도 주문
acc = objTrade.AccountNumber[0] #계좌번호
accFlag = objTrade.GoodsList(acc, 1) # 주식상품 구분
print(acc, accFlag[0])
objStockOrder = win32com.client.Dispatch("CpTrade.CpTd0311")
objStockOrder.SetInputValue(0, "1") # 1: 매도
objStockOrder.SetInputValue(1, acc ) # 계좌번호
objStockOrder.SetInputValue(2, accFlag[0]) # 상품구분 - 주식 상품 중 첫번째
objStockOrder.SetInputValue(3, "A003540") # 종목코드 - A003540 - 대신증권 종목
objStockOrder.SetInputValue(4, 10) # 매도수량 10주
objStockOrder.SetInputValue(5, 14100) # 주문단가 - 14,100원
objStockOrder.SetInputValue(7, "0") # 주문 조건 구분 코드, 0: 기본 1: IOC 2:FOK
objStockOrder.SetInputValue(8, "01") # 주문호가 구분코드 - 01: 보통
# 매도 주문 요청
objStockOrder.BlockRequest()
rqStatus = objStockOrder.GetDibStatus()
rqRet = objStockOrder.GetDibMsg1()
print("통신상태", rqStatus, rqRet)
if rqStatus != 0:
exit()
9 실거래 매수[편집]
import sys
from PyQt5.QtWidgets import *
import win32com.client
from pywinauto import application
import time
import pandas as pd
import os
g_instCpCybos = win32com.client.Dispatch("CpUtil.CpCybos")
g_instCpStockCode = win32com.client.Dispatch("CpUtil.CpStockCode")
g_instCpTdUtil = win32com.client.Dispatch("CpTrade.CpTdUtil")
g_instCpTd0311 = win32com.client.Dispatch("CpTrade.CpTd0311")
bConnect = g_instCpCybos.IsConnect
if (bConnect == 1):
print("PLUS가 정상적으로 연결되어 있음")
else:
print("PLUS 연결시도 중")
app = application.Application()
app.start("C:\CREON\STARTER\coStarter.exe //prj:cp /id:?? /pwd:?? /pwdcert:??/autostart")
time.sleep(20)
#CpEvent: 실시간 이벤트 수신 클래스
class CpEvent:
def set_params(self, client, name, caller):
self.client = client #Cp 실시간 통신 object
self.name = name #서비스가 다른 이벤트를 구분하기 위한 이름
self.caller = caller #callback을 위해 보관
def OnReceived(self):
pbData = {}
#실시간 종목검색 감시처리
if self.name == 'cssalert':
pbData['전략ID'] = self.client.GetHeaderValue(0)
pbData['감시일련번호'] = self.client.GetHeaderValue(1)
code = pbData['code'] = self.client.GetHeaderValue(2)
pbData['종목명'] = name = g_instCpStockCode.CodeToName(code)
inoutflag = self.client.GetHeaderValue(3)
if (ord('1') == inoutflag):
pbData['INOUT'] = '진입'
pbData['시각'] = self.client.GetHeaderValue(4)
pbData['현재가'] = self.client.GetHeaderValue(5)
time.sleep(0.01)
#############################################################
# 매수주문
# 주문 초기화
initCheck = g_instCpTdUtil.TradeInit(0)
if (initCheck != 0):
print("주문 초기화 실패")
exit()
# 주식 매수 주문
acc = g_instCpTdUtil.AccountNumber[0] # 계좌번호
accFlag = g_instCpTdUtil.GoodsList(acc, 1) # 주식상품 구분
print(acc, accFlag[0])
g_instCpTd0311.SetInputValue(0, "2") # 2: 매수
g_instCpTd0311.SetInputValue(1, acc) # 계좌번호
g_instCpTd0311.SetInputValue(2, accFlag[0]) # 상품구분 - 주식 상품 중 첫번째
g_instCpTd0311.SetInputValue(3, pbData['code']) # 종목코드
g_instCpTd0311.SetInputValue(4, 1) # 매수수량
g_instCpTd0311.SetInputValue(5, pbData['현재가']) # 주문단가
g_instCpTd0311.SetInputValue(7, "0") # 주문 조건 구분 코드, 0: 기본 1: IOC 2:FOK
g_instCpTd0311.SetInputValue(8, "01") # 주문호가 구분코드 - 01: 보통
# 매수 주문 요청
g_instCpTd0311.BlockRequest()
rqStatus = g_instCpTd0311.GetDibStatus()
rqRet = g_instCpTd0311.GetDibMsg1()
print("통신상태", rqStatus, rqRet)
if rqStatus != 0:
print("통신상태:", rqStatus, rqRet)
elif (ord('2') == inoutflag):
pbData['INOUT'] = '퇴출'
#pbData['시각'] = self.client.GetHeaderValue(4)
#pbData['현재가'] = self.client.GetHeaderValue(5)
self.caller.checkRealtimeStg(pbData)