Skip to content
Soju06 edited this page Aug 2, 2024 · 6 revisions

header

1. PyKis ์ธ์ฆ ๊ด€๋ฆฌ

1.1. ์‹œํฌ๋ฆฟ ํ‚ค ๊ด€๋ฆฌ

์‹œํฌ๋ฆฟ ํ‚ค๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ํฌ๊ฒŒ 2๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ์‹œํฌ๋ฆฟ ํ‚ค๋ฅผ ํŒŒ์ผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•

    # ๋จผ์ € ์‹œํฌ๋ฆฟ ํ‚ค๋ฅผ ํŒŒ์ผ๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
    from pykis import KisAuth
    
    auth = KisAuth(
        # HTS ๋กœ๊ทธ์ธ ID  ์˜ˆ) soju06
        id="YOUR_HTS_ID",
        # ์•ฑ ํ‚ค  ์˜ˆ) Pa0knAM6JLAjIa93Miajz7ykJIXXXXXXXXXX
        appkey="YOUR_APP_KEY",
        # ์•ฑ ์‹œํฌ๋ฆฟ ํ‚ค  ์˜ˆ) V9J3YGPE5q2ZRG5EgqnLHn7XqbJjzwXcNpvY . . .
        secretkey="YOUR_APP_SECRET",
        # ์•ฑ ํ‚ค์™€ ์—ฐ๊ฒฐ๋œ ๊ณ„์ขŒ๋ฒˆํ˜ธ  ์˜ˆ) 00000000-01
        account="00000000-01",
        # ๋ชจ์˜ํˆฌ์ž ์—ฌ๋ถ€
        virtual=False,
    )
    
    # ์•ˆ์ „ํ•œ ๊ฒฝ๋กœ์— ์‹œํฌ๋ฆฟ ํ‚ค๋ฅผ ํŒŒ์ผ๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
    auth.save("secret.json")

    ๊ทธ ํ›„, ์ €์žฅ๋œ ์‹œํฌ๋ฆฟ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ PyKis ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    from pykis import PyKis, KisAuth
    
    # ์‹ค์ „ํˆฌ์ž์šฉ PyKis ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
    kis = PyKis("secret.json", keep_token=True)
    kis = PyKis(KisAuth.load("secret.json"), keep_token=True)
    
    # ๋ชจ์˜ํˆฌ์ž์šฉ PyKis ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
    kis = PyKis("secret.json", "virtual_secret.json", keep_token=True)
    kis = PyKis(KisAuth.load("secret.json"), KisAuth.load("virtual_secret.json"), keep_token=True)
  2. ์ง์ ‘ ์‹œํฌ๋ฆฟ ํ‚ค๋ฅผ ์ž…๋ ฅํ•˜๋Š” ๋ฐฉ๋ฒ•

    from pykis import PyKis
    
     # ์‹ค์ „ํˆฌ์ž์šฉ ํ•œ๊ตญํˆฌ์ž์ฆ๊ถŒ API๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
     kis = PyKis(
         id="soju06",  # HTS ๋กœ๊ทธ์ธ ID
         account="00000000-01",  # ๊ณ„์ขŒ๋ฒˆํ˜ธ
         appkey="PSED321z...",  # AppKey 36์ž๋ฆฌ
         secretkey="RR0sFMVB...",  # SecretKey 180์ž๋ฆฌ
         keep_token=True,  # API ์ ‘์† ํ† ํฐ ์ž๋™ ์ €์žฅ
     )
    
     # ๋ชจ์˜ํˆฌ์ž์šฉ ํ•œ๊ตญํˆฌ์ž์ฆ๊ถŒ API๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
     kis = PyKis(
         id="soju06",  # HTS ๋กœ๊ทธ์ธ ID
         account="00000000-01",  # ๋ชจ์˜ํˆฌ์ž ๊ณ„์ขŒ๋ฒˆํ˜ธ
         appkey="PSED321z...",  # ์‹ค์ „ํˆฌ์ž AppKey 36์ž๋ฆฌ
         secretkey="RR0sFMVB...",  # ์‹ค์ „ํˆฌ์ž SecretKey 180์ž๋ฆฌ
         virtual_id="soju06",  # ๋ชจ์˜ํˆฌ์ž HTS ๋กœ๊ทธ์ธ ID
         virtual_appkey="PSED321z...",  # ๋ชจ์˜ํˆฌ์ž AppKey 36์ž๋ฆฌ
         virtual_secretkey="RR0sFMVB...",  # ๋ชจ์˜ํˆฌ์ž SecretKey 180์ž๋ฆฌ
         keep_token=True,  # API ์ ‘์† ํ† ํฐ ์ž๋™ ์ €์žฅ
     )

1.2. ์—‘์„ธ์Šค ํ† ํฐ ๊ด€๋ฆฌ

ํ•œ๊ตญํˆฌ์ž์ฆ๊ถŒ ๊ฐœ์ธ ๊ณ ๊ฐ์˜ ๊ฒฝ์šฐ, ์—‘์„ธ์Šค ํ† ํฐ์˜ ๋งŒ๋ฃŒ ๊ธฐ๊ฐ„์€ 1์ผ์ด๋ฉฐ, ์—‘์„ธ์Šค ํ† ํฐ์„ ๋ฐœ๊ธ‰๋ฐ›์œผ๋ฉด, ๊ณ„์ขŒ์™€ ์—ฐ๊ฒฐ๋œ ์นด์นด์˜คํ†ก์œผ๋กœ ์•Œ๋ฆผ์ด ์ „์†ก๋ฉ๋‹ˆ๋‹ค.

PyKis๋Š” ์—‘์„ธ์Šค ํ† ํฐ์„ ์ž๋™์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋ฐ˜์ ์ธ ํ™˜๊ฒฝ์—์„œ๋Š” ๋ฐœ๊ธ‰์ด๋‚˜ ๋งŒ๋ฃŒ๋ฅผ ์ง์ ‘ ๊ด€๋ฆฌํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋งŒ์•ฝ, PyKis ๊ฐ์ฒด๋ฅผ 1์ผ ์ด์ƒ ์œ ์ง€ํ•˜๊ธฐ ์–ด๋ ค์šด ํ™˜๊ฒฝ์ด๋ผ๋ฉด, ์—‘์„ธ์Šค ํ† ํฐ์„ ํŒŒ์ผ๋กœ ์ €์žฅํ•˜์—ฌ ๊ธฐ๊ฐ„์ด ๋‚จ์€ ํ† ํฐ์„ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ํ† ํฐ ์ž๋™ ๊ด€๋ฆฌ ํ™œ์„ฑํ™” ๋ฐฉ๋ฒ•

    from pykis import PyKis
    
    # keep_token=True๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ† ํฐ์„ ์ž๋™์œผ๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
    # ๊ธฐ๋ณธ ์ €์žฅ ๊ฒฝ๋กœ๋Š” ~/.pykis/ ์ž…๋‹ˆ๋‹ค. ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋Š” ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์„ธ์š”.
    kis = PyKis("secret.json", keep_token=True)
  2. ํ† ํฐ์„ ์ˆ˜๋™์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•

    from pykis.kis import PyKis, KisAccessToken
    
    # ์ €์žฅ๋œ ํ† ํฐ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด PyKis ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
    kis = PyKis("secret.json", token="token.json")
    kis = PyKis("secret.json", token=KisAccessToken.load("token.json"))
    # ๋˜๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด PyKis ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ ํ›„ ํ† ํฐ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    kis = PyKis("secret.json")
    kis.token = KisAccessToken.load("token.json")
    
    # ์•„๋ž˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋งŒ๋ฃŒ๊ธฐ๊ฐ„์ด ๋ณด์žฅ๋œ ํ† ํฐ์„ ๋ฐœ๊ธ‰๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    token = kis.token
    # ํ† ํฐ์˜ ์ •๋ณด๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
    print(repr(token), str(token))
    
    # ์•ˆ์ „ํ•œ ๊ฒฝ๋กœ์— ํ•ด๋‹น ํ† ํฐ์„ ํŒŒ์ผ๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
    token.save("token.json")
    
    # ํŒŒ์ผ๋กœ ์ €์žฅ๋œ ํ† ํฐ์ด ๋งŒ๋ฃŒ๋˜๋”๋ผ๋„ PyKis ๊ฐ์ฒด์—์„œ ์ž๋™์œผ๋กœ ๊ฐฑ์‹ ํ•ฉ๋‹ˆ๋‹ค.
    print(f"๋‚จ์€ ์œ ํšจ๊ธฐ๊ฐ„: {kis.token.remaining}")

