Разработка криптотрейдингового бота с помощью Python

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті.

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

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

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

Часть 1. Общие сведения про биржу и торговлю криптовалютами

Eсли вам интересен только код — смело листайте сразу до части.

Всё началось несколько месяцев назад, в январе 2021, когда практически из каждого утюга доносилось «Биткоин стремительно растёт! Те, кто вовремя вложились — стали миллионерами!». Также масла в огонь подливали новости о том, что геймерам не хватает видеокарт, потому что майнеры всё раскупили, даже несмотря на рост цен в 2-5 раз.

В итоге, после настолько навязчивой информационной атаки, я просто не мог оставаться в стороне и начал разбираться в вопросе.

Не вдаваясь в детали выбора криптобиржи скажу лишь, что он был скорее интуитивным, чем рационально обоснованным и в итоге пал на binance.com (не реклама).

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

На последнем моменте стоит отдельно акцентировать внимание — на Бинанс у вас будут весьма ограниченные возможности, если вы не подтвердите свою личность. Процедура несложная, занимает буквально 15 минут и требует от вас всего лишь:

  • документа, подтверждающего личность (например, паспорт, водительское удостоверение, etc);
  • веб-камеры (или фронтальной камеры на смартфоне с установленным приложением от Бинанс);
  • ввода некоторых данных о вас.

Крайне рекомендую сделать это, так как иначе на ваш аккаунт будет наложено, среди прочих, одно очень существенное ограничение — вы не сможете выводить деньги с биржи. То есть, завести деньги на биржу сможете без проблем, а потом, успешно поторговав — не сможете вернуть деньги обратно на свою банковскую карту.

После успешной регистрации и верификации аккаунта у вас будет несколько способов завести деньги на биржу. Рассмотрев альтернативы, был выбран такой способ — с помощью банковской карты покупаются токены USDT, которые относятся к так называемым стейблкоинам (от англ. stable coin — стабильная монета). Стабильной она называется потому, что ее цена колеблется в очень незначительных пределах (от 0.98$ до 1.02$ за 1 USDT) и большую часть времени составляет ровно 1 доллар США. Таким образом, купив за реальные деньги — виртуальные USDT, вы пока еще ничем не рискуете, так как цена практически гарантированно не изменится. Единственное, что вы теряете в данный момент — это 2% комиссии биржи за ввод средств или 20$ с каждой тысячи.

Также стоит учесть, что от всех торговых внутрибиржевых сделок Бинанс берет небольшую комиссию — 0.1% или 1$ с каждой 1000. Эта комиссия настолько незначительна, что её можно игнорировать.

И, наконец, последняя важная комиссия — 2.5% от суммы средств, которые вы выводите с биржи на свою банковскую карту. Процент хоть и небольшой, но ощутимый (25$ с каждой 1000), поэтому имеет смысл торговать на бирже так долго, как это возможно, и выводить лишь в самом крайнем случае.

Просуммировав все вышеописанное, можно сделать вывод № 1: ваши инвестиции должны вырасти в цене как минимум на 4.6%, чтобы вы вышли в ноль. Если взять условную 1000$ на вашей банковской карте, то после всех ваших манипуляций на бирже (ввод, торговля), ваша прибыль должна составить как минимум 46$, чтобы к вам на карточку вернулась та же самая тысяча.

Для людей, привыкших к обычным банковским вкладам, 4.6% могут показаться весьма существенным и сложнодостижимым результатом. Но в мире криптовалют всё намного более волатильно, поэтому часто сделки осуществляются со значительно большей прибылью и буквально каждый день. Для примера, можете взглянуть на этот «зеленый» период рынка:

«Зеленым» он называется потому, что когда цена криптовалют растет — их графики рисуют зеленым цветом, а когда падает — красным. Если наступил период массового роста, иногда говорят, что «рынок позеленел», а если наступил период спада — «покраснел», например, как здесь:

Иногда бывают и совсем необычные ситуации — весь рынок «красный», а какой-нибудь Dogecoin растет на +122% за сутки)

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

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

На графике это можно изобразить следующим образом:

Где каждый левый кружок в паре — момент покупки («подешевле»), а каждый правый кружок — момент продажи («подороже»). Соответственно, разница между этими двумя сделками — и будет вашей прибылью (за исключением символического процента биржи в 0.1%)

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

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

Я выбрал следующую стратегию поведения (которая чуть ниже будет показана в коде): сперва отслеживаю резкие падения цены, покупаю такую криптовалюту на 100$ и сразу же, в эту же минуту ставлю ордер на автопродажу на сумму 110$. Такой подход позволяет совершать сделки достаточно часто, при этом суммарно их выходит много в течении месяца и итоговая прибыль получается существенной (в процентном отношении к стартовым инвестициям).

