본문 바로가기
IT - 코딩/트레이딩 관련

무위험 차익거래 자동매매 프로그램 1.API허용 및 입출금 주소등록

by 조기정 2023. 2. 26.

전체 코드는 저작권 등록도 된 마당에 공유하지 않겠으며 해당 코드는 저작권법에 따라 적용될 것.

 

 

 

해당 내용은 내가 저작권을 등록한 프로그램의 일부 내용을 가져와서 기재합니다.

주요 내용은 해당프로그램(무위험차익거래)을 서비스화 해 보기 위해 작성되었었습니다

 

먼저 사용자의 바이낸스와 업비트 암호키를 가져와 입력합니다.(여기서 저장해서 사용하기 위함.)

다른 사용자들도 해당 암호키만 입력하면 프로그램을 사용할 수 있게 하기 위함입니다.

import pickle

apikeys = {
'up_access_key' : "XhSlsBR2TIxLxY3473473jxrW2SR7z7uYqWM513",
'up_secret_key' : "DyQJsmN3X2cD347347347M0Ex5M3tGZniAJA",
'bin_access_key' : "hTlQ5BCtduq5r3473473473VrRl22EllG88a17347347OA7",
'bin_secret_key' : "3SiAst64QdCODcAf47347347347347233jh4huOeEEKB"
}

#api 키 값 저장
with open('apikeys.pickle','wb') as fw:
    pickle.dump(apikeys, fw)

 

# 업비트 잔고 조회 및 해당 코인 가격에 맞는 가격 도출 기능
access_key = apikeys['up_access_key']
secret_key = apikeys['up_secret_key']
upbit = pyupbit.Upbit(access_key, secret_key)

# 바이낸스 잔고조회
binance = ccxt.binance({
    'apiKey': g_api_key,
    'secret': g_secret_key})

binance_fu = ccxt.binance({
    'apiKey': g_api_key,
    'secret': g_secret_key,
    'options': {'defaultType': 'future'}})

client_spot = Spot(key=g_api_key
                   , secret=g_secret_key)

client = Client(api_key=g_api_key,
                api_secret=g_secret_key)

Usdt = upbit_get_usd_krw()
print('Usdt', Usdt)

사용할 패키지들에 암호키를 저장해줍니다.

balance = binance.fetch_balance()  # free:보유중인 코인, used:거래진행중인 코인 total:전체코인
print("총 자본", upbit.get_balance("KRW") + float(next((item for item in client.futures_account()['assets'] if item['asset'] == 'USDT'), None)['walletBalance']) * Usdt + balance['USDT']['free'] * Usdt)

# 업비트 현물계좌 원화(현금) 확인
# first_up_asset = 1000000
first_up_asset = upbit.get_balance("KRW")
up_asset = first_up_asset - first_up_asset * 0.0005  # 계좌 현금 확인
up_asset = up_asset - up_asset * 0.0005  # 수수료 보정치
print(up_asset, "업비드 자본(수수료 제외)")

총 자본(바이낸스) 및 업비트 거래소의 자본을 확인해 줍니다.

bin_fu_ass = float(next((item for item in client.futures_account()['assets'] if item['asset'] == 'USDT'), None)['walletBalance'])
print("바이낸스 선물계좌 달러 잔고 확인:", bin_fu_ass)

first_bin_fu_ass = bin_fu_ass
bin_fu_ass = bin_fu_ass - bin_fu_ass * 0.0004
binance_asset = bin_fu_ass * Usdt
print(binance_asset, "원 바이낸스 자본(조정 전)")

up_market_fee = float(upbit.get_chance("KRW-ETC")["maker_bid_fee"]) # 업비트 코인 현물 시장가 #taker,maker 동일해서 그런지 이것만 존재. @ # 다른 (코인)정보로 받아도 됨
bin_fees = binance_fu.fees
bin_spot_market_fee = bin_fees["trading"]['taker'] # 바이낸스 현물 시장가 수수료 #taker는 시장가   # maker 0.1% taker 0.1% # 0.001
bin_future_market_fee = bin_fees["future"]["trading"]["taker"] # 바이낸스 선물 시장가 수수료 #taker는 시장가 
bin_Coin_M_future_market_fee = bin_fees["delivery"]["trading"]["taker"] # 바이낸스 선물 coin-m 시장가 수수료 #taker는 시장가 

ban_list = ['CHZ','ETH','ANKR','LINK','BAT','SXP','ETC','OMG','MANA','ZRX','ENJ','STORJ','KNC','SRM','SRM','SAND','CVC','NEO','BCH','SC','QTUM']

수수료와 벤 리스트를 저장한다.

벤 리스트 안에는 업비트와 바이낸스 현/선물에 존재하는 코인들을 제외하고 주로 전송 속도가 느린 코인들로 되어있다.

 

def regester_by_upbit_withdrow_addres(sym_name):
    error_sym_name = []
    for i in range(len(sym_name)):
