반응형

안녕하세요. 이번 포스팅에서는 지난 글에 이어서 tkinter을 이용해 출력하는 것을 보여드리겠습니다. 현재 시간과 현재 포지션, 총 pnl을 출력해보겠습니다.

 

1. 현재 시간 출력

 현재시간은 'datetime'이라는 패키지를 통해 출력해보겠습니다.

import datetime as dt

now_time = dt.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
print(now_time)

 

 위의 코드의 결과는 아래와 같은데, "연도-월-일 시간-분-초"로 형식을 지정해준 대로 출력되는 모습입니다.

2022-10-19 12:47:32

 

2. tkinter을 이용해 새 창에 출력(시간)

이전 포스팅에서 준비해둔 tkinter 윈도우 창에 현재 시간을 출력해 보겠습니다.

import tkinter
import tkinter.font
import datetime as dt

win = tkinter.Tk ()
win.title("Traiding Tools")
win.configure(background='black')
win.geometry('200x200')
font=tkinter.font.Font(family="Arial", size=10, slant="italic", weight='bold')

now_time = dt.datetime.now().strftime("%Y-%m-%d %H:%M:%S")

lb_time = tkinter.Label(font=font, fg='white', background='black')
lb_time.place(x = 0, y = 0)
lb_time.configure(text = now_time)

win.mainloop()

 

 아래 사진이 해당 코드의 결과입니다. 현재의 시간이 잘 출력되는 것을 볼 수 있습니다. tkinter을 통해 레이블의 형식을 지정하고, 레이블을 배치할 위치를 정해준 뒤에 현재시간을 레이블에 집어넣는 코드입니다. 윈도우 창의 배경을 검은색으로 했기 때문에 레이블의 배경색도 검은색으로, 글씨 색은 흰색으로 지정해 주었습니다.

현재 시간 출력

 

3. tkinter을 이용해 새 창에 출력(오픈 포지션)

 이전 포스팅에서 받아온 바이낸스의 선물 포지션을 출력해 보겠습니다. 오픈되어 있는 포지션의 페어이름과 pnl을 출력하고자 합니다.

import tkinter
import tkinter.font
import datetime as dt
import ccxt
import os
import dotenv

win = tkinter.Tk ()
win.title("Traiding Tools")
win.configure(background='black')
win.geometry('200x200')
font=tkinter.font.Font(family="Arial", size=10, slant="italic", weight='bold')

now_time = dt.datetime.now().strftime("%Y-%m-%d %H:%M:%S")

lb_time = tkinter.Label(font=font, fg='white', background='black')
lb_time.place(x = 0, y = 0)
lb_time.configure(text = now_time)

dotenv_file = dotenv.find_dotenv()
dotenv.load_dotenv(dotenv_file)
apikey = os.environ['bn_apikey']
apisecret = os.environ['bn_secret']

binance = ccxt.binance(config={'apiKey': apikey, 'secret': apisecret})
balance = binance.fetch_balance(params={"type": "future"})
positions = balance['info']['positions']

symbol = []
size = []
pnl = []
for position in positions:
    if position['initialMargin'] != '0':
        symbol.append(position['symbol'])
        size.append(position['notional'])
        pnl.append(float(position['unrealizedProfit']))

y=0
x=67
for n in range(len(symbol)):
    y += 16
    globals()['lb_sym_' + symbol[n]] = tkinter.Label(font=font, fg='white', background='black')
    globals()['lb_pnl_' + symbol[n]] = tkinter.Label(font=font, fg='white', background='black')
    globals()['lb_sym_' + symbol[n]].place(x = 0, y = y)
    globals()['lb_pnl_' + symbol[n]].place(x = x, y = y)
    globals()['lb_sym_' + symbol[n]].configure(text = "{0}".format(symbol[n]))
    globals()['lb_pnl_' + symbol[n]].configure(text = "{0:.2f} $".format(pnl[n]))


win.mainloop()

 

 오픈되어있는 포지션의 갯수나 페어의 종류가 매번 다르기 때문에, 현재 오픈된 포지션의 개수를 이용해 for문을 작성했습니다. 또한 globals() 함수를 사용해서, 오픈되어 있는 페어의 이름을 포함한 변수 이름을 사용했습니다. 현재 시간 출력 때와 마찬가지로 배경은 검은색, 글씨는 흰색으로 출력했습니다. 레이블의 위치는 for문을 통해 포지션의 개수에 맞게 y축을 지정했으며, pnl의 위치는 페어의 뒤쪽에 위치하도록 x값을 67로 주었습니다. 결과는 아래와 같습니다.

시간 및 포지션 출력

 

4. 포지션의 글씨 색 조절

 위 사진을 보시면 페어의 이름과 pnl 모두 흰색으로 출력되는데, 페어이름은 롱인지 숏인지에 따라 색상을 바꿔주고, pnl 역시 수익 중인지, 손실 중인지에 따라 바꿔 주겠습니다.

def color(amount):
    if amount >=0:
        return 'green'
    else:
        return 'red'

 

 간단하게 인풋으로 포지션 사이즈와 pnl을 받아서, 롱이거나 수익중이면 녹색으로, 반대로 숏이거나 손실 중이면 빨간색으로 출력하는 함수를 만들어 사용하겠습니다.

import tkinter
import tkinter.font
import datetime as dt
import ccxt
import os
import dotenv

def color(amount):
    if amount >=0:
        return 'green'
    else:
        return 'red'

win = tkinter.Tk ()
win.title("Traiding Tools")
win.configure(background='black')
win.geometry('200x200')
font=tkinter.font.Font(family="Arial", size=10, slant="italic", weight='bold')

now_time = dt.datetime.now().strftime("%Y-%m-%d %H:%M:%S")

lb_time = tkinter.Label(font=font, fg='white', background='black')
lb_time.place(x = 0, y = 0)
lb_time.configure(text = now_time)

dotenv_file = dotenv.find_dotenv()
dotenv.load_dotenv(dotenv_file)
apikey = os.environ['bn_apikey']
apisecret = os.environ['bn_secret']

binance = ccxt.binance(config={'apiKey': apikey, 'secret': apisecret})
balance = binance.fetch_balance(params={"type": "future"})
positions = balance['info']['positions']

symbol = []
size = []
pnl = []
for position in positions:
    if position['initialMargin'] != '0':
        symbol.append(position['symbol'])
        size.append(position['notional'])
        pnl.append(float(position['unrealizedProfit']))

y=0
x=67
for n in range(len(symbol)):
    y += 16
    globals()['lb_sym_' + symbol[n]] = tkinter.Label(font=font, fg=color(float(size[n])), background='black')
    globals()['lb_pnl_' + symbol[n]] = tkinter.Label(font=font, fg=color(pnl[n]), background='black')
    globals()['lb_sym_' + symbol[n]].place(x = 0, y = y)
    globals()['lb_pnl_' + symbol[n]].place(x = x, y = y)
    globals()['lb_sym_' + symbol[n]].configure(text = "{0}".format(symbol[n]))
    globals()['lb_pnl_' + symbol[n]].configure(text = "{0:.2f} $".format(pnl[n]))


win.mainloop()

 color 함수를 이용해 숏포지션인 BTCBUSD는 빨간색, 수익중인 0.97$은 녹색, 롱포지션인 ETHBUSD는 녹색, 손실 중인 -0.05$은 빨간색으로 잘 출력되는 것을 확인할 수 있습니다.

포지션에 따른 색상 표현

 

5. 총 pnl 출력

 모든 포지션의 pnl을 더해서 출력하는 코드를 추가해 보겠습니다.

import tkinter
import tkinter.font
import datetime as dt
import ccxt
import os
import dotenv

def color(amount):
    if amount >=0:
        return 'green'
    else:
        return 'red'

win = tkinter.Tk ()
win.title("Traiding Tools")
win.configure(background='black')
win.geometry('200x200')
font=tkinter.font.Font(family="Arial", size=10, slant="italic", weight='bold')

now_time = dt.datetime.now().strftime("%Y-%m-%d %H:%M:%S")

lb_time = tkinter.Label(font=font, fg='white', background='black')
lb_time.place(x = 0, y = 0)
lb_time.configure(text = now_time)

dotenv_file = dotenv.find_dotenv()
dotenv.load_dotenv(dotenv_file)
apikey = os.environ['bn_apikey']
apisecret = os.environ['bn_secret']

binance = ccxt.binance(config={'apiKey': apikey, 'secret': apisecret})
balance = binance.fetch_balance(params={"type": "future"})
positions = balance['info']['positions']

symbol = []
size = []
pnl = []
for position in positions:
    if position['initialMargin'] != '0':
        symbol.append(position['symbol'])
        size.append(position['notional'])
        pnl.append(float(position['unrealizedProfit']))

y=0
x=67
for n in range(len(symbol)):
    y += 16
    globals()['lb_sym_' + symbol[n]] = tkinter.Label(font=font, fg=color(float(size[n])), background='black')
    globals()['lb_pnl_' + symbol[n]] = tkinter.Label(font=font, fg=color(pnl[n]), background='black')
    globals()['lb_sym_' + symbol[n]].place(x = 0, y = y)
    globals()['lb_pnl_' + symbol[n]].place(x = x, y = y)
    globals()['lb_sym_' + symbol[n]].configure(text = "{0}".format(symbol[n]))
    globals()['lb_pnl_' + symbol[n]].configure(text = "{0:.2f} $".format(pnl[n]))

pnl_tot = sum(pnl)
y = y+16
lb_tot = tkinter.Label(font=font, fg = color(sum(pnl)), background='black')
lb_tot.place(x=0, y=y)
lb_tot.configure(text = "Total pnl: {0:.2f} $".format(pnl_tot))


win.mainloop()

 

 pnl을 모두 더해 total pnl을 색상에 맞게 출력했습니다. 결과는 아래와 같습니다.

총 손익 출력

 

6. 업데이트 기능

 현재시간과 포지션은 지속적으로 바뀌기 때문에, 계속해서 새로고침 하는 코드를 만들어 보겠습니다.

import tkinter
import tkinter.font
import datetime as dt
import ccxt
import os
import dotenv
import time
import threading

def color(amount):
    if amount >=0:
        return 'green'
    else:
        return 'red'

win = tkinter.Tk ()
win.title("Traiding Tools")
win.configure(background='black')
win.geometry('200x200')
font=tkinter.font.Font(family="Arial", size=10, slant="italic", weight='bold')

lb_time = tkinter.Label(font=font, fg='white', background='black')
lb_time.place(x = 0, y = 0)

dotenv_file = dotenv.find_dotenv()
dotenv.load_dotenv(dotenv_file)
apikey = os.environ['bn_apikey']
apisecret = os.environ['bn_secret']

def update():
    now_time = dt.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    lb_time.configure(text = now_time)
    
    binance = ccxt.binance(config={'apiKey': apikey, 'secret': apisecret})
    while True:
        try:
            balance = binance.fetch_balance(params={"type": "future"})
            break
        except:
            time.sleep(5)
    positions = balance['info']['positions']

    symbol = []
    size = []
    pnl = []
    for position in positions:
        if position['initialMargin'] != '0':
            symbol.append(position['symbol'])
            size.append(position['notional'])
            pnl.append(float(position['unrealizedProfit']))

    y=0
    x=67
    for n in range(len(symbol)):
        y += 16
        globals()['lb_sym_' + symbol[n]] = tkinter.Label(font=font, fg=color(float(size[n])), background='black')
        globals()['lb_pnl_' + symbol[n]] = tkinter.Label(font=font, fg=color(pnl[n]), background='black')
        globals()['lb_sym_' + symbol[n]].place(x = 0, y = y)
        globals()['lb_pnl_' + symbol[n]].place(x = x, y = y)
        globals()['lb_sym_' + symbol[n]].configure(text = "{0}".format(symbol[n]))
        globals()['lb_pnl_' + symbol[n]].configure(text = "{0:.2f} $".format(pnl[n]))

    pnl_tot = sum(pnl)
    y = y+16
    lb_tot = tkinter.Label(font=font, fg = color(sum(pnl)), background='black')
    lb_tot.place(x=0, y=y)
    lb_tot.configure(text = "Total pnl: {0:.2f} $".format(pnl_tot))

    threading.Timer(5, update).start()

update()

