새소식

💻 Programming (프로그래밍)/Python

[Python][업비트 자동매매프로그램] 3. 뷰

  • -

해당 포스팅은 upbit API를 손쉽게 이용하기 위한 pyupbit 그리고 GUI 라이브러리를 위한 tkinter을 사용하였습니다.

[UPBIT] DCTSS(가상화폐 매매 서포트 프로그램)


🌳 1. View

차후에 여러 기능들을 두기 위해 하나의 연결해주는 View 클래스를 만들었습니다.

아직까진 지금까지 만든 기능 1개만 연결했습니다.

import tkinter as tk
from tkinter.constants import BOTH
from .V1 import mainView as W1

## View
class View(tk.Frame):
    def __init__(self, master):
        tk.Frame.__init__(self, master)

        # mainView Init        
        self.main = W1.View_main(master)
        self.main.pack(fill = BOTH, expand= True)

 

🌳 2. MainView

뷰를 만들기 위해 쓴 클래스입니다.

import tkinter as tk
import tkinter.messagebox as msgbox
# 주문 리스트 프레임
class orderFrame(tk.LabelFrame):
    def __init__(self, parent, *args, **kwargs):
        tk.LabelFrame.__init__(self, parent, *args, **kwargs)

        # 리스트의 스크롤바
        self.in_scrollbar = tk.Scrollbar(self)
        self.in_scrollbar.pack(side="right", fill="y")

        # 리스트
        self.in_list = tk.Listbox(self, selectmode="extended", height=8, yscrollcommand=self.in_scrollbar.set)
        self.in_list.pack(side="left", fill="both", expand=True, padx=5, pady=5)
        self.in_scrollbar.config(command=self.in_list.yview)

        # 캔버스 도형 : 주문 체크용
        self.in_switch = tk.Canvas(self, width= 10, height=20, bg="#FF6666")
        self.in_switch.pack(side="left",fill="y", pady=5, anchor="w")


# 기능 프레임
class funcFrame(tk.Frame):
    def __init__(self, parent, *args, **kwargs):
        tk.Frame.__init__(self, parent)
    
        # 기능1 버튼
        self.btn1 = tk.Button(self, padx=5, pady=5, width=12, text= kwargs.get("n1"))
        self.btn1.pack(side="left")

        # 기능2 버튼
        self.btn2 = tk.Button(self, padx=5, pady=5, width=12, text= kwargs.get("n2"))
        self.btn2.pack(side="right")
         # command= self.Del_Cancle
          # command=self.mul_select
          # command = self.cnl_mul_select


# 현재 자산 프레임
class currencyFrame(tk.Frame):
    def __init__(self, parent, *args, **kwargs):
        tk.Frame.__init__(self, parent)
        
        # krw 표시 레이블
        self.cur_asset_krw_label = tk.Label(self, text="krw")
        self.cur_asset_krw_label.pack(side="right")

        # 현재자산 레이블
        # cur_krw_balances = upbit.get_balance("KRW")
        self.cur_asset_label = tk.Label(self, width=15, anchor="e") # text=cur_krw_balances
        self.cur_asset_label.pack(side="right")

        # 주문가능 레이블
        self.cur_asset_txt_label = tk.Label(self, text="주문가능")
        self.cur_asset_txt_label.pack(side="right")

mainView를 만들기위해 우선 3가지 클래스로 나눴습니다.

 

- orderFrame 부분

 

- funcFrame 부분

 

- currencyFrame 부분

 

이후 이 클래스들을 이용하여, 

tkinter의 packing을 통해 조합해줬습니다.

import tkinter as tk
import tkinter.messagebox as msgbox
import pyupbit
from tkinter.constants import BOTH, TOP
from . import orderF1
from ..V2 import subView as W2

class View_main(tk.Frame):
    def __init__(self, parent, *args, **kwargs):
        tk.Frame.__init__(self, parent, *args, **kwargs)

        self.in_list_frame = orderF1.orderFrame(self, text="진행중인 주문") # 매매진행 리스트 프레임
        self.standby_list_frame = orderF1.orderFrame(self, text="대기중인 주문") # 매매대기 리스트 프레임
        self.func_frame = orderF1.funcFrame(self, n1 = "추가", n2 = "삭제") # 기능 프레임1(추가, 삭제)
        self.func_frame2 = orderF1.funcFrame(self, n1= "실행", n2= "실행취소") # 기능 프레임2 (실행, 실행취소버튼)
        self.func_frame3 = orderF1.funcFrame(self, n1="자동매수", n2="자동매수취소")  # 기능 프레임3 (자동매수, 자동매수취소버튼 )
        self.cur_asset_frame = orderF1.currencyFrame(self) # 주문가능한 현재자산 프레임

        # Packing
        self.in_list_frame.pack(fill="both", expand=True, padx=5, pady=5, ipady=5)
        self.standby_list_frame.pack(fill="both", expand=True, padx=5, pady=5, ipady=5)
        self.func_frame.pack(fill="both", padx=5, pady=5)
        self.func_frame2.pack(fill="both", padx=5, pady=5)
        self.func_frame3.pack(fill="both", padx=5, pady=5)
        self.cur_asset_frame.pack(fill="both", padx=5, pady=5, ipady=10, ipadx=10)

 

 


똑같이 mainView에 주문을 하기위한 subView를 만들어줍니다.

 

🌳 3. SubView

원하는 주문을 하고, 확인을 누르면 mainView의 대기중인 주문에 입력을 위한 View입니다.

 

import tkinter as tk
import tkinter.ttk as ttk
import pyupbit

