프로그래밍/자동 주식거래 시스템 만들기

C#과 OPEN API를 이용한 자동 주식거래 시스템 만들기1

핫호빵 2020. 11. 14.
반응형

이번 포스팅은 C#과 OPEN API를 이용한 자동 주식거래 시스템 만들기 입니다.


주식매매를 이용하다 보면 나 대신 자동으로 매매하는 프로그램을 가지고 싶다는 생각이 들 때가 많은데, C#과 대신증권 OPEN API를 이용해서 오직 나를 위해서 내 생각대로 주식을 거래하는 나만의 주식 매매 프로그램을 만들어 보도록 하겠습니다.


1. 개발환경

- 마이크로소프트에서 만든 VISUAL STUDIO 2017 Community Version(무료)

- 대신크레온 OPEN API(무료, 회원가입 필수)

- SQLITE(무료)


크게 위의 3개 프로그램을 이용해서 주식매매 프로그램을 개발하도록 하겠습니다.



2. 기능구현

이번 포스팅에서는 계좌 잔고를 조회하는 기능을 개발하는데 완성된 프로그램의 모습은 다음 그림과 같습니다.


개발화면


상단에서 계좌번호, 예수금, 수익률, 평가손익을 표시하고 아래쪽 좌측에서 현재 계좌에서 보유 중인 주식의 상세정보를 표시합니다.(단 모의투자환경에서는 종목정보가 계좌와 다르게 나올 수 있음을 알려드립니다. 대신증권에서 모투는 정보가 정확하지 않을 수 있다고 합니다.)


먼저 비주얼스튜디에서 신규 프로젝트를 생성하고 cputil.dll과 cptrade.dll을 참조합니다.


DLL참조


기본 UI를 만들어 주시고 소스코드를 다음과 같이 입력합니다.


프로그램이 구동 될때 대신증권 OPEN API인 크레온플러스에 로그인 되어있는지 확인하고 로그인 되어 있다면 거래 트랜잭션을 초기화 한 다음에 증권계좌 정보를 수신합니다.


초기화


그런 다음에 SearchAccount 함수를 실행하여 계좌정보를 조회 합니다. 다음은 SearchAccount 함수의 소스코드 입니다.


-SearchAccount 함수 소스코드1


소스코드1


대신 OPEN API는 공통적으로 SETINPUTVALUE를 이용해서 조회에 필요한다 기초정보를 등록하고 BLOCKREQUEST를 이용해서 정보를 조회 합니다.


각 AIP를 간략하게 설명하면 CPTRADE.DLL에 CPTD6033은 계좌별 잔고평과 현황 정보를 제공하고, CPTD7032는 결재 예정 예수금 가계산 정보를 제공하는데 자세한 정보는 대신증권 홈페이지를 참조하기 바랍니다.(링크)


-SearchAccount 함수 소스코드2


소스코드2


계좌에서 보유하고 있는 종목의 정보를 화면에 표시하는 소스입니다. 단 모투 환경에서는 정보가 틀리게 나올 수 있으니 참고용으로만 사용하세요!!(대신에서 모투 계좌의 정보는 부정확할 수 있다고 합니다.)


다음은 SearchAccount 함수의 전체 소스 코드 입니다.

 

private void SearchAccout()

        {


            long v_stockCount = 0;

            double v_roiRate = 0;

            

            gridStockList.Rows.Clear();


            long v_amt = 0;


            CpTd6033 = new CPTRADELib.CpTd6033();

            CpTd6033.SetInputValue(0, v_account);//계좌번호

            CpTd6033.SetInputValue(1, "10");//구분코드 국내주식은 10

           CpTd6033.SetInputValue(2, 50);//받아올 종목 수 최대 50개, 만약 50개가 넘는다면 반복해서 blockRequest를 실행한다.

            CpTd6033.SetInputValue(3, "2");//수익률구분코드 - ( "1" : 100% 기준, "2": 0% 기준)

            CpTd6033.BlockRequest();


            v_stockCount = CpTd6033.GetHeaderValue(7);//보유종목건수

            v_roiRate = CpTd6033.GetHeaderValue(8);

            txtROIRate.Text = Math.Round(v_roiRate, 2).ToString();//수익률


            v_amt = CpTd6033.GetHeaderValue(4);

            txtROIMoney.Text = v_amt.ToString();//평가손익


            //예수금 조회

            CpTd0732 = new CPTRADELib.CpTd0732();

            CpTd0732.SetInputValue(0, v_account);//계좌번호

            CpTd0732.SetInputValue(1, "10");//구분코드 국내주식은 10

            CpTd0732.BlockRequest();


            v_amt = CpTd0732.GetHeaderValue(66);

            txtDepostMoney.Text = v_amt.ToString();//예수금


            //각 종목별 정보 조회

            for (int i = 0; i< v_stockCount; i++)

            {

                v_amt = Convert.ToInt64(CpTd6033.GetDataValue(9, i));


                gridStockList.Rows.Add();

                gridStockList["종목코드", i].Value = Convert.ToString(CpTd6033.GetDataValue(12, i));

                gridStockList["종목명", i].Value = Convert.ToString(CpTd6033.GetDataValue(0, i));

                gridStockList["체결잔고수량", i].Value = Convert.ToString(CpTd6033.GetDataValue(7, i));  

                gridStockList["결제장부단가", i].Value = Convert.ToString(CpTd6033.GetDataValue(4, i));

                gridStockList["평가금액", i].Value = Convert.ToString(CpTd6033.GetDataValue(9, i));


                v_roiRate =  Math.Round(Convert.ToDouble(CpTd6033.GetDataValue(11, i)),2);


                gridStockList["평가손익", i].Value = Convert.ToString(CpTd6033.GetDataValue(10, i));

                gridStockList["수익률", i].Value = Convert.ToString(v_roiRate);

            }

            gridStockList.AutoResizeColumns();

        }


이상으로 이번 포스팅을 모두 마치도록 하겠습니다 ^^

반응형

댓글