본문 바로가기
개발/C#

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

by esstory 2021. 9. 4.

이번 예제는 최유리지정가주문을 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;
}

 

댓글