Programming/Java

Java 주식 API (대신증권 사이보스 플러스) 연동하기

Jan92 2022. 2. 5. 00:52

Java로 대신증권 사이보스 플러스 API 사용하기

프로그래밍을 통한 자동 매매를 구현하기 위한 대부분의 증권사 api가 C, C++ 또는 Python에서는 사용하기 쉽게 되어있습니다.

하지만 공식적으로 Java 언어를 통해 사용할 수 있는 증권사 api는 찾을 수 없었습니다. 그러던 중 구글링을 통해 대신증권 사이보스 플러스 api의 .dll 파일을 com4j 라이브러리로 .java 파일로 변환해서 사용하는 것을 보고 참고하여 작업하며 정리한 내용입니다.

 

 

- 작업 환경

Windows10 64비트(x64), Java8 32비트(x86), IntelliJ 32비트 런쳐(18.3.6) 환경에서 작업하였습니다.

(작업 중 64비트에서는 오류가 발생하고, 32비트에서만 동작하는 부분이 있어서 32비트 설치 후 작업하였습니다.)

 

- 필수로 필요한 라이브러리

Com4j(com4j-20120426-2 사용), 해당 라이브러리를 통해 .dll 파일을 Java에서 쓸 수 있도록 변환합니다.

 

- 기본 준비

대신증권 계좌, hts설치(CYBOS 설치 후 CYBOSPLUS 설치)

 

 


 

 

IntelliJ 2018.3.6 Version

IntelliJ는 2018.3.6 버전이 32비트 런쳐를 제공하기 때문에 해당 버전을 다운로드하여 32비트 런쳐로 설치하였습니다.

 

 

 

Windows10 Java8 32bit 설치하기 jdk8(x86)

윈도우10 Java8, JDK8 32비트(x86) 버전 설치하는 방법입니다. (Windows10 64비트 환경에서 설치를 진행하였으며, 개발상 필요에 의해 32비트 jdk를 설치하게 되었습니다.) 일반적으로 대부분의 운영 체제

wildeveloperetrain.tistory.com

Windows10 Java8 32비트 설치 방법입니다. 일반 Java 설치와 같고 x86으로 된 파일을 받아 설치하고 환경 변수를 세팅해주면 됩니다.

 

 


 

 

CYBOSPLUS

아래 경로는 대신증권 자료실 링크로 CYBOS5 설치 및 CYBOSPLUS 시작 방법을 설명해줍니다.

https://money2.daishin.com/e5/mboard/ptype_basic/plusPDS/DW_Basic_Read.aspx?boardseq=299&seq=34&page=3&searchString=&prd=&lang=&p=8831&v=8638&m=9508

 

링크를 따라 사이보스 플러스를 설치하고 설치된 폴더에 들어가게 되면 여러 가지 파일들을 볼 수 있는데요.

이어서는 체크된 'cpdib.dll' 'CpSysDib.dll' 'cptrade.dll' 'cputil.dll'에 있는 함수들을 Java에서 사용하기 위해 com4j 라이브러리를 통해 변환 작업을 할 것입니다.

 

 

 

* dll(Dynamic Link Library)란,

마이크로소프트 윈도우에서 구현된 동적 라이브러리로 내부에는 다른 프로그램이 쓸 수 있는 다양한 함수를 가지고 있는데 확장 dll인 경우는 클래스를 가지고 있기도 하며, dll은 COM을 담는 그릇의 역할도 합니다.

동적 링크라고도 하며, 실행 파일에서 해당 라이브러리 기능을 사용할 때만 라이브러리 파일을 참조하여(혹은 다운로드하여) 기능을 호출합니다. 정적 링크와는 다르게 컴파일 시점에서 실행 파일에 함수를 복사하지 않고 함수의 위치 정보만을 갖고 그 함수를 호출할 수 있게 합니다.

여러 프로그램이 단일 파일에 프로그래밍된 기능을 공유할 수 있으며, 동시에 수행할 수도 있다는 장점이 있습니다.

 

(Component Object Model, COM 마이크로소프트가 개발한 소프트웨어 구성 요소들의 응용 프로그램 이진 인터페이스 표준)

 

 

 

 

com4j library

* Com4j Library란, 

Java 응용 프로그램이 Microsoft 구성 요소 객체 모델과 상호 운용되도록 하는 Java 라이브러리이며, COM 유형 라이브러리를 가져와서 해당 라이버러리의 Java 정의를 생성하는 도구입니다.

 

Com4j 라이브러리를 다운로드하여 압축을 풀어줍니다.

