Open API 샘플코드 (파이썬)
접근토큰 발급
발급받은 Appkey, Appsecret을 통해 접근토큰을 발급받는 예제입니다.
접근토큰 발급 URL은 "https://openapi.db-fi.com:8443/oauth2/token"입니다. 명세는 API가이드에서 확인하실 수 있습니다.
라이브러리 import 및 url, appkey,appsecert 설정
# requests,Json 라이브러리 설치 필요 (pip install requests) import requests import json appkey = '발급받은 appkey' appsecret = '발급받은 appsecret' # URL 및 파라미터 세팅 URL = 'https://openapi.db-fi.com:8443/oauth2/token?appkey={0}&appsecretkey={1}&grant_type=client_credentials&scope=oob'.format(appkey,appsecret)
header 설정
headers = { "content-type":"application/x-www-form-urlencoded", }
토큰발급 정보 세팅 후 URL로 발급요청
res = requests.post(URL, headers=headers,verify=False) rescode = res.status_code # 응답이 정상일 경우 발급받은 엑세스토큰 출력 if rescode == 200: print('response code : ', str(rescode)) print('액세스토큰이 발급되었습니다.') print(json.loads(res.text)) # 응답이 비정상일 경우 에러메세지 출력 else: print("Error Code : " + str(rescode) + " | " + res.text)
응답값
response code : 200 액세스토큰이 발급되었습니다. { "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJ0b2tlbiIsImF1ZCI6IjE4Y2E4ZjNiLWMyYzEtNDE4MC05YjM0LTUwZGY3OTQ0NjA3MyIsIm5iZiI6MTcwODk5NDc5NiwiZ3JhbnRfdHlwZSI6IkNsaWVudCIsImlzcyI6InVub2d3IiwiZXhwIjoxNzA5MDgxMTk2LCJpYXQiOjE3MDg5OTQ3OTYsImp0aSI6IlBTcXpTaTdqOFlZQk94RThQc0p5eUxzeXFMSEZnaHpzaUpLRiJ9.cwMQVW3nQ37IywoVmkjSa_qPM6aoq4FUfWp-cN9z5guf2i22Y_pBmRZbW7F3STuKP7x_dNoGT3sG8HGUhkn5Zw", "scope": "login", "token_type": "Bearer", "expires_in": 86400 }
국내주식 주문 (시장가)
주식종합주문(시장가)를 실행하는 예제입니다. 우선 기본 정보값을 확인합니다.
국내주식주문(CSPAT00600)URL은 "https://openapi.db-fi.com:8443/api/v1/trading/kr-stock/order"입니다. 명세는 API가이드에서 확인하실 수 있습니다.
라이브러리 import 및 url, Access Token 설정
# requests 모듈 설치 필요 (pip install requests) import requests import json BASE_URL = "https://openapi.db-fi.com:8443" PATH = "api/v1/trading/kr-stock/order" URL = f"{BASE_URL}/{PATH}" ACCESS_TOKEN = "발급받은 접근토큰 입력"
header 설정
header = { "content-type":"application/json; charset=utf-8", "authorization": f"Bearer {ACCESS_TOKEN}", "cont_yn":"", "cont_key":"", }
주식주문을 위한 Body 설정 (상세 입력값은 API 가이드 참고 부탁드립니다)
종목코드 (IsuNo) 는 A005930(삼성전자), 주문수량 5주, 시장가 매수주문으로 설정 합니다.
# 시장가 주문 함수 생성 (입력값: 종목코드, 주문수량, 주문가[시장가 주문시 0], 매수/매도구분, 호가유형구분[시장가 주문시 03]) def set_order(IsuNo,OrdQty,OrdPrc,BnsTpCode,OrdprcPtnCode): body = { "In": { "IsuNo": IsuNo, "OrdQty": OrdQty, "OrdPrc": OrdPrc, "BnsTpCode": BnsTpCode, "OrdprcPtnCode": OrdprcPtnCode, "OrdCndiTpCode": "0", "MgntrnCode": "000" } } return json.dumps(body)
모든 입력값을 세팅후 주문 요청.
res = requests.post(URL, headers=header,data=set_order("A005930",5,0,"2","03"),verify=False) rescode = res.status_code if rescode == 200: #print(res.headers) #print(str(rescode)) print(json.dumps(res.json(), ensure_ascii=False, indent=3)) else: print("Error Code : " + str(rescode)) print(json.dumps(res.text, ensure_ascii=False, indent=3))
*응답값
주문결과값(주문번호, 주문시각, 종목코드, 현금주문금액,한글종목명) 및 메세지를 확인 가능합니다.
{ "Out": { "OrdNo": 507, "OrdTime": "084116877", "ShtnIsuNo": "A005930", "SpotOrdQty": 0, "MnyOrdAmt": 475500, "IsuNm": "삼성전자" }, "rsp_cd": "00000", "rsp_msg": "매수 주문이 완료되었습니다." }
국내주식 현재가 조회
국내주식 현재가를 조회하는 예제입니다. 우선 기본 정보값을 확인합니다.
국내주식주문(PRICE)URL은 "https://openapi.db-fi.com:8443/api/v1/quote/kr-stock/inquiry/price"입니다. 명세는 API가이드에서 확인하실 수 있습니다.
라이브러리 import 및 url, Access Token 설정
# requests 모듈 설치 필요 (pip install requests) import requests import json BASE_URL = "https://openapi.db-fi.com:8443" PATH = "api/v1/quote/kr-stock/inquiry/price" URL = f"{BASE_URL}/{PATH}" ACCESS_TOKEN = "발급받은 접근토큰 입력"
header 설정
header = { "content-type":"application/json; charset=utf-8", "authorization": f"Bearer {ACCESS_TOKEN}", "cont_yn":"", "cont_key":"", }
주식현재가조회 위한 Body 설정 (상세 입력값은 API 가이드 참고 부탁드립니다)
시장구분(InputCondMrktDivCode)은 "J"(주식), 종목코드(InputIscd1)는 "A005930" (삼성전자)로설정 합니다.
# 국내주식 현재가 조회 함수 생성 (입력값: 시장구분, 종목코드) def get_price(InputCondMrktDivCode,InputIscd1): body = { "In": { "InputCondMrktDivCode": InputCondMrktDivCode, "InputIscd1": InputIscd1 } } return json.dumps(body)
모든 입력값을 세팅후 조회 요청.
res = requests.post(URL, headers=header,data=get_price("J","A005930"),verify=False) rescode = res.status_code if rescode == 200: #print(res.headers) #print(str(rescode)) print(json.dumps(res.json(), ensure_ascii=False, indent=3)) else: print("Error Code : " + str(rescode)) print(json.dumps(res.text, ensure_ascii=False, indent=3))
*응답값
조회를 요청한 종목의 현재가 정보를 확인 가능합니다.
{ "Out": { "Sdpr": "73200", "Prpr": "73200", "Mxpr": "95100", "Llam": "51300", "Oprc": "73200", "SdprVrssMrktRate": "0.00", "PrprVrssOprcRate": "-100.00", "Hprc": "73200", "SdprVrssHgprRate": "0.00", "Lprc": "73200", "SdprVrssLwprRate": "0.00", "PrprVrssLwprRate": "-100.00" }, "rsp_cd": "00000", "rsp_msg": "정상 처리 되었습니다." }
주식잔고조회
국내주식잔고(CSPAQ03420)조회를 실행하는 예제입니다. 우선 기본 정보값을 확인합니다.
주식잔고조회(CSPAQ03420)URL은 "https://openapi.db-fi.com:8443/api/v1/trading/kr-stock/inquiry/balance"입니다. 명세는 API가이드에서 확인하실 수 있습니다.
라이브러리 import 및 url, Access Token 설정
# requests 모듈 설치 필요 (pip install requests) import requests import json BASE_URL = "https://openapi.db-fi.com:8443" PATH = "api/v1/trading/kr-stock/order" URL = f"{BASE_URL}/{PATH}" ACCESS_TOKEN = "발급받은 접근토큰 입력"
header 설정
header = { "content-type":"application/json; charset=utf-8", "authorization": f"Bearer {ACCESS_TOKEN}", "cont_yn":"", "cont_key":"", }
잔고조회 위한 Body 설정 (입력값이 없는 API 입니다.)
# 잔고조회 Body 함수 설정 (입력값이 없어 빈 body 설정) def set_balance(): body = { "In": { } } return json.dumps(body)
모든 입력값을 세팅후 조회 요청.
res = requests.post(URL, headers=header,data=set_balance(),verify=False) rescode = res.status_code if rescode == 200: #print(res.headers) #print(str(rescode)) print(json.dumps(res.json(), ensure_ascii=False, indent=3)) else: print("Error Code : " + str(rescode)) print(json.dumps(res.text, ensure_ascii=False, indent=3))
*응답값
주식잔고조회 API는 두개의 Out Block 으로 나누어져 있으며, 응답값 상세는 API 명세 참고 부탁드리겠습니다. 본문 데이터 출력 후엔 응답 메세지, 코드를 확인 가능하십니다.
{ "Out": { "TotBuyAmt": 4065841, "TotEvalAmt": 4016152, "TotEvalPnlAmt": -49689, "TotErnrat": "-0.0122", "ThdaySellAmt": 0, "ThdayBuyAmt": 0, "ThdayRlzPnlAmt": 0, "CrdtBnsAmt": 0, "DpsastAmt": 16761272, "Dps2": 12745120 }, "Out1": [ { "IsuNo": "A000270", "IsuNm": "기아", "BalQty": 0, "BalQty0": 0, "AbleQty": 0, "ExecPrc": "83700.00", "EvalAmt": 0, "EvalPnlAmt": 0, "Ernrat": "0.00000000", "MnyAmt": 0, "CrdtAmt": 0, "PchsAmt": 0, "LoanDt": "", "DueDt": "", "EvrTax": 0, "BnsCmsn": 0, "SellCmsn": 0, "ThdayBuyQty": 0, "ThdaySellQty": 0, "BuyRat": "0.000000", "EvalRat": "0.00", "NowPrc": "119200.00", "ThdaySellAmt": 0, "ThdayBuyAmt": 0, "ThdayRlzPnlAmt": 0 }, { "IsuNo": "A000660", "IsuNm": "SK하이닉스", "BalQty": 0, "BalQty0": 0, "AbleQty": 0, "ExecPrc": "46450.00", "EvalAmt": 0, "EvalPnlAmt": 0, "Ernrat": "0.00000000", "MnyAmt": 0, "CrdtAmt": 0, "PchsAmt": 0, "LoanDt": "", "DueDt": "", "EvrTax": 0, "BnsCmsn": 0, "SellCmsn": 0, "ThdayBuyQty": 0, "ThdaySellQty": 0, "BuyRat": "0.000000", "EvalRat": "0.00", "NowPrc": "155900.00", "ThdaySellAmt": 0, "ThdayBuyAmt": 0, "ThdayRlzPnlAmt": 0 }, { "IsuNo": "A000800", "IsuNm": "경남기업", "BalQty": 1, "BalQty0": 1, "AbleQty": 1, "ExecPrc": "11000.00", "EvalAmt": 6640, "EvalPnlAmt": -4360, "Ernrat": "-0.39630000", "MnyAmt": 11000, "CrdtAmt": 0, "PchsAmt": 11000, "LoanDt": "", "DueDt": "", "EvrTax": 11, "BnsCmsn": 0, "SellCmsn": 0, "ThdayBuyQty": 0, "ThdaySellQty": 0, "BuyRat": "0.000000", "EvalRat": "0.00", "NowPrc": "6640.00", "ThdaySellAmt": 0, "ThdayBuyAmt": 0, "ThdayRlzPnlAmt": 0 }, { "IsuNo": "A004450", "IsuNm": "삼화왕관", "BalQty": 4, "BalQty0": 4, "AbleQty": 4, "ExecPrc": "41950.00", "EvalAmt": 130000, "EvalPnlAmt": -37800, "Ernrat": "-0.22520000", "MnyAmt": 167800, "CrdtAmt": 0, "PchsAmt": 167800, "LoanDt": "", "DueDt": "", "EvrTax": 234, "BnsCmsn": 0, "SellCmsn": 0, "ThdayBuyQty": 0, "ThdaySellQty": 0, "BuyRat": "0.000000", "EvalRat": "0.00", "NowPrc": "32500.00", "ThdaySellAmt": 0, "ThdayBuyAmt": 0, "ThdayRlzPnlAmt": 0 }, { "IsuNo": "A005930", "IsuNm": "삼성전자", "BalQty": 5, "BalQty0": 5, "AbleQty": 5, "ExecPrc": "63403.60", "EvalAmt": 362000, "EvalPnlAmt": 44982, "Ernrat": "0.14180000", "MnyAmt": 317018, "CrdtAmt": 0, "PchsAmt": 317018, "LoanDt": "", "DueDt": "", "EvrTax": 651, "BnsCmsn": 0, "SellCmsn": 0, "ThdayBuyQty": 0, "ThdaySellQty": 0, "BuyRat": "0.000000", "EvalRat": "0.00", "NowPrc": "72400.00", "ThdaySellAmt": 0, "ThdayBuyAmt": 0, "ThdayRlzPnlAmt": 0 }, { "IsuNo": "A006120", "IsuNm": "SK디스커버리", "BalQty": 4, "BalQty0": 4, "AbleQty": 4, "ExecPrc": "62767.75", "EvalAmt": 178800, "EvalPnlAmt": -72271, "Ernrat": "-0.28780000", "MnyAmt": 251071, "CrdtAmt": 0, "PchsAmt": 251071, "LoanDt": "", "DueDt": "", "EvrTax": 321, "BnsCmsn": 0, "SellCmsn": 0, "ThdayBuyQty": 0, "ThdaySellQty": 0, "BuyRat": "0.000000", "EvalRat": "0.00", "NowPrc": "44700.00", "ThdaySellAmt": 0, "ThdayBuyAmt": 0, "ThdayRlzPnlAmt": 0 }, { "IsuNo": "A012690", "IsuNm": "모나리자", "BalQty": 39, "BalQty0": 39, "AbleQty": 39, "ExecPrc": "5420.00", "EvalAmt": 111540, "EvalPnlAmt": -99840, "Ernrat": "-0.47230000", "MnyAmt": 211380, "CrdtAmt": 0, "PchsAmt": 211380, "LoanDt": "", "DueDt": "", "EvrTax": 200, "BnsCmsn": 0, "SellCmsn": 0, "ThdayBuyQty": 0, "ThdaySellQty": 0, "BuyRat": "0.000000", "EvalRat": "0.00", "NowPrc": "2860.00", "ThdaySellAmt": 0, "ThdayBuyAmt": 0, "ThdayRlzPnlAmt": 0 }, { "IsuNo": "A018360", "IsuNm": "삼성메디슨", "BalQty": 10, "BalQty0": 10, "AbleQty": 10, "ExecPrc": "8781.80", "EvalAmt": 70000, "EvalPnlAmt": -17818, "Ernrat": "-0.20280000", "MnyAmt": 87818, "CrdtAmt": 0, "PchsAmt": 87818, "LoanDt": "", "DueDt": "", "EvrTax": 126, "BnsCmsn": 0, "SellCmsn": 0, "ThdayBuyQty": 0, "ThdaySellQty": 0, "BuyRat": "0.000000", "EvalRat": "0.00", "NowPrc": "7000.00", "ThdaySellAmt": 0, "ThdayBuyAmt": 0, "ThdayRlzPnlAmt": 0 }, { "IsuNo": "A024070", "IsuNm": "WISCOM", "BalQty": 2, "BalQty0": 2, "AbleQty": 2, "ExecPrc": "4110.00", "EvalAmt": 5130, "EvalPnlAmt": -3090, "Ernrat": "-0.37590000", "MnyAmt": 8220, "CrdtAmt": 0, "PchsAmt": 8220, "LoanDt": "", "DueDt": "", "EvrTax": 9, "BnsCmsn": 0, "SellCmsn": 0, "ThdayBuyQty": 0, "ThdaySellQty": 0, "BuyRat": "0.000000", "EvalRat": "0.00", "NowPrc": "2565.00", "ThdaySellAmt": 0, "ThdayBuyAmt": 0, "ThdayRlzPnlAmt": 0 }, { "IsuNo": "A026970", "IsuNm": "대백저축은행", "BalQty": 1, "BalQty0": 1, "AbleQty": 1, "ExecPrc": "1680.00", "EvalAmt": 2050, "EvalPnlAmt": 370, "Ernrat": "0.22020000", "MnyAmt": 1680, "CrdtAmt": 0, "PchsAmt": 1680, "LoanDt": "", "DueDt": "", "EvrTax": 3, "BnsCmsn": 0, "SellCmsn": 0, "ThdayBuyQty": 0, "ThdaySellQty": 0, "BuyRat": "0.000000", "EvalRat": "0.00", "NowPrc": "2050.00", "ThdaySellAmt": 0, "ThdayBuyAmt": 0, "ThdayRlzPnlAmt": 0 }, { "IsuNo": "A027410", "IsuNm": "BGF", "BalQty": 2, "BalQty0": 2, "AbleQty": 2, "ExecPrc": "4160.00", "EvalAmt": 7860, "EvalPnlAmt": -460, "Ernrat": "-0.05520000", "MnyAmt": 8320, "CrdtAmt": 0, "PchsAmt": 8320, "LoanDt": "", "DueDt": "", "EvrTax": 14, "BnsCmsn": 0, "SellCmsn": 0, "ThdayBuyQty": 0, "ThdaySellQty": 0, "BuyRat": "0.000000", "EvalRat": "0.00", "NowPrc": "3930.00", "ThdaySellAmt": 0, "ThdayBuyAmt": 0, "ThdayRlzPnlAmt": 0 }, { "IsuNo": "A042670", "IsuNm": "HD현대인프라코어", "BalQty": 39, "BalQty0": 39, "AbleQty": 39, "ExecPrc": "7992.21", "EvalAmt": 315900, "EvalPnlAmt": 4204, "Ernrat": "0.01340000", "MnyAmt": 311696, "CrdtAmt": 0, "PchsAmt": 311696, "LoanDt": "", "DueDt": "", "EvrTax": 568, "BnsCmsn": 0, "SellCmsn": 0, "ThdayBuyQty": 0, "ThdaySellQty": 0, "BuyRat": "0.000000", "EvalRat": "0.00", "NowPrc": "8100.00", "ThdaySellAmt": 0, "ThdayBuyAmt": 0, "ThdayRlzPnlAmt": 0 }, { "IsuNo": "A047820", "IsuNm": "초록뱀미디어", "BalQty": 10, "BalQty0": 10, "AbleQty": 10, "ExecPrc": "22038.50", "EvalAmt": 54000, "EvalPnlAmt": -166385, "Ernrat": "-0.75490000", "MnyAmt": 220385, "CrdtAmt": 0, "PchsAmt": 220385, "LoanDt": "", "DueDt": "", "EvrTax": 97, "BnsCmsn": 0, "SellCmsn": 0, "ThdayBuyQty": 0, "ThdaySellQty": 0, "BuyRat": "0.000000", "EvalRat": "0.00", "NowPrc": "5400.00", "ThdaySellAmt": 0, "ThdayBuyAmt": 0, "ThdayRlzPnlAmt": 0 }, { "IsuNo": "A049080", "IsuNm": "기가레인", "BalQty": 1, "BalQty0": 1, "AbleQty": 1, "ExecPrc": "1884.00", "EvalAmt": 1244, "EvalPnlAmt": -640, "Ernrat": "-0.33970000", "MnyAmt": 1884, "CrdtAmt": 0, "PchsAmt": 1884, "LoanDt": "", "DueDt": "", "EvrTax": 2, "BnsCmsn": 0, "SellCmsn": 0, "ThdayBuyQty": 0, "ThdaySellQty": 0, "BuyRat": "0.000000", "EvalRat": "0.00", "NowPrc": "1244.00", "ThdaySellAmt": 0, "ThdayBuyAmt": 0, "ThdayRlzPnlAmt": 0 }, { "IsuNo": "A051500", "IsuNm": "CJ프레시웨이", "BalQty": 3, "BalQty0": 3, "AbleQty": 3, "ExecPrc": "35900.00", "EvalAmt": 74250, "EvalPnlAmt": -33450, "Ernrat": "-0.31050000", "MnyAmt": 107700, "CrdtAmt": 0, "PchsAmt": 107700, "LoanDt": "", "DueDt": "", "EvrTax": 133, "BnsCmsn": 0, "SellCmsn": 0, "ThdayBuyQty": 0, "ThdaySellQty": 0, "BuyRat": "0.000000", "EvalRat": "0.00", "NowPrc": "24750.00", "ThdaySellAmt": 0, "ThdayBuyAmt": 0, "ThdayRlzPnlAmt": 0 }, { "IsuNo": "A055550", "IsuNm": "신한지주", "BalQty": 3, "BalQty0": 3, "AbleQty": 3, "ExecPrc": "34655.67", "EvalAmt": 129150, "EvalPnlAmt": 25183, "Ernrat": "0.24220000", "MnyAmt": 103967, "CrdtAmt": 0, "PchsAmt": 103967, "LoanDt": "", "DueDt": "", "EvrTax": 232, "BnsCmsn": 0, "SellCmsn": 0, "ThdayBuyQty": 0, "ThdaySellQty": 0, "BuyRat": "0.000000", "EvalRat": "0.00", "NowPrc": "43050.00", "ThdaySellAmt": 0, "ThdayBuyAmt": 0, "ThdayRlzPnlAmt": 0 }, { "IsuNo": "A060310", "IsuNm": "3S", "BalQty": 134, "BalQty0": 134, "AbleQty": 134, "ExecPrc": "2472.57", "EvalAmt": 383240, "EvalPnlAmt": 51915, "Ernrat": "0.15660000", "MnyAmt": 331325, "CrdtAmt": 0, "PchsAmt": 331325, "LoanDt": "", "DueDt": "", "EvrTax": 689, "BnsCmsn": 0, "SellCmsn": 0, "ThdayBuyQty": 0, "ThdaySellQty": 0, "BuyRat": "0.000000", "EvalRat": "0.00", "NowPrc": "2860.00", "ThdaySellAmt": 0, "ThdayBuyAmt": 0, "ThdayRlzPnlAmt": 0 }, { "IsuNo": "A069500", "IsuNm": "KODEX 200", "BalQty": 22, "BalQty0": 22, "AbleQty": 22, "ExecPrc": "27842.50", "EvalAmt": 783970, "EvalPnlAmt": 171435, "Ernrat": "0.27980000", "MnyAmt": 612535, "CrdtAmt": 0, "PchsAmt": 612535, "LoanDt": "", "DueDt": "", "EvrTax": 1411, "BnsCmsn": 0, "SellCmsn": 0, "ThdayBuyQty": 0, "ThdaySellQty": 0, "BuyRat": "0.000000", "EvalRat": "0.00", "NowPrc": "35635.00", "ThdaySellAmt": 0, "ThdayBuyAmt": 0, "ThdayRlzPnlAmt": 0 }, { "IsuNo": "A080010", "IsuNm": "이상네트웍스", "BalQty": 13, "BalQty0": 13, "AbleQty": 13, "ExecPrc": "7113.08", "EvalAmt": 70850, "EvalPnlAmt": -21620, "Ernrat": "-0.23380000", "MnyAmt": 92470, "CrdtAmt": 0, "PchsAmt": 92470, "LoanDt": "", "DueDt": "", "EvrTax": 127, "BnsCmsn": 0, "SellCmsn": 0, "ThdayBuyQty": 0, "ThdaySellQty": 0, "BuyRat": "0.000000", "EvalRat": "0.00", "NowPrc": "5450.00", "ThdaySellAmt": 0, "ThdayBuyAmt": 0, "ThdayRlzPnlAmt": 0 }, { "IsuNo": "A091170", "IsuNm": "KODEX 은행", "BalQty": 2, "BalQty0": 2, "AbleQty": 2, "ExecPrc": "7500.00", "EvalAmt": 15660, "EvalPnlAmt": 660, "Ernrat": "0.04400000", "MnyAmt": 15000, "CrdtAmt": 0, "PchsAmt": 15000, "LoanDt": "", "DueDt": "", "EvrTax": 28, "BnsCmsn": 0, "SellCmsn": 0, "ThdayBuyQty": 0, "ThdaySellQty": 0, "BuyRat": "0.000000", "EvalRat": "0.00", "NowPrc": "7830.00", "ThdaySellAmt": 0, "ThdayBuyAmt": 0, "ThdayRlzPnlAmt": 0 }, { "IsuNo": "A095570", "IsuNm": "AJ네트웍스", "BalQty": 30, "BalQty0": 30, "AbleQty": 30, "ExecPrc": "6111.33", "EvalAmt": 143400, "EvalPnlAmt": -39940, "Ernrat": "-0.21780000", "MnyAmt": 183340, "CrdtAmt": 0, "PchsAmt": 183340, "LoanDt": "", "DueDt": "", "EvrTax": 258, "BnsCmsn": 0, "SellCmsn": 0, "ThdayBuyQty": 0, "ThdaySellQty": 0, "BuyRat": "0.000000", "EvalRat": "0.00", "NowPrc": "4780.00", "ThdaySellAmt": 0, "ThdayBuyAmt": 0, "ThdayRlzPnlAmt": 0 }, { "IsuNo": "A102280", "IsuNm": "쌍방울", "BalQty": 1, "BalQty0": 1, "AbleQty": 1, "ExecPrc": "355.00", "EvalAmt": 269, "EvalPnlAmt": -86, "Ernrat": "-0.24220000", "MnyAmt": 355, "CrdtAmt": 0, "PchsAmt": 355, "LoanDt": "", "DueDt": "", "EvrTax": 0, "BnsCmsn": 0, "SellCmsn": 0, "ThdayBuyQty": 0, "ThdaySellQty": 0, "BuyRat": "0.000000", "EvalRat": "0.00", "NowPrc": "269.00", "ThdaySellAmt": 0, "ThdayBuyAmt": 0, "ThdayRlzPnlAmt": 0 }, { "IsuNo": "A105840", "IsuNm": "우진", "BalQty": 1, "BalQty0": 1, "AbleQty": 1, "ExecPrc": "8020.00", "EvalAmt": 8460, "EvalPnlAmt": 440, "Ernrat": "0.05480000", "MnyAmt": 8020, "CrdtAmt": 0, "PchsAmt": 8020, "LoanDt": "", "DueDt": "", "EvrTax": 15, "BnsCmsn": 0, "SellCmsn": 0, "ThdayBuyQty": 0, "ThdaySellQty": 0, "BuyRat": "0.000000", "EvalRat": "0.00", "NowPrc": "8460.00", "ThdaySellAmt": 0, "ThdayBuyAmt": 0, "ThdayRlzPnlAmt": 0 }, { "IsuNo": "A114750", "IsuNm": "와이디생명과학", "BalQty": 2, "BalQty0": 2, "AbleQty": 2, "ExecPrc": "4590.00", "EvalAmt": 6280, "EvalPnlAmt": -2900, "Ernrat": "-0.31590000", "MnyAmt": 9180, "CrdtAmt": 0, "PchsAmt": 9180, "LoanDt": "", "DueDt": "", "EvrTax": 11, "BnsCmsn": 0, "SellCmsn": 0, "ThdayBuyQty": 0, "ThdaySellQty": 0, "BuyRat": "0.000000", "EvalRat": "0.00", "NowPrc": "3140.00", "ThdaySellAmt": 0, "ThdayBuyAmt": 0, "ThdayRlzPnlAmt": 0 }, { "IsuNo": "A122630", "IsuNm": "KODEX 레버리지", "BalQty": 13, "BalQty0": 13, "AbleQty": 13, "ExecPrc": "12174.15", "EvalAmt": 233415, "EvalPnlAmt": 75151, "Ernrat": "0.47480000", "MnyAmt": 158264, "CrdtAmt": 0, "PchsAmt": 158264, "LoanDt": "", "DueDt": "", "EvrTax": 420, "BnsCmsn": 0, "SellCmsn": 0, "ThdayBuyQty": 0, "ThdaySellQty": 0, "BuyRat": "0.000000", "EvalRat": "0.00", "NowPrc": "17955.00", "ThdaySellAmt": 0, "ThdayBuyAmt": 0, "ThdayRlzPnlAmt": 0 }, { "IsuNo": "A215100", "IsuNm": "로보로보", "BalQty": 2, "BalQty0": 2, "AbleQty": 2, "ExecPrc": "7337.50", "EvalAmt": 10080, "EvalPnlAmt": -4595, "Ernrat": "-0.31310000", "MnyAmt": 14675, "CrdtAmt": 0, "PchsAmt": 14675, "LoanDt": "", "DueDt": "", "EvrTax": 18, "BnsCmsn": 0, "SellCmsn": 0, "ThdayBuyQty": 0, "ThdaySellQty": 0, "BuyRat": "0.000000", "EvalRat": "0.00", "NowPrc": "5040.00", "ThdaySellAmt": 0, "ThdayBuyAmt": 0, "ThdayRlzPnlAmt": 0 }, { "IsuNo": "A244880", "IsuNm": "나눔테크", "BalQty": 1, "BalQty0": 1, "AbleQty": 1, "ExecPrc": "2568.00", "EvalAmt": 3065, "EvalPnlAmt": 497, "Ernrat": "0.19350000", "MnyAmt": 2568, "CrdtAmt": 0, "PchsAmt": 2568, "LoanDt": "", "DueDt": "", "EvrTax": 5, "BnsCmsn": 0, "SellCmsn": 0, "ThdayBuyQty": 0, "ThdaySellQty": 0, "BuyRat": "0.000000", "EvalRat": "0.00", "NowPrc": "3065.00", "ThdaySellAmt": 0, "ThdayBuyAmt": 0, "ThdayRlzPnlAmt": 0 }, { "IsuNo": "A267850", "IsuNm": "아시아나IDT", "BalQty": 0, "BalQty0": 0, "AbleQty": 0, "ExecPrc": "16100.00", "EvalAmt": 0, "EvalPnlAmt": 0, "Ernrat": "0.00000000", "MnyAmt": 0, "CrdtAmt": 0, "PchsAmt": 0, "LoanDt": "", "DueDt": "", "EvrTax": 0, "BnsCmsn": 0, "SellCmsn": 0, "ThdayBuyQty": 0, "ThdaySellQty": 0, "BuyRat": "0.000000", "EvalRat": "0.00", "NowPrc": "17870.00", "ThdaySellAmt": 0, "ThdayBuyAmt": 0, "ThdayRlzPnlAmt": 0 }, { "IsuNo": "A269620", "IsuNm": "시스웍", "BalQty": 1, "BalQty0": 1, "AbleQty": 1, "ExecPrc": "2365.00", "EvalAmt": 889, "EvalPnlAmt": -1476, "Ernrat": "-0.62410000", "MnyAmt": 2365, "CrdtAmt": 0, "PchsAmt": 2365, "LoanDt": "", "DueDt": "", "EvrTax": 1, "BnsCmsn": 0, "SellCmsn": 0, "ThdayBuyQty": 0, "ThdaySellQty": 0, "BuyRat": "0.000000", "EvalRat": "0.00", "NowPrc": "889.00", "ThdaySellAmt": 0, "ThdayBuyAmt": 0, "ThdayRlzPnlAmt": 0 }, { "IsuNo": "A321370", "IsuNm": "센서뷰", "BalQty": 1, "BalQty0": 1, "AbleQty": 1, "ExecPrc": "4490.00", "EvalAmt": 4150, "EvalPnlAmt": -340, "Ernrat": "-0.07570000", "MnyAmt": 4490, "CrdtAmt": 0, "PchsAmt": 4490, "LoanDt": "", "DueDt": "", "EvrTax": 7, "BnsCmsn": 0, "SellCmsn": 0, "ThdayBuyQty": 0, "ThdaySellQty": 0, "BuyRat": "0.000000", "EvalRat": "0.00", "NowPrc": "4150.00", "ThdaySellAmt": 0, "ThdayBuyAmt": 0, "ThdayRlzPnlAmt": 0 }, { "IsuNo": "A326030", "IsuNm": "SK바이오팜", "BalQty": 1, "BalQty0": 1, "AbleQty": 1, "ExecPrc": "92500.00", "EvalAmt": 92400, "EvalPnlAmt": -100, "Ernrat": "-0.00100000", "MnyAmt": 92500, "CrdtAmt": 0, "PchsAmt": 92500, "LoanDt": "", "DueDt": "", "EvrTax": 166, "BnsCmsn": 0, "SellCmsn": 0, "ThdayBuyQty": 0, "ThdaySellQty": 0, "BuyRat": "0.000000", "EvalRat": "0.00", "NowPrc": "92400.00", "ThdaySellAmt": 0, "ThdayBuyAmt": 0, "ThdayRlzPnlAmt": 0 }, { "IsuNo": "A344860", "IsuNm": "이노진", "BalQty": 5, "BalQty0": 5, "AbleQty": 5, "ExecPrc": "2725.00", "EvalAmt": 11675, "EvalPnlAmt": -1950, "Ernrat": "-0.14310000", "MnyAmt": 13625, "CrdtAmt": 0, "PchsAmt": 13625, "LoanDt": "", "DueDt": "", "EvrTax": 21, "BnsCmsn": 0, "SellCmsn": 0, "ThdayBuyQty": 0, "ThdaySellQty": 0, "BuyRat": "0.000000", "EvalRat": "0.00", "NowPrc": "2335.00", "ThdaySellAmt": 0, "ThdayBuyAmt": 0, "ThdayRlzPnlAmt": 0 }, { "IsuNo": "A361390", "IsuNm": "제노코", "BalQty": 30, "BalQty0": 30, "AbleQty": 30, "ExecPrc": "18233.33", "EvalAmt": 471000, "EvalPnlAmt": -76000, "Ernrat": "-0.13890000", "MnyAmt": 547000, "CrdtAmt": 0, "PchsAmt": 547000, "LoanDt": "", "DueDt": "", "EvrTax": 847, "BnsCmsn": 0, "SellCmsn": 0, "ThdayBuyQty": 0, "ThdaySellQty": 0, "BuyRat": "0.000000", "EvalRat": "0.00", "NowPrc": "15700.00", "ThdaySellAmt": 0, "ThdayBuyAmt": 0, "ThdayRlzPnlAmt": 0 }, { "IsuNo": "A395400", "IsuNm": "SK리츠", "BalQty": 1, "BalQty0": 1, "AbleQty": 1, "ExecPrc": "5840.00", "EvalAmt": 3890, "EvalPnlAmt": -1950, "Ernrat": "-0.33390000", "MnyAmt": 5840, "CrdtAmt": 0, "PchsAmt": 5840, "LoanDt": "", "DueDt": "", "EvrTax": 7, "BnsCmsn": 0, "SellCmsn": 0, "ThdayBuyQty": 0, "ThdaySellQty": 0, "BuyRat": "0.000000", "EvalRat": "0.00", "NowPrc": "3890.00", "ThdaySellAmt": 0, "ThdayBuyAmt": 0, "ThdayRlzPnlAmt": 0 }, { "IsuNo": "A408920", "IsuNm": "메쎄이상", "BalQty": 2, "BalQty0": 2, "AbleQty": 2, "ExecPrc": "0.00", "EvalAmt": 4770, "EvalPnlAmt": 0, "Ernrat": "0.00000000", "MnyAmt": 0, "CrdtAmt": 0, "PchsAmt": 0, "LoanDt": "", "DueDt": "", "EvrTax": 8, "BnsCmsn": 0, "SellCmsn": 0, "ThdayBuyQty": 0, "ThdaySellQty": 0, "BuyRat": "0.000000", "EvalRat": "0.00", "NowPrc": "2385.00", "ThdaySellAmt": 0, "ThdayBuyAmt": 0, "ThdayRlzPnlAmt": 0 } ], "rsp_cd": "00000", "rsp_msg": "조회가 완료되었습니다." }
실시간 해외주식 체결가 조회
웹소켓을 통해 실시간 해외주식 체결가 (V60)를 조회하는 샘플 코드입니다.
실시간 해외주식 시세를 위해서는 실시간 시세 신청(무료)이 필요합니다. 코드 실행 전 시세신청 부탁드립니다.
실시간 데이터의 통신은 REST API가 아닌 wss (웹소켓)을 사용합니다.
접속포트는 운영-7070, 모의투자-17070 을 사용합니다.
BASE_URL = "wss://openapi.db-fi.com:7070/websocket"
웹소켓을 통한 실시간 데이터 수신을 위해서는
1. 웹소켓 연결
2. 실시간데이터 요청값 전송
두 절차를 거쳐야 합니다.
header
- token : ACCESS_TOKEN
- tr_type : TR타입 (1: 실시간 시세 등록, 2: 실시간 시세 해제, 3: 계좌 등록)
Body
- tr_cd : 실시간 TR 코드
- tr_key : 실시간 TR 코드 값 (계좌등록/해제 TR 요청시 필수입력 X)
요청 Json 예시
{ "header": { "token": f"{ACCESS_TOKEN}", "tr_type": "1" }, "body": { "tr_cd": "V60", "tr_key": "FNTSLA" } }
실시간 데이터 입력 값 세팅 후 데이터 요청을 합니다.
# 비동기실행, 웹소켓, Json 라이브러리 import # 라이브러리가 설치되어 있지 않은 경우, pip install {라이브러리명} 으로 설치 하시기 바랍니다. import asyncio import websockets import json # 데이터 입력값 세팅 def data_set(): body = { "header": { "token": f"{ACCESS_TOKEN}", "tr_type": "1" }, "body": { "tr_cd": "V60", "tr_key": "FNTSLA" } } return json.dumps(body) # 비동기 웹소켓 접속함수 정의 async def ws_connect(): async with websockets.connect(URL) as websocket: # 웹소켓 접속을 위한 데이터 전송 (header, body) await websocket.send(data_set()) # Ctrl c 입력 전까지 반복문을 통해 수신받은 데이터 출력 while True: await asyncio.sleep(0.5) # 0.5초 대기 data = await websocket.recv() json_data = json.loads(data) print(json.dumps(json_data["body"], ensure_ascii=False, indent=3)) try: # asyncio 이벤트 루프를 가져옵니다. loop = asyncio.get_event_loop() # 이벤트 루프를 사용하여 웹소켓 연결 코루틴(비동기 함수)을 실행 loop.run_until_complete(ws_connect()) #예외처리 except KeyboardInterrupt: print("사용자에 의해 중단됨. 웹소켓 연결을 종료합니다.") except Exception as e: print(f"예상치 못한 오류 발생: {e}")
*응답값
{ "tr_key": [ "FNTSLA" ] } { "symbol": "FNTSLA", "RealYn": "1", "busidate": "20240228", "locdate": "20240228", "loctime": "110736", "kordate": "20240229", "kortime": "010736", "open": "200.3100", "OpenClr": "+", "high": "204.5000", "HighClr": "+", "low": "198.4600", "LowClr": "-", "last": "204.3400", "LastClr": "+", "sign": "2", "diff": "4.6100", "DiffClr": "+", "rate": "2.31", "RateClr": "+", "bid": "204.3400", "BidClr": "+", "bidsize": "168", "ask": "204.3600", "AskClr": "+", "asksize": "78", "exevol": "169", "ExevolClr": "-", "volume": "33461188", "amount": "6752760869", "SessionId": "0", "BidExevolsum": "29195197", "AskExevolsum": "4266511", "rltv": "684.29", "RltvClr": "+", "clos": "199.7300" }