(1) 주문
khAPI.SendOrder("Order", 스크린 넘버, 계좌번호, 주문타입(1:매수,2:매도,3:매수취소,4:매도취소,5:매수정정,6:매도정정), 종목코드, 갯수, 가격, 매매타입(0:지정가,3:시장가);
SendOrder(주문) => OnReceiveTrData(주문결과) => OnReceiveChejanData (체결정보)
생성자에 이벤트 등록
khAPI.OnReceiveChejanData += khAPI_OnReceiveChejanData;
khAPI.OnReceiveTrData += khAPI_OnReceiveTrData;
public int Order(string code, string accountNumber, int cnt, KHOrderType orderType, KHHogaGb hoga, string orderID, int price)
{
ScreenNumber sn = ScreenNumber.GetNext();
sn.OnCompleted = (p) =>
{
if (p is _DKHOpenAPIEvents_OnReceiveTrDataEvent)
{
_DKHOpenAPIEvents_OnReceiveTrDataEvent e = p as _DKHOpenAPIEvents_OnReceiveTrDataEvent;
string orderNo = khAPI.GetCommData(e.sTrCode, e.sRQName, 0, "주문번호").Trim();
string stockName = KHStock.GetSingInstance(code).Name;
KHAccountBalance accBal = KHAccountBalance.GetSingInstance(accountNumber);
KHOrderInfo orderInfo = KHOrderInfo.GetSingInstance(orderNo);
orderInfo.AccountNumber = accountNumber;
orderInfo.StockCode = code;
orderInfo.StockName = stockName;
orderInfo.OrderCnt = cnt;
orderInfo.NonTradingCnt = cnt;
orderInfo.OrderType = orderType;
orderInfo.HogaGubun = hoga;
orderInfo.OrderPrice = price;
accBal.Orders.Add(orderInfo);
}
};
return khAPI.SendOrder("Order", sn.No, accountNumber, (int)orderType, code, cnt, price, "0" + (int)hoga, orderID);
}
private void khAPI_OnReceiveTrData(object sender, AxKHOpenAPILib._DKHOpenAPIEvents_OnReceiveTrDataEvent e)
{
ScreenNumber sn = ScreenNumber.GetSingInstance(e.sScrNo);
if (sn.ExNotNull() && sn.OnCompleted.ExNotNull())
sn.OnCompleted(e);
}
private void khAPI_OnReceiveChejanData(object sender, AxKHOpenAPILib._DKHOpenAPIEvents_OnReceiveChejanDataEvent e)
{
switch (e.sGubun)
{
case "0":
KHOrderInfo orderInfo = KHOrderInfo.GetSingInstance(khAPI.GetChejanData(9203).ExTrim());
orderInfo.NonTradingCnt = khAPI.GetChejanData(902).ExTrim().ExLong();
orderInfo.OrderPrice = khAPI.GetChejanData(901).ExTrim().ExLong();
orderInfo.PurchaseAmount = khAPI.GetChejanData(903).ExTrim().ExLong();
orderInfo.StrOrderType = khAPI.GetChejanData(905).ExTrim();
orderInfo.Status = khAPI.GetChejanData(913).ExTrim();
StringBuilder sb = new StringBuilder();
sb.AppendLine("================================================");
sb.AppendLine("주문번호 : " + khAPI.GetChejanData(9203));
sb.AppendLine("종목코드 : " + khAPI.GetChejanData(9001));
sb.AppendLine("주문상태 : " + khAPI.GetChejanData(913));
sb.AppendLine("종목명 : " + khAPI.GetChejanData(302));
sb.AppendLine("주문수량 : " + khAPI.GetChejanData(900));
sb.AppendLine("주문가격 : " + khAPI.GetChejanData(901));
sb.AppendLine("미체결수량 : " + khAPI.GetChejanData(902));
sb.AppendLine("체결누계금액 : " + khAPI.GetChejanData(903));
sb.AppendLine("원주문번호 : " + khAPI.GetChejanData(904));
sb.AppendLine("주문구분 : " + khAPI.GetChejanData(905));
sb.AppendLine("매매구분 : " + khAPI.GetChejanData(906));
sb.AppendLine("매도수구분 : " + khAPI.GetChejanData(907));
sb.AppendLine("주문/체결시간 : " + khAPI.GetChejanData(908));
sb.AppendLine("체결번호 : " + khAPI.GetChejanData(909));
sb.AppendLine("체결가 : " + khAPI.GetChejanData(910));
sb.AppendLine("체결량 : " + khAPI.GetChejanData(911));
sb.AppendLine("================================================");
KHLog.Instance.Write(sb.ToString());
if (orderInfo.NonTradingCnt == 0 && orderInfo.AccountNumber.ExNotNull())
{
GetAccountBalance(orderInfo.AccountNumber);
}
break;
case "1":
KHLog.Instance.Write("잔고통보");
break;
case "3":
KHLog.Instance.Write("특이신호");
break;
}
}
(2) 잔고 처리
// 계좌번호 = 전문 조회할 보유계좌번호
khAPI.SetInputValue("계좌번호", accountNumber);
// 전체종목구분 = 0:전체, 1:종목
khAPI.SetInputValue("전체종목구분", "0");
// 매매구분 = 0:전체, 1:매도, 2:매수
khAPI.SetInputValue("매매구분", "0");
// 종목코드 = 전문 조회할 종목코드(공백허용, 공백입력시 전체종목구분 "0" 입력하여 전체 종목 대상으로 조회)
khAPI.SetInputValue("종목코드", "");
// 체결구분 = 0:전체, 2:체결, 1:미체결
khAPI.SetInputValue("체결구분", "1");
khAPI.CommRqData("GetNonTrading", "opt10075", 0, sn.No);
생성자에 이벤트 등록
khAPI.OnReceiveTrData += khAPI_OnReceiveTrData;
private void khAPI_OnReceiveTrData(object sender, AxKHOpenAPILib._DKHOpenAPIEvents_OnReceiveTrDataEvent e)
{
ScreenNumber sn = ScreenNumber.GetSingInstance(e.sScrNo);
if (sn.ExNotNull() && sn.OnCompleted.ExNotNull())
sn.OnCompleted(e);
}
public int GetNonTrading(string accountNumber)
{
ScreenNumber sn = ScreenNumber.GetNext();
sn.OnCompleted += (p) =>
{
if (p is AxKHOpenAPILib._DKHOpenAPIEvents_OnReceiveTrDataEvent)
{
_DKHOpenAPIEvents_OnReceiveTrDataEvent e = p as _DKHOpenAPIEvents_OnReceiveTrDataEvent;
int cnt = khAPI.GetRepeatCnt(e.sTrCode, e.sRQName);
KHAccountBalance accBal = KHAccountBalance.GetSingInstance(accountNumber);
accBal.Orders.Clear();
for (int i = 0; i < cnt; i++)
{
string orderID = khAPI.GetCommData(e.sTrCode, e.sRQName, i, "주문번호").Trim();
KHOrderInfo orderInfo = KHOrderInfo.GetSingInstance(orderID);
orderInfo.AccountNumber = accountNumber;
orderInfo.StockCode = khAPI.GetCommData(e.sTrCode, e.sRQName, i, "종목코드").Trim();
orderInfo.StockName = khAPI.GetCommData(e.sTrCode, e.sRQName, i, "종목명").Trim();
orderInfo.OrderCnt = khAPI.GetCommData(e.sTrCode, e.sRQName, i, "주문수량").Trim().ExLong();
orderInfo.NonTradingCnt = khAPI.GetCommData(e.sTrCode, e.sRQName, i, "미체결수량").Trim().ExLong();
orderInfo.HogaGubun = khAPI.GetCommData(e.sTrCode, e.sRQName, i, "매매구분").Trim() == "시장가" ? KHHogaGb.MARKETPRICE : KHHogaGb.LIMITPRICE;
orderInfo.Status = khAPI.GetCommData(e.sTrCode, e.sRQName, i, "주문상태").Trim();
orderInfo.StrOrderType = khAPI.GetCommData(e.sTrCode, e.sRQName, i, "주문구분").Trim();
orderInfo.OrderPrice = khAPI.GetCommData(e.sTrCode, e.sRQName, i, "주문가격").Trim().ExLong();
orderInfo.PurchaseAmount = khAPI.GetCommData(e.sTrCode, e.sRQName, i, "체결누계금액").Trim().ExLong();
accBal.Orders.Add(orderInfo);
}
if (cnt == 0)
{
KHOrderInfo.Clear();
}
}
};
// 계좌번호 = 전문 조회할 보유계좌번호
khAPI.SetInputValue("계좌번호", accountNumber);
// 전체종목구분 = 0:전체, 1:종목
khAPI.SetInputValue("전체종목구분", "0");
// 매매구분 = 0:전체, 1:매도, 2:매수
khAPI.SetInputValue("매매구분", "0");
// 종목코드 = 전문 조회할 종목코드(공백허용, 공백입력시 전체종목구분 "0" 입력하여 전체 종목 대상으로 조회)
khAPI.SetInputValue("종목코드", "");
// 체결구분 = 0:전체, 2:체결, 1:미체결
khAPI.SetInputValue("체결구분", "1");
return khAPI.CommRqData("GetNonTrading", "opt10075", 0, sn.No);
}
미체결 정보의 체결 상태는 1번 항목과 동일 하게 처리
khAPI.OnReceiveChejanData += khAPI_OnReceiveChejanData;
'대충 만들면서 배우자 > 자동 매매 (키움 API)' 카테고리의 다른 글
[C#/WPF 키움 API 자동 매매] 프로젝트 구성 (1) (0) | 2023.04.12 |
---|---|
[C#/WPF 키움 API] 키움 API_조건 검색 (6) (0) | 2023.04.03 |
[C#/WPF 키움 API] 키움 API_계좌 정보 및 주문 내역 (4) (0) | 2023.03.30 |
[C#/WPF 키움 API] 키움 API_로그인/종목/실시간 시세 (3) (0) | 2023.03.29 |
[C#/WPF 키움 API] 프로젝트 생성 및 WPF에 키움OCX 바인딩 하기 (2) (0) | 2023.03.27 |
댓글