크립토 자동매매 개발을 위한 Python 기초(2)

Jackinthebox101·2023년 6월 12일

Python

목록 보기
2/2

논리연산자

#논리연산자

#and : 조건을 모두 만족해야한다.

symbol = "DOGE/KRW"
price = 150

if symbol == "DOGE/KRW" and price < 200:
    print("도지코인이 200원보다 작다")

#or : 하나만 만족시키면 실행

if symbol == "DOGE/KRW" or price < 130:
    print("도지코인이 200원보다 작다")

#not : 논리의 반대/부정

name = "jeck"

if not name =="jack":
    print("jack이 아니다!")

age = 20
if not age <= 19:
    print("성인!")

upbit API 발급

upbit 홈페이지 -> my -> Open API관리 -> 필요한 기술 선택 -> IP 입력 -> Open Api key 발급
->access key, secret key 알아두기

upbit 주문하기

import ccxt
upbit = ccxt.upbit()

access_key = "@@@@@@@@@@@@@@@"
secret_key = "@@@@@@@@@@@@@@@"

upbit.apiKey = access_key
upbit.secret = secret_key

#시장가 주문 : 업비트, 최소 주문금액 5000원
upbit.create_market_order("REP/KRW", "buy", 5000, 1)      #(종목, buy, 금액, 비용(1))
upbit.create_market_order("REP/KRW", "sell", 0.6)       #(종목, sell, 금액이 아닌 갯수)

#지정가 주문
upbit.create_limit_order("REP/KRW", "buy", 10, 7400)     #(종목, buy, 구매 수량, 지정 금액)
upbit.create_limit_order("REP/KRW", "sell", 10, 7500)

예외처리

import ccxt
upbit = ccxt.upbit()

access_key = "@@@"
secret_key = "@@@"

upbit.apiKey = access_key
upbit.secret = secret_key

try:
    #에러(없는 종목)
    upbit.create_market_order("ASD/KRW", "buy", 10000, 1)
except Exception as e:
    print("예외 발생: 없는 종목!")
    print(e)

print("예외처리완료")
  • 실행 중 에러가 발생하면 프로그램이 종료되기 때문에 이를 방지하기 위해 예외처리를 한다.
  • 기본 형태 : [try: ~ except:]
  • Exception을 통해 예외처리의 이유를 알 수 있다.

모듈

호출방법 1

import my_upbit       #방법1 :모듈 전체를 호출

try:
    #에러(없는 종목)
    my_upbit.upbit.create_market_order("ASD/KRW", "buy", 10000, 1)
except Exception as e:
    print("예외 발생: 없는 종목!")
    print(e)

print("예외처리완료")

import my_upbit : 모듈의 기능 전체를 호출한다.

호출방법2

from my_upbit import upbit      #방법2 : 모듈 내 upbit만 호출      


try:
    #에러(없는 종목)
    upbit.create_market_order("ASD/KRW", "buy", 10000, 1)
except Exception as e:
    print("예외 발생: 없는 종목!")
    print(e)

print("예외처리완료")

from my_upbit import upbit : 모듈 내 필요한 기능만 호출한다.

함수만들기

#기본형 : 입력, 출력이 없는 함수 
def hi():
    print("hi")

hi()

#입력은 없지만 출력은 있는 함수
def hi2():
    return "hi"
a = hi2()
print(a)

#입력과 출력 둘 다 가능한 함수
def add(n1, n2):
    return n1 + n2
print(add(1, 3))

#가격 확인하다 매수하는 함수 
from my_upbit import upbit

def watch_and_order():
    print("가격을 감시하다 매수를 하는 함수")
    infos = upbit.fetch_ticker("XRP/KRW")
    price = infos["close"]
    percent = infos["percentage"]
    rounded_percent = round(percent, 2)     #소수점 두자리까지(세번째에서 반올림)
    print(f"현재 코인의 가격은 {price}원이고 전일대비 {rounded_percent}%입니다.")
    if percent < 3:       
        upbit.create_market_order("XRP/KRW", "buy", 10000, 1)
    
while True:       # 3%이하일때 무한 매수 
    watch_and_order()

전역 / 지역변수

age = 19 #전역변수
def plus_age():
    age = age + 1 #지역변수
    print(f"오늘부터{age}살입니다!")

plus_age()
  • 첫번째 age는 전역변수 : 전체 프로그램에 영향
  • 함수 안의 age는 지역변수 : 함수 내에서만 영향
  • 이를 해결하기 위해 global 사용

모듈활용

import ccxt
upbit = ccxt.upbit()

access_key = "@@@"
secret_key = "@@@"

upbit.apiKey = access_key
upbit.secret = secret_key

is_buy = False      #무한 반복을 피하기 위해 추가
def watch_and_order():
    global is_buy
    infos = upbit.fetch_ticker("XRP/KRW")
    price = infos["close"]
    percent = infos["percentage"]
    rounded_percent = round(percent, 2)     #소수점 두자리까지(세번째에서 반올림)
    print(f"현재 코인의 가격은 {price}원이고 전일대비 {rounded_percent}%입니다.")
    if percent < 3 and not is_buy:        #3%보다 작을때 그리고 사지 않으면 반복
        upbit.create_market_order("XRP/KRW", "buy", 10000, 1)
        is_buy = True
  • 반복을 피하기 위해 is_buy 활용
  • 전역변수 is_buy를 함수 안에서 global로 선언
  • if percent < 3 and not is_buy:
    전일대비 등락폭이 3%보다 작고 is_buy가 만족하지 않는다면 반복, 만족한다면(거래체결시) is_buy는 참이되어 프로그램 종료
#가격 확인하다 매수하는 함수 
from my_upbit import upbit, watch_and_order