Пара моментов, на которые стоит обратить внимание.

Во-первых, Бинанс позволяет ставить так называемые стоп-лимит уровни. Их можно использовать для выполнения автоматических сделок, например — для покупки криптомонет, когда их цена опускается ниже определенного уровня или для продажи, когда их цена растет выше определенного уровня.

Во-вторых, хорошей стратегией является диверсификация или распределение ваших инвестиций на несколько криптовалют. На момент начала торгов на биржу было заведено 600$, которые я распределил равномерно на 6 частей, закупившись 6 разными криптовалютами. Когда после многочисленных сделок общая стоимость инвестиций выросла до 700$ — я стал покупать уже 7 разных криптовалют, когда выросла до 800$ — 8, и так далее. На момент написания статьи, стартовые 600$ превратились в 812$ примерно за месяц торгов с использованием описанной стратегии.

И наконец, если с моментом для продажи все просто (ставим ордер на автопродажу за 110$ и ждем — иногда пару часов, иногда несколько дней), то как именно можно определить, что такое «резкое падение цены»?

Вероятно, у каждого свое представление о том, какие падение считать достаточно резким, но я для себя (математически) определил его как «5% падение цены в течении последнего часа». Именно это определение было заложено в логику бота.

Для примера приведу еще несколько графиков, где вы сами без труда сможете определить удачный момент для покупки, а также убедиться, что после стремительного падения цены — всегда следует рост, с которого можно получить прибыль:

Часть 2. Пишем бота

После прочтения первой части у вас мог возникнуть вопрос: «Если Бинанс такая замечательная биржа, что позволяет автоматически и покупать, и продавать — зачем вообще нужен бот?». Это уместное замечание и ответ на него такой — бот крайне полезен для сбора статистики, анализа и рекомендаций по удачным моментам для покупки и продажи.

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

Всё это смотивировало написать код, который ежеминутно проверял курсы валют для выбранных токенов, собирал статистику колебаний цен за последний час и как только для какой-то валюты обнаруживал резкую просадку цены — тут же писал в Телеграм сообщение следующего вида:

Как видно из этого скриншота, бот не только писал, какой токен следует купить, но и на сколько % упала цена за последний час. Для тех же криптовалют, для которых падение цены было меньше 5% — фраза была «nothing to do right now...»

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

Давайте же наконец перейдем к коду и посмотрим, как все устроено внутри.

Проект состоит всего из 3 файлов:

  • cryptobot.py (собственно, сам бот)
  • calculations.py (вспомогательные функции для анализа и расчетов)
  • my_cryptocoins.json (файл с данными о криптовалютах и их актуальных ценах)

Содержимое my_cryptocoins.json выглядит следующим образом:

