Python Wrapper for Upbit API
https://pyupbit.readthedocs.io/en/latest/
ํ์ด์ฌ ๊ฐ๋ฐ ํ๊ฒฝ์ผ๋ก ์ต์ ๋ฒ์ ์ Anaconda๋ฅผ ์ค์นํ์ธ์. (Python3 ๋ฒ์ ์ฉ)
pip install pyupbit
pyjwt ๋ชจ๋์ ํ์๋ก ํฉ๋๋ค. (pyjwt >= 2.0)
pip install pyjwt
import pyupbit
- Websocket์ ์ด๋น 5ํ, ๋ถ๋น 100ํ ์ฐ๊ฒฐ ์์ฒญํ ์ ์์ต๋๋ค.
- ์ข ๋ชฉ, ์บ๋ค, ์ฒด๊ฒฐ, ํฐ์ปค, ํธ๊ฐ API๋ ๋ถ๋น 600ํ, ์ด๋น 10ํ ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค.
get_tickers
ํจ์๋ ์
๋นํธ๊ฐ ์ง์ํ๋ ๋ชจ๋ ์ํธํํ ๋ชฉ๋ก์ ์ป์ด์ต๋๋ค.
print(pyupbit.get_tickers())
['KRW-BTC', 'KRW-DASH', 'KRW-ETH', 'BTC-NEO', 'BTC-ETH', 'BTC-LTC', ... ]
์
๋นํธ๊ฐ ์ง์ํ๋ ์ํธํํ ๋ชฉ๋ก ์ค ํน์ ์์ฅ(fiat
)์ ๋งค๋งค๊ฐ ๊ฐ๋ฅํ ๋ชฉ๋ก๋ง ์ป์ด์ฌ ์ ์์ต๋๋ค. KRW
/BTC
/USDT
์์ฅ์ ์กฐํํ ์ ์์ต๋๋ค.
print(pyupbit.get_tickers(fiat="KRW"))
['KRW-BTC', 'KRW-DASH', 'KRW-ETH', 'KRW-NEO', 'KRW-MTL', 'KRW-LTC', ...]
get_current_price
ํจ์๋ ์ํธํํ์ ํ์ฌ๊ฐ๋ฅผ ์ป์ด์ต๋๋ค. ํจ์๋ก ํฐ์ปค๋ฅผ ๋ฃ์ด์ค์ผ ํฉ๋๋ค.
print(pyupbit.get_current_price("KRW-BTC"))
float
ํ์
์ ํ์ฌ๊ฐ๊ฐ ๋ฐํ๋ฉ๋๋ค.
8392000.0
๋ฆฌ์คํธ์ ์ฌ๋ฌ ๊ฐ์ ํฐ์ปค๋ฅผ ์ ๋ ฅํด ํ ๋ฒ์ ํ์ฌ๊ฐ๋ฅผ ์กฐํํ ์ ์์ต๋๋ค.
print(pyupbit.get_current_price(["KRW-BTC", "KRW-XRP"]))
์ฌ๋ฌ ์ข ๋ชฉ์ ์กฐํํ ๊ฒฝ์ฐ ๋์ ๋๋ฆฌ๋ก ํ์ฌ๊ฐ๋ฅผ ๋ฆฌํดํฉ๋๋ค.
{'KRW-BTC': 8300000.0, 'KRW-XRP': 511.0}
get_current_price
ํจ์๋ ์ต๋ 100๊ฐ์ ์ํธํํ๋ฅผ ์กฐํํ ์ ์์ต๋๋ค. 100๊ฐ ์ด์์ผ ๊ฒฝ์ฐ ๋ถํ ํด์ ๋ฐ๋ณต ์กฐํํด์ผ ํฉ๋๋ค.
get_ohlcv
ํจ์๋ ๊ณ ๊ฐ/์๊ฐ/์ ๊ฐ/์ข
๊ฐ/๊ฑฐ๋๋์ DataFrame์ผ๋ก ๋ฐํํฉ๋๋ค.
df = pyupbit.get_ohlcv("KRW-BTC")
print(df.tail())
๋ ์ง๊ฐ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ๋ผ ์ต๊ทผ ๋ ์ง๊ฐ ๋ง์ง๋ง์ ์์นํฉ๋๋ค.
2021-03-21 09:00:00 67849000.0 68715000.0 65451000.0 67120000.0 8097.428878
2021-03-22 09:00:00 67064000.0 68380000.0 64345000.0 64725000.0 8366.410551
2021-03-23 09:00:00 64728000.0 66279000.0 63000000.0 65458000.0 9961.040596
2021-03-24 09:00:00 65458000.0 68370000.0 64500000.0 64777000.0 11366.404524
2021-03-25 09:00:00 64777000.0 65305000.0 63319000.0 64257000.0 2770.703203
count
ํ๋ผ๋ฏธํฐ๋ ์กฐํ ๊ฐฏ์๋ฅผ ์ง์ ํฉ๋๋ค. ์ต๊ทผ ์์
์ผ ๋ถํฐ ์ด์ count
๋งํผ์ ์ด์ ์์
์ผ๊น์ง ์กฐํํฉ๋๋ค. count
ํ๋ผ๋ฏธํฐ๋ฅผ ์
๋ ฅํ์ง ์์ ๊ฒฝ์ฐ default value๋ 200์
๋๋ค.
df = pyupbit.get_ohlcv("KRW-BTC", count=5)
print(len(df))
์ ์ฝ๋๋ ์ต๊ทผ ์์ ์ผ ๋ถํฐ ๊ณผ๊ฑฐ 5๊ฐ์ ๋ฐ์ดํฐ๊ฐ ์กฐํ๋ฉ๋๋ค.
5
get_ohlcv
ํจ์๋ ์น ์๋ฒ๋ก 200๊ฐ์ฉ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํฉ๋๋ค. 200๊ฐ ์ด์์ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ๋ค๋ฉด 0.1(default) ์ฃผ๊ธฐ๋ก ๋ฐ์ดํฐ๋ฅผ ์์งํฉ๋๋ค. ๋ค๋ฅธ API์ ํจ๊ป ์ฌ์ฉํ๋ค๋ฉด ์กฐํ ์ฃผ๊ธฐ(period
)๋ฅผ ๋๋ ค์ผ ํฉ๋๋ค. ์ด ๋ period
์ต์
์ ์ฌ์ฉํด์ ์ฃผ๊ธฐ๋ฅผ ์ด(second) ๋จ์๋ก ์ง์ ํ ์ ์์ต๋๋ค. ์กฐํํ๋ ๋ฐ์ดํฐ์ ๊ฐฏ์๊ฐ 200๊ฐ ์ดํ๋ผ๋ฉด period ์ต์
์ ๋ฌด์๋ฉ๋๋ค.
df = pyupbit.get_ohlcv("KRW-BTC", count=600, period=1)
interval
ํ๋ผ๋ฏธํฐ๋ ์กฐํ๋จ์๋ฅผ ์ง์ ํฉ๋๋ค. ํ๋ผ๋ฏธํฐ์๋ ๋ค์ ๊ฐ์ ์ง์ ํ ์ ์์ต๋๋ค.
day
/minute1
/minute3
/minute5
/minute10
/minute15
/minute30
/minute60
/minute240
/week
/month
print(pyupbit.get_ohlcv("KRW-BTC", interval="day") # ์ผ๋ด ๋ฐ์ดํฐ (5์ผ)
print(pyupbit.get_ohlcv("KRW-BTC", interval="minute1")) # ๋ถ๋ด ๋ฐ์ดํฐ
print(pyupbit.get_ohlcv("KRW-BTC", interval="week")) # ์ฃผ๋ด ๋ฐ์ดํฐ
to
ํ๋ผ๋ฏธํฐ์ ์
๋ ฅ๋ ์ด์ ๋จ์(interval
)๊น์ง์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ดํฐํ๋ ์์ผ๋ก ์ป์ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ค์ ์ฝ๋๋ 2020-10-10
์ผ ๋ณด๋ค ํ๋ฃจ ์ ์ธ 2020-10-09
์ ๊น์ง์ 200๊ฐ ๋ฐ์ดํฐ๋ฅผ ์กฐํํฉ๋๋ค. ๋จ์๋ฅผ ์ค์ ํ์ง ์์์ผ๋ ๋จ์๋ ์ผ๋ด์
๋๋ค.
print(pyupbit.get_ohlcv("KRW-BTC", to="20201010"))
interval
์ minute1
๋ก ์ง์ ํ ๊ฒฝ์ฐ 2020-10-10
๋ณด๋ค 1๋ถ ์ด์ (2020-10-09 23:59:00
)๊น์ง์ 200๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํฉ๋๋ค.
print(pyupbit.get_ohlcv("KRW-BTC", interval="minute1", to="20201010"))
๊ธฐ์ค ์๊ฐ ๋จ์๋ก shift๋ ์ผ๋ด์ ๊ณ์ฐํ ์๋ ์์ต๋๋ค.
์) 2019-06-01 12:00:00 ~ 2019-06-02 11:59:59
print(pyupbit.get_daily_ohlcv_from_base("KRW-BTC", base=12))
์) 2019-06-01 13:00:00 ~ 2019-06-02 12:59:59
print(pyupbit.get_daily_ohlcv_from_base("KRW-BTC", base=13))
get_orderbook
ํจ์๋ ๋งค์/๋งค๋ ํธ๊ฐ ์ ๋ณด๋ฅผ ์กฐํํฉ๋๋ค.
print(pyupbit.get_orderbook(ticker="KRW-BTC"))
๋ฆฌ์คํธ ์์ ๋์ ๋๋ฆฌ๋ก ํธ๊ฐ์ ๋ณด๊ฐ ๋ค์ด์์ต๋๋ค.
- market : ์ํธํํ ํฐ์ปค
- timestamp : ์กฐํ์๊ฐ (๋จ์ ms)
- orderbook_units : ๋งค๋ํธ๊ฐ/๋งค์ํธ๊ฐ ์ ๋ณด
[{'market': 'KRW-BTC', 'timestamp': 1532118943687, 'total_ask_size': 17.08116346, 'total_bid_size': 3.07150192, 'orderbook_units': [{'ask_price': 8390000.0, 'bid_price': 8389000.0, 'ask_size': 3.16057415, 'bid_size': 0.5515136}, {'ask_price': 8392000.0, 'bid_price': 8387000.0, 'ask_size': 0.71247596, 'bid_size': 0.95157819}, {'ask_price': 8393000.0, 'bid_price': 8386000.0, 'ask_size': 3.70536818, 'bid_size': 0.15824907}, {'ask_price': 8398000.0, 'bid_price': 8385000.0, 'ask_size': 0.00481809, 'bid_size': 0.00119147}, {'ask_price': 8399000.0, 'bid_price': 8383000.0, 'ask_size': 1.1228337, 'bid_size': 0.05}, {'ask_price': 8400000.0, 'bid_price': 8380000.0, 'ask_size': 0.48354827, 'bid_size': 0.00613734}, {'ask_price': 8401000.0, 'bid_price': 8375000.0, 'ask_size': 0.00433629, 'bid_size': 0.05}, {'ask_price': 8402000.0, 'bid_price': 8374000.0, 'ask_size': 2.7434153, 'bid_size': 0.32104953}, {'ask_price': 8420000.0, 'bid_price': 8373000.0, 'ask_size': 0.0028, 'bid_size': 0.5010063}, {'ask_price': 8428000.0, 'bid_price': 8370000.0, 'ask_size': 5.14099352, 'bid_size': 0.48077642}]}]
ticker
ํ๋ผ๋ฏธํฐ์ ๋ฆฌ์คํธ๋ก ํฐ์ปค๋ฅผ ๋ฃ์ผ๋ฉด, ํ ๋ฒ์ ์ฌ๋ฌ ์ข
๋ชฉ์ ํธ๊ฐ๋ฅผ ์กฐํํ ์ ์์ต๋๋ค.
print(pyupbit.get_orderbook(ticker=["KRW-BTC", "KRW-XRP"]))
์ฃผ๋ฌธ์ ์ด๋น 8ํ, ๋ถ๋น 200ํ / ์ฃผ๋ฌธ ์ธ ์์ฒญ์ ์ด๋น 30ํ, ๋ถ๋น 900ํ ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค.
Access Key์ Sercret Key๋ฅผ ์ฌ์ฉํด์ Upbit
๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค. ์ด๋ ์นํ์ด์ง์์ ๋ก๊ทธ์ธํ๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค.
import pyupbit
access = "73kVqowGQOGEjdR31221j31j2ifekjkgjekgjekg" # ๋ณธ์ธ ๊ฐ์ผ๋ก ๋ณ๊ฒฝ
secret = "egjekgj3iekeEEkej3i3j3iejjwiEejiejeEeijg" # ๋ณธ์ธ ๊ฐ์ผ๋ก ๋ณ๊ฒฝ
upbit = pyupbit.Upbit(access, secret)
get_balance
๋ฉ์๋๋ ์
๋ ฅ๋ฐ์ ํฐ์ปค์ ๋ณด์ ์๋ ์ ๋ณด๋ฅผ ์กฐํํฉ๋๋ค.
print(upbit.get_balance("KRW-XRP")) # KRW-XRP ์กฐํ
print(upbit.get_balance("KRW")) # ๋ณด์ ํ๊ธ ์กฐํ
get_balances
๋ฉ์๋๋ ๋ณด์ ์ค์ธ ๋ชจ๋ ์ํธํํ์ ์๊ณ ๋ฐ ๋จ๊ฐ ์ ๋ณด๋ฅผ ๋์
๋๋ฆฌ๋ก ์กฐํํฉ๋๋ค.
print(upbit.get_balances())
[{'currency': 'KRW',
'balance': '0.34689181',
'locked': '0.0',
'avg_buy_price': '0',
'avg_buy_price_modified': True,
'unit_currency': 'KRW'},
{'currency': 'BTC',
'balance': '0.00174304',
'locked': '0.0',
'avg_buy_price': '64387000',
'avg_buy_price_modified': False,
'unit_currency': 'KRW'},]
์ง์ ํ ๊ฐ๊ฒฉ์ ์ฃผ๋ฌธ์ ์์ฒญํฉ๋๋ค. ๋ค์์ ์ํ ์์ฅ์ ๋ฆฌํ์ 600์์ 20๊ฐ ๋งค๋ ํฉ๋๋ค.
# ๋งค๋
print(upbit.sell_limit_order("KRW-XRP", 600, 20))
์ฃผ๋ฌธ ์ ๋ณด๊ฐ ๋์ ๋๋ฆฌ๋ก ๋ฐํ๋ฉ๋๋ค. uuid๋ ์ฃผ๋ฌธ์ ๋ํ ๊ณ ์ณ๊ฐ์ผ๋ก ์ด๋ฅผ ์ฌ์ฉํด ์ถํ ์ฃผ๋ฌธ์ ์ทจ์ํ๊ฑฐ๋ ์ ์ ํ ์ ์์ต๋๋ค.
{'uuid': '0bcf0916-a7f5-49ed-80a9-a45e9e190cd3',
'side': 'ask',
'ord_type': 'limit',
'price': '600.0',
'state': 'wait',
'market': 'KRW-XRP',
'created_at': '2021-03-21T15:24:11+09:00',
'volume': '20.0',
'remaining_volume': '20.0',
'reserved_fee': '0.0',
'remaining_fee': '0.0',
'paid_fee': '0.0',
'locked': '20.0',
'executed_volume': '0.0',
'trades_count': 0}
๋ค์์ ์ํ ์์ฅ์ ๋ฆฌํ์ 613์์ 10๊ฐ ๋งค์ ํฉ๋๋ค.
# ๋งค์
print(upbit.buy_limit_order("KRW-XRP", 613, 10))
{'uuid': '1907dcdc-2b96-4d85-9963-866f7aa220cd',
'side': 'bid',
'ord_type': 'limit',
'price': '613.0',
'state': 'wait',
'market': 'KRW-XRP',
'created_at': '2021-03-21T15:10:32+09:00',
'volume': '10.0',
'remaining_volume': '10.0',
'reserved_fee': '3.065',
'remaining_fee': '3.065',
'paid_fee': '0.0',
'locked': '6133.065',
'executed_volume': '0.0',
'trades_count': 0}
์์ฅ๊ฐ ๋งค์๋ ์ต์ฐ์ ๋งค๋ํธ๊ฐ์ ์ฆ์ ๋งค์ํฉ๋๋ค. buy_market_order
๋ฉ์๋๋ก ํฐ์ปค์ ๋งค์ ๊ธ์ก๋ง์ ์
๋ ฅํฉ๋๋ค. ๋งค์ ๊ธ์ก์ ์์๋ฃ๋ฅผ ์ ์ธํ ๊ธ์ก์
๋๋ค. ๋ค์ ์์ ์์ ์ฃผ๋ฌธํ 10000์์ ์์๋ฃ๊ฐ ์ ์ธ๋ ๊ธ์ก์
๋๋ค. ์์๋ฃ๊ฐ 0.05%๋ผ๋ฉด ์์๋ฃ๋ฅผ ํฌํจํ 10005์์ ํ๊ธ์ ๋ณด์ ํ๊ณ ์์ด์ผ ํฉ๋๋ค.
print(upbit.buy_market_order("KRW-XRP", 10000))
๋ค์์ ๋ฆฌํ 30๊ฐ๋ฅผ ์์ฅ๊ฐ ๋งค๋ํฉ๋๋ค. ๋งค๋๋๊ธ์ด ์ด 10000์์ด๋ผ๋ฉด ์์๋ฃ๋ฅผ ์ ์ธํ ๊ธ์ก์ด ์ ๊ธ๋ฉ๋๋ค. ๋ง์ฝ ์์๋ฃ๊ฐ 0.05%๋ผ๋ฉด 9995์ ๋ฐ์ ์ ์์ต๋๋ค.
print(upbit.sell_market_order("KRW-XRP", 30))
get_order
๋ฉ์๋๋ ์
๋ ฅ๋ ์ํธํํ์ ๋ฏธ์ฒด๊ฒฐ ์ฃผ๋ฌธ์ ์กฐํํฉ๋๋ค.
upbit.get_order("KRW-LTC")
๋ฏธ์ฒด๊ฒฐ ์ฃผ๋ฌธ์ด ์๋ค๋ฉด ๋ฆฌ์คํธ๋ก ์์ธ ๋ด์ญ์ ๋ฐํํฉ๋๋ค. ๋ค์์ 250000์์ ๋งค๋(ask) ์ฃผ๋ฌธํ LTC์ด 1๊ฐ(volume)์๋ค๋ ์๋ฏธ์ ๋๋ค.
[{'uuid': '50e184b3-9b4f-4bb0-9c03-30318e3ff10a',
'side': 'ask',
'ord_type': 'limit',
'price': '250000.0',
'state': 'wait',
'market': 'KRW-LTC',
'created_at': '2021-03-25T14:10:53+09:00',
'volume': '1.0',
'remaining_volume': '1.0',
'reserved_fee': '0.0',
'remaining_fee': '0.0',
'paid_fee': '0.0',
'locked': '1.0',
'executed_volume': '0.0',
'trades_count': 0}]
state
ํ๋ผ๋ฏธํฐ๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ฃ๋ ์ฃผ๋ฌธ๋ค์ ์กฐํํ ์ ์์ต๋๋ค.
print(upbit.get_order("KRW-LTC", state="done"))
[{'uuid': '0694def7-5ada-405f-b0f3-053801d5b190',
'side': 'ask',
'ord_type': 'market',
'price': None,
'state': 'done',
'market': 'KRW-LTC',
'created_at': '2021-03-21T14:43:40+09:00',
'volume': '0.07336815',
'remaining_volume': '0.0',
'reserved_fee': '0.0',
'remaining_fee': '0.0',
'paid_fee': '8.39331636',
'locked': '0.0',
'executed_volume': '0.07336815',
'trades_count': 1},
{'uuid': '48d6d451-3db5-4357-9d5a-bfb8f417c943',
'side': 'ask',
'ord_type': 'limit',
'price': '230000.0',
'state': 'done',
'market': 'KRW-LTC',
'created_at': '2021-03-17T01:06:55+09:00',
'volume': '0.5',
'remaining_volume': '0.0',
'reserved_fee': '0.0',
'remaining_fee': '0.0',
'paid_fee': '58.775',
'locked': '0.0',
'executed_volume': '0.5',
'trades_count': 2}]
uuid
๋ฅผ ์ฌ์ฉํด์ ํน์ ์ฃผ๋ฌธ์ ์์ธ ์กฐํํ ์ ์์ต๋๋ค. uuid
๋ฅผ ์ฌ์ฉํ๋ฉด ๋ค๋ฅธ ํ๋ผ๋ฏธํฐ๋ ๋ฌด์๋ฉ๋๋ค.
order = upbit.get_order('50e184b3-9b4f-4bb0-9c03-30318e3ff10a')
print(order)
๊ฒฐ๊ณผ๋ฅผ ์ฐธ๊ณ ํ๋ฉด ์ง์ ๊ฐ ๋งค๋๋ฅผ ์คํํ์ผ๋ฉฐ ์ฃผ๋ฌธ์ ์ทจ์(cancel
) ๋์์ ์ ์ ์์ต๋๋ค
{'uuid': '50e184b3-9b4f-4bb0-9c03-30318e3ff10a', 'side': 'ask', 'ord_type': 'limit', 'price': '250000.0', 'state': 'cancel', 'market': 'KRW-LTC', 'created_at': '2021-03-25T14:10:53+09:00', 'volume': '1.0', 'remaining_volume': '1.0', 'reserved_fee': '0.0', 'remaining_fee': '0.0', 'paid_fee': '0.0', 'locked': '1.0', 'executed_volume': '0.0', 'trades_count': 0, 'trades': []}
์ฃผ๋ฌธ ํจ์์ ๋ฆฌํด ๊ฐ ์ค uuid ๊ฐ์ ์ฌ์ฉํด์ ์ฃผ๋ฌธ์ ์ทจ์ํ ์ ์์ต๋๋ค.
print(upbit.cancel_order('50e184b3-9b4f-4bb0-9c03-30318e3ff10a'))
์ ์ ์ฒ๋ฆฌ๋๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋์ ๋๋ฆฌ๊ฐ ๋ฐํ๋ฉ๋๋ค.
{'uuid': '50e184b3-9b4f-4bb0-9c03-30318e3ff10a', 'side': 'ask', 'ord_type': 'limit', 'price': '250000.0', 'state': 'wait', 'market': 'KRW-LTC', 'created_at': '2021-03-25T14:10:53+09:00', 'volume': '1.0', 'remaining_volume': '1.0', 'reserved_fee': '0.0', 'remaining_fee': '0.0', 'paid_fee': '0.0', 'locked': '1.0', 'executed_volume': '0.0', 'trades_count': 0}
WebSocket์ ์ด์ฉํด์ ํ์ฌ๊ฐ
, ํธ๊ฐ
, ์ฒด๊ฒฐ
์ ๋ํ ์ ๋ณด๋ฅผ ์์ ํฉ๋๋ค.
- ์ฒซ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ์๋ ์์ ์ ๋ณด๋ฅผ ์
๋ ฅํ๋ฉฐ
ticker
,orderbook
,transaction
์ ์ฌ์ฉํ ์ ์์ต๋๋ค. - ๋ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ๋ ๊ตฌ๋ ํ ํํฐ๋ฅผ ์ค์ ํ๋ฉฐ ์ํธํํ์ ํฐ์ปค๋ฅผ ์ ๋ ฅํฉ๋๋ค. ํ์ฌ ๋ฒ์ ์์๋ ์ํ ์์ฅ๋ง์ ์ง์ํฉ๋๋ค.
from pyupbit import WebSocketManager
if __name__ == "__main__":
wm = WebSocketManager("ticker", ["KRW-BTC"])
for i in range(10):
data = wm.get()
print(data)
wm.terminate()
์ฃผ์: ์น์์ผ์ multiprocessing์ ์ํด __name__
guard๋ฅผ ๋ฐ๋์ ์จ์ค์ผ ํฉ๋๋ค.
PyQt5์ ํจ๊ป ์น์์ผ์ ์ฌ์ฉํ๋ ์์ ๋ ๋ค์ ์ฝ๋๋ฅผ ์ฐธ๊ณ ํ์ธ์.
- ๋ฒํผ์ ํด๋ฆญํ๋ฉด ์น์์ผ์์ ๊ฐ๊ฒฉ์ ๋ณด๋ฅผ ๊ฐ์ ธ์์ ํ๋ฉด์ ์ถ๋ ฅํฉ๋๋ค.
- https://gist.github.com/mr-yoo/a3d1f8a4152f94cf61e4bc566659cd20
WebSocketClient ํด๋์ค๋ ์ธ๋ถ์์ ํ๋ก์ธ์ค ์์ฑ ๋ฐ ํ๋ฅผ ์ ๋ฌํ๋ ๊ตฌ์กฐ์์ ์ฌ์ฉํฉ๋๋ค. WebSocketManager์ ๋ฌ๋ฆฌ ์ฌ์ฉ์๊ฐ ํ๋ก์ธ์ค๋ฅผ ์์ฑํ๊ณ ์ฌ์ฉํ ํ๋ฅผ ์ ๋ ฅํด์ค์ผ ํฉ๋๋ค.
import multiprocessing as mp
import pyupbit
if __name__ == "__main__":
queue = mp.Queue()
proc = mp.Process(
target=pyupbit.WebSocketClient,
args=('ticker', ["KRW-BTC"], queue),
daemon=True
)
proc.start()
while True:
data = queue.get()
print(data)