본문 바로가기

주식/키움증권OpenAPI

키움증권 OpenAPI 조건식 검색 방법

보통 증권사 API를 통해 자동매매를 만들려고 하시는 분들이 가장 먼저 시도하는 방식은 조건검색식에 포착된 종목을 매매하는 것으로 생각된다.

종목을 검색하기 가장 쉬운 방식이기 때문이다.

 

그럼 이번에는 키움증권 API를 통해 현재 등록되어 있는 검색식을 조회하고 사용하는 방식에 대해 살펴보겠다.

 

우선 제일 먼저 조건식을 불러오는 코드이다.

 

if(axKHOpenAPI1.GetConditionLoad() == 0) // 0이면 실패
{
    Console.WriteLine("조건검색 로딩 실패");
}

 

GetConditionLoad()라는 함수를 사용하며 값이 0이면 조건식 호출에 실패한 것이다.

호출에 성공하면 콜백 함수(OnReceiveConditionVer)를 통해 보유 중인 조건식을 받을 수 있다.

 

private void axKHOpenAPI1_OnReceiveConditionVer(object sender, AxKHOpenAPILib._DKHOpenAPIEvents_OnReceiveConditionVerEvent e)
{
    if (e.lRet != 1) return; // 1이 아니면 실패

    // 세미콜론(;)으로 구분되어 전달 받음
    // 받은 조건식 형태는 조건식번호^조건식명;조건식번호^조건식명;조건식번호^조건식명;
    comboBox1.Items.AddRange(axKHOpenAPI1.GetConditionNameList().Split(new string[] { ";" }, StringSplitOptions.RemoveEmptyEntries));
}

 

전달받은 조건식은 GetConditionNameList() 함수를 통해 문자열로 전달 받을 수 있다.

각 조건식은 조건식번호^조건식명 형태이고 각각 세미콜론(;)으로 구분되어 전달된다.

위의 소스코드는 전달받은 조건식을 ComboBox에 삽입하는 예제이다.

 

다음은 조건식을 사용해 종목을 검색할 때는 SendCondition() 함수를 사용한다.

만약 실시간 조건 검색일 경우 SendConditionStop() 함수로 실시간 조회를 종료할 수 있다.

 

private void detectCondition()
{
    // 선택한 조건검색식을 조건검색번호, 조건검색명 둘로 나누는 작업
    string[] condition = comboBox1.SelectedItem.ToString().Split('^');

    int conditionNum = 0;

    try
    {
        conditionNum = int.Parse(condition[0].TrimStart('0'));
    }
    catch (FormatException ex)
    {
        Console.WriteLine("기본 조건식 사용 " + ex.Message);
    }

    if (axKHOpenAPI1.SendCondition("1212", condition[1], conditionNum, 1) == 0) // 0:조건검색, 1:실시간 조건검색
    {
        Console.WriteLine("조건검색 요청 실패");
    }
}

 

SendCondition() 함수를 사용할 때 마지막 인자인 nSearch 값을 0으로 하면 조건검색을 한번 실행하고 1로 하면 실시간 조건검색을 사용할 수 있다.

실시간 조건검색을 사용할 때 SendConditionStop() 함수로 실시간 조회를 종료할 수 있다.

 

private void stopSendCondition(string scrNo, string conditionName, int conditionIdx)
{
    axKHOpenAPI1.SendConditionStop(scrNo, conditionName, conditionIdx); // 화면번호, 조건식명, 조건식번호
}

 

실시간 조건검색을 통해 조회된 종목은 콜백함수(OnReceiveRealCondition)에서 받을 수 있다.

 

private void axKHOpenAPI1_OnReceiveRealCondition(object sender, AxKHOpenAPILib._DKHOpenAPIEvents_OnReceiveRealConditionEvent e)
{
    // 실시간 조건검색 요청으로 종목 편입 확인 (type - I : 종목편입, D : 종목이탈)
    if (e.strType.Equals("I"))
    {
        Console.WriteLine("조건검색 실시간 편입 [" + axKHOpenAPI1.GetMasterCodeName(e.sTrCode) + "(" + e.sTrCode + ")]");
    }
    else if (e.strType.Equals("D"))
    {
        Console.WriteLine("조건검색 실시간 이탈 [" + axKHOpenAPI1.GetMasterCodeName(e.sTrCode) + "(" + e.sTrCode + ")]");
    }
}

 

콜백함수에서 전달받는 값은 종목코드와 편입,이탈 정보 밖에 없으므로 시세조회가 필요할 경우 따로 함수를 통해 조회해야한다.

 

조건검색과 관련된 함수들을 알아보았다. 위의 내용들이면 충분히 조건검색을 통해 종목을 조회할 수 있을 것이다.

필자는 여기에 텔레그램 봇을 연동하여 포착된 종목을 텔레그램으로 전송하도록 만들어서 사용 중이다.

 

다음 포스팅에서는 시세조회에 대해 다뤄보도록 하겠다.

반응형