Open source бот для торгов на Binance. Часть 2

от автора

В прошлой статье мы собрали простенький алгоритм помогающий работать с биржей по стратегии усреднения
Пока идут только наброски, до полноценного бота мы идем семимильными шагами, постараюсь поделится с вами общей логикой, которую можно использовать для создания одной из функций бота это обзор и сбор статистики с различных аналитических центров, выявление наиболее выгодных криптовалют что бы избежать провальных рисков.

1. Получение данных с биржи криптовалют

Для получения данных с биржи криптовалют, можно использовать официальный API binance. Для этого необходимо зарегистрировать аккаунт на бирже и создать ключ API.

Пример запроса к API binance для получения списка всех доступных криптовалют:

import requests  url = 'https://api.binance.com/api/v3/ticker/price'  response = requests.get(url) data = response.json()  cryptocurrencies = [item['symbol'] for item in data]

Анализ данных по криптовалютам

Для анализа данных по криптовалютам можно использовать различные показатели, такие как цена, объем торгов, изменение цены за определенный период времени и т.д. Ниже приведен пример получения данных о цене криптовалюты:

url = 'https://api.binance.com/api/v3/ticker/price'  params = {'symbol': 'BTCUSDT'}  response = requests.get(url, params=params) data = response.json()  price = float(data['price']) 

Создание списка наиболее выгодной и стабильной криптовалюты

Для создания списка наиболее выгодной и стабильной криптовалюты можно использовать различные алгоритмы и стратегии. Например, можно отфильтровать криптовалюты с наибольшим объемом торгов, наибольшим изменением цены за последнюю неделю и т.д.

Анализ упоминаний криптовалюты в интернете

Для анализа упоминаний криптовалюты в интернете можно использовать различные инструменты, такие как социальные сети, форумы и т.д. Существуют различные API и сервисы для мониторинга упоминаний в интернете, например, Google Trends, Brand24, Mention и т.д.

Пример использования Google Trends для получения данных о популярности криптовалюты:

from pytrends.request import TrendReq  pytrends = TrendReq()  kw_list = ['Bitcoin'] pytrends.build_payload(kw_list, timeframe='today 5-y') data = pytrends.interest_over_time()  popularity = data['Bitcoin'].iloc[-1] 

Для рисования графиков анализа криптовалюты можно использовать библиотеку Python Matplotlib. Ниже приведен пример скрипта, который рисует график изменения цены криптовалюты за последние 30 дней:

import requests import matplotlib.pyplot as plt import pandas as pd from datetime import datetime, timedelta  # Запрос цен криптовалюты на бирже Binance symbol = 'BTCUSDT' interval = '1d' limit = 30 url = 'https://api.binance.com/api/v3/klines' params = {'symbol': symbol, 'interval': interval, 'limit': limit} response = requests.get(url, params=params) data = response.json()  # Создание списка дат и цен dates = [] prices = [] for item in data:     date = datetime.fromtimestamp(item[0] / 1000)     price = float(item[4])     dates.append(date)     prices.append(price)  # Создание DataFrame из списка дат и цен df = pd.DataFrame({'date': dates, 'price': prices}) df.set_index('date', inplace=True)  # Создание графика plt.figure(figsize=(12, 6)) plt.plot(df.index, df.price) plt.title('Price chart for ' + symbol) plt.xlabel('Date') plt.ylabel('Price') plt.show() 

Этот скрипт получает данные о цене криптовалюты за последние 30 дней с помощью API биржи Binance, создает список дат и цен, создает из списка DataFrame и рисует график с помощью Matplotlib. Вы можете изменить параметры запроса и настройки графика в соответствии с вашими потребностями.

Система рисокв

Системы рисков, анализирует текущие ордера и рыночные данные, сопоставляет условия настроек торговой стратегии и биржевую активность, и докупает монеты при падении рыночной стоимости актива

import time import requests  # Настройки торговой стратегии symbol = 'BTCUSDT' buy_amount = 100   # количество докупаемых монет buy_threshold = 0.05  # порог падения цены, при котором происходит докупка (5%) sell_threshold = 0.1  # порог роста цены, при котором происходит продажа (10%)  # Данные для авторизации на бирже api_key = 'your_api_key' api_secret = 'your_api_secret'  # URL для запросов к API биржи base_url = 'https://api.binance.com/api/v3'  # Функция для получения баланса по торговой паре def get_balance(symbol):     url = base_url + '/account'     params = {'timestamp': int(time.time() * 1000)}     headers = {'X-MBX-APIKEY': api_key}     response = requests.get(url, params=params, headers=headers)     data = response.json()     for item in data['balances']:         if item['asset'] == symbol:             return float(item['free'])     return 0.0  # Функция для размещения ордера на покупку def place_buy_order(symbol, amount):     url = base_url + '/order'     params = {'symbol': symbol, 'side': 'BUY', 'type': 'MARKET', 'quantity': amount, 'timestamp': int(time.time() * 1000)}     headers = {'X-MBX-APIKEY': api_key}     response = requests.post(url, params=params, headers=headers)     data = response.json()     if 'orderId' in data:         print('Buy order placed. Order ID:', data['orderId'])     else:         print('Buy order failed:', data['msg'])  # Функция для размещения ордера на продажу def place_sell_order(symbol, amount):     url = base_url + '/order'     params = {'symbol': symbol, 'side': 'SELL', 'type': 'MARKET', 'quantity': amount, 'timestamp': int(time.time() * 1000)}     headers = {'X-MBX-APIKEY': api_key}     response = requests.post(url, params=params, headers=headers)     data = response.json()     if 'orderId' in data:         print('Sell order placed. Order ID:', data['orderId'])     else:         print('Sell order failed:', data['msg'])  # Основной цикл программы while True:     # Получение текущей цены актива     url = base_url + '/ticker/price'     params = {'symbol': symbol}     response = requests.get(url, params=params)     data = response.json()     price = float(data['price'])      # Получение текущего баланса по активу     balance = get_balance(symbol)      # Если цена упала на buy_threshold (5%), размещаем ордер на покупку     if price < (1 - buy_threshold) * balance / buy_amount:         place_buy_order(symbol, buy_amount)         time.sleep(60)  # ждем 1 минуту, чтобы не размещать слишком много ордеров      # Если цена выросла на sell_threshold (10%), размещаем ордер на продажу     elif price > (1 + sell_threshold) * balance / buy_amount:         place_sell_order(symbol, balance)         time.sleep(60)  # ждем 1 минуту, чтобы не размещать слишком много ордеров      # Ждем 10 секунд перед следующей итерацией     time.sleep(10) 

