Application/C# (WinForm)
[C# WinForm] 키움 증권 Open API 조회횟수 제한
devsalix
2023. 3. 7. 16:11
728x90
키움 증권 Open API를 이용할 시 사용제한이 되는 경우가 있습니다
조회 요청으로 CommRqData / SendCondition / CommKwRqData 3가지가 묶음으로 1초당 5회로 제한되며
주문 요청으로 SendOrder / SendOrderFO / SendOrderCredit 3가지가 묶음으로 1초당 5회로 제한됩니다
이를 회피하기 위해서는
Thread를 활용해 주문 요청을 하고 순차적으로 처리하는 방식으로 프로그래밍되어야 합니다
간단한 예제로 0.3초당 1건의 데이터와 1시간에 1천 건의 데이터를 처리하는 구문은 아래와 같습니다
using System.Collections;
private static int m_iOrderCount;
private static DateTime m_dtOrder;
private static ArrayList m_arOrder;
private Thread m_ThOrder;
private bool m_bRunThread;
public MainClass()
{
m_bRunThread = true;
m_iOrderCount = 0;
m_dtOrder = DateTime.Now;
m_arOrder = new ArrayList();
m_ThOrder = new Thread(Th_Order);
m_ThOrder.Start();
}
public void Dispose()
{
m_bRunThread = false;
m_ThOrder.Join();
}
private void RegOrder()
{
//Order 요청
m_arOrder.Add(....);
}
private static void Th_Order()
{
while (m_bRunThread)
{
if (m_arOrder.Count == 0)
{
Thread.Sleep(1);
continue;
}
int iRet = m_axKHOpenAPI.SendOrder(......) // Order 주문
if (iRet != 0)
{
Console.WriteLine("SendOrder 요청 오류\n");
m_arOrder.RemoveAt(0);
continue;
}
m_arOrder.RemoveAt(0);
m_iOrderCount++;
if (m_iOrderCount >= 1000)
{
TimeSpan tsCurrent = new TimeSpan(DateTime.Now.Ticks);
TimeSpan tsBefore = new TimeSpan(m_dtRqData.Ticks);
TimeSpan tsGap = tsCurrent.Subtract(tsBefore);
for (int iCnt = 0; iCnt < (int)(tsGap.Ticks / 10000); iCnt++)
{
if (m_bRunThread == false) return;
Thread.Sleep(1);
}
m_dtRqData = DateTime.Now;
m_iOrderCount = 0;
}
else
{
for (int iCnt = 0; iCnt < 300; iCnt++)
{
if (m_bRunThread == false) return;
Thread.Sleep(1);
}
}
}
}
제 글이 도움이 되셨다면 댓글 & 공감 부탁드려요 😀
728x90
반응형