import requests
import json
import yaml
with open(r'config.yaml', encoding='UTF-8') as f:
_cfg = yaml.load(f, Loader=yaml.FullLoader)
APP_KEY = _cfg['APP_KEY']
APP_SECRET = _cfg['APP_SECRET']
ACCESS_TOKEN = ""
CANO = _cfg['CANO']
ACNT_PRDT_CD = _cfg['ACNT_PRDT_CD']
ACTUAL_DOMAIN = _cfg['ACTUAL_DOMAIN']
# ACCESS TOKEN 발급
def get_access_token():
url = 'oauth2/tokenP'
request_url = f"{ACTUAL_DOMAIN}/{url}"
headers = {
}
body = {
"grant_type": "client_credentials",
"appkey": APP_KEY,
"appsecret": APP_SECRET,
}
res = requests.post(request_url, data=json.dumps(body), headers=headers)
rescode = res.status_code
if rescode == 200:
ACCESS_TOKEN = res.json()["access_token"]
else:
print("Error Code : " + str(rescode) + " | " + res.text)
return ACCESS_TOKEN
#한국계좌잔고 확인
def get_kor_balance():
url = "uapi/domestic-stock/v1/trading/inquire-psbl-order"
request_url = f"{ACTUAL_DOMAIN}/{url}"
headers = {"Content-Type": "application/json",
"authorization": f"Bearer {ACCESS_TOKEN}",
"appKey": APP_KEY,
"appSecret": APP_SECRET,
"tr_id": "TTTC8908R", #실전투자값: TTTC8908R
"custtype": "P", #P: 개인
}
params = {
"CANO": CANO, #계좌번호
"ACNT_PRDT_CD": ACNT_PRDT_CD, #계좌번호 뒷자리
"PDNO": "005930", # 종목 코드 005930은 삼성
"ORD_UNPR": "65500", #1주당 가격
"ORD_DVSN": "01", # 01: 시장가
"CMA_EVLU_AMT_ICLD_YN": "Y", #CMA 평가금액포함여부: Y
"OVRS_ICLD_YN": "Y" #해외포함여부: Y
}
res = requests.get(request_url, headers=headers, params=params)
cash = res.json()['output']['ord_psbl_cash']
#print(f"주문 가능 현금 잔고: {cash}원")
return int(cash)
#미국 주야간 확인
def check_day_or_night():
url = "uapi/overseas-stock/v1/trading/dayornight"
request_url = f"{ACTUAL_DOMAIN}/{url}"
headers = {"Content-Type": "application/json",
"authorization": f"Bearer {ACCESS_TOKEN}",
"appKey": APP_KEY,
"appSecret": APP_SECRET,
"tr_id": "JTTT3010R",
"custtype": "P", #P: 개인
}
params = {
}
res = requests.get(request_url, headers=headers, params=params)
day_or_night = res.json()['output']['PSBL_YN']
#미국: 23:30 ~ 06:00 (썸머타임 적용 시 22:30 ~ 05:00)
return day_or_night
#해외주식 매수가능금액조회
def get_us_balance():
#JTTT3007R : PSBL_YN(주야간 원장 구분) = 'Y' (야간용)
#TTTS3007R : PSBL_YN(주야간 원장 구분) = 'N' (주간용)
TR_ID = "JTTT3007R" if DAY_OR_NIGHT == 'Y' else "TTTS3007R"
url = "uapi/overseas-stock/v1/trading/inquire-psamount"
request_url = f"{ACTUAL_DOMAIN}/{url}"
headers = {"Content-Type": "application/json",
"authorization": f"Bearer {ACCESS_TOKEN}",
"appKey": APP_KEY,
"appSecret": APP_SECRET,
"tr_id": TR_ID, #실전투자값: TTTC8908R
"custtype": "P", #P: 개인
}
params = {
"CANO": CANO, #계좌번호
"ACNT_PRDT_CD": ACNT_PRDT_CD, #계좌번호 뒷자리
"OVRS_EXCG_CD": "NASD", #NASD : 나스닥 / NYSE : 뉴욕 / AMEX : 아멕스 SEHK : 홍콩 / SHAA : 중국상해 / SZAA : 중국심천 TKSE : 일본 / HASE : 하노이거래소 / VNSE : 호치민거래소
"OVRS_ORD_UNPR": "30.0", #해외주문단가, 정수부분 23자리, 소수부분 8자리
"ITEM_CD": "TQQQ", #종목코드
}
res = requests.post(request_url, headers=headers, params=params)
cash = res.json()['output']['ovrs_ord_psbl_amt']
#print(f"주문 가능 현금 잔고: {cash}$")
return cash
#국내주식주문(현금)
def buy_kor_stock(stock_code="005930", order_qty="1", order_price ="0", order_type="01"):
url = "uapi/domestic-stock/v1/trading/order-cash"
request_url = f"{ACTUAL_DOMAIN}/{url}"
headers = {"Content-Type": "application/json",
"authorization": f"Bearer {ACCESS_TOKEN}",
"appKey": APP_KEY,
"appSecret": APP_SECRET,
"tr_id": "TTTC0802U", #실전투자값: TTTC0802U
"custtype": "P", #P: 개인
}
params = {
"CANO": CANO, #계좌번호
"ACNT_PRDT_CD": ACNT_PRDT_CD, #계좌번호 뒷자리
"PDNO": stock_code, # 종목 코드 005930은 삼성
"ORD_DVSN": order_type, #01 : 시장가 02 : 조건부지정가 03 : 최유리지정가 04 : 최우선지정가 05 : 장전 시간외 06 : 장후 시간외 07 : 시간외 단일가
"ORD_QTY": order_qty,
"ORD_UNPR": order_price, # 1주당 가격
"CTAC_TLNO":"",
"SLL_TYPE":"01",
"ALGO_NO":""
}
res = requests.post(request_url, data=json.dumps(params), headers=headers)
rt_cd = "주문 성공" if res.json()['rt_cd'] == "0" else "주문 실패"
msg1 = res.json()['msg1']
print(rt_cd + ": " + msg1)
return rt_cd # 주문성공 시 0 리턴
ACCESS_TOKEN = get_access_token()
DAY_OR_NIGHT = check_day_or_night()
#print(get_kor_balance())
#get_us_balance()
buy_kor_stock("005930", "1", "56500", "00") # 1: 종목코드, 2: 주문수량, 3.주문가격 ,4: 주문방식(00은 지정가)
주문이라 보안에 더 신경쓴건지
Get 대신 Post를 쓰는 것이 특징이다.(122번째 requests.post)
삼성전자(005930)를 1주(1) 56000원에(56500) 지정가(00) 주문을 하는 함수호출을 하였다.
반응형
'미국 주식 프로그램 만들기(KIS Developers) > 1. KIS Developer API 연동' 카테고리의 다른 글
8) 해외주식주문(현금매도) (0) | 2022.09.14 |
---|---|
7) 해외주식주문(현금매수) (0) | 2022.09.14 |
5) 해외주식 매수가능금액조회(해외계좌잔고확인) (0) | 2022.09.13 |
4) 해외주식 주야간원장구분조회 (2) | 2022.09.13 |
3) 한국 계좌 잔고 확인 (3) | 2022.09.13 |