2. ์ข…๋ชฉ ์‹œ์„ธ ๋ฐ ์ฐจํŠธ ์กฐํšŒ

๊ธฐ๋ณธ์ ์œผ๋กœ ์–ด๋– ํ•œ ์ข…๋ชฉ์ด๋“  ์‹œ์„ธ๋ฅผ ์กฐํšŒํ•˜๋ ค๋ฉด kis.stock('AAPL') ์ฒ˜๋Ÿผ ์ข…๋ชฉ์˜ ๊ฐœ์ฒด๋ฅผ ๋ฐ›์•„์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ตญ๋‚ด์ฃผ์‹, ํ•ด์™ธ์ฃผ์‹์— ์ƒ๊ด€ ์—†์ด ๋ชจ๋‘ ๋™์ผํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

from pykis import KisStock

# ๊ตญ๋‚ด ์ฃผ์‹
hynix: KisStock = kis.stock("000660")  # SKํ•˜์ด๋‹‰์Šค (์ฝ”์Šคํ”ผ)
ecopro: KisStock = kis.stock("247540")  # ์—์ฝ”ํ”„๋กœ๋น„์—  (์ฝ”์Šค๋‹ฅ)

# ํ•ด์™ธ ์ฃผ์‹ (๋ฏธ๊ตญ)
nvida: KisStock = kis.stock("NVDA")  # ์—”๋น„๋””์•„ (๋‚˜์Šค๋‹ฅ)
coupang: KisStock = kis.stock("CPNG")  # ์ฟ ํŒก (๋‰ด์š•)

API์˜ ํ•œ๊ณ„๋กœ ์ข…๋ชฉ์ด ๋ฐœ๊ฒฌ๋  ๋•Œ๊นŒ์ง€ ๋ชจ๋“  ์‹œ์žฅ์„ ์ˆœํšŒํ•˜๋ฉฐ ์กฐํšŒํ•˜๋ฏ€๋กœ ์‹œ์žฅ ์ •๋ณด๋ฅผ ํ•จ๊ป˜ ์ž…๋ ฅํ•˜๋ฉด ๋” ๋น ๋ฅด๊ฒŒ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ๊ฐ’์€ ํ•œ๊ตญ -> ๋ฏธ๊ตญ -> ์ผ๋ณธ -> ํ™์ฝฉ -> ์ค‘๊ตญ -> ๋ฒ ํŠธ๋‚จ ์ˆœ์œผ๋กœ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.

tokyo_electric: KisStock = kis.stock("9501", market="TYO")  # ๋„์ฟ„ ์ „๋ ฅ (๋„์ฟ„)
# ๋˜๋Š” ๊ตญ๊ฐ€์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
tokyo_electric: KisStock = kis.stock("9501", market="JP")  # ๋„์ฟ„ ์ „๋ ฅ (๋„์ฟ„)

PyKis์˜ stockํ•จ์ˆ˜๋กœ ์–ป์€ ์ข…๋ชฉ ์Šค์ฝ”ํ”„(KisStock)๋Š” ๊ธฐ๋ณธ์ ์ธ ์ข…๋ชฉ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

print(
    f"""
์ข…๋ชฉ์ฝ”๋“œ: {hynix.symbol}
์ข…๋ชฉ๋ช…: {hynix.name}
์ข…๋ชฉ์‹œ์žฅ: {hynix.market}
"""
)

# ๋˜ํ•œ info ํ”„๋กœํผํ‹ฐ๋ฅผ ํ†ตํ•ด ์ƒ์„ธ ์ •๋ณด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
print(
    f"""
์ข…๋ชฉ์ฝ”๋“œ: {hynix.info.symbol}
์ข…๋ชฉํ‘œ์ค€์ฝ”๋“œ: {hynix.info.std_code}
์ข…๋ชฉ๋ช…: {hynix.info.name}
์ข…๋ชฉ์˜๋ฌธ๋ช…: {hynix.info.name_eng}
์ข…๋ชฉ์‹œ์žฅ: {hynix.info.market}
์ข…๋ชฉ์‹œ์žฅํ•œ๊ธ€๋ช…: {hynix.info.market_name}
"""
)

์ด๋ ‡๊ฒŒ ์–ป์€ ์ข…๋ชฉ ์Šค์ฝ”ํ”„๋ฅผ ์ด์šฉํ•ด ์‹œ์„ธ, ์ฃผ๋ฌธ๊ฐ€๋Šฅ ์ˆ˜๋Ÿ‰ ์กฐํšŒ, ๋งค๋งค ์ฃผ๋ฌธ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2.1. ์‹œ์„ธ ์กฐํšŒ

stock.quote() ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ตญ๋‚ด์ฃผ์‹ ๋ฐ ํ•ด์™ธ์ฃผ์‹์˜ ์‹œ์„ธ๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

from pykis import KisQuote

quote: KisQuote = kis.stock("CPNG").quote()

print(
    f"""
์ข…๋ชฉ์ฝ”๋“œ: {quote.symbol}
์ข…๋ชฉ๋ช…: {quote.name}
์ข…๋ชฉ์‹œ์žฅ: {quote.market}

์—…์ข…๋ช…: {quote.sector_name}

ํ˜„์žฌ๊ฐ€: {quote.price}
๊ฑฐ๋ž˜๋Ÿ‰: {quote.volume}
๊ฑฐ๋ž˜๋Œ€๊ธˆ: {quote.amount}
์‹œ๊ฐ€์ด์•ก: {quote.market_cap}
๋Œ€๋น„๋ถ€ํ˜ธ: {quote.sign}
์œ„ํ—˜๋„: {quote.risk}
๊ฑฐ๋ž˜์ •์ง€: {quote.halt}
๋‹จ๊ธฐ๊ณผ์—ด๊ตฌ๋ถ„: {quote.overbought}

์ „์ผ์ข…๊ฐ€: {quote.prev_price}
์ „์ผ๊ฑฐ๋ž˜๋Ÿ‰: {quote.prev_volume}
์ „์ผ๋Œ€๋น„: {quote.change}

์ƒํ•œ๊ฐ€: {quote.high_limit}
ํ•˜ํ•œ๊ฐ€: {quote.low_limit}
๊ฑฐ๋ž˜๋‹จ์œ„: {quote.unit}
ํ˜ธ๊ฐ€๋‹จ์œ„: {quote.tick}
์†Œ์ˆ˜์  ์ž๋ฆฌ์ˆ˜: {quote.decimal_places}

ํ†ตํ™”์ฝ”๋“œ: {quote.currency}
๋‹น์ผํ™˜์œจ: {quote.exchange_rate}

๋‹น์ผ์‹œ๊ฐ€: {quote.open}
๋‹น์ผ๊ณ ๊ฐ€: {quote.high}
๋‹น์ผ์ €๊ฐ€: {quote.low}

๋“ฑ๋ฝ์œจ: {quote.rate}
๋Œ€๋น„๋ถ€ํ˜ธ๋ช…: {quote.sign_name}

==== ์ข…๋ชฉ ์ง€ํ‘œ ====

EPS (์ฃผ๋‹น์ˆœ์ด์ต): {quote.indicator.eps}
BPS (์ฃผ๋‹น์ˆœ์ž์‚ฐ): {quote.indicator.bps}
PER (์ฃผ๊ฐ€์ˆ˜์ต๋น„์œจ): {quote.indicator.per}
PBR (์ฃผ๊ฐ€์ˆœ์ž์‚ฐ๋น„์œจ): {quote.indicator.pbr}

52์ฃผ ์ตœ๊ณ ๊ฐ€: {quote.indicator.week52_high}
52์ฃผ ์ตœ์ €๊ฐ€: {quote.indicator.week52_low}
52์ฃผ ์ตœ๊ณ ๊ฐ€ ๋‚ ์งœ: {quote.indicator.week52_high_date.strftime("%Y-%m-%d")}
52์ฃผ ์ตœ์ €๊ฐ€ ๋‚ ์งœ: {quote.indicator.week52_low_date.strftime("%Y-%m-%d")}
"""
)

