프로젝트

일반

사용자정보

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