{
 "ALICE": {
   "amount": 3.5,
   "buy_price": 30,
   "desired_price_fall": 5,
   "desired_sell_price": 33,
   "last_prices": [
     12.71004841,
     12.71728863,
     12.71983559,
	...
     12.73806222,
     12.74204871
   ]
 },
 "ARDR": {
   "amount": 314.895,
   "buy_price": 0.351,
   "desired_price_fall": 5,
   "desired_sell_price": 0.3861,
   "last_prices": [
     0.69192631,
     0.69205345,
     0.68947941,
	...
     0.68280223,
     0.67819879
   ]
 },
 "BCH": {
   "amount": 0.22,
   "buy_price": 650,
   "desired_price_fall": 5,
   "desired_sell_price": 715,
   "last_prices": [
     628.07961283,
     628.60812333,
     629.01582194,
	...
     629.29318231,
     629.12820048,
     660.64513681
   ]
 },

(и так далее, полный файл содержит в себе десятки токенов и данных об их ценах)

Где, «amount» — количество монет данной валюты, купленных ранее.
«buy_price» — цена, по которой они были куплены
«desired_price_fall» — процент, на который мы ожидаем, что цена упадет, чтобы покупка имела смысл

«desired_sell_price» — цена, по которой планируется продать купленные монеты (и на которую стоит ордер на автопродажу)

«last_prices» — список из последних 60 цен, обновляемый каждую минуту
И наконец «ALICE», «ARDR» и «BCH» — короткие названия токенов, которые будут использованы для обращения к API Бинанс.

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

Конечно, использовать json файл — не лучшее решение в данной ситуации, но оно было выбрано, чтобы как можно быстрее проверить торговые гипотезы. В планах — поднять рядом с ботом полноценное веб-приложение с API и БД, куда будут записываться все интересующие данные, которые позволят проводить более глубокий анализ.

Файл calculations.py содержит в себе следующие функции и данные:

API_URL = 'https://api3.binance.com/api/v3/avgPrice'</td>

API ендпоинт, при обращении на который мы узнаем цену интересующей нас криптовалюты.

Также могут использоваться альтернативы:

api.binance.com

api1.binance.com

api2.binance.com

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

Функция, которая обращается к бирже и узнает цену интересующей нас криптовалюты:

def get_price(coin: str) -> float:
   """
   :param coin: token name, e.g. BTC for Bitcoin, LTC for Litecoin
   :return: coin's current price in stable USDT. 1USDT ~ 1$ USA
   """
   data = {'symbol': f'{coin}USDT'}  # e.g. BTCUSDT
   response = requests.get(API_URL, data)
   return float(response.json()['price'])

Как видите, ничего сложного здесь нет — обычный GET запрос с передачей дополнительных данных о том, какая торговая пара нас интересует. Чтобы функция корректно работала, не забудьте в начале файла импортировать библиотеку requests — import requests.

Следующая функция отвечает за расчет вашей потенциальной прибыли. Здесь тоже нет никакой высшей математики, все рассчитывается по простой формуле: (текущая цена минус цена покупки) умножить на количество ваших монет для данной криптовалюты. Чтобы в сообщениях бота не мешать самому себе избыточной информацией, было добавлено округление до 2 знаков после запятой. Вряд ли кому-то интересны доли центов.

def count_profit(coin: dict, current_price: float) -> float:
   """
   :param coin: e.g.:
        {"amount": 1.4466,
         "buy_price": 200,
         "desired_sell_price": 219,
         "last_prices":  [201.4, 205, 203, 211, 222.2],
         "desired_price_fall":  10}
   :param current_price: coin's current price in stable USDT. 1USDT ~ 1$ USA
   :return: profit in USDT
   """
   # Example: (220 - 200) * 0.5 == 10
   return round((current_price - coin['buy_price']) * coin['amount'], 2)

Следующая функция содержит в себе логику, которая была описана ранее, а именно — определение того, насколько упала цена за последний час. Алгоритм работает так: из json файла достаются все цены для конкретной валюты, среди них определяется максимальная цена и сравнивается с текущей ценой (которую, напоминаю, мы узнали обращением к API Бинанса)

def count_price_fall(coin: dict, current_price: float) -> float:
   """
   :param coin: same as in count_profit()
   :param current_price: same as in count_profit()
   :return: max diff between last 5 prices and current price, in USDT
   """
   # Example: max([201.4, 205, 203, 211, 222.2]) - 190 == 32.2
   try:
       return max(coin['last_prices']) - current_price
   except:
       # may happens if coin['last_prices'] is empty
       return 0

И, наконец, финальная функция, которая и дает совет «Time to buy», если за последний час снижение цены оказалось равным или больше тому, что было указано в json файле в поле «desired_price_fall»:

def should_i_buy(price_fall: float, desired_fall: float, current_price: float) -> bool:
   """
   :param price_fall: output of count_price_fall()
   :param desired_fall: desired price fall in PERCENTS! not in USDT. e.g. 10%
   :param current_price: coin's current price in stable USDT
   :return: True if you should buy, False otherwise
   """
   # Example: 21 / 200 * 100 == 10.5% and 10.5 >= 10, so -> True
   if price_fall / current_price * 100 >= desired_fall:
       return True
   return False

Как видите, на данном этапе реализации бота, внутренних расчетов и анализа у него не так уж много. Но идей по улучшению и добавлению нового функционала — предостаточно.

Последний файл — cryptobot.py содержит в себе код телеграм бота, который как раз и шлет сообщения о том, что пора покупать, продавать, или пока можно расслабиться и ничего не делать.

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

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

После этого вы сможете вставить свой токен в код бота и он будет выглядеть так:

(импорт всех необходимых функций, модулей и библиотек)

import time
import json
from telegram.ext import Updater, CommandHandler
from calculations import get_price, count_profit, count_price_fall, should_i_buy

(ваш токен)

TOKEN = '1111111111:sdfklsdjgkljfdglkDSFDGFDGFDkdjskfljdkf'

(главная и единственная функция вашего бота, она же будет командой, которую вы будете отправлять ему в чате Телеграма, чтобы запустить эту адскую машину:)

def make_money(update, context):
# (получаете id чата, где бот будет общаться с вами)
   chat_id = update.effective_chat.id

# (бесконечный цикл)
   while True:
# (открываете файл my_cryptocoins.json и читаете из него данные)
       with open('my_cryptocoins.json', 'r') as my_coins_data:
           my_coins = json.loads(my_coins_data.read())

# (эта переменная будет содержать в себе тот сообщение, которое бот вам отправит в Телеграме)
       final_message = []

# (цикл, проходящий по всем токенам, перечисленным в my_cryptocoins.json)
       for coin_name in my_coins.keys():
           coin = my_coins[coin_name]
           coin_price = get_price(coin_name)

           possible_profit = count_profit(coin, coin_price)
           price_fall = count_price_fall(coin, coin_price)
           last_prices = coin['last_prices']

# (часть кода, отвечающая за работу с ценами, обновляемыми каждую минуту)
           if len(last_prices) <= 60:
               last_prices.append(coin_price)
               if len(last_prices) <= 59:
                   price_fall = 0
                   # not enough data to provide correct calculations
           else:
               last_prices = last_prices[1:] + [coin_price]

           my_coins[coin_name]['last_prices'] = last_prices
           message = ''
# (логика, которая формирует сообщение о том, что пора покупать/продавать/ничего не делать)
           if coin_price >= coin['desired_sell_price'] and coin['amount'] > 0:
               message += f'{coin_name} --> TIME TO SELL\n'
               message += f'possible profit = {possible_profit}$'
           else:
               if should_i_buy(price_fall, coin['desired_price_fall'], coin_price):
                   message += f'{coin_name} --> TIME TO BUY\n'
                   message += f'price fall = {round(price_fall / coin_price * 100, 1)}%'
               else:
                   message += f'{coin_name} --> nothing to do right now...'

# (обратите внимание на time.sleep(2) - если обращаться к API биржи слишком часто - она вас "забанит" на какое-то время. Так что лучше не спамить запросами)
           final_message.append(message)
           time.sleep(2)

# (после всех операций - записываем обновленные данные в my_cryptocoins.json)
       with open('my_cryptocoins.json', 'w') as my_coins_data:
           my_coins_data.write(json.dumps(my_coins, sort_keys=True, indent=2))

# (и наконец, команда, которая отправляет финальное сообщение в чат Телеграма)
       context.bot.send_message(chat_id=chat_id, text='\n'.join(final_message))

# (бот засыпает на 1 минуту до следующей итерации бесконечного цикла)
       time.sleep(60)  # run every minute

# (здесь от вас уже практически ничего не зависит, эта часть кода нужна, чтобы корректно запускать нужную нам функцию при отправке боту соответствующей команды)
def main():
   updater = Updater(token=TOKEN, use_context=True)
   dp = updater.dispatcher
   dp.add_handler(CommandHandler('make_money', make_money))
   updater.start_polling()
   updater.idle()


if __name__ == '__main__':
   main()

После того, как все 3 файла будут готовы, вам нужно будет установить необходимые для работы бота библиотеки командами:
pip install requests
pip install python-telegram-bot

Затем запустить бота командой python cryptobot.py и наконец написать вашему боту в телеграме команду /make_money

С этого момента бот будет каждую минуту слать вам сообщения с рекомендациями.

Часть 3. Выводы и планы на будущее

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

Но важно понимать, что криптовалюты — это высокорисковые, хоть и высокоприбыльные инвестиции. Так что рано или поздно стремительный рост рынка закончится и главное — успеть вовремя выйти во что-то более надежное, например в доллар США. Опытные криптоаналитики считают, что следующего серьезного спада следует ждать в конце 2022 года, так что у нас есть около 1.5 лет для заработка.

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

Также в планах поэкспериментировать над максимизацией прибыли, возможно проведя синтетические эксперименты на исторических данных. А именно — проверить, какой будет результат, если покупать, когда цена падает не на 5% в течении часа, а на 2-3 или наоборот 10+. Аналогично и с продажей — посмотреть, что будет, если ставить на автопродажу не с прибылью 10%, а с меньшей или большей.

И, как я уже писал ранее — также в планах есть разработка веб приложения с API и БД, где будут сохраняться все собираемые ботом данные для более глубокого анализа.

На этом всё, если у вас есть замечания/предложения по коду или интересные истории, связанные с торговлей криптовалютами — оставляйте комментарии.

P.S. Полную версию бота можно скачать здесь. Главное, не забудьте в нужное место вставить токен вашего телеграм бота.

👍ПодобаєтьсяСподобалось22
До обраногоВ обраному15
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

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

Описание стратегии:
Бот работает по стратегии усреднения. Суть стратегии заключается в снижении средней цены входа в актив путём увеличения веса позиции в случае, если рыночная стоимость актива снижается по отношению к текущей стоимости ордера. Иными словами, при входе в сделку бот, исходя из пользовательских торговых настроек, размещает ордер на продажу с заданным процентом профита, но если стоимость актива падает по отношению к первой покупке, не достигнув ордера на продажу, и опускается ниже заданного значения в %, бот отменяет ордер на продажу, докупает определённое количество монет, которое всегда больше количества монет в предыдущем отменённом ордере, и размещает новую заявку на продажу по цене (новая средняя цена покупки + % желаемой прибыли). Таким образом, при падении рыночной стоимости актива бот постоянно анализирует текущие ордера и рыночные данные, сопоставляя условия настроек торговой стратегии и биржевую активность, и докупает монеты, увеличивая их общий объём и снижая новую цену продажи.

Управлять A-Bot’ом также можно из Telegram-бота, которого вы создали у BotFather’а и добавили в свой канал для уведомлений.

Торговые параметры:
timeout_socket [0.25-2] — Минимальный тайм-аут между сообщениями стрима, необходимый для медленных машин
name_list [str] — Название текущего пресета настроек (в случае команды -sve сохранится в список настроек с этим именем) (например main)
min_bnb [min >= 0.01] — Минимальный свободный баланс BNB, ниже которого бот будет докупать минимально допустимое количество BNB по рыночной цене для оплаты биржевой комиссии (например 0.03)
min_balance [min >= 0] — Не покупать/усреднять позиции, если свободный баланс составляет меньше заданного % от общего баланса
min_order [min >= 1] — Множитель размера первого ордера на покупку. Стоимость первого ордера будет рассчитываться, как минимальный допустимый размер ордера на бирже * min_order (например 1.2). На USD это 10$, на BTC это 0.0001. Лимиты можно найти здесь
min_price [min >= 0.00000001 USD] — Минимальная рыночная стоимость монеты, эквивалент в USD которой равен рыночному курсу монеты в USD, ниже которого бот не будет открывать новые сделки по этой паре, лишь усреднять, если стоит ордер на продажу (например 0.05)
min_daily_percent [-100 < min < daily_percent < 99999] — Выше какого значения должнен подняться показатель % суточного изменения цены на бирже, чтобы бот осуществил первую покупку по паре (например −20)
daily_percent [-100 < min < 99999] — Ниже какого значения должнен упасть показатель % суточного изменения цены на бирже, чтобы бот осуществил первую покупку по паре (например −3)
auto_daily_percent [y/n] — Вместо daily_percent использовать общую суточную дельту разрешённого списка монет для ограничения максимального процента коридора покупок. Если Y, то бот не будет покупать монеты, выросшие более, чем на Д % из информационной строки в консоли
order_timer [min >= 0] — Интервал паузы между закрытием сделки и новой покупкой по этой же паре в секундах
min_value [min >= 0] — Эквивалент минимального суточного торгового объёма в USD у торговой пары для открытия позиции по ней
sell_up [min > 0] — Желаемый % прибыли от продажи без учёта суточной дельты и трейлинг-стопа (например 1.65)
sell_cut [y/n] — Уменьшать желаемую прибыль на монете по мере роста количества её усреднений. Если Y, то sell_up, применяемый для текущей монеты, будет уменьшаться с каждым новым усреднением
buy_down [min < 0] — На сколько % должна упасть рыночная цена актива по отношению к цене его последней покупки, чтобы бот усреднил позицию (например −5)
max_trade_pairs — Допустимое количество позиций на продажу, которое бот может держать одновременно открытыми (например 20). Если количество открытых ботом ордеров станет равно или больше max_trade_pairs, бот перестанет совершать новые покупки (кроме усреднений)
-1 [-1] — Не ограничивать количество одновременно торгуемых ботом пар
0 [0] — Работать только с уже открытыми ордерами и не совершать новые покупки
1 и более [1-999] — Указать максимальное количество позиций вручную
auto_trade_pairs [y/n] — Разрешить боту автоматически регулировать количество разрешённых пар? Если Y, бот будет автоматически корректировать максимальное количество одновременно торгуемых пар, если предыдущий параметр настроек задан пользователем вручную от 1 до 999
progressive_max_pairs [y/n] — Использовать прогрессивное уменьшение максимального количества пар. Если Y, то количество пар при включенной настройке auto_trade_pairs будет автоматически уменьшаться не только в зависимости от соотношения свободного и общего баланса, но и от количества открытых ордеров и суммарного количества их усреднений
delta_percent [y/n] — Использовать общую рыночную дельту суточной цены? Если Y, суммировать торговые параметры с общей суточной дельтой (направлением рынка) по отобранным парам из белого списка. Данный параметр сделает стратегию более гибкой, позволив удваивать прибыль максимум в 2 раза, но также может уменьшить прибыль вдвое на падающем рынке
delta_deep [y/n] — Использовать глубину падения дельты для определения падения рынка и паузы покупок/усреднений? Если Y, то бот будет блокировать новые покупки и усреднения на падающем рынке до тех пор, пока не произойдёт локальный отскок всего рынка. Определение локального отскока зависит от величины падения самой дельты и выражено в пропорции 1 к 10 (при дельте −5 бот начнёт открывать позиции, когда дельта вырастет до −4.5 и выше)
num_aver [y/n] — Использовать сетку усреднений? Если Y, то при усреднении бот будет увеличивать процент падения цены, необходимый для нового усреднения актива, на buy_down + количество усреднений * step_aver
step_aver [%] — Шаг увеличения сетки. На сколько процентов увеличивать последующую разницу рыночной цены и цены последней покупки для усреднения (например 1.35)
max_aver [min >= 0] — Максимальное количество усреднений на одной монете (например 4)
quantity_aver [min > 0] — Множитель размера усреднения от текущего веса позиции (например 2). Иными словами, при усреднении бот будет покупать текущее количество монет * quantity_aver, тем самым новая позиция будет равна текущее количество монет * quantity_aver + текущее количество монет
progressive_average [y/n] — Использовать прогрессивное усреднение? Если Y, бот будет самостоятельно находить объём для усреднения и делать его таким, чтобы после усреднения средняя цена входа в позицию оказалась не выше %-та average_percent от текущей рыночной цены (то есть цены нового усреднения). Иными словами, после прогрессивного усреднения ордер на продажу будет выше от текущей рыночной цены на average_percent + sell_up % (без учёта остальных динамических настроек по типу delta_percent, влияющих на sell_up)
average_percent [100 > min >= sell_up] — Максимальный желаемый % разницы между рыночной ценой и средней ценой входа в позицию после усреднения (например 7)
trailing_stop [y/n] — Использовать трейлинг-стоп? Если Y, отодвигать цену продажи в зависимости от движения цены актива. С включенным трейлингом позиция не закрывается сразу, а продаётся частями trailing_part на приближенных к максимальным значениям ценам, чтобы увеличить потенциальную прибыль, либо закрывается полностью при падении цены и её приближении к средней цене покупки. Данный параметр сделает стратегию более гибкой, но может уменьшить прибыль
trailing_percent [min > 0] — При каком падении от локального хай-уровня цены активировать трейлинг-стоп для частичной/полной продажи (например 0.25)
trailing_part [0 < min <= 100] — Размер частичной продажи по трейлингу в % от общего веса позиции (например 10)
trailing_price [min >= 0.00000001 USD] — Активировать трейлинг-стоп только на активах стоимостью в эквиваленте к USD выше заданного процента. Это позволяет избегать минусовых сделок из-за слишком большого процента спреда монет с низкой стоимостью (например 0.2)
new_listing [y/n] — Открывать позиции по только что добавленным на биржу активам? Если Y, бот будет покупать монеты сразу после их листинга и игнорировать торговые параметры по типу min_value, min_price, daily_percent и прочих, кроме min_balance и double_asset
max_buy_listing [999 >= min>= 0] — Сколько раз бот может вновь открывать позиции по только что добавленному на биржу активу, игнорируя торговые параметры? После преодоления этого значения бот не откроет позицию по данному активу, пока условия на торговой паре не будут соответствовать торговым настройкам (например 5)
user_order [y/n] — Работа с пользовательскими ордерами после ручной покупки. Если Y, то в случае покупки пользователем монеты из разрешённого списка бот автоматически поставит на продажу купленное количество монет и будет работать с этой парой так же, как и в остальных случаях, ориентируясь на торговые настройки. Также уже открытые ордера можно будет усреднять вручную: для этого во время работы бота купить нужное количество монет, после чего бот отменит ордер на продажу, рассчитает новые данные и выставит ордер по новой цене
fiat_currencies [RUB UAH ...] — Если включены уведомления в Telegram, то ежедневная статистика торгов будет рассчитываться в этих валютах вместе с quote_asset
quote_asset [USDT BTC ...] — Котируемые валюты для торговли (то есть те валюты, в паре к КОТОРЫМ торгуются монеты из разрешённого списка (ADA/USDT, ADA/BTC), а не которые торгуются к ним). Приоритет котируемых активов для первоочередной покупки соответствует их расположению (слева направо)
double_asset [y/n] — Если Y, бот сможет покупать одну и ту же монету на нескольких котируемых активах одновременно (ADA/USDT и ADA/BTC)
pump_detector [y/n] — Использовать детектор пампов для открытия позиций? Если Y, бот будет анализировать все монеты из разрешённого списка монет в реальном времени и, в случае обнаружения всплеска объёмов, доминации покупателей и роста цены актива, незамедлительно покупать монету (работает только на боте, запущенном с -pd ключом)
pump_order [min >= 1] — Множитель размера покупки по сигналу детектора пампов (например 2.5)
pump_up [min > 0] — Желаемый % прибыли от продажи позиции, открытой или усреднённой по сигналу детектора пампов, без учёта суточной дельты и трейлинг-стопа (например 0.35)
max_pump_pairs [min >= 0] — Допустимое количество позиций на продажу, открытых по сигналу детектора пампов, которое бот может держать одновременно открытыми (например 10)
trailing_pump [y/n] — Использовать трейлинг-стоп на ордерах, открытых по сигналу детектора пампов? Если Y, то бот будет активировать трейлинг на таких ордерах по параметрам trailing_stop’a

Реальная стата работы бота t.me/stat_a_bott

Еще такой вопрос возник. Если есть такая непоколебимая уверенность в росте на протяжении 1.5 лет, какой смысл в этих покупках-продажах? Чтобы побольше комисси брокеру заплатить? Почему бы не купить и держать до победного?

Логика такая:
допустим, на протяжении 4 месяцев цены на некий ShitCoin были на таких уровнях:
1 месяц — 5$
2 месяц — 20$
3 месяц — 10$
4 месяц — 50$
(я понимаю что цены колеблются постоянно, это просто пример конкретных цен для сделок)

Тогда, инвестируя в первый месяц условную 1000$, в четвертый месяц это превращается в 10к, если просто закупиться и ждать.

Если же покупать-продавать, то получится следующая последовательность действий:
В первый месяц покупаем 200 коинов (на ту же самую 1000, по курсу 5)
Во второй месяц продаем 200 коинов по курсу 20, получаем 4000
В третий месяц покупаем 400 коинов по курсу 10, так как теперь наш капитал уже 4000, а не 1000
В четвертый месяц продаем 400 коинов по курсу 50, получаем 20к, мы великолепны)

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