2.2. ์ฐจํŠธ ์กฐํšŒ

๊ตญ๋‚ด์ฃผ์‹ ๋ฐ ํ•ด์™ธ์ฃผ์‹์˜ ๋‹น์ผ ๋ถ„๋ด‰๊ณผ ๊ธฐ๊ฐ„ ๋ด‰ ์ฐจํŠธ๋ฅผ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.

์ด 3๊ฐ€์ง€์˜ ํ•จ์ˆ˜(chart, daily_chart, day_chart) ๊ฐ€ ์žˆ์ง€๋งŒ, chart ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ชจ๋‘ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

from datetime import date, time
from pykis import KisChart

chart: KisChart = coupang.chart()  # ๊ธฐ๋ณธ๊ฐ’์€ ์ƒ์žฅ ์ด๋ž˜์˜ ์ผ๋ด‰์ž…๋‹ˆ๋‹ค.
# ์ตœ๊ทผ ๊ธฐ๊ฐ„ ์กฐํšŒ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ์‹œ๊ฐ„ ํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
# 1m: 1๋ถ„
# 1h: 1์‹œ๊ฐ„
# 1d: 1์ผ
# 1w: 1์ฃผ
# 1M: 1๊ฐœ์›” (๊ฐœ์›” ๋‹จ์œ„๋Š” ๋Œ€๋ฌธ์ž M)
# 1y: 1๋…„
# 1y6M: 1๋…„ 6๊ฐœ์›”
chart: KisChart = coupang.chart("3d")  # ์ตœ๊ทผ 3์ผ ์ผ๋ด‰์ž…๋‹ˆ๋‹ค.
chart: KisChart = coupang.chart("1y", period="month")  # ์ตœ๊ทผ 1๋…„๊ฐ„์˜ ์›”๋ด‰์ž…๋‹ˆ๋‹ค.
chart: KisChart = coupang.chart(period="year")  # ์ƒ์žฅ ์ด๋ž˜์˜ ์—ฐ๊ฐ„ ์ผ๋ด‰์ž…๋‹ˆ๋‹ค.
chart: KisChart = coupang.chart(start=date(2023, 1, 1))  # 2023๋…„ 1์›” 1์ผ๋ถ€ํ„ฐ ํ˜„์žฌ๊นŒ์ง€์˜ ์ผ๋ด‰์ž…๋‹ˆ๋‹ค.
chart: KisChart = coupang.chart(
    start=date(2023, 1, 1),
    end=date(2024, 1, 1),
) # 2023๋…„ 1์›” 1์ผ๋ถ€ํ„ฐ 2023๋…„ 12์›” 31์ผ๊นŒ์ง€์˜ ์ผ๋ด‰์ž…๋‹ˆ๋‹ค.

chart: KisChart = coupang.chart("1h", period=1)  # ์ตœ๊ทผ 1์‹œ๊ฐ„์˜ 1๋ถ„๋ด‰์ž…๋‹ˆ๋‹ค.
chart: KisChart = coupang.chart(period=5)  # ๋‹น์ผ 5๋ถ„๋ด‰์ž…๋‹ˆ๋‹ค.
chart: KisChart = coupang.chart(period=1, end=time(12, 30))  # ๋‹น์ผ 12์‹œ 30๋ถ„๊นŒ์ง€์˜ 1๋ถ„๋ด‰์ž…๋‹ˆ๋‹ค.

PyKis์˜ ๋ชจ๋“  ๊ฐ์ฒด๋Š” repr๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด์˜ ์ฃผ์š” ๋‚ด์šฉ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

print(repr(hynix.chart("7d"))) # SKํ•˜์ด๋‹‰์Šค์˜ ์ตœ๊ทผ 7์ผ ์ผ๋ด‰ ์ฐจํŠธ
KisDomesticDailyChart(
    market='KRX',
    symbol='000660',
    bars=[
        KisDomesticDailyChartBar(time='2024-07-19T00:00:00+09:00', open=208500, close=209500, high=214000, low=207000, volume=4519170, amount=949039126250, change=-3000),
        KisDomesticDailyChartBar(time='2024-07-22T00:00:00+09:00', open=209000, close=205000, high=209500, low=200500, volume=6662441, amount=1363039398518, change=-4500),
        KisDomesticDailyChartBar(time='2024-07-23T00:00:00+09:00', open=208500, close=205000, high=209500, low=200500, volume=5976519, amount=1224619868908, change=0),
        KisDomesticDailyChartBar(time='2024-07-24T00:00:00+09:00', open=202000, close=208500, high=212500, low=200000, volume=4838734, amount=1003813878000, change=3500),
        KisDomesticDailyChartBar(time='2024-07-25T00:00:00+09:00', open=196200, close=190000, high=198800, low=189000, volume=12503762, amount=2411730871900, change=-18500),
        KisDomesticDailyChartBar(time='2024-07-26T00:00:00+09:00', open=190800, close=191800, high=194500, low=186100, volume=8769107, amount=1670363205934, change=1800)
    ]
)

์•„๋ž˜๋Š” ์ฐจํŠธ์˜ ๊ฐ„๋‹จํ•œ ์‹œ๊ฐํ™” ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.

๋จผ์ € ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

pip install pandas lightweight-charts
from datetime import datetime, timedelta
from lightweight_charts import JupyterChart

chart_view = JupyterChart(width=1280, height=720)
chart = nvida.chart("1y")

chart_view.set(chart.df()) # pykis์˜ ์ฐจํŠธ ๊ฐ์ฒด๋Š” dfํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ pandas DataFrame์œผ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
chart_view.set_visible_range(datetime.now() - timedelta(days=365), datetime.now())

chart_view.load()

image

2.3. ํ˜ธ๊ฐ€ ์กฐํšŒ

stock.orderbook() ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ตญ๋‚ด์ฃผ์‹ ๋ฐ ํ•ด์™ธ์ฃผ์‹์˜ ํ˜ธ๊ฐ€๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

from pykis import KisOrderbook

orderbook: KisOrderbook = hynix.orderbook()

print("๋งค๋„1ํ˜ธ๊ฐ€:", orderbook.ask_price, orderbook.ask_volumn)
print("๋งค์ˆ˜1ํ˜ธ๊ฐ€:", orderbook.bid_price, orderbook.bid_volumn)

print(repr(orderbook)) # repr์„ ํ†ตํ•ด ๊ฐ์ฒด์˜ ์ฃผ์š” ๋‚ด์šฉ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋งค๋„1ํ˜ธ๊ฐ€: 192500 127
๋งค์ˆ˜1ํ˜ธ๊ฐ€: 192400 1384
KisDomesticOrderbook(
    market='KRX',
    symbol='000660',
    asks=[
        KisDomesticOrderbookItem(price=192500, volume=127),
        KisDomesticOrderbookItem(price=192600, volume=3630),
        KisDomesticOrderbookItem(price=192700, volume=559),
        KisDomesticOrderbookItem(price=192800, volume=693),
        KisDomesticOrderbookItem(price=192900, volume=461),
        KisDomesticOrderbookItem(price=193000, volume=2634),
        KisDomesticOrderbookItem(price=193100, volume=1151),
        KisDomesticOrderbookItem(price=193200, volume=379),
        KisDomesticOrderbookItem(price=193300, volume=842),
        KisDomesticOrderbookItem(price=193400, volume=1159)
    ],
    bids=[
        KisDomesticOrderbookItem(price=192400, volume=1384),
        KisDomesticOrderbookItem(price=192300, volume=2598),
        KisDomesticOrderbookItem(price=192200, volume=7793),
        KisDomesticOrderbookItem(price=192100, volume=12525),
        KisDomesticOrderbookItem(price=192000, volume=13471),
        KisDomesticOrderbookItem(price=191900, volume=10903),
        KisDomesticOrderbookItem(price=191800, volume=31044),
        KisDomesticOrderbookItem(price=191700, volume=930),
        KisDomesticOrderbookItem(price=191600, volume=1280),
        KisDomesticOrderbookItem(price=191500, volume=1921)
    ]
)

2.4. ์žฅ์šด์˜ ์‹œ๊ฐ„ ์กฐํšŒ

kis.trading_hours() ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ตญ๋‚ด ๋ฐ ํ•ด์™ธ ์žฅ์šด์˜ ์‹œ๊ฐ„์„ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