(현재 Com4j download 주소가 404 NotFound로 열리지 않아 구글링을 통해 다운로드하였습니다.)

 

 

 

.dll 파일을 자바에서 사용할 수 있도록 컨버팅

먼저 cmd를 실행시켜 com4j 폴더로 경로를 이동합니다.

java -jar tlbimp.jar -o DS -p dashin.cpdib "C:\DAISHIN\CYBOSPLUS\cpdib.dll"

그리고 위 명령어를 통해 .dll 파일을 Java에서 사용할 수 있도록 변환한 것이 com4j 디렉터리 안에 dashin.cpdib 패키지에 컨버팅 되며, 해당 명령어로 'cpdib.dll' 'CpSysDib.dll' 'cptrade.dll' 'cputil.dll' 파일들을 각각의 패키지로 컨버팅 합니다.

 

java -jar tlbimp.jar -o 생성폴더명 -p 생성패키지명 "디렉터리\변환대상 dll파일"

 

 

 

컨버팅 완료

컨버팅 후 com4j 디렉터리에 컨버팅 된 패키지를 확인해보면 Java에서 사용할 수 있는 .java 파일로 바뀐 것을 볼 수 있습니다.

 

 


 

 

변환된 .java 파일 직접 수정

위 과정을 통해 작업 환경 세팅과 .dll 파일 컨버팅을 완료했다면 Java 프로그램에서 사용을 해봐야 하는데요.

 

작업을 참고한 글에서는 이클립스를 IDE로 사용해서 변환된 파일들을 import 하여 사용하였는데 IntelliJ에서는 변환된 파일들을 라이브러리를 사용하는 것처럼 import 하는 것에 실패하였습니다. 그래서 번거롭지만 프로젝트에 파일을 넣고, 변환된 파일에서 package 및 class 참조 부분 코드를 직접 수정하여 사용하였습니다.

(이미지로 이해가 안 가시면 맨 하단에 github 코드를 참고하실 수 있습니다. 또한 해당 과정에서 변환된 폴더를 import 하는 방법을 아신다면 댓글로 공유해주시면 감사드리겠습니다.)

 

 

<!-- https://mvnrepository.com/artifact/org.jvnet.com4j/com4j -->
<dependency>
    <groupId>org.jvnet.com4j</groupId>
    <artifactId>com4j</artifactId>
    <version>20110320</version>
</dependency>

컨버팅 된 파일에서 COM 객체를 사용하기 때문에 COM 객체 사용을 위하 com4j 라이브러리를 pom.xml에 추가합니다.

(Spring Boot, Maven 환경에서 작업하였습니다.)

 

 

public static void main(String[] args) {
    // 종목 코드 확인
    ICpStockCode iCpStockCode = ClassFactory.createCpStockCode();
    String strName = iCpStockCode.codeToName("A056080");
    System.out.println("코드번호 A056080, 종목명 : " + strName);

    // 전체 종목 코드 불러오기
    ICpCodeMgr codeMgr = ClassFactory.createCpCodeMgr();
    // 리턴 형식이 object이지만 Object[]로 캐스팅하여 리스트를 받는다.
    Object[] market = (Object[]) codeMgr.getStockListByMarket(CPE_MARKET_KIND.CPC_MARKET_KOSPI);
    System.out.println("전체 종목 수 : " + market.length);

    for(int i=0; i<5; i++) {
        System.out.println(iCpStockCode.codeToName(market[i].toString()));
    }
}

세부적으로는 더 살펴봐야 하지만 대략적인 동작 방식을 보면 4개의 .dll 파일에서 컨버팅 된 각각의 패키지마다 ClassFactory 클래스가 있는데, 해당 클래스를 통해 필요에 따른 객체를 생성하고 요청 방식에 맞춰 요청하는 방식인 것 같았습니다.

 

 

동작 결과

 

 

 

< 참고 자료 >

 

대신증권 api(사이보스 플러스) 자바로 개발하기 1. dll 컨버팅

서론. 주식과 관련된 프로젝트를 하고 싶었다. 시황을 내가 원한대로 시황을 확인하고, 다양한 전략을 구상하여 백테스팅을 할 수 있는 샌드박스를 만들고 싶었다. 시중에 자료를 편하게 접할

velog.io

 

< github 코드 >

 

 

GitHub - JianChoi-Kor/tradingSystem: DAISHIN API Trading System

DAISHIN API Trading System. Contribute to JianChoi-Kor/tradingSystem development by creating an account on GitHub.

github.com