В реальном мире мне иногда приходилось и по 5-6 месяцев ждать, чтобы цена таки стала больше той, по которой я закупался и сделка принесла прибыль)
Но я готов ждать, так что все сделки провожу исключительно в плюс.
В комменте ниже ответил, что сейчас как раз такой период — ожидание.

В минусе на 25% от общей суммы инвестиций)
Если продам прямо сейчас, по текущему курсу.
Но надежды оптимистичные, что рост всё перекроет)

На ютюбе много видео вроде: покупайте эти криптомонеты, они дают иксы.
Что если их все собрать и слоями уложить друг на дружку.
Самые частые упоминания дадут наиболее вероятные победы?

youtu.be/pukkUJ9hFpM И так не плохой в итоге бутерброд получатся, я бы сказал даже отличный

Привет! Клёвая статья, хоть я и скипнул часть про биржу (считаю, что криптовалюта — это клевая идея, как полноценная валюта и средство оплаты, а не как предмет для торговли на бирже, но эт имхо). Если будешь как-то еще дорабатывать, допиливать своего телеграм бота, рекомендую обратить внимание на либу aiogram. Является, по сути, асинхронным фреймворком для создания ботов и имеет в себе большой инструментарий взаимодействия с Telegram API из коробки

Спасибо, очень крутая статья, все содержательно и понятно!
Но по одной статье так и не разберешь и не поймешь все, я вот проходила курсы по этой тематике и могу сказать, что когда тебе рассказывают профи все набат прозрачнее, а вот такие статьи это закрепление инфы