from pykis import KisTradingHours

trading_hours: KisTradingHours = kis.trading_hours("US")

print(repr(trading_hours)) # repr์„ ํ†ตํ•ด ๊ฐ์ฒด์˜ ์ฃผ์š” ๋‚ด์šฉ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
KisForeignTradingHours(
    market='NASDAQ',
    open='09:30:00',
    open_kst='22:30:00',
    close='16:00:00',
    close_kst='05:00:00'
)

3. ์ฃผ๋ฌธ ๋ฐ ์ž”๊ณ  ์กฐํšŒ

๊ณ„์ขŒ์˜ ์ž”๊ณ ๋ฅผ ์กฐํšŒํ•˜๋ ค๋ฉด kis.account() ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ์ž”๊ณ  ์Šค์ฝ”ํ”„ ๊ฐœ์ฒด๋ฅผ ๋ฐ›์•„์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค.

from pykis import KisAccount

account: KisAccount = kis.account() 

3.1. ์˜ˆ์ˆ˜๊ธˆ ๋ฐ ๋ณด์œ  ์ข…๋ชฉ ์กฐํšŒ

account.balance() ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ์˜ˆ์ˆ˜๊ธˆ ๋ฐ ๋ณด์œ  ์ข…๋ชฉ์„ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

from pykis import KisBalance

balance: KisBalance = account.balance()

print(repr(balance)) # repr์„ ํ†ตํ•ด ๊ฐ์ฒด์˜ ์ฃผ์š” ๋‚ด์šฉ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
KisIntegrationBalance(
    account_number=KisAccountNumber('50113500-01'),
    deposits={
        'KRW': KisDomesticDeposit(account_number=KisAccountNumber('50113500-01'), currency='KRW', amount=2447692, exchange_rate=1),
        'USD': KisForeignPresentDeposit(account_number=KisAccountNumber('50113500-01'), currency='USD', amount=0, exchange_rate=1384.6),
    },
    stocks=[
        KisDomesticBalanceStock(account_number=KisAccountNumber('50113500-01'), market='KRX', symbol='000660', qty=14, price=192600, amount=2696400, profit=22900, profit_rate=0.856555077613615111277351786),
        KisDomesticBalanceStock(account_number=KisAccountNumber('50113500-01'), market='KRX', symbol='039200', qty=118, price=39600, amount=4672800, profit=-199500, profit_rate=-4.094575457176282248630010467)
    ],
    purchase_amount=7545800,
    current_amount=7369200,
    profit=-176600,
    profit_rate=-2.340374778022211031302181346
)

3.2. ๊ธฐ๊ฐ„ ์†์ต ์กฐํšŒ

account.profits() ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ธฐ๊ฐ„ ์†์ต์„ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (๋ชจ์˜ํˆฌ์ž์—์„œ๋Š” ์กฐํšŒ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.)

from datetime import date
from pykis import KisOrderProfits

profits: KisOrderProfits =account.profits(start=date(2023, 8, 1))

print(repr(profits)) # repr์„ ํ†ตํ•ด ๊ฐ์ฒด์˜ ์ฃผ์š” ๋‚ด์šฉ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
KisIntegrationOrderProfits(
    account_number=KisAccountNumber('00000000-01'),
    buy_amount=8456747.364,
    sell_amount=8458122.90431,
    profit=1375.54031,
    orders=[
        KisDomesticOrderProfit(time_kst='2024-07-11T00:00:00+09:00', market='KRX', symbol='462870', name='์‹œํ”„ํŠธ์—…', buy_price=60000, sell_price=85000, qty=1, profit=25000, profit_rate=41.66666666666666666666666667),
        KisForeignOrderProfit(time_kst='2024-06-18T00:00:00+09:00', market='NASDAQ', symbol='ARM', name='์—์ด์•Œ์—  ํ™€๋”ฉ์Šค(ADR)', buy_price=135.39, sell_price=161.14, qty=7, profit=180.25, profit_rate=19.01912992096905236723539405),
        KisForeignOrderProfit(time_kst='2024-05-23T00:00:00+09:00', market='NYSE', symbol='CPNG', name='์ฟ ํŒก', buy_price=17.55, sell_price=22.3601, qty=1, profit=4.8101, profit_rate=27.40797720797720797720797721),
        KisDomesticOrderProfit(time_kst='2024-04-01T00:00:00+09:00', market='KRX', symbol='005930', name='์‚ผ์„ฑ์ „์ž', buy_price=81700, sell_price=83200, qty=7, profit=10500, profit_rate=1.835985312117503059975520196),
        KisForeignOrderProfit(time_kst='2024-02-29T00:00:00+09:00', market='NASDAQ', symbol='MARA', name='๋งค๋Ÿฌ์„  ๋””์ง€ํ„ธ ํ™€๋”ฉ์Šค', buy_price=32.8718, sell_price=29.41, qty=37, profit=-128.09, profit_rate=-10.53146531169322348839886209),
        KisForeignOrderProfit(time_kst='2024-02-28T00:00:00+09:00', market='NASDAQ', symbol='NVDA', name='์—”๋น„๋””์•„', buy_price=738, sell_price=787.2, qty=1, profit=49.2, profit_rate=6.666666666666666666666666667),
        KisForeignOrderProfit(time_kst='2024-02-28T00:00:00+09:00', market='NASDAQ', symbol='SOUN', name='์‚ฌ์šด๋“œํ•˜์šด๋“œ AI', buy_price=7.028, sell_price=6.72, qty=45, profit=-13.86, profit_rate=-4.382470119521912350597609562),
        KisForeignOrderProfit(time_kst='2024-02-16T00:00:00+09:00', market='NASDAQ', symbol='AAPL', name='์• ํ”Œ', buy_price=194, sell_price=184.46, qty=11, profit=-104.94, profit_rate=-4.917525773195876288659793814),
        KisForeignOrderProfit(time_kst='2024-02-16T00:00:00+09:00', market='NYSE', symbol='CPNG', name='์ฟ ํŒก', buy_price=17.71, sell_price=15.76, qty=8, profit=-15.6, profit_rate=-11.01072840203274985883681536),
        KisForeignOrderProfit(time_kst='2023-12-13T00:00:00+09:00', market='NYSE', symbol='WMT', name='์›”๋งˆํŠธ', buy_price=159.09, sell_price=151.36, qty=1, profit=-7.73, profit_rate=-4.858884907913759507197183984),
        KisDomesticOrderProfit(time_kst='2023-09-04T00:00:00+09:00', market='KRX', symbol='389500', name='์—์Šค๋น„๋น„ํ…Œํฌ', buy_price=55400, sell_price=59200, qty=1, profit=3800, profit_rate=6.859205776173285198555956679),
        KisDomesticOrderProfit(time_kst='2023-08-09T00:00:00+09:00', market='KRX', symbol='228760', name='์ง€๋…ธ๋ฏนํŠธ๋ฆฌ', buy_price=22200, sell_price=22250, qty=4, profit=200, profit_rate=0.2252252252252252252252252252),
        KisDomesticOrderProfit(time_kst='2023-08-09T00:00:00+09:00', market='KRX', symbol='008930', name='ํ•œ๋ฏธ์‚ฌ์ด์–ธ์Šค', buy_price=39600, sell_price=40200, qty=2, profit=1200, profit_rate=1.515151515151515151515151515)
    ]
)

3.3. ์ผ๋ณ„ ์ฒด๊ฒฐ ๋‚ด์—ญ ์กฐํšŒ

account.daily_orders() ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ์ผ๋ณ„ ์ฒด๊ฒฐ ๋‚ด์—ญ์„ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

from datetime import date
from pykis import KisDailyOrders

daily_orders: KisDailyOrders = account.daily_orders(start=date(2024, 4, 2), end=date(2024, 6, 1))

