Бот для торговли криптовалютой с Binance, ошибка обратного вызова > связанного метода, когда я пытаюсь получить историче ⇐ Python
Бот для торговли криптовалютой с Binance, ошибка обратного вызова > связанного метода, когда я пытаюсь получить историче
Бот берет определенные данные с www.testnet.binancefuture.com> Информация, которую я получаю, - это цена спроса и предложения, исторические свечи, контракты, балансы, размещение, отмена и статус заказа. Методы обратного вызова: on_open, on_error, on_close и on_message + подписка на канал. Вот код и ошибка
класс BinanceFuturesClient:
def __init__(self, public_key, secret_key, testnet): если тестовая сеть: self.base_url = "https://testnet.binancefuture.com" self.wss_url = "wss://stream.binancefuture.com/ws" еще: self.base_url = "https://fapi.binance.com" self.wss_url = "wss://fstream.binance.com/ws" self.public_key = публичный_ключ self.secret_key = секретный_ключ self.headers = {'X-MBX-APIKEY': self.public_key} self.prices = dict() self.id = 1 self.ws = Нет t = threading.Thread(target=self.start_ws) т.старт() logger.info("Клиент Binance Futures успешно инициализирован") Защиту генерировать_подпись (я, данные): return hmac.new(self.secret_key.encode(), urlencode(data).encode(), hashlib.sha256).hexdigest() def make_request(сам, метод, конечная точка, данные): если метод == "GET": ответ = запросы.get(self.base_url + конечная точка, параметры=данные, заголовки=self.headers) метод elif == 'POST': ответ = запросы.пост (self.base_url + конечная точка, параметры = данные, заголовки = self.headers) метод elif == 'DELETE': ответ = запросы.удалить(self.base_url + конечная точка, параметры=данные, заголовки=self.headers) еще: поднять ValueError() если ответ.код_статуса == 200: вернуть ответ.json() еще: logger.error('Ошибка при выполнении запроса %s к %s: %s(код ошибки %s)', метод, конечная точка, ответ.json(), ответ.status_code) возврат Нет защита get_contracts (сам): Exchange_info = self.make_request("GET", "/fapi/v1/exchangeInfo", Нет) контракты = dict() если обмен_информация не имеет значения «Нет»: для контрактных данных в обмене_info['symbols']: контракты[contract_data['пара']] = контракт_данные возвратные контракты def get_historical_candles(сам, символ, интервал): данные = дикт() данные['символ'] = символ данные['интервал'] = интервал данные['лимит'] = 1000 raw_candles = self.make_request("GET", "/fapi/v1/klines", данные) свечи = [] если raw_candles не имеет значения None: для c в raw_candles: свечи.append([c[0], float(c[1]), float(c[2]), float(c[3]), float(c[4]), float(c[5])] ) возвратные свечи Защиту get_bid_ask (я, символ): данные = дикт() данные['символ'] = символ ob_data = self.make_request("GET", "/fapi/v1/ticker/bookTicker", data) если ob_data не имеет значения None: если символа нет в self.prices: self.prices[symbol] = {'bid': float(ob_data['bidPrice']), 'ask': float(ob_data['askPrice'])} еще: self.prices[symbol]['bid'] = float(ob_data['bidPrice']) self.prices[symbol]['ask'] = float(ob_data['askPrice']) вернуть self.prices[символ] защита get_balances(self): данные = дикт() данные['метка времени'] = int(time.time() * 1000) данные['подпись'] = self.generate_signature(данные) балансы = dict() account_data = self.make_request("GET", "/fapi/v1/account", данные) если account_data не имеет значения None: для в account_data['assets']: балансы[a['актив']] = а возвратные остатки def Place_order(self, символ, сторона, количество, тип заказа, цена=Нет, tif=Нет): данные = дикт() данные['символ'] = символ данные['сторона'] = сторона данные['количество'] = количество данные['тип'] = тип_заказа если цена не Нет: данные['цена'] = цена если tif не None: данные['timeInForce'] = tif данные['метка времени'] = int(time.time() * 1000) данные['подпись'] = self.generate_signature(данные) order_status = self.make_request("POST", "/fapi/v1/order", данные) вернуть статус_заказа Защиту cancel_order (я, символ, order_id): данные = дикт() данные['символ'] = символ данные['orderId'] = order_id данные['метка времени'] = int(time.time() * 1000) данные['подпись'] = self.generate_signature(данные) order_status = self.make_request("УДАЛИТЬ", "/fapi/v1/order", данные) вернуть статус_заказа Защиту get_order_status (я, символ, order_id): данные = дикт() данные['метка времени'] = int(time.time() * 1000) данные['символ'] = символ данные['orderId'] = order_id данные['подпись'] = self.generate_signature(данные) order_status = self.make_request("GET", "/fapi/v1/order", данные) вернуть статус_заказа защита start_ws (сам): ws = websocket.WebSocketApp(self.wss_url, on_open=self.on_open, on_close=self.on_close, on_error=self.on_error, on_message=self.on_message) ws.run_forever() защита on_close(сам, ws): logger.warning("Соединение с веб-сокетом Binance закрыто") def on_error(self, ws, msg): logger.error("Ошибка подключения к Binance: %s", сообщение) защита on_open(сам, ws): logger.info("Соединение с Binance открыто") self.subscribe_channel("BTCUSDT") def on_message(self, ws, msg): печать (сообщение) Защиту subscribe_channel (я, символ): данные = дикт() data['method'] = "ПОДПИСАТЬСЯ" данные['параметры'] = [] data['params'].append(symbol.lower() + "@bookTicker") данные['id'] = self.id печать(данные, тип(данные)) print(json.dumps(данные), тип(json.dumps(данные))) self.ws.send(json.dumps(данные)) self.id += 1 Ошибка после данных:
2021-05-04 16:51:55,683 ИНФОРМАЦИЯ :: Клиент Binance Futures успешно инициализирован {'method': 'SUBSCRIBE', 'params': ['btcusdt@bookTicker'], 'id': 1} {"method": "SUBSCRIBE", "params": ["btcusdt@bookTicker"], "id": 1} 2021-05-04 16:51:56,833 ИНФОРМАЦИЯ :: Соединение с Binance открыто 2021-05-04 16:51:56,834 ОШИБКА :: ошибка обратного вызова : объект «NoneType» не имеет атрибута «отправить»
Бот берет определенные данные с www.testnet.binancefuture.com> Информация, которую я получаю, - это цена спроса и предложения, исторические свечи, контракты, балансы, размещение, отмена и статус заказа. Методы обратного вызова: on_open, on_error, on_close и on_message + подписка на канал. Вот код и ошибка
класс BinanceFuturesClient:
def __init__(self, public_key, secret_key, testnet): если тестовая сеть: self.base_url = "https://testnet.binancefuture.com" self.wss_url = "wss://stream.binancefuture.com/ws" еще: self.base_url = "https://fapi.binance.com" self.wss_url = "wss://fstream.binance.com/ws" self.public_key = публичный_ключ self.secret_key = секретный_ключ self.headers = {'X-MBX-APIKEY': self.public_key} self.prices = dict() self.id = 1 self.ws = Нет t = threading.Thread(target=self.start_ws) т.старт() logger.info("Клиент Binance Futures успешно инициализирован") Защиту генерировать_подпись (я, данные): return hmac.new(self.secret_key.encode(), urlencode(data).encode(), hashlib.sha256).hexdigest() def make_request(сам, метод, конечная точка, данные): если метод == "GET": ответ = запросы.get(self.base_url + конечная точка, параметры=данные, заголовки=self.headers) метод elif == 'POST': ответ = запросы.пост (self.base_url + конечная точка, параметры = данные, заголовки = self.headers) метод elif == 'DELETE': ответ = запросы.удалить(self.base_url + конечная точка, параметры=данные, заголовки=self.headers) еще: поднять ValueError() если ответ.код_статуса == 200: вернуть ответ.json() еще: logger.error('Ошибка при выполнении запроса %s к %s: %s(код ошибки %s)', метод, конечная точка, ответ.json(), ответ.status_code) возврат Нет защита get_contracts (сам): Exchange_info = self.make_request("GET", "/fapi/v1/exchangeInfo", Нет) контракты = dict() если обмен_информация не имеет значения «Нет»: для контрактных данных в обмене_info['symbols']: контракты[contract_data['пара']] = контракт_данные возвратные контракты def get_historical_candles(сам, символ, интервал): данные = дикт() данные['символ'] = символ данные['интервал'] = интервал данные['лимит'] = 1000 raw_candles = self.make_request("GET", "/fapi/v1/klines", данные) свечи = [] если raw_candles не имеет значения None: для c в raw_candles: свечи.append([c[0], float(c[1]), float(c[2]), float(c[3]), float(c[4]), float(c[5])] ) возвратные свечи Защиту get_bid_ask (я, символ): данные = дикт() данные['символ'] = символ ob_data = self.make_request("GET", "/fapi/v1/ticker/bookTicker", data) если ob_data не имеет значения None: если символа нет в self.prices: self.prices[symbol] = {'bid': float(ob_data['bidPrice']), 'ask': float(ob_data['askPrice'])} еще: self.prices[symbol]['bid'] = float(ob_data['bidPrice']) self.prices[symbol]['ask'] = float(ob_data['askPrice']) вернуть self.prices[символ] защита get_balances(self): данные = дикт() данные['метка времени'] = int(time.time() * 1000) данные['подпись'] = self.generate_signature(данные) балансы = dict() account_data = self.make_request("GET", "/fapi/v1/account", данные) если account_data не имеет значения None: для в account_data['assets']: балансы[a['актив']] = а возвратные остатки def Place_order(self, символ, сторона, количество, тип заказа, цена=Нет, tif=Нет): данные = дикт() данные['символ'] = символ данные['сторона'] = сторона данные['количество'] = количество данные['тип'] = тип_заказа если цена не Нет: данные['цена'] = цена если tif не None: данные['timeInForce'] = tif данные['метка времени'] = int(time.time() * 1000) данные['подпись'] = self.generate_signature(данные) order_status = self.make_request("POST", "/fapi/v1/order", данные) вернуть статус_заказа Защиту cancel_order (я, символ, order_id): данные = дикт() данные['символ'] = символ данные['orderId'] = order_id данные['метка времени'] = int(time.time() * 1000) данные['подпись'] = self.generate_signature(данные) order_status = self.make_request("УДАЛИТЬ", "/fapi/v1/order", данные) вернуть статус_заказа Защиту get_order_status (я, символ, order_id): данные = дикт() данные['метка времени'] = int(time.time() * 1000) данные['символ'] = символ данные['orderId'] = order_id данные['подпись'] = self.generate_signature(данные) order_status = self.make_request("GET", "/fapi/v1/order", данные) вернуть статус_заказа защита start_ws (сам): ws = websocket.WebSocketApp(self.wss_url, on_open=self.on_open, on_close=self.on_close, on_error=self.on_error, on_message=self.on_message) ws.run_forever() защита on_close(сам, ws): logger.warning("Соединение с веб-сокетом Binance закрыто") def on_error(self, ws, msg): logger.error("Ошибка подключения к Binance: %s", сообщение) защита on_open(сам, ws): logger.info("Соединение с Binance открыто") self.subscribe_channel("BTCUSDT") def on_message(self, ws, msg): печать (сообщение) Защиту subscribe_channel (я, символ): данные = дикт() data['method'] = "ПОДПИСАТЬСЯ" данные['параметры'] = [] data['params'].append(symbol.lower() + "@bookTicker") данные['id'] = self.id печать(данные, тип(данные)) print(json.dumps(данные), тип(json.dumps(данные))) self.ws.send(json.dumps(данные)) self.id += 1 Ошибка после данных:
2021-05-04 16:51:55,683 ИНФОРМАЦИЯ :: Клиент Binance Futures успешно инициализирован {'method': 'SUBSCRIBE', 'params': ['btcusdt@bookTicker'], 'id': 1} {"method": "SUBSCRIBE", "params": ["btcusdt@bookTicker"], "id": 1} 2021-05-04 16:51:56,833 ИНФОРМАЦИЯ :: Соединение с Binance открыто 2021-05-04 16:51:56,834 ОШИБКА :: ошибка обратного вызова : объект «NoneType» не имеет атрибута «отправить»
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Использование веб-сокетов с потоком в Python (для торговли криптовалютой)
Anonymous » » в форуме Python - 0 Ответы
- 32 Просмотры
-
Последнее сообщение Anonymous
-