win.mainloop()

 

 threading 패키지를 이용해 5초마다 업데이트 되도록 해주었습니다. 바이낸스에서 api를 이용해 데이터를 받아올 때, 자주 받아오게 되면 에러가 나는 경우가 있습니다. 이것을 해결하고자 while과 try문, time 패키지를 이용해 에러 발생 시에, 5초 뒤 다시 받아오도록 했습니다. 새로고침이 필요한 부분을 update로 묶어주어 지속적으로 데이터를 받아와 출력하는 코드입니다.

 

 

 다음 포스팅은 위의 코드를 정리하고, 차후 다른 기능이 필요한 경우 추가적으로 넣도록 하겠습니다. 읽어주셔서 감사합니다. 

반응형
반응형

 

안녕하세요. 이번 포스팅에서는 바이낸스의 usds-m의 선물 포지션을 조회하고, 새로운 창을 열어서 출력해보겠습니다. 포지션을 조회하는 데는 'ccxt'라는 패키지를, 새로운 창에 출력하는 것은 'tkinter'을 사용해 코딩해보겠습니다. 향후 다른 것들도 추가적으로 출력하는 것을 포스팅할 계획입니다.

 

1. ccxt를 이용한 바이낸스 선물 포지션 조회

import ccxt
import os
import dotenv

dotenv_file = dotenv.find_dotenv()
dotenv.load_dotenv(dotenv_file)
apikey = os.environ['bn_apikey']
apisecret = os.environ['bn_secret']

binance = ccxt.binance(config={'apiKey': apikey, 'secret': apisecret})
balance = binance.fetch_balance(params={"type": "future"})
positions = balance['info']['positions']

print(positions)

dotenv를 이용해 환경변수 저장하는 방법은 아래 포스팅을 참고해주세요.

2022.10.05 - [Python] - 파이썬 dotenv를 이용한 환경변수 저장 및 호출

 

파이썬 dotenv를 이용한 환경변수 저장 및 호출

 블로그 만든 뒤에 처음 작성하는 글이네요. 블로그에 공유하기 위해 중요한 정보(암호) 등을 환경변수로 지정해 다른 파일에 저장하고, 공유시에 다른 사람들에게 노출되는 것을 막고자 합니

bitcoding.tistory.com

 

 

 필요한 패키지들을 import 해주고, 환경변수를 불러온 뒤, 바이낸스의 모든 usds-m의 선물 포지션을 조회하고 출력하는 코드입니다. 해당 코드에서 positions을 출력하면 아래와 같이 usds-m의 모든 페어의 포지션을 출력하게 됩니다.