Очень забавное чтение, спасибо

Хорошая статья... Автоматизация это хорошо.
Но... именно сейчас, когда Илон Маск так правильно «потрогал» доджики — нужно было ручками с лопатой деньги копать! :)

Оказывается он еще в 2019 трогал, связывался с разрабами, предлагал помощь. Ходит по лезвию бритвы ибо с 2019 это десятки тысяч процентов и кто-то хорошо заработал зная планы Маска.

Готов приложить усилия чтобы помочь в разработке бота, буду ждать обратной связи ) @alex_yusypenko

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

Здравствуйте Александр! а можно у вас заказать бота? прошу ответить на е-мейл [email protected]

Хороший способ попасть на деньги)
Скажите а как вообще вы бота тестили, не вижу у вас портфельной проверки, и отыгрыша на разных типах рынка.

Хороший вопрос)
Тестирования, как такового, не было.
Я вложил в бота те принципы, которыми до этого руководствовался при мануальной торговле, только более грубо следил за падениями курсов, «на глазок».
То есть, бот не первичен. Бот — это просто автоматизация того, что я до этого делал руками.

Риски, конечно, есть. Описанная стратегия будет работать, пока рынок в целом растет. Как предсказать глобальный спад — я не знаю. Некоторые аналитики предсказывают его на конец 2022 года и пишут, что в то время курсы криптовалют обвалятся раз в 10 (ссылку на статью не найду сейчас).