print(repr(daily_orders)) # repr์„ ํ†ตํ•ด ๊ฐ์ฒด์˜ ์ฃผ์š” ๋‚ด์šฉ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
KisIntegrationDailyOrders(
    account_number=KisAccountNumber('00000000-01'),
    orders=[
        KisForeignDailyOrder(
            order_number=KisOrderBase(
                kis=kis,
                account_number=KisAccountNumber('00000000-01'),
                code='CPNG',
                market='NYSE',
                branch='01790',
                number='0030677379'
            ),
            type='sell',
            price=22.3601,
            qty=1,
            executed_qty=1
        ),
        KisForeignDailyOrder(
            order_number=KisOrderBase(
                kis=kis,
                account_number=KisAccountNumber('00000000-01'),
                code='NVDA',
                market='NASDAQ',
                branch='01790',
                number='0000018511'
            ),
            type='buy',
            price=0,
            qty=1,
            executed_qty=0
        ),
        KisForeignDailyOrder(
            order_number=KisOrderBase(
                kis=kis,
                account_number=KisAccountNumber('00000000-01'),
                code='NVDA',
                market='NASDAQ',
                branch='01790',
                number='0000011574'
            ),
            type='buy',
            price=0,
            qty=1,
            executed_qty=0
        )
    ]
)

3.4. ๋งค์ˆ˜ ๊ฐ€๋Šฅ ๊ธˆ์•ก/์ˆ˜๋Ÿ‰ ์กฐํšŒ

account.orderable_amount() ๋˜๋Š” stock.orderable_amount() ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ๋งค์ˆ˜ ๊ฐ€๋Šฅ ๊ธˆ์•ก/์ˆ˜๋Ÿ‰์„ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

from pykis import KisOrderableAmount

# ์—”๋น„๋””์•„ ์ฃผ๊ฐ„๊ฑฐ๋ž˜ ์‹œ์žฅ๊ฐ€ ๋งค์ˆ˜ ๊ฐ€๋Šฅ ๊ธˆ์•ก ์กฐํšŒ
orderable_amount: KisOrderableAmount = account.orderable_amount(
    market="NASDAQ",
    symbol="NVDA",
    condition="extended"
)

print(repr(orderable_amount)) # repr์„ ํ†ตํ•ด ๊ฐ์ฒด์˜ ์ฃผ์š” ๋‚ด์šฉ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

# ์˜ค์Šค์ฝ”ํ… ๋‹จ๊ฐ€ 40,950์› ๋งค์ˆ˜ ๊ฐ€๋Šฅ ๊ธˆ์•ก ์กฐํšŒ
orderable_amount: KisOrderableAmount = oscotec.orderable_amount(price=40950)

print(repr(orderable_amount)) # repr์„ ํ†ตํ•ด ๊ฐ์ฒด์˜ ์ฃผ์š” ๋‚ด์šฉ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
KisForeignOrderableAmount(
    account_number=KisAccountNumber('50113500-01'),
    symbol='NVDA',
    market='NASDAQ',
    unit_price=109.18,
    qty=906,
    amount=100000,
    condition='extended',
    execution=None
)
KisDomesticOrderableAmount(
    account_number=KisAccountNumber('50113500-01'),
    symbol='039200',
    market='KRX',
    unit_price=40950,
    qty=59,
    amount=2435453,
    condition=None,
    execution=None
)

3.5. ๋งค๋„ ๊ฐ€๋Šฅ ์ˆ˜๋Ÿ‰ ์กฐํšŒ

๋งค๋„ ๊ฐ€๋Šฅ ์ˆ˜๋Ÿ‰์€ account.balance()์˜ KisBalanceStock ๊ฐ์ฒด ๋˜๋Š” KisStock์˜ ๋‹จ์ถ• ํ”„๋กœํผํ‹ฐ๋ฅผ ์ด์šฉํ•˜์—ฌ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ์ž”๊ณ  ์Šค์ฝ”ํ”„์˜ KisBalanceStock ๊ฐ์ฒด๋ฅผ ์ด์šฉํ•˜์—ฌ ์กฐํšŒํ•˜๋Š” ๋ฐฉ๋ฒ•

    from pykis import KisBalanceStock
    
    # ์˜ค์Šค์ฝ”ํ… ๋งค๋„ ๊ฐ€๋Šฅ ์ˆ˜๋Ÿ‰ ์กฐํšŒ
    balance_stock: KisBalanceStock = account.balance().stocks[1]
    balance_stock: KisBalanceStock | None = account.balance().stock("039200")
    
    print(balance_stock.orderable) # ๋งค๋„ ๊ฐ€๋Šฅ ์ˆ˜๋Ÿ‰
    Decimal('118')
  2. ์ข…๋ชฉ ์Šค์ฝ”ํ”„์˜ ๋‹จ์ถ• ํ”„๋กœํผํ‹ฐ๋ฅผ ์ด์šฉํ•˜์—ฌ ์กฐํšŒํ•˜๋Š” ๋ฐฉ๋ฒ•

    oscotec = kis.stock("039200")
    
    # ์˜ค์Šค์ฝ”ํ… ๋งค๋„ ๊ฐ€๋Šฅ ์ˆ˜๋Ÿ‰ ์กฐํšŒ
    print(oscotec.orderable) # ๋งค๋„ ๊ฐ€๋Šฅ ์ˆ˜๋Ÿ‰
    Decimal('118')

3.6. ๋ฏธ์ฒด๊ฒฐ ์ฃผ๋ฌธ ์กฐํšŒ

account.pending_orders() ๋˜๋Š” stock.pending_orders() ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฏธ์ฒด๊ฒฐ ์ฃผ๋ฌธ์„ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (๊ตญ๋‚ด ๋ชจ์˜ํˆฌ์ž๋Š” ์กฐํšŒ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.)

from pykis import KisPendingOrders

# ๊ณ„์ขŒ์˜ ๋ฏธ์ฒด๊ฒฐ ์ฃผ๋ฌธ ์กฐํšŒ
pending_orders: KisPendingOrders = account.pending_orders()
# ํŠน์ • ์ข…๋ชฉ์˜ ๋ฏธ์ฒด๊ฒฐ ์ฃผ๋ฌธ ์กฐํšŒ
pending_orders: KisPendingOrders = oscotec.pending_orders()

print(repr(pending_orders)) # repr์„ ํ†ตํ•ด ๊ฐ์ฒด์˜ ์ฃผ์š” ๋‚ด์šฉ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
KisSimplePendingOrders(
    account_number=KisAccountNumber('00000000-01'),
    orders=[
        KisDomesticPendingOrder(
            order_number=KisOrderBase(
                kis=kis,
                account_number=KisAccountNumber('00000000-01'),
                code='039200',
                market='KRX',
                branch='91253',
                number='0000157444'
            ),
            type='buy',
            price=41300,
            qty=2,
            executed_qty=0,
            condition=None,
            execution=None
        )
    ]
)

3.7. ๋งค๋„/๋งค์ˆ˜ ์ฃผ๋ฌธ ๋ฐ ์ •์ •/์ทจ์†Œ

stock.order(), stock.buy(), stock.sell(), stock.modify(), stock.cancel() ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ๋งค์ˆ˜/๋งค๋„ ์ฃผ๋ฌธ ๋ฐ ์ •์ •/์ทจ์†Œ๋ฅผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3.7.1. ๋งค์ˆ˜/๋งค๋„ ์ฃผ๋ฌธ

from pykis import KisOrder

# SKํ•˜์ด๋‹‰์Šค 1์ฃผ ์‹œ์žฅ๊ฐ€ ๋งค์ˆ˜ ์ฃผ๋ฌธ
order: KisOrder = hynix.buy(qty=1)
# SKํ•˜์ด๋‹‰์Šค 1์ฃผ ์ง€์ •๊ฐ€ ๋งค์ˆ˜ ์ฃผ๋ฌธ
order: KisOrder = hynix.buy(price=194700, qty=1)
# SKํ•˜์ด๋‹‰์Šค ์ „๋Ÿ‰ ์‹œ์žฅ๊ฐ€ ๋งค๋„ ์ฃผ๋ฌธ
order: KisOrder = hynix.sell()
# SKํ•˜์ด๋‹‰์Šค ์ „๋Ÿ‰ ์ง€์ •๊ฐ€ ๋งค๋„ ์ฃผ๋ฌธ
order: KisOrder = hynix.sell(price=194700)

