💻 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("값이 없음")
'💻 Programming (프로그래밍) > Python' 카테고리의 다른 글
🏆️ [대상][수어 교육 및 번역 플랫폼] 수어쉬워 (0) | 2022.07.31 |
---|---|
[Python][업비트 자동매매프로그램] 5. 기능 (2) (0) | 2022.07.25 |
[Python][업비트 자동매매프로그램] 3. 뷰 (0) | 2022.07.14 |
[Python][업비트 자동매매프로그램] 2. 메인 루프 (0) | 2022.07.13 |
[Python][업비트 자동매매프로그램] 1. 목업 제작 (0) | 2022.07.12 |
Contents
소중한 공감 감사합니다