Так что текущая стратегия — торговать по описанному принципу в ближайшие 1.5 года и затем ждать колоссального спада.

Как предсказать спад? USDT внезапно станет расти в цене)

Спасибо за ссылку)
Статьи других людей не читал, решил сперва самостоятельно разобраться в основах, а затем искать дополнительную информацию, когда возникнут серьезные вопросы/проблемы/недостаток информации.
Менталитет жителя СНГ — сперва «ломаем», потом читаем инструкцию, так ведь намного интереснее))

портфельной проверки
отыгрыша на разных типах рынка

Як це звучить на мові оригіналу (англ), щоб це можна було в інтернетах знайти?

Я тоже когда-то начинал с такого... У него масса недостатков которые я долго и мучительно подправлял и интегрировал.
Например такая реальная ситуация, в анонсах появилось предупреждение о делистинге двух-трех валют. В результате — стоимость их домкратом полетела вниз и наш скрипт радосно их скупил. В итоге через пару дней мы имеем на аккаунте фантики а не прибыль. Защититься о такого можно либо ограничением торговых пар(что сильно снижает гибкость) либо интеграцией с системой анонсов.
И это только один из кейсов. Удачи.

Спасибо, очень дельный совет)

треба дивитися на швидкість і глибину падіння, тоді можна автоматично уникати таких непрємних ситуацій.

