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


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 секунд перед следующей итерацией.

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

Комментарии (12)


  1. mrfloony
    02.06.2023 07:10
    +1

    никто в здравом уме не будет выкладывать код работающего (и зарабатывающего!) бота в open-source, такие проекты обычно лежат на собственных репозиториях за семью замками ключами


    1. Geraclz Автор
      02.06.2023 07:10
      +1

      Никто никогда не будет создавать open source операционную систему…linux

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


      1. Hidadmin
        02.06.2023 07:10

        А вы сами зарабатываете на работе данных скриптов, или отдаете их на откуп реальным юзерам, а сами лишь пишите код на основе собственных гипотиз?

        Просто подобных ботов наверное в интернете полно, а вот реально заработать них - обычно вижу, что народ торгует все-таки сидя за монитором, а не отдыхая на пляже в ожидании пока скрипт за него все сделает.


        1. Geraclz Автор
          02.06.2023 07:10

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


        1. 13werwolf13
          02.06.2023 07:10

          ИМХО народ торгует сидя за монитором по двум причинам:
          1) не доверяют ботам
          2) хотят сидеть за монитором

          и у обоих причин есть как объективные так и надуманные предпосылки
          не доверяете вы боту почему? потому что лично у вас не получилось на нём заработать? у друга? у васи с ЖЖ? так и сидя за монитором шанс оголожопиться ничем не выше. увы но поспорить на ту же сумму на бросок монетки шанс выше чем играть на бирже (особенно для новичков, особенно для дурачков, особенно для...подставьте сами)

          почему хотят? да потому что это игра, азарт, интрига.. в чём-то даже зависимость (да не у всех, но у многих, хотя и не все это понимают и осознают).

          лично я бы доверился боту (естественно не первому попавшемуся с гитхуба, но всё же). во первых у меня нет времени этим заниматься самому, во вторых нет желания, а в третьих почему бы и нет?


          1. Hidadmin
            02.06.2023 07:10

            Времени на это уходит конечно прилично, хотя сам я не торгую, но представление имею.

            А просто выкладывать код (причем кусками) без тестов, достижений и кейсов - не совсем понятно зачем и для чего.


            1. Geraclz Автор
              02.06.2023 07:10

              А представь какого интересно писать бота и учиться разбираться в бирже а самое интересное провести опыт торгов


              1. Hidadmin
                02.06.2023 07:10

                Ну так можно каждую строчку на хабр выкладывать для обсуждения )

                А хотелось бы видеть конечный продукт и его возможности, или хотя бы бету. Тогда было бы что обсуждать


                1. Geraclz Автор
                  02.06.2023 07:10

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


    1. john_galt
      02.06.2023 07:10

      Почему?


  1. Gridleak
    02.06.2023 07:10

    Еще есть freqtrade + freqai


    1. Geraclz Автор
      02.06.2023 07:10

      Да я их изучаю, много проблем не решают