코인 선물 트레이딩 프로그램, 바이낸스(Binance) API : part5 호가창 클래스 , 프로그램 작동1

DongJoo Kwak·2022년 3월 11일
0
post-thumbnail

✨오늘은 마지막으로 호가창 클래스를 만들어 프로그램을 작동시킬 것입니다!

✨이전에 만들었던 쓰레드클래스(OrderbookWorker(QThread))를 통해 바이낸스 API데이터를 불러와 매도/ 매수등이 담긴 메서드 클래스(BinanceFunction())를 사용하여 프로그램이 작동시킵니다.

아래가 호가창 클래스 코드입니다.

프로그램 자세한 코드 및 내용 -> https://url.kr/7bwveh

📌호가창 클래스

''' 메인 프레임''' 
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 파일을 다운받아 같은 디렉토리에서 실행하면 완성

  • 코드 및 프로그램 실행화면은 아래 GITHUB에서 확인 : 클릭하면 연결
  • 매도 매수 주문취소 등의 메서드는 UI코드와 연결되어 있어 작동됌
    고양이애옹


🌳 동영상 동영상은 아래 프로그램 UI사진 클릭하면 재생됌

고양이애옹

위 코드등을 통해 이제까지 만들어왔던 클래스들을 상호 연결하여 사용할 수 있다. 위의 메서드들을 활용하여 성공적인 투자를 하시기 바랍니다!💡💡

profile
즐거운 개발 공간

0개의 댓글