✔ 주식자동매매 - 보유 주식 잔고 데이터 가져오기
이전 포스트에서는 계좌정보와 보유금에 대한 정보를 불러왔습니다.
이번에는 내가 보유하고 있는 주식의 종목들을 조회하겠습니다.
이전에 설명드렸던 내용과 마찬가지로 키움에 요청 -> 이벤트로 수신 구조입니다.
● 계좌평가잔고조회 요청
- Form1 클래스에 함수를 추가해줍니다.
public void 계좌평가잔고내역요청()
{
axKHOpenAPI.SetInputValue("계좌번호", cbo계좌.Text.Trim());
axKHOpenAPI.SetInputValue("비밀번호", "");
axKHOpenAPI.SetInputValue("비밀번호입력매체구분", "00");
axKHOpenAPI.SetInputValue("조회구분", "2");
axKHOpenAPI.CommRqData("계좌평가잔고조회", "opw00018", 0, "5001");
}
그리고 보유주식은 로그인했을때 가져오면 되겠죠?
이전 포스트에서 예수금 처리했을때 처럼 로그인처리함수에서 추가해줍니다.
private void 로그인ToolStripMenuItem_Click(object sender, EventArgs e)
{
if (axKHOpenAPI.CommConnect() == 0)
{
Logger(Log.일반, "로그인창 열기 성공");
계좌조회ToolStripMenuItem.PerformClick();
//계좌평가잔고요청 추가
계좌평가잔고내역요청();
}
else
{
Logger(Log.에러, "로그인창 열기 실패");
}
}
● 계좌평가잔고조회 데이터 수신
보유 종목데이터를 저장하기 위한 클래스를 만들어줍니다.
이전 포스트에서 만들어 놓은 MyWallet.cs에 StockInfo 클래스를 추가하여 만들겠습니다.
using System;
using System.Collections.Generic;
namespace KOASampleCS
{
public class StockInfo
{
public string 종목코드;
public string 종목명;
public int 보유수량;
public float 매입가;
}
public static class MyWallet
{
public static int 예수금;
public static int d2출금예정금액;
//Dictionary<종목코드, 종목데이터>
public static Dictionary<string, StockInfo> 보유종목 = new Dictionary<string, StockInfo>();
}
}
이렇게 종목들에 대한 정보를 가진 클래스와 딕셔너리로 종목들을 저장하고 관리할 수 있도록 구성했습니다.
이제 수신 받은 데이터를 처리해보겠습니다.
이전에 요청후에 데이터는 axKHOpenAPI_OnReceiveTrData 이벤트를 통해서 수신 받는다고 했습니다.
이전 포스트에 else if 추가한 것처럼 계좌평가데이터도 추가해줍니다.
다른 내용은 동일하고 아래부분에 e.sRQName == "계좌평가잔고조회" 이부분만 추가하면 됩니다.
참고로 e.sRQName은 위의 요청 부분에서 키움증권에 요청할때 우리가 지정한 이름입니다.
원하는 이름으로 변경해도 무방하며 요청할때 이름과 이벤트수신시 이름만 동일하게 해주면됩니다.
private void axKHOpenAPI_OnReceiveTrData(object sender, AxKHOpenAPILib._DKHOpenAPIEvents_OnReceiveTrDataEvent e)
{
if (e.sRQName == "주식주문")
{
string s원주문번호 = axKHOpenAPI.GetCommData(e.sTrCode, "", 0, "").Trim();
long n원주문번호 = 0;
bool canConvert = long.TryParse(s원주문번호, out n원주문번호);
if (canConvert == true)
txt원주문번호.Text = s원주문번호;
else
Logger(Log.에러, "잘못된 원주문번호 입니다");
}
// OPT1001 : 주식기본정보
else if (e.sRQName == "주식기본정보")
{
Logger(Log.조회, "{0} | 현재가:{1:N0} | 등락율:{2} | 거래량:{3:N0} ",
axKHOpenAPI.GetCommData(e.sTrCode, e.sRQName, 0, "종목명").Trim(),
Int32.Parse(axKHOpenAPI.GetCommData(e.sTrCode, "", 0, "현재가").Trim()),
axKHOpenAPI.GetCommData(e.sTrCode, "", 0, "등락율").Trim(),
Int32.Parse(axKHOpenAPI.GetCommData(e.sTrCode, "", 0, "거래량").Trim()));
}
// OPT10081 : 주식일봉차트조회
else if (e.sRQName == "주식일봉차트조회")
{
int nCnt = axKHOpenAPI.GetRepeatCnt(e.sTrCode, e.sRQName);
for (int i = 0; i < nCnt; i++)
{
Logger(Log.조회, "{0} | 현재가:{1:N0} | 거래량:{2:N0} | 시가:{3:N0} | 고가:{4:N0} | 저가:{5:N0} ",
axKHOpenAPI.GetCommData(e.sTrCode, "", i, "일자").Trim(),
Int32.Parse(axKHOpenAPI.GetCommData(e.sTrCode, "", i, "현재가").Trim()),
Int32.Parse(axKHOpenAPI.GetCommData(e.sTrCode, "", i, "거래량").Trim()),
Int32.Parse(axKHOpenAPI.GetCommData(e.sTrCode, "", i, "시가").Trim()),
Int32.Parse(axKHOpenAPI.GetCommData(e.sTrCode, "", i, "고가").Trim()),
Int32.Parse(axKHOpenAPI.GetCommData(e.sTrCode, "", i, "저가").Trim()));
}
}
else if (e.sRQName == "예수금상세현황요청")
{
int 예수금 = Int32.Parse(axKHOpenAPI.GetCommData(e.sTrCode, e.sRQName, 0, "예수금").Trim());
int 출금가능금액 = Int32.Parse(axKHOpenAPI.GetCommData(e.sTrCode, e.sRQName, 0, "d+2출금가능금액").Trim());
}
//이번 포스트에서 추가되는 계좌평가잔고조회
else if (e.sRQName == "계좌평가잔고조회")
{
//보유종목 수 확인
int cnt = axKHOpenAPI.GetRepeatCnt(e.sTrCode, e.sRQName);
//보유 종목들에 대한 정보를 클래스화
for (int i = 0; i < cnt; i++)
{
StockInfo stockInfo = new StockInfo();
stockInfo.종목코드 = axKHOpenAPI.GetCommData(e.sTrCode, e.sRQName, i, "종목번호").Trim().Remove(0, 1);
stockInfo.종목명 = axKHOpenAPI.GetCommData(e.sTrCode, e.sRQName, i, "종목명").Trim();
stockInfo.보유수량 = int.Parse(axKHOpenAPI.GetCommData(e.sTrCode, e.sRQName, i, "보유수량"));
stockInfo.매입가 = float.Parse(axKHOpenAPI.GetCommData(e.sTrCode, e.sRQName, i, "매입가"));
//종목데이터를 MyWallet에 저장
if (!MyWallet.보유종목.ContainsKey(stockInfo.종목코드))
MyWallet.보유종목.Add(stockInfo.종목코드, stockInfo);
else
MyWallet.보유종목[stockInfo.종목코드] = stockInfo;
}
}
}
이제 영웅문을 통하여 매수 후에 프로그램을 실행해보고 로그로 보유종목 데이터를 받는지 확인해보세요~
지금은 프로그램을 실행한뒤만 보유종목에 대한 데이터를 1번만 가져옵니다.
(보유종목에 대한 요청도 TR 요청에 해당하므로 TR요청은 최소한으로 줄여야합니다.)
나중에 제작할 매수, 매도를 이벤트 로직에서 보유종목에 대한 데이터 관리를 실시간으로 하게됩니다.
(앞으로 아직 갈길이 멈니다... ㅎㅎㅎㅎ)
감사합니다.
'주식 자동매매 프로그램 제작 > 국내주식 자동매매' 카테고리의 다른 글
[C# 주식자동매매제작] 계좌 조회 및 예수금상세현황 조회하기 (270) | 2022.04.25 |
---|---|
[C# 주식자동매매제작] 키움증권 Open API 신청 및 샘플프로젝트 받기 (424) | 2022.04.22 |
[C# 주식자동매매제작] 주식 실시간 수익률 계산 (수수료계산 반영) (236) | 2022.04.22 |
댓글