Глибина і час то доволі слабкий сигнал на те шо відбувається за межами біржи. Виведення слабкої валюти з біржи і реакція доволі здорового біткоїна на висловлювання Маска та\або припинення торгів за біткоїн Теслою буде таким самим. Але в першому випадку нам просто треба перестати купувати сміття, в другому обережно аналізувати. Як це описати алгорітмами?

ну, як кажуть в Одесі — знал бы прикуп — жил бы в Сочи. Спробуйте якийсь АІ підцепити.

Я юзаю телеграм бот coinalert.me
Подскажите плиз есть ли что-то аналогичное для акций?

І як він ? Вдалося щось заробити з ним ?

Весьма не плох. Тоже его юзаю для стратегии ловли падающих ножей.

для каких акций? US stocks?

Да, акций и индексов США

С точки зрения кодинга интересная статья. С точки зрения эффективности есть уже готовые варианты. Рекомендую посмотреть freqtrade, есть готовый набор базовых стратегий и активное коммьюнити.

молодец, трейдинг освоил. Теперь открывай для себя DeFi

Ожидал такую концовку:
Мой бот натрейдил 10$k и я их задонатил в Гильдию.

Такая статья выйдет в 2022-м))

Спасибо, буду импрувить)
То, что приведено в статье, я бы назвал пре-альфа прототипом, написанным за пару вечеров.

