프로젝트

일반

사용자정보

At 실시간 호가창 » 이력 » 버전 1

이태훈, 2025/02/12 08:30

1 1 이태훈
h1. 실시간 호가창
2
3
h3. 소스코드 
4
5
<pre>
6
import sys
7
import time
8
import pyupbit
9
import pybithumb
10
from PyQt5 import uic
11
from PyQt5.QtWidgets import QWidget, QApplication, QTableWidgetItem, QProgressBar
12
from PyQt5.QtCore import Qt, QThread, pyqtSignal
13
14
class OrderbookWorker(QThread):
15
    dataSent = pyqtSignal(dict)
16
17
    def __init__(self, ticker):
18
        super().__init__()
19
        self.ticker = ticker
20
        self.alive = True
21
22
    def run(self):
23
        while self.alive:
24
            # data = pybithumb.get_orderbook(self.ticker, limit=10)
25
            data = pyupbit.get_orderbook(self.ticker)
26
            time.sleep(0.1)
27
            self.dataSent.emit(data)
28
29
    def close(self):
30
        self.alive = False
31
32
class OrderbookWidget(QWidget):
33
    def __init__(self, parent=None, ticker="KRW-BTC"): # 업비트 : KRW-BTC | 빗썸 : BTC
34
        super().__init__(parent)
35
        uic.loadUi("resource/orderbook.ui", self)
36
        self.setWindowTitle("실시간 호가창")
37
        self.ticker = ticker
38
39
        for i in range(self.tableBids.rowCount()):
40
            # 매도 호가
41
            item_0 = QTableWidgetItem(str(""))
42
            item_0.setTextAlignment(Qt.AlignRight | Qt.AlignVCenter)
43
            self.tableAsks.setItem(i, 0, item_0)
44
45
            item_1 = QTableWidgetItem(str(""))
46
            item_1.setTextAlignment(Qt.AlignRight | Qt.AlignVCenter)
47
            self.tableAsks.setItem(i, 1, item_1)
48
49
            item_2 = QProgressBar(self.tableAsks)
50
            item_2.setAlignment(Qt.AlignRight | Qt.AlignVCenter)
51
            item_2.setStyleSheet("""
52
            QProgressBar {background-color : rgba(0, 0, 0, 0%); border : 1}
53
            QProgressBar::Chunk {background-color : rgba(255, 0, 0, 50%); border : 1}
54
            """)
55
            self.tableAsks.setCellWidget(i, 2, item_2)
56
57
            #매수 호가
58
            item_0 = QTableWidgetItem(str(""))
59
            item_0.setTextAlignment(Qt.AlignRight | Qt.AlignVCenter)
60
            self.tableBids.setItem(i, 0, item_0)
61
62
            item_1 = QTableWidgetItem(str(""))
63
            item_1.setTextAlignment(Qt.AlignRight | Qt.AlignVCenter)
64
            self.tableBids.setItem(i, 1, item_1)
65
66
            item_2 = QProgressBar(self.tableBids)
67
            item_2.setAlignment(Qt.AlignRight | Qt.AlignVCenter)
68
            item_2.setStyleSheet("""
69
            QProgressBar {background-color : rgba(0, 0, 0, 0%); border : 1}
70
            QProgressBar::Chunk {background-color : rgba(0, 255, 0, 40%); border : 1}
71
            """)
72
            self.tableBids.setCellWidget(i, 2, item_2)
73
74
        self.ow = OrderbookWorker(self.ticker)
75
        # self.ow.dataSent.connect(self.updateBithumbData) # 빗썸 실시간 호가
76
        self.ow.dataSent.connect(self.updateUpbitData) # 업비트 실시간 호가
77
        self.ow.start()
78
79
    def updateBithumbData(self, data):
80
        # print(data)
81
        tradingBidValues = []
82
        for v in data['bids']:
83
            tradingBidValues.append(int(v['price'] * v['quantity']))
84
85
        tradingAskValues = []
86
        for v in data['asks'][::-1]:
87
            tradingAskValues.append(int(v['price'] * v['quantity']))
88
            # print(int(v['price'] * v['quantity']))
89
90
        maxtradingValue = max(tradingBidValues + tradingAskValues)
91
92
        for i, v in enumerate(data['asks'][::-1]):