stock.buy(price=100, condition=None, execution=None) # ์ „์ฒด ์ง€์ •๊ฐ€ ๋งค์ˆ˜
stock.buy(price=None, condition=None, execution=None) # ์ „์ฒด ์‹œ์žฅ๊ฐ€ ๋งค์ˆ˜
stock.buy(price=100, condition=None, execution=None) # ์ง€์ •๊ฐ€ ๋งค์ˆ˜
stock.buy(price=None, condition=None, execution=None) # ์‹œ์žฅ๊ฐ€ ๋งค์ˆ˜
stock.buy(price=100, condition='condition', execution=None) # ์กฐ๊ฑด๋ถ€์ง€์ •๊ฐ€ ๋งค์ˆ˜
stock.buy(price=100, condition='best', execution=None) # ์ตœ์œ ๋ฆฌ์ง€์ •๊ฐ€ ๋งค์ˆ˜
stock.buy(price=100, condition='priority', execution=None) # ์ตœ์šฐ์„ ์ง€์ •๊ฐ€ ๋งค์ˆ˜
stock.buy(price=100, condition='extended', execution=None) # ์‹œ๊ฐ„์™ธ๋‹จ์ผ๊ฐ€ ๋งค์ˆ˜ (๋ชจ์˜ํˆฌ์ž ๋ฏธ์ง€์›)
stock.buy(price=None, condition='before', execution=None) # ์žฅ์ „์‹œ๊ฐ„์™ธ ๋งค์ˆ˜ (๋ชจ์˜ํˆฌ์ž ๋ฏธ์ง€์›)
stock.buy(price=None, condition='after', execution=None) # ์žฅํ›„์‹œ๊ฐ„์™ธ ๋งค์ˆ˜ (๋ชจ์˜ํˆฌ์ž ๋ฏธ์ง€์›)
stock.buy(price=100, condition=None, execution='IOC') # IOC์ง€์ •๊ฐ€ ๋งค์ˆ˜ (๋ชจ์˜ํˆฌ์ž ๋ฏธ์ง€์›)
stock.buy(price=100, condition=None, execution='FOK') # FOK์ง€์ •๊ฐ€ ๋งค์ˆ˜ (๋ชจ์˜ํˆฌ์ž ๋ฏธ์ง€์›)
stock.buy(price=None, condition=None, execution='IOC') # IOC์‹œ์žฅ๊ฐ€ ๋งค์ˆ˜ (๋ชจ์˜ํˆฌ์ž ๋ฏธ์ง€์›)
stock.buy(price=None, condition=None, execution='FOK') # FOK์‹œ์žฅ๊ฐ€ ๋งค์ˆ˜ (๋ชจ์˜ํˆฌ์ž ๋ฏธ์ง€์›)
stock.buy(price=100, condition='best', execution='IOC') # IOC์ตœ์œ ๋ฆฌ ๋งค์ˆ˜ (๋ชจ์˜ํˆฌ์ž ๋ฏธ์ง€์›)
stock.buy(price=100, condition='best', execution='FOK') # FOK์ตœ์œ ๋ฆฌ ๋งค์ˆ˜ (๋ชจ์˜ํˆฌ์ž ๋ฏธ์ง€์›)
stock.buy(price=100, condition='LOO', execution=None) # ๋‚˜์Šค๋‹ฅ, ๋‰ด์š•, ์•„๋ฉ•์Šค ์žฅ๊ฐœ์‹œ์ง€์ •๊ฐ€ ๋งค์ˆ˜ (๋ชจ์˜ํˆฌ์ž ๋ฏธ์ง€์›)
stock.buy(price=100, condition='LOC', execution=None) # ๋‚˜์Šค๋‹ฅ, ๋‰ด์š•, ์•„๋ฉ•์Šค ์žฅ๋งˆ๊ฐ์ง€์ •๊ฐ€ ๋งค์ˆ˜ (๋ชจ์˜ํˆฌ์ž ๋ฏธ์ง€์›)
stock.buy(price=None, condition='MOO', execution=None) # ๋‚˜์Šค๋‹ฅ, ๋‰ด์š•, ์•„๋ฉ•์Šค ์žฅ๊ฐœ์‹œ์‹œ์žฅ๊ฐ€ ๋งค์ˆ˜ (๋ชจ์˜ํˆฌ์ž ๋ฏธ์ง€์›)
stock.buy(price=None, condition='MOC', execution=None) # ๋‚˜์Šค๋‹ฅ, ๋‰ด์š•, ์•„๋ฉ•์Šค ์žฅ๋งˆ๊ฐ์‹œ์žฅ๊ฐ€ ๋งค์ˆ˜ (๋ชจ์˜ํˆฌ์ž ๋ฏธ์ง€์›)
stock.buy(price=None, condition='extended', execution=None) # ๋‚˜์Šค๋‹ฅ, ๋‰ด์š•, ์•„๋ฉ•์Šค ์ฃผ๊ฐ„๊ฑฐ๋ž˜ ์‹œ์žฅ๊ฐ€ ๋งค์ˆ˜ (๋ชจ์˜ํˆฌ์ž ๋ฏธ์ง€์›)
stock.buy(price=100, condition='extended', execution=None) # ๋‚˜์Šค๋‹ฅ, ๋‰ด์š•, ์•„๋ฉ•์Šค ์ฃผ๊ฐ„๊ฑฐ๋ž˜ ์ง€์ •๊ฐ€ ๋งค์ˆ˜ (๋ชจ์˜ํˆฌ์ž ๋ฏธ์ง€์›)

stock.sell(price=100, condition=None, execution=None) # ์ „์ฒด ์ง€์ •๊ฐ€ ๋งค๋„
stock.sell(price=None, condition=None, execution=None) # ์ „์ฒด ์‹œ์žฅ๊ฐ€ ๋งค๋„
stock.sell(price=100, condition=None, execution=None) # ์ง€์ •๊ฐ€ ๋งค๋„
stock.sell(price=None, condition=None, execution=None) # ์‹œ์žฅ๊ฐ€ ๋งค๋„
stock.sell(price=100, condition='condition', execution=None) # ์กฐ๊ฑด๋ถ€์ง€์ •๊ฐ€ ๋งค๋„
stock.sell(price=100, condition='best', execution=None) # ์ตœ์œ ๋ฆฌ์ง€์ •๊ฐ€ ๋งค๋„
stock.sell(price=100, condition='priority', execution=None) # ์ตœ์šฐ์„ ์ง€์ •๊ฐ€ ๋งค๋„
stock.sell(price=100, condition='extended', execution=None) # ์‹œ๊ฐ„์™ธ๋‹จ์ผ๊ฐ€ ๋งค๋„ (๋ชจ์˜ํˆฌ์ž ๋ฏธ์ง€์›)
stock.sell(price=None, condition='before', execution=None) # ์žฅ์ „์‹œ๊ฐ„์™ธ ๋งค๋„ (๋ชจ์˜ํˆฌ์ž ๋ฏธ์ง€์›)
stock.sell(price=None, condition='after', execution=None) # ์žฅํ›„์‹œ๊ฐ„์™ธ ๋งค๋„
stock.sell(price=100, condition=None, execution='IOC') # IOC์ง€์ •๊ฐ€ ๋งค๋„ (๋ชจ์˜ํˆฌ์ž ๋ฏธ์ง€์›)
stock.sell(price=100, condition=None, execution='FOK') # FOK์ง€์ •๊ฐ€ ๋งค๋„ (๋ชจ์˜ํˆฌ์ž ๋ฏธ์ง€์›)
stock.sell(price=None, condition=None, execution='IOC') # IOC์‹œ์žฅ๊ฐ€ ๋งค๋„ (๋ชจ์˜ํˆฌ์ž ๋ฏธ์ง€์›)
stock.sell(price=None, condition=None, execution='FOK') # FOK์‹œ์žฅ๊ฐ€ ๋งค๋„ (๋ชจ์˜ํˆฌ์ž ๋ฏธ์ง€์›)
stock.sell(price=100, condition='best', execution='IOC') # IOC์ตœ์œ ๋ฆฌ ๋งค๋„ (๋ชจ์˜ํˆฌ์ž ๋ฏธ์ง€์›)
stock.sell(price=100, condition='best', execution='FOK') # FOK์ตœ์œ ๋ฆฌ ๋งค๋„ (๋ชจ์˜ํˆฌ์ž ๋ฏธ์ง€์›)
stock.sell(price=100, condition='LOO', execution=None) # ๋‚˜์Šค๋‹ฅ, ๋‰ด์š•, ์•„๋ฉ•์Šค ์žฅ๊ฐœ์‹œ์ง€์ •๊ฐ€ ๋งค๋„ (๋ชจ์˜ํˆฌ์ž ๋ฏธ์ง€์›)
stock.sell(price=100, condition='LOC', execution=None) # ๋‚˜์Šค๋‹ฅ, ๋‰ด์š•, ์•„๋ฉ•์Šค ์žฅ๋งˆ๊ฐ์ง€์ •๊ฐ€ ๋งค๋„ (๋ชจ์˜ํˆฌ์ž ๋ฏธ์ง€์›)
stock.sell(price=None, condition='MOO', execution=None) # ๋‚˜์Šค๋‹ฅ, ๋‰ด์š•, ์•„๋ฉ•์Šค ์žฅ๊ฐœ์‹œ์‹œ์žฅ๊ฐ€ ๋งค๋„ (๋ชจ์˜ํˆฌ์ž ๋ฏธ์ง€์›)
stock.sell(price=None, condition='MOC', execution=None) # ๋‚˜์Šค๋‹ฅ, ๋‰ด์š•, ์•„๋ฉ•์Šค ์žฅ๋งˆ๊ฐ์‹œ์žฅ๊ฐ€ ๋งค๋„ (๋ชจ์˜ํˆฌ์ž ๋ฏธ์ง€์›)
stock.sell(price=None, condition='extended', execution=None) # ๋‚˜์Šค๋‹ฅ, ๋‰ด์š•, ์•„๋ฉ•์Šค ์ฃผ๊ฐ„๊ฑฐ๋ž˜ ์‹œ์žฅ๊ฐ€ ๋งค๋„ (๋ชจ์˜ํˆฌ์ž ๋ฏธ์ง€์›)
stock.sell(price=100, condition='extended', execution=None) # ๋‚˜์Šค๋‹ฅ, ๋‰ด์š•, ์•„๋ฉ•์Šค ์ฃผ๊ฐ„๊ฑฐ๋ž˜ ์ง€์ •๊ฐ€ ๋งค๋„ (๋ชจ์˜ํˆฌ์ž ๋ฏธ์ง€์›)