Когда это начнет становиться на серьезные рельсы и суммы там будут крутиться другие, а не несколько сотен $$ — тогда, конечно, и подход к проекту будет намного более ответственным.

Толковая статья спасибо!))
Захотелось самому что-то такое собрать)

Дякую за статтю, цікаво =)

Чи дивилися на готові бібліотеки — python-binance.readthedocs.io/en/latest ? Ця ліба дає майже все необхідне для Вас.
Чи мета — написати бота самостійно з 0?

Дякую за лінк, не знав про вже готові бібліотеки (та, якщо чесно, і не шукав), тому що ви праві — хочеться самому з нуля розібратися у всьому)

А если цена упала на 5%, вы купили, а потом цена упала еще на 45%? А потом еще на 25, например? До какого минуса на счете будете сидеть, −100%?

Отличный вопрос.

Был у меня коллега, который купил часть биткоина несколько лет назад, когда тот стоил по 17к.
Потом монета упала до 3-5к, он очень сильно расстроился и продал, чтобы не потерять всё и спасти хотя бы часть инвестиций, пока не наступили те самые «минус 100%».
А потом биток взлетел почти до 70к и этот бывший коллега в очередной раз неистово кусал себе локти)

Моя позиция такая: я верю, что криптовалюты слишком плотно интегрировались в современный мир и в нашу жизнь и «минус 100%» уже не будет (разве что в случае какой-нибудь Третьей Мировой, но тогда будут проблемы посерьезнее, чем сгоревшие инвестиции).
Так что в случае слишком большого спада (на 5, потом на 45 и еще на 25%) я буду ждать нового роста. Годы, если придется.

Также, планы по инвестированию такие: завести суммарно личных средств 1000-2000$
Затем, торгуя в плюс, довести эту сумму до 5к. Вывести свои «кровные» 1-2к и затем продолжать торговать уже только оставшимися деньгами, которые были заработаны без особых усилий.
Крипта будет расти — отлично, халявные деньги. Будет падать — что ж, я особо ничего не потеряю, за исключением небольшого количества времени, потраченного на то, чтобы разобраться в теме и написать/настроить бота.

Невилкий спад називається корекцією. Це нормально після швидкого зростання.

На таких людях тримається сучасний світ

Підписатись на коментарі