๐ ํ์ด์ฌ ํ๊ตญํฌ์์ฆ๊ถ REST ๊ธฐ๋ฐ Trading API ๋ผ์ด๋ธ๋ฌ๋ฆฌ
1. ํ์ด์ฌ์ฉ ํ๊ตญํฌ์์ฆ๊ถ API ์๊ฐ โจ
ํ๊ตญํฌ์์ฆ๊ถ์ ํธ๋ ์ด๋ฉ OPEN API ์๋น์ค๋ฅผ ํ์ด์ฌ ํ๊ฒฝ์์ ์ฌ์ฉํ ์ ์๋๋ก ๋ง๋ ๊ฐ๋ ฅํ ์ปค๋ฎค๋ํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค.
2.0.0 ๋ฒ์ ์ด์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ฌ๊ธฐ, ๋ฌธ์๋ 1, 2, 3์์ ํ์ธํ ์ ์์ต๋๋ค.
1.1. ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํน์ง
๐ ๋ชจ๋ ๊ฐ์ฒด์ ๋ํ Type hint
๐ ๋ณต๊ตฌ ๊ฐ๋ฅํ ์น์์ผ ํด๋ผ์ด์ธํธ
๐๏ธ ํ์ค ์์ด ๋ค์ด๋ฐ
2. ์ฌ์ฉ ์ค๋ช โ๏ธ
OpenAPI ์๋น์ค ์ ์ฒญ ๋ฐฉ๋ฒ
- ํ๊ตญํฌ์์ฆ๊ถ ๊ณ์ข์ ์์ด๋๊ฐ ํ์ํฉ๋๋ค. KIS ํธ๋ ์ด๋ฉ ์๋น์ค๋ KIS Developers ์๋น์ค๋ฅผ ํตํด ์ ์ฒญ ํ ์ ์์ต๋๋ค.
- ์๋น์ค๋ฅผ ์ ์ฒญ์ด ์๋ฃ๋๋ฉด, ์๋์ ๊ฐ์ด ์ฑ ํค๋ฅผ ๋ฐ๊ธ ๋ฐ์ ์ ์์ต๋๋ค.
2.1. ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น ๐ฆ
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํ์ด์ฌ 3.11์ ๊ธฐ์ค์ผ๋ก ์์ฑ๋์์ต๋๋ค.
pip install python-kis
์ฌ์ฉ๋ ๋ชจ๋ ๋ณด๊ธฐ
requests>=2.32.3
websocket-client>=1.8.0
cryptography>=43.0.0
colorlog>=6.8.2
2.2. ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ ๐
2.2.1. PyKis ๊ฐ์ฒด ์์ฑ
- ์ํฌ๋ฆฟ ํค๋ฅผ ํ์ผ๋ก ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ (๊ถ์ฅ)
from pykis import KisAuth
auth = KisAuth( # HTS ๋ก๊ทธ์ธ ID ์) soju06 id="YOURHTSID", # ์ฑ ํค ์) Pa0knAM6JLAjIa93Miajz7ykJIXXXXXXXXXX appkey="YOURAPPKEY", # ์ฑ ์ํฌ๋ฆฟ ํค ์) V9J3YGPE5q2ZRG5EgqnLHn7XqbJjzwXcNpvY . . . secretkey="YOURAPPSECRET", # ์ฑ ํค์ ์ฐ๊ฒฐ๋ ๊ณ์ข๋ฒํธ ์) 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", "virtualsecret.json", keeptoken=True) kis = PyKis(KisAuth.load("secret.json"), KisAuth.load("virtualsecret.json"), keeptoken=True)
- ์ํฌ๋ฆฟ ํค๋ฅผ ์ง์ ์ ๋ ฅํ๋ ๋ฐฉ๋ฒ
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 ์ ์ ํ ํฐ ์๋ ์ ์ฅ )
2.2.2. ์์ธ ์กฐํ
stock.quote() ํจ์๋ฅผ ์ด์ฉํ์ฌ ๊ตญ๋ด์ฃผ์ ๋ฐ ํด์ธ์ฃผ์์ ์์ธ๋ฅผ ์กฐํํ ์ ์์ต๋๋ค.
from pykis import KisQuote
์๋น๋์์ ์ํ ๊ฐ์ฒด๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
stock = kis.stock("NVDA")
quote: KisQuote = stock.quote() quote: KisQuote = stock.quote(extended=True) # ์ฃผ๊ฐ๊ฑฐ๋ ์์ธ
PyKis์ ๋ชจ๋ ๊ฐ์ฒด๋ repr์ ํตํด ์ฃผ์ ๋ด์ฉ์ ํ์ธํ ์ ์์ต๋๋ค.
๋ฐ์ดํฐ๋ฅผ ํ์ธํ๋ ์ฉ๋์ด๋ฏ๋ก ์ค์ ํ๋กํผํฐ ํ์
๊ณผ ๋ค๋ฅผ ์ ์์ต๋๋ค.
print(quote)
KisForeignQuote(
symbol='NVDA',
market='NASDAQ',
name='์๋น๋์',
sector_name='๋ฐ๋์ฒด ๋ฐ ๋ฐ๋์ฒด์ฅ๋น',
volume=1506310,
amount=160791125,
market_cap=2593332000000,
indicator=KisForeignIndicator(
eps=1.71,
bps=2,
per=63.88,
pbr=54.65,
week52_high=140.76,
week52_low=39.2215,
week52highdate='2024-06-20',
week52lowdate='2023-10-31'
),
open=109.21,
high=109.38,
low=104.37,
close=105.42,
change=-3.79,
unit=1,
tick=0.01,
risk='none',
halt=False,
overbought=False
)
2.2.3. ์๊ณ ์กฐํ
account.balance() ํจ์๋ฅผ ์ด์ฉํ์ฌ ์์๊ธ ๋ฐ ๋ณด์ ์ข
๋ชฉ์ ์กฐํํ ์ ์์ต๋๋ค.
from pykis import KisBalance
์ฃผ ๊ณ์ข ๊ฐ์ฒด๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
account = kis.account()
balance: KisBalance = account.balance()
print(repr(balance)) # repr์ ํตํด ๊ฐ์ฒด์ ์ฃผ์ ๋ด์ฉ์ ํ์ธํ ์ ์์ต๋๋ค.
KisIntegrationBalance(
account_number=KisAccountNumber('50113500-01'),
deposits={
'KRW': KisDomesticDeposit(accountnumber=KisAccountNumber('50113500-01'), currency='KRW', amount=2447692, exchangerate=1),
'USD': KisForeignPresentDeposit(accountnumber=KisAccountNumber('50113500-01'), currency='USD', amount=0, exchangerate=1384.6),
},
stocks=[
KisDomesticBalanceStock(accountnumber=KisAccountNumber('50113500-01'), market='KRX', symbol='000660', qty=14, price=192600, amount=2696400, profit=22900, profitrate=0.856555077613615111277351786),
KisDomesticBalanceStock(accountnumber=KisAccountNumber('50113500-01'), market='KRX', symbol='039200', qty=118, price=39600, amount=4672800, profit=-199500, profitrate=-4.094575457176282248630010467)
],
purchase_amount=7545800,
current_amount=7369200,
profit=-176600,
profit_rate=-2.340374778022211031302181346
)
2.2.4. ๋งค๋/๋งค์ ์ฃผ๋ฌธ
stock.order(), stock.buy(), stock.sell(), stock.modify(), stock.cancel() ํจ์๋ฅผ ์ด์ฉํ์ฌ ๋งค์/๋งค๋ ์ฃผ๋ฌธ ๋ฐ ์ ์ /์ทจ์๋ฅผ ํ ์ ์์ต๋๋ค.
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)
print(order.pending) # ๋ฏธ์ฒด๊ฒฐ ์ฃผ๋ฌธ์ธ์ง ์ฌ๋ถ print(order.pendingorder.pendingqty) # ๋ฏธ์ฒด๊ฒฐ ์๋
order: KisOrder = order.modify(price=195000) # ๋จ๊ฐ ์ ์ order: KisOrder = order.modify(qty=10) # ์๋ ์ ์
order.cancel() # ์ฃผ๋ฌธ ์ทจ์
๋ฏธ์ฒด๊ฒฐ ์ฃผ๋ฌธ ์ ์ฒด ์ทจ์
for order in account.pending_orders():
order.cancel()
2.2.4. ์ค์๊ฐ ์ฒด๊ฒฐ๊ฐ ์กฐํ
๊ตญ๋ด์ฃผ์ ๋ฐ ํด์ธ์ฃผ์์ ์ค์๊ฐ ์ฒด๊ฒฐ๊ฐ ์กฐํ๋ 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
3. ํํ ๋ฆฌ์ผ ๋ชฉ๋ก ๐
- 1.1. ์ํฌ๋ฆฟ ํค ๊ด๋ฆฌ - 1.2. ์์ธ์ค ํ ํฐ ๊ด๋ฆฌ - 2.1. ์์ธ ์กฐํ - 2.2. ์ฐจํธ ์กฐํ - 2.3. ํธ๊ฐ ์กฐํ - 2.4. ์ฅ์ด์ ์๊ฐ ์กฐํ - 3.1. ์์๊ธ ๋ฐ ๋ณด์ ์ข ๋ชฉ ์กฐํ - 3.2. ๊ธฐ๊ฐ ์์ต ์กฐํ - 3.3. ์ผ๋ณ ์ฒด๊ฒฐ ๋ด์ญ ์กฐํ - 3.4. ๋งค์ ๊ฐ๋ฅ ๊ธ์ก/์๋ ์กฐํ - 3.5. ๋งค๋ ๊ฐ๋ฅ ์๋ ์กฐํ - 3.6. ๋ฏธ์ฒด๊ฒฐ ์ฃผ๋ฌธ ์กฐํ - 3.7. ๋งค๋/๋งค์ ์ฃผ๋ฌธ ๋ฐ ์ ์ /์ทจ์ - 3.7.1. ๋งค์/๋งค๋ ์ฃผ๋ฌธ - 3.7.2. ์ฃผ๋ฌธ ์ ์ - 4.1. ์ด๋ฒคํธ ์์ ์ ํ๋๋ฐ, ๋ฐ๋ก ์ทจ์๋ฉ๋๋ค. - 4.2. ์ค์๊ฐ ์ฒด๊ฒฐ๊ฐ ์กฐํ - 4.3. ์ค์๊ฐ ํธ๊ฐ ์กฐํ - 4.4. ์ค์๊ฐ ์ฒด๊ฒฐ๋ด์ญ ์กฐํ4. Changelog โจ
ver 2.1.3
- HTTPSConnectionPool์ด ์ ๋๋ก ๋ซํ์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค. fixed #58: session ์ถ๊ฐ by @tasoo-oos
- Refector/decorator keeping function information
KisChartBar์ ํ์ดํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค.
ver 2.1.2
- fix: SyntaxError: f-string: expecting '}' but got "}" ํ์ด์ฌ 3.11 ์ดํ์์ SyntaxError ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค. by @tasoo-oos
ver 2.1.1
- ํด์ธ์ฃผ์ ์ค์๊ฐ ์ฒด๊ฒฐ ์ด๋ฒคํธ ๋ฒ๊ทธ ์์ ํด์ธ์ฃผ์ ์ค์๊ฐ ์ฒด๊ฒฐ ์ด๋ฒคํธ๋ฅผ ๋ฐ์ ์ ์๋ ๋ฒ๊ทธ๋ฅผ ์์ ํ์ต๋๋ค.
- ์ด๋ฒคํธ ํฐ์ผ ์์์ ๊ตฌ๋ ํด์ง ๊ฒฝ๊ณ ๋ฉ์์ง ์ถ๊ฐ ์ด๋ฒคํธ ํฐ์ผ์ด GC์ ์ํด ํด์ง๋์์ ๋ ๊ฒฝ๊ณ ๋ฉ์์ง๋ฅผ ์ถ๊ฐํ์ต๋๋ค.
- ์ฝ๋ ๋ฆฌํํ ๋ง ๊ธฐ์กด
EMPTY,EMPTYTYPE๋์EllipsisType๋ฅผ ์ฌ์ฉํ๋๋ก ๋ณ๊ฒฝํ๊ณ ,Implํ์ ์ ์ด๋ฆ์Mixin์ผ๋ก ๋ณ๊ฒฝํ์ต๋๋ค.
ver 2.1.0
- ๋ช๋ช ์ข ๋ชฉ์ ์ฃผ์ ๊ฐ์ฒด quote, chart ๋์ ๊ด๋ จ ์ง๋ฌธ ์ํ๊ธฐ๋ณธ์ ๋ณด ์กฐํ ์์ธ์กฐํ ๊ฐ๋ฅ ์ฌ๋ถ ํ์ธ ๋ก์ง์ ์ถ๊ฐํ์ต๋๋ค.
- order ๊ฐ์ฒด๋ฅผ ๋ถ์คํ์ ๋, order ๊ฐ์ฒด๋ฅผ ๋ค์ ๊ฐ์ ธ์ฌ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์๊น์? ๋ฏธ์ฒด๊ฒฐ ์ฃผ๋ฌธ ๊ฐ์ฒด์ KisOrder ํ๋กํ ์ฝ์ ์ง์ํ๋๋ก ๊ฐ์ ํ์ต๋๋ค.
- ์ธ์ฆ ํ ํฐ ๋ง๋ฃ๋์์ ๋ ๋ฐ์ํ๋ ์์ธ๋ฅผ ํธ๋ค๋งํ์ฌ ์ฌ๋ฐ๊ธ์ ์๋ํ๋๋ก ๊ฐ์ ํ์ต๋๋ค.
ver 2.0.4
- krx ์ฃผ์ 002170 ์ ๋ณด๋ฅผ quote ๋ก ๊ฐ์ ธ์ฌ ๋ ๋ฐ์ํ๋ ๋ฒ๊ทธ ๊ตญ๋ด์ฃผ์ ์์ธ์กฐํ์ ์ ์ข ๋ช ์ด ์์๋ ๋ฐ์ํ๋ ๋ฒ๊ทธ๋ฅผ ์์ ํ์ต๋๋ค.
ver 2.0.3
- KisIntegrationBalance์์ ํด์ธ์ฃผ์ ์๊ณ ์๋์ด 0์ผ๋ก ํ์๋จ ๋ฒ๊ทธ๋ฅผ ์์ ํ์ต๋๋ค.
ver 2.0.2
KisBalance,KisChart๋ฑiter๋ฉ์๋์ ๋ฐํ ํ์ ์ด ๋๋ฝ๋์ด์๋ ๋ฒ๊ทธ๋ฅผ ์์ ํ์ต๋๋ค.- ์ฃผ๋ฌธ ์๋์ ์
๋ ฅํ ๋
Decimalํ์ ์ด์ธ์int,floatํ์ ์ ์ ๋ ฅํ ์ ์๋๋ก ๊ฐ์ ํ์ต๋๋ค.
ver 2.0.1
- ์ด๊ธฐ ์น์์ผ ์ด๋ฒคํธ ๊ตฌ๋
์ ํด๋ผ์ด์ธํธ ์ ์ ํ ๊ตฌ๋
์ ์์ฒญํ๋ ์ฝ๋์์
connectedevent๊ฐ set ๋์ด์์ง ์์, ์์ฒญ์ด ๋ฌด์๋๋ ๋ฒ๊ทธ๋ฅผ ์์ ํ์ต๋๋ค.
ver 2.0.0
- ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์ ํ ์๋กญ๊ฒ ๋ณ๊ฒฝ๋์์ต๋๋ค.
- ๋ชจ๋ ๊ฐ์ฒด์ ๋ํ ์ถ์ํ ๋ฐ ๋ค์ด๋ฐ์ด ๋ณ๊ฒฝ๋์์ต๋๋ค.
- ํ๊ตญํฌ์์ฆ๊ถ์ ๊ตญ๋ด, ํด์ธ API ๊ตฌ๋ถ ์์ด ๋์ผํ ์ธํฐํ์ด์ค๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ์ค์๊ฐ ์์ธ ์กฐํ๋ ์๋ก์ด ์ด๋ฒคํธ ์์คํ ์ผ๋ก ๋ณ๊ฒฝ๋์์ต๋๋ค.
- ๊ณ์ข ๋ฐ ์ํ Scope ํ์ฉ์ด ๊ทน๋ํ๋์์ต๋๋ค.
ver 1.0.6
- ์ํ๊ธฐ๋ณธ์กฐํ๊ฐ ์ถ๊ฐ๋์์ต๋๋ค.
- ํ๊ฒฝ ๋ณ์๋ฅผ ๋ถ๋ฆฌํ์์ต๋๋ค.
env.py๋ก ์ฎ๊ฒผ์ต๋๋ค.
- ์์ธ๊ตฌ์กฐ ๋ณ๊ฒฝ
ValueError๋ก ์ฒ๋ฆฌํ๋ ๊ตฌ์กฐ์์ ๊ฐ๊ฐ์ KisHTTPError, KisAPIError ์์ธ ๊ฐ์ฒด๋ก ๋๋์๊ณ , rtcd, msg_cd ๋ฑ์ ๋ณ์๋ฅผ ์์ธ ๊ฐ์ฒด์์ ์ฐธ์กฐํ ์ ์๋๋ก ๋ณ๊ฒฝํ์์ต๋๋ค.
- ์์ธ์คํ ํฐ ๋ฐ๊ธ Thread Safe
KisAccessToken.ensure() ํจ์๋ฅผ ํธ์ถํ๋ฉด Thread Lock ๋์ง ์๊ณ ๋ค์๊ฐ KisAccessToken.issue()๋ฅผ ํธ์ถํ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์์ต๋๋ค.
ver 1.0.5
RTClient์์ ์น์์ผ ์ฐ๊ฒฐ์ด ๋์ด์ก์ ๋, ์ด๋ฒคํธ ์ฒ๋ฆฌ๊ฐ ์๋ชป๋๋ ๋ฒ๊ทธ๋ฅผ ์์ ํ์์ต๋๋ค.
RTClient์์ ์ฌ์ฐ๊ฒฐ์ ์ค์๊ฐ ์กฐํ๊ฐ ๋ณต๊ตฌ๋์ง ์๋ ๋ฒ๊ทธ๋ฅผ ์์ ํ์์ต๋๋ค.
- ํด์ฅ์ผ ์กฐํ๊ฐ ์ถ๊ฐ๋์์ต๋๋ค.
- ํด์ธ ์ฃผ์ ์ฃผ๋ฌธ์ด ์ถ๊ฐ๋์์ต๋๋ค.
- ํด์ธ ๋ฏธ์ฒด๊ฒฐ ์กฐํ๊ฐ ์ถ๊ฐ๋์์ต๋๋ค.
ver 1.0.4
- ์ฃผ์์๊ณ ์กฐํ_์คํ์์ต ์กฐํ๊ฐ ์ถ๊ฐ๋์์ต๋๋ค.
- ์ค์๊ฐ ํด์ ์์ฒญ์ด ์ ์์ ์ผ๋ก ๋์ง ์์ต๋๋ค ๋ฒ๊ทธ๋ฅผ ์์ ํ์์ต๋๋ค.
ver 1.0.3
RTClient์น์์ผ ๋ณด์๊ฐํ๋ฅผ ์ํ ๊ฐ์ ์๋ด์ ๋ด์ฉ์ ๋ฐ๋ผ, ์ฑํค ๋์ ์น์์ผ ์ ์ํค๋ฅผ ๋ฐ๊ธํ์ฌ ์ฌ์ฉํ๋๋ก ๋ณ๊ฒฝ๋์์ต๋๋ค.
ver 1.0.2
- API ์ด๋น ์์ฒญ ์ ํ์ ๋์ด๋ฒ๋ฆฌ๋ ๋ฒ๊ทธ๋ฅผ ์์ ํ์์ต๋๋ค.
periodprice์๋ต ๋ฐ์ดํฐ์stckfcam๊ฐfloat์ผ๋ก ๋ณ๊ฒฝํ์์ต๋๋ค.utils.KRXMarketOpen๊ณตํด์ผ ๋ฐ์ดํฐ๊ฐ 1๊ฐ์ธ ๊ฒฝ์ฐ ์ค๋ฅ ๋ฐ์ํ๋ ๋ฒ๊ทธ ์์ ํ์์ต๋๋ค.