93
            item_0 = self.tableAsks.item(i, 0)
94
            item_0.setText(f"{v['price']:,}")
95
            item_1 = self.tableAsks.item(i, 1)
96
            item_1.setText(f"{v['quantity']:,}")
97
            item_2 = self.tableAsks.cellWidget(i, 2)
98
            item_2.setRange(0, maxtradingValue)
99
            item_2.setFormat(f"{tradingAskValues[i]:,}")
100
            item_2.setValue(tradingAskValues[i])
101
102
        for i, v in enumerate(data['bids'][::-1]):
103
            item_0 = self.tableBids.item(i, 0)
104
            item_0.setText(f"{v['price']:,}")
105
            item_1 = self.tableBids.item(i, 1)
106
            item_1.setText(f"{v['quantity']:,}")
107
            item_2 = self.tableBids.cellWidget(i, 2)
108
            item_2.setRange(0, maxtradingValue)
109
            item_2.setFormat(f"{tradingBidValues[i]:,}")
110
            item_2.setValue(tradingBidValues[i])
111
112
    def updateUpbitData(self, data):
113
        tradingBidValues = []
114
        tradingBidList = []
115
        tradingAskValues = []
116
        tradingAskList = []
117
118
        # 값 10개만 생성
119
        for i in range(0, 10):
120
            tradingBidValues.append(int(data['orderbook_units'][i]['bid_price'] * data['orderbook_units'][i]['bid_size']))
121
            tradingAskValues.append(int(data['orderbook_units'][i]['ask_price'] * data['orderbook_units'][i]['ask_size']))
122
            
123
            # 빗썸 예제와 동일한 구조를 가지도록 데이터 가공(매수)
124
            tradingBidsDict = {"price" : data['orderbook_units'][i]['bid_price'], "size" : data['orderbook_units'][i]['bid_size']}
125
            tradingBidList.append(tradingBidsDict)
126
127
            # 빗썸 예제와 동일한 구조를 가지도록 데이터 가공(매도)
128
            tradingAsksDict = {"price" : data['orderbook_units'][i]['ask_price'], "size" : data['orderbook_units'][i]['ask_size']}
129
            tradingAskList.append(tradingAsksDict)
130
131
            maxtradingValue = max(tradingBidValues + tradingAskValues)
132
133
        # 빗썸 예제와 동일한 구조를 가지도록 데이터 가공(Dictionary)
134
        resultData = {"bids" : tradingBidList, "asks" : tradingAskList}
135
136
        for i, v in enumerate(resultData['asks'][::-1]):
137
            item_0 = self.tableAsks.item(i, 0)
138
            item_0.setText(f"{v['price']:,}")
139
            item_1 = self.tableAsks.item(i, 1)
140
            # item_1.setText(f"{v['size']:,}") - 해당방식은 e형식 출력이 됨.
141
            item_1.setText(f"{format(v['size'],'f')}") # format을 f로 설정해야 소수로 표기해줌
142
            item_2 = self.tableAsks.cellWidget(i, 2)
143
            item_2.setRange(0, maxtradingValue)
144
            item_2.setFormat(f"{tradingAskValues[i]:,}")
145
            item_2.setValue(tradingAskValues[i])
146
147
        for i, v in enumerate(resultData['bids']):
148
            item_0 = self.tableBids.item(i, 0)
149
            item_0.setText(f"{v['price']:,}")
150
            item_1 = self.tableBids.item(i, 1)
151
            # item_1.setText(f"{v['size']:,}") - 해당방식은 e형식 출력이 됨.
152
            item_1.setText(f"{format(v['size'],'f')}") # format을 f로 설정해야 소수로 표기해줌
153
            item_2 = self.tableBids.cellWidget(i, 2)
154
            item_2.setRange(0, maxtradingValue)
155
            item_2.setFormat(f"{tradingBidValues[i]:,}")
156
            item_2.setValue(tradingBidValues[i])
157
158
    def closeEvent(self, data):
159
        self.ow.close()
160
161
if __name__ == "__main__":
162
    app = QApplication(sys.argv)
163
    ow = OrderbookWidget()
164
    ow.show()
165
    exit(app.exec_())
166
</pre>
167
168
h3. 결과
169
170
!clipboard-202502121730-ktzkj.png!