#         print(sym_name[i])
        try:
            bin_address = client_spot.deposit_address(sym_name[i])['address']
            bin_Memo = client_spot.deposit_address(sym_name[i])['tag']
            time.sleep(0.1)
            print(sym_name[i])
            print('bin_address', bin_address)
            print('bin_Memo', bin_Memo)
        except:
            print(sym_name[i],"바이낸스 지갑이 닫혔을 수도 있음")
            error_sym_name.append(sym_name[i])
    return error_sym_name

여기에서 바이낸스의 출금 주소를 등록해서 업비트에서 바이낸스에 자동으로 코인을 전송할 수 있게 업비트 사이트에서 코인 입출금 주소를 등록한다.

sym_name = sym_intersection()  # 업비트 현물 , 바이낸스 현물 , 바이낸스 선물의 교집합을 가진 심볼명만 가져옴
all_coin_info = client_spot.coin_info()  # 코인 정보를 전부 한번만 가져와서 저장함
sym_name = delet_None_network(all_coin_info, sym_name)

import pickle
try: 
    with open('regester_by_upbit.pickle', 'rb') as fr:
        regester_by_upbit = pickle.load(fr)
        past_sym_name = regester_by_upbit["past_sym_name"]
except:
    regester_by_upbit={}
    past_sym_name = regester_by_upbit['past_sym_name'] = []

여기에선 사전에 코드를 돌려두면 입력되는 심볼들을 제외하고 새로 등록한 심볼들만 가져온다.

def del_bin_disable_withdrow_deopsit(all_coin_info, sym_name):
    delet_list = []
    delet_list_append = delet_list.append
    for i in range(len(sym_name)):  # 바이낸스에서 입금 가능 , 전송 불가능
        depositEnable, withdrawEnable = bin_coin_withdrow_deopsit_Enable(all_coin_info, sym_name[i])
        #         print(sym_name[i],depositEnable,withdrawEnable)
        if (depositEnable == False or withdrawEnable == False):
            delet_list_append(sym_name[i])
    name = list(set(sym_name) - set(delet_list))
    return name
def bin_coin_withdrow_deopsit_Enable(all_coin_info, sym_name):
    try: #자기자신의 네트워크를 가지고, 현재 바이낸스의 입출금 가능상태를 가져옴
        aa = next((item for item in all_coin_info if item['coin'] == sym_name), None)['networkList']
        bb = next((item for item in aa if item['network'] == sym_name), None)
        depositEnable, withdrawEnable = bb['depositEnable'] , bb['withdrawEnable']
    except:
        depositEnable, withdrawEnable = False ,False

    return depositEnable, withdrawEnable

해당 부분에서 업비트와 바이낸스의 코인 입출금 상태를 가져와 둘다 입출금이 가능한 상태의 코인만 추가한다.

추가적으로 바이낸스에는 여러가지 코인의 전송 방식이 존재하나 업비트에서는 코인 자기자신의 주소로만 전송이 가능하다.

따라서 바이낸스에서 자기자신의 코인 주소명을 쓰는 코인들만 가져온다.

 

print("해당 주소 업비트 출금 주소에 등록할 것")
print("주소가 등록되지 않는 심볼들은 메모해두고 error_sym_name에 추가할 것.")
str_RRR = ("1. 업비트 로그인",
           '2. 마이페이지'
           '3. open API 관리'
           '4. 디지털 자산 출금주소 관리'
           '5. 코인명 심볼 검색 '
           '6. 출금주소 입력 '
           )
print(str_RRR)

# sym_name = sym_intersection() 

# 업비트에서 출금가능 바이낸스에서 입금가능 #업 => 바
sym_name = sym_intersection()  # 업비트 현물 , 바이낸스 현물 , 바이낸스 선물의 교집합을 가진 심볼명만 가져옴
Usdt = upbit_get_usd_krw()  # 업비트에서 1달러당 환율 가져옴
all_coin_info = client_spot.coin_info()  # 코인 정보를 전부 한번만 가져와서 저장함
sym_name = delet_None_network(all_coin_info, sym_name)  # 코인 스스로 전송 불가능 한 코인은 제외(바이낸스 체인 ,bnb만 전송가능한코인)
sym_name = del_bin_disable_withdrow_deopsit(all_coin_info, sym_name)  # 바이낸스 입출금 불가능 심볼 삭제

s3 = list(set(sym_name) - set(past_sym_name))
error_sym_name = regester_by_upbit_withdrow_addres(s3)#업비트 오류방지 !! 필요

업비트에 출금주소가 등록되지 않은 코인들만 가져온다.

여기서 AVAX코인은 어째서인지 업비트에서 출금 주소가 안된다 . 이런 코인은 심볼명을 따로 등록해두었다가,

error_sym_name = ["AVAX","NEO","QTUM"] # 전송 불가 심볼명 추가.
# error_sym_name.append('AVAX')
# error_sym_name.append('NEO')
error_sym_name = list(set(error_sym_name))
print(error_sym_name)

s3 = list(set(sym_name) - set(error_sym_name))

err_sym_name에 적어두면 해당코인은 제외하고 사용하게 된다.