[{'symbol': 'RAYUSDT', 'initialMargin': '0', 'maintMargin': '0', 'unrealizedProfit': '0.00000000', 'positionInitialMargin': '0', 'openOrderInitialMargin': '0', 'leverage': '20', 'isolated': False, 'entryPrice': '0.0', 'maxNotional': '25000', 'positionSide': 'BOTH', 'positionAmt': '0.0', 'notional': '0', 'isolatedWallet': '0', 'updateTime': '0', 'bidNotional': '0', 'askNotional': '0'}, {'symbol': 'API3USDT', 'initialMargin': '0', 'maintMargin': '0', 'unrealizedProfit': '0.00000000', 'positionInitialMargin': '0', 'openOrderInitialMargin': '0', 'leverage': '20', 'isolated': False, 'entryPrice': '0.0', 'maxNotional': '25000', 'positionSide': 'BOTH', 'positionAmt': '0.0', 'notional': '0', 'isolatedWallet': '0', 'updateTime': '0', 'bidNotional': '0', 'askNotional': '0'}, {'symbol': 'SUSHIUSDT', 'initialMargin': '0', 'maintMargin': '0', 'unrealizedProfit': '0.00000000', 'positionInitialMargin': '0', 'openOrderInitialMargin': '0', 'leverage': '20', 'isolated': False, 'entryPrice': '0.0', 'maxNotional': '25000', 'positionSide': 'BOTH', 'positionAmt': '0', 'notional': '0', 'isolatedWallet': '0', 'updateTime': '0', 'bidNotional': '0', 'askNotional': '0'}, {'symbol': 'CVCUSDT', 'initialMargin': '0', 'maintMargin': '0', 'unrealizedProfit': '0.00000000', 'positionInitialMargin': '0', 'openOrderInitialMargin': '0', 'leverage': '20', 'isolated': False, 'entryPrice': '0.0', 'maxNotional': '25000', 'positionSide': 'BOTH', 'positionAmt': '0', 'notional': '0', 'isolatedWallet': '0', 'updateTime': '0', 'bidNotional': '0', 'askNotional': '0'}, {'symbol': 'BTSUSDT', 'initialMargin': '0', 'maintMargin': '0', 'unrealizedProfit': '0.00000000', 'positionInitialMargin': '0', 'openOrderInitialMargin': '0', 'leverage': '20', 'isolated': False, 'entryPrice': '0.0', 'maxNotional': '25000', 'positionSide': 'BOTH', 'positionAmt': '0', 'notional': '0', 'isolatedWallet': '0', 'updateTime': '0', 'bidNotional': '0', 'askNotional': '0'}, {'symbol': 'FTMBUSD', 'initialMargin': '0', 'maintMargin': '0', 'unrealizedProfit': '0.00000000', 'positionInitialMargin': '0', 'openOrderInitialMargin': '0', 'leverage': '20', 'isolated': False, 'entryPrice': '0.0', 'maxNotional': '25000', 'positionSide': 'BOTH', 'positionAmt': '0', 'notional': '0', 'isolatedWallet': '0', 'updateTime': '0', 'bidNotional': '0', 'askNotional': '0'}, {'symbol': 'LINKBUSD', 'initialMargin': '0', 'maintMargin': '0', 'unrealizedProfit': '0.00000000', 'positionInitialMargin': '0', 'openOrderInitialMargin': '0', 'leverage': '20', 'isolated': False, 'entryPrice': '0.0', 'maxNotional': '25000', 'positionSide': 'BOTH', 'positionAmt': '0.0', 'notional': '0', 'isolatedWallet': '0', 'updateTime': '0', 'bidNotional': '0', 'askNotional': '0'}, {'symbol': 'SANDBUSD', 'initialMargin': '0', 'maintMargin': '0', 'unrealizedProfit': '0.00000000', 'positionInitialMargin': '0', 'openOrderInitialMargin': '0', 'leverage': '20', 'isolated': False, 'entryPrice': '0.0', 'maxNotional': '25000', 'positionSide': 'BOTH', 'positionAmt': '0.0', 'notional': '0', 'isolatedWallet': '0', 'updateTime': '0', 'bidNotional': '0', 'askNotional': '0'}, {'symbol': 'INJUSDT', 'initialMargin': '0', 'maintMargin': '0', 'unrealizedProfit': '0.00000000', 'positionInitialMargin': '0', 'openOrderInitialMargin': '0', 'leverage': '20', 'isolated': False, 'entryPrice': '0.0', 'maxNotional': '25000', 'positionSide': 'BOTH', 'positionAmt': '0.0', 'notional': '0', 'isolatedWallet': '0', 'updateTime': '0', 'bidNotional': '0', 'askNotional': '0'}, {'symbol': 'HOTUSDT', 'initialMargin': '0', 'maintMargin': '0', 'unrealizedProfit': '0.00000000', 'positionInitialMargin': '0', 'openOrderInitialMargin': '0', 'leverage': '20', 'isolated': False, 'entryPrice': '0.0', 'maxNotional': '25000', 'positionSide': 'BOTH', 'positionAmt': '0', 'notional': '0', 'isolatedWallet': '0', 'updateTime': '0', 'bidNotional': '0', 'askNotional': '0'}, {'symbol': 'TRXBUSD', 'initialMargin': '0', 'maintMargin': '0', 'unrealizedProfit': '0.00000000', 'positionInitialMargin': '0', 'openOrderInitialMargin': '0', 'leverage': '20', 'isolated': False, 'entryPrice': '0.0', 'maxNotional': '25000', 'positionSide': 'BOTH', 'positionAmt': '0', 'notional': '0', 'isolatedWallet': '0', 'updateTime': '0', 'bidNotional': '0', 'askNotional': '0'}, {'symbol': 'ZRXUSDT', 'initialMargin': '0', 'maintMargin': '0', 'unrealizedProfit': '0.00000000', 'positionInitialMargin': '0', 'openOrderInitialMargin': '0', 'leverage': '20', 'isolated': False, 'entryPrice': '0.0', 'maxNotional': '25000', 'positionSide': 'BOTH', 'positionAmt': '0.0', 'notional': '0', 'isolatedWallet': '0', 'updateTime': '0', 'bidNotional': '0', 'askNotional': '0'}, {'symbol': 'QTUMUSDT', 'initialMargin': '0', 'maintMargin': '0', 'unrealizedProfit': '0.00000000', 'positionInitialMargin': '0', 'openOrderInitialMargin': '0', 'leverage': '20', 'isolated': False, 'entryPrice': '0.0', 'maxNotional': '25000', 'positionSide': 'BOTH', 'positionAmt': '0.0', 'notional': '0', 'isolatedWallet': '0', 'updateTime': '0', 'bidNotional': '0', 'askNotional': '0'}, {'symbol': 'IOTAUSDT', 'initialMargin': '0', 'maintMargin': '0', 'unrealizedProfit': '0.00000000', 'positionInitialMargin': '0', 'openOrderInitialMargin': '0', 'leverage': '20', 'isolated': False, 'entryPrice': '0.0', 'maxNotional': '25000', 'positionSide': 'BOTH', 'positionAmt': '0.0', 'notional': '0', 'isolatedWallet': '0', 'updateTime': '0', 'bidNotional': '0', 'askNotional': '0'}, {'symbol': 'BTCBUSD', 'initialMargin': '111.56959712', 'maintMargin': '0.39084988', 'unrealizedProfit': '-0.25647121', 'positionInitialMargin': '9.77124712', 'openOrderInitialMargin': '101.79835000', 'leverage': '10', 'isolated': True, 'entryPrice': '19491.2', 'maxNotional': '7500000', 'positionSide': 'BOTH', 'positionAmt': '-0.005', 'notional': '-97.71247121', 'isolatedWallet': '9.74774889', 'updateTime': '1666022402680', 'bidNotional': '0', 'askNotional': '1017.98350000'}, {'symbol': 'WAVESUSDT', 'initialMargin': '0', 'maintMargin': '0', 'unrealizedProfit': '0.00000000', 'positionInitialMargin': '0', 'openOrderInitialMargin': '0', 'leverage': '20', 'isolated': False, 'entryPrice': '0.0', 'maxNotional': '25000', 'positionSide': 'BOTH', 'positionAmt': '0.0', 'notional': '0', 'isolatedWallet': '0', 'updateTime': '0', 'bidNotional': '0', 'askNotional': '0'}, {'symbol': 'SPELLUSDT', 'initialMargin': '0', 'maintMargin': '0', 'unrealizedProfit': '0.00000000', 'positionInitialMargin': '0', 'openOrderInitialMargin': '0', 'leverage': '20', 'isolated': False, 'entryPrice': '0.0', 'maxNotional': '25000', 'positionSide': 'BOTH', 'positionAmt': '0', 'notional': '0', 'isolatedWallet': '0', 'updateTime': '0', 'bidNotional': '0', 'askNotional': '0'}, {'symbol': 'ADAUSDT', 'initialMargin': '0', 'maintMargin': '0', 'unrealizedProfit': '0.00000000', 'positionInitialMargin': '0', 'openOrderInitialMargin': '0', 'leverage': '20', 'isolated': False, 'entryPrice': '0.0', 'maxNotional': '250000', 'positionSide': 'BOTH', 'positionAmt': '0', 'notional': '0', 'isolatedWallet': '0', 'updateTime': '0', 'bidNotional': '0', 'askNotional': '0'}, {'symbol': 'LITUSDT', 'initialMargin': '0', 'maintMargin': '0', 'unrealizedProfit': '0.00000000', 'positionInitialMargin': '0', 'openOrderInitialMargin': '0', 'leverage': '20', 'isolated': False, 'entryPrice': '0.0', 'maxNotional': '25000', 'positionSide': 'BOTH', 'positionAmt': '0.0', 'notional': '0', 'isolatedWallet': '0', 'updateTime': '0', 'bidNotional': '0', 'askNotional': '0'}, {'symbol': 'XTZUSDT', 'initialMargin': '0', 'maintMargin': '0', 'unrealizedProfit': '0.00000000', 'positionInitialMargin': '0', 'openOrderInitialMargin': '0', 'leverage': '20', 'isolated': False, 'entryPrice': '0.0', 'maxNotional': '250000', 'positionSide': 'BOTH', 'positionAmt': '0.0', 'notional': '0', 'isolatedWallet': '0', 'updateTime': '0', 'bidNotional': '0', 'askNotional': '0'}, {'symbol': 'BNBUSDT', 'initialMargin': '0', 'maintMargin': '0', 'unrealizedProfit': '0.00000000', 'positionInitialMargin': '0', 'openOrderInitialMargin': '0', 'leverage': '20', 'isolated': False, 'entryPrice': '0.0', 'maxNotional': '250000', 'positionSide': 'BOTH', 'positionAmt': '0.00', 'notional': '0', 'isolatedWallet': '0', 'updateTime': '0', 'bidNotional': '0', 'askNotional': '0'}, {'symbol': 'UNIBUSD', 'initialMargin': '0', 'maintMargin': '0', 'unrealizedProfit': '0.00000000', 'positionInitialMargin': '0', 'openOrderInitialMargin': '0', 'leverage': '20', 'isolated': False, 'entryPrice': '0.0', 'maxNotional': '25000', 'positionSide': 'BOTH', 'positionAmt': '0.0', 'notional': '0', 'isolatedWallet': '0', 'updateTime': '0', 'bidNotional': '0', 'askNotional': '0'}, {'symbol': 'DARUSDT', 'initialMargin': '0', 'maintMargin': '0', 'unrealizedProfit': '0.00000000', 'positionInitialMargin': '0', 'openOrderInitialMargin': '0', 'leverage': '20', 'isolated': False, 'entryPrice': '0.0', 'maxNotional': '25000', 'positionSide': 'BOTH', 'positionAmt': '0.0', 'notional': '0', 'isolatedWallet': '0', 'updateTime': '0', 'bidNotional': '0', 'askNotional': '0'}, {'symbol': 
'HNTUSDT', 'initialMargin': '0', 'maintMargin': '0', 'unrealizedProfit': '0.00000000', 'positionInitialMargin': '0', 'openOrderInitialMargin': '0', 'leverage': '20', 'isolated': False, 'entryPrice': '0.0', 'maxNotional': '25000', 'positionSide': 'BOTH', 'positionAmt': '0', 'notional': '0', 'isolatedWallet': '0', 'updateTime': '0', 'bidNotional': '0', 'askNotional': '0'}, {'symbol': 'ETCUSDT', 'initialMargin': '0', 'maintMargin': '0', 'unrealizedProfit': '0.00000000', 'positionInitialMargin': '0', 'openOrderInitialMargin': '0', 'leverage': '20', 'isolated': True, 'entryPrice': '0.0', 'maxNotional': '250000', 'positionSide': 'BOTH', 'positionAmt': '0.00', 'notional': '0', 'isolatedWallet': '0', 'updateTime': '1647929253005', 'bidNotional': '0', 'askNotional': '0'}, {'symbol': 'XMRUSDT', 'initialMargin': '0', 'maintMargin': '0', 'unrealizedProfit': '0.00000000', 'positionInitialMargin': '0', 'openOrderInitialMargin': '0', 'leverage': '20', 'isolated': False, 'entryPrice': '0.0', 'maxNotional': '250000', 'positionSide': 'BOTH', 'positionAmt': '0.000', 'notional': '0', 'isolatedWallet': '0', 'updateTime': '0', 'bidNotional': '0', 'askNotional': '0'}, {'symbol': 'YFIUSDT', 'initialMargin': '0', 'maintMargin': '0', 'unrealizedProfit': '0.00000000', 'positionInitialMargin': '0', 'openOrderInitialMargin': '0', 'leverage': '20', 'isolated': False, 'entryPrice': '0.0', 'maxNotional': '25000', 'positionSide': 'BOTH', 'positionAmt': '0.000', 'notional': '0', 'isolatedWallet': '0', 'updateTime': '0', 'bidNotional': '0', 'askNotional': '0'}, {'symbol': 'FTTBUSD', 'initialMargin': '0', 'maintMargin': '0', 'unrealizedProfit': '0.00000000', 'positionInitialMargin': '0', 'openOrderInitialMargin': '0', 'leverage': '20', 'isolated': False, 'entryPrice': '0.0', 'maxNotional': '100000', 'positionSide': 'BOTH', 'positionAmt': '0.0', 'notional': '0', 'isolatedWallet': '0', 'updateTime': '0', 'bidNotional': '0', 'askNotional': '0'}, {'symbol': 'ETHUSDT', 'initialMargin': '0', 'maintMargin': '0', 'unrealizedProfit': '0.00000000', 'positionInitialMargin': '0', 'openOrderInitialMargin': '0', 'leverage': '10', 'isolated': True, 'entryPrice': '0.0', 'maxNotional': '10000000', 'positionSide': 'BOTH', 'positionAmt': '0.000', 'notional': '0', 'isolatedWallet': '0', 'updateTime': '1663227945832', 'bidNotional': '0', 'askNotional': '0'}, {'symbol': 'ALICEUSDT', 'initialMargin': '0', 'maintMargin': '0', 'unrealizedProfit': '0.00000000', 'positionInitialMargin': '0', 'openOrderInitialMargin': '0', 'leverage': '20', 'isolated': False, 'entryPrice': '0.0', 'maxNotional': '25000', 'positionSide': 'BOTH', 'positionAmt': '0.0', 'notional': '0', 'isolatedWallet': '0', 'updateTime': '0', 'bidNotional': '0', 'askNotional': '0'}, {'symbol': 'ALPHAUSDT', 'initialMargin': '0', 'maintMargin': '0', 'unrealizedProfit': '0.00000000', 'positionInitialMargin': '0', 'openOrderInitialMargin': '0', 'leverage': '20', 'isolated': False, 'entryPrice': '0.0', 'maxNotional': '25000', 'positionSide': 'BOTH', 'positionAmt': '0', 'notional': '0', 'isolatedWallet': '0', 'updateTime': '0', 'bidNotional': '0', 'askNotional': '0'}, {'symbol': 'WOOUSDT', 'initialMargin': '0', 'maintMargin': '0', 'unrealizedProfit': '0.00000000', 'positionInitialMargin': '0', 'openOrderInitialMargin': '0', 'leverage': '20', 'isolated': False, 'entryPrice': '0.0', 'maxNotional': '25000', 'positionSide': 'BOTH', 'positionAmt': '0', 'notional': '0', 'isolatedWallet': '0', 'updateTime': '0', 'bidNotional': '0', 'askNotional': '0'}, {'symbol': 'SFPUSDT', 'initialMargin': '0', 'maintMargin': '0', 'unrealizedProfit': '0.00000000', 'positionInitialMargin': '0', 'openOrderInitialMargin': '0', 'leverage': '20', 'isolated': False, 'entryPrice': '0.0', 'maxNotional': '25000', 'positionSide': 'BOTH', 'positionAmt': '0', 'notional': '0', 'isolatedWallet': '0', 'updateTime': '0', 'bidNotional': '0', 'askNotional': '0'}, {'symbol': 'REEFUSDT', 'initialMargin': '0', 'maintMargin': '0', 'unrealizedProfit': '0.00000000', 'positionInitialMargin': '0', 'openOrderInitialMargin': '0', 'leverage': '20', 'isolated': False, 'entryPrice': '0.0', 'maxNotional': '25000', 'positionSide': 'BOTH', 'positionAmt': '0', 'notional': '0', 'isolatedWallet': '0', 'updateTime': '0', 'bidNotional': '0', 'askNotional': '0'}, {'symbol': 'BATUSDT', 'initialMargin': '0', 'maintMargin': '0', 'unrealizedProfit': '0.00000000', 'positionInitialMargin': '0', 'openOrderInitialMargin': '0', 'leverage': '20', 'isolated': False, 'entryPrice': '0.0', 'maxNotional': '25000', 'positionSide': 'BOTH', 'positionAmt': '0.0', 'notional': '0', 'isolatedWallet': '0', 'updateTime': '0', 'bidNotional': '0', 'askNotional': '0'}, {'symbol': 'DOGEUSDT', 'initialMargin': '0', 'maintMargin': '0', 'unrealizedProfit': '0.00000000', 'positionInitialMargin': '0', 'openOrderInitialMargin': '0', 'leverage': '20', 'isolated': False, 'entryPrice': '0.0', 'maxNotional': '250000', 'positionSide': 'BOTH', 'positionAmt': '0', 'notional': '0', 'isolatedWallet': '0', 'updateTime': '0', 'bidNotional': '0', 'askNotional': '0'}, {'symbol': 'TRXUSDT', 'initialMargin': '0', 'maintMargin': '0', 'unrealizedProfit': '0.00000000', 'positionInitialMargin': '0', 'openOrderInitialMargin': '0', 'leverage': '20', 'isolated': False, 'entryPrice': '0.0', 'maxNotional': '250000', 'positionSide': 'BOTH', 'positionAmt': '0', 'notional': '0', 'isolatedWallet': '0', 'updateTime': '0', 'bidNotional': '0', 'askNotional': '0'}, {'symbol': 'RLCUSDT', 'initialMargin': '0', 'maintMargin': '0', 'unrealizedProfit': '0.00000000', 'positionInitialMargin': '0', 'openOrderInitialMargin': '0', 'leverage': '20', 'isolated': False, 'entryPrice': '0.0', 'maxNotional': '25000', 'positionSide': 'BOTH', 'positionAmt': '0.0', 'notional': '0', 'isolatedWallet': '0', 'updateTime': '0', 'bidNotional': '0', 'askNotional': '0'},

 상당히 길고 복잡한 결과가 나오게 되는데, 여기서 현재 내가 오픈한 포지션만 조회하도록 추가해보겠습니다.

 

2. 오픈된 포지션 조회

import ccxt
import os
import dotenv

dotenv_file = dotenv.find_dotenv()
dotenv.load_dotenv(dotenv_file)
apikey = os.environ['bn_apikey']
apisecret = os.environ['bn_secret']

binance = ccxt.binance(config={'apiKey': apikey, 'secret': apisecret})
balance = binance.fetch_balance(params={"type": "future"})
positions = balance['info']['positions']

symbol = []
size = []
pnl = []
for position in positions:
    if position['initialMargin'] != '0':
        symbol.append(position['symbol'])
        size.append(position['notional'])
        pnl.append(float(position['unrealizedProfit']))

print(symbol)
print(size)
print(pnl)

 앞선 코드에서 받아온 positions의 initialMargin이 없는 경우를 제외하고, 해당 position의 symbol, size, pnl을 각각의 변수에 저장하고 출력하는 코드입니다. 결과는 아래와 같습니다.

['BTCBUSD', 'ETHBUSD']
['-97.67867686', '5.33319399']
[-0.22267686, 0.06211399]

 이것은 현재 오픈되어 있는 제 포지션입니다. BTCBUSD페어를 97.678 $의 숏포지션을 보유 중이며, pnl은 -0.2226$로 손실 중입니다. ETHBUSD페어는 5.333 $의 롱포지션을 보유 중이며 0.06211$의 수익을 보고 있습니다.

 다른 정보들도 조회 가능하지만, Symbol과 Size, pnl만 출력하고자 합니다.

 

3. tkinter를 이용한 윈도우 창 생성

import tkinter

win = tkinter.Tk ()
win.title("Traiding Tools")
win.configure(background='black')
win.geometry('200x200+165+200')

win.mainloop()

먼저 tkinter을 import 해주고 윈도우 창에 대한 설정들을 추가해줍니다. 창의 이름을 'Trading Tools'로 지정하고, 배경색을 검정으로 지정했습니다. 코드의 6번째 줄의 "win.geometry('200x200+165+200')"를 통해서 창의 크기와 위치를 지정할 수 있습니다. 200x200은 창의 크기이고, 뒤의 165+200은 코드 실행 시 창이 나타나는 위치를 지정한 것입니다. 코드를 실행하면 아래와 같이 검은 배경의 창이 실행되는 것을 볼 수 있습니다.

tkinter을 이용한 윈도우 창 출력

 

 이번 포스팅에서는 ccxt를 이용해 오픈된 포지션을 조회하고. tkinter를 이용해 윈도우 창을 출력해보았습니다. 다음 포스팅에서는 조회한 오픈된 포지션과 현재시간을 tkinter를 이용해 출력하는 것에 대해 이어서 포스팅하겠습니다. 읽어주셔서 감사합니다.

반응형
반응형

 파이썬을 처음 접할 때 아래 코드를 보셨을겁니다. print라는 함수를 이용해 손쉽게 원하는 문구를 출력해 낼 수 있는거죠. 이것은 파이썬 내부에 있는 print라는 함수를 사용해, 쉽게 출력할 수 있는 것 입니다. 기본적으로 파이썬에 내장되어 있는 함수 외에도 다양한 함수들이 존재합니다. 이러한 유용한 기능을 가진 외장함수는 패키지를 설치하여 손쉽게 사용 할 수 있습니다. 이번글에서는 파이썬에서 패키지를 설치하고 사용하는 방법 등에 대해 포스팅 해보겠습니다.

print("Hello World!")

 

 1. 패키지 설치

 패키지에는 여러가지 종류가 있지만 오늘은 "ccxt"라는 패키지를 예시로 설치해보겠습니다. 이 패키지를 이용하면 여러 코인거래소에서 정보를 받아올 수 있습니다. 이번글에서는 바이낸스 거래소의 현물페어를 가져와 출력해보겠습니다.
 먼저 아래처럼 pip install 뒤에 설치하고자 하는 패키지 이름을 붙여서 터미널에서 실행하면 설치가 진행됩니다. 

pip install ccxt

 설치가 완료되면 아래 사진에 나오는 것처럼 성공적으로 설치가 된 것을 알려줍니다.

설치 성공

 

2. 패키지 사용방법

 설치된 패키지를 이용하기 위해서는 .py 파일에서 불러와야 사용할 수 있습니다. import라는 명령어를 사용하여 불러오는데, 아래처럼 import 뒤에 사용하고자 하는 패키지 이름을 붙여 불러올 수 있습니다. 패키지를 불러왔으면 ccxt 모듈을 사용해볼 차례입니다. "ccxt.binance()"를 이용해 binance 객체를 생성하고, "binance.fetch_tickers()"로 현물페어에 대한 정보를 받아서 keys만 출력할 수 있습니다.

import ccxt

binance = ccxt.binance()
spot = binance.fetch_tickers()

print(spot.keys())

 

 3. 결과

 바이낸스 거래소의 현물거래 페어를 불러오는데 성공했습니다.

dict_keys(['ETH/BTC', 'LTC/BTC', 'BNB/BTC', 'NEO/BTC', 'QTUM/ETH', 'EOS/ETH', 'SNT/ETH', 'BNT/ETH', 'BCC/BTC', 'GAS/BTC', 'BNB/ETH', 'BTC/USDT', 'ETH/USDT', 'HSR/BTC', 'OAX/ETH', 'DNT/ETH', 'MCO/ETH', 'ICN/ETH', 'MCO/BTC', 'WTC/BTC', 'WTC/ETH', 'LRC/BTC', 'LRC/ETH', 'QTUM/BTC', 'YOYOW/BTC', 'OMG/BTC', 'OMG/ETH', 'ZRX/BTC', 'ZRX/ETH', 'STRAT/BTC', 'STRAT/ETH', 'SNGLS/BTC', 'SNGLS/ETH', 'BQX/BTC', 'BQX/ETH', 'KNC/BTC', 'KNC/ETH', 'FUN/BTC', 'FUN/ETH', 'SNM/BTC', 'SNM/ETH', 'NEO/ETH', 'IOTA/BTC', 'IOTA/ETH', 'LINK/BTC', 'LINK/ETH', 'XVG/BTC', 'XVG/ETH', 'SALT/BTC', 'SALT/ETH', 'MDA/BTC', 'MDA/ETH', 'MTL/BTC', 'MTL/ETH', 'SUB/BTC', 'SUB/ETH', 'EOS/BTC', 'SNT/BTC', 'ETC/ETH', 'ETC/BTC', 'MTH/BTC', 'MTH/ETH', 'ENG/BTC', 'ENG/ETH', 'DNT/BTC', 'ZEC/BTC', 'ZEC/ETH', 'BNT/BTC', 'AST/BTC', 'AST/ETH', 'DASH/BTC', 'DASH/ETH', 'OAX/BTC', 'ICN/BTC', 'BTG/BTC', 'BTG/ETH', 'EVX/BTC', 'EVX/ETH', 'REQ/BTC', 'REQ/ETH', 'VIB/BTC', 'VIB/ETH', 'HSR/ETH', 'TRX/BTC', 'TRX/ETH', 'POWR/BTC', 'POWR/ETH', 'ARK/BTC', 'ARK/ETH', 'YOYOW/ETH', 'XRP/BTC', 'XRP/ETH', 'MOD/BTC', 'MOD/ETH', 'ENJ/BTC', 'ENJ/ETH', 'STORJ/BTC', 'STORJ/ETH', 'BNB/USDT', 'VEN/BNB', 'YOYOW/BNB', 'POWR/BNB', 'VEN/BTC', 'VEN/ETH', 'KMD/BTC', 'KMD/ETH', 'NULS/BNB', 'RCN/BTC', 'RCN/ETH', 'RCN/BNB', 'NULS/BTC', 'NULS/ETH', 'RDN/BTC', 'RDN/ETH', 'RDN/BNB', 'XMR/BTC', 'XMR/ETH', 'DLT/BNB', 'WTC/BNB', 'DLT/BTC', 'DLT/ETH', 'AMB/BTC', 'AMB/ETH', 'AMB/BNB', 'BCC/ETH', 'BCC/USDT', 'BCC/BNB', 'BAT/BTC', 'BAT/ETH', 'BAT/BNB', 'BCPT/BTC', 'BCPT/ETH', 'BCPT/BNB', 'ARN/BTC', 'ARN/ETH', 'GVT/BTC', 'GVT/ETH', 'CDT/BTC', 'CDT/ETH', 'GXS/BTC', 'GXS/ETH', 'NEO/USDT', 'NEO/BNB', 'POE/BTC', 'POE/ETH', 'QSP/BTC', 'QSP/ETH', 'QSP/BNB', 'BTS/BTC', 'BTS/ETH', 'BTS/BNB', 'XZC/BTC', 'XZC/ETH', 'XZC/BNB', 'LSK/BTC', 'LSK/ETH', 'LSK/BNB', 'TNT/BTC', 'TNT/ETH', 'FUEL/BTC', 'FUEL/ETH', 'MANA/BTC', 'MANA/ETH', 'BCD/BTC', 'BCD/ETH', 'DGD/BTC', 'DGD/ETH', 'IOTA/BNB', 'ADX/BTC', 'ADX/ETH', 'ADX/BNB', 'ADA/BTC', 'ADA/ETH', 'PPT/BTC', 'PPT/ETH', 'CMT/BTC', 'CMT/ETH', 'CMT/BNB', 'XLM/BTC', 'XLM/ETH', 'XLM/BNB', 'CND/BTC', 'CND/ETH', 'CND/BNB', 'LEND/BTC', 'LEND/ETH', 'WABI/BTC', 'WABI/ETH', 'WABI/BNB', 'LTC/ETH', 'LTC/USDT', 'LTC/BNB', 'TNB/BTC', 'TNB/ETH', 'WAVES/BTC', 'WAVES/ETH', 'WAVES/BNB', 'GTO/BTC', 'GTO/ETH', 'GTO/BNB', 'ICX/BTC', 'ICX/ETH', 'ICX/BNB', 'OST/BTC', 'OST/ETH', 'OST/BNB', 'ELF/BTC', 'ELF/ETH', 'AION/BTC', 'AION/ETH', 'AION/BNB', 'NEBL/BTC', 'NEBL/BNB', 'BRD/BTC', 'BRD/ETH', 'BRD/BNB', 'MCO/BNB', 'EDO/BTC', 'EDO/ETH', 'WINGS/BTC', 'WINGS/ETH', 'NAV/BTC', 'NAV/ETH', 'NAV/BNB', 'LUN/BTC', 'LUN/ETH', 'TRIG/BTC', 'TRIG/ETH', 'TRIG/BNB', 'APPC/BTC', 'APPC/ETH', 'APPC/BNB', 'VIBE/BTC', 'VIBE/ETH', 'RLC/BTC', 'RLC/ETH', 'RLC/BNB', 'INS/BTC', 'INS/ETH', 'PIVX/BTC', 'PIVX/BNB', 'IOST/BTC', 'IOST/ETH', 'CHAT/BTC', 'CHAT/ETH', 'STEEM/BTC', 'STEEM/ETH', 'STEEM/BNB', 'NANO/BTC', 'NANO/ETH', 'NANO/BNB', 'VIA/BTC', 'VIA/ETH', 'VIA/BNB', 'BLZ/BTC', 'BLZ/ETH', 'BLZ/BNB', 'AE/BTC', 'AE/ETH', 'AE/BNB', 'RPX/BTC', 'RPX/ETH', 'RPX/BNB', 'NCASH/BTC', 'NCASH/ETH', 'NCASH/BNB', 'POA/BTC', 'POA/ETH', 'POA/BNB', 'ZIL/BTC', 'ZIL/ETH', 'ZIL/BNB', 'ONT/BTC', 'ONT/ETH', 'ONT/BNB', 'STORM/BTC', 'STORM/ETH', 'STORM/BNB', 'QTUM/BNB', 'QTUM/USDT', 'XEM/BTC', 'XEM/ETH', 'XEM/BNB', 'WAN/BTC', 'WAN/ETH', 'WAN/BNB', 'WPR/BTC', 'WPR/ETH', 'QLC/BTC', 'QLC/ETH', 'SYS/BTC', 'SYS/ETH', 'SYS/BNB', 'QLC/BNB', 'GRS/BTC', 'GRS/ETH', 'ADA/USDT', 'ADA/BNB', 'CLOAK/BTC', 'CLOAK/ETH', 'GNT/BTC', 'GNT/ETH', 'GNT/BNB', 'LOOM/BTC', 'LOOM/ETH', 'LOOM/BNB', 'XRP/USDT', 'BCN/BTC', 'BCN/ETH', 'BCN/BNB', 'REP/BTC', 'REP/BNB', 'BTC/TUSD', 'TUSD/BTC', 'ETH/TUSD', 'TUSD/ETH', 'TUSD/BNB', 'ZEN/BTC', 'ZEN/ETH', 'ZEN/BNB', 'SKY/BTC', 'SKY/ETH', 'SKY/BNB', 'EOS/USDT', 'EOS/BNB', 'CVC/BTC', 'CVC/ETH', 'CVC/BNB', 'THETA/BTC', 'THETA/ETH', 'THETA/BNB', 'XRP/BNB', 'TUSD/USDT', 'IOTA/USDT', 'XLM/USDT', 'IOTX/BTC', 'IOTX/ETH', 'QKC/BTC', 'QKC/ETH', 'AGI/BTC', 'AGI/ETH', 'AGI/BNB', 'NXS/BTC', 'NXS/ETH', 'NXS/BNB', 'ENJ/BNB', 'DATA/BTC', 'DATA/ETH', 'ONT/USDT', 'TRX/BNB', 'TRX/USDT', 'ETC/USDT', 'ETC/BNB', 'ICX/USDT', 'SC/BTC', 'SC/ETH', 'NPXS/BTC', 'NPXS/ETH', 'VEN/USDT', 'KEY/BTC', 'KEY/ETH', 'NAS/BTC', 'NAS/ETH', 'NAS/BNB', 'MFT/BTC', 'MFT/ETH', 'MFT/BNB', 'DENT/BTC', 'DENT/ETH', 'ARDR/BTC', 'ARDR/ETH', 'ARDR/BNB', 'NULS/USDT', 'HOT/BTC', 'HOT/ETH', 'VET/BTC', 'VET/ETH', 'VET/USDT', 'VET/BNB', 'DOCK/BTC', 'DOCK/ETH', 'POLY/BTC', 'POLY/BNB', 'PHX/BTC', 'PHX/ETH', 'PHX/BNB', 'HC/BTC', 'HC/ETH', 'GO/BTC', 'GO/BNB', 'PAX/BTC', 'PAX/BNB', 'PAX/USDT', 'PAX/ETH', 'RVN/BTC', 'DCR/BTC', 'DCR/BNB', 'USDC/BNB', 'MITH/BTC', 'MITH/BNB', 'BCH/BTC', 'BSV/BTC', 'BCH/USDT', 'BSV/USDT', 'BNB/PAX', 'BTC/PAX', 'ETH/PAX', 'XRP/PAX', 'EOS/PAX', 'XLM/PAX', 'REN/BTC', 'REN/BNB', 'BNB/TUSD', 'XRP/TUSD', 'EOS/TUSD', 'XLM/TUSD', 'BNB/USDC', 'BTC/USDC', 'ETH/USDC', 'XRP/USDC', 'EOS/USDC', 'XLM/USDC', 'USDC/USDT', 'ADA/TUSD', 'TRX/TUSD', 'NEO/TUSD', 'TRX/XRP', 'XZC/XRP', 'PAX/TUSD', 'USDC/TUSD', 'USDC/PAX', 'LINK/USDT', 'LINK/TUSD', 'LINK/PAX', 'LINK/USDC', 'WAVES/USDT', 'WAVES/TUSD', 'WAVES/PAX', 'WAVES/USDC', 'BCH/TUSD', 'BCH/PAX', 'BCH/USDC', 'BSV/TUSD', 'BSV/PAX', 'BSV/USDC', 'LTC/TUSD', 'LTC/PAX', 'LTC/USDC', 'TRX/PAX', 'TRX/USDC', 'BTT/BTC', 'BTT/BNB', 'BTT/USDT', 'BNB/USDS', 'BTC/USDS', 'USDS/USDT', 'USDS/PAX', 'USDS/TUSD', 'USDS/USDC', 'BTT/PAX', 'BTT/TUSD', 'BTT/USDC', 'ONG/BNB', 'ONG/BTC', 'ONG/USDT', 'HOT/BNB', 'HOT/USDT', 'ZIL/USDT', 'ZRX/BNB', 'ZRX/USDT', 'FET/BNB', 'FET/BTC', 'FET/USDT', 'BAT/USDT', 'XMR/BNB', 'XMR/USDT', 'ZEC/BNB', 'ZEC/USDT', 'ZEC/PAX', 'ZEC/TUSD', 'ZEC/USDC', 'IOST/USDT', 'CELR/BNB', 'CELR/BTC', 'CELR/USDT', 'ADA/PAX', 'ADA/USDC', 'NEO/PAX', 'NEO/USDC', 'DASH/BNB', 'DASH/USDT', 'NANO/USDT', 'OMG/BNB', 'OMG/USDT', 'THETA/USDT', 'ENJ/USDT', 'MITH/USDT', 'MATIC/BNB', 'MATIC/BTC', 'MATIC/USDT', 'ATOM/BNB', 'ATOM/BTC', 'ATOM/USDT', 'ATOM/USDC', 'ATOM/PAX', 'ATOM/TUSD', 'ETC/USDC', 'ETC/PAX', 'ETC/TUSD', 'BAT/USDC', 'BAT/PAX', 'BAT/TUSD', 'PHB/BNB', 'PHB/BTC', 'PHB/USDC', 'PHB/TUSD', 'PHB/PAX', 'TFUEL/BNB', 'TFUEL/BTC', 'TFUEL/USDT', 'TFUEL/USDC', 'TFUEL/TUSD', 'TFUEL/PAX', 'ONE/BNB', 'ONE/BTC', 'ONE/USDT', 'ONE/TUSD', 'ONE/PAX', 'ONE/USDC', 'FTM/BNB', 'FTM/BTC', 'FTM/USDT', 'FTM/TUSD', 'FTM/PAX', 'FTM/USDC', 'BTCB/BTC', 'BCPT/TUSD', 'BCPT/PAX', 'BCPT/USDC', 'ALGO/BNB', 'ALGO/BTC', 'ALGO/USDT', 'ALGO/TUSD', 'ALGO/PAX', 'ALGO/USDC', 'USDSB/USDT', 'USDSB/USDS', 'GTO/USDT', 'GTO/PAX', 'GTO/TUSD', 'GTO/USDC', 'ERD/BNB', 'ERD/BTC', 'ERD/USDT', 'ERD/PAX', 'ERD/USDC', 'DOGE/BNB', 'DOGE/BTC', 'DOGE/USDT', 'DOGE/PAX', 'DOGE/USDC', 'DUSK/BNB', 'DUSK/BTC', 'DUSK/USDT', 'DUSK/USDC', 'DUSK/PAX', 'BGBP/USDC', 'ANKR/BNB', 'ANKR/BTC', 'ANKR/USDT', 'ANKR/TUSD', 'ANKR/PAX', 'ANKR/USDC', 'ONT/PAX', 'ONT/USDC', 'WIN/BNB', 'WIN/BTC', 'WIN/USDT', 'WIN/USDC', 'COS/BNB', 'COS/BTC', 'COS/USDT', 'TUSDB/TUSD', 'NPXS/USDT', 'NPXS/USDC', 
'COCOS/BNB', 'COCOS/BTC', 'COCOS/USDT', 'MTL/USDT', 'TOMO/BNB', 'TOMO/BTC', 'TOMO/USDT', 'TOMO/USDC', 'PERL/BNB', 'PERL/BTC', 'PERL/USDC', 'PERL/USDT', 'DENT/USDT', 'MFT/USDT', 'KEY/USDT', 'STORM/USDT', 'DOCK/USDT', 'WAN/USDT', 'FUN/USDT', 'CVC/USDT', 'BTT/TRX', 'WIN/TRX', 'CHZ/BNB', 'CHZ/BTC', 'CHZ/USDT', 'BAND/BNB', 'BAND/BTC', 'BAND/USDT', 'BNB/BUSD', 'BTC/BUSD', 'BUSD/USDT', 'BEAM/BNB', 'BEAM/BTC', 'BEAM/USDT', 'XTZ/BNB', 'XTZ/BTC', 'XTZ/USDT', 'REN/USDT', 'RVN/USDT', 'HC/USDT', 'HBAR/BNB', 'HBAR/BTC', 'HBAR/USDT', 'NKN/BNB', 'NKN/BTC', 'NKN/USDT', 'XRP/BUSD', 'ETH/BUSD', 'BCH/BUSD', 'LTC/BUSD', 'LINK/BUSD', 'ETC/BUSD', 'STX/BNB', 'STX/BTC', 'STX/USDT', 'KAVA/BNB', 'KAVA/BTC', 'KAVA/USDT', 'BUSD/NGN', 'BNB/NGN', 'BTC/NGN', 'ARPA/BNB', 'ARPA/BTC', 'ARPA/USDT', 'TRX/BUSD', 'EOS/BUSD', 'IOTX/USDT', 'RLC/USDT', 'MCO/USDT', 'XLM/BUSD', 'ADA/BUSD', 'CTXC/BNB', 'CTXC/BTC', 'CTXC/USDT', 'BCH/BNB', 'BTC/RUB', 'ETH/RUB', 'XRP/RUB', 'BNB/RUB', 'TROY/BNB', 'TROY/BTC', 'TROY/USDT', 'BUSD/RUB', 'QTUM/BUSD', 'VET/BUSD', 'VITE/BNB', 'VITE/BTC', 'VITE/USDT', 'FTT/BNB', 'FTT/BTC', 'FTT/USDT', 'BTC/TRY', 'BNB/TRY', 'BUSD/TRY', 'ETH/TRY', 'XRP/TRY', 'USDT/TRY', 'USDT/RUB', 'BTC/EUR', 'ETH/EUR', 'BNB/EUR', 'XRP/EUR', 'EUR/BUSD', 'EUR/USDT', 'OGN/BNB', 'OGN/BTC', 'OGN/USDT', 'DREP/BNB', 'DREP/BTC', 'DREP/USDT', 'BULL/USDT', 'BULL/BUSD', 'BEAR/USDT', 'BEAR/BUSD', 'ETHBULL/USDT', 'ETHBULL/BUSD', 'ETHBEAR/USDT', 'ETHBEAR/BUSD', 'TCT/BNB', 'TCT/BTC', 'TCT/USDT', 'WRX/BNB', 'WRX/BTC', 'WRX/USDT', 'ICX/BUSD', 'BTS/USDT', 'BTS/BUSD', 'LSK/USDT', 'BNT/USDT', 'BNT/BUSD', 'LTO/BNB', 'LTO/BTC', 'LTO/USDT', 'ATOM/BUSD', 'DASH/BUSD', 'NEO/BUSD', 'WAVES/BUSD', 'XTZ/BUSD', 'EOSBULL/USDT', 'EOSBULL/BUSD', 'EOSBEAR/USDT', 'EOSBEAR/BUSD', 'XRPBULL/USDT', 'XRPBULL/BUSD', 'XRPBEAR/USDT', 'XRPBEAR/BUSD', 'BAT/BUSD', 'ENJ/BUSD', 'NANO/BUSD', 'ONT/BUSD', 'RVN/BUSD', 'STRAT/BUSD', 'STRAT/BNB', 'STRAT/USDT', 'AION/BUSD', 'AION/USDT', 'MBL/BNB', 'MBL/BTC', 'MBL/USDT', 'COTI/BNB', 
'COTI/BTC', 'COTI/USDT', 'ALGO/BUSD', 'BTT/BUSD', 'TOMO/BUSD', 'XMR/BUSD', 'ZEC/BUSD', 'BNBBULL/USDT', 'BNBBULL/BUSD', 'BNBBEAR/USDT', 'BNBBEAR/BUSD', 'STPT/BNB', 'STPT/BTC', 'STPT/USDT', 'BTC/ZAR', 'ETH/ZAR', 'BNB/ZAR', 'USDT/ZAR', 'BUSD/ZAR', 'BTC/BKRW', 'ETH/BKRW', 'BNB/BKRW', 'WTC/USDT', 'DATA/BUSD', 'DATA/USDT', 'XZC/USDT', 'SOL/BNB', 'SOL/BTC', 'SOL/USDT', 'SOL/BUSD', 'BTC/IDRT', 'BNB/IDRT', 'USDT/IDRT', 'BUSD/IDRT', 'CTSI/BTC', 'CTSI/USDT', 'CTSI/BNB', 'CTSI/BUSD', 'HIVE/BNB', 'HIVE/BTC', 'HIVE/USDT', 'CHR/BNB', 'CHR/BTC', 'CHR/USDT', 'BTCUP/USDT', 'BTCDOWN/USDT', 'GXS/USDT', 'ARDR/USDT', 'ERD/BUSD', 'LEND/USDT', 'HBAR/BUSD', 'MATIC/BUSD', 'WRX/BUSD', 'ZIL/BUSD', 'MDT/BNB', 'MDT/BTC', 'MDT/USDT', 'STMX/BTC', 'STMX/ETH', 'STMX/USDT', 'KNC/BUSD', 'KNC/USDT', 'REP/BUSD', 'REP/USDT', 'LRC/BUSD', 'LRC/USDT', 'IQ/BNB', 'IQ/BUSD', 'PNT/BTC', 'PNT/USDT', 'BTC/GBP', 'ETH/GBP', 'XRP/GBP', 'BNB/GBP', 'GBP/BUSD', 'DGB/BTC', 'DGB/BUSD', 'BTC/UAH', 'USDT/UAH', 'COMP/BTC', 'COMP/BNB', 'COMP/BUSD', 'COMP/USDT', 'BTC/BIDR', 'ETH/BIDR', 'BNB/BIDR', 'BUSD/BIDR', 'USDT/BIDR', 'BKRW/USDT', 'BKRW/BUSD', 'SC/USDT', 'ZEN/USDT', 'SXP/BTC', 'SXP/BNB', 'SXP/BUSD', 'SNX/BTC', 'SNX/BNB', 'SNX/BUSD', 'SNX/USDT', 'ETHUP/USDT', 'ETHDOWN/USDT', 'ADAUP/USDT', 'ADADOWN/USDT', 'LINKUP/USDT', 'LINKDOWN/USDT', 'VTHO/BNB', 'VTHO/BUSD', 'VTHO/USDT', 'DCR/BUSD', 'DGB/USDT', 'GBP/USDT', 'STORJ/BUSD', 'SXP/USDT', 'IRIS/BNB', 'IRIS/BTC', 'IRIS/BUSD', 'MKR/BNB', 'MKR/BTC', 'MKR/USDT', 'MKR/BUSD', 'DAI/BNB', 'DAI/BTC', 'DAI/USDT', 'DAI/BUSD', 'RUNE/BNB', 'RUNE/BTC', 'RUNE/BUSD', 'MANA/BUSD', 'DOGE/BUSD', 'LEND/BUSD', 'ZRX/BUSD', 'DCR/USDT', 'STORJ/USDT', 'XRP/BKRW', 'ADA/BKRW', 'BTC/AUD', 'ETH/AUD', 'AUD/BUSD', 'FIO/BNB', 'FIO/BTC', 'FIO/BUSD', 'BNBUP/USDT', 'BNBDOWN/USDT', 'XTZUP/USDT', 'XTZDOWN/USDT', 'AVA/BNB', 'AVA/BTC', 'AVA/BUSD', 'USDT/BKRW', 'BUSD/BKRW', 'IOTA/BUSD', 'MANA/USDT', 'XRP/AUD', 'BNB/AUD', 'AUD/USDT', 'BAL/BNB', 'BAL/BTC', 'BAL/BUSD', 'YFI/BNB', 'YFI/BTC', 'YFI/BUSD', 'YFI/USDT', 'BLZ/BUSD', 'KMD/BUSD', 'BAL/USDT', 'BLZ/USDT', 'IRIS/USDT', 'KMD/USDT', 'BTC/DAI', 'ETH/DAI', 'BNB/DAI', 'USDT/DAI', 'BUSD/DAI', 'JST/BNB', 'JST/BTC', 'JST/BUSD', 'JST/USDT', 'SRM/BNB', 'SRM/BTC', 'SRM/BUSD', 'SRM/USDT', 'ANT/BNB', 'ANT/BTC', 'ANT/BUSD', 'ANT/USDT', 'CRV/BNB', 'CRV/BTC', 'CRV/BUSD', 'CRV/USDT', 'SAND/BNB', 'SAND/BTC', 'SAND/USDT', 'SAND/BUSD', 'OCEAN/BNB', 'OCEAN/BTC', 'OCEAN/BUSD', 'OCEAN/USDT', 'NMR/BTC', 'NMR/BUSD', 'NMR/USDT', 'DOT/BNB', 'DOT/BTC', 'DOT/BUSD', 'DOT/USDT', 'LUNA/BNB', 'LUNA/BTC', 'LUNA/BUSD', 'LUNA/USDT', 'IDEX/BTC', 'IDEX/BUSD', 'RSR/BNB', 'RSR/BTC', 'RSR/BUSD', 'RSR/USDT', 'PAXG/BNB', 
'PAXG/BTC', 'PAXG/BUSD', 'PAXG/USDT', 'WNXM/BNB', 'WNXM/BTC', 'WNXM/BUSD', 'WNXM/USDT', 'TRB/BNB', 'TRB/BTC', 'TRB/BUSD', 'TRB/USDT', 'ETH/NGN', 'DOT/BIDR', 'LINK/AUD', 'SXP/AUD', 'BZRX/BNB', 'BZRX/BTC', 'BZRX/BUSD', 'BZRX/USDT', 'WBTC/BTC', 'WBTC/ETH', 'SUSHI/BNB', 'SUSHI/BTC', 'SUSHI/BUSD', 'SUSHI/USDT', 'YFII/BNB', 'YFII/BTC', 'YFII/BUSD', 'YFII/USDT', 'KSM/BNB', 'KSM/BTC', 'KSM/BUSD', 'KSM/USDT', 'EGLD/BNB', 'EGLD/BTC', 'EGLD/BUSD', 'EGLD/USDT', 'DIA/BNB', 'DIA/BTC', 'DIA/BUSD', 'DIA/USDT', 'RUNE/USDT', 'FIO/USDT', 'UMA/BTC', 'UMA/USDT', 'EOSUP/USDT', 'EOSDOWN/USDT', 'TRXUP/USDT', 'TRXDOWN/USDT', 'XRPUP/USDT', 'XRPDOWN/USDT', 'DOTUP/USDT', 'DOTDOWN/USDT', 'SRM/BIDR', 'ONE/BIDR', 'LINK/TRY', 'USDT/NGN', 'BEL/BNB', 'BEL/BTC', 'BEL/BUSD', 'BEL/USDT', 'WING/BNB', 'WING/BTC', 'SWRV/BNB', 'SWRV/BUSD', 'WING/BUSD', 'WING/USDT', 'LTCUP/USDT', 'LTCDOWN/USDT', 'LEND/BKRW', 'SXP/EUR', 'CREAM/BNB', 'CREAM/BUSD', 'UNI/BNB', 'UNI/BTC', 'UNI/BUSD', 'UNI/USDT', 'NBS/BTC', 'NBS/USDT', 'OXT/BTC', 'OXT/USDT', 'SUN/BTC', 'SUN/USDT', 'AVAX/BNB', 'AVAX/BTC', 'AVAX/BUSD', 'AVAX/USDT', 'HNT/BTC', 'HNT/USDT', 'BAKE/BNB', 'BURGER/BNB', 'SXP/BIDR', 'LINK/BKRW', 'FLM/BNB', 'FLM/BTC', 'FLM/BUSD', 'FLM/USDT', 'SCRT/BTC', 'SCRT/ETH', 'CAKE/BNB', 'CAKE/BUSD', 'SPARTA/BNB', 'UNIUP/USDT', 'UNIDOWN/USDT', 'ORN/BTC', 'ORN/USDT', 'TRX/NGN', 'SXP/TRY', 'UTK/BTC', 'UTK/USDT', 'XVS/BNB', 'XVS/BTC', 'XVS/BUSD', 'XVS/USDT', 'ALPHA/BNB', 'ALPHA/BTC', 'ALPHA/BUSD', 'ALPHA/USDT', 'VIDT/BTC', 'VIDT/BUSD', 'AAVE/BNB', 'BTC/BRL', 'USDT/BRL', 'AAVE/BTC', 'AAVE/ETH', 'AAVE/BUSD', 'AAVE/USDT', 'AAVE/BKRW', 'NEAR/BNB', 'NEAR/BTC', 'NEAR/BUSD', 'NEAR/USDT', 'SXPUP/USDT', 'SXPDOWN/USDT', 'DOT/BKRW', 'SXP/GBP', 'FIL/BNB', 'FIL/BTC', 'FIL/BUSD', 'FIL/USDT', 'FILUP/USDT', 'FILDOWN/USDT', 'YFIUP/USDT', 'YFIDOWN/USDT', 'INJ/BNB', 'INJ/BTC', 'INJ/BUSD', 'INJ/USDT', 'AERGO/BTC', 'AERGO/BUSD', 'LINK/EUR', 'ONE/BUSD', 'EASY/ETH', 'AUDIO/BTC', 'AUDIO/BUSD', 'AUDIO/USDT', 'CTK/BNB', 'CTK/BTC', 'CTK/BUSD', 'CTK/USDT', 'BCHUP/USDT', 'BCHDOWN/USDT', 'BOT/BTC', 'BOT/BUSD', 'ETH/BRL', 'DOT/EUR', 'AKRO/BTC', 'AKRO/USDT', 'KP3R/BNB', 'KP3R/BUSD', 'AXS/BNB', 'AXS/BTC', 'AXS/BUSD', 'AXS/USDT', 'HARD/BNB', 'HARD/BTC', 'HARD/BUSD', 'HARD/USDT', 'BNB/BRL', 'LTC/EUR', 'RENBTC/BTC', 'RENBTC/ETH', 'DNT/BUSD', 'DNT/USDT', 'SLP/ETH', 'ADA/EUR', 'LTC/NGN', 'CVP/ETH', 'CVP/BUSD', 'STRAX/BTC', 'STRAX/ETH', 'STRAX/BUSD', 'STRAX/USDT', 'FOR/BTC', 'FOR/BUSD', 'UNFI/BNB', 'UNFI/BTC', 'UNFI/BUSD', 'UNFI/USDT', 'FRONT/ETH', 'FRONT/BUSD', 'BCHA/BUSD', 'ROSE/BTC', 'ROSE/BUSD', 'ROSE/USDT', 'AVAX/TRY', 'BUSD/BRL', 'AVA/USDT', 'SYS/BUSD', 'XEM/USDT', 'HEGIC/ETH', 'HEGIC/BUSD', 'AAVEUP/USDT', 'AAVEDOWN/USDT', 'PROM/BNB', 'PROM/BUSD', 'XRP/BRL', 'XRP/NGN', 'SKL/BTC', 'SKL/BUSD', 'SKL/USDT', 'BCH/EUR', 'YFI/EUR', 'ZIL/BIDR', 'SUSD/BTC', 'SUSD/ETH', 'SUSD/USDT', 'COVER/ETH', 'COVER/BUSD', 
'GLM/BTC', 'GLM/ETH', 'GHST/ETH', 'GHST/BUSD', 'SUSHIUP/USDT', 'SUSHIDOWN/USDT', 'XLMUP/USDT', 'XLMDOWN/USDT', 'LINK/BRL', 'LINK/NGN', 'LTC/RUB', 'TRX/TRY', 'XLM/EUR', 'DF/ETH', 'DF/BUSD', 'GRT/BTC', 'GRT/ETH', 'GRT/USDT', 'JUV/BTC', 'JUV/BUSD', 'JUV/USDT', 'PSG/BTC', 'PSG/BUSD', 'PSG/USDT', 'BUSD/BVND', 'USDT/BVND', '1INCH/BTC', '1INCH/USDT', 'REEF/BTC', 'REEF/USDT', 'OG/BTC', 'OG/USDT', 'ATM/BTC', 'ATM/USDT', 'ASR/BTC', 'ASR/USDT', 
'CELO/BTC', 'CELO/USDT', 'RIF/BTC', 'RIF/USDT', 'CHZ/TRY', 'XLM/TRY', 'LINK/GBP', 'GRT/EUR', 'BTCST/BTC', 'BTCST/BUSD', 'BTCST/USDT', 'TRU/BTC', 'TRU/BUSD', 'TRU/USDT', 'DEXE/ETH', 'DEXE/BUSD', 'EOS/EUR', 'LTC/BRL', 'USDC/BUSD', 'TUSD/BUSD', 'PAX/BUSD', 'CKB/BTC', 'CKB/BUSD', 'CKB/USDT', 'TWT/BTC', 'TWT/BUSD', 'TWT/USDT', 'FIRO/BTC', 'FIRO/ETH', 'FIRO/USDT', 'BETH/ETH', 'DOGE/EUR', 'DOGE/TRY', 'DOGE/AUD', 'DOGE/BRL', 'DOT/NGN', 'PROS/ETH', 'LIT/BTC', 'LIT/BUSD', 'LIT/USDT', 'BTC/VAI', 'BUSD/VAI', 'SFP/BTC', 'SFP/BUSD', 'SFP/USDT', 'DOGE/GBP', 'DOT/TRY', 'FXS/BTC', 'FXS/BUSD', 'DODO/BTC', 'DODO/BUSD', 'DODO/USDT', 'FRONT/BTC', 'EASY/BTC', 'CAKE/BTC', 'CAKE/USDT', 'BAKE/BUSD', 'UFT/ETH', 'UFT/BUSD', '1INCH/BUSD', 'BAND/BUSD', 'GRT/BUSD', 'IOST/BUSD', 'OMG/BUSD', 'REEF/BUSD', 'ACM/BTC', 'ACM/BUSD', 'ACM/USDT', 'AUCTION/BTC', 'AUCTION/BUSD', 'PHA/BTC', 'PHA/BUSD', 'DOT/GBP', 'ADA/TRY', 'ADA/BRL', 'ADA/GBP', 'TVK/BTC', 'TVK/BUSD', 'BADGER/BTC', 'BADGER/BUSD', 'BADGER/USDT', 'FIS/BTC', 'FIS/BUSD', 'FIS/USDT', 'DOT/BRL', 'ADA/AUD', 'HOT/TRY', 'EGLD/EUR', 'OM/BTC', 'OM/BUSD', 'OM/USDT', 'POND/BTC', 'POND/BUSD', 'POND/USDT', 'DEGO/BTC', 'DEGO/BUSD', 'DEGO/USDT', 'AVAX/EUR', 'BTT/TRY', 'CHZ/BRL', 'UNI/EUR', 'ALICE/BTC', 'ALICE/BUSD', 'ALICE/USDT', 'CHZ/BUSD', 'CHZ/EUR', 'CHZ/GBP', 'BIFI/BNB', 'BIFI/BUSD', 'LINA/BTC', 'LINA/BUSD', 'LINA/USDT', 'ADA/RUB', 'ENJ/BRL', 'ENJ/EUR', 'MATIC/EUR', 'NEO/TRY', 'PERP/BTC', 'PERP/BUSD', 'PERP/USDT', 'RAMP/BTC', 'RAMP/BUSD', 'RAMP/USDT', 'SUPER/BTC', 'SUPER/BUSD', 'SUPER/USDT', 'CFX/BTC', 'CFX/BUSD', 'CFX/USDT', 'ENJ/GBP', 'EOS/TRY', 'LTC/GBP', 'LUNA/EUR', 'RVN/TRY', 'THETA/EUR', 'XVG/BUSD', 'EPS/BTC', 'EPS/BUSD', 'EPS/USDT', 'AUTO/BTC', 'AUTO/BUSD', 'AUTO/USDT', 'TKO/BTC', 'TKO/BIDR', 'TKO/BUSD', 'TKO/USDT', 'PUNDIX/ETH', 'PUNDIX/USDT', 'BTT/BRL', 'BTT/EUR', 'HOT/EUR', 'WIN/EUR', 'TLM/BTC', 'TLM/BUSD', 'TLM/USDT', '1INCHUP/USDT', '1INCHDOWN/USDT', 'BTG/BUSD', 'BTG/USDT', 'HOT/BUSD', 'BNB/UAH', 'ONT/TRY', 'VET/EUR', 'VET/GBP', 'WIN/BRL', 'MIR/BTC', 'MIR/BUSD', 'MIR/USDT', 'BAR/BTC', 'BAR/BUSD', 'BAR/USDT', 'FORTH/BTC', 'FORTH/BUSD', 'FORTH/USDT', 'CAKE/GBP', 'DOGE/RUB', 'HOT/BRL', 'WRX/EUR', 'EZ/BTC', 'EZ/ETH', 'BAKE/USDT', 'BURGER/BUSD', 'BURGER/USDT', 'SLP/BUSD', 'SLP/USDT', 'TRX/AUD', 'TRX/EUR', 'VET/TRY', 'SHIB/USDT', 'SHIB/BUSD', 'ICP/BTC', 'ICP/BNB', 'ICP/BUSD', 'ICP/USDT', 'SHIB/EUR', 'SHIB/RUB', 'ETC/EUR', 'ETC/BRL', 'DOGE/BIDR', 'AR/BTC', 'AR/BNB', 'AR/BUSD', 'AR/USDT', 'POLS/BTC', 'POLS/BNB', 'POLS/BUSD', 'POLS/USDT', 'MDX/BTC', 'MDX/BNB', 'MDX/BUSD', 'MDX/USDT', 'MASK/BNB', 'MASK/BUSD', 'MASK/USDT', 'LPT/BTC', 'LPT/BNB', 'LPT/BUSD', 'LPT/USDT', 
'ETH/UAH', 'MATIC/BRL', 'SOL/EUR', 'SHIB/BRL', 'AGIX/BTC', 'ICP/EUR', 'MATIC/GBP', 'SHIB/TRY', 'MATIC/BIDR', 'MATIC/RUB', 'NU/BTC', 'NU/BNB', 'NU/BUSD', 'NU/USDT', 'XVG/USDT', 'RLC/BUSD', 'CELR/BUSD', 'ATM/BUSD', 'ZEN/BUSD', 'FTM/BUSD', 'THETA/BUSD', 'WIN/BUSD', 'KAVA/BUSD', 'XEM/BUSD', 'ATA/BTC', 'ATA/BNB', 'ATA/BUSD', 'ATA/USDT', 'GTC/BTC', 'GTC/BNB', 'GTC/BUSD', 'GTC/USDT', 'TORN/BTC', 'TORN/BNB', 'TORN/BUSD', 'TORN/USDT', 'MATIC/TRY', 'ETC/GBP', 'SOL/GBP', 'BAKE/BTC', 'COTI/BUSD', 'KEEP/BTC', 'KEEP/BNB', 'KEEP/BUSD', 'KEEP/USDT', 'SOL/TRY', 'RUNE/GBP', 'SOL/BRL', 'SC/BUSD', 'CHR/BUSD', 'STMX/BUSD', 'HNT/BUSD', 'FTT/BUSD', 'DOCK/BUSD', 'ADA/BIDR', 'ERN/BNB', 'ERN/BUSD', 'ERN/USDT', 'KLAY/BTC', 'KLAY/BNB', 'KLAY/BUSD', 'KLAY/USDT', 'RUNE/EUR', 'MATIC/AUD', 'DOT/RUB', 'UTK/BUSD', 'IOTX/BUSD', 'PHA/USDT', 'SOL/RUB', 'RUNE/AUD', 'BUSD/UAH', 'BOND/BTC', 'BOND/BNB', 
'BOND/BUSD', 'BOND/USDT', 'MLN/BTC', 'MLN/BNB', 'MLN/BUSD', 'MLN/USDT', 'GRT/TRY', 'CAKE/BRL', 'ICP/RUB', 'DOT/AUD', 'AAVE/BRL', 'EOS/AUD', 'DEXE/USDT', 'LTO/BUSD', 'ADX/BUSD', 'QUICK/BTC', 'QUICK/BNB', 'QUICK/BUSD', 'C98/USDT', 'C98/BUSD', 'C98/BNB', 'C98/BTC', 'CLV/BTC', 'CLV/BNB', 'CLV/BUSD', 'CLV/USDT', 'QNT/BTC', 'QNT/BNB', 'QNT/BUSD', 'QNT/USDT', 'FLOW/BTC', 'FLOW/BNB', 'FLOW/BUSD', 'FLOW/USDT', 'XEC/BUSD', 'AXS/BRL', 'AXS/AUD', 'TVK/USDT', 'MINA/BTC', 'MINA/BNB', 'MINA/BUSD', 'MINA/USDT', 'RAY/BNB', 'RAY/BUSD', 'RAY/USDT', 'FARM/BTC', 'FARM/BNB', 'FARM/BUSD', 'FARM/USDT', 'ALPACA/BTC', 'ALPACA/BNB', 'ALPACA/BUSD', 'ALPACA/USDT', 'TLM/TRY', 'QUICK/USDT', 'ORN/BUSD', 'MBOX/BTC', 'MBOX/BNB', 'MBOX/BUSD', 'MBOX/USDT', 'VGX/BTC', 'VGX/ETH', 'FOR/USDT', 'REQ/USDT', 'GHST/USDT', 'TRU/RUB', 'FIS/BRL', 'WAXP/USDT', 'WAXP/BUSD', 'WAXP/BNB', 'WAXP/BTC', 'TRIBE/BTC', 'TRIBE/BNB', 'TRIBE/BUSD', 'TRIBE/USDT', 'GNO/USDT', 'GNO/BUSD', 'GNO/BNB', 'GNO/BTC', 'ARPA/TRY', 'PROM/BTC', 'MTL/BUSD', 'OGN/BUSD', 'XEC/USDT', 'C98/BRL', 'SOL/AUD', 'XRP/BIDR', 'POLY/BUSD', 'ELF/USDT', 'DYDX/USDT', 'DYDX/BUSD', 'DYDX/BNB', 'DYDX/BTC', 'ELF/BUSD', 'POLY/USDT', 'IDEX/USDT', 'VIDT/USDT', 'SOL/BIDR', 'AXSBIDR', 'BTC/USDP', 'ETH/USDP', 'BNB/USDP', 'USDP/BUSD', 'USDP/USDT', 'GALA/USDT', 'GALA/BUSD', 'GALA/BNB', 'GALA/BTC', 'FTM/BIDR', 'ALGO/BIDR', 'CAKE/AUD', 'KSM/AUD', 'WAVES/RUB', 'SUN/BUSD', 'ILV/USDT', 'ILV/BUSD', 'ILV/BNB', 'ILV/BTC', 'REN/BUSD', 'YGG/USDT', 'YGG/BUSD', 'YGG/BNB', 'YGG/BTC', 'STX/BUSD', 'SYS/USDT', 'DF/USDT', 'SOL/USDC', 'ARPA/RUB', 'LTC/UAH', 'FET/BUSD', 'ARPA/BUSD', 'LSK/BUSD', 'AVAX/BIDR', 'ALICE/BIDR', 'FIDA/USDT', 'FIDA/BUSD', 'FIDA/BNB', 'FIDA/BTC', 'DENT/BUSD', 'FRONT/USDT', 'CVP/USDT', 'AGLD/BTC', 'AGLD/BNB', 'AGLD/BUSD', 'AGLD/USDT', 'RAD/BTC', 'RAD/BNB', 'RAD/BUSD', 'RAD/USDT', 'UNI/AUD', 'HIVE/BUSD', 'STPT/BUSD', 'BETA/BTC', 'BETA/BNB', 'BETA/BUSD', 'BETA/USDT', 'SHIB/AUD', 'RARE/BTC', 'RARE/BNB', 'RARE/BUSD', 'RARE/USDT', 'AVAX/BRL', 'AVAX/AUD', 'LUNA/AUD', 'TROY/BUSD', 'AXS/ETH', 'FTM/ETH', 'SOL/ETH', 'SSV/BTC', 'SSV/ETH', 'LAZIO/TRY', 'LAZIO/EUR', 'LAZIO/BTC', 'LAZIO/USDT', 'CHESS/BTC', 'CHESS/BNB', 'CHESS/BUSD', 'CHESS/USDT', 'FTM/AUD', 'FTM/BRL', 'SCRT/BUSD', 'ADX/USDT', 'AUCTION/USDT', 'CELO/BUSD', 'FTM/RUB', 'NU/AUD', 'NU/RUB', 'REEF/TRY', 'REEF/BIDR', 'SHIB/DOGE', 'DAR/USDT', 'DAR/BUSD', 'DAR/BNB', 'DAR/BTC', 'BNX/BTC', 'BNX/BNB', 'BNX/BUSD', 'BNX/USDT', 'RGT/USDT', 'RGT/BTC', 'RGT/BUSD', 'RGT/BNB', 'LAZIO/BUSD', 'OXT/BUSD', 'MANA/TRY', 'ALGO/RUB', 'SHIB/UAH', 'LUNA/BIDR', 'AUD/USDC', 'MOVR/BTC', 'MOVR/BNB', 'MOVR/BUSD', 'MOVR/USDT', 'CITY/BTC', 'CITY/BNB', 'CITY/BUSD', 'CITY/USDT', 'ENS/BTC', 'ENS/BNB', 'ENS/BUSD', 'ENS/USDT', 'SAND/ETH', 'DOT/ETH', 'MATIC/ETH', 'ANKR/BUSD', 'SAND/TRY', 'MANA/BRL', 'KP3R/USDT', 'QI/USDT', 'QI/BUSD', 'QI/BNB', 'QI/BTC', 'PORTO/BTC', 'PORTO/USDT', 'PORTO/TRY', 'PORTO/EUR', 'POWR/USDT', 'POWR/BUSD', 'AVAX/ETH', 'SLP/TRY', 'FIS/TRY', 'LRC/TRY', 'CHR/ETH', 'FIS/BIDR', 'VGX/USDT', 'GALA/ETH', 'JASMY/USDT', 'JASMY/BUSD', 'JASMY/BNB', 'JASMY/BTC', 'AMP/BTC', 'AMP/BNB', 'AMP/BUSD', 'AMP/USDT', 'PLA/BTC', 'PLA/BNB', 'PLA/BUSD', 'PLA/USDT', 'PYR/BTC', 'PYR/BUSD', 'PYR/USDT', 'RNDR/BTC', 'RNDR/USDT', 'RNDR/BUSD', 'ALCX/BTC', 'ALCX/BUSD', 'ALCX/USDT', 'SANTOS/BTC', 'SANTOS/USDT', 'SANTOS/BRL', 'SANTOS/TRY', 'MC/BTC', 'MC/BUSD', 'MC/USDT', 'BEL/TRY', 'COCOS/BUSD', 'DENT/TRY', 'ENJ/TRY', 'NEO/RUB', 'SAND/AUD', 'SLP/BIDR', 'ANY/BTC', 'ANY/BUSD', 'ANY/USDT', 'BICO/BTC', 'BICO/BUSD', 'BICO/USDT', 'FLUX/BTC', 'FLUX/BUSD', 'FLUX/USDT', 'ALICE/TRY', 'FXS/USDT', 'GALA/BRL', 'GALA/TRY', 'LUNA/TRY', 'REQ/BUSD', 'SAND/BRL', 'MANA/BIDR', 'SAND/BIDR', 'VOXEL/BTC', 'VOXEL/BNB', 'VOXEL/BUSD', 'VOXEL/USDT', 'COS/BUSD', 'CTXC/BUSD', 'FTM/TRY', 'MANA/BNB', 'MINA/TRY', 'XTZ/TRY', 'HIGH/BTC', 'HIGH/BUSD', 'HIGH/USDT', 'CVX/BTC', 'CVX/BUSD', 'CVX/USDT', 'PEOPLE/BTC', 'PEOPLE/BUSD', 'PEOPLE/USDT', 'OOKI/BUSD', 'OOKI/USDT', 'COCOS/TRY', 'GXS/BNB', 'LINK/BNB', 'LUNA/ETH', 'MDT/BUSD', 'NULS/BUSD', 'SPELL/BTC', 'SPELL/USDT', 'SPELL/BUSD', 'UST/BTC', 'UST/BUSD', 'UST/USDT', 'JOE/BTC', 'JOE/BUSD', 'JOE/USDT', 'ATOM/ETH', 'DUSK/BUSD', 'EGLD/ETH', 'ICP/ETH', 'LUNA/BRL', 'LUNA/UST', 'NEAR/ETH', 'ROSE/BNB', 'VOXEL/ETH', 'ALICE/BNB', 'ATOM/TRY', 'ETH/UST', 'GALA/AUD', 'LRC/BNB', 'ONE/ETH', 'OOKI/BNB', 'ACH/BTC', 'ACH/BUSD', 'ACH/USDT', 'IMX/BTC', 'IMX/BUSD', 'IMX/USDT', 'GLMR/BTC', 'GLMR/BUSD', 'GLMR/USDT', 'ATOM/BIDR', 'DYDX/ETH', 'FARM/ETH', 'FOR/BNB', 'ICP/TRY', 'JASMY/ETH', 'LINA/BNB', 'OOKI/ETH', 'ROSE/ETH', 'UMA/BUSD', 'UNI/ETH', 'XTZ/ETH', 'LOKA/BTC', 'LOKA/BNB', 'LOKA/BUSD', 'LOKA/USDT', 'ATOM/BRL', 'BNB/UST', 'CRV/ETH', 'HIGH/BNB', 'NEAR/RUB', 'ROSE/TRY', 'SCRT/USDT', 'API3/BTC', 'API3/BUSD', 'API3/USDT', 'BTTC/USDT', 'BTTC/USDC', 'BTTC/TRY', 'ACA/BTC', 'ACA/BUSD', 'ACA/USDT', 'ANC/BTC', 'ANC/BUSD', 'ANC/USDT', 'BDOT/DOT', 'XNO/BTC', 'XNO/ETH', 'XNO/BUSD', 'XNO/USDT', 'COS/TRY', 'KAVA/ETH', 'MC/BNB', 'ONE/TRY', 'WOO/BTC', 'WOO/BNB', 'WOO/BUSD', 'WOO/USDT', 'CELR/ETH', 'PEOPLE/BNB', 'SLP/BNB', 'SPELL/BNB', 'SPELL/TRY', 'TFUEL/BUSD', 'AXS/TRY', 'DAR/TRY', 'NEAR/TRY', 'IDEX/BNB', 'ALPINE/EUR', 'ALPINE/TRY', 'ALPINE/USDT', 'ALPINE/BTC', 'T/USDT', 'T/BUSD', 'API3/BNB', 'BETA/ETH', 'INJ/TRY', 'TLM/BNB', 'ASTR/BUSD', 'ASTR/USDT', 'API3/TRY', 'GLMR/BNB', 'MBOX/TRY', 'NBTBIDR', 'NBTUSDT', 'GMT/BTC', 'GMT/BNB', 'GMT/BUSD', 'GMT/USDT', 'ANC/BNB', 'ATOM/EUR', 'GALA/EUR', 'KSM/ETH', 'UMA/TRY', 'KDA/BTC', 'KDA/BUSD', 'KDA/USDT', 'APE/USDT', 'APE/BUSD', 'APE/BTC', 'ALPINE/BUSD', 'LUNA/GBP', 'NEAR/EUR', 'TWT/TRY', 'WAVES/EUR', 'APE/EUR', 'APE/GBP', 'APE/TRY', 'BSW/USDT', 'BSW/BUSD', 'BSW/BNB', 'APE/BNB', 'GMT/BRL', 'GMT/ETH', 'JASMY/TRY', 'SANTOS/BUSD', 'APE/AUD', 'BIFI/USDT', 'GMT/EUR', 'IMX/BNB', 'RUNE/ETH', 'AVAX/GBP', 'MULTI/BTC', 'MULTI/BUSD', 'MULTI/USDT', 'APE/ETH', 'BSW/ETH', 'FIL/TRY', 'FTM/EUR', 'GMT/GBP', 'ZIL/TRY', 'GMT/TRY', 'WAVES/TRY', 'BTC/UST', 'ASTR/BTC', 'ASTR/ETH', 'BSW/TRY', 'FTT/ETH', 'FUN/BNB', 'PORTO/BUSD', 'STEEM/USDT', 'ZIL/EUR', 'APE/BRL', 'AUDIO/TRY', 'BTTC/BUSD', 'GMT/AUD', 'MBL/BUSD', 'MOB/USDT', 'MOB/BUSD', 'MOB/BTC', 'NEXO/USDT', 'NEXO/BUSD', 'NEXO/BTC', 'REI/USDT', 'REI/BNB', 'REI/ETH', 'GAL/USDT', 'GAL/BUSD', 'GAL/BNB', 'GAL/BTC', 'JASMY/EUR', 'KNC/BNB', 'SHIB/GBP', 'GAL/EUR', 'GAL/TRY', 'LDO/BUSD', 'LDO/USDT', 'LDO/BTC', 'ENS/TRY', 'DAR/EUR', 'DAR/ETH', 'ALGO/ETH', 'ALGO/TRY', 'GAL/ETH', 'EPX/USDT', 'EPX/BUSD', 'RUNE/TRY', 'GAL/BRL', 'STEEM/BUSD', 'CVC/BUSD', 'REI/BUSD', 'DREP/BUSD', 'AKRO/BUSD', 'PUNDIX/BUSD', 'LUNC/BUSD', 'USTC/BUSD', 'OP/BTC', 'OP/BUSD', 'OP/USDT', 'OG/BUSD', 'KEY/BUSD', 'ASR/BUSD', 'FIRO/BUSD', 'NKN/BUSD', 'OP/BNB', 'OP/EUR', 'GTO/BUSD', 'SNX/ETH', 'WBTC/BUSD', 'BEL/ETH', 'LIT/ETH', 'LEVER/USDT', 'LEVER/BUSD', 'BURGER/ETH', 'PEOPLE/ETH', 'UNFI/ETH', 'BOND/ETH', 'STORJ/TRY', 'OP/ETH', 'ETC/TRY', 'WING/ETH', 'FIL/ETH', 'GLM/BUSD', 'SSV/BUSD', 'STG/BTC', 'STG/BUSD', 'STG/USDT', 'ANKR/TRY', 'ARK/BUSD', 'BETH/BUSD', 'LOOM/BUSD', 'SNM/BUSD', 'AMB/BUSD', 'LUNC/USDT', 'PHB/BUSD', 'GAS/BUSD', 'NEBL/BUSD', 'PROS/BUSD', 'VIB/BUSD', 'GMX/BTC', 'GMX/BUSD', 'GMX/USDT'])

 

4. 설치 외 pip 명령어

 설치하는 것 외에도 삭제와 설치된 패키지를 확인하는 명령어를 추가로 소개하겠습니다. install과 마찬가지로 터미널에 바로 입력하여 사용하시면 되겠습니다.

 1) uninstall

 uninstall은 설치되어 있는 패키지를 삭제하는 명령어입니다. uninstall을 이용하여 설치했던 ccxt 패키지를 삭제해 보겠습니다.

