Code Monkey home page Code Monkey logo

mojito's Introduction

모히토 (Mojito)

대한민국 증권사의 Rest API 기반의 Open API에 대한 통합 파이썬 레퍼 모듈입니다. 통합 모듈이라 칵테일 이름인 모히토를 프로젝트명으로 사용하고 있으며, 돈 벌어서 몰디브가서 모히토 한 잔 하자는 의미도 있습니다.

mojito-g60be5b0d7_640

설치

$ pip install mojito2

지원 API

카테고리 기능 함수
OAuth 인증 Hasheky issue_hashkey()
OAuth 인증 접근토근발급(P) issue_access_token()
OAuth 인증 접근토근폐기(P) 미지원
국내주식주문 주식주문(현금)
국내주식주문 주식잔고조회 fetch_balance()

사용법

한국투자증권

https://wikidocs.net/book/7845

현재가 조회

import mojito
import pprint

key = "발급받은 API KEY"
secret = "발급받은 API SECRET"
acc_no = "12345678-01"

broker = mojito.KoreaInvestment(api_key=key, api_secret=secret, acc_no=acc_no)
resp = broker.fetch_price("005930")
pprint.pprint(resp)

일봉 데이터 조회

import mojito
import pprint

key = "발급받은 API KEY"
secret = "발급받은 API SECRET"
acc_no = "12345678-01"

broker = mojito.KoreaInvestment(api_key=key, api_secret=secret, acc_no=acc_no)
resp = broker.fetch_daily_price("005930")
pprint.pprint(resp)

잔고 조회

resp = broker.fetch_balance()
pprint.pprint(resp)

주문

resp = broker.create_market_buy_order("005930", 10) # 삼성전자, 10주, 시장가
pprint.pprint(resp)
{
 'rt_cd': '0',
 'msg_cd': 'APBK0013',
 'msg1': '주문 전송 완료 되었습니다.',
 'output': {'KRX_FWDG_ORD_ORGNO': '91252',
  'ODNO': '0000117057',
  'ORD_TMD': '121052'}
}

주문 취소

resp = broker.cancel_order("91252", "0000117057", "00", 60000, 5, "Y") # KRX_FWDG_ORD_ORGNO, ODNO, 지정가 주문, 가격, 수량, 모두 
print(resp)

미국주식 주문

broker = KoreaInvestment(key, secret, acc_no=acc_no, exchange="NASD")
resp = broker.create_limit_buy_order("TQQQ", 35, 1)
print(resp)

웹소켓

import pprint
import mojito

with open("../../koreainvestment.key", encoding="utf-8") as f:
    lines = f.readlines()
key = lines[0].strip()
secret = lines[1].strip()


if __name__ == "__main__":
    broker_ws = mojito.KoreaInvestmentWS(key, secret, ["H0STCNT0", "H0STASP0"], ["005930", "000660"], user_id="idjhh82")
    broker_ws.start()
    while True:
        data_ = broker_ws.get()
        if data_[0] == '체결':
            print(data_[1])
        elif data_[0] == '호가':
            print(data_[1])
        elif data_[0] == '체잔':
            print(data_[1])

mojito's People

Contributors

azki avatar brayden-jo avatar dalinaum avatar forcecore avatar jackmappotion avatar mr-yoo avatar onequery avatar sharebook-kr avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

mojito's Issues

inquire-psbl-order 래퍼가 필요 합니다.

염치없이 받아 쓰는 형편에...
꼭 필요한 api같아서 요청 드립니다.

현재 한투api에서 미수 없이 주문할수 있는 금액을 보여주는 곳이 저 api 뿐이네요.
한투쪽에서도 inquire-psbl-order api를 이용하라고 하고...

현재 따로 불러오려고 하면서....
broker.access_token 으로 있는 토큰을 쓰면 될줄 알았는데...
집어넣으면 유효하지 않은 토큰이라고 나와서 당황중입니다. ㅠ_ㅠ

결국 모히토 래퍼와 기존 방식을 둘다 써야하는.......
(토큰이 꼬일것 같기도 하고.. 쩝..)

토큰 발급시 이전 토근 확인

한투 Rest API의 토큰은 발급 후 24시간 사용이 가능함.
객체를 생성할 때 토큰을 생성하고 이를 파일로 기록한 후 사용하도록 변경

50건이상 보유내역 조회기능이 없습니다

스팩의 경우 보면 "연속 거래 여부", "연속조회검색조건100", "연속조회키100 " 가 필요 하다고 합니다.
저 같은 경우 아래 처럼 "연속조회검색조건100", "연속조회키100 " 는 수신 받게 해두었는데요 ..
그리고 연속 거래 여부는 해더에 들어 있기 때문에 결과 값에 추가 하도록 수정 했습니다.
컬럼명도 한글을 선호해서 한글로 변환하도록 수정해두었습니다.

