- 키움증권 OpenApi C# wrapper class
- 개발환경: Visual Studio 2022, netstandard2.0
- WinUI3, WPF, Winforms 지원
- 비동기 로그인, TR 요청 지원 (CommConnectAsync, CommRqDataAsync, CommKwRqDataAsync, GetConditionLoadAsync, SendConditionAsync)
- 비동기 주문 지원 (SendOrderAsync, SendOrderFOAsync, SendOrderCreditAsync)
- 비동기 간편 TR 요청 지원 (RequestTrAsync)
public partial class MainWindow : Window
{
// ocx인터페이스 추가
private AxKHOpenAPI axKHOpenAPI; // 국내 (영웅문)
private AxKFOpenAPI axKFOpenAPI; // 해외 (영웅문 글로벌)
public MainWindow()
{
InitializeComponent();
// ActiveX 세팅
var Handle = new WindowInteropHelper(Application.Current.MainWindow).EnsureHandle();
axKHOpenAPI = new AxKHOpenAPI(Handle);
button_login_KH.IsEnabled = axKHOpenAPI.Created;
axKFOpenAPI = new AxKFOpenAPI(Handle);
button_login_KF.IsEnabled = axKFOpenAPI.Created;
}
private async void button_login_KH_Click(object sender, RoutedEventArgs e)
{
// 국내 로그인 요청
log_list.Items.Add("국내 로그인 요청중...");
var (ret, msg) = await axKHOpenAPI.CommConnectAsync();
if (ret == 0)
{
log_list.Items.Add("국내 로그인 성공");
}
else
{
log_list.Items.Add("국내 로그인 실패: " + msg);
}
}
private async void button_login_KF_Click(object sender, RoutedEventArgs e)
{
// 해외 로그인 요청
log_list.Items.Add("해외 로그인 요청중...");
var (ret, msg) = await axKFOpenAPI.CommConnectAsync(1);
if (ret == 0)
{
log_list.Items.Add("해외 로그인 성공");
}
else
{
log_list.Items.Add("해외 로그인 실패: " + msg);
}
}
// 로그인, 조건식 로딩 (CommConnectAsync, GetConditionLoadAsync)
// TR 요청 (CommRqDataAsync, CommKwRqDataAsync, SendConditionAsync)
// 간편요청 (RequestTrAsync)
// 주문 (SendOrderAsync, SendOrderFOAsync, SendOrderFOAsync, SendOrderCreditAsync)
// 비동기 로그인, 조건식 로딩 (nuget 버전 1.5.0 이상 지원)
async Task TestLoginAsync()
{
var (nRet, sMsg) = await axKHOpenAPI.CommConnectAsync();
if (0 != nRet)
{
OutLog($"로그인 실패: {sMsg}");
return;
}
(nRet, sMsg) = await axKHOpenAPI.GetConditionLoadAsync();
if (1 != nRet)
{
OutLog($"사용자 조건검색리스트요청 실패: {sMsg}");
return;
}
var cond_list = sMsg.Split(';', StringSplitOptions.RemoveEmptyEntries).ToList();
OutLog($"조건검색식 개수: {cond_list.Count}");
// DoWork...
}
// 비동기 요청 (nuget 버전 1.5.0 이상 지원)
async Task TestRequestAsync()
{
// 국내 종목정보 가져오기
string itemCode = "005930";
axKHOpenAPI.SetInputValue("종목코드", itemCode);
string 종목명 = string.Empty;
var (nRet, sMsg) = await axKHOpenAPI.CommRqDataAsync("주식기본정보요청", "OPT10001", 0, "1000", e =>
{
종목명 = axKHOpenAPI.GetCommData(e.sTrCode, e.sRQName, 0, "종목명").Trim();
});
// nRet: 0 성공, 음수 실패(sMsg에 오류내용)
if (nRet == 0)
log_list.Items.Add(종목명);
else
log_list.Items.Add($"비동기 요청실패: {sMsg}");
}
// 비동기 간편요청 (nuget 버전 1.5.3 이상 지원)
async Task TestSimpleRequestAsync()
{
// 샘플 1: 주식기본정보요청
var response = await api.RequestTrAsync(
"OPT10001" // TR코드
, [("종목코드", "005930")] // 입력데이터, 또는 Dictionary<string, string> 형태로 입력
, ["종목명", "액면가", "영업이익", "시가", "고가", "저가", "현재가", "거래량"] // 가져올 싱글데이터
, [] // 가져올 멀티데이터
);
// 샘플 2: 주식일봉차트조회요청
var indatas = new Dictionary<string, string>
{
{ "종목코드", "005930" },
{ "기준일자", "20240704" },
{ "수정주가구분", "1" }
};
var response = await axKHOpenAPI.RequestTrAsync("OPT10081", indatas, ["종목코드"], ["일자", "현재가", "거래량"]);
// 샘플 3: 관심종목정보요청
var response = await axKHOpenAPI.RequestTrAsync("OPTKWFID", [("종목코드", "005930")], [], ["종목명", "현재가", "기준가", "시가", "고가", "저가"]);
// 샘플 4: 거래대금상위요청
var response = await api.RequestTrAsync(
"OPT10032" // 거래대금상위요청
, [
("시장구분", "000"), // 000:전체, 001:코스피, 101:코스닥
("관리종목포함", "0"), // 0:관리종목 미포함, 1:관리종목 포함
]
, [] // 가져올 싱글데이터
, ["종목코드", "종목명", "현재순위", "전일순위", "현재가", "전일대비", "등락률", "현재거래량", "전일거래량", "거래대금"] // 가져올 멀티데이터
);
// 결과처리
if (response.nErrCode == 0)
{
// 요청성공, response.OutputSingleDatas, response.OutputMultiDatas 에 결과가 있음
}
else
{
// 요청실패, response.rsp_msg 에 오류메시지가 있음
}
}
// 비동기 조건검색 (nuget 버전 1.5.3 이상 지원)
async Task TestConditionAsync()
{
var (nRet, sMsg) = await api.SendConditionAsync("8001", conditionInfo.Name, conditionInfo.Code, 0);
if (nRet != 1)
{
print($"검색식 요청실패: {sMsg}");
return;
}
// sMsg 에 검색된 종목코드가 있음 (세미콜론으로 구분 종목코드1;종목코드2..., 또는 현재가 포함 설정시 종목코드1^현재가1;종목코드2^현재가2 ...로 구분))
}
// 비동기 주문 (nuget 버전 1.5.3 이상 지원)
async Task TestOrderAsync()
{
// 삼성전자 주식 1주, 80000원 지정가 매수주문
string itemCode = "005930";
int qty = 1;
int price = 80000;
var (nRet, sMsg) = await axKHOpenAPI.SendOrderAsync("매수주문", "0101", 계좌번호, 1, itemCode, qty, price, "00", string.Empty);
// 결과처리
if (nRet != 0)
{
print($"주문 요청실패: {sMsg}"); // 실패사유 출력
return;
}
// 주문성공, 서버까지 주문 전달이 확실히 성공 되었음
}
}
public partial class Form1 : Form
{
// ocx인터페이스 추가
private AxKHOpenAPI axKHOpenAPI; // 국내 (영웅문)
private AxKFOpenAPI axKFOpenAPI; // 해외 (영웅문 글로벌)
public Form1()
{
InitializeComponent();
// ActiveX 세팅
axKHOpenAPI = new AxKHOpenAPI(Handle);
// WPF샘플과 동일
...
}
...
}
*WinuUI3 x86모드에서 글로벌OpenApi는 오류발생, x64모드에서는 오류없음
public sealed partial class MainWindow : Window
{
// ocx인터페이스 추가
private AxKHOpenAPI axKHOpenAPI; // 국내 (영웅문)
private AxKFOpenAPI axKFOpenAPI; // 해외 (영웅문 글로벌)
public MainWindow()
{
this.InitializeComponent();
// ActiveX 세팅
System.IntPtr Handle = WinRT.Interop.WindowNative.GetWindowHandle(this);
axKHOpenAPI = new AxKHOpenAPI(Handle);
// WPF샘플과 동일
...
}
...
}