pip uninstall ccxt

 삭제를 진행할 것인지 물어보는데, 질문에 y로 답변하면 삭제가 진행됩니다.

삭제 완료

 

 2) list

 list는 설치된 패키지 목록과 각각의 버전을 확인할 수 있는 명령어 입니다. list를 이용해 제 컴퓨터에 설치되어 있는 패키지들을 확인해 보겠습니다.

pip list

 아래 사진처럼 설치되어 있는 패키지의 이름과 버전을 확인할 수 있습니다.

설치된 패키지 리스트

 

 이번글에서는 패키지 설치 및 사용방법, 관련 명령어에 관해서 포스팅했습니다. 읽어주셔서 감사합니다.

반응형

'Python' 카테고리의 다른 글

파이썬 dotenv를 이용한 환경변수 저장 및 호출  (0) 2022.10.05
반응형

 블로그 만든 뒤에 처음 작성하는 글이네요. 블로그에 공유하기 위해 중요한 정보(암호) 등을 환경변수로 지정해 다른 파일에 저장하고, 공유시에 다른 사람들에게 노출되는 것을 막고자 합니다. 이번글에서는 환경변수를 지정하고, 호출하는 방법에 대해 포스팅 하겠습니다.

 

1. dotenv 설치

 먼저 터미널에 'pip install python-dotenv'을 입력하여 dotenv를 설치합니다.

 (패키지 설치에 관한 내용은 이 글(https://bitcoding.tistory.com/5)을 참고해주세요.)

pip install python-dotenv

 

2. .env 파일 생성

작업하는 폴더 내에 '.env' 라는 이름의 파일을 생성합니다.

.env 파일 생성

 

3. 환경변수 지정

생성한 '.env' 파일에 아래와 같이 환경변수를 지정합니다.

test01 = 'bit_coding'
test02 = 'test_num_two'

 

4. 환경변수 호출

py파일로 넘어와서 os.environ를 이용해 호출할 수 있습니다. test01과 test02를 각각 os.environ을 통해 호출하여 출력해보았습니다.

import os
import dotenv

dotenv_file = dotenv.find_dotenv()
dotenv.load_dotenv(dotenv_file)

print(os.environ['test01'])
print(os.environ['test02'])

 

5. 결과

앞서 .env파일에 저장해두었던 환경변수들이 정상적으로 출력되는 것을 볼수 있습니다.

bit_coding
second test

 

 현재 필자의 경우 암호화폐 거래소에서 api를 신청하여 발급받은 apikey와 secret key를 환경변수로 지정하여 사용하고 있습니다. 앞서 말한 apikey와 secret key의 경우 복잡하고 굉장히 길지만, 환경변수로 지정해 둔다면 매번 복붙할 필요없이 필요할 때 호출하여 간편하게 쓸 수 있는 장점이 있습니다. (예시: ghLK6EJgm24DKvOpwlT7d9I5f0IE145JfdqVPbNmeq) 

 

 이번글에서는 dotenv 패키지를 이용하여 환경변수를 지정하고 호출하는 방법에 대해 포스팅했습니다. 읽어주셔서 감사합니다.

반응형

'Python' 카테고리의 다른 글

파이썬 패키지(라이브러리) 다운 pip install  (0) 2022.10.06
반응형

 반갑습니다. 비트코딩입니다.

 암호화폐 트레이딩을 하면서 내가 원하는 기능을 가진 프로그램이 있다면 좋겠다고 생각했습니다. 예를 들어 이런저런 정보들을 모아서 한눈에 볼 수 있는 툴이나, 어떤 값이(예를 들면 김프) 일정 값에 도달하면 알람을 받는 등의 기능을 원했습니다.

 내가 원하는 프로그램을 만들고자 파이썬을 접하게 된게 2022년 4월경이었고, 현재 6개월 정도 되었습니다. 처음은 유튜브 등의 강의로 기본적인 문법 등을 익혔고, 코딩 할 때는 구글링을 통해 명령어들을 참고하고 다른사람들의 코드를 봐가면서 작성했습니다.

 이전의 코딩해온 것과 앞으로 해나가는 과정을 일기처럼 작성해나갈 계획입니다. 그동안 작성한 코드들을 블로그에 올릴 예정이고, 기존의 코드들을 수정하거나, 향후 필요성을 느끼는 프로그램을 추가로 만들고 포스트 할 계획입니다.

 방문해주신 모든 분들 감사합니다.

반응형

+ Recent posts