한국투자증권 Open API를 이용하기 위해 토큰을 생성했고, 해당 계좌에 대한 정보를 조회까지 해봤다.
API를 통해 주식을 매수, 매도, 수정하는 방법들을 테스트해보자.

1. 매수 주문

투자자가 주식을 매수, 매도하기 위해 호가를 할 때는 기준가 별 호가단위가 존재한다. HTS(Home Trading System) or MTS(Mobile Trading System)을 사용할 때는 자동으로 적용되었으나, OpenAPI를 이용하는 경우에는 기준가 별 호가단위를 준수하지 않으면 에러가 발생한다.

** 기준가 별 호가단위 표 **
기준가 | 호가단위 —–|—– ~2,000원 미만 | 1원 2,000원 이상~5,000원 미만 | 5원 5,000원 이상~20,000원 미만 | 10원 20,000원 이상~50,000원 미만 | 50원 50,000원 이상~200,000원 미만 | 100원 200,000원 이상~500,000원 미만 | 500원 500,000원 이상 | 1,000원

1-1. 시장가 매수

시장의 가격에 매수 가격에 맞춰 매수 주문을 넣는 방식.
가격을 지정할 수 없기 때문에 매수 시점에 보다 높은 호가에 매수 체결이 될 수 있지만(Splippage, 슬리피지), 주문 즉시 매수 체결이 될 수 있기 때문에 단타 매매에서 편리하게 사용할 수 있다.

** 사용예시 **

resp = broker.create_market_buy_order(
    symbol="005930", # 삼성전자
    quantity=10 # 10개
)

** create_market_buy_order **

def create_market_buy_order(self, symbol: str, quantity: int) -> dict:
    """시장가 매수
        symbol (str): symbol
        quantity (int): quantity
    """
    if self.exchange == "서울":
        resp = self.create_order("buy", symbol, 0, quantity, "01")
    else:
        resp = self.create_oversea_order("buy", symbol, "0", quantity, "00")
    return resp

1-2. 지정가 매수

지정가는 내가 원하는 가격에 주문을 내는 방식.
지정가 주문을 넣으면 해당 호가에 주문을 넣은 순서대로 주문수량이 누적되며 해당 가격에서 주문 순서에 맞춰 체결된다.
지정가 주문을 위해서 가격과 수량을 입력해야한다.

** 사용예시 **

resp = broker.create_limit_buy_order(
    symbol="005930", # 삼성전자
    price=65000, # 주문 가격
    quantity=1 # 수량
)
pprint.pprint(resp)

** create_limit_buy_order **

def create_limit_buy_order(self, symbol: str, price: int, quantity: int) -> dict:
    """지정가 매수
        symbol (str): 종목코드
        price (int): 가격
        quantity (int): 수량
    """
    if self.exchange == "서울":
        resp = self.create_order("buy", symbol, price, quantity, "00")
    else:
        resp = self.create_oversea_order("buy", symbol, price, quantity, "00")

    return resp

2. 매도 주문

2-1. 시장가 매도

resp = broker.create_market_sell_order(
    symbol="005930",
    quantity=1
)
pprint.pprint(resp)

** create_market_sell_order **

def create_market_sell_order(self, symbol: str, quantity: int) -> dict:
    """시장가 매도
    Args:
        symbol (str): _description_
        quantity (int): _description_
    """
    if self.exchange == "서울":
        resp = self.create_order("sell", symbol, 0, quantity, "01")
    else:
        resp = self.create_oversea_order("sell", symbol, "0", quantity, "00")
    return resp

2-2. 지정가 매도

resp = broker.create_limit_sell_order(
    symbol="005930",
    price=67000,
    quantity=1
)
pprint.pprint(resp)

** create_limit_sell_order **

def create_limit_sell_order(self, symbol: str, price: int, quantity: int) -> dict:
    """
    Args:
        symbol (str): _description_
        price (int): _description_
        quantity (int): _description_
    """
    if self.exchange == "서울":
        resp = self.create_order("sell", symbol, price, quantity, "00")
    else:
        resp = self.create_oversea_order("sell", symbol, price, quantity, "00")
    return resp

3. 주문 취소

아래의 코드는 취소 주문시 전체 혹은 일부 취소 주문을 넣는 코드인데…. 수정이 필요해 보인다. total=True가 굳이 필요한가? 전체를 취소하는데 갯수가 필요한지…

resp = broker.cancel_order(
    org_no="91252",
    order_no="0000119206",
    quantity=4,  # 잔량전부 취소시 원주문 수량과 일치해야함
    total=True   # 잔량전부를 의미
)
pprint.pprint(resp)

resp = broker.cancel_order( org_no=”91252”, order_no=”0000120154”, quantity=2, # 취소하고자하는 수량 total=False # 잔량일부 ) pprint.pprint(resp)

4. 주문 정정

주문 정정을 하는 코드 또한, 전체를 정정하는 부분의 수정이 필요해 보임.

resp = broker.modify_order(
    org_no="91252",
    order_no="0000138450",
    order_type="00",
    price=60000,
    quantity=4,
    total=True
)
pprint.pprint(resp)
resp = broker.modify_order(
    org_no="91252",
    order_no="0000143877",
    order_type="00",
    price=60000,
    quantity=2,
    total=False
)
pprint.pprint(resp)

Reference