해당 원글은 미디엄 블로그에서 작성한 내용을 해당 블로그에 기록하기 위해 가져옴. 원글은 2021.03.13일 작성.
개요
- 하다가 2탄을 할까 말까 고민을 좀 했었다.
- 이유인 즉슨 한투 모바일API는 가이드도 제대로 되어있지 않고 자동 투자를 위해 필요한 정보가 좀 부실하기 때문이다.
- 특히, 내 잔고를 불러오는 코드가 ‘satps’인데 가이드에 나와있지 않다. 샘플코드에만 나와있다… 이럴거면 가이드는 대체 왜 만든건지…
- 그리고 한가지 더. 모투에선 잔고가 조회되지 않는다. (실전은 됨) 상태 정보에 실제 잔고를 포함해서 테스트 해보고 싶었는데 그게 안된다. 물론 현재가만 가져오는 용도로 사용해도 되긴 하지만 그러기엔 너무 오버스펙이다.
- 그래도 작성한 것은 마무리하기 위해 2탄으로 돌아오게 되었다.
목표
- 2탄의 목표는 지난번에 언급했듯이 응답을 Json으로 바꾸고 모든 API를 등록하는 것이었다. Json으로 바꾸는 부분은 중요하지 않기 때문에 뒤로 넘어가고 현재가를 가져오는 API 작성하는 부분부터 진행해 보겠다.
- 1탄에서 아래와 같이 이미 제공된 CommExpertMng 클래스를 이용하여 간단하게 계정정보를 가져오는 부분까지 작성했었다. 제공된 클래스를 이용하기 때문에 코드가 길어질일이 없었는데…
1
2
3
4
5
6
7
8
9
10
11
AccountNo("getAccountNo") {
@Override
public String getResult(String... params) {
String index = params[0];
String strAcc = CommExpertMng.getInstance().GetAccountNo(Integer.parseInt(index));
JsonObject jsonObject = new JsonObject();
jsonObject.toString().getBytes(StandardCharsets.UTF_8);
jsonObject.addProperty("result", String.valueOf(strAcc));
return jsonObject.toString();
}
},
- 기본적으로 한투 모바일 API의 데이터 주고 받는 방식이 Listener 방식이었다. 데이터를 요청하면 Override된 received 메소드로 데이터가 넘어오는 식이었는데 이방식으로 인해 요청에 딜레이가 발생할 수 밖에 없었다. 다행히 오래걸리지는 않아서 사용할 만한 수준이었다.
이렇게 요청을 하면
1
m_nPrcieRqId = m_PriceTranProc.RequestData(reqCode);
요기서 데이터를 받아올 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
@Override
public void onTranDataReceived(String s, int i) {
StockDataMaker dataMaker = new StockDataMaker();
if (StringUtils.equals("scp", s)) {
currentData = dataMaker.generateCurrentData(m_PriceTranProc);
} else if (StringUtils.equals("scpc", s)) {
conclusionList = dataMaker.generateConclusionData(m_PriceTranProc);
} else if (StringUtils.equals("scpd", s)) {
dayList = dataMaker.generateDayData(m_PriceTranProc);
}
wait = false;
}
- 샘플코드에 다 나와있으므로 자세한 건 넘어가겠다.
그냥 싱글톤 클래스 만들어서 제공해줬으면 편했을텐데… ㅠㅠ
- 실시간 데이터의 경우 또 조금 다른데 요청을 시작하면 received 메소드에서 계속 실시간으로 데이터를 받을 수 있다. 그 데이터를 통해 호가창을 만들고 그래프를 그리고 할 수 있다. 자동 투자하는데 실시간까진 필요가 없으니…
우여곡절
못해묵겄어!
- 위에서 언급했듯이 잔고 가져오는 서비스를 만들다가 중단했는데 그 이유가 모투에서는 잔고를 가져올 수 없었기 때문이다.
- 내가 뭔가 잘 못 했겠지… 하면서 이것저것 시도해 봤는데 안되길래 혹시나 해서 퓨어한 샘플코드로 해봤는데 안되더라. 한투 홈피 드가서 물어볼까 했는데 귀찮아서 관둠…
- 자산 조회 API에서 막히니 굳이 매수매도까지…? 라는 생각이 들어서 포기…
어찌 할 수 없는 라이브러리 오류
아무것도 할 수 없는 겨
JSON
- json 별거 없다 gson 사용했다.
1
2
3
4
5
6
7
if (StringUtils.equals("scp", reqCode)) {
return new Gson().toJson(currentData).toString();
} else if (StringUtils.equals("scpc", reqCode)) {
return new Gson().toJson(conclusionList).toString();
} else if (StringUtils.equals("scpd", reqCode)) {
return new Gson().toJson(dayList).toString();
}
- 활용하려고 했던 현재가 불러오기
1
{"accessibility":"000000000.00","accumulateAmount":"000000000013530573","accumulateTrade":"000001121128514600","averagePrice":"0000000000082861.97","beMaxPrice":"0000096800","beMaxPriceDay":"20210111","beMinPrice":"0000042300","beMinPriceDay":"20200319","bps":"00039406.00","capital":"0000000000000000007780","capitalName":"7,780 억","eps":"00003841.00","facePriceName":"100","faceValue":"00000000100","foreignBuy":"000002116847","foreignTotalCount":"000000003265821004","htsBuyAmountUnit":"0000000001","htsForeignRate":"00054.71","limitWidth":"0000024550","loanRate":"00000.16","lowerLimit":"0000057400","marketCapitalization":"000000000004942980","maxPrice":"0000083500","minPrice":"0000082400","pbr":"00002.10","per":"00021.56","pivotPoint":"0000081833","pivotResist2":"0000083333","pivotResits1":"0000082666","pivotSupport1":"0000081166","pivotSupport2":"0000080333","price":"0000082800","price2":"0000083100","programBuy":"000000000000699509","quoteUnit":"0000000100","referencePrice":"0000082000","resistValue":"0000083000","settleMonth":"12","shortSellingYn":"N","shortStockCode":"005930","stockCount":"000000005969782550","substitute":"0000065600","supportValue":"0000081500","thanBeMaxPriceRate":"-0014.46","thanBeMinPriceRate":"00095.74","thanCode":"2","thanPrice":"0000000800","thanRate":"00000.98","thanTradeRate":"00056.81","thanWeekMaxPriceRate":"-0014.46","thanWeekMinPriceRate":"00095.74","thanYearMaxPriceRate":"-0014.46","thanYearMinPriceRate":"00003.24","turnover":"00000.23","upperLimit":"0000106500","weekMaxPrice":"0000096800","weekMaxPriceDay":"20210111","weekMinPrice":"0000042300","weekMinPriceDay":"20200319","yearMaxPrice":"0000096800","yearMaxPriceDay":"20210111","yearMinPrice":"0000080200","yearMinPriceDay":"20210104"}
- 요고 계속 불러다가 상태값으로 써서 강화학습 해볼까 했는데… 아숩
마무리
한투모바일은 여기까지가 끝인가보오… 쓰시는분들이 얼마나 있을지 모르겠지만 이런식으로 쓰시려는 분 있으면 말리고 싶다. 한투모바일 멈춰!
다음으로 파이썬 공부하면서 자동 투자는 키움의 도움을 받으려고 한다.
키움 API 고수분들 도움!
마무리
- 1탄에서도 언급했지만, 한국투자증권에서 Rest api를 도입했다. 이 포스팅은 역사 속으로…