새소식

💻 Programming (프로그래밍)/Python

[Python][업비트 자동매매프로그램] 4. 기능 (1)

  • -

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

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


🌳 1. SubView

 

서브뷰의 목적은  매매하고 싶은 가상화폐의 종류와, 주문수량, 매수, 매도, 손절가격을 저장하여 mainview에 그 정보를 넘기는 게 목적입니다.


- orderFrame , 가격 전송 기능

 

콤보로 이루어진 가상화폐 종류를 클릭시마다, 오른쪽의 현재가격에 가격정보가 전송되는 기능입니다.

class orderFrame(tk.LabelFrame):
	der __init__(): # ... 생략
    
    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'])

Change_price_label 이라는 함수를 만들어, 콤보박스가 체크된 종류를 가져온뒤, 

pyupbit.get_current_price(ticker) 함수를 통하여 가상화폐 krw 가격을 넣어주었습니다.

 

-  매매 정보 전송 기능

확인을 누르면 MainView로 전송이 됩니다.

 

이는  subView의 확인에 Add_Confirm 라는 함수를 바인드하였고,

대기중인 주문 프레임안으로 해당 정보를 넘겨주는 기능입니다.

    def Add_Confirm(self, event):
        mm_txt = []
        mm_txt = [self.subMain.request_frame.cmb_type.get(), self.subMain.request_frame.cmb_amount.get(),\
            self.subMain.buy_frame.e.get(), self.subMain.sell_frame.e.get(), self.subMain.stoploss_frame.e.get()]
        self.standby_list_frame.in_list.insert(tk.END, mm_txt)

이는 mainView.py에서 구현되었습니다.


subView.py

더보기
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'))
        
        # Function     
        self.buy_frame.cmb.bind("<<ComboboxSelected>>", \
            lambda event, a= self.request_frame, b=self.buy_frame:
            self.Conv(event,a,b))
        
        self.sell_frame.cmb.bind("<<ComboboxSelected>>", \
            lambda event, a= self.buy_frame, b=self.sell_frame:
            self.Conv(event,a,b))

        self.stoploss_frame.cmb.bind("<<ComboboxSelected>>", \
            lambda event, a= self.buy_frame, b=self.stoploss_frame:
            self.Conv(event,a,b))

        self.okcnl_frame.btn2.bind("<Button-1>", self.Quit)

        
    def Conv(self, event, a , b):
        cost = a.cost.get()
        if b.cmb.get() == "직접입력":
            pass
        else:
            rate = b.cmb.get()[:-1]

            if b['text'] == "손절":
                rate = '-' + rate

            cur_price = cost
            b.e.delete("0", tk.END)
            b.e.insert(0, orderF2.Change(cur_price, rate))
            b.cost.set(b.e.get())

    def Quit(self, event):
        self.master.destroy()

orderF2.py

더보기
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'])

# 가격 측정 프레임
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")
    
    # Add_Confirm

# 가격 조정 - 고쳐야 하는 함수!!
def Change(cur_price, rate):
    cur_price = float(cur_price)
    rate = float(rate)
    cur_price += (cur_price * (rate/100))
    
    # .. while 문으로 바꾸기..
    if cur_price > 0 and cur_price < 10:
        return round(cur_price, 4)
    elif cur_price >= 10 and cur_price <100:
        return round(cur_price, 3)
    elif cur_price >= 100 and cur_price <1000:
        return round(cur_price, 2)
    elif cur_price >= 1000 and cur_price <10000:
        return round(cur_price, 1)
    elif cur_price >= 10000 and cur_price <100000:
        return round(cur_price, 0)
    elif cur_price >= 100000 and cur_price <1000000:
        return round(cur_price, -1)
    elif cur_price >= 1000000 and cur_price <10000000:
        return round(cur_price, -2)
    elif cur_price >= 10000000 and cur_price <100000000:
        return round(cur_price, -3)
    elif cur_price >= 100000000 and cur_price <1000000000:
        return round(cur_price, -4)
    else:
        print("값이 없음")
Contents

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

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