initial commit
This commit is contained in:
499
한국투자증권(API)/legacy/Sample02/CSharp/Common.cs
Normal file
499
한국투자증권(API)/legacy/Sample02/CSharp/Common.cs
Normal file
@@ -0,0 +1,499 @@
|
||||
using System.Data;
|
||||
using System.Text;
|
||||
using YamlDotNet.Serialization;
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
|
||||
|
||||
|
||||
namespace KIS_Common {
|
||||
class Common
|
||||
{
|
||||
private static string configRoot = @"d:\KIS\config\";
|
||||
private static string tokenTmp = configRoot + "KIS" + DateTime.Now.ToString("yyyyMMdd");
|
||||
private static Dictionary<string, string> _cfg;
|
||||
public static (string my_app, string my_sec , string my_acct, string my_prod, string my_token, string my_url) _TRENV;
|
||||
private static DateTime _lastAuthTime;
|
||||
private static bool _DEBUG = false;
|
||||
public static bool _isPaper = false;
|
||||
private static Dictionary<string, string> _baseHeaders;
|
||||
private static string _mode = "prod";
|
||||
public static int _rescode;
|
||||
public static HttpResponseMessage _resp;
|
||||
public static Dictionary<string, string> _header;
|
||||
public static Dictionary<string, object> _body;
|
||||
public static string _errCode;
|
||||
public static string _errMessage;
|
||||
|
||||
public static async Task doAuth(String mode)
|
||||
{
|
||||
if (!File.Exists(tokenTmp)){
|
||||
File.Create(tokenTmp).Close();
|
||||
}
|
||||
using (var reader = new StreamReader(configRoot + "kis_devlp.yaml", Encoding.UTF8)){
|
||||
var deserializer = new Deserializer();
|
||||
_cfg = deserializer.Deserialize<Dictionary<string, string>>(reader);
|
||||
}
|
||||
_baseHeaders = new Dictionary<string, string>{
|
||||
{ "Content-Type", "application/json" },
|
||||
{ "Accept", "text/plain" },
|
||||
{ "charset", "UTF-8" },
|
||||
{ "User-Agent", _cfg["my_agent"] }
|
||||
};
|
||||
|
||||
if(mode.Equals("V")) {
|
||||
_DEBUG = true;
|
||||
_mode = "vps";
|
||||
await Auth(_mode, _cfg["my_prod"]);
|
||||
}
|
||||
else if(mode.Equals("D")) {
|
||||
_DEBUG = true;
|
||||
_mode = "dev";
|
||||
await Auth(_mode, _cfg["my_prod"]);
|
||||
}
|
||||
else {
|
||||
_DEBUG = false;
|
||||
_mode = "prod";
|
||||
await Auth(_mode, _cfg["my_prod"]);
|
||||
}
|
||||
}
|
||||
|
||||
private static void SaveToken(string myToken, string myExpired, string mode)
|
||||
{
|
||||
|
||||
Console.WriteLine("===== Exp " + myExpired);
|
||||
|
||||
using (var writer = new StreamWriter(tokenTmp, false, Encoding.UTF8))
|
||||
{
|
||||
writer.WriteLine($"token; {myToken}");
|
||||
writer.WriteLine($"valid-date; {myExpired}");
|
||||
writer.Write($"mode; {mode}");
|
||||
}
|
||||
}
|
||||
|
||||
private static string? ReadToken()
|
||||
{
|
||||
try
|
||||
{
|
||||
var lines = File.ReadAllLines(tokenTmp, Encoding.UTF8);
|
||||
var tokenData = lines.Select(line => line.Split(';')).ToDictionary(parts => parts[0].Trim(), parts => parts[1].Trim());
|
||||
|
||||
string expDt = DateTime.Parse(tokenData["valid-date"]).ToString("yyyy-MM-dd HH:mm:ss");
|
||||
string nowDt = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
|
||||
string getMode = tokenData["mode"];
|
||||
Console.WriteLine("Mode : " + getMode);
|
||||
|
||||
if (string.Compare(expDt, nowDt) > 0 && _mode.Equals(getMode)){
|
||||
return tokenData["token"];
|
||||
}
|
||||
else{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private static Dictionary<string, string> GetBaseHeader()
|
||||
{
|
||||
DateTime n2 = DateTime.Now;
|
||||
if ((n2 - _lastAuthTime).TotalSeconds >= 86400){
|
||||
ReAuth(_mode, _cfg["my_prod"]);
|
||||
}
|
||||
return new Dictionary<string, string>(_baseHeaders);
|
||||
}
|
||||
|
||||
private static (string my_app, string my_sec , string my_acct, string my_prod, string my_token, string my_url) GetTRENV()
|
||||
{
|
||||
return _TRENV;
|
||||
}
|
||||
|
||||
public static void SetTRENV(Dictionary<string, string> cfg)
|
||||
{
|
||||
_TRENV = (cfg["my_app"],cfg["my_sec"],cfg["my_acct"],cfg["my_prod"],cfg["my_token"],cfg["my_url"]);
|
||||
}
|
||||
|
||||
private static void ChangeTREnv(string tokenKey, string svr, string product)
|
||||
{
|
||||
var cfg = new Dictionary<string, string>();
|
||||
if (svr == "prod")
|
||||
{
|
||||
cfg["my_app"] = _cfg["my_app"];
|
||||
cfg["my_sec"] = _cfg["my_sec"];
|
||||
cfg["my_acct"] = _cfg["my_acct"];
|
||||
_isPaper = false;
|
||||
}
|
||||
else if (svr == "vps")
|
||||
{
|
||||
cfg["my_app"] = _cfg["paper_app"];
|
||||
cfg["my_sec"] = _cfg["paper_sec"];
|
||||
cfg["my_acct"] = _cfg["paper_acct"];
|
||||
_isPaper = true;
|
||||
}
|
||||
else {
|
||||
cfg["my_app"] = _cfg["dev_app"];
|
||||
cfg["my_sec"] = _cfg["dev_sec"];
|
||||
cfg["my_acct"] = _cfg["dev_acct"];
|
||||
_isPaper = false;
|
||||
}
|
||||
|
||||
cfg["my_prod"] = product;
|
||||
cfg["my_token"] = tokenKey;
|
||||
cfg["my_url"] = _cfg[svr];
|
||||
|
||||
SetTRENV(cfg);
|
||||
}
|
||||
|
||||
private static async Task<string?>Auth(string svr, string product)
|
||||
{
|
||||
var p = new Dictionary<string, string>{
|
||||
{ "grant_type", "client_credentials" }
|
||||
};
|
||||
|
||||
string ak1 = svr == "prod" ? "my_app" : (svr == "vps" ? "paper_app" : "dev_app");
|
||||
string ak2 = svr == "prod" ? "my_sec" : (svr == "vps" ? "paper_sec" : "dev_sec");
|
||||
|
||||
p["appkey"] = _cfg[ak1];
|
||||
p["appsecret"] = _cfg[ak2];
|
||||
|
||||
string savedToken = ReadToken();
|
||||
if (savedToken == null){
|
||||
var url = $"{_cfg[svr]}/oauth2/tokenP";
|
||||
var client = new HttpClient();
|
||||
var request = new HttpRequestMessage(HttpMethod.Post, url);
|
||||
request.Content = new StringContent(JsonConvert.SerializeObject(p), Encoding.UTF8, "application/json");
|
||||
var response = client.SendAsync(request).Result;
|
||||
if (response.IsSuccessStatusCode){
|
||||
var jsonData = JsonConvert.DeserializeObject<Dictionary<string, string>>(await response.Content.ReadAsStringAsync());
|
||||
string myToken = jsonData["access_token"];
|
||||
string myExpired = jsonData["access_token_token_expired"];
|
||||
SaveToken(myToken, myExpired, svr);
|
||||
savedToken = ReadToken();
|
||||
ChangeTREnv($"Bearer {savedToken}", svr, product);
|
||||
}
|
||||
else{
|
||||
Console.WriteLine("Get Authentication token fail!\nYou have to restart your app!!!");
|
||||
return null;
|
||||
}
|
||||
}
|
||||
else{
|
||||
ChangeTREnv($"Bearer {savedToken}", svr, product);
|
||||
}
|
||||
|
||||
_baseHeaders["authorization"] = _TRENV.Item5;
|
||||
_baseHeaders["appkey"] = _TRENV.Item1;
|
||||
_baseHeaders["appsecret"] = _TRENV.Item2;
|
||||
|
||||
_lastAuthTime = DateTime.Now;
|
||||
|
||||
if (_DEBUG)
|
||||
{
|
||||
Console.WriteLine($"[{_lastAuthTime}] => get AUTH Key completed!");
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private static async void ReAuth(string svr, string product)
|
||||
{
|
||||
await Auth(svr, product);
|
||||
}
|
||||
|
||||
private static Dictionary<string, string> GetEnv()
|
||||
{
|
||||
return _cfg;
|
||||
}
|
||||
|
||||
public static (string my_app, string my_sec , string my_acct, string my_prod, string my_token, string my_url) GetTREnv()
|
||||
{
|
||||
return _TRENV;
|
||||
}
|
||||
|
||||
private static async Task SetOrderHashKey(Dictionary<string, string> h, Dictionary<string, string> p)
|
||||
{
|
||||
string url = $"{GetTREnv().my_url}/uapi/hashkey";
|
||||
|
||||
using (var client = new HttpClient())
|
||||
{
|
||||
var content = new StringContent(JsonConvert.SerializeObject(p), Encoding.UTF8, "application/json");
|
||||
var response = await client.PostAsync(url, content);
|
||||
if (response.IsSuccessStatusCode)
|
||||
{
|
||||
var jsonData = JsonConvert.DeserializeObject<Dictionary<string, string>>(await response.Content.ReadAsStringAsync());
|
||||
h["hashkey"] = jsonData["HASH"];
|
||||
}
|
||||
else
|
||||
{
|
||||
Console.WriteLine("Error: " + response.StatusCode);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static bool IsPaperTrading()
|
||||
{
|
||||
return _isPaper;
|
||||
}
|
||||
|
||||
// 응답값 사용을 위한 변수 세팅 메서드
|
||||
public static void SetAPIRespVal(HttpResponseMessage resp)
|
||||
{
|
||||
_rescode = (int)resp.StatusCode;
|
||||
_resp = resp;
|
||||
_header = _SetHeader();
|
||||
_body = _SetBody();
|
||||
_errCode = (string)_body["msg_cd"];
|
||||
_errMessage = (string)_body["msg1"];
|
||||
}
|
||||
|
||||
// 응답코드 리턴값
|
||||
public int GetResCode()
|
||||
{
|
||||
return _rescode;
|
||||
}
|
||||
|
||||
// 응답메시지 리턴값
|
||||
public HttpResponseMessage GetResponse()
|
||||
{
|
||||
return _resp;
|
||||
}
|
||||
|
||||
// 트랜잭션 에러코드 리턴값
|
||||
public string GetErrorCode()
|
||||
{
|
||||
return _errCode;
|
||||
}
|
||||
|
||||
// 트랜잭션 에러메시지 리턴값
|
||||
public string GetErrorMessage()
|
||||
{
|
||||
return _errMessage;
|
||||
}
|
||||
|
||||
// 헤더 지정
|
||||
private static Dictionary<string, string> _SetHeader()
|
||||
{
|
||||
return _resp.Headers.ToDictionary(x => x.Key.ToLower(), x => string.Join(", ", x.Value));
|
||||
}
|
||||
|
||||
// 헤더 수신
|
||||
public Dictionary<string, string> GetHeader()
|
||||
{
|
||||
return _header;
|
||||
}
|
||||
|
||||
// 바디 지정
|
||||
private static Dictionary<string, object> _SetBody()
|
||||
{
|
||||
return JsonConvert.DeserializeObject<Dictionary<string, object>>(_resp.Content.ReadAsStringAsync().Result);
|
||||
|
||||
}
|
||||
|
||||
// 바디 수신
|
||||
public Dictionary<string, object> GetBody()
|
||||
{
|
||||
return _body;
|
||||
}
|
||||
|
||||
// 트랜잭션 정상여부 확인 부울 값
|
||||
public bool IsOK()
|
||||
{
|
||||
return (string) _body["rt_cd"] == "0";
|
||||
}
|
||||
|
||||
// 디버그 출력용
|
||||
public static void PrintAll()
|
||||
{
|
||||
Common ka = new Common();
|
||||
Console.WriteLine("<Header>");
|
||||
foreach (var x in ka.GetHeader().Keys)
|
||||
{
|
||||
Console.WriteLine($"\t-{x}: {ka.GetHeader()[x]}");
|
||||
}
|
||||
Console.WriteLine("<Body>");
|
||||
foreach (var x in ka.GetBody().Keys)
|
||||
{
|
||||
Console.WriteLine($"\t-{x}: {ka.GetBody()[x]}");
|
||||
}
|
||||
}
|
||||
|
||||
// 에러 메시지 출력용
|
||||
public void PrintError(string url)
|
||||
{
|
||||
Console.WriteLine("-------------------------------\nError in response: " + GetResCode() + " url=" + url);
|
||||
Console.WriteLine("rt_cd : " + GetBody()["rt_cd"] + " / msg_cd : " + GetErrorCode() + " / msg1 : " + GetErrorMessage());
|
||||
Console.WriteLine("-------------------------------");
|
||||
}
|
||||
|
||||
// 특정 JToken 결과값을 DataTable로 변환하는 메서드
|
||||
public static DataTable ConvertToDataTable(JToken? data){
|
||||
|
||||
DataTable dataTable = new DataTable();
|
||||
JArray jArray = new JArray();
|
||||
if (data is null) {
|
||||
Console.WriteLine("조회 값 없음");
|
||||
return null;
|
||||
}
|
||||
else {
|
||||
Console.WriteLine("Return Type : " + data.Type.ToString());
|
||||
}
|
||||
if (data.Type.ToString().Equals("Array")) {
|
||||
jArray = (JArray) data;
|
||||
}
|
||||
else {
|
||||
jArray.Add(data);
|
||||
}
|
||||
|
||||
if (jArray.Count > 0)
|
||||
{
|
||||
// Add columns to DataTable
|
||||
foreach (var firstRow in jArray.Children<JObject>())
|
||||
{
|
||||
foreach (var property in firstRow.Properties())
|
||||
{
|
||||
if (!dataTable.Columns.Contains(property.Name))
|
||||
{
|
||||
dataTable.Columns.Add(property.Name);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
// Add rows to DataTable
|
||||
foreach (var row in jArray.Children<JObject>())
|
||||
{
|
||||
DataRow dataRow = dataTable.NewRow();
|
||||
foreach (var property in row.Properties())
|
||||
{
|
||||
dataRow[property.Name] = property.Value.ToString();
|
||||
}
|
||||
dataTable.Rows.Add(dataRow);
|
||||
}
|
||||
}
|
||||
|
||||
return dataTable;
|
||||
}
|
||||
|
||||
// JObject 결과값을 DataTable로 변환하는 메서드
|
||||
public static DataTable ConvertToDataTable(JObject data)
|
||||
{
|
||||
|
||||
var dataTable = new DataTable();
|
||||
Console.WriteLine("Return Type : " + data.Type.ToString());
|
||||
|
||||
foreach (var property in data.Properties())
|
||||
{
|
||||
dataTable.Columns.Add(property.Name);
|
||||
}
|
||||
|
||||
var row = dataTable.NewRow();
|
||||
foreach (var property in data.Properties())
|
||||
{
|
||||
row[property.Name] = property.Value;
|
||||
}
|
||||
|
||||
dataTable.Rows.Add(row);
|
||||
|
||||
return dataTable;
|
||||
}
|
||||
|
||||
|
||||
// DataTable 출력용
|
||||
public static void PrintDataTable(DataTable dataTable)
|
||||
{
|
||||
string line = "";
|
||||
foreach (DataColumn item in dataTable.Columns)
|
||||
{
|
||||
line += item.ColumnName +" ";
|
||||
}
|
||||
line += "\n";
|
||||
foreach (DataRow row in dataTable.Rows)
|
||||
{
|
||||
for (int i = 0; i < dataTable.Columns.Count; i++)
|
||||
{
|
||||
line += row[i].ToString() + " ";
|
||||
}
|
||||
line += "\n";
|
||||
}
|
||||
Console.WriteLine("==============================================================================");
|
||||
Console.WriteLine(line) ;
|
||||
}
|
||||
|
||||
// API 호출 및 응답값 회신
|
||||
public static Task<HttpResponseMessage> UrlFetch(Dictionary<string, object> paramsDict, string apiUrl = "", string ptrId = "", string trCont = "", Dictionary<string, string>? appendHeaders = null, bool postFlag = true , bool hashFlag = false)
|
||||
{
|
||||
// 요청 URL
|
||||
string url = $"{GetTREnv().my_url}{apiUrl}";
|
||||
|
||||
// HTTPClient 사용, RestSharp 사용 시 별도 코드 변환 필요
|
||||
var client = new HttpClient();
|
||||
HttpResponseMessage resp = new HttpResponseMessage();
|
||||
|
||||
// 최대 타임아웃 설정 → 기본 100ms, 네트워크 상황에 따라 TimeSpan으로 타임아웃 시간 설정
|
||||
client.Timeout = TimeSpan.FromMinutes(10);
|
||||
|
||||
// 요청 헤더 설정
|
||||
var headers = GetBaseHeader();
|
||||
string trId = ptrId;
|
||||
if (IsPaperTrading()){ //모의투자인 경우, 트랜잭션 ID 앞에 'V'가 붙음
|
||||
if (ptrId[0] == 'T' || ptrId[0] == 'J' || ptrId[0] == 'C'){
|
||||
trId = "V" + ptrId.Substring(1);
|
||||
}
|
||||
}
|
||||
headers["tr_id"] = trId;
|
||||
headers["custtype"] = "P";
|
||||
headers["tr_cont"] = trCont;
|
||||
if (appendHeaders != null && appendHeaders.Count > 0)
|
||||
{
|
||||
foreach (var x in appendHeaders.Keys)
|
||||
{
|
||||
headers[x] = appendHeaders[x];
|
||||
}
|
||||
}
|
||||
// 클라이언트 요청 헤더 값에 최종 설정
|
||||
foreach (var x in headers) {
|
||||
client.DefaultRequestHeaders.TryAddWithoutValidation(x.Key , x.Value);
|
||||
}
|
||||
|
||||
// 디버그 기능 사용 시, 출력용
|
||||
|
||||
if (_DEBUG)
|
||||
{
|
||||
Console.WriteLine("< Sending Info >");
|
||||
Console.WriteLine($"URL: {url}, TR: {trId}");
|
||||
Console.WriteLine($"<header>\n{string.Join(", ", headers.Select(h => $"{h.Key}: {h.Value}"))}");
|
||||
Console.WriteLine($"<body>\n{string.Join(", ", paramsDict.Select(p => $"{p.Key}: {p.Value}"))}");
|
||||
}
|
||||
|
||||
|
||||
// POST 방식, GET 방식에 따른 분기
|
||||
if (postFlag){
|
||||
resp = client.PostAsync(url, new StringContent(JsonConvert.SerializeObject(paramsDict), Encoding.UTF8, "application/json")).ConfigureAwait(false).GetAwaiter().GetResult();
|
||||
}
|
||||
else{
|
||||
resp = client.GetAsync(url + "?" + string.Join("&", paramsDict.Select(p => $"{p.Key}={p.Value}"))).ConfigureAwait(false).GetAwaiter().GetResult();
|
||||
}
|
||||
|
||||
// 응답코드가 성공으로 나온 경우 결과 값을 최종 설정함. 오류인 경우에는 오류코드와 메시지 출력
|
||||
if (resp.IsSuccessStatusCode){
|
||||
SetAPIRespVal(resp);
|
||||
if (_DEBUG) { PrintAll(); }
|
||||
}
|
||||
else{
|
||||
Console.WriteLine("Error Code : " + (int)resp.StatusCode + " | " + resp.Content);
|
||||
}
|
||||
|
||||
return Task.FromResult(resp);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
1585
한국투자증권(API)/legacy/Sample02/CSharp/KIS_OverseaStk.cs
Normal file
1585
한국투자증권(API)/legacy/Sample02/CSharp/KIS_OverseaStk.cs
Normal file
File diff suppressed because it is too large
Load Diff
166
한국투자증권(API)/legacy/Sample02/CSharp/Program.cs
Normal file
166
한국투자증권(API)/legacy/Sample02/CSharp/Program.cs
Normal file
@@ -0,0 +1,166 @@
|
||||
using System.Data;
|
||||
using KIS_Common;
|
||||
using KIS_Domestic;
|
||||
using KIS_Oversea;
|
||||
|
||||
|
||||
public class Program {
|
||||
|
||||
public static void Main(String [] args) {
|
||||
|
||||
Program p = new Program();
|
||||
p.CallForeignStock();
|
||||
|
||||
}
|
||||
|
||||
public async void CallForeignStock() {
|
||||
|
||||
// 파이썬에서 Dataframe 으로 처리하던 방식을 DataTable, DataRow 사용방식으로 변경
|
||||
DataTable rt_data = new DataTable();
|
||||
|
||||
// [공통] 토큰 발급 및 갱신 처리
|
||||
// 별도 경로 지정한 yaml 파일 값을 읽어와서 처리
|
||||
// 사용 인수 : P (실전투자) 또는 V (모의투자)
|
||||
await Common.doAuth("D");
|
||||
|
||||
// [해외주식] 주문/계좌 ===================================================================================================================================
|
||||
// [해외주식] 주문/계좌 > 주문 (매수매도구분 buy,sell + 종목코드6자리 + 주문수량 + 주문단가)
|
||||
// 지정가 기준이며 시장가 옵션(주문구분코드)을 사용하는 경우 KIS_OvrseaStk.cs GetOverseasOrder 수정요망!
|
||||
// rt_data = KIS_OverseaStk.get_overseas_order(ord_dv="buy", excg_cd="NASD", itm_no="TSLA", qty=1, unpr=170)
|
||||
// rt_data = KIS_OverseaStk.get_overseas_order(ord_dv="buy", excg_cd="NASD", itm_no="AAPL", qty=1, unpr=216.75)
|
||||
rt_data = KIS_OverseaStk.GetOverseasOrder ("buy", "AMEX", "SGOV", "00", 1, 4335);
|
||||
if (rt_data is not null && rt_data.Rows.Count > 0 ) Common.PrintDataTable(rt_data); // # 주문접수조직번호+주문접수번호+주문시각
|
||||
|
||||
// [해외주식] 주문/계좌 > 정정취소주문 (해외거래소코드excg_cd + 종목코드itm_no + 주문번호orgn_odno + 정정취소구분rvse_cncl_dvsn_cd + 수량qty + 주문단가unpr)
|
||||
// 지정가 기준이며 시장가 옵션(주문구분코드)을 사용하는 경우 KIS_OvrseaStk.cs GetOverseasOrder 수정요망!
|
||||
rt_data = KIS_OverseaStk.GetOverseasOrderRvseCncl("NASD", "TSLA", "0030089601", "02", 1, 0);
|
||||
if (rt_data is not null && rt_data.Rows.Count > 0 ) Common.PrintDataTable(rt_data); // # 주문접수조직번호+주문접수번호+주문시각
|
||||
|
||||
// [해외주식] 주문/계좌 > 해외주식 미체결내역 (해외거래소코드)
|
||||
// 해외거래소코드 NASD:나스닥,NYSE:뉴욕,AMEX:아멕스,SEHK:홍콩,SHAA:중국상해,SZAA:중국심천,TKSE:일본,HASE:베트남하노이,VNSE:호치민
|
||||
rt_data = KIS_OverseaStk.GetOverseasInquireNccs("NYSE");
|
||||
if (rt_data is not null && rt_data.Rows.Count > 0 ) Common.PrintDataTable(rt_data);
|
||||
|
||||
// [해외주식] 주문/계좌 > 해외주식 미체결전량취소주문 (해외거래소코드excg_cd + 종목코드itm_no)
|
||||
// 해외거래소코드 NASD:나스닥,NYSE:뉴욕,AMEX:아멕스,SEHK:홍콩,SHAA:중국상해,SZAA:중국심천,TKSE:일본,HASE:베트남하노이,VNSE:호치민
|
||||
rt_data = KIS_OverseaStk.GetOverseasOrderAllCncl("NASD", "");
|
||||
if (rt_data is not null && rt_data.Rows.Count > 0 ) Common.PrintDataTable(rt_data);
|
||||
|
||||
// [해외주식] 주문/계좌 > 해외주식 잔고 현황
|
||||
// 해외거래소코드 NASD:나스닥,NYSE:뉴욕,AMEX:아멕스,SEHK:홍콩,SHAA:중국상해,SZAA:중국심천,TKSE:일본,HASE:베트남하노이,VNSE:호치민
|
||||
// 거래통화코드 - USD : 미국달러,HKD : 홍콩달러,CNY : 중국위안화,JPY : 일본엔화,VND : 베트남동
|
||||
rt_data = KIS_OverseaStk.GetOverseasInquireBalance("NASD", "");
|
||||
if (rt_data is not null && rt_data.Rows.Count > 0 ) Common.PrintDataTable(rt_data);
|
||||
|
||||
// [해외주식] 주문/계좌 > 해외주식 잔고 내역
|
||||
// 해외거래소코드 NASD:나스닥,NYSE:뉴욕,AMEX:아멕스,SEHK:홍콩,SHAA:중국상해,SZAA:중국심천,TKSE:일본,HASE:베트남하노이,VNSE:호치민
|
||||
// 거래통화코드 - USD : 미국달러,HKD : 홍콩달러,CNY : 중국위안화,JPY : 일본엔화,VND : 베트남동
|
||||
rt_data = KIS_OverseaStk.GetOverseasInquireBalanceLst("NASD", "");
|
||||
if (rt_data is not null && rt_data.Rows.Count > 0 ) Common.PrintDataTable(rt_data);
|
||||
|
||||
// [해외주식] 주문/계좌 > 해외주식 주문체결내역
|
||||
// 해외거래소코드 NASD:미국시장 전체(나스닥,뉴욕,아멕스),NYSE:뉴욕,AMEX:아멕스,SEHK:홍콩,SHAA:중국상해,SZAA:중국심천,TKSE:일본,HASE:베트남하노이,VNSE:호치민
|
||||
rt_data = KIS_OverseaStk.GetOverseasInquireCcnl("", "", "");
|
||||
if (rt_data is not null && rt_data.Rows.Count > 0 ) Common.PrintDataTable(rt_data);
|
||||
|
||||
// [해외주식] 주문/계좌 > 해외주식 체결기준현재잔고
|
||||
// dv : 01 보유종목, 02 외화잔고, 03 체결기준현재잔고
|
||||
// dvsn : 01 원화, 02 외화
|
||||
// natn 국가코드 : 000 전체,840 미국,344 홍콩,156 중국,392 일본,704 베트남
|
||||
// mkt 거래시장코드 [Request body NATN_CD 000 설정]
|
||||
// 00 : 전체 , (NATN_CD 840 인경우) 00:전체,01:나스닥(NASD),02:뉴욕거래소(NYSE),03:미국(PINK SHEETS),04:미국(OTCBB),05:아멕스(AMEX) (다른시장 API문서 참조)
|
||||
rt_data = KIS_OverseaStk.GetOverseasInquirePresentBalance("02", "01", "000", "00", "00");
|
||||
if (rt_data is not null && rt_data.Rows.Count > 0 ) Common.PrintDataTable(rt_data);
|
||||
|
||||
// [해외주식] 주문/계좌 > 미국주간주문 (매수매도구분 buy,sell + 종목번호 + 주문수량 + 주문단가)
|
||||
// 지정가 기준이며 시장가 옵션(주문구분코드)을 사용하는 경우 KIS_OvrseaStk.cs GetOverseasOrder 수정요망
|
||||
// !! 현재 미국주간주문은 일시적으로 중단되어 있으며, 추후 재개는 한국투자증권 홈페이지를 통해 공지 예정입니다.
|
||||
// rt_data = KIS_OverseaStk.GetOverseasDaytimeOrder("buy", "NASD", "TSLA", 1, 251);
|
||||
// rt_data = KIS_OverseaStk.GetOverseasDaytimeOrder("buy", "NASD", "AAPL", 1, 216.75);
|
||||
rt_data = KIS_OverseaStk.GetOverseasDaytimeOrder("buy", "NASD", "NVDA", 1, 123.3);
|
||||
if (rt_data is not null && rt_data.Rows.Count > 0 ) Common.PrintDataTable(rt_data);
|
||||
|
||||
// [해외주식] 주문/계좌 > 미국주간정정취소 (해외거래소코드excg_cd + 종목코드itm_no + 주문번호orgn_odno + 정정취소구분rvse_cncl_dvsn_cd + 수량qty + 주문단가unpr)
|
||||
// 지정가 기준이며 시장가 옵션(주문구분코드)을 사용하는 경우 KIS_OvrseaStk.cs GetOverseasOrder 수정요망!
|
||||
// !! 현재 미국주간주문은 일시적으로 중단되어 있으며, 추후 재개는 한국투자증권 홈페이지를 통해 공지 예정입니다.
|
||||
rt_data = KIS_OverseaStk.GetOverseasDaytimeOrderRvseCncl("NASD", "TSLA", "0030089601", "02", 1, 0);
|
||||
if (rt_data is not null && rt_data.Rows.Count > 0 ) Common.PrintDataTable(rt_data); // 주문접수조직번호+주문접수번호+주문시각
|
||||
|
||||
// [해외주식] 주문/계좌 > 해외주식 기간손익[v1_해외주식-032] (해외거래소코드 + 통화코드 + 종목번호 6자리 + 조회시작일 + 조회종료일)
|
||||
// 해외거래소코드 - 미입력 : 전체, NASD:미국, SEHK:홍콩, SHAA:중국 상해, TKSE:일본, HASE:베트남
|
||||
rt_data = KIS_OverseaStk.GetOverseasInquirePeriodProfit("", "", "", "20240601", "20240709");
|
||||
if (rt_data is not null && rt_data.Rows.Count > 0 ) Common.PrintDataTable(rt_data);
|
||||
|
||||
// [해외주식] 주문/계좌 > 해외주식 기간손익(매매일자종목별 기간손익) (해외거래소코드 + 통화코드 + 종목번호 6자리 + 조회시작일 + 조회종료일)
|
||||
rt_data = KIS_OverseaStk.GetOverseasInquirePeriodProfitOutput1("NASD", "" , "", "20240501", "20240709");
|
||||
if (rt_data is not null && rt_data.Rows.Count > 0 ) Common.PrintDataTable(rt_data);
|
||||
|
||||
// [해외주식] 주문/계좌 > 해외증거금 통화별조회
|
||||
rt_data = KIS_OverseaStk.GetOverseasInquireForeignMargin();
|
||||
if (rt_data is not null && rt_data.Rows.Count > 0 ) Common.PrintDataTable(rt_data);
|
||||
|
||||
// [해외주식] 주문/계좌 > 해외증거금 일별거래내역 (해외거래소코드 + 매도매수구분코드 + 종목번호 6자리 + 조회시작일 + 조회종료일)
|
||||
rt_data = KIS_OverseaStk.GetOverseasInquirePeriodTrans("", "", "", "20240601", "20240709");
|
||||
// [해외주식] 주문/계좌 > 해외증거금 일별거래내역[합계]
|
||||
rt_data = KIS_OverseaStk.GetOverseasInquirePeriodTransOutput2("", "", "", "20240601", "20240709");
|
||||
if (rt_data is not null && rt_data.Rows.Count > 0 ) Common.PrintDataTable(rt_data);
|
||||
|
||||
// [해외주식] 주문/계좌 > 해외주식 결제기준현재잔고
|
||||
// dv : 01 보유종목, 02 외화잔고, 03 결제기준현재잔고
|
||||
// dt : 기준일자(YYYYMMDD)
|
||||
// dvsn : 01 원화, 02 외화
|
||||
// inqr_dvsn : 00(전체), 01(일반), 02(미니스탁)
|
||||
rt_data = KIS_OverseaStk.GetOverseasInquirePaymtStdrBalance("03", "", "01", "00");
|
||||
if (rt_data is not null && rt_data.Rows.Count > 0 ) Common.PrintDataTable(rt_data);
|
||||
|
||||
// [해외주식] 기본시세 ===================================================================================================================================
|
||||
// [해외주식] 기본시세 > 해외주식 현재체결가 (해외거래소코드, 종목번호)
|
||||
rt_data = KIS_OverseaStk.GetOverseasPriceQuotPrice ("NAS", "AAPL");
|
||||
if (rt_data is not null && rt_data.Rows.Count > 0 ) Common.PrintDataTable(rt_data);
|
||||
|
||||
// [해외주식] 기본시세 > 해외주식 기간별시세
|
||||
// ※ 기준일(bymd) 지정일자 이후 100일치 조회, 미입력시 당일자 기본 셋팅
|
||||
rt_data = KIS_OverseaStk.GetOverseasPriceQuotDailyPrice("NAS", "AAPL", "0", "");
|
||||
if (rt_data is not null && rt_data.Rows.Count > 0 ) Common.PrintDataTable(rt_data);
|
||||
|
||||
// [해외주식] 기본시세 > 해외주식 종목/지수/환율기간별시세(일/주/월/년)
|
||||
// ※ 기준일(bymd) 지정일자 이후 100일치 조회, 미입력시 당일자 기본 셋팅
|
||||
rt_data = KIS_OverseaStk.GetOverseasPriceQuotInquireDailyPrice("N", "AAPL" , "", "", "D");
|
||||
rt_data = KIS_OverseaStk.GetOverseasPriceQuotInquireDailyChartPrice ("N", "AAPL" , "20240605", "20240610", "D");
|
||||
if (rt_data is not null && rt_data.Rows.Count > 0 ) Common.PrintDataTable(rt_data);
|
||||
|
||||
// [해외주식] 기본시세 > 해외주식조건검색 div 01 : 검색결과종목수, 02:검색결과종목리스트
|
||||
rt_data = KIS_OverseaStk.GetOverseasPriceQuotInquireSearch ("02", "NAS", "160", "170");
|
||||
if (rt_data is not null && rt_data.Rows.Count > 0 ) Common.PrintDataTable(rt_data);
|
||||
|
||||
// [해외주식] 기본시세 > 해외결제일자조회 (기준일자)
|
||||
rt_data = KIS_OverseaStk.GetOverseasPriceQuotCountriesHoliday("");
|
||||
if (rt_data is not null && rt_data.Rows.Count > 0 ) Common.PrintDataTable(rt_data);
|
||||
|
||||
// [해외주식] 기본시세 > 해외주식 현재가상세 (해외거래소시장코드, 종목코드)
|
||||
rt_data = KIS_OverseaStk.GetOverseasPriceQuotPriceDetail("NAS", "AAPL");
|
||||
if (rt_data is not null && rt_data.Rows.Count > 0 ) Common.PrintDataTable(rt_data);
|
||||
|
||||
// [해외주식] 기본시세 > 해외주식 해외주식분봉조회 (조회구분 div-02:분봉데이터,01:시장별장운영시간, 해외거래소시장코드, 종목코드, 분갭, 전일포함여부)
|
||||
rt_data = KIS_OverseaStk.GetOverseasPriceQuotInquireTimeItemChartPrice("02", "NAS", "AAPL" , "", "0");
|
||||
if (rt_data is not null && rt_data.Rows.Count > 0 ) Common.PrintDataTable(rt_data);
|
||||
|
||||
// [해외주식] 기본시세 > 해외주식 해외지수분봉조회 (조회구분 div-02:분봉데이터,01:지수정보, 조건시장분류코드, 입력종목코드, 시간구분코드, 과거데이터포함여부)
|
||||
rt_data = KIS_OverseaStk.GetOverseasPriceQuotInquireTimeIndexChartPrice("02", "N", "SPX", "0", "Y");
|
||||
if (rt_data is not null && rt_data.Rows.Count > 0 ) Common.PrintDataTable(rt_data);
|
||||
|
||||
// [해외주식] 기본시세 > 해외주식 상품기본정보 (종목번호, 종목유형)
|
||||
// 종목유형 : 512 미국 나스닥/513 미국 뉴욕/529 미국 아멕스/515 일본/501 홍콩/543 홍콩CNY/558 홍콩USD/507 베트남 하노이/508 베트남 호치민/551 중국 상해A/552 중국 심천A
|
||||
rt_data = KIS_OverseaStk.GetOverseasPriceSearchInfo ("AAPL", "512");
|
||||
//print("종목코드("+rt_data.std_pdno+") 종목명(" +rt_data.prdt_eng_name+") 거래시장(" +rt_data.ovrs_excg_cd+":" +rt_data.tr_mket_name+")")
|
||||
if (rt_data is not null && rt_data.Rows.Count > 0 ) Common.PrintDataTable(rt_data);
|
||||
|
||||
// [해외주식] 기본시세 > 해외주식 현재가 10호가 (조회구분 01:기본시세 02:10호가 , 해외거래소코드, 종목번호)
|
||||
rt_data = KIS_OverseaStk.GetOverseasPriceInquireAskingPrice("02", "NAS", "AAPL");
|
||||
if (rt_data is not null && rt_data.Rows.Count > 0 ) Common.PrintDataTable(rt_data);
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
34
한국투자증권(API)/legacy/Sample02/CSharp/kis_devlp_Sample.yaml
Normal file
34
한국투자증권(API)/legacy/Sample02/CSharp/kis_devlp_Sample.yaml
Normal file
@@ -0,0 +1,34 @@
|
||||
#====| 사용자 환경 샘플 아래 참고하시기 바랍니다. |======================
|
||||
#====| 본 샘플은 토큰 발급 후 파일 저장 방식이므로 보안강화를 위해 메모리 방식 등 사용자 원하시는 방식으로 구현하시기 바랍니다. |=====
|
||||
#====| Common.cs에서 환경파일 위치를 사용자가 정하시기 바랍니다. . 2024.05.16 KIS Developers Team |======================
|
||||
|
||||
######################################################################################################
|
||||
|
||||
#홈페이지에서 API서비스 신청시 받은 Appkey, Appsecret 값 설정
|
||||
#실전투자
|
||||
my_app: "실전앱키"
|
||||
my_sec: "실전앱시크릿"
|
||||
|
||||
#모의투자
|
||||
paper_app: "모의앱키"
|
||||
paper_sec: "모의앱시크릿"
|
||||
|
||||
#계좌번호 앞 8자리
|
||||
my_acct: "실전계좌"
|
||||
paper_acct: "모의계좌"
|
||||
|
||||
my_acct_stock: "실전계좌(주식계좌)"
|
||||
my_acct_future: "실전계좌(선물옵션계좌)"
|
||||
#계좌번호 뒤 2자리
|
||||
my_prod: "01" # 01 : 국내/해외주식, 03 : 국내선물/옵션, 08 : 해외선물/옵션
|
||||
#my_prod: "03"
|
||||
|
||||
#실전투자
|
||||
prod: "https://openapi.koreainvestment.com:9443"
|
||||
#모의투자
|
||||
vps: "https://openapivts.koreainvestment.com:29443"
|
||||
|
||||
#디스코드 웹훅 URL
|
||||
DISCORD_WEBHOOK_URL: ""
|
||||
|
||||
my_agent : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"
|
||||
BIN
한국투자증권(API)/legacy/Sample02/Make/POST 인풋예제1.PNG
Normal file
BIN
한국투자증권(API)/legacy/Sample02/Make/POST 인풋예제1.PNG
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 54 KiB |
BIN
한국투자증권(API)/legacy/Sample02/Make/POST 인풋예제2.PNG
Normal file
BIN
한국투자증권(API)/legacy/Sample02/Make/POST 인풋예제2.PNG
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 14 KiB |
Reference in New Issue
Block a user