FAQ
KiwoomRestApi.Net ์ฌ์ฉ ์ค ์์ฃผ ๋ฌป๋ ์ง๋ฌธ๊ณผ ๋ต๋ณ์ ๋๋ค.
ํค์ OpenAPI ์ฑ ํค์ ์ํฌ๋ฆฟ ํค๋ ์ด๋ป๊ฒ ๋ฐ๊ธ๋ฐ๋์?
ํค์์ฆ๊ถ ์์ ๋ฌธ ํํ์ด์ง์ Open API ์น์ ์์ ์ฑ ํค๋ฅผ ๋ฐ๊ธ๋ฐ์ ์ ์์ต๋๋ค.
๋ฐ๊ธ ์ ์ฐจ:
1. ํค์์ฆ๊ถ ํํ์ด์ง์ ๋ก๊ทธ์ธ
2. Open API > API ์ ์ฒญ ๋ฉ๋ด๋ก ์ด๋
3. ์ฑ ์ด๋ฆ๊ณผ ์ฉ๋๋ฅผ ์
๋ ฅํ์ฌ ์ ์ฒญ
4. ์น์ธ ํ ์ฑ ํค(App Key)์ ์ํฌ๋ฆฟ ํค(Secret Key)๋ฅผ ํ์ธ
์ง์ํ๋ .NET ๋ฒ์ ์ ๋ฌด์์ธ๊ฐ์?
.NET 6.0 ์ด์์ ์ง์ํฉ๋๋ค.
.NET STANDARD 2.0, 2.1, .NET 6, 7, 8, 10 ๋ชจ๋ ํธํ๋ฉ๋๋ค.
NuGet ํจํค์ง๋ ์ด๋ป๊ฒ ์ค์นํ๋์?
๋ค์ ๋ฐฉ๋ฒ ์ค ํ๋๋ก ์ค์นํ ์ ์์ต๋๋ค:
.NET CLI:
dotnet add package KiwoomRestApi.NetNuGet ํจํค์ง ๊ด๋ฆฌ์ ์ฝ์:
PM> Install-Package KiwoomRestApi.Net๋ชจ์ํฌ์์ ์ค๊ฑฐ๋์ ์ฐจ์ด๋ ๋ฌด์์ธ๊ฐ์?
ํด๋ผ์ด์ธํธ ์์ฑ ์ isMock ํ๋ผ๋ฏธํฐ๋ก ๊ตฌ๋ถํฉ๋๋ค:
/* ๋ชจ์ํฌ์ (ํ
์คํธ์ฉ) */
var client = KiwoomRestApiClient.Create(appKey, secretKey, isMock: true);
/* ์ค๊ฑฐ๋ */
var client = KiwoomRestApiClient.Create(appKey, secretKey, isMock: false);๋ชจ์ํฌ์ ๋ชจ๋์์๋ ์ผ๋ถ API(์ถ๊ธ, ํน์ ๊ณ์ข ์กฐํ ๋ฑ)๊ฐ ์ ํ๋ ์ ์์ต๋๋ค.
์ ๊ทผ ํ ํฐ์ ์๋์ผ๋ก ๊ด๋ฆฌ๋๋์?
๋ค. KiwoomRestApiClient.Create ๋๋ CreateAsync๋ฅผ ํธ์ถํ๋ฉด ์๋์ผ๋ก OAuth 2.0 ์ ๊ทผ ํ ํฐ์ด ๋ฐ๊ธ๋ฉ๋๋ค. ํด๋ผ์ด์ธํธ ๋ด๋ถ์์ ํ ํฐ์ ๊ด๋ฆฌํ๋ฏ๋ก ๋ณ๋๋ก ์ฒ๋ฆฌํ ํ์๊ฐ ์์ต๋๋ค.
/* Create ์ ์๋์ผ๋ก ํ ํฐ ๋ฐ๊ธ */
var client = KiwoomRestApiClient.Create(appKey, secretKey, isMock: true);
/* ํ ํฐ ์๋ ์ ๊ทผ */
var token = client.Token;ํ ํฐ ๋ง๋ฃ ์ ์ด๋ป๊ฒ ๋๋์?
ํค์ REST API์ ์ ๊ทผ ํ ํฐ์ ๋ฐ๊ธ ํ ์ผ์ ์๊ฐ์ด ์ง๋๋ฉด ๋ง๋ฃ๋ฉ๋๋ค. ๋ง๋ฃ๋ ๊ฒฝ์ฐ ์๋ก์ด ํด๋ผ์ด์ธํธ๋ฅผ ์์ฑํ๊ฑฐ๋ GetAccessTokenAsync๋ฅผ ํธ์ถํ์ฌ ํ ํฐ์ ์ฌ๋ฐ๊ธ๋ฐ์์ผ ํฉ๋๋ค.
ํ์ด์ง๋ค์ด์ ์ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ๋์?
๋๋์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ๋๋ ์๋ต์ ContYn๊ณผ NextKey๋ฅผ ์ฌ์ฉํ์ฌ ํ์ด์ง๋ค์ด์
์ ์ฒ๋ฆฌํฉ๋๋ค:
var result = await client.Chart.GetTickChartsAsync("005930", 1, false);
if (result.ContYn)
{
client.ContYn = true;
client.NextKey = result.NextKey;
var nextPage = await client.Chart.GetTickChartsAsync("", 1, false);
}API ํธ์ถ ์๋ ์ ํ์ด ์๋์?
ํค์ REST API์๋ ์ด๋น ํธ์ถ ํ์ ์ ํ์ด ์์ต๋๋ค. ์ ํ์ ์ด๊ณผํ๋ฉด ์๋ฌ๊ฐ ๋ฐํ๋ฉ๋๋ค.
PagingDelay ์์ฑ์ ์ฌ์ฉํ์ฌ ํ์ด์ง๋ค์ด์
์ ์๋์ผ๋ก ์ง์ฐ์ ์ค ์ ์์ต๋๋ค:
client.PagingDelay = 1000; // ํ์ด์ง ๊ฐ 1์ด ์ง์ฐ์ด๋ค Enum ํ์ ์ ์ฌ์ฉํด์ผ ํ๋์?
๋ชจ๋ API ํ๋ผ๋ฏธํฐ๋ ํ์ ์์ ํ Enum์ผ๋ก ์ ๊ณต๋ฉ๋๋ค. ๊ฐ API ๋ฉ์๋์ ํ๋ผ๋ฏธํฐ์ ๋ง๋ Enum์ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค:
/* ๊ฐ ๋ค์์คํ์ด์ค๋ณ Enum */
using KiwoomRestApi.Net.Enums.Account;
using KiwoomRestApi.Net.Enums.StockInfo;
using KiwoomRestApi.Net.Enums.Order;
using KiwoomRestApi.Net.Enums.Chart;
// ... ๊ธฐํ์ ์ฒด Enum ๋ชฉ๋ก์ API Reference์ Enums ์น์ ์์ ํ์ธํ ์ ์์ต๋๋ค.
๋ชจ์ํฌ์์์ ์ฌ์ฉํ ์ ์๋ API๊ฐ ์๋์?
๋ค, ์ผ๋ถ API๋ ๋ชจ์ํฌ์ ๋ชจ๋์์ ์ง์๋์ง ์์ต๋๋ค:
๋ชจ์ํฌ์ ๋ฏธ์ง์ API ์์:
• ์ถ๊ธ ๊ฐ๋ฅ ๊ธ์ก ์กฐํ (GetAvailableWithdrawalAmountsAsync)
• ์ํ๊ณ์ข ์ฒด๊ฒฐ๋ด์ญ ์กฐํ (GetConsignedTransactionsAsync)
• ์ ์ฉ์ต์์ฃผ๋ฌธ ์กฐํ (GetCreditDepositOrdersAsync)
• ๋์ถ/์ ์ฉ ๊ด๋ จ API
• ๊ธํ๋ฌผ ์ฃผ๋ฌธ (Gold Spot ์ฃผ๋ฌธ/์์ /์ทจ์)
no mock ํ๊ทธ๊ฐ ์๋ API๋ ๋ชจ์ํฌ์์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
WebSocket ์ค์๊ฐ ๋ฐ์ดํฐ๋ ์ด๋ป๊ฒ ์์ํ๋์?
REST API ํด๋ผ์ด์ธํธ์์ ํ ํฐ์ ๊ฐ์ ธ์ WebSocket ํด๋ผ์ด์ธํธ๋ฅผ ์์ฑํ ํ, ๊ตฌ๋ ํ ์๋น์ค์ ์ข ๋ชฉ ์ฝ๋๋ฅผ ์ง์ ํฉ๋๋ค:
var socketClient = KiwoomSocketClient.Create(client.Token, isMock: true);
/* ์ด๋ฒคํธ ํธ๋ค๋ฌ ๋ฑ๋ก */
socketClient.OnRealtimeStockTradeReceived += (data) => {
// ์ฒด๊ฒฐ ๋ฐ์ดํฐ ์ฒ๋ฆฌ
};
/* ๊ตฌ๋
์์ */
await socketClient.WebSocket.SubscribeAsync(
serviceNames: [KiwoomWebSocketServiceName.StockTrade],
parameters: ["005930"],
groupId: "1"
);์ด๋ค ์ค์๊ฐ ์๋น์ค๋ฅผ ์ฌ์ฉํ ์ ์๋์?
๋ค์ ์ค์๊ฐ ์๋น์ค๋ฅผ ์ง์ํฉ๋๋ค:
• StockTrade — ์ฃผ์ ์ฒด๊ฒฐ ๋ฐ์ดํฐ
• OrderBook — ์ฃผ์ ํธ๊ฐ
• Balance — ์๊ณ
• OrderTrade — ์ฃผ๋ฌธ ์ฒด๊ฒฐ
• ViEvent — VI ๋ฐ๋
• EtfNav — ETF NAV
• ElwTheoreticalPrice — ELW ์ด๋ก ๊ฐ
• ElwIndicator — ELW ์งํ
• StockInfo — ์ฃผ์ ๊ธฐ๋ณธ ์ ๋ณด
• BestQuote — ์ฐ์ ํธ๊ฐ
• StockTrend — ์ฃผ์ ์ถ์ด
• ExpectedTrade — ์์ ์ฒด๊ฒฐ
• IndustryIndex — ์
์ข
์ง์
• IndustryChange — ์
์ข
๋ฑ๋ฝ
• ProgramTransaction — ํ๋ก๊ทธ๋จ ๋งค๋งค
• DailyBroker — ์ผ์ค ์ฆ๊ถ์ฌ
• MarketOpenTime — ์ฅ์์ ์๊ฐ
• AfterMarketQuote — ์ฃผ์์๊ฐ์ธํธ๊ฐ
• InternationalGoldPrice — ๊ตญ์ ๊ธํ์ฐ๊ฐ๊ฒฉ
WebSocket ์ฐ๊ฒฐ์ด ๋์ด์ง๋ฉด ์ด๋ป๊ฒ ๋๋์?
WebSocket ์ฐ๊ฒฐ์ด ๋์ด์ง๋ฉด ์ด๋ฒคํธ ์์ ์ด ์ค๋จ๋ฉ๋๋ค. ์๋ ์ฌ์ฐ๊ฒฐ ๋ก์ง์ ์ง์ ๊ตฌํํด์ผ ํฉ๋๋ค:
try
{
await socketClient.WebSocket.SubscribeAsync(...);
}
catch (WebSocketException)
{
// ์ฌ์ฐ๊ฒฐ ๋ก์ง
await Task.Delay(TimeSpan.FromSeconds(5));
socketClient = KiwoomSocketClient.Create(client.Token, isMock);
await socketClient.WebSocket.SubscribeAsync(...);
}์์ฅ๊ฐ์ ์ง์ ๊ฐ ์ฃผ๋ฌธ์ ์ฐจ์ด๋ ๋ฌด์์ธ๊ฐ์?
TransactionType ํ๋ผ๋ฏธํฐ๋ก ๊ตฌ๋ถํฉ๋๋ค:
/* ์์ฅ๊ฐ ์ฃผ๋ฌธ - ์ฆ์ ์ฒด๊ฒฐ */
await client.Order.PlaceOrderAsync(
orderType: KiwoomOrderType.Buy,
domesticStockExchangeType: KiwoomOrderDomesticStockExchangeType.Krx,
stockCode: "005930",
orderQuantity: 10,
transactionType: KiwoomOrderTransactionType.Market
);
/* ์ง์ ๊ฐ ์ฃผ๋ฌธ - ํน์ ๊ฐ๊ฒฉ์ ์ฒด๊ฒฐ */
await client.Order.PlaceOrderAsync(
orderType: KiwoomOrderType.Buy,
domesticStockExchangeType: KiwoomOrderDomesticStockExchangeType.Krx,
stockCode: "005930",
orderQuantity: 10,
transactionType: KiwoomOrderTransactionType.Normal,
orderPrice: 75000
);์ฃผ๋ฌธ์ ์ทจ์ํ๊ฑฐ๋ ์์ ํ ์ ์๋์?
๋ค, ๋ฏธ์ฒด๊ฒฐ ์ฃผ๋ฌธ์ ๋ํด ์ทจ์ ๋ฐ ์์ ์ด ๊ฐ๋ฅํฉ๋๋ค:
/* ์ฃผ๋ฌธ ์ทจ์ */
await client.Order.CancelOrderAsync(
domesticStockExchangeType: KiwoomOrderDomesticStockExchangeType.Krx,
originalOrderId: "์ฃผ๋ฌธ๋ฒํธ",
stockCode: "005930",
cancelQuantity: 5
);
/* ์ฃผ๋ฌธ ์์ (์๋, ๊ฐ๊ฒฉ ๋ณ๊ฒฝ) */
await client.Order.ModifyOrderAsync(
domesticStockExchangeType: KiwoomOrderDomesticStockExchangeType.Krx,
originalOrderId: "์ฃผ๋ฌธ๋ฒํธ",
stockCode: "005930",
modifyQuantity: 15,
modifyPrice: 76000
);๊ธํ๋ฌผ ๊ฑฐ๋๋ ์ง์ํ๋์?
๋ค, ๊ธํ๋ฌผ ๊ฑฐ๋๋ฅผ ์๋ฒฝํ๊ฒ ์ง์ํฉ๋๋ค:
/* ๊ธํ๋ฌผ ๋งค์ */
await client.Order.GoldSpotPlaceOrderAsync(
orderType: KiwoomOrderType.Buy,
stockCode: KiwoomGoldSpotStockCode.MiniGold_100g,
orderQuantity: 1,
transactionType: KiwoomOrderGoldSpotTransactionType.Normal
);
/* ๊ธํ๋ฌผ ์๊ณ ์กฐํ */
await client.Account.GetGoldEvaluationBalancesAsync();"์ ๊ทผํ ํฐ ๋ฐ๊ธ์ ์คํจํ์ต๋๋ค" ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
๋ค์ ์ฌํญ์ ํ์ธํ์ธ์:
• ์ฑ ํค์ ์ํฌ๋ฆฟ ํค๊ฐ ์ฌ๋ฐ๋ฅธ์ง ํ์ธ
• ๋ชจ์ํฌ์/์ค๊ฑฐ๋์ ๋ง๋ ํค๋ฅผ ์ฌ์ฉ ์ค์ธ์ง ํ์ธ
• ํค์์ฆ๊ถ์์ API ์น์ธ์ด ์๋ฃ๋์๋์ง ํ์ธ
• ์ฑ ํค์ ๊ณต๋ฐฑ์ด ํฌํจ๋์ง ์์๋์ง ํ์ธ
API ํธ์ถ ์ "์กฐํ๊ฐ๋ฅํ ๊ฑด์๋ฅผ ์ด๊ณผํ์์ต๋๋ค" ์๋ฌ๊ฐ ๋ฐ์ํฉ๋๋ค.
ํค์ REST API์ ํธ์ถ ํ์ ์ ํ์ ์ด๊ณผํ ๊ฒฝ์ฐ์ ๋๋ค. ๋ค์ ๋ฐฉ๋ฒ์ผ๋ก ํด๊ฒฐํ ์ ์์ต๋๋ค:
• API ํธ์ถ ์ฌ์ด์ ์ ์ ํ ์ง์ฐ์ ์ถ๊ฐํ์ธ์
• PagingDelay ์์ฑ์ ์ฌ์ฉํ์ฌ ํ์ด์ง๋ค์ด์
๊ฐ ์ง์ฐ์ ์ค์ ํ์ธ์
• ๋ถํ์ํ API ํธ์ถ์ ์ค์ด์ธ์
์๋ต ๋ฐ์ดํฐ๊ฐ null๋ก ๋ฐํ๋ฉ๋๋ค.
๋ค์์ ํ์ธํ์ธ์:
• IsSuccess๊ฐ true์ธ์ง ํ์ธ
• ์กฐํ ์กฐ๊ฑด(๋ ์ง, ์ข
๋ชฉ ์ฝ๋ ๋ฑ)์ด ์ฌ๋ฐ๋ฅธ์ง ํ์ธ
• ํด๋น ๋ ์ง์ ๊ฑฐ๋ ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ๋์ง ํ์ธ (ํด์ผ, ์ฅ์ธ ์๊ฐ ๋ฑ)
• ๋ชจ์ํฌ์ ๋ชจ๋์์ ์ง์๋๋ API์ธ์ง ํ์ธ
WebSocket ์ด๋ฒคํธ๊ฐ ์์ ๋์ง ์์ต๋๋ค.
๋ค์์ ํ์ธํ์ธ์:
• SubscribeAsync๊ฐ ์ ์์ ์ผ๋ก ํธ์ถ๋์๋์ง ํ์ธ
• ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ SubscribeAsync ํธ์ถ ์ด์ ์ ๋ฑ๋ก๋์๋์ง ํ์ธ
• ์ข
๋ชฉ ์ฝ๋๊ฐ ์ฌ๋ฐ๋ฅธ์ง ํ์ธ
• ์ฅ ์๊ฐ ์ค์ธ์ง ํ์ธ (์ผ๋ถ ์๋น์ค๋ ์ฅ ์๊ฐ์๋ง ๋์)
• REST API ํด๋ผ์ด์ธํธ์ ๋์ผํ ๋ชจ์ํฌ์/์ค๊ฑฐ๋ ๋ชจ๋์ธ์ง ํ์ธ