이번 예제는 최유리지정가주문을 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;
}
'개발 > C#' 카테고리의 다른 글
[C#] 이벤트를 만들고 사용하기 (0) | 2021.01.17 |
---|---|
[C#] User Control 을 툴박스에 표시하기 (0) | 2020.11.04 |
[C#] HTS 차트 흉내내기 (3) | 2020.10.15 |
[C#] 클릭(번개)주문 만들기 (CYBOS PLUS/CREON PLUS) #2 (0) | 2020.09.23 |
[C#] 클릭(번개)주문 만들기 (CYBOS PLUS/CREON PLUS) (2) | 2020.09.19 |
댓글