이제 지난 글에서 변환한 class들을 가지고 코드를 작성하면 된다.
대신증권은 타 증권사와 다르게 API 문서(비공식)도 상당히 잘 만들어져 있고,
API 담당자에게 질문글을 올리면 보통 하루 내에 답변까지 달아준다.
API에 대한 정보가 많기 때문에 크게 어렵지 않게 어지간한 기능들을 다 구현할 수 있기 때문에
본 글에서는 복잡한 기능들을 구현하는데 초점을 맞추기 보다는
JAVA에서 돌아가는 기본적인 코드를 구현하는데 집중하고자 한다.
주의할점은 반드시 JAVA를 관리자 권한으로 실행시켜야 하며
JAVA의 버전은 32bit이어야 한다는 것이다.
이는 파이썬으로 대신증권 API를 사용할때도 마찬가지였는데,
이를 몰라 한참을 해맸던 기억이 있다.
JDK 9부터는 64bit만 지원하는 것으로 알고 있어서 JDK8 32bit버전을 사용했다.
# dependency 추가
먼저 dependency를 추가해주어야 한다.
우리가 변환한 class들이 org.jvnet.com4j 그룹의 com4j 에 의존하기 때문에
우리 프로젝트의 dependencies에도 해당 dependency를 추가해야 한다.
<dependency>
<groupId>org.jvnet.com4j</groupId>
<artifactId>com4j</artifactId>
<version>2.1</version>
</dependency>
# CYBOS PLUS 실행
아래 코드를 통해 cybos plus를 실행할 수 있다.
공인인증서 만료 30일전 팝업이 뜨는 경우 p.waitFor()에서 무한 대기에 빠질 수 있으므로 주의해야 한다.
또한, cybos가 이미 실행중인경우 중복 실행이 불가능하다는 경고창이 뜨며 마찬가지로 무한 대기에 빠질 수 있으니 taskkill을 이용해 cybos를 죽이고 다시 cybos를 실행한다.
try{
Runtime.getRuntime().exec("taskkill /IM CpStart.exe /F");
Runtime.getRuntime().exec("taskkill /IM DibServer.exe /F");
Process p = Runtime.getRuntime().exec("C:\\DAISHIN\\STARTER\\ncStarter.exe /prj:cp /autostart /id:" + id + " /pwd:" + pw + " /pwdcert:" + pw2);
p.waitFor();
}catch(Exception e){
return false;
}
# CYBOS 연결상태 확인
cputil의 Class Factory로 부터 cpCybos 클래스를 가져온다.
cpCybos의 isConnect 메서드를 통해 연결 상태를 확인할 수 있다.
만약 오류가 발생한다면 JDK 버전이 32bit이고 java.exe가 관리자권한으로 실행되었는지 확인해야 한다.
daishin.cputil.ICpCybos cpCybos = daishin.cputil.ClassFactory.createCpCybos()
if (cpCybos.isConnect() != 1){
// 연결되지 않음
}
# 특정 날짜의 종가 가져오기
가격은 cpsysdib의 StockChart 클래스를 사용해 가져올 수 있다.
daishin.cpsysdib.ISysDib stockChart = daishin.cpsysdib.ClassFactory.createStockChart();
daishin.cputil.ICpCybos cpCybos = daishin.cputil.ClassFactory.createCpCybos();
//요청할 데이터 정보를 셋팅
stockChart.setInputValue(0, "A005930"); //종목코드
stockChart.setInputValue(1, 49); //ASCII CODE 49 = '1' (기간으로 요청)
stockChart.setInputValue(2, 20220225); //요청종료일
stockChart.setInputValue(3, 20220225); //요청시작일
stockChart.setInputValue(5, new int[] {0,1,2,3,4,5,8,18,19}); //요청항목 (API 확인바람)
stockChart.setInputValue(6, 68); //ASCII CODE 68 = 'D' (일봉 요청)
stockChart.setInputValue(9, 49); //ASCII CODE 49 = '1' (수정주가)
//리퀘스트 수 제한에 걸린 경우 제한 시간만큼 대기
int remainTime = cpCybos.limitRequestRemainTime();
int remainCount = cpCybos.getLimitRemainCount(cputil.LIMIT_TYPE.LT_NONTRADE_REQUEST);
if (remainCount <= 0) {
try{
Thread.sleep(remainTime + 1);
}catch(Exception e){
return;
}
}
//요청
stockChart.blockRequest();
//수신
int tot = (int)stockChart.getHeaderValue(3); //수신한 데이터 갯수
int date = Integer.parseInt(stockChart.getDataValue(0, 0).toString()); //수신한 0번째 데이터의 0번항목(날짜)
int closePrice = (int)stockChart.getDataValue(5, 0); //수신한 0번째 데이터의 5번 항목
'언어 > JAVA' 카테고리의 다른 글
이상하고 아름다운 JAVA 퀴즈 1 (0) | 2023.03.13 |
---|---|
SOLID 원칙과 구체적인 예시 (0) | 2023.03.09 |
Spring Security JWT 인증 잘 정리된 블로그 (0) | 2022.12.20 |
VSCode Kotlin 프로젝트 셋팅 (0) | 2022.11.22 |
대신증권 API JAVA에서 사용하기 (1) (0) | 2022.02.25 |