· 5 years ago · Jun 25, 2020, 07:28 PM
1from binance.client import Client
2from binance.enums import SIDE_BUY, ORDER_TYPE_LIMIT, TIME_IN_FORCE_GTC
3from settings import API_KEY, SECRET_KEY, EXCEPTION_LIST
4import logging
5from pprint import PrettyPrinter
6
7logging.basicConfig(
8 filename='client.log',
9 filemode='w',
10 level=logging.INFO,
11 format='%(asctime)s.%(msecs)03d %(levelname)s %(module)s - %(funcName)s: %(message)s',
12 datefmt='%Y-%m-%d %H:%M:%S')
13client = Client(API_KEY, SECRET_KEY)
14pp = PrettyPrinter()
15
16
17def try_except_decarator(func):
18 def wrapper(*args, **kwargs):
19 try:
20 func(*args)
21 except EXCEPTION_LIST as ex:
22 logging.info(ex)
23 else:
24 logging.info("Done")
25
26 return wrapper
27
28
29class BinanceClient():
30
31 def __init__(self):
32 self.client = Client(API_KEY, SECRET_KEY)
33
34 @try_except_decarator
35 def set_order(self, ticket_1, ticket_2):
36 """" Выставляет ордер с заданными параметрами. """
37
38 order = client.create_test_order( # Создаём тестовый ордер в тестовой сети.
39 symbol=f'{ticket_1}{ticket_2}',
40 side=SIDE_BUY,
41 type=ORDER_TYPE_LIMIT,
42 timeInForce=TIME_IN_FORCE_GTC,
43 quantity=1,
44 price=9800)
45 logging.info("Выполнено.")
46 return order
47
48 @try_except_decarator
49 def get_average_price(self, ticket_1, ticket_2):
50 """ Возвращает текущую цену заданной пары. """
51
52 avg_price = client.get_avg_price(symbol=f'{ticket_1}{ticket_2}') # Получаем среднее значение цены за 5 мин.
53 return f"{avg_price['price']} + {ticket_2}"
54
55 @try_except_decarator
56 def get_all_open_orders(self):
57 """ Возвращает список открытых сделок. """
58
59 try:
60 orders = client.get_open_orders() # Получаем список открытых сделок.
61 except EXCEPTION_LIST as ex:
62 print(f"К сожалению, возникла ошибка {ex}. Попробуйте ещё раз.")
63 logging.info(ex)
64 else:
65 return orders
66
67 @try_except_decarator
68 def close_order(self, ticket_1, ticket_2, orderId):
69 """ Закрывает ордер. """
70
71 orders = self.get_all_open_orders() # Проверяем есть ли ордер на закрытие.
72 for order in orders:
73 if order.get('symbol') == ticket_1 and order.get('symbol') == ticket_1 and order.get('orderId') == orderId:
74 try:
75 result = client.cancel_order(symbol=f'{ticket_1}{ticket_2}', orderId='orderId')
76 print("Ордер успешно закрыт.")
77 return result
78 except EXCEPTION_LIST as ex:
79 print(f"К сожалению, возникла ошибка {ex}. Попробуйте ещё раз.")
80 logging.info(ex)
81 else:
82 return 'К сожалению, нет ордеров на закрытие.'
83
84 @try_except_decarator
85 def get_balance(self):
86 """ Возвращает баланс пользователя. """
87
88 info = client.get_account()
89 balance = {} # Создаём словарь с балансом пользователя.{'BTC':2, 'ETC':12}
90 for crypto in info['balances']:
91 if crypto['free'] != '0.00000000':
92 balance[crypto['asset']] = crypto['free']
93 return balance