3.7.2. ์ฃผ๋ฌธ ์ •์ •

from pykis import KisOrder

order: KisOrder = hynix.buy(price=194700, qty=1) # ๋งค์ˆ˜ ์ฃผ๋ฌธ

print(order.pending) # ๋ฏธ์ฒด๊ฒฐ ์ฃผ๋ฌธ์ธ์ง€ ์—ฌ๋ถ€
print(order.pending_order.pending_qty) # ๋ฏธ์ฒด๊ฒฐ ์ˆ˜๋Ÿ‰

order: KisOrder = order.modify(price=195000) # ๋‹จ๊ฐ€ ์ •์ •
order: KisOrder = order.modify(qty=10) # ์ˆ˜๋Ÿ‰ ์ •์ •

order.cancel() # ์ฃผ๋ฌธ ์ทจ์†Œ

# ๋ฏธ์ฒด๊ฒฐ ์ฃผ๋ฌธ ์ „์ฒด ์ทจ์†Œ
for order in account.pending_orders():
    order.cancel()

4. ์‹ค์‹œ๊ฐ„ ์ด๋ฒคํŠธ ์ˆ˜์‹ 

PyKis์˜ ์›น์†Œ์ผ“ ์—ฐ๊ฒฐ๊ณผ ๊ตฌ๋… ๊ด€๋ฆฌ๋Š” ๋ชจ๋‘ ์ž๋™์œผ๋กœ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ™œ์šฉ์‹œ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋‹์‹œ ๋ฐœ๊ธ‰๋˜๋Š” ํ‹ฐ์ผ“๋งŒ ๊ด€๋ฆฌํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

ํ‹ฐ์ผ“์€ Python GC์— ์˜ํ•ด ์†Œ๋ฉธ๋˜๊ธฐ ์ „๊นŒ์ง€ ์›น์†Œ์ผ“ ๊ตฌ๋…์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๋™์ผ ์ด๋ฒคํŠธ๋ฅผ ๋‹ค์ค‘ ์ˆ˜์‹ ํ•˜๋”๋ผ๋„ ๋ž˜ํผ๋Ÿฐ์Šค ์นด์šดํ„ฐ์— ์˜ํ•ด ์•ˆ์ „ํ•˜๊ฒŒ ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

4.1. ์ด๋ฒคํŠธ ์ˆ˜์‹ ์„ ํ–ˆ๋Š”๋ฐ, ๋ฐ”๋กœ ์ทจ์†Œ๋ฉ๋‹ˆ๋‹ค.

์ด๋ฒคํŠธ ์ˆ˜์‹ ์„ ํ–ˆ๋Š”๋ฐ, ๋ฐ”๋กœ ์ทจ์†Œ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ด๋ฒคํŠธ ์ˆ˜์‹ ์„ ์œ„ํ•œ ํ‹ฐ์ผ“์ด GC์— ์˜ํ•ด ์†Œ๋ฉธ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์•„๋ž˜์™€ ๊ฐ™์€ ์ฝ”๋“œ์—์„œ ํ‹ฐ์ผ“์ด ์†Œ๋ฉธ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

from pykis import PyKis, KisWebsocketClient, KisSubscriptionEventArgs, KisRealtimePrice

kis = PyKis("secret.json", keep_token=True)

def on_price(sender: KisWebsocketClient, e: KisSubscriptionEventArgs[KisRealtimePrice]):
    print(e.response)

def add_event():
    # ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋‹ ํ•จ์ˆ˜๋Š” ๋ชจ๋‘ KisEventTicket์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
    # ํ•ด๋‹น ํ‹ฐ์ผ“์„ ๊ด€๋ฆฌํ•˜์ง€ ์•Š์œผ๋ฉด GC์— ์˜ํ•ด ์†Œ๋ฉธ๋ฉ๋‹ˆ๋‹ค.
    kis.stock("000660").on("price", on_price)
    kis.stock("005930").on("price", on_price)
    kis.stock("039200").on("price", on_price)

add_event()

print(kis.websocket.subscriptions) # ํ˜„์žฌ ๊ตฌ๋…์ค‘์ธ ์ด๋ฒคํŠธ ๋ชฉ๋ก

input("Press Enter to exit...")
[07/31 16:51:27] INFO: RTC Connected to real server
[07/31 16:51:27] INFO: RTC Subscribed to H0STCNT0.005930
[07/31 16:51:27] INFO: RTC Unsubscribed from H0STCNT0.005930
[07/31 16:51:27] INFO: RTC Subscribed to H0STCNT0.039200
set() # ๊ตฌ๋…์ค‘์ธ ์ด๋ฒคํŠธ ๋ชฉ๋ก์ด ๋น„์–ด์žˆ์Šต๋‹ˆ๋‹ค.
Press Enter to exit...
[07/31 16:51:27] INFO: RTC Unsubscribed from H0STCNT0.039200

ํ•ด๋‹น ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด 2๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ํ‹ฐ์ผ“์„ ์ „์—ญ ๋ณ€์ˆ˜๋กœ ์œ ์ง€ํ•˜์—ฌ GC์— ์˜ํ•ด ์†Œ๋ฉธ๋˜์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
    tickets = []
    
     def add_event():
          tickets.append(kis.stock("000660").on("price", on_price))
          tickets.append(kis.stock("005930").on("price", on_price))
          tickets.append(kis.stock("039200").on("price", on_price))
    
     add_event()
    
     print(kis.websocket.subscriptions) # ํ˜„์žฌ ๊ตฌ๋…์ค‘์ธ ์ด๋ฒคํŠธ ๋ชฉ๋ก
    
     input("Press Enter to exit...")
    
     for ticket in tickets:
         ticket.unsubscribe()
  2. with ๊ตฌ๋ฌธ์„ ์ด์šฉํ•˜์—ฌ ๋ฒ”์œ„ ๋‚ด์—์„œ๋งŒ ํ‹ฐ์ผ“์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
     def add_event():
         with kis.stock("000660").on("price", on_price) as ticket:
             input("Press Enter to exit...")
    
     add_event()
  3. ํ‹ฐ์ผ“์ด GC์— ์˜ํ•ด ๊ตฌ๋… ์ทจ์†Œ๋˜์ง€ ์•Š๋„๋ก ํ”Œ๋ž˜๊ทธ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
     def add_event():
         kis.stock("000660").on("price", on_price).suppress()
         kis.stock("005930").on("price", on_price).suppress()
         kis.stock("039200").on("price", on_price).suppress()
    
     add_event()
    
     print(kis.websocket.subscriptions) # ํ˜„์žฌ ๊ตฌ๋…์ค‘์ธ ์ด๋ฒคํŠธ ๋ชฉ๋ก
    
     input("Press Enter to exit...")

