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
반응형