В этом скрипте мы используем API биржи Binance для получения текущей цены актива и баланса по торговой паре, размещения ордеров на покупку и продажу, а также устанавливаем пороги падения и роста цены для докупки и продажи. Скрипт работает в бесконечном цикле, постоянно анализируя цену актива и размещая ордера на покупку или продажу в соответствии с настройками торговой стратегии.

Используем глубину падения дельты для определения падения рынка и паузы покупок/усреднений

import time import requests  # Настройки торговой стратегии symbol = 'BTCUSDT' buy_amount = 100   # количество докупаемых монет delta_threshold = 0.05  # порог падения дельты, при котором происходит покупка (5%) pause_duration = 60  # продолжительность паузы в секундах  # Данные для авторизации на бирже api_key = 'your_api_key' api_secret = 'your_api_secret'  # URL для запросов к API биржи base_url = 'https://api.binance.com/api/v3'  # Функция для получения текущей цены актива def get_price(symbol):     url = base_url + '/ticker/price'     params = {'symbol': symbol}     response = requests.get(url, params=params)     data = response.json()     return float(data['price'])  # Функция для получения глубины рынка def get_depth(symbol):     url = base_url + '/depth'     params = {'symbol': symbol}     response = requests.get(url, params=params)     data = response.json()     bids = [(float(item[0]), float(item[1])) for item in data['bids']]     asks = [(float(item[0]), float(item[1])) for item in data['asks']]     return bids, asks  # Функция для размещения ордера на покупку def place_buy_order(symbol, amount):     url = base_url + '/order'     params = {'symbol': symbol, 'side': 'BUY', 'type': 'MARKET', 'quantity': amount, 'timestamp': int(time.time() * 1000)}     headers = {'X-MBX-APIKEY': api_key}     response = requests.post(url, params=params, headers=headers)     data = response.json()     if 'orderId' in data:         print('Buy order placed. Order ID:', data['orderId'])     else:         print('Buy order failed:', data['msg'])  # Основной цикл программы while True:     # Получение текущей цены актива и глубины рынка     price = get_price(symbol)     bids, asks = get_depth(symbol)      # Вычисление дельты     delta = bids[0][0] - price      # Если дельта упала на delta_threshold (5%), размещаем ордер на покупку     if delta < -delta_threshold * price:         place_buy_order(symbol, buy_amount)         time.sleep(pause_duration)      # Ждем 10 секунд перед следующей итерацией     time.sleep(10) 

Скрипт работает в бесконечном цикле, постоянно вычисляя дельту и размещая ордер на покупку, если дельта упала на заданный порог. После размещения ордера скрипт делает паузу на заданную продолжительность, чтобы избежать слишком частых покупок/усреднений.

Контроль сделок что бы не совершать новые сделки, если свободный баланс ниже, чем — определенное значение

import time import requests  # Настройки торговой стратегии symbol = 'BTCUSDT' quantity = 0.001  # количество монет в одной сделке min_balance = 100  # минимальный свободный баланс  # Данные для авторизации на бирже api_key = 'your_api_key' api_secret = 'your_api_secret'  # URL для запросов к API биржи base_url = 'https://api.binance.com/api/v3'  # Функция для получения свободного баланса def get_balance(symbol):     url = base_url + '/account'     params = {'timestamp': int(time.time() * 1000)}     headers = {'X-MBX-APIKEY': api_key}     response = requests.get(url, params=params, headers=headers)     data = response.json()     for item in data['balances']:         if item['asset'] == symbol:             return float(item['free'])     return 0.0  # Функция для размещения ордера на покупку def place_buy_order(symbol, quantity):     url = base_url + '/order'     params = {'symbol': symbol, 'side': 'BUY', 'type': 'MARKET', 'quantity': quantity, 'timestamp': int(time.time() * 1000)}     headers = {'X-MBX-APIKEY': api_key}     response = requests.post(url, params=params, headers=headers)     data = response.json()     if 'orderId' in data:         print('Buy order placed. Order ID:', data['orderId'])     else:         print('Buy order failed:', data['msg'])  # Основной цикл программы while True:     # Получение свободного баланса     balance = get_balance(symbol)      # Если свободный баланс ниже минимальной суммы, ждем 10 секунд перед следующей итерацией     if balance < min_balance:         print('Balance is too low:', balance)         time.sleep(10)         continue      # Размещение ордера на покупку     place_buy_order(symbol, quantity)      # Ждем 10 секунд перед следующей итерацией     time.sleep(10) 

Если свободный баланс ниже минимальной суммы, скрипт просто ждет 10 секунд перед следующей итерацией.

Это еще одна часть, я еще очень далеко до полноценной сборки, но скоро будет полноценная сборка на гитхабе


ссылка на оригинал статьи https://habr.com/ru/articles/739378/