Actions
실시간 호가창¶
소스코드¶
import sys
import time
import pyupbit
import pybithumb
from PyQt5 import uic
from PyQt5.QtWidgets import QWidget, QApplication, QTableWidgetItem, QProgressBar
from PyQt5.QtCore import Qt, QThread, pyqtSignal
class OrderbookWorker(QThread):
dataSent = pyqtSignal(dict)
def __init__(self, ticker):
super().__init__()
self.ticker = ticker
self.alive = True
def run(self):
while self.alive:
# data = pybithumb.get_orderbook(self.ticker, limit=10)
data = pyupbit.get_orderbook(self.ticker)
time.sleep(0.1)
self.dataSent.emit(data)
def close(self):
self.alive = False
class OrderbookWidget(QWidget):
def __init__(self, parent=None, ticker="KRW-BTC"): # 업비트 : KRW-BTC | 빗썸 : BTC
super().__init__(parent)
uic.loadUi("resource/orderbook.ui", self)
self.setWindowTitle("실시간 호가창")
self.ticker = ticker
for i in range(self.tableBids.rowCount()):
# 매도 호가
item_0 = QTableWidgetItem(str(""))
item_0.setTextAlignment(Qt.AlignRight | Qt.AlignVCenter)
self.tableAsks.setItem(i, 0, item_0)
item_1 = QTableWidgetItem(str(""))
item_1.setTextAlignment(Qt.AlignRight | Qt.AlignVCenter)
self.tableAsks.setItem(i, 1, item_1)
item_2 = QProgressBar(self.tableAsks)
item_2.setAlignment(Qt.AlignRight | Qt.AlignVCenter)
item_2.setStyleSheet("""
QProgressBar {background-color : rgba(0, 0, 0, 0%); border : 1}
QProgressBar::Chunk {background-color : rgba(255, 0, 0, 50%); border : 1}
""")
self.tableAsks.setCellWidget(i, 2, item_2)
#매수 호가
item_0 = QTableWidgetItem(str(""))
item_0.setTextAlignment(Qt.AlignRight | Qt.AlignVCenter)
self.tableBids.setItem(i, 0, item_0)
item_1 = QTableWidgetItem(str(""))
item_1.setTextAlignment(Qt.AlignRight | Qt.AlignVCenter)
self.tableBids.setItem(i, 1, item_1)
item_2 = QProgressBar(self.tableBids)
item_2.setAlignment(Qt.AlignRight | Qt.AlignVCenter)
item_2.setStyleSheet("""
QProgressBar {background-color : rgba(0, 0, 0, 0%); border : 1}
QProgressBar::Chunk {background-color : rgba(0, 255, 0, 40%); border : 1}
""")
self.tableBids.setCellWidget(i, 2, item_2)
self.ow = OrderbookWorker(self.ticker)
# self.ow.dataSent.connect(self.updateBithumbData) # 빗썸 실시간 호가
self.ow.dataSent.connect(self.updateUpbitData) # 업비트 실시간 호가
self.ow.start()
def updateBithumbData(self, data):
# print(data)
tradingBidValues = []
for v in data['bids']:
tradingBidValues.append(int(v['price'] * v['quantity']))
tradingAskValues = []
for v in data['asks'][::-1]:
tradingAskValues.append(int(v['price'] * v['quantity']))
# print(int(v['price'] * v['quantity']))
maxtradingValue = max(tradingBidValues + tradingAskValues)
for i, v in enumerate(data['asks'][::-1]):
item_0 = self.tableAsks.item(i, 0)
item_0.setText(f"{v['price']:,}")
item_1 = self.tableAsks.item(i, 1)
item_1.setText(f"{v['quantity']:,}")
item_2 = self.tableAsks.cellWidget(i, 2)
item_2.setRange(0, maxtradingValue)
item_2.setFormat(f"{tradingAskValues[i]:,}")
item_2.setValue(tradingAskValues[i])
for i, v in enumerate(data['bids'][::-1]):
item_0 = self.tableBids.item(i, 0)
item_0.setText(f"{v['price']:,}")
item_1 = self.tableBids.item(i, 1)
item_1.setText(f"{v['quantity']:,}")
item_2 = self.tableBids.cellWidget(i, 2)
item_2.setRange(0, maxtradingValue)
item_2.setFormat(f"{tradingBidValues[i]:,}")
item_2.setValue(tradingBidValues[i])
def updateUpbitData(self, data):
tradingBidValues = []
tradingBidList = []
tradingAskValues = []
tradingAskList = []
# 값 10개만 생성
for i in range(0, 10):
tradingBidValues.append(int(data['orderbook_units'][i]['bid_price'] * data['orderbook_units'][i]['bid_size']))
tradingAskValues.append(int(data['orderbook_units'][i]['ask_price'] * data['orderbook_units'][i]['ask_size']))
# 빗썸 예제와 동일한 구조를 가지도록 데이터 가공(매수)
tradingBidsDict = {"price" : data['orderbook_units'][i]['bid_price'], "size" : data['orderbook_units'][i]['bid_size']}
tradingBidList.append(tradingBidsDict)
# 빗썸 예제와 동일한 구조를 가지도록 데이터 가공(매도)
tradingAsksDict = {"price" : data['orderbook_units'][i]['ask_price'], "size" : data['orderbook_units'][i]['ask_size']}
tradingAskList.append(tradingAsksDict)
maxtradingValue = max(tradingBidValues + tradingAskValues)
# 빗썸 예제와 동일한 구조를 가지도록 데이터 가공(Dictionary)
resultData = {"bids" : tradingBidList, "asks" : tradingAskList}
for i, v in enumerate(resultData['asks'][::-1]):
item_0 = self.tableAsks.item(i, 0)
item_0.setText(f"{v['price']:,}")
item_1 = self.tableAsks.item(i, 1)
# item_1.setText(f"{v['size']:,}") - 해당방식은 e형식 출력이 됨.
item_1.setText(f"{format(v['size'],'f')}") # format을 f로 설정해야 소수로 표기해줌
item_2 = self.tableAsks.cellWidget(i, 2)
item_2.setRange(0, maxtradingValue)
item_2.setFormat(f"{tradingAskValues[i]:,}")
item_2.setValue(tradingAskValues[i])
for i, v in enumerate(resultData['bids']):
item_0 = self.tableBids.item(i, 0)
item_0.setText(f"{v['price']:,}")
item_1 = self.tableBids.item(i, 1)
# item_1.setText(f"{v['size']:,}") - 해당방식은 e형식 출력이 됨.
item_1.setText(f"{format(v['size'],'f')}") # format을 f로 설정해야 소수로 표기해줌
item_2 = self.tableBids.cellWidget(i, 2)
item_2.setRange(0, maxtradingValue)
item_2.setFormat(f"{tradingBidValues[i]:,}")
item_2.setValue(tradingBidValues[i])
def closeEvent(self, data):
self.ow.close()
if __name__ == "__main__":
app = QApplication(sys.argv)
ow = OrderbookWidget()
ow.show()
exit(app.exec_())
결과¶

이태훈이(가) 10달 전에 변경 · 1 revisions