while True:       # 3%이하일때 무한 매수 
    watch_and_order()
  • 위 코드를 모듈화 하면 다음 추가적 코딩에 수월하다.

클래스(class)

  • 객체(instance)를 만들어내기 위한 틀
  • 새로운 함수를 추가할 경우를 대비할 수 있으며 코드를 간결하게 작성할 수 있고 특정기능 또는 특정 변수에만 적용하는 함수를 쉽게 유지, 보수할 수 있는 장점이 있다.
  • 메서드(method) : class안의 함수
import ccxt
upbit = ccxt.upbit()

access_key = "@@@"
secret_key = "@@@"


class Myupbit():
    #생성자 : 초기에 딱 한번 설정을 해주는 역할
    def __init__(self):
        print("딱 한번만!")
        self.upbit = ccxt.upbit()
        self.upbit.apiKey = access_key
        self.upbit.secret = secret_key
        self.is_buy = False
    def watch_and_order(self):
        ## global is_buy : class 로 모두 공유하여 삭제
        infos = self.upbit.fetch_ticker("XRP/KRW")
        price = infos["close"]
        percent = infos["percentage"]
        rounded_percent = round(percent, 2)     #소수점 두자리까지(세번째에서 반올림)    
        print(f"현재 코인의 가격은 {price}원이고 전일대비 {rounded_percent}%입니다.")
        if percent < 3 and not is_buy:        #3%보다 작을때 그리고 사지 않으면 반복
            self.upbit.create_market_order("XRP/KRW", "buy", 10000, 1)
            is_buy = True

myupbit = Myupbit()

import ccxt
upbit = ccxt.upbit()


class Myupbit():
    #생성자 : 초기에 딱 한번 설정을 해주는 역할
    def __init__(self, key, secret):
        print("딱 한번만!")
        self.upbit = ccxt.upbit()
        self.upbit.apiKey = key
        self.upbit.secret = secret
        self.is_buy = False
    def watch_and_order(self):
        infos = self.upbit.fetch_ticker("XRP/KRW")
        price = infos["close"]
        percent = infos["percentage"]
        rounded_percent = round(percent, 2)     #소수점 두자리까지(세번째에서 반올림)
        print(f"현재 코인의 가격은 {price}원이고 전일대비 {rounded_percent}%입니다.")
        if percent < 3 and not is_buy:        #-3%보다 작을때 그리고 사지 않으면 반복
            self.upbit.create_market_order("XRP/KRW", "buy", 10000, 1)
            is_buy = True

access_key = "@@@"
secret_key = "@@@"
jack_upbit = Myupbit(access_key, secret_key)
jack_upbit.watch_and_order()
  • 이전 코드는 api key가 고정되어 있어 자신만 사용가능
  • 생성자 파라미터에 key와 secret을 추가해서 다른 api가 추가되더라도 사용할 수 있게 변경
  • jack_upbit : 추가되는 api의 구별을 위해 api key값을 새로운 함수에 저장

클래스 개선

import ccxt
upbit = ccxt.upbit()


class Myupbit():
    #생성자 : 초기에 딱 한번 설정을 해주는 역할
    def __init__(self, key, secret):
        print("딱 한번만!")
        self.upbit = ccxt.upbit()
        self.upbit.apiKey = key
        self.upbit.secret = secret
        self.is_buy = False
    def watch_and_order(self, symbol, money, watch_percent):
        infos = self.upbit.fetch_ticker(symbol)
        price = infos["close"]
        percent = infos["percentage"]
        rounded_percent = round(percent, 2)     #소수점 두자리까지(세번째에서 반올림)
        print(f"현재 {symbol}의 가격은 {price}원이고 전일대비 {rounded_percent}%입니다.")
        if percent < watch_percent and not self.is_buy:        #3%보다 작을때 그리고 사지 않으면 반복
            self.upbit.create_market_order(symbol, "buy", money, 1)
            self.is_buy = True

access_key = "@@@"
secret_key = "@@@"
jack_upbit = Myupbit(access_key, secret_key)

while True:         #아래 종목 중 특정 퍼센티지에 도달한 종목이 거래 체결되면 self.is_buy에 걸려 프로그램 종료 
    jack_upbit.watch_and_order("종목", "금액", "퍼센티지")
    jack_upbit.watch_and_order("종목", "금액", "퍼센티지")
    jack_upbit.watch_and_order("종목", "금액", "퍼센티지")
    jack_upbit.watch_and_order("종목", "금액", "퍼센티지")
  • 최대한 범용적으로 사용할 수 있도록 고정된 값을 입력 받을 수 있게 변경
  • .watch_and_order: 여러 종목을 동시에 탐색하고 매수거래체결 가능
  • symbol : 종목
  • price : 가격
  • watch_percent : 퍼센티지
  • while True: 아래 종목 중 조건에 맞은 종목의 거래가 체결됐을 시 self.is_buy에 걸려 프로그램 종료

사용 예

from my_upbit2 import Myupbit

access_key = "@@@"
secret_key = "@@@"
jack_upbit = Myupbit(access_key, secret_key)

while True:         
    jack_upbit.watch_and_order_many("DOGE/KRW", 10000, 0)
    jack_upbit.watch_and_order_many("BTC/KRW", 10000, 0)
    jack_upbit.watch_and_order_many("XRP/KRW", 10000, 0)
    jack_upbit.watch_and_order_many("APT/KRW", 10000, 0)
    jack_upbit.watch_and_order_many("ETH/KRW", 10000, 0)
  • watch_and_order를 추가한 클래스를 import한 후 조건문만 작성한다면 이렇게 간단하게 새로운 결과값을 구할 수 있다.

python 실행

class.py를 복붙 -> main.py로 변경 -> cmd에서 실행

profile
Jack의 개발새발

0개의 댓글