# 주문 프레임
class orderFrame(tk.LabelFrame):
    def __init__(self, parent, *args, **kwargs):
        tk.LabelFrame.__init__(self, parent, *args, **kwargs)
        
        # 1. 가상화폐 종류 옵션
        # 종류 레이블
        type_label = tk.Label(self, text="종류", width=8)
        type_label.pack(side="left", padx=1, pady=5)

        # 종류 콤보
        type_opt = []

        for i in pyupbit.get_tickers(fiat="KRW"): # krw-분리과정
            _, a = i.split("-")
            type_opt.append(a)

        self.cmb_type = ttk.Combobox(self, state="readonly", values=type_opt, width=10)
        self.cmb_type.current(0)
        self.cmb_type.pack(side="left", padx=5, pady=5)
        self.cmb_type.bind("<<ComboboxSelected>>", self.Change_price_label)

        # 2. 현재가격 옵션
        # 현재가격 txt 레이블
        cur_price_txt_label = tk.Label(self, text="현재가격")
        cur_price_txt_label.pack(side="left", padx=5, pady=5)

        # 현재 가격 레이블
        self.cur_price_label = tk.Label(self, width=10, text="", anchor="e")
        self.cur_price_label.pack(side="left", padx=5, pady=5)

        # 현재가격 krw 레이블
        cur_price_krw_label = tk.Label(self, text="krw")
        cur_price_krw_label.pack(side="left")

        # 3. 주문수량 옵션
        # 주문수량 레이블
        amount_label = tk.Label(self, text="주문수량", width=8)
        amount_label.pack(side="left", padx=5, pady=5)

        # 주문수량 콤보
        amount_opt = ["5%" ,"10%", "20%", "30%", "40%", "50%", "60%", "70%", "80%", "90%", "100%"] # 추가 될 예정
        self.cmb_amount = ttk.Combobox(self, state="readonly", values=amount_opt, width=10)
        self.cmb_amount.current(0)
        self.cmb_amount.pack(side="left", padx=5, pady=5)

        self.cost = tk.DoubleVar()
    
    # 콤보 선택 시 가격 나오게 
    def Change_price_label(self, event):
        ticker = "KRW-" + self.cmb_type.get()
        self.cur_price_label['text'] = pyupbit.get_current_price(ticker)  # 코인종류를 변경할때마다 그때의 가격이 출력
        self.cost.set(self.cur_price_label['text'])

    # def getPrice(self):
    #     cost = tk.StringVar(self.cur_price_label['text'])
    #     return cost

# 가격 측정 프레임
class costFrame(tk.LabelFrame):
    def __init__(self, parent, *args, **kwargs):
        tk.LabelFrame.__init__(self, parent, *args, **kwargs)
        self.cost = tk.DoubleVar()
        
        self.label = tk.Label(self, text= "가격", width=8)
        self.label.pack(side="left", padx=5, pady=5)
        
        # [매수, 매도, 손절] 가격 krw 레이블
        self.krw_label = tk.Label(self, text="krw")
        self.krw_label.pack(side="right")

        # [매수, 매도, 손절] 가격 엔트리
        self.e = tk.Entry(self, width=15) # 추가 될 예정
        self.e.pack(side="right")

        # [매수, 매도, 손절] 가격 콤보
        self.opt = ["직접입력" , "0%","1%", "2%", "3%", "4%" , "5%", "6%", "7%", "8%", "9%", "10%", "20%", "30%", "40%", "50%", "60%", "70%", "80%", "90%", "100%"] # 추가 될 예정
        self.cmb = ttk.Combobox(self, state="readonly", values=self.opt, width=10)
        self.cmb.current(0)
        self.cmb.pack(side="right", padx=5, pady=5)


# 기능 프레임
class funcFrame(tk.Frame):
    def __init__(self, parent, *args, **kwargs):
        tk.Frame.__init__(self, parent)
    
        # 기능1 버튼
        self.btn1 = tk.Button(self, padx=5, pady=5, width=15, text= kwargs.get("n1"))
        self.btn1.pack(side="left")

        # 기능2 버튼
        self.btn2 = tk.Button(self, padx=5, pady=5, width=15, text= kwargs.get("n2"))
        self.btn2.pack(side="right")

 

- orderFrame 부분

- costFrame 부분

- funcFrame 부분

 

import tkinter as tk
from . import orderF2

class View_main(tk.Frame):
    def __init__(self, master):
        tk.Frame.__init__(self, master)

        # 주문 프레임 (1-3)
        self.request_frame = orderF2.orderFrame(self, text="주문")
        # 매수 프레임 (4)
        self.buy_frame = orderF2.costFrame(self, text="매수")
        # 매도 프레임 (5)
        self.sell_frame = orderF2.costFrame(self, text="매도")
        # 손절 프레임 (6)
        self.stoploss_frame = orderF2.costFrame(self, text="손절")
        # 확인_취소 프레임 (7)
        self.okcnl_frame = orderF2.funcFrame(self, n1="확인", n2="취소")

        # Packing
        self.request_frame.pack(padx=5, pady=5, ipady=5)
        self.buy_frame.pack(padx=5, pady=5, ipady=5, fill="x")
        self.sell_frame.pack(padx=5, pady=5, ipady=5, fill="x")
        self.stoploss_frame.pack(padx=5, pady=5, ipady=5, fill="x")
        self.okcnl_frame.pack(padx=5, pady=5, ipady=5, fill="x")

        self.buy_frame.cost.set(self.request_frame.cur_price_label.cget('text'))

mainView와 같이 프레임을 만들고, 똑같이 packing을 통하여 subView를 만들었습니다.


다음시간에는 pyupbit 라이브러리를 활용한 기능들과, tkinter사이의 연동 기능들을 포스팅하겠습니다.

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.