4.2. ์‹ค์‹œ๊ฐ„ ์ฒด๊ฒฐ๊ฐ€ ์กฐํšŒ

๊ตญ๋‚ด์ฃผ์‹ ๋ฐ ํ•ด์™ธ์ฃผ์‹์˜ ์‹ค์‹œ๊ฐ„ ์ฒด๊ฒฐ๊ฐ€ ์กฐํšŒ๋Š” stock.on("price", callback) ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ์ˆ˜์‹ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

from pykis import KisRealtimePrice, KisSubscriptionEventArgs, KisWebsocketClient, PyKis

def on_price(sender: KisWebsocketClient, e: KisSubscriptionEventArgs[KisRealtimePrice]):
    print(e.response)

ticket = hynix.on("price", on_price)

print(kis.websocket.subscriptions) # ํ˜„์žฌ ๊ตฌ๋…์ค‘์ธ ์ด๋ฒคํŠธ ๋ชฉ๋ก

input("Press Enter to exit...")

ticket.unsubscribe()
{KisWebsocketTR(id='H0STCNT0', key='000660')}
Press Enter to exit...
[08/02 13:50:42] INFO: RTC Connected to real server
[08/02 13:50:42] INFO: RTC Restoring subscriptions... H0STCNT0.000660
[08/02 13:50:42] INFO: RTC Subscribed to H0STCNT0.000660
KisDomesticRealtimePrice(market='KRX', symbol='000660', time='2024-08-02T13:50:44+09:00', price=174900, change=-18400, volume=8919304, amount=1587870362300)
KisDomesticRealtimePrice(market='KRX', symbol='000660', time='2024-08-02T13:50:44+09:00', price=174800, change=-18500, volume=8919354, amount=1587879102300)
KisDomesticRealtimePrice(market='KRX', symbol='000660', time='2024-08-02T13:50:45+09:00', price=174800, change=-18500, volume=8919358, amount=1587879801500)
KisDomesticRealtimePrice(market='KRX', symbol='000660', time='2024-08-02T13:50:45+09:00', price=174900, change=-18400, volume=8920313, amount=1588046831000)
KisDomesticRealtimePrice(market='KRX', symbol='000660', time='2024-08-02T13:50:45+09:00', price=174800, change=-18500, volume=8920319, amount=1588047879800)

[08/02 13:50:48] INFO: RTC Unsubscribed from H0STCNT0.000660

4.3. ์‹ค์‹œ๊ฐ„ ํ˜ธ๊ฐ€ ์กฐํšŒ

๊ตญ๋‚ด์ฃผ์‹ ๋ฐ ํ•ด์™ธ์ฃผ์‹์˜ ์‹ค์‹œ๊ฐ„ ํ˜ธ๊ฐ€ ์กฐํšŒ๋Š” stock.on("orderbook", callback) ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ์ˆ˜์‹ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

from pykis import KisRealtimeOrderbook, KisSubscriptionEventArgs, KisWebsocketClient, PyKis

def on_orderbook(sender: KisWebsocketClient, e: KisSubscriptionEventArgs[KisRealtimeOrderbook]):
    print(e.response)

ticket = hynix.on("orderbook", on_orderbook)

print(kis.websocket.subscriptions) # ํ˜„์žฌ ๊ตฌ๋…์ค‘์ธ ์ด๋ฒคํŠธ ๋ชฉ๋ก

input("Press Enter to exit...")

ticket.unsubscribe()
{KisWebsocketTR(id='H0STASP0', key='000660')}
Press Enter to exit...
[08/02 14:22:52] INFO: RTC Connected to real server
[08/02 14:22:52] INFO: RTC Restoring subscriptions... H0STASP0.000660
[08/02 14:22:52] INFO: RTC Subscribed to H0STASP0.000660
KisDomesticRealtimeOrderbook(
    market='KRX',
    symbol='000660',
    asks=[
        KisDomesticRealtimeOrderbookItem(price=174000, volume=10689),
        KisDomesticRealtimeOrderbookItem(price=174100, volume=7197),
        KisDomesticRealtimeOrderbookItem(price=174200, volume=3430),
        KisDomesticRealtimeOrderbookItem(price=174300, volume=3120),
        KisDomesticRealtimeOrderbookItem(price=174400, volume=4865),
        KisDomesticRealtimeOrderbookItem(price=174500, volume=477),
        KisDomesticRealtimeOrderbookItem(price=174600, volume=1818),
        KisDomesticRealtimeOrderbookItem(price=174700, volume=3344),
        KisDomesticRealtimeOrderbookItem(price=174800, volume=2184),
        KisDomesticRealtimeOrderbookItem(price=174900, volume=2266)
    ],
    bids=[
        KisDomesticRealtimeOrderbookItem(price=173900, volume=12054),
        KisDomesticRealtimeOrderbookItem(price=173800, volume=15792),
        KisDomesticRealtimeOrderbookItem(price=173700, volume=12568),
        KisDomesticRealtimeOrderbookItem(price=173600, volume=19204),
        KisDomesticRealtimeOrderbookItem(price=173500, volume=71514),
        KisDomesticRealtimeOrderbookItem(price=173400, volume=6470),
        KisDomesticRealtimeOrderbookItem(price=173300, volume=9029),
        KisDomesticRealtimeOrderbookItem(price=173200, volume=8204),
        KisDomesticRealtimeOrderbookItem(price=173100, volume=15445),
        KisDomesticRealtimeOrderbookItem(price=173000, volume=36000)
    ]
)

[08/02 14:22:56] INFO: RTC Unsubscribed from H0STASP0.000660

4.4. ์‹ค์‹œ๊ฐ„ ์ฒด๊ฒฐ๋‚ด์—ญ ์กฐํšŒ

๊ตญ๋‚ด์ฃผ์‹ ๋ฐ ํ•ด์™ธ์ฃผ์‹์˜ ์‹ค์‹œ๊ฐ„ ์ฒด๊ฒฐ๋‚ด์—ญ ์กฐํšŒ๋Š” account.on("execution", callback) ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ์ˆ˜์‹ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

from pykis import KisRealtimeExecution, KisSubscriptionEventArgs, KisWebsocketClient

account = kis.account()

def on_execution(sender: KisWebsocketClient, e: KisSubscriptionEventArgs[KisRealtimeExecution]):
    print(e.response)


ticket = account.on("execution", on_execution)

print(kis.websocket.subscriptions)  # ํ˜„์žฌ ๊ตฌ๋…์ค‘์ธ ์ด๋ฒคํŠธ ๋ชฉ๋ก

input("Press Enter to exit...")

ticket.unsubscribe()
{KisWebsocketTR(id='H0GSCNI9', key='soju06'), KisWebsocketTR(id='H0STCNI9', key='soju06')}
Press Enter to exit...
[08/02 14:27:24] INFO: RTC Connected to real server
[08/02 14:27:24] INFO: RTC Connected to virtual server
[08/02 14:27:24] INFO: RTC Restoring subscriptions... H0GSCNI9.soju06
[08/02 14:27:24] INFO: RTC Restoring subscriptions... H0STCNI9.soju06
[08/02 14:27:24] INFO: RTC Subscribed to H0STCNI9.soju06
[08/02 14:27:24] INFO: RTC Subscribed to H0GSCNI9.soju06
KisDomesticRealtimeOrderExecution(account_number=KisAccountNumber('50113500-01'), market='KRX', symbol='000660', time='2024-08-02T14:28:25+09:00', type='buy', price=173600, executed_qty=0)
KisDomesticRealtimeOrderExecution(account_number=KisAccountNumber('50113500-01'), market='KRX', symbol='000660', time='2024-08-02T14:28:25+09:00', type='buy', price=173600, executed_qty=10)
KisDomesticRealtimeOrderExecution(account_number=KisAccountNumber('50113500-01'), market='KRX', symbol='000660', time='2024-08-02T14:28:25+09:00', type='buy', price=173600, executed_qty=10)
Clone this wiki locally