[C#]FOK, 최유리 매수 주문 (CYBOS PLUS/CREON PLUS)

2021. 9. 4. 09:13개발/C#

이번 예제는 최유리지정가주문을 FOK 방식으로 매수 주문내는 PLUS 예제코드입니다 

FOK 주문은 

주문 수량이 전부체결일 경우 체결, 아니면 즉시 취소가 되는 주문입니다.

전부 체결 또는 자동 취소라서 자동 매매를 할 때 미체결을 신경쓰지 않아도 좋다는 점에서 아주 유용합니다 

 

최유리 지정가 주문은

매수 주문 시 매도1호가로 주문이 나가게 됩니다.

시세가 급변하는 경우 매도1호가로 주문 내더라도 금방 시세가 바뀔 수 있어, 체결률을 높이기 위해 이 방법을 주로 씁니다 . 

주문가격이 시장에 도달시점의 매도1호가이기 때문에 주문 시 별도 가격 지정은 하지 않습니다.

 

아래는 간단한 C# 샘플 코드입니다.

코드를 단순화 하기 위해 클래스 생성자 등의 코드는 제거했습니다.

public enum COMM_TYPE { SISE = 1, ACC = 0}
private CPTRADELib.CpTdUtil m_cpTdUtil = new CPTRADELib.CpTdUtil();
private CPTRADELib.CpTd0311 m_obj0311 = new CPTRADELib.CpTd0311();
private string m_sAcc = "";
private string m_sAccFlag = "";

private void Init()
{
    if (m_sAcc != "")
        return;
    ///////////////////////////////////////////////////
    // 계좌번호, 상품 구분 가져오기 
    string[] listAcc = (string[])m_cpTdUtil.AccountNumber;
    if (listAcc.Length == 0)
        return false;

    m_sAcc = listAcc[0];
    string[] lstAccFlag = (string[])m_cpTdUtil.get_GoodsList(m_sAcc, CPE_ACC_GOODS.CPC_STOCK_ACC);    // 주식
    if (lstAccFlag.Length == 0)
        return false;
    m_sAccFlag = lstAccFlag[0];

}

// 호출 제한 확인 및 대기 함수
public void waitRqLimit(COMM_TYPE commType)
{
    int nRemainCnt =m_cpCybos.GetLimitRemainCount((CPUTILLib.LIMIT_TYPE)commType);

    if (nRemainCnt > 0) 
    {
        return;
    }


    int nRemainTime = m_cpCybos.GetLimitRemainTime((CPUTILLib.LIMIT_TYPE)commType);
    Thread.Sleep(nRemainTime);

    return;

}


public bool checkRqError(CPTRADELib.ICpTdDib objRq, int nRqRet) 
{
    if (nRqRet != 0)
    {
        m_sErrMsg = "통신 오류: " + nRqRet.ToString();
        MessageBox.Show(sErrMsg, "통신오류", MessageBoxButtons.OK, MessageBoxIcon.Error);

        return false;
    }

    short nStatus = objRq.GetDibStatus();
    string sMsg = objRq.GetDibMsg1();

    if (nStatus != 0) 
    {
        m_sErrMsg = "통신상태: " + nStatus.ToString() + " 오류메시지: " + sMsg;
        MessageBox.Show(sErrMsg, "통신오류", MessageBoxButtons.OK, MessageBoxIcon.Error);
        return false;
    }

    return true;
}


// FOK + 최유리지정가 매수 주문 내기 
public bool BuyFOKOrder(string sCode, int nAmt, ORDER_BLOCK block)
{
    Init();
    ///////////////////////////////////////////////////
    // 주문하기 

    m_obj0311.SetInputValue(0, "2");  // 1 매도 2 매수
    m_obj0311.SetInputValue(1, m_sAcc);
    m_obj0311.SetInputValue(2, m_sAccFlag);
    m_obj0311.SetInputValue(3, sCode); // 종목코드
    m_obj0311.SetInputValue(4, nAmt); // 수량
    m_obj0311.SetInputValue(5, 0);  // 주문단가

    // 최유리지정가 - 상대 방향 매매의 최우선 호가로 나감
    //   매수는 매도1호가, 매도는 매수1호가
    // FOK - FILL OR KILL, 주문 즉시 전부체결 또는 전부 자동취소 
    m_obj0311.SetInputValue(7, "2");  // 주문 조건 구분 코드, 0: 기본 1: IOC 2:FOK
    m_obj0311.SetInputValue(8, "12"); //  주문호가 구분코드 - 12: 최유리지정가


    waitRqLimit(COMM_TYPE.ACC);

    int nRet = m_obj0311.BlockRequest();

    // 통신 오류 처리
    if (false == checkRqError(m_obj0311, nRet))
        return false;
  
    return true;
}