API : part5 호가창 클래스 , 프로그램 작동
✨오늘은 마지막으로 호가창 클래스를 만들어 프로그램을 작동시킬 것입니다!
✨이전에 만들었던 쓰레드클래스(OrderbookWorker(QThread))를 통해 바이낸스 API데이터를 불러와 매도/ 매수등이 담긴 메서드 클래스(BinanceFunction())를 사용하여 프로그램이 작동시킵니다.
아래가 호가창 클래스 코드입니다.
📌호가창 클래스
''' 메인 프레임'''
class OrderbookWidget(QWidget,BinanceFunction):
def __init__(self, parent=None, ticker="TRX/USD"):
super().__init__(parent)
uic.loadUi("mainUI.ui", self)
self.ticker = ticker
#item
#코인 종류 고르는 매서드
item_box = binance.symbols
self.coin_box.addItems(item_box)
#아이콘
self.setWindowTitle("System Trading")
self.setWindowIcon(QIcon("icon.png"))
#배경색
pal = QPalette()
pal.setColor(QPalette.Background, QColor('#1C1C1C'))
self.setAutoFillBackground(True)
self.setPalette(pal)
#테이블 배경색
#매도테이블
self.tableAsks.setStyleSheet("QTableWidget {\n"
"color: #F7819F;"
"background-color:rgb(28, 28, 28)\n"
" \n"
"\n"
"\n"
"\n"
"}")
#매수테이블
self.tableBids.setStyleSheet("QTableWidget {\n"
"color: #58FA82;"
"background-color:rgb(28, 28, 28)\n"
" \n"
"\n"
"\n"
"\n"
"}")
'''매수, 매도 버튼 이벤트'''
self.buy_present.setStyleSheet("background-color : #58FA82;") ##00FF00 "color: #FAFAFA;"
self.buy_present.clicked.connect(self.buy_long)
self.sell_present.setStyleSheet("background-color : #ff5522;")
self.sell_present.clicked.connect(self.sell_short)
'''취소 버튼 이벤트'''
self.cancel_all.setStyleSheet("background-color : #ff7f50 ;")
self.cancel_all.clicked.connect(self.cancel_all_order)
# ----------------- 호가창 데이터 ------------------
for i in range(10):
# 매도호가 : 3열데이터
item_2 = QTableWidgetItem(str(""))
item_2.setTextAlignment(Qt.AlignCenter | Qt.AlignVCenter)
self.tableAsks.setItem(i, 2, item_2)
# 매도 물량 : 2열데이터
item_1 = QTableWidgetItem(str(""))
item_1.setTextAlignment(Qt.AlignRight | Qt.AlignVCenter)
self.tableAsks.setItem(i, 1, item_1)
# 매수호가 : 3열데이터
item_2 = QTableWidgetItem(str(""))
item_2.setTextAlignment(Qt.AlignCenter | Qt.AlignVCenter)
self.tableBids.setItem(i, 2, item_2)
# 매수물량 : 4열데이터
item_3 = QTableWidgetItem(str(""))
item_3.setTextAlignment(Qt.AlignLeft | Qt.AlignVCenter)
self.tableBids.setItem(i, 3, item_3)
self.ow = OrderbookWorker(self.ticker)
self.ow.dataSent.connect(self.updateData)
self.ow.start()
def updateData(self, data):
global g_tick_data #전역변수로 설정하여 유동적으로 다른코인 호가창으로 변경가능
g_tick_data = str(self.coin_box.currentText())
for i, v in enumerate(data['asks'][::-1]): #매도 i= 0 매도 v= [2.13441, 311.0]
item_2 = self.tableAsks.item(i, 2)
item_2.setText(f"{v[0]:,}")
item_1 = self.tableAsks.item(i, 1)
item_1.setText(f"{v[1]:,}")
for i, v in enumerate(data['bids']):
item_2 = self.tableBids.item(i, 2)
item_2.setText(f"{v[0]:,}")
item_3 = self.tableBids.item(i, 3)
item_3.setText(f"{v[1]:,}")
def updataBalance(self, balance, ticker):
free = str(balance[g_tick_data.split('/')[0]]['free'])
used = str(balance[g_tick_data.split('/')[0]]['used'])
total = str(balance[g_tick_data.split('/')[0]]['total'])
coin_usd = str(int(balance[g_tick_data.split('/')[0]]['total']) * round(float(ticker['close']), 2))
self.tableBalance.setItem(0, 0, QTableWidgetItem(free))
self.tableBalance.setItem(0, 1, QTableWidgetItem(used))
self.tableBalance.setItem(0, 2, QTableWidgetItem(total))
self.tableBalance.setItem(0, 3, QTableWidgetItem(coin_usd))
def closeEvent(self, event):
self.ow.close()
🌲프로그램 코드 특징
✔ 클래스
class OrderbookWidget(QWidget,BinanceFunction)
- 파이썬은 다중 클래스 상속이 되기 때문에 프로그램창을 띄어주는 QWidget과 메서드를 편하게 사용하기 위한 BinanceFunction를 상속 받아 사용한다.
✔ 초기화 함수
def __init__(self, parent=None, ticker="TRX/USD")
- 매매에 필요한 변수 : 코인 종류, 호가창 생상 구조 등을 초기화 해준다.
- QTdesigner에 작성한 UI를 적용하며 호가창 기본 설정을 해준다.
- 매도호가/ 매수호가가 3열에 나란히 구성, 2열은 매도물량, 4열은 매수물량을 보여준다
아래사진 처럼 열의 인덱스를 가진다.
🌳 매수, 매도, 주문취소 메서드 구현
✨매수, 매도, 버튼 이벤트
self.buy_present.setStyleSheet("background-color : #58FA82;")
self.buy_present.clicked.connect(self.buy_long)
self.sell_present.setStyleSheet("background-color : #ff5522;")
self.sell_present.clicked.connect(self.sell_short)
self.cancel_all.setStyleSheet("background-color : #ff7f50 ;")
self.cancel_all.clicked.connect(self.cancel_all_order)
- buy_present는 QTdesigner에서 설정된 매수버튼의 변수이름으로 setStyleSheet으로 디자인 설정 함
- self.buy_present.clicked.connect(self.buy_long) : 버튼을 클릭하면 매수하는 buy_long 메서드 실행
위와 같은 형식으로 매수, 메도, 주문취소 메서드가 버튼을 누르면 실행됌
✔ 데이터 불러와 호가창에 삽입하는 메서드
def updateData(self, data)
- itembox에 있는 코인들중 하나가 g_tick_data 에 담에 해당 코인의 호가를 불러옴
- 쓰레드 클래스에서 전송된 매개변수 data를 통해 얻은 호가데이터를 호가창에 삽입한다
- 매수호가와 매도호가를 구분하여 UI에 삽입
✔ 현재 거래 포지션과 잔고를 계산하는 메서드
def updataBalance(self, balance, ticker)
- 바이낸스에서 받아온 잔고 데이터 파라미터인 balance를 split하여 잔고 데이터를 얻어 삽입
✔ 프로그램 종료 메서드
def closeEvent(self, event)
- 프로그램 창을 닫거나 종료하면 API 통신을 끊고 프로그램을 종료한다.
📌 프로그램 시작 코드
if __name__ == "__main__":
app = QApplication(sys.argv)
ow = OrderbookWidget()
ow.show()
exit(app.exec_())
✔ 프로그램 종료 메서드
- 해당 코드를 통해 PYQT어플리케이션을 실행하여 UI를 화면에 보여준다
📌 마무리
✔ 깃허브에서 mainUi.ui 파일을 다운받아 같은 디렉토리에서 실행하면 완성
🌳 동영상 동영상은 아래 프로그램 UI사진 클릭하면 재생됌
위 코드등을 통해 이제까지 만들어왔던 클래스들을 상호 연결하여 사용할 수 있다. 위의 메서드들을 활용하여 성공적인 투자를 하시기 바랍니다!💡💡