대충 만들면서 배우자/자동 매매 (키움 API)

[C#/WPF 키움 API] 키움 API_주문 및 잔고 (5)

프갭 2023. 3. 31. 16:14

(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;

반응형