자동매매 증권사 API/키움증권 API
키움증권 API - 서버가 준비되어 있지 않습니다.
httpdream
2021. 7. 4. 02:33
오류
7월 2일에 프로그램을 돌리고 있었는데 "서버가 준비되어 있지 않습니다." 라는 메시지 이벤트가 발생하면서 매도주문이 들어가지 않았다. 그 사실을 1시간뒤에 알아서 -5%의 손실이 더 발생하게 되었다.
Q&A
키움증권 API 게시판에서 해당 메시지를 검색해서 그동안 다른사람들이 발생했었는지 알아보았다.
음... 알수있는 정보가 없었다.
할 수 없이 해당현상의 재발을 방지하기위해서 따로 로직을 구현하였다.
현재 나에게 해당현상은 "주식주문"과 "실시간등록"에서 발생하고 있었다.
그래서 "서버가 준비되어 있지 않습니다." 메시지가 발생했을때 바로 전에 주문했었던것을 반복하는 로직을 작성했다.
1차적으로 주식주문과 실시간등록을 저장하는 Class를 작성했다.
public sealed class SendOrder
{
public String rqName;
public String screenNo;
public String accountNumber;
public int orderType;
public String code;
public int quantity;
public int price;
public String hoga;
public String orgOrderNo;
public SendOrder(String rqName, String screenNo, String accountNumber, int orderType, String code, int quantity, int price, String hoga, String orgOrderNo)
{
this.rqName = rqName;
this.screenNo = screenNo;
this.accountNumber = accountNumber;
this.orderType = orderType;
this.code = code;
this.quantity = quantity;
this.price = price;
this.hoga = hoga;
this.orgOrderNo = orgOrderNo;
}
public SendOrder()
{
this.rqName = "";
this.screenNo = "";
this.accountNumber = "";
this.orderType = 0;
this.code = "";
this.quantity = 0;
this.price = 0;
this.hoga = "";
this.orgOrderNo = "";
}
}
public sealed class SetRealReg
{
public String screenNo;
public String codeList;
public String fidList;
public String realType;
public SetRealReg(String screenNo, String codeList, String fidList, String realType)
{
this.screenNo = screenNo;
this.codeList = codeList;
this.fidList = fidList;
this.realType = realType;
}
public SetRealReg()
{
this.screenNo = "";
this.codeList = "";
this.fidList = "";
this.realType = "";
}
}
그 후 dynamic type으로 lastOrder를 생성하고 SendOrder와 SetRealReg를 호출할때마다
객체에 해당 주문을 기록하였다.
dynamic lastOrder;
.....
int result = kiwoomAPI.SendOrder("주식주문", screenNo, config.accountNumber, type, code, count, price, hoga, "");
lastOrder = new SendOrder("주식주문", screenNo, config.accountNumber, type, code, count, price, hoga, "");
그리고 "서버가 준비되어 있지 않습니다." 메시지가 발생할때 type을 호출해서 type에 따라 주문을 재실행했다.
private void KiwoomAPI_OnReceiveMsg(object sender, AxKHOpenAPILib._DKHOpenAPIEvents_OnReceiveMsgEvent e)
{
log(e.sMsg);
if (e.sMsg.Contains("서버가 준비되어 있지 않습니다."))
{
int result = 0;
switch (lastOrder.GetType().ToString())
{
case "SendOrder":
result = kiwoomAPI.SendOrder(lastOrder.rqName, lastOrder.screenNo, lastOrder.accountNumber, lastOrder.orderType, lastOrder.code, lastOrder.quantity, lastOrder.price, lastOrder.hoga, lastOrder.orgOrderNo);
log("주식주문 재시도 결과 - " + result);
if (result != 0)
{
result = kiwoomAPI.SendOrder(lastOrder.rqName, lastOrder.screenNo, lastOrder.accountNumber, lastOrder.orderType, lastOrder.code, lastOrder.quantity, lastOrder.price, lastOrder.hoga, lastOrder.orgOrderNo);
log("주식주문 재재시도 결과 - " + result);
}
break;
case "SetRealReg":
result = kiwoomAPI.SetRealReg(lastOrder.screenNo, lastOrder.codeList, lastOrder.fidList, lastOrder.realType);
log("실시간등록 재시도 결과 - " + result);
if (result != 0)
{
result = kiwoomAPI.SetRealReg(lastOrder.screenNo, lastOrder.codeList, lastOrder.fidList, lastOrder.realType);
log("실시간등록 재재시도 결과 - " + result);
}
break;
}
}
}
다음주에 해당 메시지가 발생할 때 제대로 재시도를 하는지 확인해봐야겠다.