def fetch_balance(self, acc_no: str, CTX_AREA_FK100 = '', CTX_AREA_NK100 = '') -> dict:
    """주식잔고조회
    Args:
        acc_no (str): 계좌번호 앞8자리
    Returns:
        dict: _description_
    """
    path = "uapi/domestic-stock/v1/trading/inquire-balance"
    url = f"{self.BASE_URL}/{path}"
    headers = {
       "content-type": "application/json",
       "authorization": self.access_token,
       "appKey": self.api_key,
       "appSecret": self.api_secret,
       "tr_id": "TTTC8434R",
       "tr_cont": "" if CTX_AREA_NK100 == "" else "N"
    }
    params = {
        'CANO': acc_no,
        'ACNT_PRDT_CD': '22',
        'AFHR_FLPR_YN': 'N',
        'OFL_YN': 'N',
        'INQR_DVSN': '01',
        'UNPR_DVSN': '01',
        'FUND_STTL_ICLD_YN': 'N',
        'FNCG_AMT_AUTO_RDPT_YN': 'N',
        'PRCS_DVSN': '01',
        'CTX_AREA_FK100': CTX_AREA_FK100,
        'CTX_AREA_NK100': CTX_AREA_NK100
    }
    res = requests.get(url, headers=headers, params=params)
    
    s = res.text
    korkey = {'ASST_ICDC_ERNG_RT':'자산증감수익율','ASST_ICDC_AMT':'자산증감액','BFDY_TOT_ASST_EVLU_AMT':'전일총자산평가금액','TOT_STLN_SLNG_CHGS':'총대주매각대금','EVLU_PFLS_SMTL_AMT':'평가손익합계금액','EVLU_AMT_SMTL_AMT':'평가금액합계금액','PCHS_AMT_SMTL_AMT':'매입금액합계금액','FNCG_GLD_AUTO_RDPT_YN':'융자금자동상환여부','NASS_AMT':'순자산금액','TOT_EVLU_AMT':'총평가금액','SCTS_EVLU_AMT':'유가평가금액','TOT_LOAN_AMT':'총대출금액','THDT_TLEX_AMT':'금일제비용금액','BFDY_TLEX_AMT':'전일제비용금액','D2_AUTO_RDPT_AMT':'D+2자동상환금액','THDT_SLL_AMT':'금일매도금액','BFDY_SLL_AMT':'전일매도금액','NXDY_AUTO_RDPT_AMT':'익일자동상환금액','THDT_BUY_AMT':'금일매수금액','BFDY_BUY_AMT':'전일매수금액','CMA_EVLU_AMT':'CMA평가금액','PRVS_RCDL_EXCC_AMT':'가수도정산금액','NXDY_EXCC_AMT':'익일정산금액','DNCA_TOT_AMT':'예수금총금액','output2':'응답상세2','STCK_LOAN_UNPR':'주식대출단가','SBST_PRIC':'대용가격','GRTA_RT_NAME':'보증금율명','ITEM_MGNA_RT_NAME':'종목증거금율명','BFDY_CPRS_ICDC':'전일대비증감','FLTT_RT':'등락율','EXPD_DT':'만기일자','STLN_SLNG_CHGS':'대주매각대금','LOAN_AMT':'대출금액','LOAN_DT':'대출일자','EVLU_ERNG_RT':'평가수익율','EVLU_PFLS_RT':'평가손익율','EVLU_PFLS_AMT':'평가손익금액','EVLU_AMT':'평가금액','PRPR':'현재가','PCHS_AMT':'매입금액','PCHS_AVG_PRIC':'매입평균가격','ORD_PSBL_QTY':'주문가능수량','HLDG_QTY':'보유수량','THDT_SLL_QTY':'금일매도수량','THDT_BUYQTY':'금일매수수량','BFDY_SLL_QTY':'전일매도수량','BFDY_BUY_QTY':'전일매수수량','TRAD_DVSN_NAME':'매매구분명','PRDT_NAME':'상품명','PDNO':'상품번호','output1':'응답상세1','CTX_AREA_NK100':'연속조회키100','CTX_AREA_FK100':'연속조회검색조건100','msg1':'응답메세지','msg_cd':'응답코드','rt_cd':'성공 실패 여부'}
    for token in korkey :
        s = s.replace(token.lower(), korkey[token])

    j = json.loads(s)

    # headers['tr_cont']	연속 거래 여부	
    #F or M : 다음 데이터 있음
    #D or E : 마지막 데이터
    j['연속 거래 여부'] = res.headers['tr_cont']

    return j

[Bug] fetch_kospi_symbols

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xba in position 23: invalid start byte

이런 에러가... -_-;;;;;;

아직 쪼랩이라 잘 찾지도 못하는데... 어째건 뒤져서 찾아낸건...

종목 정보 csv 템프 파일 읽을때 utf-8로 읽는 것이 아닌가... 하는 추측입니다.

아침에 사무실에서 돌려보니 또 맥에선 잘 되는군요........

저만 이런걸까요?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.